Contract 0x72f8a1a8acaaa806a52b64738327e6dbdfac7c25

Contract Overview

Balance:
0 DEV
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x13aeb59fe52a1336e4ba256a9e542f102b0901c17adf3e5e041afaf5b1f9c1e10x60c0604026493002022-08-12 18:27:06117 days 22 hrs ago0xb8cd93c83a974649d76b1c19f311f639e62272bc IN  Create: AxelarGateway0 DEV0.009937405
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x2ba416426426dec39f33b266eb710ab3e232ffcf48399b9814b516522f731a8533105392022-12-07 3:08:241 day 13 hrs ago 0x5769d84dd62a6fd969856c75c7d321b84d4559290x72f8a1a8acaaa806a52b64738327e6dbdfac7c250 DEV
0xdba8938657d8039649398c19467c1dc364f7c1e40f6e6f58b62694482892917133105372022-12-07 3:08:001 day 13 hrs ago 0x5769d84dd62a6fd969856c75c7d321b84d4559290x72f8a1a8acaaa806a52b64738327e6dbdfac7c250 DEV
0x8adee3adfdef176ec15635abfae542fe2fb6cc3f06681618a5a07fbf93f2a07833105362022-12-07 3:07:421 day 13 hrs ago 0x5769d84dd62a6fd969856c75c7d321b84d4559290x72f8a1a8acaaa806a52b64738327e6dbdfac7c250 DEV
0x081c7d8056c7729966b4eb4e66066b5259fb6129aa5b800ce87f98b76f6953b233105332022-12-07 3:06:361 day 13 hrs ago 0x5769d84dd62a6fd969856c75c7d321b84d4559290x72f8a1a8acaaa806a52b64738327e6dbdfac7c250 DEV
0xf004ec54e5f43942b5c163fa49b1539d9b0db08edcd486989ed9fc5f8bae4d8a33104112022-12-07 2:22:541 day 14 hrs ago 0x5769d84dd62a6fd969856c75c7d321b84d4559290x72f8a1a8acaaa806a52b64738327e6dbdfac7c250 DEV
0x3743c728394372138b814eb1047f54f56f250b31478d399304122901af163a9933104102022-12-07 2:22:301 day 14 hrs ago 0x5769d84dd62a6fd969856c75c7d321b84d4559290x72f8a1a8acaaa806a52b64738327e6dbdfac7c250 DEV
0x369a9f87e25791b7332d3b9535461d79f56ad2fc0d62eecc888c3a3d97218aa633104102022-12-07 2:22:301 day 14 hrs ago 0x5769d84dd62a6fd969856c75c7d321b84d4559290x72f8a1a8acaaa806a52b64738327e6dbdfac7c250 DEV
0xa75990b8b34155aeadabc1e3a7f24d61a4188e79ab02fd4ac5349594c0c9740f33104102022-12-07 2:22:301 day 14 hrs ago 0x5769d84dd62a6fd969856c75c7d321b84d4559290x72f8a1a8acaaa806a52b64738327e6dbdfac7c250 DEV
0x801dd2d1f2ac5c47151b5f6173ab5b6ec5a6f6050015c357ab123b16e18369ef33104102022-12-07 2:22:301 day 14 hrs ago 0x5769d84dd62a6fd969856c75c7d321b84d4559290x72f8a1a8acaaa806a52b64738327e6dbdfac7c250 DEV
0x97d5840ed73d47f81ac7756ba2833c8a8db482568525bf2ece509aad0cf59e5f33104102022-12-07 2:22:301 day 14 hrs ago 0x5769d84dd62a6fd969856c75c7d321b84d4559290x72f8a1a8acaaa806a52b64738327e6dbdfac7c250 DEV
0xee6c43a0182d5262df9d4ed933ae322b0826c01a0e4069b265f77318560b405033104102022-12-07 2:22:301 day 14 hrs ago 0x5769d84dd62a6fd969856c75c7d321b84d4559290x72f8a1a8acaaa806a52b64738327e6dbdfac7c250 DEV
0x7404472bb0923475b510e4be132493bf509137ecea8dab548e59a2520b2e64d733104102022-12-07 2:22:301 day 14 hrs ago 0x5769d84dd62a6fd969856c75c7d321b84d4559290x72f8a1a8acaaa806a52b64738327e6dbdfac7c250 DEV
0x848822b095da86bab293d4bcb007209d9ec0772f0c283802bf0d0796f0a64de733104102022-12-07 2:22:301 day 14 hrs ago 0x5769d84dd62a6fd969856c75c7d321b84d4559290x72f8a1a8acaaa806a52b64738327e6dbdfac7c250 DEV
0xfeb3e3b90a4de37f438c4590f83853c9c01a0ca8618849082a5dd88142aec79933104102022-12-07 2:22:301 day 14 hrs ago 0x5769d84dd62a6fd969856c75c7d321b84d4559290x72f8a1a8acaaa806a52b64738327e6dbdfac7c250 DEV
0x0e7bd20c29647a6401ee4211022fd24c76c84be195c5d9efa8806e088348760b33104102022-12-07 2:22:301 day 14 hrs ago 0x5769d84dd62a6fd969856c75c7d321b84d4559290x72f8a1a8acaaa806a52b64738327e6dbdfac7c250 DEV
0xc20d3c27956b33bf5b200c3e80e4f083021e4dcdede35c74d1d5a28a25b5600033104102022-12-07 2:22:301 day 14 hrs ago 0x5769d84dd62a6fd969856c75c7d321b84d4559290x72f8a1a8acaaa806a52b64738327e6dbdfac7c250 DEV
0x11356882a3aef08200b2bd120625842b389bb4b24c827e4c971cd2b71cd5aee033104102022-12-07 2:22:301 day 14 hrs ago 0x5769d84dd62a6fd969856c75c7d321b84d4559290x72f8a1a8acaaa806a52b64738327e6dbdfac7c250 DEV
0xa8097764d1c09ce662c5e4208e39c00acc0bb2c3324a612614859f8ad406d68e33104102022-12-07 2:22:301 day 14 hrs ago 0x5769d84dd62a6fd969856c75c7d321b84d4559290x72f8a1a8acaaa806a52b64738327e6dbdfac7c250 DEV
0x918fdf349f8b67089f9139e02bab43f0a28094d11f0e6ded2c4c2767e5ec71ab33104102022-12-07 2:22:301 day 14 hrs ago 0x5769d84dd62a6fd969856c75c7d321b84d4559290x72f8a1a8acaaa806a52b64738327e6dbdfac7c250 DEV
0x183a5ddf37d1616a2b518552cb6e6ec48f7ea6b8869a6cfe9982a66a8ebf146d33104062022-12-07 2:18:481 day 14 hrs ago 0x5769d84dd62a6fd969856c75c7d321b84d4559290x72f8a1a8acaaa806a52b64738327e6dbdfac7c250 DEV
0x183a5ddf37d1616a2b518552cb6e6ec48f7ea6b8869a6cfe9982a66a8ebf146d33104062022-12-07 2:18:481 day 14 hrs ago 0x72f8a1a8acaaa806a52b64738327e6dbdfac7c250x5769d84dd62a6fd969856c75c7d321b84d4559290 DEV
0x183a5ddf37d1616a2b518552cb6e6ec48f7ea6b8869a6cfe9982a66a8ebf146d33104062022-12-07 2:18:481 day 14 hrs ago 0x72f8a1a8acaaa806a52b64738327e6dbdfac7c250x1a22f44135b4622c3d0f15912de056d6450494ad0 DEV
0x183a5ddf37d1616a2b518552cb6e6ec48f7ea6b8869a6cfe9982a66a8ebf146d33104062022-12-07 2:18:481 day 14 hrs ago 0x5769d84dd62a6fd969856c75c7d321b84d4559290x72f8a1a8acaaa806a52b64738327e6dbdfac7c250 DEV
0x3efe5cf45838694a925566caaa66f86a24ea9e7e691d9569fe7660606b8f568b33104042022-12-07 2:18:181 day 14 hrs ago 0x5769d84dd62a6fd969856c75c7d321b84d4559290x72f8a1a8acaaa806a52b64738327e6dbdfac7c250 DEV
0x3efe5cf45838694a925566caaa66f86a24ea9e7e691d9569fe7660606b8f568b33104042022-12-07 2:18:181 day 14 hrs ago 0x72f8a1a8acaaa806a52b64738327e6dbdfac7c250x5769d84dd62a6fd969856c75c7d321b84d4559290 DEV
[ Download CSV Export 
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
AxelarGateway

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at moonbase.moonscan.io on 2022-08-12
*/

// Sources flattened with hardhat v2.9.9 https://hardhat.org

// File contracts/interfaces/IAxelarGateway.sol

// SPDX-License-Identifier: MIT

pragma solidity 0.8.9;

interface IAxelarGateway {
    /**********\
    |* Errors *|
    \**********/

    error NotSelf();
    error NotProxy();
    error InvalidCodeHash();
    error SetupFailed();
    error InvalidAuthModule();
    error InvalidTokenDeployer();
    error InvalidAmount();
    error InvalidChainId();
    error InvalidCommands();
    error TokenDoesNotExist(string symbol);
    error TokenAlreadyExists(string symbol);
    error TokenDeployFailed(string symbol);
    error TokenContractDoesNotExist(address token);
    error BurnFailed(string symbol);
    error MintFailed(string symbol);
    error InvalidSetMintLimitsParams();
    error ExceedMintLimit(string symbol);

    /**********\
    |* Events *|
    \**********/

    event TokenSent(address indexed sender, string destinationChain, string destinationAddress, string symbol, uint256 amount);

    event ContractCall(
        address indexed sender,
        string destinationChain,
        string destinationContractAddress,
        bytes32 indexed payloadHash,
        bytes payload
    );

    event ContractCallWithToken(
        address indexed sender,
        string destinationChain,
        string destinationContractAddress,
        bytes32 indexed payloadHash,
        bytes payload,
        string symbol,
        uint256 amount
    );

    event Executed(bytes32 indexed commandId);

    event TokenDeployed(string symbol, address tokenAddresses);

    event ContractCallApproved(
        bytes32 indexed commandId,
        string sourceChain,
        string sourceAddress,
        address indexed contractAddress,
        bytes32 indexed payloadHash,
        bytes32 sourceTxHash,
        uint256 sourceEventIndex
    );

    event ContractCallApprovedWithMint(
        bytes32 indexed commandId,
        string sourceChain,
        string sourceAddress,
        address indexed contractAddress,
        bytes32 indexed payloadHash,
        string symbol,
        uint256 amount,
        bytes32 sourceTxHash,
        uint256 sourceEventIndex
    );

    event TokenMintLimitUpdated(string symbol, uint256 limit);

    event OperatorshipTransferred(bytes newOperatorsData);

    event Upgraded(address indexed implementation);

    /********************\
    |* Public Functions *|
    \********************/

    function sendToken(
        string calldata destinationChain,
        string calldata destinationAddress,
        string calldata symbol,
        uint256 amount
    ) external;

    function callContract(
        string calldata destinationChain,
        string calldata contractAddress,
        bytes calldata payload
    ) external;

    function callContractWithToken(
        string calldata destinationChain,
        string calldata contractAddress,
        bytes calldata payload,
        string calldata symbol,
        uint256 amount
    ) external;

    function isContractCallApproved(
        bytes32 commandId,
        string calldata sourceChain,
        string calldata sourceAddress,
        address contractAddress,
        bytes32 payloadHash
    ) external view returns (bool);

    function isContractCallAndMintApproved(
        bytes32 commandId,
        string calldata sourceChain,
        string calldata sourceAddress,
        address contractAddress,
        bytes32 payloadHash,
        string calldata symbol,
        uint256 amount
    ) external view returns (bool);

    function validateContractCall(
        bytes32 commandId,
        string calldata sourceChain,
        string calldata sourceAddress,
        bytes32 payloadHash
    ) external returns (bool);

    function validateContractCallAndMint(
        bytes32 commandId,
        string calldata sourceChain,
        string calldata sourceAddress,
        bytes32 payloadHash,
        string calldata symbol,
        uint256 amount
    ) external returns (bool);

    /***********\
    |* Getters *|
    \***********/

    function authModule() external view returns (address);

    function tokenDeployer() external view returns (address);

    function tokenMintLimit(string memory symbol) external view returns (uint256);

    function tokenMintAmount(string memory symbol) external view returns (uint256);

    function allTokensFrozen() external view returns (bool);

    function implementation() external view returns (address);

    function tokenAddresses(string memory symbol) external view returns (address);

    function tokenFrozen(string memory symbol) external view returns (bool);

    function isCommandExecuted(bytes32 commandId) external view returns (bool);

    function adminEpoch() external view returns (uint256);

    function adminThreshold(uint256 epoch) external view returns (uint256);

    function admins(uint256 epoch) external view returns (address[] memory);

    /*******************\
    |* Admin Functions *|
    \*******************/

    function setTokenMintLimits(string[] calldata symbols, uint256[] calldata limits) external;

    function upgrade(
        address newImplementation,
        bytes32 newImplementationCodeHash,
        bytes calldata setupParams
    ) external;

    /**********************\
    |* External Functions *|
    \**********************/

    function setup(bytes calldata params) external;

    function execute(bytes calldata input) external;
}


// File contracts/interfaces/IOwnable.sol

interface IOwnable {
    error NotOwner();
    error InvalidOwner();

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    function owner() external view returns (address);

    function transferOwnership(address newOwner) external;
}


// File contracts/interfaces/IAxelarAuth.sol

interface IAxelarAuth is IOwnable {
    function validateProof(bytes32 messageHash, bytes calldata proof) external returns (bool currentOperators);

    function transferOperatorship(bytes calldata params) external;
}


// File contracts/interfaces/IERC20.sol

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    error InvalidAccount();

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


// File contracts/interfaces/IERC20Burn.sol

interface IERC20Burn {
    function burn(bytes32 salt) external;
}


// File contracts/interfaces/IERC20BurnFrom.sol

interface IERC20BurnFrom {
    function burnFrom(address account, uint256 amount) external;
}


// File contracts/interfaces/IERC20Permit.sol

interface IERC20Permit {
    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function nonces(address account) external view returns (uint256);

    function permit(
        address issuer,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
}


// File contracts/interfaces/IMintableCappedERC20.sol



interface IMintableCappedERC20 is IERC20, IERC20Permit, IOwnable {
    error CapExceeded();

    function cap() external view returns (uint256);

    function mint(address account, uint256 amount) external;
}


// File contracts/interfaces/IBurnableMintableCappedERC20.sol



interface IBurnableMintableCappedERC20 is IERC20Burn, IERC20BurnFrom, IMintableCappedERC20 {
    function depositAddress(bytes32 salt) external view returns (address);

    function burn(bytes32 salt) external;

    function burnFrom(address account, uint256 amount) external;
}


// File contracts/interfaces/ITokenDeployer.sol

interface ITokenDeployer {
    function deployToken(
        string calldata name,
        string calldata symbol,
        uint8 decimals,
        uint256 cap,
        bytes32 salt
    ) external returns (address tokenAddress);
}


// File contracts/ECDSA.sol

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    error InvalidSignatureLength();
    error InvalidS();
    error InvalidV();
    error InvalidSignature();

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address signer) {
        // Check the signature length
        if (signature.length != 65) revert InvalidSignatureLength();

        // Divide the signature in r, s and v variables
        bytes32 r;
        bytes32 s;
        uint8 v;

        // ecrecover takes the signature parameters, and the only way to get them
        // currently is to use assembly.
        // solhint-disable-next-line no-inline-assembly
        assembly {
            r := mload(add(signature, 0x20))
            s := mload(add(signature, 0x40))
            v := byte(0, mload(add(signature, 0x60)))
        }

        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) revert InvalidS();

        if (v != 27 && v != 28) revert InvalidV();

        // If the signature is valid (and not malleable), return the signer address
        if ((signer = ecrecover(hash, v, r, s)) == address(0)) revert InvalidSignature();
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * replicates the behavior of the
     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]
     * JSON-RPC method.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked('\x19Ethereum Signed Message:\n32', hash));
    }
}


// File contracts/DepositHandler.sol

contract DepositHandler {
    error IsLocked();
    error NotContract();

    uint256 internal constant IS_NOT_LOCKED = uint256(1);
    uint256 internal constant IS_LOCKED = uint256(2);

    uint256 internal _lockedStatus = IS_NOT_LOCKED;

    modifier noReenter() {
        if (_lockedStatus == IS_LOCKED) revert IsLocked();

        _lockedStatus = IS_LOCKED;
        _;
        _lockedStatus = IS_NOT_LOCKED;
    }

    function execute(address callee, bytes calldata data) external noReenter returns (bool success, bytes memory returnData) {
        if (callee.code.length == 0) revert NotContract();
        (success, returnData) = callee.call(data);
    }

    // NOTE: The gateway should always destroy the `DepositHandler` in the same runtime context that deploys it.
    function destroy(address etherDestination) external noReenter {
        selfdestruct(payable(etherDestination));
    }
}


// File contracts/EternalStorage.sol


/**
 * @title EternalStorage
 * @dev This contract holds all the necessary state variables to carry out the storage of any contract.
 */
contract EternalStorage {
    mapping(bytes32 => uint256) private _uintStorage;
    mapping(bytes32 => string) private _stringStorage;
    mapping(bytes32 => address) private _addressStorage;
    mapping(bytes32 => bytes) private _bytesStorage;
    mapping(bytes32 => bool) private _boolStorage;
    mapping(bytes32 => int256) private _intStorage;

    // *** Getter Methods ***
    function getUint(bytes32 key) public view returns (uint256) {
        return _uintStorage[key];
    }

    function getString(bytes32 key) public view returns (string memory) {
        return _stringStorage[key];
    }

    function getAddress(bytes32 key) public view returns (address) {
        return _addressStorage[key];
    }

    function getBytes(bytes32 key) public view returns (bytes memory) {
        return _bytesStorage[key];
    }

    function getBool(bytes32 key) public view returns (bool) {
        return _boolStorage[key];
    }

    function getInt(bytes32 key) public view returns (int256) {
        return _intStorage[key];
    }

    // *** Setter Methods ***
    function _setUint(bytes32 key, uint256 value) internal {
        _uintStorage[key] = value;
    }

    function _setString(bytes32 key, string memory value) internal {
        _stringStorage[key] = value;
    }

    function _setAddress(bytes32 key, address value) internal {
        _addressStorage[key] = value;
    }

    function _setBytes(bytes32 key, bytes memory value) internal {
        _bytesStorage[key] = value;
    }

    function _setBool(bytes32 key, bool value) internal {
        _boolStorage[key] = value;
    }

    function _setInt(bytes32 key, int256 value) internal {
        _intStorage[key] = value;
    }

    // *** Delete Methods ***
    function _deleteUint(bytes32 key) internal {
        delete _uintStorage[key];
    }

    function _deleteString(bytes32 key) internal {
        delete _stringStorage[key];
    }

    function _deleteAddress(bytes32 key) internal {
        delete _addressStorage[key];
    }

    function _deleteBytes(bytes32 key) internal {
        delete _bytesStorage[key];
    }

    function _deleteBool(bytes32 key) internal {
        delete _boolStorage[key];
    }

    function _deleteInt(bytes32 key) internal {
        delete _intStorage[key];
    }
}


// File contracts/AdminMultisigBase.sol


contract AdminMultisigBase is EternalStorage {
    error NotAdmin();
    error AlreadyVoted();
    error InvalidAdmins();
    error InvalidAdminThreshold();
    error DuplicateAdmin(address admin);

    // AUDIT: slot names should be prefixed with some standard string
    bytes32 internal constant KEY_ADMIN_EPOCH = keccak256('admin-epoch');

    bytes32 internal constant PREFIX_ADMIN = keccak256('admin');
    bytes32 internal constant PREFIX_ADMIN_COUNT = keccak256('admin-count');
    bytes32 internal constant PREFIX_ADMIN_THRESHOLD = keccak256('admin-threshold');
    bytes32 internal constant PREFIX_ADMIN_VOTE_COUNTS = keccak256('admin-vote-counts');
    bytes32 internal constant PREFIX_ADMIN_VOTED = keccak256('admin-voted');
    bytes32 internal constant PREFIX_IS_ADMIN = keccak256('is-admin');

    // NOTE: Given the early void return, this modifier should be used with care on functions that return data.
    modifier onlyAdmin() {
        uint256 adminEpoch = _adminEpoch();

        if (!_isAdmin(adminEpoch, msg.sender)) revert NotAdmin();

        bytes32 topic = keccak256(msg.data);

        // Check that admin has not voted, then record that they have voted.
        if (_hasVoted(adminEpoch, topic, msg.sender)) revert AlreadyVoted();

        _setHasVoted(adminEpoch, topic, msg.sender, true);

        // Determine the new vote count and update it.
        uint256 adminVoteCount = _getVoteCount(adminEpoch, topic) + uint256(1);
        _setVoteCount(adminEpoch, topic, adminVoteCount);

        // Do not proceed with operation execution if insufficient votes.
        if (adminVoteCount < _getAdminThreshold(adminEpoch)) return;

        _;

        // Clear vote count and voted booleans.
        _setVoteCount(adminEpoch, topic, uint256(0));

        uint256 adminCount = _getAdminCount(adminEpoch);

        for (uint256 i; i < adminCount; ++i) {
            _setHasVoted(adminEpoch, topic, _getAdmin(adminEpoch, i), false);
        }
    }

    /********************\
    |* Pure Key Getters *|
    \********************/

    function _getAdminKey(uint256 adminEpoch, uint256 index) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(PREFIX_ADMIN, adminEpoch, index));
    }

    function _getAdminCountKey(uint256 adminEpoch) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(PREFIX_ADMIN_COUNT, adminEpoch));
    }

    function _getAdminThresholdKey(uint256 adminEpoch) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(PREFIX_ADMIN_THRESHOLD, adminEpoch));
    }

    function _getAdminVoteCountsKey(uint256 adminEpoch, bytes32 topic) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(PREFIX_ADMIN_VOTE_COUNTS, adminEpoch, topic));
    }

    function _getAdminVotedKey(
        uint256 adminEpoch,
        bytes32 topic,
        address account
    ) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(PREFIX_ADMIN_VOTED, adminEpoch, topic, account));
    }

    function _getIsAdminKey(uint256 adminEpoch, address account) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(PREFIX_IS_ADMIN, adminEpoch, account));
    }

    /***********\
    |* Getters *|
    \***********/

    function _adminEpoch() internal view returns (uint256) {
        return getUint(KEY_ADMIN_EPOCH);
    }

    function _getAdmin(uint256 adminEpoch, uint256 index) internal view returns (address) {
        return getAddress(_getAdminKey(adminEpoch, index));
    }

    function _getAdminCount(uint256 adminEpoch) internal view returns (uint256) {
        return getUint(_getAdminCountKey(adminEpoch));
    }

    function _getAdminThreshold(uint256 adminEpoch) internal view returns (uint256) {
        return getUint(_getAdminThresholdKey(adminEpoch));
    }

    function _getVoteCount(uint256 adminEpoch, bytes32 topic) internal view returns (uint256) {
        return getUint(_getAdminVoteCountsKey(adminEpoch, topic));
    }

    function _hasVoted(
        uint256 adminEpoch,
        bytes32 topic,
        address account
    ) internal view returns (bool) {
        return getBool(_getAdminVotedKey(adminEpoch, topic, account));
    }

    function _isAdmin(uint256 adminEpoch, address account) internal view returns (bool) {
        return getBool(_getIsAdminKey(adminEpoch, account));
    }

    /***********\
    |* Setters *|
    \***********/

    function _setAdminEpoch(uint256 adminEpoch) internal {
        _setUint(KEY_ADMIN_EPOCH, adminEpoch);
    }

    function _setAdmin(
        uint256 adminEpoch,
        uint256 index,
        address account
    ) internal {
        _setAddress(_getAdminKey(adminEpoch, index), account);
    }

    function _setAdminCount(uint256 adminEpoch, uint256 adminCount) internal {
        _setUint(_getAdminCountKey(adminEpoch), adminCount);
    }

    function _setAdmins(
        uint256 adminEpoch,
        address[] memory accounts,
        uint256 threshold
    ) internal {
        uint256 adminLength = accounts.length;

        if (adminLength < threshold) revert InvalidAdmins();

        if (threshold == uint256(0)) revert InvalidAdminThreshold();

        _setAdminThreshold(adminEpoch, threshold);
        _setAdminCount(adminEpoch, adminLength);

        for (uint256 i; i < adminLength; ++i) {
            address account = accounts[i];

            // Check that the account wasn't already set as an admin for this epoch.
            if (_isAdmin(adminEpoch, account)) revert DuplicateAdmin(account);

            if (account == address(0)) revert InvalidAdmins();

            // Set this account as the i-th admin in this epoch (needed to we can clear topic votes in `onlyAdmin`).
            _setAdmin(adminEpoch, i, account);
            _setIsAdmin(adminEpoch, account, true);
        }
    }

    function _setAdminThreshold(uint256 adminEpoch, uint256 adminThreshold) internal {
        _setUint(_getAdminThresholdKey(adminEpoch), adminThreshold);
    }

    function _setVoteCount(
        uint256 adminEpoch,
        bytes32 topic,
        uint256 voteCount
    ) internal {
        _setUint(_getAdminVoteCountsKey(adminEpoch, topic), voteCount);
    }

    function _setHasVoted(
        uint256 adminEpoch,
        bytes32 topic,
        address account,
        bool voted
    ) internal {
        _setBool(_getAdminVotedKey(adminEpoch, topic, account), voted);
    }

    function _setIsAdmin(
        uint256 adminEpoch,
        address account,
        bool isAdmin
    ) internal {
        _setBool(_getIsAdminKey(adminEpoch, account), isAdmin);
    }
}


// File contracts/AxelarGateway.sol








contract AxelarGateway is IAxelarGateway, AdminMultisigBase {
    enum TokenType {
        InternalBurnable,
        InternalBurnableFrom,
        External
    }

    /// @dev Removed slots; Should avoid re-using
    // bytes32 internal constant KEY_ALL_TOKENS_FROZEN = keccak256('all-tokens-frozen');
    // bytes32 internal constant PREFIX_TOKEN_FROZEN = keccak256('token-frozen');

    /// @dev Storage slot with the address of the current implementation. `keccak256('eip1967.proxy.implementation') - 1`.
    bytes32 internal constant KEY_IMPLEMENTATION = bytes32(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc);

    // AUDIT: slot names should be prefixed with some standard string
    bytes32 internal constant PREFIX_COMMAND_EXECUTED = keccak256('command-executed');
    bytes32 internal constant PREFIX_TOKEN_ADDRESS = keccak256('token-address');
    bytes32 internal constant PREFIX_TOKEN_TYPE = keccak256('token-type');
    bytes32 internal constant PREFIX_CONTRACT_CALL_APPROVED = keccak256('contract-call-approved');
    bytes32 internal constant PREFIX_CONTRACT_CALL_APPROVED_WITH_MINT = keccak256('contract-call-approved-with-mint');
    bytes32 internal constant PREFIX_TOKEN_MINT_LIMIT = keccak256('token-mint-limit');
    bytes32 internal constant PREFIX_TOKEN_MINT_AMOUNT = keccak256('token-mint-amount');

    bytes32 internal constant SELECTOR_BURN_TOKEN = keccak256('burnToken');
    bytes32 internal constant SELECTOR_DEPLOY_TOKEN = keccak256('deployToken');
    bytes32 internal constant SELECTOR_MINT_TOKEN = keccak256('mintToken');
    bytes32 internal constant SELECTOR_APPROVE_CONTRACT_CALL = keccak256('approveContractCall');
    bytes32 internal constant SELECTOR_APPROVE_CONTRACT_CALL_WITH_MINT = keccak256('approveContractCallWithMint');
    bytes32 internal constant SELECTOR_TRANSFER_OPERATORSHIP = keccak256('transferOperatorship');

    // solhint-disable-next-line var-name-mixedcase
    address internal immutable AUTH_MODULE;
    // solhint-disable-next-line var-name-mixedcase
    address internal immutable TOKEN_DEPLOYER_IMPLEMENTATION;

    constructor(address authModule_, address tokenDeployerImplementation_) {
        if (authModule_.code.length == 0) revert InvalidAuthModule();
        if (tokenDeployerImplementation_.code.length == 0) revert InvalidTokenDeployer();

        AUTH_MODULE = authModule_;
        TOKEN_DEPLOYER_IMPLEMENTATION = tokenDeployerImplementation_;
    }

    modifier onlySelf() {
        if (msg.sender != address(this)) revert NotSelf();

        _;
    }

    /******************\
    |* Public Methods *|
    \******************/

    function sendToken(
        string calldata destinationChain,
        string calldata destinationAddress,
        string calldata symbol,
        uint256 amount
    ) external {
        _burnTokenFrom(msg.sender, symbol, amount);
        emit TokenSent(msg.sender, destinationChain, destinationAddress, symbol, amount);
    }

    function callContract(
        string calldata destinationChain,
        string calldata destinationContractAddress,
        bytes calldata payload
    ) external {
        emit ContractCall(msg.sender, destinationChain, destinationContractAddress, keccak256(payload), payload);
    }

    function callContractWithToken(
        string calldata destinationChain,
        string calldata destinationContractAddress,
        bytes calldata payload,
        string calldata symbol,
        uint256 amount
    ) external {
        _burnTokenFrom(msg.sender, symbol, amount);
        emit ContractCallWithToken(msg.sender, destinationChain, destinationContractAddress, keccak256(payload), payload, symbol, amount);
    }

    function isContractCallApproved(
        bytes32 commandId,
        string calldata sourceChain,
        string calldata sourceAddress,
        address contractAddress,
        bytes32 payloadHash
    ) external view override returns (bool) {
        return getBool(_getIsContractCallApprovedKey(commandId, sourceChain, sourceAddress, contractAddress, payloadHash));
    }

    function isContractCallAndMintApproved(
        bytes32 commandId,
        string calldata sourceChain,
        string calldata sourceAddress,
        address contractAddress,
        bytes32 payloadHash,
        string calldata symbol,
        uint256 amount
    ) external view override returns (bool) {
        return
            getBool(
                _getIsContractCallApprovedWithMintKey(commandId, sourceChain, sourceAddress, contractAddress, payloadHash, symbol, amount)
            );
    }

    function validateContractCall(
        bytes32 commandId,
        string calldata sourceChain,
        string calldata sourceAddress,
        bytes32 payloadHash
    ) external override returns (bool valid) {
        bytes32 key = _getIsContractCallApprovedKey(commandId, sourceChain, sourceAddress, msg.sender, payloadHash);
        valid = getBool(key);
        if (valid) _setBool(key, false);
    }

    function validateContractCallAndMint(
        bytes32 commandId,
        string calldata sourceChain,
        string calldata sourceAddress,
        bytes32 payloadHash,
        string calldata symbol,
        uint256 amount
    ) external override returns (bool valid) {
        bytes32 key = _getIsContractCallApprovedWithMintKey(commandId, sourceChain, sourceAddress, msg.sender, payloadHash, symbol, amount);
        valid = getBool(key);
        if (valid) {
            // Prevent re-entrance
            _setBool(key, false);
            _mintToken(symbol, msg.sender, amount);
        }
    }

    /***********\
    |* Getters *|
    \***********/

    function authModule() public view returns (address) {
        return AUTH_MODULE;
    }

    function tokenDeployer() public view returns (address) {
        return TOKEN_DEPLOYER_IMPLEMENTATION;
    }

    function tokenMintLimit(string memory symbol) public view override returns (uint256) {
        return getUint(_getTokenMintLimitKey(symbol));
    }

    function tokenMintAmount(string memory symbol) public view override returns (uint256) {
        // solhint-disable-next-line not-rely-on-time
        return getUint(_getTokenMintAmountKey(symbol, block.timestamp / 6 hours));
    }

    /// @dev This function is kept around to keep things working for internal
    /// tokens that were deployed before the token freeze functionality was removed
    function allTokensFrozen() external pure override returns (bool) {
        return false;
    }

    function implementation() public view override returns (address) {
        return getAddress(KEY_IMPLEMENTATION);
    }

    function tokenAddresses(string memory symbol) public view override returns (address) {
        return getAddress(_getTokenAddressKey(symbol));
    }

    /// @dev This function is kept around to keep things working for internal
    /// tokens that were deployed before the token freeze functionality was removed
    function tokenFrozen(string memory) external pure override returns (bool) {
        return false;
    }

    function isCommandExecuted(bytes32 commandId) public view override returns (bool) {
        return getBool(_getIsCommandExecutedKey(commandId));
    }

    /// @dev Returns the current `adminEpoch`.
    function adminEpoch() external view override returns (uint256) {
        return _adminEpoch();
    }

    /// @dev Returns the admin threshold for a given `adminEpoch`.
    function adminThreshold(uint256 epoch) external view override returns (uint256) {
        return _getAdminThreshold(epoch);
    }

    /// @dev Returns the array of admins within a given `adminEpoch`.
    function admins(uint256 epoch) external view override returns (address[] memory results) {
        uint256 adminCount = _getAdminCount(epoch);
        results = new address[](adminCount);

        for (uint256 i; i < adminCount; ++i) {
            results[i] = _getAdmin(epoch, i);
        }
    }

    /*******************\
    |* Admin Functions *|
    \*******************/

    function setTokenMintLimits(string[] calldata symbols, uint256[] calldata limits) external override onlyAdmin {
        if (symbols.length != limits.length) revert InvalidSetMintLimitsParams();

        for (uint256 i = 0; i < symbols.length; i++) {
            string memory symbol = symbols[i];
            uint256 limit = limits[i];

            if (tokenAddresses(symbol) == address(0)) revert TokenDoesNotExist(symbol);

            _setTokenMintLimit(symbol, limit);
        }
    }

    function upgrade(
        address newImplementation,
        bytes32 newImplementationCodeHash,
        bytes calldata setupParams
    ) external override onlyAdmin {
        if (newImplementationCodeHash != newImplementation.codehash) revert InvalidCodeHash();

        emit Upgraded(newImplementation);

        // AUDIT: If `newImplementation.setup` performs `selfdestruct`, it will result in the loss of _this_ implementation (thereby losing the gateway)
        //        if `upgrade` is entered within the context of _this_ implementation itself.
        if (setupParams.length != 0) {
            // solhint-disable-next-line avoid-low-level-calls
            (bool success, ) = newImplementation.delegatecall(abi.encodeWithSelector(IAxelarGateway.setup.selector, setupParams));

            if (!success) revert SetupFailed();
        }

        _setImplementation(newImplementation);
    }

    /**********************\
    |* External Functions *|
    \**********************/

    /// @dev Not publicly accessible as overshadowed in the proxy
    function setup(bytes calldata params) external override {
        // Prevent setup from being called on a non-proxy (the implementation).
        if (implementation() == address(0)) revert NotProxy();

        (address[] memory adminAddresses, uint256 newAdminThreshold, bytes memory newOperatorsData) = abi.decode(
            params,
            (address[], uint256, bytes)
        );

        // NOTE: Admin epoch is incremented to easily invalidate current admin-related state.
        uint256 newAdminEpoch = _adminEpoch() + uint256(1);
        _setAdminEpoch(newAdminEpoch);
        _setAdmins(newAdminEpoch, adminAddresses, newAdminThreshold);

        if (newOperatorsData.length != 0) {
            IAxelarAuth(AUTH_MODULE).transferOperatorship(newOperatorsData);

            emit OperatorshipTransferred(newOperatorsData);
        }
    }

    function execute(bytes calldata input) external override {
        (bytes memory data, bytes memory proof) = abi.decode(input, (bytes, bytes));

        bytes32 messageHash = ECDSA.toEthSignedMessageHash(keccak256(data));

        // returns true for current operators
        bool allowOperatorshipTransfer = IAxelarAuth(AUTH_MODULE).validateProof(messageHash, proof);

        uint256 chainId;
        bytes32[] memory commandIds;
        string[] memory commands;
        bytes[] memory params;

        (chainId, commandIds, commands, params) = abi.decode(data, (uint256, bytes32[], string[], bytes[]));

        if (chainId != block.chainid) revert InvalidChainId();

        uint256 commandsLength = commandIds.length;

        if (commandsLength != commands.length || commandsLength != params.length) revert InvalidCommands();

        for (uint256 i; i < commandsLength; ++i) {
            bytes32 commandId = commandIds[i];

            if (isCommandExecuted(commandId)) continue; /* Ignore if duplicate commandId received */

            bytes4 commandSelector;
            bytes32 commandHash = keccak256(abi.encodePacked(commands[i]));

            if (commandHash == SELECTOR_DEPLOY_TOKEN) {
                commandSelector = AxelarGateway.deployToken.selector;
            } else if (commandHash == SELECTOR_MINT_TOKEN) {
                commandSelector = AxelarGateway.mintToken.selector;
            } else if (commandHash == SELECTOR_APPROVE_CONTRACT_CALL) {
                commandSelector = AxelarGateway.approveContractCall.selector;
            } else if (commandHash == SELECTOR_APPROVE_CONTRACT_CALL_WITH_MINT) {
                commandSelector = AxelarGateway.approveContractCallWithMint.selector;
            } else if (commandHash == SELECTOR_BURN_TOKEN) {
                commandSelector = AxelarGateway.burnToken.selector;
            } else if (commandHash == SELECTOR_TRANSFER_OPERATORSHIP) {
                if (!allowOperatorshipTransfer) continue;

                allowOperatorshipTransfer = false;
                commandSelector = AxelarGateway.transferOperatorship.selector;
            } else {
                continue; /* Ignore if unknown command received */
            }

            // Prevent a re-entrancy from executing this command before it can be marked as successful.
            _setCommandExecuted(commandId, true);
            // solhint-disable-next-line avoid-low-level-calls
            (bool success, ) = address(this).call(abi.encodeWithSelector(commandSelector, params[i], commandId));

            if (success) emit Executed(commandId);
            else _setCommandExecuted(commandId, false);
        }
    }

    /******************\
    |* Self Functions *|
    \******************/

    function deployToken(bytes calldata params, bytes32) external onlySelf {
        (string memory name, string memory symbol, uint8 decimals, uint256 cap, address tokenAddress, uint256 mintLimit) = abi.decode(
            params,
            (string, string, uint8, uint256, address, uint256)
        );

        // Ensure that this symbol has not been taken.
        if (tokenAddresses(symbol) != address(0)) revert TokenAlreadyExists(symbol);

        if (tokenAddress == address(0)) {
            // If token address is no specified, it indicates a request to deploy one.
            bytes32 salt = keccak256(abi.encodePacked(symbol));

            // solhint-disable-next-line avoid-low-level-calls
            (bool success, bytes memory data) = TOKEN_DEPLOYER_IMPLEMENTATION.delegatecall(
                abi.encodeWithSelector(ITokenDeployer.deployToken.selector, name, symbol, decimals, cap, salt)
            );

            if (!success) revert TokenDeployFailed(symbol);

            tokenAddress = abi.decode(data, (address));

            _setTokenType(symbol, TokenType.InternalBurnableFrom);
        } else {
            // If token address is specified, ensure that there is a contact at the specified address.
            if (tokenAddress.code.length == uint256(0)) revert TokenContractDoesNotExist(tokenAddress);

            // Mark that this symbol is an external token, which is needed to differentiate between operations on mint and burn.
            _setTokenType(symbol, TokenType.External);
        }

        _setTokenAddress(symbol, tokenAddress);
        _setTokenMintLimit(symbol, mintLimit);

        emit TokenDeployed(symbol, tokenAddress);
    }

    function mintToken(bytes calldata params, bytes32) external onlySelf {
        (string memory symbol, address account, uint256 amount) = abi.decode(params, (string, address, uint256));

        _mintToken(symbol, account, amount);
    }

    function burnToken(bytes calldata params, bytes32) external onlySelf {
        (string memory symbol, bytes32 salt) = abi.decode(params, (string, bytes32));

        address tokenAddress = tokenAddresses(symbol);

        if (tokenAddress == address(0)) revert TokenDoesNotExist(symbol);

        if (_getTokenType(symbol) == TokenType.External) {
            DepositHandler depositHandler = new DepositHandler{ salt: salt }();

            (bool success, bytes memory returnData) = depositHandler.execute(
                tokenAddress,
                abi.encodeWithSelector(IERC20.transfer.selector, address(this), IERC20(tokenAddress).balanceOf(address(depositHandler)))
            );

            if (!success || (returnData.length != uint256(0) && !abi.decode(returnData, (bool)))) revert BurnFailed(symbol);

            // NOTE: `depositHandler` must always be destroyed in the same runtime context that it is deployed.
            depositHandler.destroy(address(this));
        } else {
            IBurnableMintableCappedERC20(tokenAddress).burn(salt);
        }
    }

    function approveContractCall(bytes calldata params, bytes32 commandId) external onlySelf {
        (
            string memory sourceChain,
            string memory sourceAddress,
            address contractAddress,
            bytes32 payloadHash,
            bytes32 sourceTxHash,
            uint256 sourceEventIndex
        ) = abi.decode(params, (string, string, address, bytes32, bytes32, uint256));

        _setContractCallApproved(commandId, sourceChain, sourceAddress, contractAddress, payloadHash);
        emit ContractCallApproved(commandId, sourceChain, sourceAddress, contractAddress, payloadHash, sourceTxHash, sourceEventIndex);
    }

    function approveContractCallWithMint(bytes calldata params, bytes32 commandId) external onlySelf {
        (
            string memory sourceChain,
            string memory sourceAddress,
            address contractAddress,
            bytes32 payloadHash,
            string memory symbol,
            uint256 amount,
            bytes32 sourceTxHash,
            uint256 sourceEventIndex
        ) = abi.decode(params, (string, string, address, bytes32, string, uint256, bytes32, uint256));

        _setContractCallApprovedWithMint(commandId, sourceChain, sourceAddress, contractAddress, payloadHash, symbol, amount);
        emit ContractCallApprovedWithMint(
            commandId,
            sourceChain,
            sourceAddress,
            contractAddress,
            payloadHash,
            symbol,
            amount,
            sourceTxHash,
            sourceEventIndex
        );
    }

    function transferOperatorship(bytes calldata newOperatorsData, bytes32) external onlySelf {
        IAxelarAuth(AUTH_MODULE).transferOperatorship(newOperatorsData);

        emit OperatorshipTransferred(newOperatorsData);
    }

    /********************\
    |* Internal Methods *|
    \********************/

    function _callERC20Token(address tokenAddress, bytes memory callData) internal returns (bool) {
        if (tokenAddress.code.length == 0) return false;

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returnData) = tokenAddress.call(callData);
        return success && (returnData.length == 0 || abi.decode(returnData, (bool)));
    }

    function _mintToken(
        string memory symbol,
        address account,
        uint256 amount
    ) internal {
        address tokenAddress = tokenAddresses(symbol);

        if (tokenAddress == address(0)) revert TokenDoesNotExist(symbol);

        _setTokenMintAmount(symbol, tokenMintAmount(symbol) + amount);

        if (_getTokenType(symbol) == TokenType.External) {
            bool success = _callERC20Token(tokenAddress, abi.encodeWithSelector(IERC20.transfer.selector, account, amount));

            if (!success) revert MintFailed(symbol);
        } else {
            IBurnableMintableCappedERC20(tokenAddress).mint(account, amount);
        }
    }

    function _burnTokenFrom(
        address sender,
        string memory symbol,
        uint256 amount
    ) internal {
        address tokenAddress = tokenAddresses(symbol);

        if (tokenAddress == address(0)) revert TokenDoesNotExist(symbol);
        if (amount == 0) revert InvalidAmount();

        TokenType tokenType = _getTokenType(symbol);
        bool burnSuccess;

        if (tokenType == TokenType.External) {
            burnSuccess = _callERC20Token(
                tokenAddress,
                abi.encodeWithSelector(IERC20.transferFrom.selector, sender, address(this), amount)
            );

            if (!burnSuccess) revert BurnFailed(symbol);

            return;
        }

        if (tokenType == TokenType.InternalBurnableFrom) {
            burnSuccess = _callERC20Token(
                tokenAddress,
                abi.encodeWithSelector(IBurnableMintableCappedERC20.burnFrom.selector, sender, amount)
            );

            if (!burnSuccess) revert BurnFailed(symbol);

            return;
        }

        burnSuccess = _callERC20Token(
            tokenAddress,
            abi.encodeWithSelector(
                IERC20.transferFrom.selector,
                sender,
                IBurnableMintableCappedERC20(tokenAddress).depositAddress(bytes32(0)),
                amount
            )
        );

        if (!burnSuccess) revert BurnFailed(symbol);

        IBurnableMintableCappedERC20(tokenAddress).burn(bytes32(0));
    }

    /********************\
    |* Pure Key Getters *|
    \********************/

    function _getTokenMintLimitKey(string memory symbol) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(PREFIX_TOKEN_MINT_LIMIT, symbol));
    }

    function _getTokenMintAmountKey(string memory symbol, uint256 day) internal pure returns (bytes32) {
        // abi.encode to securely hash dynamic-length symbol data followed by day
        return keccak256(abi.encode(PREFIX_TOKEN_MINT_AMOUNT, symbol, day));
    }

    function _getTokenTypeKey(string memory symbol) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(PREFIX_TOKEN_TYPE, symbol));
    }

    function _getTokenAddressKey(string memory symbol) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(PREFIX_TOKEN_ADDRESS, symbol));
    }

    function _getIsCommandExecutedKey(bytes32 commandId) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(PREFIX_COMMAND_EXECUTED, commandId));
    }

    function _getIsContractCallApprovedKey(
        bytes32 commandId,
        string memory sourceChain,
        string memory sourceAddress,
        address contractAddress,
        bytes32 payloadHash
    ) internal pure returns (bytes32) {
        return keccak256(abi.encode(PREFIX_CONTRACT_CALL_APPROVED, commandId, sourceChain, sourceAddress, contractAddress, payloadHash));
    }

    function _getIsContractCallApprovedWithMintKey(
        bytes32 commandId,
        string memory sourceChain,
        string memory sourceAddress,
        address contractAddress,
        bytes32 payloadHash,
        string memory symbol,
        uint256 amount
    ) internal pure returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    PREFIX_CONTRACT_CALL_APPROVED_WITH_MINT,
                    commandId,
                    sourceChain,
                    sourceAddress,
                    contractAddress,
                    payloadHash,
                    symbol,
                    amount
                )
            );
    }

    /********************\
    |* Internal Getters *|
    \********************/

    function _getTokenType(string memory symbol) internal view returns (TokenType) {
        return TokenType(getUint(_getTokenTypeKey(symbol)));
    }

    /********************\
    |* Internal Setters *|
    \********************/

    function _setTokenMintLimit(string memory symbol, uint256 limit) internal {
        _setUint(_getTokenMintLimitKey(symbol), limit);

        emit TokenMintLimitUpdated(symbol, limit);
    }

    function _setTokenMintAmount(string memory symbol, uint256 amount) internal {
        uint256 limit = tokenMintLimit(symbol);
        if (limit > 0 && amount > limit) revert ExceedMintLimit(symbol);

        // solhint-disable-next-line not-rely-on-time
        _setUint(_getTokenMintAmountKey(symbol, block.timestamp / 6 hours), amount);
    }

    function _setTokenType(string memory symbol, TokenType tokenType) internal {
        _setUint(_getTokenTypeKey(symbol), uint256(tokenType));
    }

    function _setTokenAddress(string memory symbol, address tokenAddress) internal {
        _setAddress(_getTokenAddressKey(symbol), tokenAddress);
    }

    function _setCommandExecuted(bytes32 commandId, bool executed) internal {
        _setBool(_getIsCommandExecutedKey(commandId), executed);
    }

    function _setContractCallApproved(
        bytes32 commandId,
        string memory sourceChain,
        string memory sourceAddress,
        address contractAddress,
        bytes32 payloadHash
    ) internal {
        _setBool(_getIsContractCallApprovedKey(commandId, sourceChain, sourceAddress, contractAddress, payloadHash), true);
    }

    function _setContractCallApprovedWithMint(
        bytes32 commandId,
        string memory sourceChain,
        string memory sourceAddress,
        address contractAddress,
        bytes32 payloadHash,
        string memory symbol,
        uint256 amount
    ) internal {
        _setBool(
            _getIsContractCallApprovedWithMintKey(commandId, sourceChain, sourceAddress, contractAddress, payloadHash, symbol, amount),
            true
        );
    }

    function _setImplementation(address newImplementation) internal {
        _setAddress(KEY_IMPLEMENTATION, newImplementation);
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"authModule_","type":"address"},{"internalType":"address","name":"tokenDeployerImplementation_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyVoted","type":"error"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"BurnFailed","type":"error"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"DuplicateAdmin","type":"error"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"ExceedMintLimit","type":"error"},{"inputs":[],"name":"InvalidAdminThreshold","type":"error"},{"inputs":[],"name":"InvalidAdmins","type":"error"},{"inputs":[],"name":"InvalidAmount","type":"error"},{"inputs":[],"name":"InvalidAuthModule","type":"error"},{"inputs":[],"name":"InvalidChainId","type":"error"},{"inputs":[],"name":"InvalidCodeHash","type":"error"},{"inputs":[],"name":"InvalidCommands","type":"error"},{"inputs":[],"name":"InvalidSetMintLimitsParams","type":"error"},{"inputs":[],"name":"InvalidTokenDeployer","type":"error"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"MintFailed","type":"error"},{"inputs":[],"name":"NotAdmin","type":"error"},{"inputs":[],"name":"NotProxy","type":"error"},{"inputs":[],"name":"NotSelf","type":"error"},{"inputs":[],"name":"SetupFailed","type":"error"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"TokenAlreadyExists","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"TokenContractDoesNotExist","type":"error"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"TokenDeployFailed","type":"error"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"TokenDoesNotExist","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"string","name":"destinationChain","type":"string"},{"indexed":false,"internalType":"string","name":"destinationContractAddress","type":"string"},{"indexed":true,"internalType":"bytes32","name":"payloadHash","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"payload","type":"bytes"}],"name":"ContractCall","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"commandId","type":"bytes32"},{"indexed":false,"internalType":"string","name":"sourceChain","type":"string"},{"indexed":false,"internalType":"string","name":"sourceAddress","type":"string"},{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"bytes32","name":"payloadHash","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"sourceTxHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"sourceEventIndex","type":"uint256"}],"name":"ContractCallApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"commandId","type":"bytes32"},{"indexed":false,"internalType":"string","name":"sourceChain","type":"string"},{"indexed":false,"internalType":"string","name":"sourceAddress","type":"string"},{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"bytes32","name":"payloadHash","type":"bytes32"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"sourceTxHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"sourceEventIndex","type":"uint256"}],"name":"ContractCallApprovedWithMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"string","name":"destinationChain","type":"string"},{"indexed":false,"internalType":"string","name":"destinationContractAddress","type":"string"},{"indexed":true,"internalType":"bytes32","name":"payloadHash","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"payload","type":"bytes"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ContractCallWithToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"commandId","type":"bytes32"}],"name":"Executed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"newOperatorsData","type":"bytes"}],"name":"OperatorshipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"address","name":"tokenAddresses","type":"address"}],"name":"TokenDeployed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"limit","type":"uint256"}],"name":"TokenMintLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"string","name":"destinationChain","type":"string"},{"indexed":false,"internalType":"string","name":"destinationAddress","type":"string"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"adminEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"adminThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"admins","outputs":[{"internalType":"address[]","name":"results","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allTokensFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"params","type":"bytes"},{"internalType":"bytes32","name":"commandId","type":"bytes32"}],"name":"approveContractCall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"params","type":"bytes"},{"internalType":"bytes32","name":"commandId","type":"bytes32"}],"name":"approveContractCallWithMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"authModule","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"params","type":"bytes"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"burnToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"destinationChain","type":"string"},{"internalType":"string","name":"destinationContractAddress","type":"string"},{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"callContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"destinationChain","type":"string"},{"internalType":"string","name":"destinationContractAddress","type":"string"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"callContractWithToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"params","type":"bytes"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"deployToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"input","type":"bytes"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"}],"name":"getAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"}],"name":"getBool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"}],"name":"getBytes","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"}],"name":"getInt","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"}],"name":"getString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"}],"name":"getUint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"commandId","type":"bytes32"}],"name":"isCommandExecuted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"commandId","type":"bytes32"},{"internalType":"string","name":"sourceChain","type":"string"},{"internalType":"string","name":"sourceAddress","type":"string"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"bytes32","name":"payloadHash","type":"bytes32"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"isContractCallAndMintApproved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"commandId","type":"bytes32"},{"internalType":"string","name":"sourceChain","type":"string"},{"internalType":"string","name":"sourceAddress","type":"string"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"name":"isContractCallApproved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"params","type":"bytes"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"destinationChain","type":"string"},{"internalType":"string","name":"destinationAddress","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"sendToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"symbols","type":"string[]"},{"internalType":"uint256[]","name":"limits","type":"uint256[]"}],"name":"setTokenMintLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"params","type":"bytes"}],"name":"setup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"tokenAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenDeployer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"tokenFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"tokenMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"tokenMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"newOperatorsData","type":"bytes"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"transferOperatorship","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes32","name":"newImplementationCodeHash","type":"bytes32"},{"internalType":"bytes","name":"setupParams","type":"bytes"}],"name":"upgrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"commandId","type":"bytes32"},{"internalType":"string","name":"sourceChain","type":"string"},{"internalType":"string","name":"sourceAddress","type":"string"},{"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"name":"validateContractCall","outputs":[{"internalType":"bool","name":"valid","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"commandId","type":"bytes32"},{"internalType":"string","name":"sourceChain","type":"string"},{"internalType":"string","name":"sourceAddress","type":"string"},{"internalType":"bytes32","name":"payloadHash","type":"bytes32"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"validateContractCallAndMint","outputs":[{"internalType":"bool","name":"valid","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60c06040523480156200001157600080fd5b506040516200482a3803806200482a8339810160408190526200003491620000bb565b6001600160a01b0382163b6200005d5760405163735326ab60e01b815260040160405180910390fd5b6001600160a01b0381163b6200008657604051630c84dabf60e31b815260040160405180910390fd5b6001600160a01b039182166080521660a052620000f3565b80516001600160a01b0381168114620000b657600080fd5b919050565b60008060408385031215620000cf57600080fd5b620000da836200009e565b9150620000ea602084016200009e565b90509250929050565b60805160a0516146f56200013560003960008181610344015261168b015260008181610404015281816105fb015281816118b80152611b8f01526146f56000f3fe608060405234801561001057600080fd5b50600436106102415760003560e01c80637b1b769e11610145578063b5417084116100bd578063cec7b3591161008c578063dc97d96211610071578063dc97d9621461058a578063f6a5f9f5146105aa578063fbe0a31b146105bd57600080fd5b8063cec7b35914610564578063d26ff2101461057757600080fd5b8063b54170841461050b578063bc00c2161461051e578063bd02d0f514610531578063c031a1801461055157600080fd5b806397b87ba6116101145780639ded06df116100f95780639ded06df146104de578063a3499c73146104f1578063aa1e1f0a1461050457600080fd5b806397b87ba6146104ab578063986e791a146104be57600080fd5b80637b1b769e1461045e578063886a625d1461047257806388b3058714610485578063935b13f61461049857600080fd5b80632a2dae0a116101d85780635c60da1b116101a757806364940c561161018c57806364940c561461040257806367ace8eb146104285780637ae1cfca1461043b57600080fd5b80635c60da1b146103965780635f6970c3146103ef57600080fd5b80632a2dae0a14610342578063364940d8146103685780634656ae2e14610370578063585a9fd41461038357600080fd5b80631c92115f116102145780631c92115f146102ba57806321f8a721146102cd578063269eb65e1461030e57806326ef699d1461032f57600080fd5b806309c5eabe14610246578063146e2d781461025b57806314bfd6d01461026e5780631876eed914610297575b600080fd5b610259610254366004612f84565b6105d0565b005b610259610269366004612fc6565b610aea565b61028161027c366004613012565b610b33565b60405161028e919061302b565b60405180910390f35b6102aa6102a5366004613078565b610bdd565b604051901515815260200161028e565b6102596102c836600461312d565b610d11565b6102f66102db366004613012565b6000908152600260205260409020546001600160a01b031690565b6040516001600160a01b03909116815260200161028e565b61032161031c36600461328c565b610d7c565b60405190815260200161028e565b61025961033d3660046132c1565b610d90565b7f00000000000000000000000000000000000000000000000000000000000000006102f6565b610321610e28565b61025961037e366004612fc6565b610e80565b610259610391366004612fc6565b6111d4565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60005260026020527f11141f466c69fd409e1990e063b49cd6d61ed2ecff27a2e402e259ca6b9a01a3546001600160a01b03166102f6565b6102aa6103fd366004613364565b611282565b7f00000000000000000000000000000000000000000000000000000000000000006102f6565b61025961043636600461342b565b61133b565b6102aa610449366004613012565b60009081526004602052604090205460ff1690565b6102aa61046c36600461328c565b50600090565b610259610480366004612fc6565b6115b8565b610321610493366004613012565b611868565b6102f66104a636600461328c565b611873565b6102596104b9366004612fc6565b611881565b6104d16104cc366004613012565b61195f565b60405161028e91906134ef565b6102596104ec366004612f84565b611a01565b6102596104ff366004613517565b611c35565b60006102aa565b610259610519366004613567565b611f59565b6102aa61052c366004613633565b61200f565b61032161053f366004613012565b60009081526020819052604090205490565b6104d161055f366004613012565b6120e2565b61032161057236600461328c565b6120ff565b6102aa610585366004613012565b612119565b610321610598366004613012565b60009081526005602052604090205490565b6102aa6105b8366004613701565b612127565b6102596105cb366004612fc6565b6121b0565b6000806105df83850185613798565b9150915060006105f58380519060200120612250565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166373e3d66a83856040518363ffffffff1660e01b81526004016106479291906137fc565b602060405180830381600087803b15801561066157600080fd5b505af1158015610675573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610699919061382a565b905060006060806060878060200190518101906106b691906139ce565b929650909450925090504684146106f9576040517f7a47c9a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825182518114158061070c575081518114155b15610743576040517fca9a28f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610adc57600085828151811061076257610762613ab8565b6020026020010151905061077581612119565b156107805750610acc565b60008086848151811061079557610795613ab8565b60200260200101516040516020016107ad9190613ace565b6040516020818303038152906040528051906020012090507f5763814b98a3aa86f212797af3273868b5dd6e2a532d764a79b98ca859e7bbad811415610815577f886a625d0000000000000000000000000000000000000000000000000000000091506109be565b7fec78d9c22c08bb9f0ecd5d95571ae83e3f22219c5a9278c3270691d50abfd91b811415610865577f146e2d780000000000000000000000000000000000000000000000000000000091506109be565b7f37ac16aabc4d87540e53151b2b716265cfd6b195db96a9daf8e893c829bbd2338114156108b5577ffbe0a31b0000000000000000000000000000000000000000000000000000000091506109be565b7ff41504255b911b3042ee4f8786fdf7cf4bcf24ace033fa16af3c8574e025e436811415610905577f585a9fd40000000000000000000000000000000000000000000000000000000091506109be565b7fda199c0e76f665e0450020791c7f8eacc75f3cdbace313272c28f93e5390b62c811415610955577f4656ae2e0000000000000000000000000000000000000000000000000000000091506109be565b7fb460dcb6fd5797fc0e7ea0f13406c80d30702ba7f73a42bd91394775dcbca7188114156109b6578961098a57505050610acc565b600099507f97b87ba60000000000000000000000000000000000000000000000000000000091506109be565b505050610acc565b6109c98360016122a4565b6000306001600160a01b0316838887815181106109e8576109e8613ab8565b602002602001015186604051602401610a02929190613aea565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610a409190613ace565b6000604051808303816000865af19150503d8060008114610a7d576040519150601f19603f3d011682016040523d82523d6000602084013e610a82565b606091505b505090508015610abc5760405184907fa74c8847d513feba22a0f0cb38d53081abf97562cdb293926ba243689e7c41ca90600090a2610ac7565b610ac78460006122a4565b505050505b610ad581613b22565b9050610746565b505050505050505050505050565b333014610b0a576040516314e1dbf760e11b815260040160405180910390fd5b60008080610b1a85870187613b48565b925092509250610b2b8383836122d0565b505050505050565b60606000610b408361246d565b90508067ffffffffffffffff811115610b5b57610b5b6131c7565b604051908082528060200260200182016040528015610b84578160200160208202803683370190505b50915060005b81811015610bd657610b9c848261247b565b838281518110610bae57610bae613ab8565b6001600160a01b0390921660209283029190910190910152610bcf81613b22565b9050610b8a565b5050919050565b600080610c8e8b8b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815292508d91508c908190840183828082843760009201919091525050604080516020601f8d018190048102820181019092528b81523393508d9250908c908c90819084018382808284376000920191909152508c9250612491915050565b60008181526004602052604090205460ff16925090508115610d03576000818152600460205260409020805460ff19169055610d0385858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152503392508791506122d09050565b509998505050505050505050565b8181604051610d21929190613ba2565b6040518091039020336001600160a01b03167f30ae6cc78c27e651745bf2ad08a11de83910ac1e347a52f7ac898c0fbef94dae888888888888604051610d6c96959493929190613bdb565b60405180910390a3505050505050565b6000610d8a61053f836124f5565b92915050565b610dd23384848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525086925061252a915050565b336001600160a01b03167f651d93f66c4329630e8d0f62488eff599e3be484da587335e8dc0fcf4606272688888888888888604051610e179796959493929190613c24565b60405180910390a250505050505050565b6000610e7b7fd51dc9b187568bb94760866e1d0d066ca470037d2d331afb1a02ec74bfb8990c60009081526020527ff8d0c05cd32e3272241fdc9d5839565f8bcf94139cb4bd09e230e1b57a60ddc25490565b905090565b333014610ea0576040516314e1dbf760e11b815260040160405180910390fd5b600080610eaf84860186613c75565b915091506000610ebe83611873565b90506001600160a01b038116610ef2578260405163395d09bf60e11b8152600401610ee991906134ef565b60405180910390fd5b6002610efd84612795565b6002811115610f0e57610f0e613cba565b141561117157600082604051610f2390612f2e565b8190604051809103906000f5905080158015610f43573d6000803e3d6000fd5b506040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038083166004830181905292935060009283929091631cff79cd91879163a9059cbb60e01b9130918416906370a082319060240160206040518083038186803b158015610fbd57600080fd5b505afa158015610fd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff59190613cd0565b6040516001600160a01b039092166024830152604482015260640160408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e085901b90921682526110569291600401613ce9565b600060405180830381600087803b15801561107057600080fd5b505af1158015611084573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110ac9190810190613d0b565b915091508115806110d957508051158015906110d95750808060200190518101906110d7919061382a565b155b156110f9578560405163e217b0ad60e01b8152600401610ee991906134ef565b6040517ef55d9d0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0384169062f55d9d90602401600060405180830381600087803b15801561115157600080fd5b505af1158015611165573d6000803e3d6000fd5b50505050505050610b2b565b6040516308a1eee160e01b8152600481018390526001600160a01b038216906308a1eee1906024015b600060405180830381600087803b1580156111b457600080fd5b505af11580156111c8573d6000803e3d6000fd5b50505050505050505050565b3330146111f4576040516314e1dbf760e11b815260040160405180910390fd5b6000808080808080806112098a8c018c613d4f565b97509750975097509750975097509750611228898989898989896127b4565b84866001600160a01b03168a7f9991faa1f435675159ffae64b66d7ecfdb55c29755869a18db8497b4392347e08b8b8989898960405161126d96959493929190613e0d565b60405180910390a45050505050505050505050565b6000806112fd8888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8c018190048102820181019092528a815292508a91508990819084018382808284376000920191909152503392508991506127ea9050565b60008181526004602052604090205460ff16925090508115611330576000818152600460205260409020805460ff191690555b509695505050505050565b600061138e7fd51dc9b187568bb94760866e1d0d066ca470037d2d331afb1a02ec74bfb8990c60009081526020527ff8d0c05cd32e3272241fdc9d5839565f8bcf94139cb4bd09e230e1b57a60ddc25490565b905061139a8133612848565b6113b757604051637bfa4b9f60e01b815260040160405180910390fd5b600080366040516113c9929190613ba2565b604051809103902090506113de828233612857565b156113fc57604051637c9a1cf960e01b815260040160405180910390fd5b61140982823360016128d5565b600060016114178484612948565b6114219190613e65565b905061142e838383612957565b6114378361297c565b811015611446575050506115b2565b85841461147f576040517f14a2275f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8681101561156157600088888381811061149e5761149e613ab8565b90506020028101906114b09190613e7d565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509394508a92508991508590508181106114fb576114fb613ab8565b90506020020135905060006001600160a01b031661151883611873565b6001600160a01b03161415611542578160405163395d09bf60e11b8152600401610ee991906134ef565b61154c828261298a565b5050808061155990613b22565b915050611482565b5061156e83836000612957565b60006115798461246d565b905060005b818110156115ac5761159c8585611595888561247b565b60006128d5565b6115a581613b22565b905061157e565b50505050505b50505050565b3330146115d8576040516314e1dbf760e11b815260040160405180910390fd5b600080808080806115eb888a018a613ec4565b95509550955095509550955060006001600160a01b031661160b86611873565b6001600160a01b03161461164d57846040517faa7e8b32000000000000000000000000000000000000000000000000000000008152600401610ee991906134ef565b6001600160a01b0382166117b95760008560405160200161166e9190613ace565b6040516020818303038152906040528051906020012090506000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636fc95b3460e01b8a8a8a8a886040516024016116d4959493929190613f67565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516117129190613ace565b600060405180830381855af49150503d806000811461174d576040519150601f19603f3d011682016040523d82523d6000602084013e611752565b606091505b50915091508161179057876040517f86d52743000000000000000000000000000000000000000000000000000000008152600401610ee991906134ef565b808060200190518101906117a49190613fad565b94506117b18860016129d3565b505050611810565b6001600160a01b0382163b611805576040517fc5ccddde0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610ee9565b6118108560026129d3565b61181a8583612a03565b611824858261298a565b7fbf90b5a1ec9763e8bf4b9245cef0c28db92bab309fc2c5177f17814f382469388583604051611855929190613fca565b60405180910390a1505050505050505050565b6000610d8a8261297c565b6000610d8a6102db83612a45565b3330146118a1576040516314e1dbf760e11b815260040160405180910390fd5b60405163d289d1cb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d289d1cb906118ef9086908690600401613ff5565b600060405180830381600087803b15801561190957600080fd5b505af115801561191d573d6000803e3d6000fd5b505050507f192e759e55f359cd9832b5c0c6e38e4b6df5c5ca33f3bd5c90738e865a5218728383604051611952929190613ff5565b60405180910390a1505050565b600081815260016020526040902080546060919061197c90614009565b80601f01602080910402602001604051908101604052809291908181526020018280546119a890614009565b80156119f55780601f106119ca576101008083540402835291602001916119f5565b820191906000526020600020905b8154815290600101906020018083116119d857829003601f168201915b50505050509050919050565b6000611a5d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60005260026020527f11141f466c69fd409e1990e063b49cd6d61ed2ecff27a2e402e259ca6b9a01a3546001600160a01b031690565b6001600160a01b03161415611a9e576040517fbf10dd3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008080611aae84860186614044565b92509250925060006001611b097fd51dc9b187568bb94760866e1d0d066ca470037d2d331afb1a02ec74bfb8990c60009081526020527ff8d0c05cd32e3272241fdc9d5839565f8bcf94139cb4bd09e230e1b57a60ddc25490565b611b139190613e65565b9050611b66817fd51dc9b187568bb94760866e1d0d066ca470037d2d331afb1a02ec74bfb8990c60009081526020527ff8d0c05cd32e3272241fdc9d5839565f8bcf94139cb4bd09e230e1b57a60ddc255565b611b71818585612a7d565b815115610b2b5760405163d289d1cb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d289d1cb90611bc49085906004016134ef565b600060405180830381600087803b158015611bde57600080fd5b505af1158015611bf2573d6000803e3d6000fd5b505050507f192e759e55f359cd9832b5c0c6e38e4b6df5c5ca33f3bd5c90738e865a52187282604051611c2591906134ef565b60405180910390a1505050505050565b6000611c887fd51dc9b187568bb94760866e1d0d066ca470037d2d331afb1a02ec74bfb8990c60009081526020527ff8d0c05cd32e3272241fdc9d5839565f8bcf94139cb4bd09e230e1b57a60ddc25490565b9050611c948133612848565b611cb157604051637bfa4b9f60e01b815260040160405180910390fd5b60008036604051611cc3929190613ba2565b60405180910390209050611cd8828233612857565b15611cf657604051637c9a1cf960e01b815260040160405180910390fd5b611d0382823360016128d5565b60006001611d118484612948565b611d1b9190613e65565b9050611d28838383612957565b611d318361297c565b811015611d40575050506115b2565b866001600160a01b03163f8614611d83576040517f8f84fb2400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516001600160a01b038816907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28315611e9f576000876001600160a01b0316639ded06df60e01b8787604051602401611de4929190613ff5565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051611e229190613ace565b600060405180830381855af49150503d8060008114611e5d576040519150601f19603f3d011682016040523d82523d6000602084013e611e62565b606091505b5050905080611e9d576040517f97905dfb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b611f16877f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60005260026020527f11141f466c69fd409e1990e063b49cd6d61ed2ecff27a2e402e259ca6b9a01a3805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03831617905550565b611f2283836000612957565b6000611f2d8461246d565b905060005b818110156115ac57611f498585611595888561247b565b611f5281613b22565b9050611f32565b611f9b3384848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525086925061252a915050565b8484604051611fab929190613ba2565b6040518091039020336001600160a01b03167f7e50569d26be643bda7757722291ec66b1be66d8283474ae3fab5a98f878a7a28b8b8b8b8b8b8b8b8b604051611ffc9998979695949392919061410f565b60405180910390a3505050505050505050565b60006120d36104498c8c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8d018190048102820181019092528b81528e93508d9250908c908c90819084018382808284376000920191909152508c9250612491915050565b9b9a5050505050505050505050565b600081815260036020526040902080546060919061197c90614009565b6000610d8a61053f8361211461546042614177565b612bb6565b6000610d8a61044983612c0b565b60006121a46104498989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8d018190048102820181019092528b815292508b91508a90819084018382808284376000920191909152508a92508991506127ea9050565b98975050505050505050565b3330146121d0576040516314e1dbf760e11b815260040160405180910390fd5b600080808080806121e3888a018a614199565b9550955095509550955095506121fc8787878787612c46565b82846001600160a01b0316887f44e4f8f6bd682c5a3aeba93601ab07cb4d1f21b2aab1ae4880d9577919309aa48989878760405161223d949392919061422b565b60405180910390a4505050505050505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c015b604051602081830303815290604052805190602001209050919050565b6122cc6122b083612c0b565b6000908152600460205260409020805460ff1916831515179055565b5050565b60006122db84611873565b90506001600160a01b038116612306578360405163395d09bf60e11b8152600401610ee991906134ef565b6123238483612314876120ff565b61231e9190613e65565b612c56565b600261232e85612795565b600281111561233f5761233f613cba565b14156123ec576040516001600160a01b0384166024820152604481018390526000906123ab90839063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612cd1565b9050806123e657846040517f90c52ed7000000000000000000000000000000000000000000000000000000008152600401610ee991906134ef565b506115b2565b6040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152602482018490528216906340c10f1990604401600060405180830381600087803b15801561244f57600080fd5b505af1158015612463573d6000803e3d6000fd5b5050505050505050565b6000610d8a61053f83612d7a565b600061248a6102db8484612db5565b9392505050565b60007fb7ad972b71475860613db3ba1fe699b886c878f9002a09250dc25e769eb19a10888888888888886040516020016124d2989796959493929190614264565b604051602081830303815290604052805190602001209050979650505050505050565b60007feee9348b4aaba3647b1612b2724f18e93b9299da26fb321c7b3fda135d7dea87826040516020016122879291906142d7565b600061253583611873565b90506001600160a01b038116612560578260405163395d09bf60e11b8152600401610ee991906134ef565b81612597576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006125a284612795565b9050600060028260028111156125ba576125ba613cba565b1415612618576040516001600160a01b0387166024820152306044820152606481018590526125f69084906323b872dd60e01b90608401612374565b905080610b2b578460405163e217b0ad60e01b8152600401610ee991906134ef565b600182600281111561262c5761262c613cba565b141561267b576040516001600160a01b0387166024820152604481018590526125f69084907f79cc67900000000000000000000000000000000000000000000000000000000090606401612374565b6040517f31eecaf4000000000000000000000000000000000000000000000000000000008152600060048201526127469084906323b872dd60e01b9089906001600160a01b038416906331eecaf49060240160206040518083038186803b1580156126e557600080fd5b505afa1580156126f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061271d9190613fad565b6040516001600160a01b0392831660248201529116604482015260648101889052608401612374565b905080612768578460405163e217b0ad60e01b8152600401610ee991906134ef565b6040516308a1eee160e01b8152600060048201526001600160a01b038416906308a1eee19060240161119a565b60006127a361053f83612df7565b6002811115610d8a57610d8a613cba565b6127e16127c688888888888888612491565b6000908152600460205260409020805460ff19166001179055565b50505050505050565b60007f07b0d4304f82012bd3b70b1d531c160e326067c90829e2a3d386722ad10b89c38686868686604051602001612827969594939291906142fd565b60405160208183030381529060405280519060200120905095945050505050565b600061248a6104498484612e2c565b604080517f3ced7a8caf1111e0fbf4b784c5b41aebd0f2389d9f2f64d5c3424aeed3adbd3c602080830191909152818301869052606080830186905284901b6bffffffffffffffffffffffff1916608083015282518083036074018152609490920190925280519101206000906128cd90610449565b949350505050565b604080517f3ced7a8caf1111e0fbf4b784c5b41aebd0f2389d9f2f64d5c3424aeed3adbd3c602080830191909152818301879052606080830187905285901b6bffffffffffffffffffffffff1916608083015282518083036074018152609490920190925280519101206115b2906122b0565b600061248a61053f8484612e7f565b6129776129648484612e7f565b8260009182526020829052604090912055565b505050565b6000610d8a61053f83612ec1565b612996612964836124f5565b7fd99446c1d76385bb5519ccfb5274abcfd5896dfc22405e40010fde217f018a1882826040516129c7929190613aea565b60405180910390a15050565b6122cc6129df83612df7565b8260028111156129f1576129f1613cba565b60009182526020829052604090912055565b6122cc612a0f83612a45565b6000908152600260205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038416179055565b60007fc4e632779a6a7838736dd7e5e6a0eadf171dd37dfb6230720e265576dfcf42bb826040516020016122879291906142d7565b50565b815181811015612aa05760405163f1965a0760e01b815260040160405180910390fd5b81612ad7576040517f1845300d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ae18483612efc565b612aeb8482612f08565b60005b81811015612baf576000848281518110612b0a57612b0a613ab8565b60200260200101519050612b1e8682612848565b15612b60576040517f424926de0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610ee9565b6001600160a01b038116612b875760405163f1965a0760e01b815260040160405180910390fd5b612b92868383612f14565b612b9e86826001612f21565b50612ba881613b22565b9050612aee565b5050505050565b60007f2f8851fe0d6d537e552a4f25b7a3167d48eb1292622c71d84630a2a44757bced8383604051602001612bed9392919061434d565b60405160208183030381529060405280519060200120905092915050565b604080517f957705a374326b30f4a1069c936d736cc9993ed6c820b4e0e2fd94a8beca0d1d6020820152908101829052600090606001612287565b612baf6127c686868686866127ea565b6000612c6183610d7c565b9050600081118015612c7257508082115b15612cab57826040517f037f60e5000000000000000000000000000000000000000000000000000000008152600401610ee991906134ef565b612977612cbe8461211461546042614177565b8360009182526020829052604090912055565b60006001600160a01b0383163b612cea57506000610d8a565b600080846001600160a01b031684604051612d059190613ace565b6000604051808303816000865af19150503d8060008114612d42576040519150601f19603f3d011682016040523d82523d6000602084013e612d47565b606091505b5091509150818015612d71575080511580612d71575080806020019051810190612d71919061382a565b95945050505050565b604080517f05112ef894367de1270cfae12afcd2285c225830eb8f74e7e938f721bb510cba6020820152908101829052600090606001612287565b604080517ff23ec0bb4210edd5cba85afd05127efcd2fc6a781bfed49188da1081670b22d8602082015290810183905260608101829052600090608001612bed565b60007fa80d2259af55890618ec2eeb3ac72de4bdba22529bb14845d8a3d712d1c3f621826040516020016122879291906142d7565b604080517f63fa879cb478fddf1de08d49e29115fb768866711bc799ff9ab419a7f16c9afb6020820152908101839052606082811b6bffffffffffffffffffffffff191690820152600090607401612bed565b604080517fbaea1c6c0f16a0a340b10a9e980806696a68ddbb5e8361fd64630dd21abf515f602082015290810183905260608101829052600090608001612bed565b604080517f79bd914addd90bd67ad800bf0230bb85ffdef5aeba5fd8249f116d3f17f4fb4b6020820152908101829052600090606001612287565b6122cc61296483612ec1565b6122cc61296483612d7a565b612977612a0f8484612db5565b6129776122b08484612e2c565b6103498061437783390190565b60008083601f840112612f4d57600080fd5b50813567ffffffffffffffff811115612f6557600080fd5b602083019150836020828501011115612f7d57600080fd5b9250929050565b60008060208385031215612f9757600080fd5b823567ffffffffffffffff811115612fae57600080fd5b612fba85828601612f3b565b90969095509350505050565b600080600060408486031215612fdb57600080fd5b833567ffffffffffffffff811115612ff257600080fd5b612ffe86828701612f3b565b909790965060209590950135949350505050565b60006020828403121561302457600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b8181101561306c5783516001600160a01b031683529284019291840191600101613047565b50909695505050505050565b600080600080600080600080600060c08a8c03121561309657600080fd5b8935985060208a013567ffffffffffffffff808211156130b557600080fd5b6130c18d838e01612f3b565b909a50985060408c01359150808211156130da57600080fd5b6130e68d838e01612f3b565b909850965060608c0135955060808c013591508082111561310657600080fd5b506131138c828d01612f3b565b9a9d999c50979a9699959894979660a00135949350505050565b6000806000806000806060878903121561314657600080fd5b863567ffffffffffffffff8082111561315e57600080fd5b61316a8a838b01612f3b565b9098509650602089013591508082111561318357600080fd5b61318f8a838b01612f3b565b909650945060408901359150808211156131a857600080fd5b506131b589828a01612f3b565b979a9699509497509295939492505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613206576132066131c7565b604052919050565b600067ffffffffffffffff821115613228576132286131c7565b50601f01601f191660200190565b600082601f83011261324757600080fd5b813561325a6132558261320e565b6131dd565b81815284602083860101111561326f57600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561329e57600080fd5b813567ffffffffffffffff8111156132b557600080fd5b6128cd84828501613236565b60008060008060008060006080888a0312156132dc57600080fd5b873567ffffffffffffffff808211156132f457600080fd5b6133008b838c01612f3b565b909950975060208a013591508082111561331957600080fd5b6133258b838c01612f3b565b909750955060408a013591508082111561333e57600080fd5b5061334b8a828b01612f3b565b989b979a50959894979596606090950135949350505050565b6000806000806000806080878903121561337d57600080fd5b86359550602087013567ffffffffffffffff8082111561339c57600080fd5b6133a88a838b01612f3b565b909750955060408901359150808211156133c157600080fd5b506133ce89828a01612f3b565b979a9699509497949695606090950135949350505050565b60008083601f8401126133f857600080fd5b50813567ffffffffffffffff81111561341057600080fd5b6020830191508360208260051b8501011115612f7d57600080fd5b6000806000806040858703121561344157600080fd5b843567ffffffffffffffff8082111561345957600080fd5b613465888389016133e6565b9096509450602087013591508082111561347e57600080fd5b5061348b878288016133e6565b95989497509550505050565b60005b838110156134b257818101518382015260200161349a565b838111156115b25750506000910152565b600081518084526134db816020860160208601613497565b601f01601f19169290920160200192915050565b60208152600061248a60208301846134c3565b6001600160a01b0381168114612a7a57600080fd5b6000806000806060858703121561352d57600080fd5b843561353881613502565b935060208501359250604085013567ffffffffffffffff81111561355b57600080fd5b61348b87828801612f3b565b600080600080600080600080600060a08a8c03121561358557600080fd5b893567ffffffffffffffff8082111561359d57600080fd5b6135a98d838e01612f3b565b909b50995060208c01359150808211156135c257600080fd5b6135ce8d838e01612f3b565b909950975060408c01359150808211156135e757600080fd5b6135f38d838e01612f3b565b909750955060608c013591508082111561360c57600080fd5b506136198c828d01612f3b565b9a9d999c50979a9699959894979660800135949350505050565b60008060008060008060008060008060e08b8d03121561365257600080fd5b8a35995060208b013567ffffffffffffffff8082111561367157600080fd5b61367d8e838f01612f3b565b909b50995060408d013591508082111561369657600080fd5b6136a28e838f01612f3b565b909950975060608d013591506136b782613502565b90955060808c0135945060a08c013590808211156136d457600080fd5b506136e18d828e01612f3b565b9150809450508092505060c08b013590509295989b9194979a5092959850565b600080600080600080600060a0888a03121561371c57600080fd5b87359650602088013567ffffffffffffffff8082111561373b57600080fd5b6137478b838c01612f3b565b909850965060408a013591508082111561376057600080fd5b5061376d8a828b01612f3b565b909550935050606088013561378181613502565b809250506080880135905092959891949750929550565b600080604083850312156137ab57600080fd5b823567ffffffffffffffff808211156137c357600080fd5b6137cf86838701613236565b935060208501359150808211156137e557600080fd5b506137f285828601613236565b9150509250929050565b8281526040602082015260006128cd60408301846134c3565b8051801515811461382557600080fd5b919050565b60006020828403121561383c57600080fd5b61248a82613815565b600067ffffffffffffffff82111561385f5761385f6131c7565b5060051b60200190565b60006138776132558461320e565b905082815283838301111561388b57600080fd5b61248a836020830184613497565b600082601f8301126138aa57600080fd5b815160206138ba61325583613845565b82815260059290921b840181019181810190868411156138d957600080fd5b8286015b8481101561133057805167ffffffffffffffff8111156138fd5760008081fd5b8701603f8101891361390f5760008081fd5b613920898683015160408401613869565b8452509183019183016138dd565b600082601f83011261393f57600080fd5b61248a83835160208501613869565b600082601f83011261395f57600080fd5b8151602061396f61325583613845565b82815260059290921b8401810191818101908684111561398e57600080fd5b8286015b8481101561133057805167ffffffffffffffff8111156139b25760008081fd5b6139c08986838b010161392e565b845250918301918301613992565b600080600080608085870312156139e457600080fd5b8451935060208086015167ffffffffffffffff80821115613a0457600080fd5b818801915088601f830112613a1857600080fd5b8151613a2661325582613845565b81815260059190911b8301840190848101908b831115613a4557600080fd5b938501935b82851015613a6357845182529385019390850190613a4a565b60408b01519098509450505080831115613a7c57600080fd5b613a8889848a01613899565b94506060880151925080831115613a9e57600080fd5b5050613aac8782880161394e565b91505092959194509250565b634e487b7160e01b600052603260045260246000fd5b60008251613ae0818460208701613497565b9190910192915050565b604081526000613afd60408301856134c3565b90508260208301529392505050565b634e487b7160e01b600052601160045260246000fd5b6000600019821415613b3657613b36613b0c565b5060010190565b803561382581613502565b600080600060608486031215613b5d57600080fd5b833567ffffffffffffffff811115613b7457600080fd5b613b8086828701613236565b9350506020840135613b9181613502565b929592945050506040919091013590565b8183823760009101908152919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b606081526000613bef60608301888a613bb2565b8281036020840152613c02818789613bb2565b90508281036040840152613c17818587613bb2565b9998505050505050505050565b608081526000613c3860808301898b613bb2565b8281036020840152613c4b81888a613bb2565b90508281036040840152613c60818688613bb2565b91505082606083015298975050505050505050565b60008060408385031215613c8857600080fd5b823567ffffffffffffffff811115613c9f57600080fd5b613cab85828601613236565b95602094909401359450505050565b634e487b7160e01b600052602160045260246000fd5b600060208284031215613ce257600080fd5b5051919050565b6001600160a01b03831681526040602082015260006128cd60408301846134c3565b60008060408385031215613d1e57600080fd5b613d2783613815565b9150602083015167ffffffffffffffff811115613d4357600080fd5b6137f28582860161392e565b600080600080600080600080610100898b031215613d6c57600080fd5b883567ffffffffffffffff80821115613d8457600080fd5b613d908c838d01613236565b995060208b0135915080821115613da657600080fd5b613db28c838d01613236565b9850613dc060408c01613b3d565b975060608b0135965060808b0135915080821115613ddd57600080fd5b50613dea8b828c01613236565b989b979a50959894979660a0860135965060c08601359560e00135945092505050565b60c081526000613e2060c08301896134c3565b8281036020840152613e3281896134c3565b90508281036040840152613e4681886134c3565b60608401969096525050608081019290925260a0909101529392505050565b60008219821115613e7857613e78613b0c565b500190565b6000808335601e19843603018112613e9457600080fd5b83018035915067ffffffffffffffff821115613eaf57600080fd5b602001915036819003821315612f7d57600080fd5b60008060008060008060c08789031215613edd57600080fd5b863567ffffffffffffffff80821115613ef557600080fd5b613f018a838b01613236565b97506020890135915080821115613f1757600080fd5b50613f2489828a01613236565b955050604087013560ff81168114613f3b57600080fd5b9350606087013592506080870135613f5281613502565b8092505060a087013590509295509295509295565b60a081526000613f7a60a08301886134c3565b8281036020840152613f8c81886134c3565b60ff9690961660408401525050606081019290925260809091015292915050565b600060208284031215613fbf57600080fd5b815161248a81613502565b604081526000613fdd60408301856134c3565b90506001600160a01b03831660208301529392505050565b6020815260006128cd602083018486613bb2565b600181811c9082168061401d57607f821691505b6020821081141561403e57634e487b7160e01b600052602260045260246000fd5b50919050565b60008060006060848603121561405957600080fd5b833567ffffffffffffffff8082111561407157600080fd5b818601915086601f83011261408557600080fd5b8135602061409561325583613845565b82815260059290921b8401810191818101908a8411156140b457600080fd5b948201945b838610156140db5785356140cc81613502565b825294820194908201906140b9565b97505087013594505060408601359150808211156140f857600080fd5b5061410586828701613236565b9150509250925092565b60a08152600061412360a083018b8d613bb2565b8281036020840152614136818a8c613bb2565b9050828103604084015261414b81888a613bb2565b90508281036060840152614160818688613bb2565b9150508260808301529a9950505050505050505050565b60008261419457634e487b7160e01b600052601260045260246000fd5b500490565b60008060008060008060c087890312156141b257600080fd5b863567ffffffffffffffff808211156141ca57600080fd5b6141d68a838b01613236565b975060208901359150808211156141ec57600080fd5b506141f989828a01613236565b955050604087013561420a81613502565b959894975094956060810135955060808101359460a0909101359350915050565b60808152600061423e60808301876134c3565b828103602084015261425081876134c3565b604084019590955250506060015292915050565b60006101008a83528960208401528060408401526142848184018a6134c3565b9050828103606084015261429881896134c3565b90506001600160a01b03871660808401528560a084015282810360c08401526142c181866134c3565b9150508260e08301529998505050505050505050565b828152600082516142ef816020850160208701613497565b919091016020019392505050565b86815285602082015260c06040820152600061431c60c08301876134c3565b828103606084015261432e81876134c3565b6001600160a01b03959095166080840152505060a00152949350505050565b83815260606020820152600061436660608301856134c3565b905082604083015294935050505056fe6080604052600160005534801561001557600080fd5b50610324806100256000396000f3fe608060405234801561001057600080fd5b50600436106100355760003560e01c8062f55d9d1461003a5780631cff79cd1461004f575b600080fd5b61004d6100483660046101da565b610079565b005b61006261005d3660046101fc565b6100bb565b60405161007092919061027f565b60405180910390f35b6002600054141561009d5760405163caa30f5560e01b815260040160405180910390fd5b600260005573ffffffffffffffffffffffffffffffffffffffff8116ff5b60006060600260005414156100e35760405163caa30f5560e01b815260040160405180910390fd5b600260005573ffffffffffffffffffffffffffffffffffffffff85163b610136576040517f6f7c43f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16848460405161015d9291906102de565b6000604051808303816000865af19150503d806000811461019a576040519150601f19603f3d011682016040523d82523d6000602084013e61019f565b606091505b50600160005590969095509350505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146101d557600080fd5b919050565b6000602082840312156101ec57600080fd5b6101f5826101b1565b9392505050565b60008060006040848603121561021157600080fd5b61021a846101b1565b9250602084013567ffffffffffffffff8082111561023757600080fd5b818601915086601f83011261024b57600080fd5b81358181111561025a57600080fd5b87602082850101111561026c57600080fd5b6020830194508093505050509250925092565b821515815260006020604081840152835180604085015260005b818110156102b557858101830151858201606001528201610299565b818111156102c7576000606083870101525b50601f01601f191692909201606001949350505050565b818382376000910190815291905056fea264697066735822122032cb5e746816b7fac95205c068b30da37bd40119a57265be331c162cae74712464736f6c63430008090033a26469706673582212204998f838cdcafb3bed81b83a80af25a5eb3725a58bc3781fb9f68ff16718975664736f6c634300080900330000000000000000000000001a22f44135b4622c3d0f15912de056d6450494ad000000000000000000000000e914a392c5a5f814fb6514fa1709680ac4240ff0

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000001a22f44135b4622c3d0f15912de056d6450494ad000000000000000000000000e914a392c5a5f814fb6514fa1709680ac4240ff0

-----Decoded View---------------
Arg [0] : authModule_ (address): 0x1a22f44135b4622c3d0f15912de056d6450494ad
Arg [1] : tokenDeployerImplementation_ (address): 0xe914a392c5a5f814fb6514fa1709680ac4240ff0

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000001a22f44135b4622c3d0f15912de056d6450494ad
Arg [1] : 000000000000000000000000e914a392c5a5f814fb6514fa1709680ac4240ff0


Deployed ByteCode Sourcemap

24801:25649:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35483:2725;;;;;;:::i;:::-;;:::i;:::-;;40015:240;;;;;;:::i;:::-;;:::i;32621:304::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29898:615;;;;;;:::i;:::-;;:::i;:::-;;;3517:14:1;;3510:22;3492:41;;3480:2;3465:18;29898:615:0;3352:187:1;27828:290:0;;;;;;:::i;:::-;;:::i;16145:109::-;;;;;;:::i;:::-;16199:7;16226:20;;;:15;:20;;;;;;-1:-1:-1;;;;;16226:20:0;;16145:109;;;;-1:-1:-1;;;;;4904:55:1;;;4886:74;;4874:2;4859:18;16145:109:0;4740:226:1;30795:149:0;;;;;;:::i;:::-;;:::i;:::-;;;6574:25:1;;;6562:2;6547:18;30795:149:0;6428:177:1;27487:333:0;;;;;;:::i;:::-;;:::i;30677:110::-;30750:29;30677:110;;32233:102;;;:::i;40263:1100::-;;;;;;:::i;:::-;;:::i;42044:930::-;;;;;;:::i;:::-;;:::i;31461:121::-;25380:66;31517:7;16226:20;:15;:20;;;;-1:-1:-1;;;;;16226:20:0;31461:121;32233:102;29479:411;;;;;;:::i;:::-;;:::i;30580:89::-;30650:11;30580:89;;33016:499;;;;;;:::i;:::-;;:::i;16380:100::-;;;;;;:::i;:::-;16431:4;16455:17;;;:12;:17;;;;;;;;;16380:100;31912:105;;;;;;:::i;:::-;-1:-1:-1;31980:4:0;;31912:105;38296:1711;;;;;;:::i;:::-;;:::i;32411:131::-;;;;;;:::i;:::-;;:::i;31590:150::-;;;;;;:::i;:::-;;:::i;42982:231::-;;;;;;:::i;:::-;;:::i;16024:113::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;34607:868::-;;;;;;:::i;:::-;;:::i;33523:917::-;;;;;;:::i;:::-;;:::i;31357:96::-;31416:4;31357:96;;28126:435;;;;;;:::i;:::-;;:::i;28957:514::-;;;;;;:::i;:::-;;:::i;15913:103::-;;;;;;:::i;:::-;15964:7;15991:17;;;;;;;;;;;;15913:103;16262:110;;;;;;:::i;:::-;;:::i;30952:233::-;;;;;;:::i;:::-;;:::i;32025:152::-;;;;;;:::i;:::-;;:::i;16488:100::-;;;;;;:::i;:::-;16538:6;16564:16;;;:11;:16;;;;;;;16488:100;28569:380;;;;;;:::i;:::-;;:::i;41371:665::-;;;;;;:::i;:::-;;:::i;35483:2725::-;35552:17;;35593:33;;;;35604:5;35593:33;:::i;:::-;35551:75;;;;35639:19;35661:45;35700:4;35690:15;;;;;;35661:28;:45::i;:::-;35639:67;;35766:30;35811:11;-1:-1:-1;;;;;35799:38:0;;35838:11;35851:5;35799:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35766:91;;35870:15;35896:27;35934:24;35969:21;36056:4;36045:57;;;;;;;;;;;;:::i;:::-;36003:99;;-1:-1:-1;36003:99:0;;-1:-1:-1;36003:99:0;-1:-1:-1;36003:99:0;-1:-1:-1;36130:13:0;36119:24;;36115:53;;36152:16;;;;;;;;;;;;;;36115:53;36206:17;;36258:15;;36240:33;;;;:68;;;36295:6;:13;36277:14;:31;;36240:68;36236:98;;;36317:17;;;;;;;;;;;;;;36236:98;36352:9;36347:1854;36367:14;36363:1;:18;36347:1854;;;36403:17;36423:10;36434:1;36423:13;;;;;;;;:::i;:::-;;;;;;;36403:33;;36457:28;36475:9;36457:17;:28::i;:::-;36453:42;;;36487:8;;;36453:42;36557:22;36594:19;36643:8;36652:1;36643:11;;;;;;;;:::i;:::-;;;;;;;36626:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;36616:40;;;;;;36594:62;;26300:24;36677:11;:36;36673:1069;;;36752:34;;-1:-1:-1;36673:1069:0;;;26379:22;36812:11;:34;36808:934;;;36885:32;;-1:-1:-1;36808:934:0;;;26467:32;36943:11;:45;36939:803;;;37027:42;;-1:-1:-1;36939:803:0;;;26575:40;37095:11;:55;37091:651;;;37189:50;;-1:-1:-1;37091:651:0;;;26221:22;37265:11;:34;37261:481;;;37338:32;;-1:-1:-1;37261:481:0;;;26681:33;37396:11;:45;37392:350;;;37467:25;37462:40;;37494:8;;;;;37462:40;37551:5;;-1:-1:-1;37593:43:0;;-1:-1:-1;37392:350:0;;;37677:8;;;;;37392:350;37863:36;37883:9;37894:4;37863:19;:36::i;:::-;37979:12;38005:4;-1:-1:-1;;;;;37997:18:0;38039:15;38056:6;38063:1;38056:9;;;;;;;;:::i;:::-;;;;;;;38067;38016:61;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;38016:61:0;;;;;;;;;;;;;;-1:-1:-1;;;;;38016:61:0;-1:-1:-1;;;;;;38016:61:0;;;;;;;;;;37997:81;;;;38016:61;37997:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37978:100;;;38099:7;38095:94;;;38113:19;;38122:9;;38113:19;;;;;38095:94;;;38152:37;38172:9;38183:5;38152:19;:37::i;:::-;36388:1813;;;;36347:1854;36383:3;;;:::i;:::-;;;36347:1854;;;;35540:2668;;;;;;;;;35483:2725;;:::o;40015:240::-;27332:10;27354:4;27332:27;27328:49;;27368:9;;-1:-1:-1;;;27368:9:0;;;;;;;;;;;27328:49;40096:20:::1;::::0;;40153:46:::1;::::0;;::::1;40164:6:::0;40153:46:::1;:::i;:::-;40095:104;;;;;;40212:35;40223:6;40231:7;40240:6;40212:10;:35::i;:::-;40084:171;;;40015:240:::0;;;:::o;32621:304::-;32684:24;32721:18;32742:21;32757:5;32742:14;:21::i;:::-;32721:42;;32798:10;32784:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32784:25:0;;32774:35;;32827:9;32822:96;32842:10;32838:1;:14;32822:96;;;32887:19;32897:5;32904:1;32887:9;:19::i;:::-;32874:7;32882:1;32874:10;;;;;;;;:::i;:::-;-1:-1:-1;;;;;32874:32:0;;;:10;;;;;;;;;;;:32;32854:3;;;:::i;:::-;;;32822:96;;;;32710:215;32621:304;;;:::o;29898:615::-;30163:10;30186:11;30200:117;30238:9;30249:11;;30200:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30200:117:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30262:13:0;;-1:-1:-1;30262:13:0;;;;30200:117;;30262:13;;;;30200:117;;;;;;;;;-1:-1:-1;;30200:117:0;;;;;;;;;;;;;;;;;;;;;;30277:10;;-1:-1:-1;30289:11:0;;-1:-1:-1;30200:117:0;30302:6;;;;;;30200:117;;30302:6;;;;30200:117;;;;;;;;;-1:-1:-1;30310:6:0;;-1:-1:-1;30200:37:0;;-1:-1:-1;;30200:117:0:i;:::-;16431:4;16455:17;;;:12;:17;;;;;;;;;-1:-1:-1;16455:17:0;-1:-1:-1;30359:147:0;;;;30435:5;17141:17;;;:12;:17;;;;;:25;;-1:-1:-1;;17141:25:0;;;30456:38;30467:6;;30456:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30475:10:0;;-1:-1:-1;30487:6:0;;-1:-1:-1;30456:10:0;;-1:-1:-1;30456:38:0:i;:::-;30175:338;29898:615;;;;;;;;;;;:::o;27828:290::-;28092:7;;28082:18;;;;;;;:::i;:::-;;;;;;;;28024:10;-1:-1:-1;;;;;28011:99:0;;28036:16;;28054:26;;28102:7;;28011:99;;;;;;;;;;;:::i;:::-;;;;;;;;27828:290;;;;;;:::o;30795:149::-;30871:7;30898:38;30906:29;30928:6;30906:21;:29::i;30898:38::-;30891:45;30795:149;-1:-1:-1;;30795:149:0:o;27487:333::-;27679:42;27694:10;27706:6;;27679:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27714:6:0;;-1:-1:-1;27679:14:0;;-1:-1:-1;;27679:42:0:i;:::-;27747:10;-1:-1:-1;;;;;27737:75:0;;27759:16;;27777:18;;27797:6;;27805;27737:75;;;;;;;;;;;;:::i;:::-;;;;;;;;27487:333;;;;;;;:::o;32233:102::-;32287:7;32314:13;18262:24;21341:7;15991:17;;;;;;;;32233:102;32314:13;32307:20;;32233:102;:::o;40263:1100::-;27332:10;27354:4;27332:27;27328:49;;27368:9;;-1:-1:-1;;;27368:9:0;;;;;;;;;;;27328:49;40344:20:::1;::::0;40382:37:::1;::::0;;::::1;40393:6:::0;40382:37:::1;:::i;:::-;40343:76;;;;40432:20;40455:22;40470:6;40455:14;:22::i;:::-;40432:45:::0;-1:-1:-1;;;;;;40494:26:0;::::1;40490:64;;40547:6;40529:25;;-1:-1:-1::0;;;40529:25:0::1;;;;;;;;:::i;:::-;;;;;;;;40490:64;40596:18;40571:21;40585:6;40571:13;:21::i;:::-;:43;;;;;;;;:::i;:::-;;40567:789;;;40631:29;40689:4;40663:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;40892:55:0::1;::::0;;;;-1:-1:-1;;;;;40756:22:0;;::::1;40892:55;::::0;::::1;4886:74:1::0;;;40631:66:0;;-1:-1:-1;40715:12:0::1;::::0;;;40756:22;;::::1;::::0;40797:12;;-1:-1:-1;;;40851:24:0;40885:4:::1;::::0;40892:30;::::1;::::0;::::1;::::0;4859:18:1;;40892:55:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40828:120;::::0;-1:-1:-1;;;;;25692:55:1;;;40828:120:0::1;::::0;::::1;25674:74:1::0;25764:18;;;25757:34;25647:18;;40828:120:0::1;::::0;;-1:-1:-1;;40828:120:0;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;40828:120:0::1;-1:-1:-1::0;;;;;;40828:120:0;;::::1;;::::0;;40756:207;::::1;::::0;;;;;;;;::::1;::::0;;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;40756:207:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;40714:249;;;;40985:7;40984:8;:80;;;-1:-1:-1::0;40997:17:0;;:31;;::::1;::::0;:66:::1;;;41044:10;41033:30;;;;;;;;;;;;:::i;:::-;41032:31;40997:66;40980:111;;;41084:6;41073:18;;-1:-1:-1::0;;;41073:18:0::1;;;;;;;;:::i;40980:111::-;41221:37;::::0;;;;41252:4:::1;41221:37;::::0;::::1;4886:74:1::0;-1:-1:-1;;;;;41221:22:0;::::1;::::0;::::1;::::0;4859:18:1;;41221:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;40616:654;;;40567:789;;;41291:53;::::0;-1:-1:-1;;;41291:53:0;;::::1;::::0;::::1;6574:25:1::0;;;-1:-1:-1;;;;;41291:47:0;::::1;::::0;::::1;::::0;6547:18:1;;41291:53:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;40332:1031;;;40263:1100:::0;;;:::o;42044:930::-;27332:10;27354:4;27332:27;27328:49;;27368:9;;-1:-1:-1;;;27368:9:0;;;;;;;;;;;27328:49;42167:25:::1;::::0;;;;;;;42458:89:::1;::::0;;::::1;42469:6:::0;42458:89:::1;:::i;:::-;42152:395;;;;;;;;;;;;;;;;42560:117;42593:9;42604:11;42617:13;42632:15;42649:11;42662:6;42670;42560:32;:117::i;:::-;42844:11;42814:15;-1:-1:-1::0;;;;;42693:273:0::1;42736:9;42693:273;42760:11;42786:13;42870:6;42891;42912:12;42939:16;42693:273;;;;;;;;;;;:::i;:::-;;;;;;;;42141:833;;;;;;;;42044:930:::0;;;:::o;29479:411::-;29679:10;29702:11;29716:93;29746:9;29757:11;;29716:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29716:93:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29770:13:0;;-1:-1:-1;29770:13:0;;;;29716:93;;29770:13;;;;29716:93;;;;;;;;;-1:-1:-1;29785:10:0;;-1:-1:-1;29797:11:0;;-1:-1:-1;29716:29:0;;-1:-1:-1;29716:93:0:i;:::-;16431:4;16455:17;;;:12;:17;;;;;;;;;-1:-1:-1;16455:17:0;-1:-1:-1;29851:31:0;;;;29876:5;17141:17;;;:12;:17;;;;;:25;;-1:-1:-1;;17141:25:0;;;29862:20;29691:199;29479:411;;;;;;;;:::o;33016:499::-;18912:18;18933:13;18262:24;21341:7;15991:17;;;;;;;;32233:102;18933:13;18912:34;;18964:32;18973:10;18985;18964:8;:32::i;:::-;18959:56;;19005:10;;-1:-1:-1;;;19005:10:0;;;;;;;;;;;18959:56;19028:13;19054:8;;19044:19;;;;;;;:::i;:::-;;;;;;;;19028:35;;19158:40;19168:10;19180:5;19187:10;19158:9;:40::i;:::-;19154:67;;;19207:14;;-1:-1:-1;;;19207:14:0;;;;;;;;;;;19154:67;19234:49;19247:10;19259:5;19266:10;19278:4;19234:12;:49::i;:::-;19352:22;19420:1;19377:32;19391:10;19403:5;19377:13;:32::i;:::-;:45;;;;:::i;:::-;19352:70;;19433:48;19447:10;19459:5;19466:14;19433:13;:48::i;:::-;19590:30;19609:10;19590:18;:30::i;:::-;19573:14;:47;19569:60;;;19622:7;;;;;19569:60;33141:31;;::::1;33137:72;;33181:28;;;;;;;;;;;;;;33137:72;33227:9;33222:286;33242:18:::0;;::::1;33222:286;;;33282:20;33305:7;;33313:1;33305:10;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;33282:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;33282:33:0;;-1:-1:-1;33346:6:0;;-1:-1:-1;33346:6:0;;-1:-1:-1;33353:1:0;;-1:-1:-1;33346:9:0;;::::1;;;;;:::i;:::-;;;;;;;33330:25;;33410:1;-1:-1:-1::0;;;;;33376:36:0::1;:22;33391:6;33376:14;:22::i;:::-;-1:-1:-1::0;;;;;33376:36:0::1;;33372:74;;;33439:6;33421:25;;-1:-1:-1::0;;;33421:25:0::1;;;;;;;;:::i;33372:74::-;33463:33;33482:6;33490:5;33463:18;:33::i;:::-;33267:241;;33262:3;;;;;:::i;:::-;;;;33222:286;;;;19704:44:::0;19718:10;19730:5;19745:1;19704:13;:44::i;:::-;19761:18;19782:26;19797:10;19782:14;:26::i;:::-;19761:47;;19826:9;19821:128;19841:10;19837:1;:14;19821:128;;;19873:64;19886:10;19898:5;19905:24;19915:10;19927:1;19905:9;:24::i;:::-;19931:5;19873:12;:64::i;:::-;19853:3;;;:::i;:::-;;;19821:128;;;;18901:1055;;;;33016:499;;;;;:::o;38296:1711::-;27332:10;27354:4;27332:27;27328:49;;27368:9;;-1:-1:-1;;;27368:9:0;;;;;;;;;;;27328:49;38379:18:::1;::::0;;;;;38493:107:::1;::::0;;::::1;38518:6:::0;38493:107:::1;:::i;:::-;38378:222;;;;;;;;;;;;38707:1;-1:-1:-1::0;;;;;38673:36:0::1;:22;38688:6;38673:14;:22::i;:::-;-1:-1:-1::0;;;;;38673:36:0::1;;38669:75;;38737:6;38718:26;;;;;;;;;;;:::i;38669:75::-;-1:-1:-1::0;;;;;38761:26:0;::::1;38757:1091;;38892:12;38934:6;38917:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;38907:35;;;;;;38892:50;;39024:12;39038:17:::0;39059:29:::1;-1:-1:-1::0;;;;;39059:42:0::1;39143:35;;;39180:4;39186:6;39194:8;39204:3;39209:4;39120:94;;;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;39120:94:0;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;39120:94:0::1;-1:-1:-1::0;;;;;;39120:94:0;;::::1;::::0;;;::::1;::::0;;;39059:170;;::::1;::::0;39120:94;39059:170:::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39023:206;;;;39251:7;39246:46;;39285:6;39267:25;;;;;;;;;;;:::i;39246:46::-;39335:4;39324:27;;;;;;;;;;;;:::i;:::-;39309:42;;39368:53;39382:6;39390:30;39368:13;:53::i;:::-;38789:644;;;38757:1091;;;-1:-1:-1::0;;;;;39562:24:0;::::1;;39558:90;;39609:39;::::0;::::1;::::0;;-1:-1:-1;;;;;4904:55:1;;39609:39:0::1;::::0;::::1;4886:74:1::0;4859:18;;39609:39:0::1;4740:226:1::0;39558:90:0::1;39795:41;39809:6;39817:18;39795:13;:41::i;:::-;39860:38;39877:6;39885:12;39860:16;:38::i;:::-;39909:37;39928:6;39936:9;39909:18;:37::i;:::-;39964:35;39978:6;39986:12;39964:35;;;;;;;:::i;:::-;;;;;;;;38367:1640;;;;;;38296:1711:::0;;;:::o;32411:131::-;32482:7;32509:25;32528:5;32509:18;:25::i;31590:150::-;31666:7;31693:39;31704:27;31724:6;31704:19;:27::i;42982:231::-;27332:10;27354:4;27332:27;27328:49;;27368:9;;-1:-1:-1;;;27368:9:0;;;;;;;;;;;27328:49;43083:63:::1;::::0;-1:-1:-1;;;43083:63:0;;-1:-1:-1;;;;;43095:11:0::1;43083:45;::::0;::::1;::::0;:63:::1;::::0;43129:16;;;;43083:63:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;43164:41;43188:16;;43164:41;;;;;;;:::i;:::-;;;;;;;;42982:231:::0;;;:::o;16024:113::-;16110:19;;;;:14;:19;;;;;16103:26;;16077:13;;16110:19;16103:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16024:113;;;:::o;34607:868::-;34787:1;34759:16;25380:66;31517:7;16226:20;:15;:20;;;;-1:-1:-1;;;;;16226:20:0;;32233:102;34759:16;-1:-1:-1;;;;;34759:30:0;;34755:53;;;34798:10;;;;;;;;;;;;;;34755:53;34822:31;;;34915:84;;;;34940:6;34915:84;:::i;:::-;34821:178;;;;;;35107:21;35155:1;35131:13;18262:24;21341:7;15991:17;;;;;;;;32233:102;35131:13;:26;;;;:::i;:::-;35107:50;;35168:29;35183:13;18262:24;16693:12;:17;;;;;;:25;22492:109;35168:29;35208:60;35219:13;35234:14;35250:17;35208:10;:60::i;:::-;35285:23;;:28;35281:187;;35330:63;;-1:-1:-1;;;35330:63:0;;-1:-1:-1;;;;;35342:11:0;35330:45;;;;:63;;35376:16;;35330:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35415:41;35439:16;35415:41;;;;;;:::i;:::-;;;;;;;;34663:812;;;;34607:868;;:::o;33523:917::-;18912:18;18933:13;18262:24;21341:7;15991:17;;;;;;;;32233:102;18933:13;18912:34;;18964:32;18973:10;18985;18964:8;:32::i;:::-;18959:56;;19005:10;;-1:-1:-1;;;19005:10:0;;;;;;;;;;;18959:56;19028:13;19054:8;;19044:19;;;;;;;:::i;:::-;;;;;;;;19028:35;;19158:40;19168:10;19180:5;19187:10;19158:9;:40::i;:::-;19154:67;;;19207:14;;-1:-1:-1;;;19207:14:0;;;;;;;;;;;19154:67;19234:49;19247:10;19259:5;19266:10;19278:4;19234:12;:49::i;:::-;19352:22;19420:1;19377:32;19391:10;19403:5;19377:13;:32::i;:::-;:45;;;;:::i;:::-;19352:70;;19433:48;19447:10;19459:5;19466:14;19433:13;:48::i;:::-;19590:30;19609:10;19590:18;:30::i;:::-;19573:14;:47;19569:60;;;19622:7;;;;;19569:60;33736:17:::1;-1:-1:-1::0;;;;;33736:26:0::1;;33707:25;:55;33703:85;;33771:17;;;;;;;;;;;;;;33703:85;33806:27;::::0;-1:-1:-1;;;;;33806:27:0;::::1;::::0;::::1;::::0;;;::::1;34099:23:::0;;34095:288:::1;;34204:12;34222:17;-1:-1:-1::0;;;;;34222:30:0::1;34276:29;;;34307:11;;34253:66;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;34253:66:0;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;34253:66:0::1;-1:-1:-1::0;;;;;;34253:66:0;;::::1;::::0;;;::::1;::::0;;;34222:98;;::::1;::::0;34253:66;34222:98:::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34203:117;;;34342:7;34337:34;;34358:13;;;;;;;;;;;;;;34337:34;34124:259;34095:288;34395:37;34414:17;25380:66:::0;16920:20;;:15;:20;;;:28;;-1:-1:-1;;16920:28:0;-1:-1:-1;;;;;16920:28:0;;;;;22492:109;;34395:37:::1;19704:44:::0;19718:10;19730:5;19745:1;19704:13;:44::i;:::-;19761:18;19782:26;19797:10;19782:14;:26::i;:::-;19761:47;;19826:9;19821:128;19841:10;19837:1;:14;19821:128;;;19873:64;19886:10;19898:5;19905:24;19915:10;19927:1;19905:9;:24::i;19873:64::-;19853:3;;;:::i;:::-;;;19821:128;;28126:435;28371:42;28386:10;28398:6;;28371:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28406:6:0;;-1:-1:-1;28371:14:0;;-1:-1:-1;;28371:42:0:i;:::-;28519:7;;28509:18;;;;;;;:::i;:::-;;;;;;;;28451:10;-1:-1:-1;;;;;28429:124:0;;28463:16;;28481:26;;28529:7;;28538:6;;28546;28429:124;;;;;;;;;;;;;;:::i;:::-;;;;;;;;28126:435;;;;;;;;;:::o;28957:514::-;29263:4;29300:163;29326:122;29364:9;29375:11;;29326:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29388:13;;29326:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29326:122:0;;;;;;;;;;;;;;;;;;;;;;29403:15;;-1:-1:-1;29420:11:0;;-1:-1:-1;29326:122:0;29433:6;;;;;;29326:122;;29433:6;;;;29326:122;;;;;;;;;-1:-1:-1;29441:6:0;;-1:-1:-1;29326:37:0;;-1:-1:-1;;29326:122:0:i;29300:163::-;29280:183;28957:514;-1:-1:-1;;;;;;;;;;;28957:514:0:o;16262:110::-;16346:18;;;;:13;:18;;;;;16339:25;;16314:12;;16346:18;16339:25;;;:::i;30952:233::-;31029:7;31111:66;31119:57;31142:6;31150:25;31168:7;31150:15;:25;:::i;:::-;31119:22;:57::i;32025:152::-;32101:4;32125:44;32133:35;32158:9;32133:24;:35::i;28569:380::-;28810:4;28834:107;28842:98;28872:9;28883:11;;28842:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28842:98:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28896:13:0;;-1:-1:-1;28896:13:0;;;;28842:98;;28896:13;;;;28842:98;;;;;;;;;-1:-1:-1;28911:15:0;;-1:-1:-1;28928:11:0;;-1:-1:-1;28842:29:0;;-1:-1:-1;28842:98:0:i;28834:107::-;28827:114;28569:380;-1:-1:-1;;;;;;;;28569:380:0:o;41371:665::-;27332:10;27354:4;27332:27;27328:49;;27368:9;;-1:-1:-1;;;27368:9:0;;;;;;;;;;;27328:49;41486:25:::1;::::0;;;;;41713:72:::1;::::0;;::::1;41724:6:::0;41713:72:::1;:::i;:::-;41471:314;;;;;;;;;;;;41798:93;41823:9;41834:11;41847:13;41862:15;41879:11;41798:24;:93::i;:::-;41984:11;41967:15;-1:-1:-1::0;;;;;41907:121:0::1;41928:9;41907:121;41939:11;41952:13;41997:12;42011:16;41907:121;;;;;;;;;:::i;:::-;;;;;;;;41460:576;;;;;;41371:665:::0;;;:::o;14088:269::-;14290:58;;36300:66:1;14290:58:0;;;36288:79:1;36383:12;;;36376:28;;;14157:7:0;;36420:12:1;;14290:58:0;;;;;;;;;;;;;14280:69;;;;;;14273:76;;14088:269;;;:::o;49321:146::-;49404:55;49413:35;49438:9;49413:24;:35::i;:::-;17141:17;;;;:12;:17;;;;;:25;;-1:-1:-1;;17141:25:0;;;;;;;17078:96;49404:55;49321:146;;:::o;43704:685::-;43833:20;43856:22;43871:6;43856:14;:22::i;:::-;43833:45;-1:-1:-1;;;;;;43895:26:0;;43891:64;;43948:6;43930:25;;-1:-1:-1;;;43930:25:0;;;;;;;;:::i;43891:64::-;43968:61;43988:6;44022;43996:23;44012:6;43996:15;:23::i;:::-;:32;;;;:::i;:::-;43968:19;:61::i;:::-;44071:18;44046:21;44060:6;44046:13;:21::i;:::-;:43;;;;;;;;:::i;:::-;;44042:340;;;44151:65;;-1:-1:-1;;;;;25692:55:1;;44151:65:0;;;25674:74:1;25764:18;;;25757:34;;;44106:12:0;;44121:96;;44137:12;;-1:-1:-1;;;44174:24:0;25647:18:1;;44151:65:0;;;;-1:-1:-1;;44151:65:0;;;;;;;;;;;;;;-1:-1:-1;;;;;44151:65:0;-1:-1:-1;;;;;;44151:65:0;;;;;;;;;;44121:15;:96::i;:::-;44106:111;;44239:7;44234:39;;44266:6;44255:18;;;;;;;;;;;:::i;44234:39::-;44091:194;44042:340;;;44306:64;;;;;-1:-1:-1;;;;;25692:55:1;;;44306:64:0;;;25674:74:1;25764:18;;;25757:34;;;44306:47:0;;;;;25647:18:1;;44306:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43822:567;43704:685;;;:::o;21571:140::-;21638:7;21665:38;21673:29;21691:10;21673:17;:29::i;21408:155::-;21485:7;21512:43;21523:31;21536:10;21548:5;21523:12;:31::i;21512:43::-;21505:50;21408:155;-1:-1:-1;;;21408:155:0:o;47396:713::-;47695:7;25941:45;47858:9;47890:11;47924:13;47960:15;47998:11;48032:6;48061;47763:323;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47735:366;;;;;;47715:386;;47396:713;;;;;;;;;:::o;46018:171::-;46094:7;26045:29;46173:6;46131:49;;;;;;;;;:::i;44397:1527::-;44529:20;44552:22;44567:6;44552:14;:22::i;:::-;44529:45;-1:-1:-1;;;;;;44591:26:0;;44587:64;;44644:6;44626:25;;-1:-1:-1;;;44626:25:0;;;;;;;;:::i;44587:64::-;44666:11;44662:39;;44686:15;;;;;;;;;;;;;;44662:39;44714:19;44736:21;44750:6;44736:13;:21::i;:::-;44714:43;-1:-1:-1;44768:16:0;44814:18;44801:9;:31;;;;;;;;:::i;:::-;;44797:324;;;44928:83;;-1:-1:-1;;;;;38058:15:1;;44928:83:0;;;38040:34:1;44997:4:0;38090:18:1;;;38083:43;38142:18;;;38135:34;;;44863:163:0;;44897:12;;-1:-1:-1;;;44951:28:0;37952:18:1;;44928:83:0;37777:398:1;44863:163:0;44849:177;;45048:11;45043:43;;45079:6;45068:18;;-1:-1:-1;;;45068:18:0;;;;;;;;:::i;44797:324::-;45150:30;45137:9;:43;;;;;;;;:::i;:::-;;45133:339;;;45276:86;;-1:-1:-1;;;;;25692:55:1;;45276:86:0;;;25674:74:1;25764:18;;;25757:34;;;45211:166:0;;45245:12;;45299:46;;25647:18:1;;45276:86:0;25500:297:1;45133:339:0;45668:69;;;;;45734:1;45668:69;;;6574:25:1;45498:290:0;;45528:12;;-1:-1:-1;;;45596:28:0;45643:6;;-1:-1:-1;;;;;45668:57:0;;;;;6547:18:1;;45668:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45555:222;;-1:-1:-1;;;;;38058:15:1;;;45555:222:0;;;38040:34:1;38110:15;;38090:18;;;38083:43;38142:18;;;38135:34;;;37952:18;;45555:222:0;37777:398:1;45498:290:0;45484:304;;45806:11;45801:43;;45837:6;45826:18;;-1:-1:-1;;;45826:18:0;;;;;;;;:::i;45801:43::-;45857:59;;-1:-1:-1;;;45857:59:0;;45913:1;45857:59;;;6574:25:1;-1:-1:-1;;;;;45857:47:0;;;;;6547:18:1;;45857:59:0;6428:177:1;48203:149:0;48271:9;48310:33;48318:24;48335:6;48318:16;:24::i;48310:33::-;48300:44;;;;;;;;:::i;49832:474::-;50123:175;50146:122;50184:9;50195:11;50208:13;50223:15;50240:11;50253:6;50261;50146:37;:122::i;:::-;17141:17;;;;:12;:17;;;;;:25;;-1:-1:-1;;17141:25:0;50283:4;17141:25;;;17078:96;50123:175;49832:474;;;;;;;:::o;46997:391::-;47232:7;25831:35;47311:9;47322:11;47335:13;47350:15;47367:11;47269:110;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47259:121;;;;;;47252:128;;46997:391;;;;;;;:::o;22271:154::-;22349:4;22373:44;22381:35;22396:10;22408:7;22381:14;:35::i;22049:214::-;20963:64;;;18662:24;20963:64;;;;41222:19:1;;;;41257:12;;;41250:28;;;41294:12;;;;41287:28;;;41349:15;;;-1:-1:-1;;41345:53:1;41331:12;;;41324:75;20963:64:0;;;;;;;;;41415:13:1;;;;20963:64:0;;;20953:75;;;;;-1:-1:-1;;22201:54:0;;22209:45;20790:246;22201:54;22194:61;22049:214;-1:-1:-1;;;;22049:214:0:o;24324:219::-;20963:64;;;18662:24;20963:64;;;;41222:19:1;;;;41257:12;;;41250:28;;;41294:12;;;;41287:28;;;41349:15;;;-1:-1:-1;;41345:53:1;41331:12;;;41324:75;20963:64:0;;;;;;;;;41415:13:1;;;;20963:64:0;;;20953:75;;;;;24473:62;;24482:45;20790:246;21875:166;21956:7;21983:50;21991:41;22014:10;22026:5;21991:22;:41::i;24115:201::-;24246:62;24255:41;24278:10;24290:5;24255:22;:41::i;:::-;24298:9;16693:12;:17;;;;;;;;;;;:25;16627:99;24246:62;24115:201;;;:::o;21719:148::-;21790:7;21817:42;21825:33;21847:10;21825:21;:33::i;48446:193::-;48531:46;48540:29;48562:6;48540:21;:29::i;48531:46::-;48595:36;48617:6;48625:5;48595:36;;;;;;;:::i;:::-;;;;;;;;48446:193;;:::o;49005:148::-;49091:54;49100:24;49117:6;49100:16;:24::i;:::-;49134:9;49126:18;;;;;;;;:::i;:::-;16693:12;:17;;;;;;;;;;;:25;16627:99;49161:152;49251:54;49263:27;49283:6;49263:19;:27::i;:::-;16920:20;;;;:15;:20;;;;;:28;;-1:-1:-1;;16920:28:0;-1:-1:-1;;;;;16920:28:0;;;;;16851:105;46641:166;46715:7;25664:26;46791:6;46752:46;;;;;;;;;:::i;22556:37::-;22492:109;:::o;22954:986::-;23116:15;;23148:23;;;23144:51;;;23180:15;;-1:-1:-1;;;23180:15:0;;;;;;;;;;;23144:51;23212:23;23208:59;;23244:23;;;;;;;;;;;;;;23208:59;23280:41;23299:10;23311:9;23280:18;:41::i;:::-;23332:39;23347:10;23359:11;23332:14;:39::i;:::-;23389:9;23384:549;23404:11;23400:1;:15;23384:549;;;23437:15;23455:8;23464:1;23455:11;;;;;;;;:::i;:::-;;;;;;;23437:29;;23573;23582:10;23594:7;23573:8;:29::i;:::-;23569:65;;;23611:23;;;;;-1:-1:-1;;;;;4904:55:1;;23611:23:0;;;4886:74:1;4859:18;;23611:23:0;4740:226:1;23569:65:0;-1:-1:-1;;;;;23655:21:0;;23651:49;;23685:15;;-1:-1:-1;;;23685:15:0;;;;;;;;;;;23651:49;23835:33;23845:10;23857:1;23860:7;23835:9;:33::i;:::-;23883:38;23895:10;23907:7;23916:4;23883:11;:38::i;:::-;-1:-1:-1;23417:3:0;;;:::i;:::-;;;23384:549;;;;23083:857;22954:986;;;:::o;46197:268::-;46287:7;26134:30;46444:6;46452:3;46407:49;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46397:60;;;;;;46390:67;;46197:268;;;;:::o;46815:174::-;46928:52;;;25579:29;46928:52;;;39981:19:1;40016:12;;;40009:28;;;46891:7:0;;40053:12:1;;46928:52:0;39824:247:1;49475:349:0;49702:114;49711:98;49741:9;49752:11;49765:13;49780:15;49797:11;49711:29;:98::i;48647:350::-;48734:13;48750:22;48765:6;48750:14;:22::i;:::-;48734:38;;48795:1;48787:5;:9;:27;;;;;48809:5;48800:6;:14;48787:27;48783:63;;;48839:6;48823:23;;;;;;;;;;;:::i;48783:63::-;48914:75;48923:57;48946:6;48954:25;48972:7;48954:15;:25;:::i;48923:57::-;48982:6;16693:12;:17;;;;;;;;;;;:25;16627:99;43307:389;43395:4;-1:-1:-1;;;;;43416:24:0;;;43412:47;;-1:-1:-1;43454:5:0;43447:12;;43412:47;43533:12;43547:23;43574:12;-1:-1:-1;;;;;43574:17:0;43592:8;43574:27;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43532:69;;;;43619:7;:69;;;;-1:-1:-1;43631:17:0;;:22;;:56;;;43668:10;43657:30;;;;;;;;;;;;:::i;:::-;43612:76;43307:389;-1:-1:-1;;;;;43307:389:0:o;20233:164::-;20340:48;;;18408:24;20340:48;;;39981:19:1;40016:12;;;40009:28;;;20303:7:0;;40053:12:1;;20340:48:0;39824:247:1;20050:175:0;20167:49;;;18336:18;20167:49;;;40513:19:1;40548:12;;;40541:28;;;40585:12;;;40578:28;;;20130:7:0;;40622:12:1;;20167:49:0;40328:312:1;46473:160:0;46544:7;25743:23;46617:6;46581:43;;;;;;;;;:::i;21044:184::-;21165:54;;;18737:21;21165:54;;;40830:19:1;40865:12;;;40858:28;;;40924:2;40920:15;;;-1:-1:-1;;40916:53:1;40902:12;;;40895:75;-1:-1:-1;;40986:12:1;;21165:54:0;40645:359:1;20585:197:0;20712:61;;;18578:30;20712:61;;;40513:19:1;40548:12;;;40541:28;;;40585:12;;;40578:28;;;20675:7:0;;40622:12:1;;20712:61:0;40328:312:1;20405:172:0;20516:52;;;18490:28;20516:52;;;39981:19:1;40016:12;;;40009:28;;;20479:7:0;;40053:12:1;;20516:52:0;39824:247:1;23948:159:0;24040:59;24049:33;24071:10;24049:21;:33::i;22803:143::-;22887:51;22896:29;22914:10;22896:17;:29::i;22609:186::-;22734:53;22746:31;22759:10;22771:5;22746:12;:31::i;24551:188::-;24677:54;24686:35;24701:10;24713:7;24686:14;:35::i;-1:-1:-1:-;;;;;;;;:::o;14:347:1:-;65:8;75:6;129:3;122:4;114:6;110:17;106:27;96:55;;147:1;144;137:12;96:55;-1:-1:-1;170:20:1;;213:18;202:30;;199:50;;;245:1;242;235:12;199:50;282:4;274:6;270:17;258:29;;334:3;327:4;318:6;310;306:19;302:30;299:39;296:59;;;351:1;348;341:12;296:59;14:347;;;;;:::o;366:409::-;436:6;444;497:2;485:9;476:7;472:23;468:32;465:52;;;513:1;510;503:12;465:52;553:9;540:23;586:18;578:6;575:30;572:50;;;618:1;615;608:12;572:50;657:58;707:7;698:6;687:9;683:22;657:58;:::i;:::-;734:8;;631:84;;-1:-1:-1;366:409:1;-1:-1:-1;;;;366:409:1:o;780:477::-;859:6;867;875;928:2;916:9;907:7;903:23;899:32;896:52;;;944:1;941;934:12;896:52;984:9;971:23;1017:18;1009:6;1006:30;1003:50;;;1049:1;1046;1039:12;1003:50;1088:58;1138:7;1129:6;1118:9;1114:22;1088:58;:::i;:::-;1165:8;;1062:84;;-1:-1:-1;1247:2:1;1232:18;;;;1219:32;;780:477;-1:-1:-1;;;;780:477:1:o;1262:180::-;1321:6;1374:2;1362:9;1353:7;1349:23;1345:32;1342:52;;;1390:1;1387;1380:12;1342:52;-1:-1:-1;1413:23:1;;1262:180;-1:-1:-1;1262:180:1:o;1447:681::-;1618:2;1670:21;;;1740:13;;1643:18;;;1762:22;;;1589:4;;1618:2;1841:15;;;;1815:2;1800:18;;;1589:4;1884:218;1898:6;1895:1;1892:13;1884:218;;;1963:13;;-1:-1:-1;;;;;1959:62:1;1947:75;;2077:15;;;;2042:12;;;;1920:1;1913:9;1884:218;;;-1:-1:-1;2119:3:1;;1447:681;-1:-1:-1;;;;;;1447:681:1:o;2133:1214::-;2273:6;2281;2289;2297;2305;2313;2321;2329;2337;2390:3;2378:9;2369:7;2365:23;2361:33;2358:53;;;2407:1;2404;2397:12;2358:53;2443:9;2430:23;2420:33;;2504:2;2493:9;2489:18;2476:32;2527:18;2568:2;2560:6;2557:14;2554:34;;;2584:1;2581;2574:12;2554:34;2623:58;2673:7;2664:6;2653:9;2649:22;2623:58;:::i;:::-;2700:8;;-1:-1:-1;2597:84:1;-1:-1:-1;2788:2:1;2773:18;;2760:32;;-1:-1:-1;2804:16:1;;;2801:36;;;2833:1;2830;2823:12;2801:36;2872:60;2924:7;2913:8;2902:9;2898:24;2872:60;:::i;:::-;2951:8;;-1:-1:-1;2846:86:1;-1:-1:-1;3033:2:1;3018:18;;3005:32;;-1:-1:-1;3090:3:1;3075:19;;3062:33;;-1:-1:-1;3107:16:1;;;3104:36;;;3136:1;3133;3126:12;3104:36;;3175:60;3227:7;3216:8;3205:9;3201:24;3175:60;:::i;:::-;2133:1214;;;;-1:-1:-1;2133:1214:1;;;;;;;;3254:8;3336:3;3321:19;3308:33;;2133:1214;-1:-1:-1;;;;2133:1214:1:o;3544:1006::-;3656:6;3664;3672;3680;3688;3696;3749:2;3737:9;3728:7;3724:23;3720:32;3717:52;;;3765:1;3762;3755:12;3717:52;3805:9;3792:23;3834:18;3875:2;3867:6;3864:14;3861:34;;;3891:1;3888;3881:12;3861:34;3930:58;3980:7;3971:6;3960:9;3956:22;3930:58;:::i;:::-;4007:8;;-1:-1:-1;3904:84:1;-1:-1:-1;4095:2:1;4080:18;;4067:32;;-1:-1:-1;4111:16:1;;;4108:36;;;4140:1;4137;4130:12;4108:36;4179:60;4231:7;4220:8;4209:9;4205:24;4179:60;:::i;:::-;4258:8;;-1:-1:-1;4153:86:1;-1:-1:-1;4346:2:1;4331:18;;4318:32;;-1:-1:-1;4362:16:1;;;4359:36;;;4391:1;4388;4381:12;4359:36;;4430:60;4482:7;4471:8;4460:9;4456:24;4430:60;:::i;:::-;3544:1006;;;;-1:-1:-1;3544:1006:1;;-1:-1:-1;3544:1006:1;;4509:8;;3544:1006;-1:-1:-1;;;3544:1006:1:o;4971:184::-;-1:-1:-1;;;5020:1:1;5013:88;5120:4;5117:1;5110:15;5144:4;5141:1;5134:15;5160:275;5231:2;5225:9;5296:2;5277:13;;-1:-1:-1;;5273:27:1;5261:40;;5331:18;5316:34;;5352:22;;;5313:62;5310:88;;;5378:18;;:::i;:::-;5414:2;5407:22;5160:275;;-1:-1:-1;5160:275:1:o;5440:187::-;5489:4;5522:18;5514:6;5511:30;5508:56;;;5544:18;;:::i;:::-;-1:-1:-1;5610:2:1;5589:15;-1:-1:-1;;5585:29:1;5616:4;5581:40;;5440:187::o;5632:464::-;5675:5;5728:3;5721:4;5713:6;5709:17;5705:27;5695:55;;5746:1;5743;5736:12;5695:55;5782:6;5769:20;5813:49;5829:32;5858:2;5829:32;:::i;:::-;5813:49;:::i;:::-;5887:2;5878:7;5871:19;5933:3;5926:4;5921:2;5913:6;5909:15;5905:26;5902:35;5899:55;;;5950:1;5947;5940:12;5899:55;6015:2;6008:4;6000:6;5996:17;5989:4;5980:7;5976:18;5963:55;6063:1;6038:16;;;6056:4;6034:27;6027:38;;;;6042:7;5632:464;-1:-1:-1;;;5632:464:1:o;6101:322::-;6170:6;6223:2;6211:9;6202:7;6198:23;6194:32;6191:52;;;6239:1;6236;6229:12;6191:52;6279:9;6266:23;6312:18;6304:6;6301:30;6298:50;;;6344:1;6341;6334:12;6298:50;6367;6409:7;6400:6;6389:9;6385:22;6367:50;:::i;6610:1076::-;6732:6;6740;6748;6756;6764;6772;6780;6833:3;6821:9;6812:7;6808:23;6804:33;6801:53;;;6850:1;6847;6840:12;6801:53;6890:9;6877:23;6919:18;6960:2;6952:6;6949:14;6946:34;;;6976:1;6973;6966:12;6946:34;7015:58;7065:7;7056:6;7045:9;7041:22;7015:58;:::i;:::-;7092:8;;-1:-1:-1;6989:84:1;-1:-1:-1;7180:2:1;7165:18;;7152:32;;-1:-1:-1;7196:16:1;;;7193:36;;;7225:1;7222;7215:12;7193:36;7264:60;7316:7;7305:8;7294:9;7290:24;7264:60;:::i;:::-;7343:8;;-1:-1:-1;7238:86:1;-1:-1:-1;7431:2:1;7416:18;;7403:32;;-1:-1:-1;7447:16:1;;;7444:36;;;7476:1;7473;7466:12;7444:36;;7515:60;7567:7;7556:8;7545:9;7541:24;7515:60;:::i;:::-;6610:1076;;;;-1:-1:-1;6610:1076:1;;;;;;7676:2;7661:18;;;7648:32;;6610:1076;-1:-1:-1;;;;6610:1076:1:o;7691:856::-;7801:6;7809;7817;7825;7833;7841;7894:3;7882:9;7873:7;7869:23;7865:33;7862:53;;;7911:1;7908;7901:12;7862:53;7947:9;7934:23;7924:33;;8008:2;7997:9;7993:18;7980:32;8031:18;8072:2;8064:6;8061:14;8058:34;;;8088:1;8085;8078:12;8058:34;8127:58;8177:7;8168:6;8157:9;8153:22;8127:58;:::i;:::-;8204:8;;-1:-1:-1;8101:84:1;-1:-1:-1;8292:2:1;8277:18;;8264:32;;-1:-1:-1;8308:16:1;;;8305:36;;;8337:1;8334;8327:12;8305:36;;8376:60;8428:7;8417:8;8406:9;8402:24;8376:60;:::i;:::-;7691:856;;;;-1:-1:-1;7691:856:1;;;;;8537:2;8522:18;;;8509:32;;7691:856;-1:-1:-1;;;;7691:856:1:o;8552:375::-;8623:8;8633:6;8687:3;8680:4;8672:6;8668:17;8664:27;8654:55;;8705:1;8702;8695:12;8654:55;-1:-1:-1;8728:20:1;;8771:18;8760:30;;8757:50;;;8803:1;8800;8793:12;8757:50;8840:4;8832:6;8828:17;8816:29;;8900:3;8893:4;8883:6;8880:1;8876:14;8868:6;8864:27;8860:38;8857:47;8854:67;;;8917:1;8914;8907:12;8932:801;9066:6;9074;9082;9090;9143:2;9131:9;9122:7;9118:23;9114:32;9111:52;;;9159:1;9156;9149:12;9111:52;9199:9;9186:23;9228:18;9269:2;9261:6;9258:14;9255:34;;;9285:1;9282;9275:12;9255:34;9324:78;9394:7;9385:6;9374:9;9370:22;9324:78;:::i;:::-;9421:8;;-1:-1:-1;9298:104:1;-1:-1:-1;9509:2:1;9494:18;;9481:32;;-1:-1:-1;9525:16:1;;;9522:36;;;9554:1;9551;9544:12;9522:36;;9593:80;9665:7;9654:8;9643:9;9639:24;9593:80;:::i;:::-;8932:801;;;;-1:-1:-1;9692:8:1;-1:-1:-1;;;;8932:801:1:o;9738:258::-;9810:1;9820:113;9834:6;9831:1;9828:13;9820:113;;;9910:11;;;9904:18;9891:11;;;9884:39;9856:2;9849:10;9820:113;;;9951:6;9948:1;9945:13;9942:48;;;-1:-1:-1;;9986:1:1;9968:16;;9961:27;9738:258::o;10001:::-;10043:3;10081:5;10075:12;10108:6;10103:3;10096:19;10124:63;10180:6;10173:4;10168:3;10164:14;10157:4;10150:5;10146:16;10124:63;:::i;:::-;10241:2;10220:15;-1:-1:-1;;10216:29:1;10207:39;;;;10248:4;10203:50;;10001:258;-1:-1:-1;;10001:258:1:o;10264:220::-;10413:2;10402:9;10395:21;10376:4;10433:45;10474:2;10463:9;10459:18;10451:6;10433:45;:::i;10489:154::-;-1:-1:-1;;;;;10568:5:1;10564:54;10557:5;10554:65;10544:93;;10633:1;10630;10623:12;10648:612;10736:6;10744;10752;10760;10813:2;10801:9;10792:7;10788:23;10784:32;10781:52;;;10829:1;10826;10819:12;10781:52;10868:9;10855:23;10887:31;10912:5;10887:31;:::i;:::-;10937:5;-1:-1:-1;10989:2:1;10974:18;;10961:32;;-1:-1:-1;11044:2:1;11029:18;;11016:32;11071:18;11060:30;;11057:50;;;11103:1;11100;11093:12;11057:50;11142:58;11192:7;11183:6;11172:9;11168:22;11142:58;:::i;11265:1364::-;11407:6;11415;11423;11431;11439;11447;11455;11463;11471;11524:3;11512:9;11503:7;11499:23;11495:33;11492:53;;;11541:1;11538;11531:12;11492:53;11581:9;11568:23;11610:18;11651:2;11643:6;11640:14;11637:34;;;11667:1;11664;11657:12;11637:34;11706:58;11756:7;11747:6;11736:9;11732:22;11706:58;:::i;:::-;11783:8;;-1:-1:-1;11680:84:1;-1:-1:-1;11871:2:1;11856:18;;11843:32;;-1:-1:-1;11887:16:1;;;11884:36;;;11916:1;11913;11906:12;11884:36;11955:60;12007:7;11996:8;11985:9;11981:24;11955:60;:::i;:::-;12034:8;;-1:-1:-1;11929:86:1;-1:-1:-1;12122:2:1;12107:18;;12094:32;;-1:-1:-1;12138:16:1;;;12135:36;;;12167:1;12164;12157:12;12135:36;12206:60;12258:7;12247:8;12236:9;12232:24;12206:60;:::i;:::-;12285:8;;-1:-1:-1;12180:86:1;-1:-1:-1;12373:2:1;12358:18;;12345:32;;-1:-1:-1;12389:16:1;;;12386:36;;;12418:1;12415;12408:12;12386:36;;12457:60;12509:7;12498:8;12487:9;12483:24;12457:60;:::i;:::-;11265:1364;;;;-1:-1:-1;11265:1364:1;;;;;;;;12536:8;12618:3;12603:19;12590:33;;11265:1364;-1:-1:-1;;;;11265:1364:1:o;12634:1350::-;12783:6;12791;12799;12807;12815;12823;12831;12839;12847;12855;12908:3;12896:9;12887:7;12883:23;12879:33;12876:53;;;12925:1;12922;12915:12;12876:53;12961:9;12948:23;12938:33;;13022:2;13011:9;13007:18;12994:32;13045:18;13086:2;13078:6;13075:14;13072:34;;;13102:1;13099;13092:12;13072:34;13141:58;13191:7;13182:6;13171:9;13167:22;13141:58;:::i;:::-;13218:8;;-1:-1:-1;13115:84:1;-1:-1:-1;13306:2:1;13291:18;;13278:32;;-1:-1:-1;13322:16:1;;;13319:36;;;13351:1;13348;13341:12;13319:36;13390:60;13442:7;13431:8;13420:9;13416:24;13390:60;:::i;:::-;13469:8;;-1:-1:-1;13364:86:1;-1:-1:-1;13554:2:1;13539:18;;13526:32;;-1:-1:-1;13567:31:1;13526:32;13567:31;:::i;:::-;13617:5;;-1:-1:-1;13669:3:1;13654:19;;13641:33;;-1:-1:-1;13727:3:1;13712:19;;13699:33;;13744:16;;;13741:36;;;13773:1;13770;13763:12;13741:36;;13812:60;13864:7;13853:8;13842:9;13838:24;13812:60;:::i;:::-;13786:86;;13891:8;13881:18;;;13918:8;13908:18;;;13973:3;13962:9;13958:19;13945:33;13935:43;;12634:1350;;;;;;;;;;;;;:::o;14392:992::-;14511:6;14519;14527;14535;14543;14551;14559;14612:3;14600:9;14591:7;14587:23;14583:33;14580:53;;;14629:1;14626;14619:12;14580:53;14665:9;14652:23;14642:33;;14726:2;14715:9;14711:18;14698:32;14749:18;14790:2;14782:6;14779:14;14776:34;;;14806:1;14803;14796:12;14776:34;14845:58;14895:7;14886:6;14875:9;14871:22;14845:58;:::i;:::-;14922:8;;-1:-1:-1;14819:84:1;-1:-1:-1;15010:2:1;14995:18;;14982:32;;-1:-1:-1;15026:16:1;;;15023:36;;;15055:1;15052;15045:12;15023:36;;15094:60;15146:7;15135:8;15124:9;15120:24;15094:60;:::i;:::-;15173:8;;-1:-1:-1;15068:86:1;-1:-1:-1;;15258:2:1;15243:18;;15230:32;15271:31;15230:32;15271:31;:::i;:::-;15321:5;15311:15;;;15373:3;15362:9;15358:19;15345:33;15335:43;;14392:992;;;;;;;;;;:::o;15389:541::-;15475:6;15483;15536:2;15524:9;15515:7;15511:23;15507:32;15504:52;;;15552:1;15549;15542:12;15504:52;15592:9;15579:23;15621:18;15662:2;15654:6;15651:14;15648:34;;;15678:1;15675;15668:12;15648:34;15701:50;15743:7;15734:6;15723:9;15719:22;15701:50;:::i;:::-;15691:60;;15804:2;15793:9;15789:18;15776:32;15760:48;;15833:2;15823:8;15820:16;15817:36;;;15849:1;15846;15839:12;15817:36;;15872:52;15916:7;15905:8;15894:9;15890:24;15872:52;:::i;:::-;15862:62;;;15389:541;;;;;:::o;15935:289::-;16110:6;16099:9;16092:25;16153:2;16148;16137:9;16133:18;16126:30;16073:4;16173:45;16214:2;16203:9;16199:18;16191:6;16173:45;:::i;16229:164::-;16305:13;;16354;;16347:21;16337:32;;16327:60;;16383:1;16380;16373:12;16327:60;16229:164;;;:::o;16398:202::-;16465:6;16518:2;16506:9;16497:7;16493:23;16489:32;16486:52;;;16534:1;16531;16524:12;16486:52;16557:37;16584:9;16557:37;:::i;16605:183::-;16665:4;16698:18;16690:6;16687:30;16684:56;;;16720:18;;:::i;:::-;-1:-1:-1;16765:1:1;16761:14;16777:4;16757:25;;16605:183::o;16793:309::-;16869:5;16898:53;16914:36;16943:6;16914:36;:::i;16898:53::-;16889:62;;16974:6;16967:5;16960:21;17014:3;17005:6;17000:3;16996:16;16993:25;16990:45;;;17031:1;17028;17021:12;16990:45;17044:52;17089:6;17082:4;17075:5;17071:16;17066:3;17044:52;:::i;17107:1090::-;17171:5;17224:3;17217:4;17209:6;17205:17;17201:27;17191:55;;17242:1;17239;17232:12;17191:55;17271:6;17265:13;17297:4;17321:60;17337:43;17377:2;17337:43;:::i;17321:60::-;17415:15;;;17501:1;17497:10;;;;17485:23;;17481:32;;;17446:12;;;;17525:15;;;17522:35;;;17553:1;17550;17543:12;17522:35;17589:2;17581:6;17577:15;17601:567;17617:6;17612:3;17609:15;17601:567;;;17696:3;17690:10;17732:18;17719:11;17716:35;17713:125;;;17792:1;17821:2;17817;17810:14;17713:125;17861:24;;17920:2;17912:11;;17908:21;-1:-1:-1;17898:119:1;;17971:1;18000:2;17996;17989:14;17898:119;18042:83;18121:3;18115:2;18111;18107:11;18101:18;18096:2;18092;18088:11;18042:83;:::i;:::-;18030:96;;-1:-1:-1;18146:12:1;;;;17634;;17601:567;;18202:236;18255:5;18308:3;18301:4;18293:6;18289:17;18285:27;18275:55;;18326:1;18323;18316:12;18275:55;18348:84;18428:3;18419:6;18413:13;18406:4;18398:6;18394:17;18348:84;:::i;18443:894::-;18506:5;18559:3;18552:4;18544:6;18540:17;18536:27;18526:55;;18577:1;18574;18567:12;18526:55;18606:6;18600:13;18632:4;18656:60;18672:43;18712:2;18672:43;:::i;18656:60::-;18750:15;;;18836:1;18832:10;;;;18820:23;;18816:32;;;18781:12;;;;18860:15;;;18857:35;;;18888:1;18885;18878:12;18857:35;18924:2;18916:6;18912:15;18936:372;18952:6;18947:3;18944:15;18936:372;;;19031:3;19025:10;19067:18;19054:11;19051:35;19048:125;;;19127:1;19156:2;19152;19145:14;19048:125;19198:67;19261:3;19256:2;19242:11;19234:6;19230:24;19226:33;19198:67;:::i;:::-;19186:80;;-1:-1:-1;19286:12:1;;;;18969;;18936:372;;19342:1440;19533:6;19541;19549;19557;19610:3;19598:9;19589:7;19585:23;19581:33;19578:53;;;19627:1;19624;19617:12;19578:53;19656:9;19650:16;19640:26;;19685:2;19731;19720:9;19716:18;19710:25;19754:18;19795:2;19787:6;19784:14;19781:34;;;19811:1;19808;19801:12;19781:34;19849:6;19838:9;19834:22;19824:32;;19894:7;19887:4;19883:2;19879:13;19875:27;19865:55;;19916:1;19913;19906:12;19865:55;19945:2;19939:9;19968:60;19984:43;20024:2;19984:43;:::i;19968:60::-;20062:15;;;20144:1;20140:10;;;;20132:19;;20128:28;;;20093:12;;;;20168:19;;;20165:39;;;20200:1;20197;20190:12;20165:39;20224:11;;;;20244:135;20260:6;20255:3;20252:15;20244:135;;;20326:10;;20314:23;;20277:12;;;;20357;;;;20244:135;;;20449:2;20434:18;;20428:25;20398:5;;-1:-1:-1;20428:25:1;-1:-1:-1;;;20465:16:1;;;20462:36;;;20494:1;20491;20484:12;20462:36;20517:73;20582:7;20571:8;20560:9;20556:24;20517:73;:::i;:::-;20507:83;;20636:2;20625:9;20621:18;20615:25;20599:41;;20665:2;20655:8;20652:16;20649:36;;;20681:1;20678;20671:12;20649:36;;;20704:72;20768:7;20757:8;20746:9;20742:24;20704:72;:::i;:::-;20694:82;;;19342:1440;;;;;;;:::o;20787:184::-;-1:-1:-1;;;20836:1:1;20829:88;20936:4;20933:1;20926:15;20960:4;20957:1;20950:15;20976:276;21107:3;21145:6;21139:13;21161:53;21207:6;21202:3;21195:4;21187:6;21183:17;21161:53;:::i;:::-;21230:16;;;;;20976:276;-1:-1:-1;;20976:276:1:o;21257:289::-;21432:2;21421:9;21414:21;21395:4;21452:45;21493:2;21482:9;21478:18;21470:6;21452:45;:::i;:::-;21444:53;;21533:6;21528:2;21517:9;21513:18;21506:34;21257:289;;;;;:::o;21830:184::-;-1:-1:-1;;;21879:1:1;21872:88;21979:4;21976:1;21969:15;22003:4;22000:1;21993:15;22019:135;22058:3;-1:-1:-1;;22079:17:1;;22076:43;;;22099:18;;:::i;:::-;-1:-1:-1;22146:1:1;22135:13;;22019:135::o;22159:142::-;22235:20;;22264:31;22235:20;22264:31;:::i;22306:533::-;22401:6;22409;22417;22470:2;22458:9;22449:7;22445:23;22441:32;22438:52;;;22486:1;22483;22476:12;22438:52;22526:9;22513:23;22559:18;22551:6;22548:30;22545:50;;;22591:1;22588;22581:12;22545:50;22614;22656:7;22647:6;22636:9;22632:22;22614:50;:::i;:::-;22604:60;;;22714:2;22703:9;22699:18;22686:32;22727:31;22752:5;22727:31;:::i;:::-;22306:533;;22777:5;;-1:-1:-1;;;22829:2:1;22814:18;;;;22801:32;;22306:533::o;22844:271::-;23027:6;23019;23014:3;23001:33;22983:3;23053:16;;23078:13;;;23053:16;22844:271;-1:-1:-1;22844:271:1:o;23120:267::-;23209:6;23204:3;23197:19;23261:6;23254:5;23247:4;23242:3;23238:14;23225:43;-1:-1:-1;23313:1:1;23288:16;;;23306:4;23284:27;;;23277:38;;;;23369:2;23348:15;;;-1:-1:-1;;23344:29:1;23335:39;;;23331:50;;23120:267::o;23392:625::-;23665:2;23654:9;23647:21;23628:4;23691:62;23749:2;23738:9;23734:18;23726:6;23718;23691:62;:::i;:::-;23801:9;23793:6;23789:22;23784:2;23773:9;23769:18;23762:50;23835;23878:6;23870;23862;23835:50;:::i;:::-;23821:64;;23933:9;23925:6;23921:22;23916:2;23905:9;23901:18;23894:50;23961;24004:6;23996;23988;23961:50;:::i;:::-;23953:58;23392:625;-1:-1:-1;;;;;;;;;23392:625:1:o;24022:700::-;24325:3;24314:9;24307:22;24288:4;24352:63;24410:3;24399:9;24395:19;24387:6;24379;24352:63;:::i;:::-;24463:9;24455:6;24451:22;24446:2;24435:9;24431:18;24424:50;24497;24540:6;24532;24524;24497:50;:::i;:::-;24483:64;;24595:9;24587:6;24583:22;24578:2;24567:9;24563:18;24556:50;24623;24666:6;24658;24650;24623:50;:::i;:::-;24615:58;;;24709:6;24704:2;24693:9;24689:18;24682:34;24022:700;;;;;;;;;;:::o;24727:390::-;24805:6;24813;24866:2;24854:9;24845:7;24841:23;24837:32;24834:52;;;24882:1;24879;24872:12;24834:52;24922:9;24909:23;24955:18;24947:6;24944:30;24941:50;;;24987:1;24984;24977:12;24941:50;25010;25052:7;25043:6;25032:9;25028:22;25010:50;:::i;:::-;25000:60;25107:2;25092:18;;;;25079:32;;-1:-1:-1;;;;24727:390:1:o;25122:184::-;-1:-1:-1;;;25171:1:1;25164:88;25271:4;25268:1;25261:15;25295:4;25292:1;25285:15;25311:184;25381:6;25434:2;25422:9;25413:7;25409:23;25405:32;25402:52;;;25450:1;25447;25440:12;25402:52;-1:-1:-1;25473:16:1;;25311:184;-1:-1:-1;25311:184:1:o;25802:338::-;-1:-1:-1;;;;;25981:6:1;25977:55;25966:9;25959:74;26069:2;26064;26053:9;26049:18;26042:30;25940:4;26089:45;26130:2;26119:9;26115:18;26107:6;26089:45;:::i;26145:414::-;26230:6;26238;26291:2;26279:9;26270:7;26266:23;26262:32;26259:52;;;26307:1;26304;26297:12;26259:52;26330:37;26357:9;26330:37;:::i;:::-;26320:47;;26411:2;26400:9;26396:18;26390:25;26438:18;26430:6;26427:30;26424:50;;;26470:1;26467;26460:12;26424:50;26493:60;26545:7;26536:6;26525:9;26521:22;26493:60;:::i;26746:1110::-;26906:6;26914;26922;26930;26938;26946;26954;26962;27015:3;27003:9;26994:7;26990:23;26986:33;26983:53;;;27032:1;27029;27022:12;26983:53;27072:9;27059:23;27101:18;27142:2;27134:6;27131:14;27128:34;;;27158:1;27155;27148:12;27128:34;27181:50;27223:7;27214:6;27203:9;27199:22;27181:50;:::i;:::-;27171:60;;27284:2;27273:9;27269:18;27256:32;27240:48;;27313:2;27303:8;27300:16;27297:36;;;27329:1;27326;27319:12;27297:36;27352:52;27396:7;27385:8;27374:9;27370:24;27352:52;:::i;:::-;27342:62;;27423:46;27465:2;27454:9;27450:18;27423:46;:::i;:::-;27413:56;;27516:2;27505:9;27501:18;27488:32;27478:42;;27573:3;27562:9;27558:19;27545:33;27529:49;;27603:2;27593:8;27590:16;27587:36;;;27619:1;27616;27609:12;27587:36;;27642:52;27686:7;27675:8;27664:9;27660:24;27642:52;:::i;:::-;26746:1110;;;;-1:-1:-1;26746:1110:1;;;;27632:62;27741:3;27726:19;;27713:33;;-1:-1:-1;27793:3:1;27778:19;;27765:33;;27845:3;27830:19;27817:33;;-1:-1:-1;26746:1110:1;-1:-1:-1;;;26746:1110:1:o;27861:763::-;28190:3;28179:9;28172:22;28153:4;28217:46;28258:3;28247:9;28243:19;28235:6;28217:46;:::i;:::-;28311:9;28303:6;28299:22;28294:2;28283:9;28279:18;28272:50;28345:33;28371:6;28363;28345:33;:::i;:::-;28331:47;;28426:9;28418:6;28414:22;28409:2;28398:9;28394:18;28387:50;28454:33;28480:6;28472;28454:33;:::i;:::-;28518:2;28503:18;;28496:34;;;;-1:-1:-1;;28561:3:1;28546:19;;28539:35;;;;28605:3;28590:19;;;28583:35;28446:41;27861:763;-1:-1:-1;;;27861:763:1:o;28629:128::-;28669:3;28700:1;28696:6;28693:1;28690:13;28687:39;;;28706:18;;:::i;:::-;-1:-1:-1;28742:9:1;;28629:128::o;28762:522::-;28840:4;28846:6;28906:11;28893:25;29000:2;28996:7;28985:8;28969:14;28965:29;28961:43;28941:18;28937:68;28927:96;;29019:1;29016;29009:12;28927:96;29046:33;;29098:20;;;-1:-1:-1;29141:18:1;29130:30;;29127:50;;;29173:1;29170;29163:12;29127:50;29206:4;29194:17;;-1:-1:-1;29237:14:1;29233:27;;;29223:38;;29220:58;;;29274:1;29271;29264:12;29289:988;29419:6;29427;29435;29443;29451;29459;29512:3;29500:9;29491:7;29487:23;29483:33;29480:53;;;29529:1;29526;29519:12;29480:53;29569:9;29556:23;29598:18;29639:2;29631:6;29628:14;29625:34;;;29655:1;29652;29645:12;29625:34;29678:50;29720:7;29711:6;29700:9;29696:22;29678:50;:::i;:::-;29668:60;;29781:2;29770:9;29766:18;29753:32;29737:48;;29810:2;29800:8;29797:16;29794:36;;;29826:1;29823;29816:12;29794:36;;29849:52;29893:7;29882:8;29871:9;29867:24;29849:52;:::i;:::-;29839:62;;;29951:2;29940:9;29936:18;29923:32;29995:4;29988:5;29984:16;29977:5;29974:27;29964:55;;30015:1;30012;30005:12;29964:55;30038:5;-1:-1:-1;30090:2:1;30075:18;;30062:32;;-1:-1:-1;30146:3:1;30131:19;;30118:33;30160;30118;30160;:::i;:::-;30212:7;30202:17;;;30266:3;30255:9;30251:19;30238:33;30228:43;;29289:988;;;;;;;;:::o;30282:606::-;30559:3;30548:9;30541:22;30522:4;30586:46;30627:3;30616:9;30612:19;30604:6;30586:46;:::i;:::-;30680:9;30672:6;30668:22;30663:2;30652:9;30648:18;30641:50;30708:33;30734:6;30726;30708:33;:::i;:::-;30789:4;30777:17;;;;30772:2;30757:18;;30750:45;-1:-1:-1;;30826:2:1;30811:18;;30804:34;;;;30869:3;30854:19;;;30847:35;30700:41;30282:606;-1:-1:-1;;30282:606:1:o;30893:259::-;30971:6;31024:2;31012:9;31003:7;30999:23;30995:32;30992:52;;;31040:1;31037;31030:12;30992:52;31072:9;31066:16;31091:31;31116:5;31091:31;:::i;31157:340::-;31334:2;31323:9;31316:21;31297:4;31354:45;31395:2;31384:9;31380:18;31372:6;31354:45;:::i;:::-;31346:53;;-1:-1:-1;;;;;31439:6:1;31435:55;31430:2;31419:9;31415:18;31408:83;31157:340;;;;;:::o;31502:245::-;31659:2;31648:9;31641:21;31622:4;31679:62;31737:2;31726:9;31722:18;31714:6;31706;31679:62;:::i;31752:437::-;31831:1;31827:12;;;;31874;;;31895:61;;31949:4;31941:6;31937:17;31927:27;;31895:61;32002:2;31994:6;31991:14;31971:18;31968:38;31965:218;;;-1:-1:-1;;;32036:1:1;32029:88;32140:4;32137:1;32130:15;32168:4;32165:1;32158:15;31965:218;;31752:437;;;:::o;32194:1256::-;32305:6;32313;32321;32374:2;32362:9;32353:7;32349:23;32345:32;32342:52;;;32390:1;32387;32380:12;32342:52;32430:9;32417:23;32459:18;32500:2;32492:6;32489:14;32486:34;;;32516:1;32513;32506:12;32486:34;32554:6;32543:9;32539:22;32529:32;;32599:7;32592:4;32588:2;32584:13;32580:27;32570:55;;32621:1;32618;32611:12;32570:55;32657:2;32644:16;32679:4;32703:60;32719:43;32759:2;32719:43;:::i;32703:60::-;32797:15;;;32879:1;32875:10;;;;32867:19;;32863:28;;;32828:12;;;;32903:19;;;32900:39;;;32935:1;32932;32925:12;32900:39;32959:11;;;;32979:217;32995:6;32990:3;32987:15;32979:217;;;33075:3;33062:17;33092:31;33117:5;33092:31;:::i;:::-;33136:18;;33012:12;;;;33174;;;;32979:217;;;33215:5;-1:-1:-1;;33252:18:1;;33239:32;;-1:-1:-1;;33324:2:1;33309:18;;33296:32;;-1:-1:-1;33340:16:1;;;33337:36;;;33369:1;33366;33359:12;33337:36;;33392:52;33436:7;33425:8;33414:9;33410:24;33392:52;:::i;:::-;33382:62;;;32194:1256;;;;;:::o;33455:889::-;33814:3;33803:9;33796:22;33777:4;33841:63;33899:3;33888:9;33884:19;33876:6;33868;33841:63;:::i;:::-;33952:9;33944:6;33940:22;33935:2;33924:9;33920:18;33913:50;33986;34029:6;34021;34013;33986:50;:::i;:::-;33972:64;;34084:9;34076:6;34072:22;34067:2;34056:9;34052:18;34045:50;34118;34161:6;34153;34145;34118:50;:::i;:::-;34104:64;;34216:9;34208:6;34204:22;34199:2;34188:9;34184:18;34177:50;34244;34287:6;34279;34271;34244:50;:::i;:::-;34236:58;;;34331:6;34325:3;34314:9;34310:19;34303:35;33455:889;;;;;;;;;;;;:::o;34349:274::-;34389:1;34415;34405:189;;-1:-1:-1;;;34447:1:1;34440:88;34551:4;34548:1;34541:15;34579:4;34576:1;34569:15;34405:189;-1:-1:-1;34608:9:1;;34349:274::o;34628:893::-;34760:6;34768;34776;34784;34792;34800;34853:3;34841:9;34832:7;34828:23;34824:33;34821:53;;;34870:1;34867;34860:12;34821:53;34910:9;34897:23;34939:18;34980:2;34972:6;34969:14;34966:34;;;34996:1;34993;34986:12;34966:34;35019:50;35061:7;35052:6;35041:9;35037:22;35019:50;:::i;:::-;35009:60;;35122:2;35111:9;35107:18;35094:32;35078:48;;35151:2;35141:8;35138:16;35135:36;;;35167:1;35164;35157:12;35135:36;;35190:52;35234:7;35223:8;35212:9;35208:24;35190:52;:::i;:::-;35180:62;;;35292:2;35281:9;35277:18;35264:32;35305:31;35330:5;35305:31;:::i;:::-;34628:893;;;;-1:-1:-1;35355:5:1;;35407:2;35392:18;;35379:32;;-1:-1:-1;35458:3:1;35443:19;;35430:33;;35510:3;35495:19;;;35482:33;;-1:-1:-1;34628:893:1;-1:-1:-1;;34628:893:1:o;35526:527::-;35779:3;35768:9;35761:22;35742:4;35806:46;35847:3;35836:9;35832:19;35824:6;35806:46;:::i;:::-;35900:9;35892:6;35888:22;35883:2;35872:9;35868:18;35861:50;35928:33;35954:6;35946;35928:33;:::i;:::-;35992:2;35977:18;;35970:34;;;;-1:-1:-1;;36035:2:1;36020:18;36013:34;35920:41;35526:527;-1:-1:-1;;35526:527:1:o;36443:976::-;36791:4;36820:3;36850:6;36839:9;36832:25;36893:6;36888:2;36877:9;36873:18;36866:34;36936:2;36931;36920:9;36916:18;36909:30;36962:45;37003:2;36992:9;36988:18;36980:6;36962:45;:::i;:::-;36948:59;;37055:9;37047:6;37043:22;37038:2;37027:9;37023:18;37016:50;37089:33;37115:6;37107;37089:33;:::i;:::-;37075:47;;-1:-1:-1;;;;;37163:6:1;37159:55;37153:3;37142:9;37138:19;37131:84;37252:6;37246:3;37235:9;37231:19;37224:35;37308:9;37300:6;37296:22;37290:3;37279:9;37275:19;37268:51;37336:33;37362:6;37354;37336:33;:::i;:::-;37328:41;;;37406:6;37400:3;37389:9;37385:19;37378:35;36443:976;;;;;;;;;;;:::o;37424:348::-;37613:6;37608:3;37601:19;37583:3;37649:6;37643:13;37665:60;37718:6;37713:2;37708:3;37704:12;37699:2;37691:6;37687:15;37665:60;:::i;:::-;37745:16;;;;37763:2;37741:25;;37424:348;-1:-1:-1;;;37424:348:1:o;38436:720::-;38745:6;38734:9;38727:25;38788:6;38783:2;38772:9;38768:18;38761:34;38831:3;38826:2;38815:9;38811:18;38804:31;38708:4;38858:46;38899:3;38888:9;38884:19;38876:6;38858:46;:::i;:::-;38952:9;38944:6;38940:22;38935:2;38924:9;38920:18;38913:50;38980:33;39006:6;38998;38980:33;:::i;:::-;-1:-1:-1;;;;;39050:55:1;;;;39044:3;39029:19;;39022:84;-1:-1:-1;;39137:3:1;39122:19;39115:35;38972:41;38436:720;-1:-1:-1;;;;38436:720:1:o;39457:362::-;39662:6;39651:9;39644:25;39705:2;39700;39689:9;39685:18;39678:30;39625:4;39725:45;39766:2;39755:9;39751:18;39743:6;39725:45;:::i;:::-;39717:53;;39806:6;39801:2;39790:9;39786:18;39779:34;39457:362;;;;;;:::o

Swarm Source

ipfs://4998f838cdcafb3bed81b83a80af25a5eb3725a58bc3781fb9f68ff167189756
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading