Contract 0x611454970d8d27235ccd9af0ccbfde0504abdd37

Contract Overview

Balance:
0 AVAX
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x7225196f45d89887e8f1a9cdb390c373c37c3d1850f64935773d91cc728d10560x60a06040105312952022-06-08 20:00:28112 days 5 hrs ago0xf52bd269116448745a7e13c3d2f299973cf671ab IN  Create: AxelarGatewayMultisig0 AVAX0.127757025 27.5
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xaf1f2ae6b0a50fb7e526a55b59468e83b225ccf6d115339260991000dafb09a1124856752022-08-12 20:25:3547 days 5 hrs ago 0xc249632c2d40b9001fe907806902f63038b737ab0x611454970d8d27235ccd9af0ccbfde0504abdd370 AVAX
0x37dae39d0ee7d1179f3882457793ae5b5a4c0d4f15674c248fa609fa2fae02be124856722022-08-12 20:25:2647 days 5 hrs ago 0xc249632c2d40b9001fe907806902f63038b737ab0x611454970d8d27235ccd9af0ccbfde0504abdd370 AVAX
0x7672efc573349b82ee8708bfa7bf29403fa68a5e3a27371e553fe6747882099f124856702022-08-12 20:25:1947 days 5 hrs ago 0xc249632c2d40b9001fe907806902f63038b737ab0x611454970d8d27235ccd9af0ccbfde0504abdd370 AVAX
0xe2627e2da6bc37a385dbf85d5f245397e3013e6985859d54e5079104da00408a124856652022-08-12 20:25:0947 days 5 hrs ago 0xc249632c2d40b9001fe907806902f63038b737ab0x611454970d8d27235ccd9af0ccbfde0504abdd370 AVAX
0x1a027eb692e02ee4f169fae4450ce608ea424a68426afd31365f7eecd49189ae124854512022-08-12 20:16:2747 days 5 hrs ago 0xc249632c2d40b9001fe907806902f63038b737ab0x611454970d8d27235ccd9af0ccbfde0504abdd370 AVAX
0x358e73283f50089d8bd04a30e77545461aba68d027c10c221fd6b7bebfaa8be1124854462022-08-12 20:16:1747 days 5 hrs ago 0xc249632c2d40b9001fe907806902f63038b737ab0x611454970d8d27235ccd9af0ccbfde0504abdd370 AVAX
0xb242ea98121bf73b0ee7425df73183ed4efb31cae3db815abd5a1f3faac29a22124854422022-08-12 20:16:0947 days 5 hrs ago 0xc249632c2d40b9001fe907806902f63038b737ab0x611454970d8d27235ccd9af0ccbfde0504abdd370 AVAX
0x661b27a5bc01e23a422a3741ae3337d5161a3fadb461dbe94be0b0b631a371fb124854372022-08-12 20:15:5847 days 5 hrs ago 0xc249632c2d40b9001fe907806902f63038b737ab0x611454970d8d27235ccd9af0ccbfde0504abdd370 AVAX
0x92e4e04d3786864c15876a584a9beef73cb3dac640a4412df1c4efb35b600076124619322022-08-12 6:15:1147 days 19 hrs ago 0xc249632c2d40b9001fe907806902f63038b737ab0x611454970d8d27235ccd9af0ccbfde0504abdd370 AVAX
0x018effcaf2f8fabc137c355b56e2b5624658e8e8759d60b65303b41d4b778370124400402022-08-11 16:03:1748 days 9 hrs ago 0xc249632c2d40b9001fe907806902f63038b737ab0x611454970d8d27235ccd9af0ccbfde0504abdd370 AVAX
0x8d6f3a6853766b177d77e758850e141a3d8a508278998148a33a7f975aab0d15124377572022-08-11 14:39:4448 days 11 hrs ago 0xc249632c2d40b9001fe907806902f63038b737ab0x611454970d8d27235ccd9af0ccbfde0504abdd370 AVAX
0xef3559f38d172bbcc4922925219faeed1e1eb2172d37902f92da52329e1228ba124377472022-08-11 14:39:2148 days 11 hrs ago 0xc249632c2d40b9001fe907806902f63038b737ab0x611454970d8d27235ccd9af0ccbfde0504abdd370 AVAX
0xef3559f38d172bbcc4922925219faeed1e1eb2172d37902f92da52329e1228ba124377472022-08-11 14:39:2148 days 11 hrs ago 0xc249632c2d40b9001fe907806902f63038b737ab0x611454970d8d27235ccd9af0ccbfde0504abdd370 AVAX
0x29217ed999ee83cb38718f0c9e7d78a5de11be7efb5aedd57836cec630e64b31124375582022-08-11 14:32:1548 days 11 hrs ago 0xc249632c2d40b9001fe907806902f63038b737ab0x611454970d8d27235ccd9af0ccbfde0504abdd370 AVAX
0xdbfa5cbad4c7cdaf249e9328ebdc0e12d1e55d3cf97f09ef9cfc8ec02a634846124374572022-08-11 14:28:4648 days 11 hrs ago 0xc249632c2d40b9001fe907806902f63038b737ab0x611454970d8d27235ccd9af0ccbfde0504abdd370 AVAX
0x0493d24f454b86dff2e9fc7533d0f693b208711531973f61fa693870bc496f12124374472022-08-11 14:28:2248 days 11 hrs ago 0xc249632c2d40b9001fe907806902f63038b737ab0x611454970d8d27235ccd9af0ccbfde0504abdd370 AVAX
0x0493d24f454b86dff2e9fc7533d0f693b208711531973f61fa693870bc496f12124374472022-08-11 14:28:2248 days 11 hrs ago 0xc249632c2d40b9001fe907806902f63038b737ab0x611454970d8d27235ccd9af0ccbfde0504abdd370 AVAX
0xbbc295dd91627d1fae7c2d156a0a464bc1cfad3067c45348a56af89e3897d64b124373062022-08-11 14:23:0648 days 11 hrs ago 0xc249632c2d40b9001fe907806902f63038b737ab0x611454970d8d27235ccd9af0ccbfde0504abdd370 AVAX
0x3d44666921a19d32519dfdee4093634735b9ee256d794d0e90c3d68c532b54b4124365842022-08-11 13:57:1348 days 11 hrs ago 0xc249632c2d40b9001fe907806902f63038b737ab0x611454970d8d27235ccd9af0ccbfde0504abdd370 AVAX
0xd5ca602aaf99ee5d39e1e6c24f51fe22d6d5025038065e4e8f2ab1935cddc9fe124364862022-08-11 13:53:2948 days 11 hrs ago 0xc249632c2d40b9001fe907806902f63038b737ab0x611454970d8d27235ccd9af0ccbfde0504abdd370 AVAX
0x8ee13366e9dc6e17363f01e762a75ce886aa276dc47add0555a361aa9fc92d23124364732022-08-11 13:53:0248 days 11 hrs ago 0xc249632c2d40b9001fe907806902f63038b737ab0x611454970d8d27235ccd9af0ccbfde0504abdd370 AVAX
0xba63b79a16037578a0e07ed40738bf8da07dd3e28ef9f0b9180a9591fd7184a2124364052022-08-11 13:50:3548 days 11 hrs ago 0xc249632c2d40b9001fe907806902f63038b737ab0x611454970d8d27235ccd9af0ccbfde0504abdd370 AVAX
0xae1449d7e1a8837ccf537fa61dd8e3ee13191b6ab60a60c0cdbaf5b683eb9182124363962022-08-11 13:50:1748 days 11 hrs ago 0xc249632c2d40b9001fe907806902f63038b737ab0x611454970d8d27235ccd9af0ccbfde0504abdd370 AVAX
0xae1449d7e1a8837ccf537fa61dd8e3ee13191b6ab60a60c0cdbaf5b683eb9182124363962022-08-11 13:50:1748 days 11 hrs ago 0xc249632c2d40b9001fe907806902f63038b737ab0x611454970d8d27235ccd9af0ccbfde0504abdd370 AVAX
0xbef998425ec27d2e6f85e80c0dcbec147d5f3344a9f5d258165b0e219952e171124363272022-08-11 13:47:4848 days 11 hrs ago 0xc249632c2d40b9001fe907806902f63038b737ab0x611454970d8d27235ccd9af0ccbfde0504abdd370 AVAX
[ 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:
AxelarGatewayMultisig

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at testnet.snowtrace.io on 2022-06-24
*/

// Dependency file: src/interfaces/IAxelarGateway.sol

// SPDX-License-Identifier: MIT

// pragma solidity 0.8.9;

interface IAxelarGateway {
    /**********\
    |* 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 TokenFrozen(string symbol);

    event TokenUnfrozen(string symbol);

    event AllTokensFrozen();

    event AllTokensUnfrozen();

    event AccountBlacklisted(address indexed account);

    event AccountWhitelisted(address indexed account);

    event Upgraded(address indexed implementation);

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

    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 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 freezeToken(string calldata symbol) external;

    function unfreezeToken(string calldata symbol) external;

    function freezeAllTokens() external;

    function unfreezeAllTokens() 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;
}


// Dependency file: src/interfaces/IAxelarGatewayMultisig.sol


// pragma solidity 0.8.9;

// import { IAxelarGateway } from 'src/interfaces/IAxelarGateway.sol';

interface IAxelarGatewayMultisig is IAxelarGateway {
    event OwnershipTransferred(address[] preOwners, uint256 prevThreshold, address[] newOwners, uint256 newThreshold);

    event OperatorshipTransferred(
        address[] preOperators,
        uint256 prevThreshold,
        address[] newOperators,
        uint256 newThreshold
    );

    function ownerEpoch() external view returns (uint256);

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

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

    function operatorEpoch() external view returns (uint256);

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

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


// Dependency file: src/ECDSA.sol


// pragma solidity 0.8.9;

/**
 * @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));
    }
}


// Dependency file: src/interfaces/IERC20.sol


// pragma solidity 0.8.9;

/**
 * @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);
}


// Dependency file: src/interfaces/IERC20Burn.sol


// pragma solidity 0.8.9;

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


// Dependency file: src/interfaces/IERC20BurnFrom.sol


// pragma solidity 0.8.9;

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


// Dependency file: src/interfaces/IERC20Permit.sol


// pragma solidity 0.8.9;

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;
}


// Dependency file: src/interfaces/IOwnable.sol


// pragma solidity 0.8.9;

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;
}


// Dependency file: src/interfaces/IMintableCappedERC20.sol


// pragma solidity 0.8.9;

// import { IERC20 } from 'src/interfaces/IERC20.sol';
// import { IERC20Permit } from 'src/interfaces/IERC20Permit.sol';
// import { IOwnable } from 'src/interfaces/IOwnable.sol';

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

    function cap() external view returns (uint256);

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


// Dependency file: src/interfaces/IBurnableMintableCappedERC20.sol


// pragma solidity 0.8.9;

// import { IERC20Burn } from 'src/interfaces/IERC20Burn.sol';
// import { IERC20BurnFrom } from 'src/interfaces/IERC20BurnFrom.sol';
// import { IMintableCappedERC20 } from 'src/interfaces/IMintableCappedERC20.sol';

interface IBurnableMintableCappedERC20 is IERC20Burn, IERC20BurnFrom, IMintableCappedERC20 {
    error IsFrozen();

    function depositAddress(bytes32 salt) external view returns (address);

    function burn(bytes32 salt) external;

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


// Dependency file: src/interfaces/ITokenDeployer.sol


// pragma solidity 0.8.9;

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


// Dependency file: src/DepositHandler.sol


// pragma solidity 0.8.9;

contract DepositHandler {
    uint256 internal constant IS_NOT_LOCKED = uint256(0);
    uint256 internal constant IS_LOCKED = uint256(1);

    uint256 internal _lockedStatus = IS_NOT_LOCKED;

    modifier noReenter() {
        require(_lockedStatus == IS_NOT_LOCKED);

        _lockedStatus = IS_LOCKED;
        _;
        _lockedStatus = IS_NOT_LOCKED;
    }

    function execute(address callee, bytes calldata data) external noReenter returns (bool success, bytes memory returnData) {
        (success, returnData) = callee.call(data);
    }

    function destroy(address etherDestination) external noReenter {
        selfdestruct(payable(etherDestination));
    }
}


// Dependency file: src/EternalStorage.sol


// pragma solidity 0.8.9;

/**
 * @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];
    }
}


// Dependency file: src/AdminMultisigBase.sol


// pragma solidity 0.8.9;

// import { EternalStorage } from 'src/EternalStorage.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);
    }
}


// Dependency file: src/AxelarGateway.sol


// pragma solidity 0.8.9;

// import { IAxelarGateway } from 'src/interfaces/IAxelarGateway.sol';
// import { IERC20 } from 'src/interfaces/IERC20.sol';
// import { IERC20Burn } from 'src/interfaces/IERC20Burn.sol';
// import { IERC20BurnFrom } from 'src/interfaces/IERC20BurnFrom.sol';
// import { IBurnableMintableCappedERC20 } from 'src/interfaces/IBurnableMintableCappedERC20.sol';
// import { ITokenDeployer } from 'src/interfaces/ITokenDeployer.sol';

// import { DepositHandler } from 'src/DepositHandler.sol';
// import { AdminMultisigBase } from 'src/AdminMultisigBase.sol';

abstract contract AxelarGateway is IAxelarGateway, AdminMultisigBase {
    error NotSelf();
    error InvalidCodeHash();
    error SetupFailed();
    error InvalidAmount();
    error InvalidTokenDeployer();
    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 TokenIsFrozen(string symbol);

    enum Role {
        Admin,
        Owner,
        Operator
    }

    enum TokenType {
        InternalBurnable,
        InternalBurnableFrom,
        External
    }

    /// @dev Storage slot with the address of the current factory. `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 KEY_ALL_TOKENS_FROZEN = keccak256('all-tokens-frozen');

    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_TOKEN_FROZEN = keccak256('token-frozen');
    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 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');
    bytes32 internal constant SELECTOR_TRANSFER_OWNERSHIP = keccak256('transferOwnership');

    uint8 internal constant OLD_KEY_RETENTION = 16;

    address internal immutable TOKEN_DEPLOYER_IMPLEMENTATION;

    constructor(address tokenDeployerImplementation) {
        if (tokenDeployerImplementation.code.length == 0) revert InvalidTokenDeployer();

        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) {
            _setBool(key, false);
            _mintToken(symbol, msg.sender, amount);
        }
    }

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

    function allTokensFrozen() external view override returns (bool) {
        return getBool(KEY_ALL_TOKENS_FROZEN);
    }

    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));
    }

    function tokenFrozen(string memory symbol) public view override returns (bool) {
        return getBool(_getFreezeTokenKey(symbol));
    }

    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 freezeToken(string calldata symbol) external override onlyAdmin {
        _setBool(_getFreezeTokenKey(symbol), true);

        emit TokenFrozen(symbol);
    }

    function unfreezeToken(string calldata symbol) external override onlyAdmin {
        _setBool(_getFreezeTokenKey(symbol), false);

        emit TokenUnfrozen(symbol);
    }

    function freezeAllTokens() external override onlyAdmin {
        _setBool(KEY_ALL_TOKENS_FROZEN, true);

        emit AllTokensFrozen();
    }

    function unfreezeAllTokens() external override onlyAdmin {
        _setBool(KEY_ALL_TOKENS_FROZEN, false);

        emit AllTokensUnfrozen();
    }

    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) {
            (bool success, ) = newImplementation.delegatecall(
                abi.encodeWithSelector(IAxelarGateway.setup.selector, setupParams)
            );

            if (!success) revert SetupFailed();
        }

        _setImplementation(newImplementation);
    }

    /**********************\
    |* Internal Functions *|
    \**********************/

    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) {
            _checkTokenStatus(symbol);

            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(IERC20BurnFrom.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);

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

    function _deployToken(
        string memory name,
        string memory symbol,
        uint8 decimals,
        uint256 cap,
        address tokenAddress
    ) internal {
        // 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));

            (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);

        emit TokenDeployed(symbol, tokenAddress);
    }

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

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

        if (_getTokenType(symbol) == TokenType.External) {
            _checkTokenStatus(symbol);

            bool success = _callERC20Token(
                tokenAddress,
                abi.encodeWithSelector(IERC20.transfer.selector, account, amount)
            );

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

    function _burnToken(string memory symbol, bytes32 salt) internal {
        address tokenAddress = tokenAddresses(symbol);

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

        if (_getTokenType(symbol) == TokenType.External) {
            _checkTokenStatus(symbol);

            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 {
            IERC20Burn(tokenAddress).burn(salt);
        }
    }

    function _approveContractCall(
        bytes32 commandId,
        string memory sourceChain,
        string memory sourceAddress,
        address contractAddress,
        bytes32 payloadHash,
        bytes32 sourceTxHash,
        uint256 sourceEventIndex
    ) internal {
        _setContractCallApproved(commandId, sourceChain, sourceAddress, contractAddress, payloadHash);
        emit ContractCallApproved(
            commandId,
            sourceChain,
            sourceAddress,
            contractAddress,
            payloadHash,
            sourceTxHash,
            sourceEventIndex
        );
    }

    function _approveContractCallWithMint(
        bytes32 commandId,
        string memory sourceChain,
        string memory sourceAddress,
        address contractAddress,
        bytes32 payloadHash,
        string memory symbol,
        uint256 amount,
        bytes32 sourceTxHash,
        uint256 sourceEventIndex
    ) internal {
        _setContractCallApprovedWithMint(
            commandId,
            sourceChain,
            sourceAddress,
            contractAddress,
            payloadHash,
            symbol,
            amount
        );
        emit ContractCallApprovedWithMint(
            commandId,
            sourceChain,
            sourceAddress,
            contractAddress,
            payloadHash,
            symbol,
            amount,
            sourceTxHash,
            sourceEventIndex
        );
    }

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

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

    function _getFreezeTokenKey(string memory symbol) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(PREFIX_TOKEN_FROZEN, 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 Methods *|
    \********************/

    function _callERC20Token(address tokenAddress, bytes memory callData) internal returns (bool) {
        (bool success, bytes memory returnData) = tokenAddress.call(callData);
        return success && (returnData.length == uint256(0) || abi.decode(returnData, (bool)));
    }

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

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

    function _checkTokenStatus(string memory symbol) internal view {
        if (tokenFrozen(symbol) || getBool(KEY_ALL_TOKENS_FROZEN)) revert TokenIsFrozen(symbol);
    }

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

    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);
    }
}


// Root file: src/AxelarGatewayMultisig.sol


pragma solidity 0.8.9;

// import { IAxelarGatewayMultisig } from 'src/interfaces/IAxelarGatewayMultisig.sol';

// import { ECDSA } from 'src/ECDSA.sol';
// import { AxelarGateway } from 'src/AxelarGateway.sol';

contract AxelarGatewayMultisig is IAxelarGatewayMultisig, AxelarGateway {
    error InvalidAddress();
    error InvalidOwners();
    error InvalidOwnerThreshold();
    error DuplicateOwner(address owner);
    error InvalidOperators();
    error InvalidOperatorThreshold();
    error DuplicateOperator(address operator);
    error NotProxy();
    error InvalidChainId();
    error MalformedSigners();
    error InvalidCommands();

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

    bytes32 internal constant PREFIX_OWNER = keccak256('owner');
    bytes32 internal constant PREFIX_OWNER_COUNT = keccak256('owner-count');
    bytes32 internal constant PREFIX_OWNER_THRESHOLD = keccak256('owner-threshold');
    bytes32 internal constant PREFIX_IS_OWNER = keccak256('is-owner');

    bytes32 internal constant KEY_OPERATOR_EPOCH = keccak256('operator-epoch');

    bytes32 internal constant PREFIX_OPERATOR = keccak256('operator');
    bytes32 internal constant PREFIX_OPERATOR_COUNT = keccak256('operator-count');
    bytes32 internal constant PREFIX_OPERATOR_THRESHOLD = keccak256('operator-threshold');
    bytes32 internal constant PREFIX_IS_OPERATOR = keccak256('is-operator');

    constructor(address tokenDeployer) AxelarGateway(tokenDeployer) {}

    function _isSortedAscAndContainsNoDuplicate(address[] memory accounts) internal pure returns (bool) {
        for (uint256 i; i < accounts.length - 1; ++i) {
            if (accounts[i] >= accounts[i + 1]) {
                return false;
            }
        }

        return true;
    }

    /************************\
    |* Owners Functionality *|
    \************************/

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

    function _getOwnerKey(uint256 epoch, uint256 index) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(PREFIX_OWNER, epoch, index));
    }

    function _getOwnerCountKey(uint256 epoch) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(PREFIX_OWNER_COUNT, epoch));
    }

    function _getOwnerThresholdKey(uint256 epoch) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(PREFIX_OWNER_THRESHOLD, epoch));
    }

    function _getIsOwnerKey(uint256 epoch, address account) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(PREFIX_IS_OWNER, epoch, account));
    }

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

    function _ownerEpoch() internal view returns (uint256) {
        return getUint(KEY_OWNER_EPOCH);
    }

    function _getOwner(uint256 epoch, uint256 index) internal view returns (address) {
        return getAddress(_getOwnerKey(epoch, index));
    }

    function _getOwnerCount(uint256 epoch) internal view returns (uint256) {
        return getUint(_getOwnerCountKey(epoch));
    }

    function _getOwnerThreshold(uint256 epoch) internal view returns (uint256) {
        return getUint(_getOwnerThresholdKey(epoch));
    }

    function _isOwner(uint256 epoch, address account) internal view returns (bool) {
        return getBool(_getIsOwnerKey(epoch, account));
    }

    /// @dev Returns true if a sufficient quantity of `accounts` are owners within the last `OLD_KEY_RETENTION + 1` owner epochs (excluding the current one).
    function _areValidPreviousOwners(address[] memory accounts) internal view returns (bool) {
        uint256 epoch = _ownerEpoch();
        uint256 recentEpochs = OLD_KEY_RETENTION + uint256(1);
        uint256 lowerBoundOwnerEpoch = epoch > recentEpochs ? epoch - recentEpochs : uint256(0);

        --epoch;
        while (epoch > lowerBoundOwnerEpoch) {
            if (_areValidOwnersInEpoch(epoch--, accounts)) return true;
        }

        return false;
    }

    /// @dev Returns true if a sufficient quantity of `accounts` are owners in the `ownerEpoch`.
    function _areValidOwnersInEpoch(uint256 epoch, address[] memory accounts) internal view returns (bool) {
        uint256 threshold = _getOwnerThreshold(epoch);
        uint256 validSignerCount;

        for (uint256 i; i < accounts.length; ++i) {
            if (_isOwner(epoch, accounts[i]) && ++validSignerCount >= threshold) return true;
        }

        return false;
    }

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

    /// @dev Returns the threshold for a given `ownerEpoch`.
    function ownerThreshold(uint256 epoch) external view override returns (uint256) {
        return _getOwnerThreshold(epoch);
    }

    /// @dev Returns the array of owners within a given `ownerEpoch`.
    function owners(uint256 epoch) public view override returns (address[] memory results) {
        uint256 ownerCount = _getOwnerCount(epoch);
        results = new address[](ownerCount);

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

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

    function _setOwnerEpoch(uint256 epoch) internal {
        _setUint(KEY_OWNER_EPOCH, epoch);
    }

    function _setOwner(
        uint256 epoch,
        uint256 index,
        address account
    ) internal {
        if (account == address(0)) revert InvalidAddress();

        _setAddress(_getOwnerKey(epoch, index), account);
    }

    function _setOwnerCount(uint256 epoch, uint256 ownerCount) internal {
        _setUint(_getOwnerCountKey(epoch), ownerCount);
    }

    function _setOwners(
        uint256 epoch,
        address[] memory accounts,
        uint256 threshold
    ) internal {
        uint256 accountLength = accounts.length;

        if (accountLength < threshold) revert InvalidOwners();

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

        _setOwnerThreshold(epoch, threshold);
        _setOwnerCount(epoch, accountLength);

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

            // Check that the account wasn't already set as an owner for this ownerEpoch.
            if (_isOwner(epoch, account)) revert DuplicateOwner(account);

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

            // Set this account as the i-th owner in this ownerEpoch (needed so we can get all the owners for `owners`).
            _setOwner(epoch, i, account);
            _setIsOwner(epoch, account, true);
        }
    }

    function _setOwnerThreshold(uint256 epoch, uint256 threshold) internal {
        _setUint(_getOwnerThresholdKey(epoch), threshold);
    }

    function _setIsOwner(
        uint256 epoch,
        address account,
        bool isOwner
    ) internal {
        _setBool(_getIsOwnerKey(epoch, account), isOwner);
    }

    /**************************\
    |* Operator Functionality *|
    \**************************/

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

    function _getOperatorKey(uint256 epoch, uint256 index) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(PREFIX_OPERATOR, epoch, index));
    }

    function _getOperatorCountKey(uint256 epoch) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(PREFIX_OPERATOR_COUNT, epoch));
    }

    function _getOperatorThresholdKey(uint256 epoch) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(PREFIX_OPERATOR_THRESHOLD, epoch));
    }

    function _getIsOperatorKey(uint256 epoch, address account) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(PREFIX_IS_OPERATOR, epoch, account));
    }

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

    function _operatorEpoch() internal view returns (uint256) {
        return getUint(KEY_OPERATOR_EPOCH);
    }

    function _getOperator(uint256 epoch, uint256 index) internal view returns (address) {
        return getAddress(_getOperatorKey(epoch, index));
    }

    function _getOperatorCount(uint256 epoch) internal view returns (uint256) {
        return getUint(_getOperatorCountKey(epoch));
    }

    function _getOperatorThreshold(uint256 epoch) internal view returns (uint256) {
        return getUint(_getOperatorThresholdKey(epoch));
    }

    function _isOperator(uint256 epoch, address account) internal view returns (bool) {
        return getBool(_getIsOperatorKey(epoch, account));
    }

    /// @dev Returns true if a sufficient quantity of `accounts` are operator in the same `operatorEpoch`, within the last `OLD_KEY_RETENTION + 1` operator epochs.
    function _areValidRecentOperators(address[] memory accounts) internal view returns (bool) {
        uint256 epoch = _operatorEpoch();
        uint256 recentEpochs = OLD_KEY_RETENTION + uint256(1);
        uint256 lowerBoundOperatorEpoch = epoch > recentEpochs ? epoch - recentEpochs : uint256(0);

        while (epoch > lowerBoundOperatorEpoch) {
            if (_areValidOperatorsInEpoch(epoch--, accounts)) return true;
        }

        return false;
    }

    /// @dev Returns true if a sufficient quantity of `accounts` are operator in the `operatorEpoch`.
    function _areValidOperatorsInEpoch(uint256 epoch, address[] memory accounts) internal view returns (bool) {
        uint256 threshold = _getOperatorThreshold(epoch);
        uint256 validSignerCount;

        for (uint256 i; i < accounts.length; ++i) {
            if (_isOperator(epoch, accounts[i]) && ++validSignerCount >= threshold) return true;
        }

        return false;
    }

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

    /// @dev Returns the threshold for a given `operatorEpoch`.
    function operatorThreshold(uint256 epoch) external view override returns (uint256) {
        return _getOperatorThreshold(epoch);
    }

    /// @dev Returns the array of operators within a given `operatorEpoch`.
    function operators(uint256 epoch) public view override returns (address[] memory results) {
        uint256 operatorCount = _getOperatorCount(epoch);
        results = new address[](operatorCount);

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

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

    function _setOperatorEpoch(uint256 epoch) internal {
        _setUint(KEY_OPERATOR_EPOCH, epoch);
    }

    function _setOperator(
        uint256 epoch,
        uint256 index,
        address account
    ) internal {
        _setAddress(_getOperatorKey(epoch, index), account);
    }

    function _setOperatorCount(uint256 epoch, uint256 operatorCount) internal {
        _setUint(_getOperatorCountKey(epoch), operatorCount);
    }

    function _setOperators(
        uint256 epoch,
        address[] memory accounts,
        uint256 threshold
    ) internal {
        uint256 accountLength = accounts.length;

        if (accountLength < threshold) revert InvalidOperators();

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

        _setOperatorThreshold(epoch, threshold);
        _setOperatorCount(epoch, accountLength);

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

            // Check that the account wasn't already set as an operator for this operatorEpoch.
            if (_isOperator(epoch, account)) revert DuplicateOperator(account);

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

            // Set this account as the i-th operator in this operatorEpoch (needed so we can get all the operators for `operators`).
            _setOperator(epoch, i, account);
            _setIsOperator(epoch, account, true);
        }
    }

    function _setOperatorThreshold(uint256 epoch, uint256 threshold) internal {
        _setUint(_getOperatorThresholdKey(epoch), threshold);
    }

    function _setIsOperator(
        uint256 epoch,
        address account,
        bool isOperator
    ) internal {
        _setBool(_getIsOperatorKey(epoch, account), isOperator);
    }

    /**********************\
    |* Self Functionality *|
    \**********************/

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

        _deployToken(name, symbol, decimals, cap, tokenAddr);
    }

    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));

        _burnToken(symbol, 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));

        _approveContractCall(
            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));

        _approveContractCallWithMint(
            commandId,
            sourceChain,
            sourceAddress,
            contractAddress,
            payloadHash,
            symbol,
            amount,
            sourceTxHash,
            sourceEventIndex
        );
    }

    function transferOwnership(bytes calldata params, bytes32) external onlySelf {
        (address[] memory newOwners, uint256 newThreshold) = abi.decode(params, (address[], uint256));

        uint256 epoch = _ownerEpoch();

        emit OwnershipTransferred(owners(epoch), _getOwnerThreshold(epoch), newOwners, newThreshold);

        _setOwnerEpoch(++epoch);
        _setOwners(epoch, newOwners, newThreshold);
    }

    function transferOperatorship(bytes calldata params, bytes32) external onlySelf {
        (address[] memory newOperators, uint256 newThreshold) = abi.decode(params, (address[], uint256));

        uint256 epoch = _operatorEpoch();

        emit OperatorshipTransferred(operators(epoch), _getOperatorThreshold(epoch), newOperators, newThreshold);

        _setOperatorEpoch(++epoch);
        _setOperators(epoch, newOperators, newThreshold);
    }

    /**************************\
    |* External Functionality *|
    \**************************/

    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,
            address[] memory ownerAddresses,
            uint256 newOwnerThreshold,
            address[] memory operatorAddresses,
            uint256 newOperatorThreshold
        ) = abi.decode(params, (address[], uint256, address[], uint256, address[], uint256));

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

        uint256 newOwnerEpoch = _ownerEpoch() + uint256(1);
        _setOwnerEpoch(newOwnerEpoch);
        _setOwners(newOwnerEpoch, ownerAddresses, newOwnerThreshold);

        uint256 newOperatorEpoch = _operatorEpoch() + uint256(1);
        _setOperatorEpoch(newOperatorEpoch);
        _setOperators(newOperatorEpoch, operatorAddresses, newOperatorThreshold);

        emit OwnershipTransferred(new address[](uint256(0)), uint256(0), ownerAddresses, newOwnerThreshold);
        emit OperatorshipTransferred(new address[](uint256(0)), uint256(0), operatorAddresses, newOperatorThreshold);

        // We would need to delete AXL token for the very release and therefore and re-deploy it
        // with the latest token code that has the potential to support token refund in the future.
        // This is a one-time thing and should be gotten rid of right after release.
        _setTokenAddress('AXL', address(0));
    }

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

        _execute(data, signatures);
    }

    function _execute(bytes memory data, bytes[] memory signatures) internal {
        uint256 signatureCount = signatures.length;

        address[] memory signers = new address[](signatureCount);

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

        for (uint256 i; i < signatureCount; ++i) {
            signers[i] = ECDSA.recover(messageHash, signatures[i]);
        }

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

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

        if (!_isSortedAscAndContainsNoDuplicate(signers)) revert MalformedSigners();

        uint256 commandsLength = commandIds.length;

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

        bool areValidCurrentOwners;
        bool areValidRecentOwners;
        bool areValidRecentOperators;

        if (signersRole == Role.Owner) {
            areValidCurrentOwners = _areValidOwnersInEpoch(_ownerEpoch(), signers);
            areValidRecentOwners = areValidCurrentOwners || _areValidPreviousOwners(signers);
        } else if (signersRole == Role.Operator) {
            areValidRecentOperators = _areValidRecentOperators(signers);
        }

        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) {
                if (!areValidRecentOwners) continue;

                commandSelector = AxelarGatewayMultisig.deployToken.selector;
            } else if (commandHash == SELECTOR_MINT_TOKEN) {
                if (!areValidRecentOperators && !areValidRecentOwners) continue;

                commandSelector = AxelarGatewayMultisig.mintToken.selector;
            } else if (commandHash == SELECTOR_APPROVE_CONTRACT_CALL) {
                if (!areValidRecentOperators && !areValidRecentOwners) continue;

                commandSelector = AxelarGatewayMultisig.approveContractCall.selector;
            } else if (commandHash == SELECTOR_APPROVE_CONTRACT_CALL_WITH_MINT) {
                if (!areValidRecentOperators && !areValidRecentOwners) continue;

                commandSelector = AxelarGatewayMultisig.approveContractCallWithMint.selector;
            } else if (commandHash == SELECTOR_BURN_TOKEN) {
                if (!areValidRecentOperators && !areValidRecentOwners) continue;

                commandSelector = AxelarGatewayMultisig.burnToken.selector;
            } else if (commandHash == SELECTOR_TRANSFER_OWNERSHIP) {
                if (!areValidCurrentOwners) continue;

                commandSelector = AxelarGatewayMultisig.transferOwnership.selector;
            } else if (commandHash == SELECTOR_TRANSFER_OPERATORSHIP) {
                if (!areValidCurrentOwners) continue;

                commandSelector = AxelarGatewayMultisig.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);
            (bool success, ) = address(this).call(abi.encodeWithSelector(commandSelector, params[i], commandId));
            _setCommandExecuted(commandId, success);

            if (success) {
                emit Executed(commandId);
            }
        }
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"tokenDeployer","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":"address","name":"operator","type":"address"}],"name":"DuplicateOperator","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"DuplicateOwner","type":"error"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"InvalidAdminThreshold","type":"error"},{"inputs":[],"name":"InvalidAdmins","type":"error"},{"inputs":[],"name":"InvalidAmount","type":"error"},{"inputs":[],"name":"InvalidChainId","type":"error"},{"inputs":[],"name":"InvalidCodeHash","type":"error"},{"inputs":[],"name":"InvalidCommands","type":"error"},{"inputs":[],"name":"InvalidOperatorThreshold","type":"error"},{"inputs":[],"name":"InvalidOperators","type":"error"},{"inputs":[],"name":"InvalidOwnerThreshold","type":"error"},{"inputs":[],"name":"InvalidOwners","type":"error"},{"inputs":[],"name":"InvalidS","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[],"name":"InvalidSignatureLength","type":"error"},{"inputs":[],"name":"InvalidTokenDeployer","type":"error"},{"inputs":[],"name":"InvalidV","type":"error"},{"inputs":[],"name":"MalformedSigners","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"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"TokenIsFrozen","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AccountBlacklisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AccountWhitelisted","type":"event"},{"anonymous":false,"inputs":[],"name":"AllTokensFrozen","type":"event"},{"anonymous":false,"inputs":[],"name":"AllTokensUnfrozen","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"}],"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":"address[]","name":"preOperators","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"prevThreshold","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"newOperators","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"OperatorshipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"preOwners","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"prevThreshold","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"newOwners","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"OwnershipTransferred","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"}],"name":"TokenFrozen","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":false,"internalType":"string","name":"symbol","type":"string"}],"name":"TokenUnfrozen","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":"view","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":[{"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":[],"name":"freezeAllTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"freezeToken","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":[],"name":"operatorEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"operatorThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"operators","outputs":[{"internalType":"address[]","name":"results","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"ownerThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"owners","outputs":[{"internalType":"address[]","name":"results","type":"address[]"}],"stateMutability":"view","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":"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":[{"internalType":"string","name":"symbol","type":"string"}],"name":"tokenFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"params","type":"bytes"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"transferOperatorship","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"params","type":"bytes"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unfreezeAllTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"unfreezeToken","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"}]

60a06040523480156200001157600080fd5b50604051620053bb380380620053bb833981016040819052620000349162000071565b806001600160a01b0381163b6200005e57604051630c84dabf60e31b815260040160405180910390fd5b6001600160a01b031660805250620000a3565b6000602082840312156200008457600080fd5b81516001600160a01b03811681146200009c57600080fd5b9392505050565b6080516152fc620000bf6000396000612c2a01526152fc6000f3fe608060405234801561001057600080fd5b50600436106102535760003560e01c8063886a625d11610146578063bc00c216116100c3578063d6dfcf6c11610087578063d6dfcf6c14610581578063dc97d96214610589578063e28d4906146105a9578063e3dfa299146105bc578063f6a5f9f5146105c4578063fbe0a31b146105d757600080fd5b8063bc00c21614610520578063bd02d0f514610533578063c031a18014610553578063d26ff21014610566578063d2bc37f81461057957600080fd5b8063986e791a1161010a578063986e791a146104865780639ded06df146104a6578063a3499c73146104b9578063aa1e1f0a146104cc578063b54170841461050d57600080fd5b8063886a625d1461042757806388b305871461043a5780638b4dbbc81461044d578063935b13f61461046057806397b87ba61461047357600080fd5b8063364940d8116101d4578063646c5d3411610198578063646c5d34146103b85780637ae1cfca146103cb5780637b1b769e146103ee5780637e8c8118146104015780638608fe271461041457600080fd5b8063364940d81461036f5780634656ae2e14610377578063585a9fd41461038a5780635c60da1b1461039d5780635f6970c3146103a557600080fd5b80631876eed91161021b5780631876eed9146102d25780631c92115f146102f557806321f8a7211461030857806326ef699d1461034957806334ff69831461035c57600080fd5b8063025e7c271461025857806309c5eabe146102815780630fb7f49014610296578063146e2d78146102ac57806314bfd6d0146102bf575b600080fd5b61026b610266366004613b93565b6105ea565b6040516102789190613bf0565b60405180910390f35b61029461028f366004613c4b565b610693565b005b61029e6106b6565b604051908152602001610278565b6102946102ba366004613c8c565b6106c5565b61026b6102cd366004613b93565b61070e565b6102e56102e0366004613cd7565b6107b0565b6040519015158152602001610278565b610294610303366004613d8b565b6108d9565b610331610316366004613b93565b6000908152600260205260409020546001600160a01b031690565b6040516001600160a01b039091168152602001610278565b610294610357366004613e24565b610944565b61029461036a366004613c4b565b6109dc565b61029e610b72565b610294610385366004613c8c565b610b7c565b610294610398366004613c8c565b610bc0565b610331610c23565b6102e56103b3366004613ec6565b610c7a565b6102946103c6366004613c4b565b610d27565b6102e56103d9366004613b93565b60009081526004602052604090205460ff1690565b6102e56103fc36600461400a565b610ead565b61029461040f366004613c8c565b610ec1565b61029e610422366004613b93565b610f6c565b610294610435366004613c8c565b610f77565b61029e610448366004613b93565b610fca565b61029e61045b366004613b93565b610fd5565b61033161046e36600461400a565b610fe0565b610294610481366004613c8c565b610fee565b610499610494366004613b93565b611099565b6040516102789190614096565b6102946104b4366004613c4b565b61113b565b6102946104c73660046140be565b611312565b6000805160206152a783398151915260005260046020527fa0b596b8942d6ef5cc77ce0ad89a75f0bfcc7f0132cd8db58e8449dcf04a858a5460ff166102e5565b61029461051b366004614119565b611558565b6102e561052e3660046141e4565b61160e565b61029e610541366004613b93565b60009081526020819052604090205490565b610499610561366004613b93565b6116e1565b6102e5610574366004613b93565b6116fe565b61029461170c565b61029e611850565b61029e610597366004613b93565b60009081526005602052604090205490565b61026b6105b7366004613b93565b61185a565b6102946118fc565b6102e56105d23660046142b1565b611a40565b6102946105e5366004613c8c565b611ac9565b606060006105f783611b17565b9050806001600160401b0381111561061157610611613f47565b60405190808252806020026020018201604052801561063a578160200160208202803683370190505b50915060005b8181101561068c576106528482611b25565b83828151811061066457610664614347565b6001600160a01b039092166020928302919091019091015261068581614373565b9050610640565b5050919050565b6000806106a2838501856143b1565b915091506106b08282611b3b565b50505050565b60006106c06120cb565b905090565b3330146106e5576040516314e1dbf760e11b815260040160405180910390fd5b600080806106f585870187614495565b925092509250610706838383612119565b505050505050565b6060600061071b8361226f565b9050806001600160401b0381111561073557610735613f47565b60405190808252806020026020018201604052801561075e578160200160208202803683370190505b50915060005b8181101561068c57610776848261227d565b83828151811061078857610788614347565b6001600160a01b03909216602092830291909101909101526107a981614373565b9050610764565b6000806108618b8b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815292508d91508c908190840183828082843760009201919091525050604080516020601f8d018190048102820181019092528b81523393508d9250908c908c90819084018382808284376000920191909152508c925061228c915050565b60008181526004602052604090205460ff169250905081156108cb576108888160006122f0565b6108cb85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152503392508791506121199050565b509998505050505050505050565b81816040516108e99291906144ee565b6040518091039020336001600160a01b03167f30ae6cc78c27e651745bf2ad08a11de83910ac1e347a52f7ac898c0fbef94dae88888888888860405161093496959493929190614527565b60405180910390a3505050505050565b6109863384848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869250612310915050565b336001600160a01b03167f651d93f66c4329630e8d0f62488eff599e3be484da587335e8dc0fcf46062726888888888888886040516109cb9796959493929190614570565b60405180910390a250505050505050565b60006109e661256f565b90506109f281336125bd565b610a0f57604051637bfa4b9f60e01b815260040160405180910390fd5b60008036604051610a219291906144ee565b60405180910390209050610a368282336125cc565b15610a5457604051637c9a1cf960e01b815260040160405180910390fd5b610a6182823360016125e4565b60006001610a6f84846125f8565b610a7991906145c1565b9050610a86838383612607565b610a8f8361262c565b811015610a9d575050505050565b610ae6610adf86868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061263a92505050565b60006122f0565b7f5327e3af9cd2d5c19a8dff23ef487d7a4d5f6fc985464f1792a33c21205759898585604051610b179291906145d9565b60405180910390a1610b2b83836000612607565b6000610b368461226f565b905060005b81811015610b6957610b598585610b52888561227d565b60006125e4565b610b6281614373565b9050610b3b565b50505050505050565b60006106c061256f565b333014610b9c576040516314e1dbf760e11b815260040160405180910390fd5b600080610bab848601866145ed565b91509150610bb9828261268c565b5050505050565b333014610be0576040516314e1dbf760e11b815260040160405180910390fd5b600080808080808080610bf58a8c018c614631565b97509750975097509750975097509750610c16898989898989898989612939565b5050505050505050505050565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60005260026020527f11141f466c69fd409e1990e063b49cd6d61ed2ecff27a2e402e259ca6b9a01a3546001600160a01b031690565b600080610cf58888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8c018190048102820181019092528a815292508a91508990819084018382808284376000920191909152503392508991506129a09050565b60008181526004602052604090205460ff16925090508115610d1c57610d1c8160006122f0565b509695505050505050565b6000610d3161256f565b9050610d3d81336125bd565b610d5a57604051637bfa4b9f60e01b815260040160405180910390fd5b60008036604051610d6c9291906144ee565b60405180910390209050610d818282336125cc565b15610d9f57604051637c9a1cf960e01b815260040160405180910390fd5b610dac82823360016125e4565b60006001610dba84846125f8565b610dc491906145c1565b9050610dd1838383612607565b610dda8361262c565b811015610de8575050505050565b610e31610e2a86868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061263a92505050565b60016122f0565b7f11260c92ecb021c33706db3a9699410f343d5f2175201a4551fe7634347a0cf18585604051610e629291906145d9565b60405180910390a1610e7683836000612607565b6000610e818461226f565b905060005b81811015610b6957610e9d8585610b52888561227d565b610ea681614373565b9050610e86565b6000610ebb6103d98361263a565b92915050565b333014610ee1576040516314e1dbf760e11b815260040160405180910390fd5b600080610ef084860186614752565b915091506000610efe6129fe565b90507fd167b96814cd24898418cc293e8d47d54afe6dcf0631283f0830e1eae621f6bd610f2a826105ea565b610f3383612a4c565b8585604051610f459493929190614787565b60405180910390a1610f61610f5982614373565b915081612a5a565b610706818484612aaa565b6000610ebb82612baa565b333014610f97576040516314e1dbf760e11b815260040160405180910390fd5b600080808080610fa9878901896147c4565b94509450945094509450610fc08585858585612bb8565b5050505050505050565b6000610ebb8261262c565b6000610ebb82612a4c565b6000610ebb61031683612dc7565b33301461100e576040516314e1dbf760e11b815260040160405180910390fd5b60008061101d84860186614752565b91509150600061102b6120cb565b90507fe7475da747ead33c03118a4b2cca5e521e930dd8ddc556751fe12d1e8395db2c6110578261185a565b61106083612baa565b85856040516110729493929190614787565b60405180910390a161108e61108682614373565b915081612dfc565b610706818484612e49565b60008181526001602052604090208054606091906110b69061485e565b80601f01602080910402602001604051908101604052809291908181526020018280546110e29061485e565b801561112f5780601f106111045761010080835404028352916020019161112f565b820191906000526020600020905b81548152906001019060200180831161111257829003601f168201915b50505050509050919050565b6000611145610c23565b6001600160a01b0316141561116d57604051635f886e9d60e11b815260040160405180910390fd5b6000808080808061118087890189614899565b9550955095509550955095506000600161119861256f565b6111a291906145c1565b90506111f5817fd51dc9b187568bb94760866e1d0d066ca470037d2d331afb1a02ec74bfb8990c60009081526020527ff8d0c05cd32e3272241fdc9d5839565f8bcf94139cb4bd09e230e1b57a60ddc255565b611200818888612f49565b6000600161120c6129fe565b61121691906145c1565b905061122181612a5a565b61122c818787612aaa565b600060016112386120cb565b61124291906145c1565b905061124d81612dfc565b611258818686612e49565b60408051600080825260208201928390527fd167b96814cd24898418cc293e8d47d54afe6dcf0631283f0830e1eae621f6bd9261129a9291908b908b90614787565b60405180910390a160408051600080825260208201928390527fe7475da747ead33c03118a4b2cca5e521e930dd8ddc556751fe12d1e8395db2c926112e492919089908990614787565b60405180910390a1610c166040518060400160405280600381526020016210561360ea1b8152506000613049565b600061131c61256f565b905061132881336125bd565b61134557604051637bfa4b9f60e01b815260040160405180910390fd5b600080366040516113579291906144ee565b6040518091039020905061136c8282336125cc565b1561138a57604051637c9a1cf960e01b815260040160405180910390fd5b61139782823360016125e4565b600060016113a584846125f8565b6113af91906145c1565b90506113bc838383612607565b6113c58361262c565b8110156113d4575050506106b0565b866001600160a01b03163f86146113fe576040516323e13ec960e21b815260040160405180910390fd5b6040516001600160a01b038816907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28315611501576000876001600160a01b0316639ded06df60e01b878760405160240161145f9291906145d9565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161149d919061493c565b600060405180830381855af49150503d80600081146114d8576040519150601f19603f3d011682016040523d82523d6000602084013e6114dd565b606091505b50509050806114ff576040516397905dfb60e01b815260040160405180910390fd5b505b61150a8761305f565b61151683836000612607565b60006115218461226f565b905060005b8181101561154d5761153d8585610b52888561227d565b61154681614373565b9050611526565b505050505050505050565b61159a3384848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869250612310915050565b84846040516115aa9291906144ee565b6040518091039020336001600160a01b03167f7e50569d26be643bda7757722291ec66b1be66d8283474ae3fab5a98f878a7a28b8b8b8b8b8b8b8b8b6040516115fb99989796959493929190614958565b60405180910390a3505050505050505050565b60006116d26103d98c8c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8d018190048102820181019092528b81528e93508d9250908c908c90819084018382808284376000920191909152508c925061228c915050565b9b9a5050505050505050505050565b60008181526003602052604090208054606091906110b69061485e565b6000610ebb6103d983613089565b600061171661256f565b905061172281336125bd565b61173f57604051637bfa4b9f60e01b815260040160405180910390fd5b600080366040516117519291906144ee565b604051809103902090506117668282336125cc565b1561178457604051637c9a1cf960e01b815260040160405180910390fd5b61179182823360016125e4565b6000600161179f84846125f8565b6117a991906145c1565b90506117b6838383612607565b6117bf8361262c565b8110156117cb57505050565b6117e46000805160206152a783398151915260016122f0565b6040517f9f428b56ca209118783db391e8a5a62827b6b218add33411061060d308af6ead90600090a161181983836000612607565b60006118248461226f565b905060005b81811015610bb9576118408585610b52888561227d565b61184981614373565b9050611829565b60006106c06129fe565b60606000611867836130c4565b9050806001600160401b0381111561188157611881613f47565b6040519080825280602002602001820160405280156118aa578160200160208202803683370190505b50915060005b8181101561068c576118c284826130d2565b8382815181106118d4576118d4614347565b6001600160a01b03909216602092830291909101909101526118f581614373565b90506118b0565b600061190661256f565b905061191281336125bd565b61192f57604051637bfa4b9f60e01b815260040160405180910390fd5b600080366040516119419291906144ee565b604051809103902090506119568282336125cc565b1561197457604051637c9a1cf960e01b815260040160405180910390fd5b61198182823360016125e4565b6000600161198f84846125f8565b61199991906145c1565b90506119a6838383612607565b6119af8361262c565b8110156119bb57505050565b6119d46000805160206152a783398151915260006122f0565b6040517f0e821ff109470f6aa1aebb161aa0e7328b1a8552aa48e09ed2d03184ecece9a690600090a1611a0983836000612607565b6000611a148461226f565b905060005b81811015610bb957611a308585610b52888561227d565b611a3981614373565b9050611a19565b6000611abd6103d98989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8d018190048102820181019092528b815292508b91508a90819084018382808284376000920191909152508a92508991506129a09050565b98975050505050505050565b333014611ae9576040516314e1dbf760e11b815260040160405180910390fd5b60008080808080611afc888a018a6149c0565b95509550955095509550955061154d878787878787876130e1565b6000610ebb61054183613140565b6000611b34610316848461317b565b9392505050565b80516000816001600160401b03811115611b5757611b57613f47565b604051908082528060200260200182016040528015611b80578160200160208202803683370190505b5090506000611b9585805190602001206131d7565b905060005b83811015611bff57611bc582868381518110611bb857611bb8614347565b6020026020010151613212565b838281518110611bd757611bd7614347565b6001600160a01b0390921660209283029190910190910152611bf881614373565b9050611b9a565b50600080600080600089806020019051810190611c1c9190614bb4565b94509450945094509450468514611c4657604051633d23e4d160e11b815260040160405180910390fd5b611c4f87613351565b611c6c5760405163c6fb539360e01b815260040160405180910390fd5b8251825181141580611c7f575081518114155b15611c9d5760405163ca9a28f560e01b815260040160405180910390fd5b600080806001886002811115611cb557611cb5614cb5565b1415611ce557611ccc611cc66129fe565b8c6133e1565b92508280611cde5750611cde8b613463565b9150611d0b565b6002886002811115611cf957611cf9614cb5565b1415611d0b57611d088b6134e5565b90505b60005b848110156120ba576000888281518110611d2a57611d2a614347565b60200260200101519050611d3d816116fe565b15611d4857506120aa565b600080898481518110611d5d57611d5d614347565b6020026020010151604051602001611d75919061493c565b6040516020818303038152906040528051906020012090507f5763814b98a3aa86f212797af3273868b5dd6e2a532d764a79b98ca859e7bbad811415611dd15785611dc2575050506120aa565b63886a625d60e01b9150611fa1565b7fec78d9c22c08bb9f0ecd5d95571ae83e3f22219c5a9278c3270691d50abfd91b811415611e215784158015611e05575085155b15611e12575050506120aa565b63028dc5af60e31b9150611fa1565b7f37ac16aabc4d87540e53151b2b716265cfd6b195db96a9daf8e893c829bbd233811415611e715784158015611e55575085155b15611e62575050506120aa565b63fbe0a31b60e01b9150611fa1565b7ff41504255b911b3042ee4f8786fdf7cf4bcf24ace033fa16af3c8574e025e436811415611ec15784158015611ea5575085155b15611eb2575050506120aa565b631616a7f560e21b9150611fa1565b7fda199c0e76f665e0450020791c7f8eacc75f3cdbace313272c28f93e5390b62c811415611f115784158015611ef5575085155b15611f02575050506120aa565b63232b571760e11b9150611fa1565b7f1d4a390f291e2e1f29874769efdef47ddad94d76f77ff516fad206a385e8995f811415611f555786611f46575050506120aa565b630fd1902360e31b9150611fa1565b7fb460dcb6fd5797fc0e7ea0f13406c80d30702ba7f73a42bd91394775dcbca718811415611f995786611f8a575050506120aa565b634bdc3dd360e11b9150611fa1565b5050506120aa565b611fac836001613551565b6000306001600160a01b0316838b8781518110611fcb57611fcb614347565b602002602001015186604051602401611fe5929190614ccb565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612023919061493c565b6000604051808303816000865af19150503d8060008114612060576040519150601f19603f3d011682016040523d82523d6000602084013e612065565b606091505b505090506120738482613551565b80156120a55760405184907fa74c8847d513feba22a0f0cb38d53081abf97562cdb293926ba243689e7c41ca90600090a25b505050505b6120b381614373565b9050611d0e565b505050505050505050505050505050565b7f5369fb791f26307f8e69b07625302ccac6930af09ab22d753b17d2042e9992e760009081526020527f07174c149a4f7627ac1dd39b679bd42f12fc4e8d7e850b055662bbee7188da105490565b600061212484610fe0565b90506001600160a01b038116612158578360405163395d09bf60e11b815260040161214f9190614096565b60405180910390fd5b60026121638561355d565b600281111561217457612174614cb5565b1415612211576121838461357c565b6040516001600160a01b0384166024820152604481018390526000906121e990839063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526135e8565b90508061220b57846040516390c52ed760e01b815260040161214f9190614096565b506106b0565b6040516340c10f1960e01b81526001600160a01b038481166004830152602482018490528216906340c10f1990604401600060405180830381600087803b15801561225b57600080fd5b505af1158015610fc0573d6000803e3d6000fd5b6000610ebb6105418361367a565b6000611b3461031684846136b5565b60007fb7ad972b71475860613db3ba1fe699b886c878f9002a09250dc25e769eb19a10888888888888886040516020016122cd989796959493929190614ced565b604051602081830303815290604052805190602001209050979650505050505050565b600091825260046020526040909120805460ff1916911515919091179055565b600061231b83610fe0565b90506001600160a01b038116612346578260405163395d09bf60e11b815260040161214f9190614096565b816123645760405163162908e360e11b815260040160405180910390fd5b600061236f8461355d565b90506000600282600281111561238757612387614cb5565b14156123ee576123968561357c565b6040516001600160a01b0387166024820152306044820152606481018590526123cc9084906323b872dd60e01b906084016121b2565b905080610706578460405163e217b0ad60e01b815260040161214f9190614096565b600182600281111561240257612402614cb5565b1415612438576040516001600160a01b0387166024820152604481018590526123cc90849063079cc67960e41b906064016121b2565b604051630c7bb2bd60e21b8152600060048201526124ea9084906323b872dd60e01b9089906001600160a01b038416906331eecaf49060240160206040518083038186803b15801561248957600080fd5b505afa15801561249d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124c19190614d61565b6040516001600160a01b03928316602482015291166044820152606481018890526084016121b2565b90508061250c578460405163e217b0ad60e01b815260040161214f9190614096565b6040516308a1eee160e01b8152600060048201526001600160a01b038416906308a1eee1906024015b600060405180830381600087803b15801561254f57600080fd5b505af1158015612563573d6000803e3d6000fd5b50505050505050505050565b7fd51dc9b187568bb94760866e1d0d066ca470037d2d331afb1a02ec74bfb8990c60009081526020527ff8d0c05cd32e3272241fdc9d5839565f8bcf94139cb4bd09e230e1b57a60ddc25490565b6000611b346103d984846136f7565b60006125dc6103d985858561372e565b949350505050565b6106b06125f285858561372e565b826122f0565b6000611b3461054184846137a2565b61262761261484846137a2565b8260009182526020829052604090912055565b505050565b6000610ebb610541836137e4565b60007f1a7261d3a36c4ce4235d10859911c9444a6963a3591ec5725b96871d9810626b8260405160200161266f929190614d7e565b604051602081830303815290604052805190602001209050919050565b600061269783610fe0565b90506001600160a01b0381166126c2578260405163395d09bf60e11b815260040161214f9190614096565b60026126cd8461355d565b60028111156126de576126de614cb5565b14156128e3576126ed8361357c565b6000826040516126fc90613b86565b8190604051809103906000f590508015801561271c573d6000803e3d6000fd5b506040516370a0823160e01b81526001600160a01b038083166004830181905292935060009283929091631cff79cd91879163a9059cbb60e01b9130918416906370a082319060240160206040518083038186803b15801561277d57600080fd5b505afa158015612791573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127b59190614da4565b6040516001600160a01b039092166024830152604482015260640160408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e085901b90921682526128169291600401614dbd565b600060405180830381600087803b15801561283057600080fd5b505af1158015612844573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261286c9190810190614df1565b9150915081158061289957508051158015906128995750808060200190518101906128979190614e3e565b155b156128b9578560405163e217b0ad60e01b815260040161214f9190614096565b60405162f55d9d60e01b81523060048201526001600160a01b0384169062f55d9d90602401612535565b6040516308a1eee160e01b8152600481018390526001600160a01b038216906308a1eee190602401600060405180830381600087803b15801561292557600080fd5b505af1158015610b69573d6000803e3d6000fd5b6129488989898989898961381f565b84866001600160a01b03168a7f9991faa1f435675159ffae64b66d7ecfdb55c29755869a18db8497b4392347e08b8b8989898960405161298d96959493929190614e59565b60405180910390a4505050505050505050565b60007f07b0d4304f82012bd3b70b1d531c160e326067c90829e2a3d386722ad10b89c386868686866040516020016129dd96959493929190614eb1565b60405160208183030381529060405280519060200120905095945050505050565b7f67cbdff49954077d2dd5637524b03bfe3e6506d456859017a888fad567e1af0360009081526020527f06f01c2f096e745c2a207fbf93babd5e7ee6acfd26f0f34a0e4ac68373c21d0e5490565b6000610ebb61054183613831565b7f67cbdff49954077d2dd5637524b03bfe3e6506d456859017a888fad567e1af0360009081526020527f06f01c2f096e745c2a207fbf93babd5e7ee6acfd26f0f34a0e4ac68373c21d0e55565b50565b815181811015612acd5760405163f02e8ac160e01b815260040160405180910390fd5b81612aeb576040516393fbd05560e01b815260040160405180910390fd5b612af5848361386c565b612aff8482613878565b60005b81811015610bb9576000848281518110612b1e57612b1e614347565b60200260200101519050612b328682613884565b15612b5b57604051632029bc6560e01b81526001600160a01b038216600482015260240161214f565b6001600160a01b038116612b825760405163f02e8ac160e01b815260040160405180910390fd5b612b8d868383613893565b612b99868260016138c7565b50612ba381614373565b9050612b02565b6000610ebb610541836138d4565b6000612bc385610fe0565b6001600160a01b031614612bec578360405163553f459960e11b815260040161214f9190614096565b6001600160a01b038116612d3f57600084604051602001612c0d919061493c565b6040516020818303038152906040528051906020012090506000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636fc95b3460e01b8989898988604051602401612c73959493929190614f01565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612cb1919061493c565b600060405180830381855af49150503d8060008114612cec576040519150601f19603f3d011682016040523d82523d6000602084013e612cf1565b606091505b509150915081612d1657866040516386d5274360e01b815260040161214f9190614096565b80806020019051810190612d2a9190614d61565b9350612d3787600161390f565b505050612d7d565b6001600160a01b0381163b612d72576040516362e66eef60e11b81526001600160a01b038216600482015260240161214f565b612d7d84600261390f565b612d878482613049565b7fbf90b5a1ec9763e8bf4b9245cef0c28db92bab309fc2c5177f17814f382469388482604051612db8929190614f47565b60405180910390a15050505050565b60007fc4e632779a6a7838736dd7e5e6a0eadf171dd37dfb6230720e265576dfcf42bb8260405160200161266f929190614d7e565b7f5369fb791f26307f8e69b07625302ccac6930af09ab22d753b17d2042e9992e760009081526020527f07174c149a4f7627ac1dd39b679bd42f12fc4e8d7e850b055662bbee7188da1055565b815181811015612e6c57604051630849699d60e11b815260040160405180910390fd5b81612e8a57604051639fc9617760e01b815260040160405180910390fd5b612e94848361393f565b612e9e848261394b565b60005b81811015610bb9576000848281518110612ebd57612ebd614347565b60200260200101519050612ed18682613957565b15612efa5760405163482e704d60e11b81526001600160a01b038216600482015260240161214f565b6001600160a01b038116612f2157604051630849699d60e11b815260040160405180910390fd5b612f2c868383613966565b612f3886826001613973565b50612f4281614373565b9050612ea1565b815181811015612f6c5760405163f1965a0760e01b815260040160405180910390fd5b81612f8a57604051631845300d60e01b815260040160405180910390fd5b612f948483613980565b612f9e848261398c565b60005b81811015610bb9576000848281518110612fbd57612fbd614347565b60200260200101519050612fd186826125bd565b15612ffa57604051632124936f60e11b81526001600160a01b038216600482015260240161214f565b6001600160a01b0381166130215760405163f1965a0760e01b815260040160405180910390fd5b61302c868383613998565b613038868260016139a5565b5061304281614373565b9050612fa1565b61305b61305583612dc7565b826139b2565b5050565b612aa77f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc826139b2565b604080517f957705a374326b30f4a1069c936d736cc9993ed6c820b4e0e2fd94a8beca0d1d602082015290810182905260009060600161266f565b6000610ebb610541836139e0565b6000611b346103168484613a1b565b6130ee8787878787613a5d565b82846001600160a01b0316887f44e4f8f6bd682c5a3aeba93601ab07cb4d1f21b2aab1ae4880d9577919309aa48989878760405161312f9493929190614f71565b60405180910390a450505050505050565b604080517f4ededbb904acd1258c7b9a6b12f5a8a8870a8ec295809cf35dc1f098018d4d20602082015290810182905260009060600161266f565b604080517f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c06020820152908101839052606081018290526000906080015b60405160208183030381529060405280519060200120905092915050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c0161266f565b6000815160411461323657604051634be6321b60e01b815260040160405180910390fd5b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115613289576040516308183ce960e31b815260040160405180910390fd5b8060ff16601b141580156132a157508060ff16601c14155b156132bf5760405163119bce3960e01b815260040160405180910390fd5b6040805160008082526020820180845289905260ff841692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa158015613313573d6000803e3d6000fd5b505050602060405103519450846001600160a01b0316141561334857604051638baa579f60e01b815260040160405180910390fd5b50505092915050565b6000805b600183516133639190614faa565b8110156133d857826133768260016145c1565b8151811061338657613386614347565b60200260200101516001600160a01b03168382815181106133a9576133a9614347565b60200260200101516001600160a01b0316106133c85750600092915050565b6133d181614373565b9050613355565b50600192915050565b6000806133ed84612a4c565b90506000805b84518110156134575761341f8686838151811061341257613412614347565b6020026020010151613884565b801561343657508261343083614373565b92508210155b156134475760019350505050610ebb565b61345081614373565b90506133f3565b50600095945050505050565b60008061346e6129fe565b9050600061347e600160106145c1565b9050600081831161349057600061349a565b61349a8284614faa565b90506134a583614fc1565b92505b808311156134da576134c5836134bd81614fc1565b9450866133e1565b156134d557506001949350505050565b6134a8565b506000949350505050565b6000806134f06120cb565b90506000613500600160106145c1565b9050600081831161351257600061351c565b61351c8284614faa565b90505b808311156134da5761353c8361353481614fc1565b945086613a6d565b1561354c57506001949350505050565b61351f565b61305b6125f283613089565b600061356b61054183613ae3565b6002811115610ebb57610ebb614cb5565b61358581610ead565b806135c857506000805160206152a783398151915260005260046020527fa0b596b8942d6ef5cc77ce0ad89a75f0bfcc7f0132cd8db58e8449dcf04a858a5460ff165b15612aa75780604051637222d30960e01b815260040161214f9190614096565b6000806000846001600160a01b031684604051613605919061493c565b6000604051808303816000865af19150503d8060008114613642576040519150601f19603f3d011682016040523d82523d6000602084013e613647565b606091505b50915091508180156136715750805115806136715750808060200190518101906136719190614e3e565b95945050505050565b604080517f05112ef894367de1270cfae12afcd2285c225830eb8f74e7e938f721bb510cba602082015290810182905260009060600161266f565b604080517ff23ec0bb4210edd5cba85afd05127efcd2fc6a781bfed49188da1081670b22d86020820152908101839052606081018290526000906080016131b9565b60007f63fa879cb478fddf1de08d49e29115fb768866711bc799ff9ab419a7f16c9afb83836040516020016131b993929190614fd8565b604080517f3ced7a8caf1111e0fbf4b784c5b41aebd0f2389d9f2f64d5c3424aeed3adbd3c6020820152908101849052606080820184905282901b6bffffffffffffffffffffffff191660808201526000906094016040516020818303038152906040528051906020012090509392505050565b604080517fbaea1c6c0f16a0a340b10a9e980806696a68ddbb5e8361fd64630dd21abf515f6020820152908101839052606081018290526000906080016131b9565b604080517f79bd914addd90bd67ad800bf0230bb85ffdef5aeba5fd8249f116d3f17f4fb4b602082015290810182905260009060600161266f565b610b69610e2a8888888888888861228c565b604080517f2bd864201f87ce8cc2d875453b39cc3e981d8ee12e4b7d4b7492fd9404bd8229602082015290810182905260009060600161266f565b61305b61261483613831565b61305b61261483613140565b6000611b346103d98484613b18565b6001600160a01b0381166138ba5760405163e6c4247b60e01b815260040160405180910390fd5b612627613055848461317b565b6126276125f28484613b18565b604080517fc0e594a04ce768761133f7238cd95a55441f8ee2d50a03e7d5c44fb26c04d76f602082015290810182905260009060600161266f565b61305b61391b83613ae3565b82600281111561392d5761392d614cb5565b60009182526020829052604090912055565b61305b612614836138d4565b61305b612614836139e0565b6000611b346103d98484613b4f565b6126276130558484613a1b565b6126276125f28484613b4f565b61305b612614836137e4565b61305b6126148361367a565b61262761305584846136b5565b6126276125f284846136f7565b60009182526002602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b604080517f6199febc552b750a8cf661862e77cb2dbed9f3fb6fcc10bd34f8ff9e1992362b602082015290810182905260009060600161266f565b604080517f46a52cf33029de9f84853745a87af28464c80bf0346df1b32e205fc73319f6226020820152908101839052606081018290526000906080016131b9565b610bb9610e2a86868686866129a0565b600080613a7984612baa565b90506000805b845181101561345757613aab86868381518110613a9e57613a9e614347565b6020026020010151613957565b8015613ac2575082613abc83614373565b92508210155b15613ad35760019350505050610ebb565b613adc81614373565b9050613a7f565b60007fa80d2259af55890618ec2eeb3ac72de4bdba22529bb14845d8a3d712d1c3f6218260405160200161266f929190614d7e565b60007fffbbd206dad2a77ed223a0ff3d2dcac502bc8c9a91fa18140757561e84f365c083836040516020016131b993929190614fd8565b60007f934404a25b467ba4b73107cf91baadb1313f82988678493324b442216995358683836040516020016131b993929190614fd8565b6102a68061500183390190565b600060208284031215613ba557600080fd5b5035919050565b600081518084526020808501945080840160005b83811015613be55781516001600160a01b031687529582019590820190600101613bc0565b509495945050505050565b602081526000611b346020830184613bac565b60008083601f840112613c1557600080fd5b5081356001600160401b03811115613c2c57600080fd5b602083019150836020828501011115613c4457600080fd5b9250929050565b60008060208385031215613c5e57600080fd5b82356001600160401b03811115613c7457600080fd5b613c8085828601613c03565b90969095509350505050565b600080600060408486031215613ca157600080fd5b83356001600160401b03811115613cb757600080fd5b613cc386828701613c03565b909790965060209590950135949350505050565b600080600080600080600080600060c08a8c031215613cf557600080fd5b8935985060208a01356001600160401b0380821115613d1357600080fd5b613d1f8d838e01613c03565b909a50985060408c0135915080821115613d3857600080fd5b613d448d838e01613c03565b909850965060608c0135955060808c0135915080821115613d6457600080fd5b50613d718c828d01613c03565b9a9d999c50979a9699959894979660a00135949350505050565b60008060008060008060608789031215613da457600080fd5b86356001600160401b0380821115613dbb57600080fd5b613dc78a838b01613c03565b90985096506020890135915080821115613de057600080fd5b613dec8a838b01613c03565b90965094506040890135915080821115613e0557600080fd5b50613e1289828a01613c03565b979a9699509497509295939492505050565b60008060008060008060006080888a031215613e3f57600080fd5b87356001600160401b0380821115613e5657600080fd5b613e628b838c01613c03565b909950975060208a0135915080821115613e7b57600080fd5b613e878b838c01613c03565b909750955060408a0135915080821115613ea057600080fd5b50613ead8a828b01613c03565b989b979a50959894979596606090950135949350505050565b60008060008060008060808789031215613edf57600080fd5b8635955060208701356001600160401b0380821115613efd57600080fd5b613f098a838b01613c03565b90975095506040890135915080821115613f2257600080fd5b50613f2f89828a01613c03565b979a9699509497949695606090950135949350505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613f8557613f85613f47565b604052919050565b60006001600160401b03821115613fa657613fa6613f47565b50601f01601f191660200190565b600082601f830112613fc557600080fd5b8135613fd8613fd382613f8d565b613f5d565b818152846020838601011115613fed57600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561401c57600080fd5b81356001600160401b0381111561403257600080fd5b6125dc84828501613fb4565b60005b83811015614059578181015183820152602001614041565b838111156106b05750506000910152565b6000815180845261408281602086016020860161403e565b601f01601f19169290920160200192915050565b602081526000611b34602083018461406a565b6001600160a01b0381168114612aa757600080fd5b600080600080606085870312156140d457600080fd5b84356140df816140a9565b93506020850135925060408501356001600160401b0381111561410157600080fd5b61410d87828801613c03565b95989497509550505050565b600080600080600080600080600060a08a8c03121561413757600080fd5b89356001600160401b038082111561414e57600080fd5b61415a8d838e01613c03565b909b50995060208c013591508082111561417357600080fd5b61417f8d838e01613c03565b909950975060408c013591508082111561419857600080fd5b6141a48d838e01613c03565b909750955060608c01359150808211156141bd57600080fd5b506141ca8c828d01613c03565b9a9d999c50979a9699959894979660800135949350505050565b60008060008060008060008060008060e08b8d03121561420357600080fd5b8a35995060208b01356001600160401b038082111561422157600080fd5b61422d8e838f01613c03565b909b50995060408d013591508082111561424657600080fd5b6142528e838f01613c03565b909950975060608d01359150614267826140a9565b90955060808c0135945060a08c0135908082111561428457600080fd5b506142918d828e01613c03565b9150809450508092505060c08b013590509295989b9194979a5092959850565b600080600080600080600060a0888a0312156142cc57600080fd5b8735965060208801356001600160401b03808211156142ea57600080fd5b6142f68b838c01613c03565b909850965060408a013591508082111561430f57600080fd5b5061431c8a828b01613c03565b9095509350506060880135614330816140a9565b809250506080880135905092959891949750929550565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156143875761438761435d565b5060010190565b60006001600160401b038211156143a7576143a7613f47565b5060051b60200190565b600080604083850312156143c457600080fd5b82356001600160401b03808211156143db57600080fd5b6143e786838701613fb4565b93506020915081850135818111156143fe57600080fd5b8501601f8101871361440f57600080fd5b803561441d613fd38261438e565b81815260059190911b8201840190848101908983111561443c57600080fd5b8584015b83811015614474578035868111156144585760008081fd5b6144668c8983890101613fb4565b845250918601918601614440565b508096505050505050509250929050565b8035614490816140a9565b919050565b6000806000606084860312156144aa57600080fd5b83356001600160401b038111156144c057600080fd5b6144cc86828701613fb4565b93505060208401356144dd816140a9565b929592945050506040919091013590565b8183823760009101908152919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60608152600061453b60608301888a6144fe565b828103602084015261454e8187896144fe565b905082810360408401526145638185876144fe565b9998505050505050505050565b60808152600061458460808301898b6144fe565b828103602084015261459781888a6144fe565b905082810360408401526145ac8186886144fe565b91505082606083015298975050505050505050565b600082198211156145d4576145d461435d565b500190565b6020815260006125dc6020830184866144fe565b6000806040838503121561460057600080fd5b82356001600160401b0381111561461657600080fd5b61462285828601613fb4565b95602094909401359450505050565b600080600080600080600080610100898b03121561464e57600080fd5b88356001600160401b038082111561466557600080fd5b6146718c838d01613fb4565b995060208b013591508082111561468757600080fd5b6146938c838d01613fb4565b98506146a160408c01614485565b975060608b0135965060808b01359150808211156146be57600080fd5b506146cb8b828c01613fb4565b989b979a50959894979660a0860135965060c08601359560e00135945092505050565b600082601f8301126146ff57600080fd5b8135602061470f613fd38361438e565b82815260059290921b8401810191818101908684111561472e57600080fd5b8286015b84811015610d1c578035614745816140a9565b8352918301918301614732565b6000806040838503121561476557600080fd5b82356001600160401b0381111561477b57600080fd5b614622858286016146ee565b60808152600061479a6080830187613bac565b85602084015282810360408401526147b28186613bac565b91505082606083015295945050505050565b600080600080600060a086880312156147dc57600080fd5b85356001600160401b03808211156147f357600080fd5b6147ff89838a01613fb4565b9650602088013591508082111561481557600080fd5b5061482288828901613fb4565b945050604086013560ff8116811461483957600080fd5b9250606086013591506080860135614850816140a9565b809150509295509295909350565b600181811c9082168061487257607f821691505b6020821081141561489357634e487b7160e01b600052602260045260246000fd5b50919050565b60008060008060008060c087890312156148b257600080fd5b86356001600160401b03808211156148c957600080fd5b6148d58a838b016146ee565b97506020890135965060408901359150808211156148f257600080fd5b6148fe8a838b016146ee565b955060608901359450608089013591508082111561491b57600080fd5b5061492889828a016146ee565b92505060a087013590509295509295509295565b6000825161494e81846020870161403e565b9190910192915050565b60a08152600061496c60a083018b8d6144fe565b828103602084015261497f818a8c6144fe565b9050828103604084015261499481888a6144fe565b905082810360608401526149a98186886144fe565b9150508260808301529a9950505050505050505050565b60008060008060008060c087890312156149d957600080fd5b86356001600160401b03808211156149f057600080fd5b6149fc8a838b01613fb4565b97506020890135915080821115614a1257600080fd5b50614a1f89828a01613fb4565b9550506040870135614a30816140a9565b959894975094956060810135955060808101359460a0909101359350915050565b6000614a5f613fd384613f8d565b9050828152838383011115614a7357600080fd5b611b3483602083018461403e565b600082601f830112614a9257600080fd5b81516020614aa2613fd38361438e565b82815260059290921b84018101918181019086841115614ac157600080fd5b8286015b84811015610d1c5780516001600160401b03811115614ae45760008081fd5b8701603f81018913614af65760008081fd5b614b07898683015160408401614a51565b845250918301918301614ac5565b600082601f830112614b2657600080fd5b611b3483835160208501614a51565b600082601f830112614b4657600080fd5b81516020614b56613fd38361438e565b82815260059290921b84018101918181019086841115614b7557600080fd5b8286015b84811015610d1c5780516001600160401b03811115614b985760008081fd5b614ba68986838b0101614b15565b845250918301918301614b79565b600080600080600060a08688031215614bcc57600080fd5b8551945060208087015160038110614be357600080fd5b60408801519095506001600160401b0380821115614c0057600080fd5b818901915089601f830112614c1457600080fd5b8151614c22613fd38261438e565b81815260059190911b8301840190848101908c831115614c4157600080fd5b938501935b82851015614c5f57845182529385019390850190614c46565b60608c01519098509450505080831115614c7857600080fd5b614c848a848b01614a81565b94506080890151925080831115614c9a57600080fd5b5050614ca888828901614b35565b9150509295509295909350565b634e487b7160e01b600052602160045260246000fd5b604081526000614cde604083018561406a565b90508260208301529392505050565b60006101008a8352896020840152806040840152614d0d8184018a61406a565b90508281036060840152614d21818961406a565b6001600160a01b038816608085015260a0840187905283810360c08501529050614d4b818661406a565b9150508260e08301529998505050505050505050565b600060208284031215614d7357600080fd5b8151611b34816140a9565b82815260008251614d9681602085016020870161403e565b919091016020019392505050565b600060208284031215614db657600080fd5b5051919050565b6001600160a01b03831681526040602082018190526000906125dc9083018461406a565b8051801515811461449057600080fd5b60008060408385031215614e0457600080fd5b614e0d83614de1565b915060208301516001600160401b03811115614e2857600080fd5b614e3485828601614b15565b9150509250929050565b600060208284031215614e5057600080fd5b611b3482614de1565b60c081526000614e6c60c083018961406a565b8281036020840152614e7e818961406a565b90508281036040840152614e92818861406a565b60608401969096525050608081019290925260a0909101529392505050565b86815285602082015260c060408201526000614ed060c083018761406a565b8281036060840152614ee2818761406a565b6001600160a01b03959095166080840152505060a00152949350505050565b60a081526000614f1460a083018861406a565b8281036020840152614f26818861406a565b60ff9690961660408401525050606081019290925260809091015292915050565b604081526000614f5a604083018561406a565b905060018060a01b03831660208301529392505050565b608081526000614f84608083018761406a565b8281036020840152614f96818761406a565b604084019590955250506060015292915050565b600082821015614fbc57614fbc61435d565b500390565b600081614fd057614fd061435d565b506000190190565b928352602083019190915260601b6bffffffffffffffffffffffff191660408201526054019056fe60806040526000805534801561001457600080fd5b50610282806100246000396000f3fe608060405234801561001057600080fd5b50600436106100355760003560e01c8062f55d9d1461003a5780631cff79cd1461004f575b600080fd5b61004d610048366004610138565b610079565b005b61006261005d36600461015a565b610097565b6040516100709291906101dd565b60405180910390f35b6000541561008657600080fd5b60016000556001600160a01b038116ff5b6000606060008054146100a957600080fd5b60016000556040516001600160a01b038616906100c9908690869061023c565b6000604051808303816000865af19150503d8060008114610106576040519150601f19603f3d011682016040523d82523d6000602084013e61010b565b606091505b506000805590969095509350505050565b80356001600160a01b038116811461013357600080fd5b919050565b60006020828403121561014a57600080fd5b6101538261011c565b9392505050565b60008060006040848603121561016f57600080fd5b6101788461011c565b9250602084013567ffffffffffffffff8082111561019557600080fd5b818601915086601f8301126101a957600080fd5b8135818111156101b857600080fd5b8760208285010111156101ca57600080fd5b6020830194508093505050509250925092565b821515815260006020604081840152835180604085015260005b81811015610213578581018301518582016060015282016101f7565b81811115610225576000606083870101525b50601f01601f191692909201606001949350505050565b818382376000910190815291905056fea26469706673582212205eae7bcaecffbcd15e04f46b0cf953c1df7d02afc5dc8a3bbf36f7a563d8109d64736f6c6343000809003375a31d1ce8e5f9892188befc328d3b9bd3fa5037457e881abc21f388471b8d96a264697066735822122091dbef2c7d01feaa6af6b9a4b59ca588325670076872e1438772c066d77a90b864736f6c634300080900330000000000000000000000002a6d1deb9b2954008cbcd360b66c32bc2b107926

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

0000000000000000000000002a6d1deb9b2954008cbcd360b66c32bc2b107926

-----Decoded View---------------
Arg [0] : tokenDeployer (address): 0x2a6d1deb9b2954008cbcd360b66c32bc2b107926

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000002a6d1deb9b2954008cbcd360b66c32bc2b107926


Deployed ByteCode Sourcemap

46824:21873:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51712:302;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64578:199;;;;;;:::i;:::-;;:::i;:::-;;56785:108;;;:::i;:::-;;;1843:25:1;;;1831:2;1816:18;56785:108:0;1697:177:1;59857:240:0;;;;;;:::i;:::-;;:::i;33523:304::-;;;;;;:::i;:::-;;:::i;31615:681::-;;;;;;:::i;:::-;;:::i;:::-;;;3745:14:1;;3738:22;3720:41;;3708:2;3693:18;31615:681:0;3580:187:1;29264:290:0;;;;;;:::i;:::-;;:::i;16725:109::-;;;;;;:::i;:::-;16779:7;16806:20;;;:15;:20;;;;;;-1:-1:-1;;;;;16806:20:0;;16725:109;;;;-1:-1:-1;;;;;5132:32:1;;;5114:51;;5102:2;5087:18;16725:109:0;4968:203:1;28923:333:0;;;;;;:::i;:::-;;:::i;34097:176::-;;;;;;:::i;:::-;;:::i;33135:102::-;;;:::i;60105:201::-;;;;;;:::i;:::-;;:::i;60980:797::-;;;;;;:::i;:::-;;:::i;32492:121::-;;;:::i;31196:411::-;;;;;;:::i;:::-;;:::i;33918:171::-;;;;;;:::i;:::-;;:::i;16960:100::-;;;;;;:::i;:::-;17011:4;17035:17;;;:12;:17;;;;;;;;;16960:100;32779:140;;;;;;:::i;:::-;;:::i;61785:425::-;;;;;;:::i;:::-;;:::i;56966:137::-;;;;;;:::i;:::-;;:::i;59503:346::-;;;;;;:::i;:::-;;:::i;33313:131::-;;;;;;:::i;:::-;;:::i;51502:::-;;;;;;:::i;:::-;;:::i;32621:150::-;;;;;;:::i;:::-;;:::i;62218:455::-;;;;;;:::i;:::-;;:::i;16604:113::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;62785:1785::-;;;;;;:::i;:::-;;:::i;34594:885::-;;;;;;:::i;:::-;;:::i;32363:121::-;-1:-1:-1;;;;;;;;;;;32422:4:0;17035:17;:12;:17;;;;;;32363:121;56785:108;29562:537;;;;;;:::i;:::-;;:::i;30508:680::-;;;;;;:::i;:::-;;:::i;16493:103::-;;;;;;:::i;:::-;16544:7;16571:17;;;;;;;;;;;;16493:103;16842:110;;;;;;:::i;:::-;;:::i;32927:152::-;;;;;;:::i;:::-;;:::i;34281:146::-;;;:::i;51330:102::-;;;:::i;17068:100::-;;;;;;:::i;:::-;17118:6;17144:16;;;:11;:16;;;;;;;17068:100;57188:320;;;;;;:::i;:::-;;:::i;34435:151::-;;;:::i;30107:393::-;;;;;;:::i;:::-;;:::i;60314:658::-;;;;;;:::i;:::-;;:::i;51712:302::-;51773:24;51810:18;51831:21;51846:5;51831:14;:21::i;:::-;51810:42;;51887:10;-1:-1:-1;;;;;51873:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51873:25:0;;51863:35;;51916:9;51911:96;51931:10;51927:1;:14;51911:96;;;51976:19;51986:5;51993:1;51976:9;:19::i;:::-;51963:7;51971:1;51963:10;;;;;;;;:::i;:::-;-1:-1:-1;;;;;51963:32:0;;;:10;;;;;;;;;;;:32;51943:3;;;:::i;:::-;;;51911:96;;;;51799:215;51712:302;;;:::o;64578:199::-;64647:17;;64695:35;;;;64706:5;64695:35;:::i;:::-;64646:84;;;;64743:26;64752:4;64758:10;64743:8;:26::i;:::-;64635:142;;64578:199;;:::o;56785:108::-;56842:7;56869:16;:14;:16::i;:::-;56862:23;;56785:108;:::o;59857:240::-;28768:10;28790:4;28768:27;28764:49;;28804:9;;-1:-1:-1;;;28804:9:0;;;;;;;;;;;28764:49;59938:20:::1;::::0;;59995:46:::1;::::0;;::::1;60006:6:::0;59995:46:::1;:::i;:::-;59937:104;;;;;;60054:35;60065:6;60073:7;60082:6;60054:10;:35::i;:::-;59926:171;;;59857:240:::0;;;:::o;33523:304::-;33586:24;33623:18;33644:21;33659:5;33644:14;:21::i;:::-;33623:42;;33700:10;-1:-1:-1;;;;;33686:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33686:25:0;;33676:35;;33729:9;33724:96;33744:10;33740:1;:14;33724:96;;;33789:19;33799:5;33806:1;33789:9;:19::i;:::-;33776:7;33784:1;33776:10;;;;;;;;:::i;:::-;-1:-1:-1;;;;;33776:32:0;;;:10;;;;;;;;;;;:32;33756:3;;;:::i;:::-;;;33724:96;;31615:681;31880:10;31903:11;31917:219;31969:9;31993:11;;31917:219;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31917:219:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32019:13:0;;-1:-1:-1;32019:13:0;;;;31917:219;;32019:13;;;;31917:219;;;;;;;;;-1:-1:-1;;31917:219:0;;;;;;;;;;;;;;;;;;;;;;32047:10;;-1:-1:-1;32072:11:0;;-1:-1:-1;31917:219:0;32098:6;;;;;;31917:219;;32098:6;;;;31917:219;;;;;;;;;-1:-1:-1;32119:6:0;;-1:-1:-1;31917:37:0;;-1:-1:-1;;31917:219:0:i;:::-;17011:4;17035:17;;;:12;:17;;;;;;;;;-1:-1:-1;17035:17:0;-1:-1:-1;32178:111:0;;;;32204:20;32213:3;32218:5;32204:8;:20::i;:::-;32239:38;32250:6;;32239:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32258:10:0;;-1:-1:-1;32270:6:0;;-1:-1:-1;32239:10:0;;-1:-1:-1;32239:38:0:i;:::-;31892:404;31615:681;;;;;;;;;;;:::o;29264:290::-;29528:7;;29518:18;;;;;;;:::i;:::-;;;;;;;;29460:10;-1:-1:-1;;;;;29447:99:0;;29472:16;;29490:26;;29538:7;;29447:99;;;;;;;;;;;:::i;:::-;;;;;;;;29264:290;;;;;;:::o;28923:333::-;29115:42;29130:10;29142:6;;29115:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29150:6:0;;-1:-1:-1;29115:14:0;;-1:-1:-1;;29115:42:0:i;:::-;29183:10;-1:-1:-1;;;;;29173:75:0;;29195:16;;29213:18;;29233:6;;29241;29173:75;;;;;;;;;;;;:::i;:::-;;;;;;;;28923:333;;;;;;;:::o;34097:176::-;19590:18;19611:13;:11;:13::i;:::-;19590:34;;19642:32;19651:10;19663;19642:8;:32::i;:::-;19637:56;;19683:10;;-1:-1:-1;;;19683:10:0;;;;;;;;;;;19637:56;19706:13;19732:8;;19722:19;;;;;;;:::i;:::-;;;;;;;;19706:35;;19836:40;19846:10;19858:5;19865:10;19836:9;:40::i;:::-;19832:67;;;19885:14;;-1:-1:-1;;;19885:14:0;;;;;;;;;;;19832:67;19912:49;19925:10;19937:5;19944:10;19956:4;19912:12;:49::i;:::-;20030:22;20098:1;20055:32;20069:10;20081:5;20055:13;:32::i;:::-;:45;;;;:::i;:::-;20030:70;;20111:48;20125:10;20137:5;20144:14;20111:13;:48::i;:::-;20268:30;20287:10;20268:18;:30::i;:::-;20251:14;:47;20247:60;;;20300:7;;;34097:176;;:::o;20247:60::-;34183:43:::1;34192:26;34211:6;;34192:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;34192:18:0::1;::::0;-1:-1:-1;;;34192:26:0:i:1;:::-;34220:5;34183:8;:43::i;:::-;34244:21;34258:6;;34244:21;;;;;;;:::i;:::-;;;;;;;;20382:44:::0;20396:10;20408:5;20423:1;20382:13;:44::i;:::-;20439:18;20460:26;20475:10;20460:14;:26::i;:::-;20439:47;;20504:9;20499:128;20519:10;20515:1;:14;20499:128;;;20551:64;20564:10;20576:5;20583:24;20593:10;20605:1;20583:9;:24::i;:::-;20609:5;20551:12;:64::i;:::-;20531:3;;;:::i;:::-;;;20499:128;;;;19579:1055;;;;34097:176;;:::o;33135:102::-;33189:7;33216:13;:11;:13::i;60105:201::-;28768:10;28790:4;28768:27;28764:49;;28804:9;;-1:-1:-1;;;28804:9:0;;;;;;;;;;;28764:49;60186:20:::1;::::0;60224:37:::1;::::0;;::::1;60235:6:::0;60224:37:::1;:::i;:::-;60185:76;;;;60274:24;60285:6;60293:4;60274:10;:24::i;:::-;60174:132;;60105:201:::0;;;:::o;60980:797::-;28768:10;28790:4;28768:27;28764:49;;28804:9;;-1:-1:-1;;;28804:9:0;;;;;;;;;;;28764:49;61103:25:::1;::::0;;;;;;;61394:89:::1;::::0;;::::1;61405:6:::0;61394:89:::1;:::i;:::-;61088:395;;;;;;;;;;;;;;;;61496:273;61539:9;61563:11;61589:13;61617:15;61647:11;61673:6;61694;61715:12;61742:16;61496:28;:273::i;:::-;61077:700;;;;;;;;60980:797:::0;;;:::o;32492:121::-;26959:66;32548:7;16806:20;:15;:20;;;;-1:-1:-1;;;;;16806:20:0;;56785:108::o;31196:411::-;31396:10;31419:11;31433:93;31463:9;31474:11;;31433:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31433:93:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31487:13:0;;-1:-1:-1;31487:13:0;;;;31433:93;;31487:13;;;;31433:93;;;;;;;;;-1:-1:-1;31502:10:0;;-1:-1:-1;31514:11:0;;-1:-1:-1;31433:29:0;;-1:-1:-1;31433:93:0:i;:::-;17011:4;17035:17;;;:12;:17;;;;;;;;;-1:-1:-1;17035:17:0;-1:-1:-1;31568:31:0;;;;31579:20;31588:3;31593:5;31579:8;:20::i;:::-;31408:199;31196:411;;;;;;;;:::o;33918:171::-;19590:18;19611:13;:11;:13::i;:::-;19590:34;;19642:32;19651:10;19663;19642:8;:32::i;:::-;19637:56;;19683:10;;-1:-1:-1;;;19683:10:0;;;;;;;;;;;19637:56;19706:13;19732:8;;19722:19;;;;;;;:::i;:::-;;;;;;;;19706:35;;19836:40;19846:10;19858:5;19865:10;19836:9;:40::i;:::-;19832:67;;;19885:14;;-1:-1:-1;;;19885:14:0;;;;;;;;;;;19832:67;19912:49;19925:10;19937:5;19944:10;19956:4;19912:12;:49::i;:::-;20030:22;20098:1;20055:32;20069:10;20081:5;20055:13;:32::i;:::-;:45;;;;:::i;:::-;20030:70;;20111:48;20125:10;20137:5;20144:14;20111:13;:48::i;:::-;20268:30;20287:10;20268:18;:30::i;:::-;20251:14;:47;20247:60;;;20300:7;;;33918:171;;:::o;20247:60::-;34002:42:::1;34011:26;34030:6;;34011:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;34011:18:0::1;::::0;-1:-1:-1;;;34011:26:0:i:1;:::-;34039:4;34002:8;:42::i;:::-;34062:19;34074:6;;34062:19;;;;;;;:::i;:::-;;;;;;;;20382:44:::0;20396:10;20408:5;20423:1;20382:13;:44::i;:::-;20439:18;20460:26;20475:10;20460:14;:26::i;:::-;20439:47;;20504:9;20499:128;20519:10;20515:1;:14;20499:128;;;20551:64;20564:10;20576:5;20583:24;20593:10;20605:1;20583:9;:24::i;20551:64::-;20531:3;;;:::i;:::-;;;20499:128;;32779:140;32852:4;32876:35;32884:26;32903:6;32884:18;:26::i;32876:35::-;32869:42;32779:140;-1:-1:-1;;32779:140:0:o;61785:425::-;28768:10;28790:4;28768:27;28764:49;;28804:9;;-1:-1:-1;;;28804:9:0;;;;;;;;;;;28764:49;61874:26:::1;::::0;61926:40:::1;::::0;;::::1;61937:6:::0;61926:40:::1;:::i;:::-;61873:93;;;;61979:13;61995;:11;:13::i;:::-;61979:29;;62026:87;62047:13;62054:5;62047:6;:13::i;:::-;62062:25;62081:5;62062:18;:25::i;:::-;62089:9;62100:12;62026:87;;;;;;;;;:::i;:::-;;;;;;;;62126:23;62141:7;::::0;::::1;:::i;:::-;;;;62126:14;:23::i;:::-;62160:42;62171:5;62178:9;62189:12;62160:10;:42::i;56966:137::-:0;57040:7;57067:28;57089:5;57067:21;:28::i;59503:346::-;28768:10;28790:4;28768:27;28764:49;;28804:9;;-1:-1:-1;;;28804:9:0;;;;;;;;;;;28764:49;59586:18:::1;::::0;;;;59678:98:::1;::::0;;::::1;59703:6:::0;59678:98:::1;:::i;:::-;59585:191;;;;;;;;;;59789:52;59802:4;59808:6;59816:8;59826:3;59831:9;59789:12;:52::i;:::-;59574:275;;;;;59503:346:::0;;;:::o;33313:131::-;33384:7;33411:25;33430:5;33411:18;:25::i;51502:131::-;51573:7;51600:25;51619:5;51600:18;:25::i;32621:150::-;32697:7;32724:39;32735:27;32755:6;32735:19;:27::i;62218:455::-;28768:10;28790:4;28768:27;28764:49;;28804:9;;-1:-1:-1;;;28804:9:0;;;;;;;;;;;28764:49;62310:29:::1;::::0;62365:40:::1;::::0;;::::1;62376:6:::0;62365:40:::1;:::i;:::-;62309:96;;;;62418:13;62434:16;:14;:16::i;:::-;62418:32;;62468:99;62492:16;62502:5;62492:9;:16::i;:::-;62510:28;62532:5;62510:21;:28::i;:::-;62540:12;62554;62468:99;;;;;;;;;:::i;:::-;;;;;;;;62580:26;62598:7;::::0;::::1;:::i;:::-;;;;62580:17;:26::i;:::-;62617:48;62631:5;62638:12;62652;62617:13;:48::i;16604:113::-:0;16690:19;;;;:14;:19;;;;;16683:26;;16657:13;;16690:19;16683:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16604:113;;;:::o;62785:1785::-;62965:1;62937:16;:14;:16::i;:::-;-1:-1:-1;;;;;62937:30:0;;62933:53;;;62976:10;;-1:-1:-1;;;62976:10:0;;;;;;;;;;;62933:53;63014:31;;;;;;63277:80;;;;63288:6;63277:80;:::i;:::-;62999:358;;;;;;;;;;;;63465:21;63513:1;63489:13;:11;:13::i;:::-;:26;;;;:::i;:::-;63465:50;;63526:29;63541:13;18940:24;17273:12;:17;;;;;;:25;52081:99;63526:29;63566:60;63577:13;63592:14;63608:17;63566:10;:60::i;:::-;63639:21;63687:1;63663:13;:11;:13::i;:::-;:26;;;;:::i;:::-;63639:50;;63700:29;63715:13;63700:14;:29::i;:::-;63740:60;63751:13;63766:14;63782:17;63740:10;:60::i;:::-;63813:24;63867:1;63840:16;:14;:16::i;:::-;:29;;;;:::i;:::-;63813:56;;63880:35;63898:16;63880:17;:35::i;:::-;63926:72;63940:16;63958:17;63977:20;63926:13;:72::i;:::-;64037:25;;;64059:1;64037:25;;;;;;;;;;64016:94;;;;64037:25;64059:1;64076:14;;64092:17;;64016:94;:::i;:::-;;;;;;;;64150:25;;;64172:1;64150:25;;;;;;;;;;64126:103;;;;64150:25;64172:1;64189:17;;64208:20;;64126:103;:::i;:::-;;;;;;;;64527:35;;;;;;;;;;;;;;-1:-1:-1;;;64527:35:0;;;64559:1;64527:16;:35::i;34594:885::-;19590:18;19611:13;:11;:13::i;:::-;19590:34;;19642:32;19651:10;19663;19642:8;:32::i;:::-;19637:56;;19683:10;;-1:-1:-1;;;19683:10:0;;;;;;;;;;;19637:56;19706:13;19732:8;;19722:19;;;;;;;:::i;:::-;;;;;;;;19706:35;;19836:40;19846:10;19858:5;19865:10;19836:9;:40::i;:::-;19832:67;;;19885:14;;-1:-1:-1;;;19885:14:0;;;;;;;;;;;19832:67;19912:49;19925:10;19937:5;19944:10;19956:4;19912:12;:49::i;:::-;20030:22;20098:1;20055:32;20069:10;20081:5;20055:13;:32::i;:::-;:45;;;;:::i;:::-;20030:70;;20111:48;20125:10;20137:5;20144:14;20111:13;:48::i;:::-;20268:30;20287:10;20268:18;:30::i;:::-;20251:14;:47;20247:60;;;20300:7;;;;;20247:60;34807:17:::1;-1:-1:-1::0;;;;;34807:26:0::1;;34778:25;:55;34774:85;;34842:17;;-1:-1:-1::0;;;34842:17:0::1;;;;;;;;;;;34774:85;34877:27;::::0;-1:-1:-1;;;;;34877:27:0;::::1;::::0;::::1;::::0;;;::::1;35170:23:::0;;35166:256:::1;;35211:12;35229:17;-1:-1:-1::0;;;;;35229:30:0::1;35301:29;;;35332:11;;35278:66;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;35278:66:0;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;35278:66:0::1;-1:-1:-1::0;;;;;;35278:66:0;;::::1;::::0;;;::::1;::::0;;;35229:130;;::::1;::::0;35278:66;35229:130:::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35210:149;;;35381:7;35376:34;;35397:13;;-1:-1:-1::0;;;35397:13:0::1;;;;;;;;;;;35376:34;35195:227;35166:256;35434:37;35453:17;35434:18;:37::i;:::-;20382:44:::0;20396:10;20408:5;20423:1;20382:13;:44::i;:::-;20439:18;20460:26;20475:10;20460:14;:26::i;:::-;20439:47;;20504:9;20499:128;20519:10;20515:1;:14;20499:128;;;20551:64;20564:10;20576:5;20583:24;20593:10;20605:1;20583:9;:24::i;20551:64::-;20531:3;;;:::i;:::-;;;20499:128;;;;19579:1055;;;;34594:885;;;;:::o;29562:537::-;29807:42;29822:10;29834:6;;29807:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29842:6:0;;-1:-1:-1;29807:14:0;;-1:-1:-1;;29807:42:0:i;:::-;30008:7;;29998:18;;;;;;;:::i;:::-;;;;;;;;29901:10;-1:-1:-1;;;;;29865:226:0;;29926:16;;29957:26;;30031:7;;30053:6;;30074;29865:226;;;;;;;;;;;;;;:::i;:::-;;;;;;;;29562:537;;;;;;;;;:::o;30508:680::-;30814:4;30851:329;30877:288;30937:9;30969:11;;30877:288;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31003:13;;30877:288;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30877:288:0;;;;;;;;;;;;;;;;;;;;;;31039:15;;-1:-1:-1;31077:11:0;;-1:-1:-1;30877:288:0;31111:6;;;;;;30877:288;;31111:6;;;;30877:288;;;;;;;;;-1:-1:-1;31140:6:0;;-1:-1:-1;30877:37:0;;-1:-1:-1;;30877:288:0:i;30851:329::-;30831:349;30508:680;-1:-1:-1;;;;;;;;;;;30508:680:0:o;16842:110::-;16926:18;;;;:13;:18;;;;;16919:25;;16894:12;;16926:18;16919:25;;;:::i;32927:152::-;33003:4;33027:44;33035:35;33060:9;33035:24;:35::i;34281:146::-;19590:18;19611:13;:11;:13::i;:::-;19590:34;;19642:32;19651:10;19663;19642:8;:32::i;:::-;19637:56;;19683:10;;-1:-1:-1;;;19683:10:0;;;;;;;;;;;19637:56;19706:13;19732:8;;19722:19;;;;;;;:::i;:::-;;;;;;;;19706:35;;19836:40;19846:10;19858:5;19865:10;19836:9;:40::i;:::-;19832:67;;;19885:14;;-1:-1:-1;;;19885:14:0;;;;;;;;;;;19832:67;19912:49;19925:10;19937:5;19944:10;19956:4;19912:12;:49::i;:::-;20030:22;20098:1;20055:32;20069:10;20081:5;20055:13;:32::i;:::-;:45;;;;:::i;:::-;20030:70;;20111:48;20125:10;20137:5;20144:14;20111:13;:48::i;:::-;20268:30;20287:10;20268:18;:30::i;:::-;20251:14;:47;20247:60;;;20300:7;;;34281:146::o;20247:60::-;34347:37:::1;-1:-1:-1::0;;;;;;;;;;;34379:4:0::1;34347:8;:37::i;:::-;34402:17;::::0;::::1;::::0;;;::::1;20382:44:::0;20396:10;20408:5;20423:1;20382:13;:44::i;:::-;20439:18;20460:26;20475:10;20460:14;:26::i;:::-;20439:47;;20504:9;20499:128;20519:10;20515:1;:14;20499:128;;;20551:64;20564:10;20576:5;20583:24;20593:10;20605:1;20583:9;:24::i;20551:64::-;20531:3;;;:::i;:::-;;;20499:128;;51330:102;51384:7;51411:13;:11;:13::i;57188:320::-;57252:24;57289:21;57313:24;57331:5;57313:17;:24::i;:::-;57289:48;;57372:13;-1:-1:-1;;;;;57358:28:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57358:28:0;;57348:38;;57404:9;57399:102;57419:13;57415:1;:17;57399:102;;;57467:22;57480:5;57487:1;57467:12;:22::i;:::-;57454:7;57462:1;57454:10;;;;;;;;:::i;:::-;-1:-1:-1;;;;;57454:35:0;;;:10;;;;;;;;;;;:35;57434:3;;;:::i;:::-;;;57399:102;;34435:151;19590:18;19611:13;:11;:13::i;:::-;19590:34;;19642:32;19651:10;19663;19642:8;:32::i;:::-;19637:56;;19683:10;;-1:-1:-1;;;19683:10:0;;;;;;;;;;;19637:56;19706:13;19732:8;;19722:19;;;;;;;:::i;:::-;;;;;;;;19706:35;;19836:40;19846:10;19858:5;19865:10;19836:9;:40::i;:::-;19832:67;;;19885:14;;-1:-1:-1;;;19885:14:0;;;;;;;;;;;19832:67;19912:49;19925:10;19937:5;19944:10;19956:4;19912:12;:49::i;:::-;20030:22;20098:1;20055:32;20069:10;20081:5;20055:13;:32::i;:::-;:45;;;;:::i;:::-;20030:70;;20111:48;20125:10;20137:5;20144:14;20111:13;:48::i;:::-;20268:30;20287:10;20268:18;:30::i;:::-;20251:14;:47;20247:60;;;20300:7;;;34435:151::o;20247:60::-;34503:38:::1;-1:-1:-1::0;;;;;;;;;;;34535:5:0::1;34503:8;:38::i;:::-;34559:19;::::0;::::1;::::0;;;::::1;20382:44:::0;20396:10;20408:5;20423:1;20382:13;:44::i;:::-;20439:18;20460:26;20475:10;20460:14;:26::i;:::-;20439:47;;20504:9;20499:128;20519:10;20515:1;:14;20499:128;;;20551:64;20564:10;20576:5;20583:24;20593:10;20605:1;20583:9;:24::i;20551:64::-;20531:3;;;:::i;:::-;;;20499:128;;30107:393;30348:4;30385:107;30393:98;30423:9;30434:11;;30393:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30393:98:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30447:13:0;;-1:-1:-1;30447:13:0;;;;30393:98;;30447:13;;;;30393:98;;;;;;;;;-1:-1:-1;30462:15:0;;-1:-1:-1;30479:11:0;;-1:-1:-1;30393:29:0;;-1:-1:-1;30393:98:0:i;30385:107::-;30365:127;30107:393;-1:-1:-1;;;;;;;;30107:393:0:o;60314:658::-;28768:10;28790:4;28768:27;28764:49;;28804:9;;-1:-1:-1;;;28804:9:0;;;;;;;;;;;28764:49;60429:25:::1;::::0;;;;;60656:72:::1;::::0;;::::1;60667:6:::0;60656:72:::1;:::i;:::-;60414:314;;;;;;;;;;;;60741:223;60776:9;60800:11;60826:13;60854:15;60884:11;60910:12;60937:16;60741:20;:223::i;49709:130::-:0;49771:7;49798:33;49806:24;49824:5;49806:17;:24::i;49556:145::-;49628:7;49655:38;49666:26;49679:5;49686;49666:12;:26::i;49655:38::-;49648:45;49556:145;-1:-1:-1;;;49556:145:0:o;64785:3909::-;64894:17;;64869:22;64894:17;-1:-1:-1;;;;;64951:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64951:29:0;;64924:56;;64993:19;65015:45;65054:4;65044:15;;;;;;65015:28;:45::i;:::-;64993:67;;65078:9;65073:122;65093:14;65089:1;:18;65073:122;;;65142:41;65156:11;65169:10;65180:1;65169:13;;;;;;;;:::i;:::-;;;;;;;65142;:41::i;:::-;65129:7;65137:1;65129:10;;;;;;;;:::i;:::-;-1:-1:-1;;;;;65129:54:0;;;:10;;;;;;;;;;;:54;65109:3;;;:::i;:::-;;;65073:122;;;;65222:15;65252:16;65283:27;65325:24;65364:21;65410:4;65399:63;;;;;;;;;;;;:::i;:::-;65207:255;;;;;;;;;;65490:13;65479:7;:24;65475:53;;65512:16;;-1:-1:-1;;;65512:16:0;;;;;;;;;;;65475:53;65546:43;65581:7;65546:34;:43::i;:::-;65541:75;;65598:18;;-1:-1:-1;;;65598:18:0;;;;;;;;;;;65541:75;65654:17;;65706:15;;65688:33;;;;:68;;;65743:6;:13;65725:14;:31;;65688:68;65684:98;;;65765:17;;-1:-1:-1;;;65765:17:0;;;;;;;;;;;65684:98;65795:26;;;65928:10;65913:11;:25;;;;;;;;:::i;:::-;;65909:349;;;65979:46;66002:13;:11;:13::i;:::-;66017:7;65979:22;:46::i;:::-;65955:70;;66063:21;:57;;;;66088:32;66112:7;66088:23;:32::i;:::-;66040:80;;65909:349;;;66157:13;66142:11;:28;;;;;;;;:::i;:::-;;66138:120;;;66213:33;66238:7;66213:24;:33::i;:::-;66187:59;;66138:120;66275:9;66270:2417;66290:14;66286:1;:18;66270:2417;;;66326:17;66346:10;66357:1;66346:13;;;;;;;;:::i;:::-;;;;;;;66326:33;;66380:28;66398:9;66380:17;:28::i;:::-;66376:42;;;66410:8;;;66376:42;66480:22;66517:19;66566:8;66575:1;66566:11;;;;;;;;:::i;:::-;;;;;;;66549:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;66539:40;;;;;;66517:62;;27870:24;66600:11;:36;66596:1665;;;66662:20;66657:35;;66684:8;;;;;66657:35;-1:-1:-1;;;66731:42:0;-1:-1:-1;66596:1665:0;;;27949:22;66799:11;:34;66795:1466;;;66859:23;66858:24;:49;;;;;66887:20;66886:21;66858:49;66854:63;;;66909:8;;;;;66854:63;-1:-1:-1;;;66956:40:0;-1:-1:-1;66795:1466:0;;;28037:32;67022:11;:45;67018:1243;;;67093:23;67092:24;:49;;;;;67121:20;67120:21;67092:49;67088:63;;;67143:8;;;;;67088:63;-1:-1:-1;;;67190:50:0;-1:-1:-1;67018:1243:0;;;28145:40;67266:11;:55;67262:999;;;67347:23;67346:24;:49;;;;;67375:20;67374:21;67346:49;67342:63;;;67397:8;;;;;67342:63;-1:-1:-1;;;67444:58:0;-1:-1:-1;67262:999:0;;;27791:22;67528:11;:34;67524:737;;;67588:23;67587:24;:49;;;;;67616:20;67615:21;67587:49;67583:63;;;67638:8;;;;;67583:63;-1:-1:-1;;;67685:40:0;-1:-1:-1;67524:737:0;;;28347:30;67751:11;:42;67747:514;;;67819:21;67814:36;;67842:8;;;;;67814:36;-1:-1:-1;;;67889:48:0;-1:-1:-1;67747:514:0;;;28251:33;67963:11;:45;67959:302;;;68034:21;68029:36;;68057:8;;;;;68029:36;-1:-1:-1;;;68104:51:0;-1:-1:-1;67959:302:0;;;68196:8;;;;;67959:302;68382:36;68402:9;68413:4;68382:19;:36::i;:::-;68434:12;68460:4;-1:-1:-1;;;;;68452:18:0;68494:15;68511:6;68518:1;68511:9;;;;;;;;:::i;:::-;;;;;;;68522;68471:61;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;68471:61:0;;;;;;;;;;;;;;-1:-1:-1;;;;;68471:61:0;-1:-1:-1;;;;;;68471:61:0;;;;;;;;;;68452:81;;;;68471:61;68452:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68433:100;;;68548:39;68568:9;68579:7;68548:19;:39::i;:::-;68608:7;68604:72;;;68641:19;;68650:9;;68641:19;;;;;68604:72;66311:2376;;;;66270:2417;66306:3;;;:::i;:::-;;;66270:2417;;;;64858:3836;;;;;;;;;;;;64785:3909;;:::o;54850:111::-;47770:27;54899:7;16571:17;;;;;;;;56785:108::o;38601:702::-;38730:20;38753:22;38768:6;38753:14;:22::i;:::-;38730:45;-1:-1:-1;;;;;;38792:26:0;;38788:64;;38845:6;38827:25;;-1:-1:-1;;;38827:25:0;;;;;;;;:::i;:::-;;;;;;;;38788:64;38894:18;38869:21;38883:6;38869:13;:21::i;:::-;:43;;;;;;;;:::i;:::-;;38865:431;;;38929:25;38947:6;38929:17;:25::i;:::-;39051:65;;-1:-1:-1;;;;;32420:32:1;;39051:65:0;;;32402:51:1;32469:18;;;32462:34;;;38971:12:0;;38986:145;;39020:12;;-1:-1:-1;;;39074:24:0;32375:18:1;;39051:65:0;;;;-1:-1:-1;;39051:65:0;;;;;;;;;;;;;;-1:-1:-1;;;;;39051:65:0;-1:-1:-1;;;;;;39051:65:0;;;;;;;;;;38986:15;:145::i;:::-;38971:160;;39153:7;39148:39;;39180:6;39169:18;;-1:-1:-1;;;39169:18:0;;;;;;;;:::i;39148:39::-;38914:285;38865:431;;;39220:64;;-1:-1:-1;;;39220:64:0;;-1:-1:-1;;;;;32420:32:1;;;39220:64:0;;;32402:51:1;32469:18;;;32462:34;;;39220:47:0;;;;;32375:18:1;;39220:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22249:140;22316:7;22343:38;22351:29;22369:10;22351:17;:29::i;22086:155::-;22163:7;22190:43;22201:31;22214:10;22226:5;22201:12;:31::i;43334:713::-;43633:7;27689:45;43796:9;43828:11;43862:13;43898:15;43936:11;43970:6;43999;43701:323;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43673:366;;;;;;43653:386;;43334:713;;;;;;;;;:::o;17658:96::-;17721:17;;;;:12;:17;;;;;;:25;;-1:-1:-1;;17721:25:0;;;;;;;;;;17658:96::o;35579:1537::-;35711:20;35734:22;35749:6;35734:14;:22::i;:::-;35711:45;-1:-1:-1;;;;;;35773:26:0;;35769:64;;35826:6;35808:25;;-1:-1:-1;;;35808:25:0;;;;;;;;:::i;35769:64::-;35848:11;35844:39;;35868:15;;-1:-1:-1;;;35868:15:0;;;;;;;;;;;35844:39;35896:19;35918:21;35932:6;35918:13;:21::i;:::-;35896:43;-1:-1:-1;35950:16:0;35996:18;35983:9;:31;;;;;;;;:::i;:::-;;35979:366;;;36031:25;36049:6;36031:17;:25::i;:::-;36152:83;;-1:-1:-1;;;;;33723:15:1;;36152:83:0;;;33705:34:1;36221:4:0;33755:18:1;;;33748:43;33807:18;;;33800:34;;;36087:163:0;;36121:12;;-1:-1:-1;;;36175:28:0;33640:18:1;;36152:83:0;33465:375:1;36087:163:0;36073:177;;36272:11;36267:43;;36303:6;36292:18;;-1:-1:-1;;;36292:18:0;;;;;;;;:::i;35979:366::-;36374:30;36361:9;:43;;;;;;;;:::i;:::-;;36357:325;;;36500:72;;-1:-1:-1;;;;;32420:32:1;;36500:72:0;;;32402:51:1;32469:18;;;32462:34;;;36435:152:0;;36469:12;;-1:-1:-1;;;36523:32:0;32375:18:1;;36500:72:0;32228:274:1;36357:325:0;36878:69;;-1:-1:-1;;;36878:69:0;;36944:1;36878:69;;;1843:25:1;36708:290:0;;36738:12;;-1:-1:-1;;;36806:28:0;36853:6;;-1:-1:-1;;;;;36878:57:0;;;;;1816:18:1;;36878:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36765:222;;-1:-1:-1;;;;;33723:15:1;;;36765:222:0;;;33705:34:1;33775:15;;33755:18;;;33748:43;33807:18;;;33800:34;;;33640:18;;36765:222:0;33465:375:1;36708:290:0;36694:304;;37016:11;37011:43;;37047:6;37036:18;;-1:-1:-1;;;37036:18:0;;;;;;;;:::i;37011:43::-;37067:41;;-1:-1:-1;;;37067:41:0;;37105:1;37067:41;;;1843:25:1;-1:-1:-1;;;;;37067:29:0;;;;;1816:18:1;;37067:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35700:1416;;;35579:1537;;;:::o;21973:105::-;18940:24;22019:7;16571:17;;;;;;;;56785:108::o;22949:154::-;23027:4;23051:44;23059:35;23074:10;23086:7;23059:14;:35::i;22727:214::-;22855:4;22879:54;22887:45;22905:10;22917:5;22924:7;22887:17;:45::i;22879:54::-;22872:61;22727:214;-1:-1:-1;;;;22727:214:0:o;25002:219::-;25151:62;25160:45;25178:10;25190:5;25197:7;25160:17;:45::i;:::-;25207:5;25151:8;:62::i;22553:166::-;22634:7;22661:50;22669:41;22692:10;22704:5;22669:22;:41::i;24793:201::-;24924:62;24933:41;24956:10;24968:5;24933:22;:41::i;:::-;24976:9;17273:12;:17;;;;;;;;;;;:25;17207:99;24924:62;24793:201;;;:::o;22397:148::-;22468:7;22495:42;22503:33;22525:10;22503:21;:33::i;42217:164::-;42290:7;27489:25;42365:6;42327:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42317:56;;;;;;42310:63;;42217:164;;;:::o;39311:1130::-;39387:20;39410:22;39425:6;39410:14;:22::i;:::-;39387:45;-1:-1:-1;;;;;;39449:26:0;;39445:64;;39502:6;39484:25;;-1:-1:-1;;;39484:25:0;;;;;;;;:::i;39445:64::-;39551:18;39526:21;39540:6;39526:13;:21::i;:::-;:43;;;;;;;;:::i;:::-;;39522:912;;;39586:25;39604:6;39586:17;:25::i;:::-;39628:29;39686:4;39660:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39953:55:0;;-1:-1:-1;;;39953:55:0;;-1:-1:-1;;;;;39753:22:0;;;39953:55;;;5114:51:1;;;39628:66:0;;-1:-1:-1;39712:12:0;;;;39753:22;;;;39794:12;;-1:-1:-1;;;39870:24:0;39925:4;;39953:30;;;;;5087:18:1;;39953:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39825:202;;-1:-1:-1;;;;;32420:32:1;;;39825:202:0;;;32402:51:1;32469:18;;;32462:34;32375:18;;39825:202:0;;;-1:-1:-1;;39825:202:0;;;;;;;;;;;;;;-1:-1:-1;;;;;39825:202:0;-1:-1:-1;;;;;;39825:202:0;;;;;;39753:289;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39753:289:0;;;;;;;;;;;;:::i;:::-;39711:331;;;;40064:7;40063:8;:80;;;-1:-1:-1;40076:17:0;;:31;;;;:66;;;40123:10;40112:30;;;;;;;;;;;;:::i;:::-;40111:31;40076:66;40059:128;;;40180:6;40169:18;;-1:-1:-1;;;40169:18:0;;;;;;;;:::i;40059:128::-;40317:37;;-1:-1:-1;;;40317:37:0;;40348:4;40317:37;;;5114:51:1;-1:-1:-1;;;;;40317:22:0;;;;;5087:18:1;;40317:37:0;4968:203:1;39522:912:0;40387:35;;-1:-1:-1;;;40387:35:0;;;;;1843:25:1;;;-1:-1:-1;;;;;40387:29:0;;;;;1816:18:1;;40387:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41086:869;41439:219;41486:9;41510:11;41536:13;41564:15;41594:11;41620:6;41641;41439:32;:219::i;:::-;41825:11;41795:15;-1:-1:-1;;;;;41674:273:0;41717:9;41674:273;41741:11;41767:13;41851:6;41872;41893:12;41920:16;41674:273;;;;;;;;;;;:::i;:::-;;;;;;;;41086:869;;;;;;;;;:::o;42745:581::-;42980:7;27579:35;43133:9;43165:11;43199:13;43235:15;43273:11;43048:255;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43020:298;;;;;;43000:318;;42745:581;;;;;;;:::o;49443:105::-;47386:24;49489:7;16571:17;;;;;;;;56785:108::o;49847:138::-;49913:7;49940:37;49948:28;49970:5;49948:21;:28::i;52081:99::-;47386:24;17273:12;:17;;;;;;:25;52081:99::o;52140:32::-;52081:99;:::o;52576:973::-;52735:15;;52767:25;;;52763:53;;;52801:15;;-1:-1:-1;;;52801:15:0;;;;;;;;;;;52763:53;52833:23;52829:59;;52865:23;;-1:-1:-1;;;52865:23:0;;;;;;;;;;;52829:59;52901:36;52920:5;52927:9;52901:18;:36::i;:::-;52948;52963:5;52970:13;52948:14;:36::i;:::-;53002:9;52997:545;53017:13;53013:1;:17;52997:545;;;53052:15;53070:8;53079:1;53070:11;;;;;;;;:::i;:::-;;;;;;;53052:29;;53193:24;53202:5;53209:7;53193:8;:24::i;:::-;53189:60;;;53226:23;;-1:-1:-1;;;53226:23:0;;-1:-1:-1;;;;;5132:32:1;;53226:23:0;;;5114:51:1;5087:18;;53226:23:0;4968:203:1;53189:60:0;-1:-1:-1;;;;;53270:21:0;;53266:49;;53300:15;;-1:-1:-1;;;53300:15:0;;;;;;;;;;;53266:49;53454:28;53464:5;53471:1;53474:7;53454:9;:28::i;:::-;53497:33;53509:5;53516:7;53525:4;53497:11;:33::i;:::-;-1:-1:-1;53032:3:0;;;:::i;:::-;;;52997:545;;55272:144;55341:7;55368:40;55376:31;55401:5;55376:24;:31::i;37124:1469::-;37405:1;37371:22;37386:6;37371:14;:22::i;:::-;-1:-1:-1;;;;;37371:36:0;;37367:75;;37435:6;37416:26;;-1:-1:-1;;;37416:26:0;;;;;;;;:::i;37367:75::-;-1:-1:-1;;;;;37459:26:0;;37455:1027;;37590:12;37632:6;37615:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;37605:35;;;;;;37590:50;;37658:12;37672:17;37693:29;-1:-1:-1;;;;;37693:42:0;37777:35;;;37814:4;37820:6;37828:8;37838:3;37843:4;37754:94;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;37754:94:0;;;;;;;;;;;;;;-1:-1:-1;;;;;37754:94:0;-1:-1:-1;;;;;;37754:94:0;;;;;;;;;;37693:170;;;;37754:94;37693:170;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37657:206;;;;37885:7;37880:46;;37919:6;37901:25;;-1:-1:-1;;;37901:25:0;;;;;;;;:::i;37880:46::-;37969:4;37958:27;;;;;;;;;;;;:::i;:::-;37943:42;;38002:53;38016:6;38024:30;38002:13;:53::i;:::-;37487:580;;;37455:1027;;;-1:-1:-1;;;;;38196:24:0;;;38192:90;;38243:39;;-1:-1:-1;;;38243:39:0;;-1:-1:-1;;;;;5132:32:1;;38243:39:0;;;5114:51:1;5087:18;;38243:39:0;4968:203:1;38192:90:0;38429:41;38443:6;38451:18;38429:13;:41::i;:::-;38494:38;38511:6;38519:12;38494:16;:38::i;:::-;38550:35;38564:6;38572:12;38550:35;;;;;;;:::i;:::-;;;;;;;;37124:1469;;;;;:::o;42389:166::-;42463:7;27332:26;42539:6;42500:46;;;;;;;;;:::i;57575:105::-;47770:27;17273:12;:17;;;;;;:25;52081:99::o;58031:1021::-;58193:15;;58225:25;;;58221:56;;;58259:18;;-1:-1:-1;;;58259:18:0;;;;;;;;;;;58221:56;58294:23;58290:62;;58326:26;;-1:-1:-1;;;58326:26:0;;;;;;;;;;;58290:62;58365:39;58387:5;58394:9;58365:21;:39::i;:::-;58415;58433:5;58440:13;58415:17;:39::i;:::-;58472:9;58467:578;58487:13;58483:1;:17;58467:578;;;58522:15;58540:8;58549:1;58540:11;;;;;;;;:::i;:::-;;;;;;;58522:29;;58669:27;58681:5;58688:7;58669:11;:27::i;:::-;58665:66;;;58705:26;;-1:-1:-1;;;58705:26:0;;-1:-1:-1;;;;;5132:32:1;;58705:26:0;;;5114:51:1;5087:18;;58705:26:0;4968:203:1;58665:66:0;-1:-1:-1;;;;;58752:21:0;;58748:52;;58782:18;;-1:-1:-1;;;58782:18:0;;;;;;;;;;;58748:52;58951:31;58964:5;58971:1;58974:7;58951:12;:31::i;:::-;58997:36;59012:5;59019:7;59028:4;58997:14;:36::i;:::-;-1:-1:-1;58502:3:0;;;:::i;:::-;;;58467:578;;23632:986;23794:15;;23826:23;;;23822:51;;;23858:15;;-1:-1:-1;;;23858:15:0;;;;;;;;;;;23822:51;23890:23;23886:59;;23922:23;;-1:-1:-1;;;23922:23:0;;;;;;;;;;;23886:59;23958:41;23977:10;23989:9;23958:18;:41::i;:::-;24010:39;24025:10;24037:11;24010:14;:39::i;:::-;24067:9;24062:549;24082:11;24078:1;:15;24062:549;;;24115:15;24133:8;24142:1;24133:11;;;;;;;;:::i;:::-;;;;;;;24115:29;;24251;24260:10;24272:7;24251:8;:29::i;:::-;24247:65;;;24289:23;;-1:-1:-1;;;24289:23:0;;-1:-1:-1;;;;;5132:32:1;;24289:23:0;;;5114:51:1;5087:18;;24289:23:0;4968:203:1;24247:65:0;-1:-1:-1;;;;;24333:21:0;;24329:49;;24363:15;;-1:-1:-1;;;24363:15:0;;;;;;;;;;;24329:49;24513:33;24523:10;24535:1;24538:7;24513:9;:33::i;:::-;24561:38;24573:10;24585:7;24594:4;24561:11;:38::i;:::-;-1:-1:-1;24095:3:0;;;:::i;:::-;;;24062:549;;45089:152;45179:54;45191:27;45211:6;45191:19;:27::i;:::-;45220:12;45179:11;:54::i;:::-;45089:152;;:::o;46413:133::-;46488:50;26959:66;46520:17;46488:11;:50::i;42563:174::-;42676:52;;;27247:29;42676:52;;;38764:19:1;38799:12;;;38792:28;;;42639:7:0;;38836:12:1;;42676:52:0;38607:247:1;55128:136:0;55193:7;55220:36;55228:27;55249:5;55228:20;:27::i;54969:151::-;55044:7;55071:41;55082:29;55098:5;55105;55082:15;:29::i;40449:629::-;40738:93;40763:9;40774:11;40787:13;40802:15;40819:11;40738:24;:93::i;:::-;40990:11;40960:15;-1:-1:-1;;;;;40847:223:0;40882:9;40847:223;40906:11;40932:13;41016:12;41043:16;40847:223;;;;;;;;;:::i;:::-;;;;;;;;40449:629;;;;;;;:::o;48870:154::-;48972:43;;;47532:24;48972:43;;;38764:19:1;38799:12;;;38792:28;;;48935:7:0;;38836:12:1;;48972:43:0;38607:247:1;48697:165:0;48809:44;;;47460:18;48809:44;;;39828:19:1;39863:12;;;39856:28;;;39900:12;;;39893:28;;;48772:7:0;;39937:12:1;;48809:44:0;;;;;;;;;;;;;48799:55;;;;;;48792:62;;48697:165;;;;:::o;9324:269::-;9526:58;;40202:66:1;9526:58:0;;;40190:79:1;40285:12;;;40278:28;;;9393:7:0;;40322:12:1;;9526:58:0;39960:380:1;7130:1920:0;7208:14;7278:9;:16;7298:2;7278:22;7274:59;;7309:24;;-1:-1:-1;;;7309:24:0;;;;;;;;;;;7274:59;7695:4;7680:20;;7674:27;7741:4;7726:20;;7720:27;7795:4;7780:20;;7774:27;7403:9;7766:36;8725:66;8712:79;;8708:102;;;8800:10;;-1:-1:-1;;;8800:10:0;;;;;;;;;;;8708:102;8827:1;:7;;8832:2;8827:7;;:18;;;;;8838:1;:7;;8843:2;8838:7;;8827:18;8823:41;;;8854:10;;-1:-1:-1;;;8854:10:0;;;;;;;;;;;8823:41;8976:24;;;9013:1;8976:24;;;;;;;;;40572:25:1;;;40645:4;40633:17;;40613:18;;;40606:45;;;;40667:18;;;40660:34;;;40710:18;;;40703:34;;;8976:24:0;;40544:19:1;;8976:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8967:33;;;-1:-1:-1;;;;;8966:49:0;;8962:80;;;9024:18;;-1:-1:-1;;;9024:18:0;;;;;;;;;;;8962:80;7224:1826;;;7130:1920;;;;:::o;48208:297::-;48302:4;48324:9;48319:155;48357:1;48339:8;:15;:19;;;;:::i;:::-;48335:1;:23;48319:155;;;48399:8;48408:5;:1;48412;48408:5;:::i;:::-;48399:15;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;48384:30:0;:8;48393:1;48384:11;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;48384:30:0;;48380:83;;-1:-1:-1;48442:5:0;;48208:297;-1:-1:-1;;48208:297:0:o;48380:83::-;48360:3;;;:::i;:::-;;;48319:155;;;-1:-1:-1;48493:4:0;;48208:297;-1:-1:-1;;48208:297:0:o;50886:388::-;50983:4;51000:17;51020:25;51039:5;51020:18;:25::i;:::-;51000:45;;51056:24;51098:9;51093:149;51113:8;:15;51109:1;:19;51093:149;;;51154:28;51163:5;51170:8;51179:1;51170:11;;;;;;;;:::i;:::-;;;;;;;51154:8;:28::i;:::-;:63;;;;-1:-1:-1;51208:9:0;51186:18;;;:::i;:::-;;;;:31;;51154:63;51150:80;;;51226:4;51219:11;;;;;;;51150:80;51130:3;;;:::i;:::-;;;51093:149;;;-1:-1:-1;51261:5:0;;50886:388;-1:-1:-1;;;;;50886:388:0:o;50304:476::-;50387:4;50404:13;50420;:11;:13::i;:::-;50404:29;-1:-1:-1;50444:20:0;50467:30;50495:1;28430:2;50467:30;:::i;:::-;50444:53;;50508:28;50547:12;50539:5;:20;:56;;50593:1;50539:56;;;50562:20;50570:12;50562:5;:20;:::i;:::-;50508:87;-1:-1:-1;50608:7:0;;;:::i;:::-;;;50626:122;50641:20;50633:5;:28;50626:122;;;50682:41;50705:7;;;;:::i;:::-;;;50714:8;50682:22;:41::i;:::-;50678:58;;;-1:-1:-1;50732:4:0;;50304:476;-1:-1:-1;;;;50304:476:0:o;50678:58::-;50626:122;;;-1:-1:-1;50767:5:0;;50304:476;-1:-1:-1;;;;50304:476:0:o;55747:471::-;55831:4;55848:13;55864:16;:14;:16::i;:::-;55848:32;-1:-1:-1;55891:20:0;55914:30;55942:1;28430:2;55914:30;:::i;:::-;55891:53;;55955:31;55997:12;55989:5;:20;:56;;56043:1;55989:56;;;56012:20;56020:12;56012:5;:20;:::i;:::-;55955:90;;56058:128;56073:23;56065:5;:31;56058:128;;;56117:44;56143:7;;;;:::i;:::-;;;56152:8;56117:25;:44::i;:::-;56113:61;;;-1:-1:-1;56170:4:0;;55747:471;-1:-1:-1;;;;55747:471:0:o;56113:61::-;56058:128;;45249:146;45332:55;45341:35;45366:9;45341:24;:35::i;44513:149::-;44581:9;44620:33;44628:24;44645:6;44628:16;:24::i;44620:33::-;44610:44;;;;;;;;:::i;44670:169::-;44748:19;44760:6;44748:11;:19::i;:::-;:53;;;-1:-1:-1;;;;;;;;;;;;17011:4:0;17035:17;:12;:17;;;;;;44771:30;44744:87;;;44824:6;44810:21;;-1:-1:-1;;;44810:21:0;;;;;;;;:::i;44141:278::-;44229:4;44247:12;44261:23;44288:12;-1:-1:-1;;;;;44288:17:0;44306:8;44288:27;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44246:69;;;;44333:7;:78;;;;-1:-1:-1;44345:17:0;;:31;;:65;;;44391:10;44380:30;;;;;;;;;;;;:::i;:::-;44326:85;44141:278;-1:-1:-1;;;;;44141:278:0:o;20911:164::-;21018:48;;;19086:24;21018:48;;;38764:19:1;38799:12;;;38792:28;;;20981:7:0;;38836:12:1;;21018:48:0;38607:247:1;20728:175:0;20845:49;;;19014:18;20845:49;;;39828:19:1;39863:12;;;39856:28;;;39900:12;;;39893:28;;;20808:7:0;;39937:12:1;;20845:49:0;39643:312:1;21722:184:0;21806:7;19415:21;21877:10;21889:7;21843:54;;;;;;;;;;:::i;21468:246::-;21641:64;;;19340:24;21641:64;;;41596:19:1;41631:12;;;41624:28;;;41668:12;;;;41661:28;;;41723:15;;;-1:-1:-1;;41719:53:1;41705:12;;;41698:75;-1:-1:-1;;41789:13:1;;21641:64:0;;;;;;;;;;;;21631:75;;;;;;21624:82;;21468:246;;;;;:::o;21263:197::-;21390:61;;;19256:30;21390:61;;;39828:19:1;39863:12;;;39856:28;;;39900:12;;;39893:28;;;21353:7:0;;39937:12:1;;21390:61:0;39643:312:1;21083:172:0;21194:52;;;19168:28;21194:52;;;38764:19:1;38799:12;;;38792:28;;;21157:7:0;;38836:12:1;;21194:52:0;38607:247:1;45797:608:0;46088:309;46111:256;46167:9;46195:11;46225:13;46257:15;46291:11;46321:6;46346;46111:37;:256::i;49032:162::-;49138:47;;;47614:28;49138:47;;;38764:19:1;38799:12;;;38792:28;;;49101:7:0;;38836:12:1;;49138:47:0;38607:247:1;53557:139:0;53639:49;53648:28;53670:5;53648:21;:28::i;52435:133::-;52514:46;52523:24;52541:5;52523:17;:24::i;49993:144::-;50066:4;50090:39;50098:30;50113:5;50120:7;50098:14;:30::i;52188:239::-;-1:-1:-1;;;;;52312:21:0;;52308:50;;52342:16;;-1:-1:-1;;;52342:16:0;;;;;;;;;;;52308:50;52371:48;52383:26;52396:5;52403;52383:12;:26::i;53704:178::-;53825:49;53834:30;53849:5;53856:7;53834:14;:30::i;54427:168::-;54536:50;;;48016:31;54536:50;;;38764:19:1;38799:12;;;38792:28;;;54499:7:0;;38836:12:1;;54536:50:0;38607:247:1;44933:148:0;45019:54;45028:24;45045:6;45028:16;:24::i;:::-;45062:9;45054:18;;;;;;;;:::i;:::-;17273:12;:17;;;;;;;;;;;:25;17207:99;59060:145;59145:52;59154:31;59179:5;59154:24;:31::i;57878:145::-;57963:52;57972:27;57993:5;57972:20;:27::i;55424:150::-;55500:4;55524:42;55532:33;55550:5;55557:7;55532:17;:33::i;57688:182::-;57811:51;57823:29;57839:5;57846;57823:15;:29::i;59213:190::-;59340:55;59349:33;59367:5;59374:7;59349:17;:33::i;24626:159::-;24718:59;24727:33;24749:10;24727:21;:33::i;23481:143::-;23565:51;23574:29;23592:10;23574:17;:29::i;23287:186::-;23412:53;23424:31;23437:10;23449:5;23424:12;:31::i;25229:188::-;25355:54;25364:35;25379:10;25391:7;25364:14;:35::i;17431:105::-;17500:20;;;;:15;:20;;;;;;:28;;-1:-1:-1;;;;;;17500:28:0;-1:-1:-1;;;;;17500:28:0;;;;;;;;;17431:105::o;54259:160::-;54364:46;;;47928:27;54364:46;;;38764:19:1;38799:12;;;38792:28;;;54327:7:0;;38836:12:1;;54364:46:0;38607:247:1;54080:171:0;54195:47;;;47850:21;54195:47;;;39828:19:1;39863:12;;;39856:28;;;39900:12;;;39893:28;;;54158:7:0;;39937:12:1;;54195:47:0;39643:312:1;45403:386:0;45630:151;45653:98;45683:9;45694:11;45707:13;45722:15;45739:11;45653:29;:98::i;56329:397::-;56429:4;56446:17;56466:28;56488:5;56466:21;:28::i;:::-;56446:48;;56505:24;56547:9;56542:152;56562:8;:15;56558:1;:19;56542:152;;;56603:31;56615:5;56622:8;56631:1;56622:11;;;;;;;;:::i;:::-;;;;;;;56603;:31::i;:::-;:66;;;;-1:-1:-1;56660:9:0;56638:18;;;:::i;:::-;;;;:31;;56603:66;56599:83;;;56678:4;56671:11;;;;;;;56599:83;56579:3;;;:::i;:::-;;;56542:152;;42049:160;42120:7;27411:23;42193:6;42157:43;;;;;;;;;:::i;49202:174::-;49281:7;47693:21;49352:5;49359:7;49318:49;;;;;;;;;;:::i;54603:180::-;54685:7;48101:24;54759:5;54766:7;54722:52;;;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;:::o;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;199:461::-;252:3;290:5;284:12;317:6;312:3;305:19;343:4;372:2;367:3;363:12;356:19;;409:2;402:5;398:14;430:1;440:195;454:6;451:1;448:13;440:195;;;519:13;;-1:-1:-1;;;;;515:39:1;503:52;;575:12;;;;610:15;;;;551:1;469:9;440:195;;;-1:-1:-1;651:3:1;;199:461;-1:-1:-1;;;;;199:461:1:o;665:261::-;844:2;833:9;826:21;807:4;864:56;916:2;905:9;901:18;893:6;864:56;:::i;931:347::-;982:8;992:6;1046:3;1039:4;1031:6;1027:17;1023:27;1013:55;;1064:1;1061;1054:12;1013:55;-1:-1:-1;1087:20:1;;-1:-1:-1;;;;;1119:30:1;;1116:50;;;1162:1;1159;1152:12;1116:50;1199:4;1191:6;1187:17;1175:29;;1251:3;1244:4;1235:6;1227;1223:19;1219:30;1216:39;1213:59;;;1268:1;1265;1258:12;1213:59;931:347;;;;;:::o;1283:409::-;1353:6;1361;1414:2;1402:9;1393:7;1389:23;1385:32;1382:52;;;1430:1;1427;1420:12;1382:52;1470:9;1457:23;-1:-1:-1;;;;;1495:6:1;1492:30;1489:50;;;1535:1;1532;1525:12;1489:50;1574:58;1624:7;1615:6;1604:9;1600:22;1574:58;:::i;:::-;1651:8;;1548:84;;-1:-1:-1;1283:409:1;-1:-1:-1;;;;1283:409:1:o;1879:477::-;1958:6;1966;1974;2027:2;2015:9;2006:7;2002:23;1998:32;1995:52;;;2043:1;2040;2033:12;1995:52;2083:9;2070:23;-1:-1:-1;;;;;2108:6:1;2105:30;2102:50;;;2148:1;2145;2138:12;2102:50;2187:58;2237:7;2228:6;2217:9;2213:22;2187:58;:::i;:::-;2264:8;;2161:84;;-1:-1:-1;2346:2:1;2331:18;;;;2318:32;;1879:477;-1:-1:-1;;;;1879:477:1:o;2361:1214::-;2501:6;2509;2517;2525;2533;2541;2549;2557;2565;2618:3;2606:9;2597:7;2593:23;2589:33;2586:53;;;2635:1;2632;2625:12;2586:53;2671:9;2658:23;2648:33;;2732:2;2721:9;2717:18;2704:32;-1:-1:-1;;;;;2796:2:1;2788:6;2785:14;2782:34;;;2812:1;2809;2802:12;2782:34;2851:58;2901:7;2892:6;2881:9;2877:22;2851:58;:::i;:::-;2928:8;;-1:-1:-1;2825:84:1;-1:-1:-1;3016:2:1;3001:18;;2988:32;;-1:-1:-1;3032:16:1;;;3029:36;;;3061:1;3058;3051:12;3029:36;3100:60;3152:7;3141:8;3130:9;3126:24;3100:60;:::i;:::-;3179:8;;-1:-1:-1;3074:86:1;-1:-1:-1;3261:2:1;3246:18;;3233:32;;-1:-1:-1;3318:3:1;3303:19;;3290:33;;-1:-1:-1;3335:16:1;;;3332:36;;;3364:1;3361;3354:12;3332:36;;3403:60;3455:7;3444:8;3433:9;3429:24;3403:60;:::i;:::-;2361:1214;;;;-1:-1:-1;2361:1214:1;;;;;;;;3482:8;3564:3;3549:19;3536:33;;2361:1214;-1:-1:-1;;;;2361:1214:1:o;3772:1006::-;3884:6;3892;3900;3908;3916;3924;3977:2;3965:9;3956:7;3952:23;3948:32;3945:52;;;3993:1;3990;3983:12;3945:52;4033:9;4020:23;-1:-1:-1;;;;;4103:2:1;4095:6;4092:14;4089:34;;;4119:1;4116;4109:12;4089:34;4158:58;4208:7;4199:6;4188:9;4184:22;4158:58;:::i;:::-;4235:8;;-1:-1:-1;4132:84:1;-1:-1:-1;4323:2:1;4308:18;;4295:32;;-1:-1:-1;4339:16:1;;;4336:36;;;4368:1;4365;4358:12;4336:36;4407:60;4459:7;4448:8;4437:9;4433:24;4407:60;:::i;:::-;4486:8;;-1:-1:-1;4381:86:1;-1:-1:-1;4574:2:1;4559:18;;4546:32;;-1:-1:-1;4590:16:1;;;4587:36;;;4619:1;4616;4609:12;4587:36;;4658:60;4710:7;4699:8;4688:9;4684:24;4658:60;:::i;:::-;3772:1006;;;;-1:-1:-1;3772:1006:1;;-1:-1:-1;3772:1006:1;;4737:8;;3772:1006;-1:-1:-1;;;3772:1006:1:o;5176:1076::-;5298:6;5306;5314;5322;5330;5338;5346;5399:3;5387:9;5378:7;5374:23;5370:33;5367:53;;;5416:1;5413;5406:12;5367:53;5456:9;5443:23;-1:-1:-1;;;;;5526:2:1;5518:6;5515:14;5512:34;;;5542:1;5539;5532:12;5512:34;5581:58;5631:7;5622:6;5611:9;5607:22;5581:58;:::i;:::-;5658:8;;-1:-1:-1;5555:84:1;-1:-1:-1;5746:2:1;5731:18;;5718:32;;-1:-1:-1;5762:16:1;;;5759:36;;;5791:1;5788;5781:12;5759:36;5830:60;5882:7;5871:8;5860:9;5856:24;5830:60;:::i;:::-;5909:8;;-1:-1:-1;5804:86:1;-1:-1:-1;5997:2:1;5982:18;;5969:32;;-1:-1:-1;6013:16:1;;;6010:36;;;6042:1;6039;6032:12;6010:36;;6081:60;6133:7;6122:8;6111:9;6107:24;6081:60;:::i;:::-;5176:1076;;;;-1:-1:-1;5176:1076:1;;;;;;6242:2;6227:18;;;6214:32;;5176:1076;-1:-1:-1;;;;5176:1076:1:o;6672:856::-;6782:6;6790;6798;6806;6814;6822;6875:3;6863:9;6854:7;6850:23;6846:33;6843:53;;;6892:1;6889;6882:12;6843:53;6928:9;6915:23;6905:33;;6989:2;6978:9;6974:18;6961:32;-1:-1:-1;;;;;7053:2:1;7045:6;7042:14;7039:34;;;7069:1;7066;7059:12;7039:34;7108:58;7158:7;7149:6;7138:9;7134:22;7108:58;:::i;:::-;7185:8;;-1:-1:-1;7082:84:1;-1:-1:-1;7273:2:1;7258:18;;7245:32;;-1:-1:-1;7289:16:1;;;7286:36;;;7318:1;7315;7308:12;7286:36;;7357:60;7409:7;7398:8;7387:9;7383:24;7357:60;:::i;:::-;6672:856;;;;-1:-1:-1;6672:856:1;;;;;7518:2;7503:18;;;7490:32;;6672:856;-1:-1:-1;;;;6672:856:1:o;7533:127::-;7594:10;7589:3;7585:20;7582:1;7575:31;7625:4;7622:1;7615:15;7649:4;7646:1;7639:15;7665:275;7736:2;7730:9;7801:2;7782:13;;-1:-1:-1;;7778:27:1;7766:40;;-1:-1:-1;;;;;7821:34:1;;7857:22;;;7818:62;7815:88;;;7883:18;;:::i;:::-;7919:2;7912:22;7665:275;;-1:-1:-1;7665:275:1:o;7945:187::-;7994:4;-1:-1:-1;;;;;8019:6:1;8016:30;8013:56;;;8049:18;;:::i;:::-;-1:-1:-1;8115:2:1;8094:15;-1:-1:-1;;8090:29:1;8121:4;8086:40;;7945:187::o;8137:464::-;8180:5;8233:3;8226:4;8218:6;8214:17;8210:27;8200:55;;8251:1;8248;8241:12;8200:55;8287:6;8274:20;8318:49;8334:32;8363:2;8334:32;:::i;:::-;8318:49;:::i;:::-;8392:2;8383:7;8376:19;8438:3;8431:4;8426:2;8418:6;8414:15;8410:26;8407:35;8404:55;;;8455:1;8452;8445:12;8404:55;8520:2;8513:4;8505:6;8501:17;8494:4;8485:7;8481:18;8468:55;8568:1;8543:16;;;8561:4;8539:27;8532:38;;;;8547:7;8137:464;-1:-1:-1;;;8137:464:1:o;8606:322::-;8675:6;8728:2;8716:9;8707:7;8703:23;8699:32;8696:52;;;8744:1;8741;8734:12;8696:52;8784:9;8771:23;-1:-1:-1;;;;;8809:6:1;8806:30;8803:50;;;8849:1;8846;8839:12;8803:50;8872;8914:7;8905:6;8894:9;8890:22;8872:50;:::i;8933:258::-;9005:1;9015:113;9029:6;9026:1;9023:13;9015:113;;;9105:11;;;9099:18;9086:11;;;9079:39;9051:2;9044:10;9015:113;;;9146:6;9143:1;9140:13;9137:48;;;-1:-1:-1;;9181:1:1;9163:16;;9156:27;8933:258::o;9196:::-;9238:3;9276:5;9270:12;9303:6;9298:3;9291:19;9319:63;9375:6;9368:4;9363:3;9359:14;9352:4;9345:5;9341:16;9319:63;:::i;:::-;9436:2;9415:15;-1:-1:-1;;9411:29:1;9402:39;;;;9443:4;9398:50;;9196:258;-1:-1:-1;;9196:258:1:o;9459:220::-;9608:2;9597:9;9590:21;9571:4;9628:45;9669:2;9658:9;9654:18;9646:6;9628:45;:::i;9684:131::-;-1:-1:-1;;;;;9759:31:1;;9749:42;;9739:70;;9805:1;9802;9795:12;9820:612;9908:6;9916;9924;9932;9985:2;9973:9;9964:7;9960:23;9956:32;9953:52;;;10001:1;9998;9991:12;9953:52;10040:9;10027:23;10059:31;10084:5;10059:31;:::i;:::-;10109:5;-1:-1:-1;10161:2:1;10146:18;;10133:32;;-1:-1:-1;10216:2:1;10201:18;;10188:32;-1:-1:-1;;;;;10232:30:1;;10229:50;;;10275:1;10272;10265:12;10229:50;10314:58;10364:7;10355:6;10344:9;10340:22;10314:58;:::i;:::-;9820:612;;;;-1:-1:-1;10391:8:1;-1:-1:-1;;;;9820:612:1:o;10437:1364::-;10579:6;10587;10595;10603;10611;10619;10627;10635;10643;10696:3;10684:9;10675:7;10671:23;10667:33;10664:53;;;10713:1;10710;10703:12;10664:53;10753:9;10740:23;-1:-1:-1;;;;;10823:2:1;10815:6;10812:14;10809:34;;;10839:1;10836;10829:12;10809:34;10878:58;10928:7;10919:6;10908:9;10904:22;10878:58;:::i;:::-;10955:8;;-1:-1:-1;10852:84:1;-1:-1:-1;11043:2:1;11028:18;;11015:32;;-1:-1:-1;11059:16:1;;;11056:36;;;11088:1;11085;11078:12;11056:36;11127:60;11179:7;11168:8;11157:9;11153:24;11127:60;:::i;:::-;11206:8;;-1:-1:-1;11101:86:1;-1:-1:-1;11294:2:1;11279:18;;11266:32;;-1:-1:-1;11310:16:1;;;11307:36;;;11339:1;11336;11329:12;11307:36;11378:60;11430:7;11419:8;11408:9;11404:24;11378:60;:::i;:::-;11457:8;;-1:-1:-1;11352:86:1;-1:-1:-1;11545:2:1;11530:18;;11517:32;;-1:-1:-1;11561:16:1;;;11558:36;;;11590:1;11587;11580:12;11558:36;;11629:60;11681:7;11670:8;11659:9;11655:24;11629:60;:::i;:::-;10437:1364;;;;-1:-1:-1;10437:1364:1;;;;;;;;11708:8;11790:3;11775:19;11762:33;;10437:1364;-1:-1:-1;;;;10437:1364:1:o;11806:1350::-;11955:6;11963;11971;11979;11987;11995;12003;12011;12019;12027;12080:3;12068:9;12059:7;12055:23;12051:33;12048:53;;;12097:1;12094;12087:12;12048:53;12133:9;12120:23;12110:33;;12194:2;12183:9;12179:18;12166:32;-1:-1:-1;;;;;12258:2:1;12250:6;12247:14;12244:34;;;12274:1;12271;12264:12;12244:34;12313:58;12363:7;12354:6;12343:9;12339:22;12313:58;:::i;:::-;12390:8;;-1:-1:-1;12287:84:1;-1:-1:-1;12478:2:1;12463:18;;12450:32;;-1:-1:-1;12494:16:1;;;12491:36;;;12523:1;12520;12513:12;12491:36;12562:60;12614:7;12603:8;12592:9;12588:24;12562:60;:::i;:::-;12641:8;;-1:-1:-1;12536:86:1;-1:-1:-1;12726:2:1;12711:18;;12698:32;;-1:-1:-1;12739:31:1;12698:32;12739:31;:::i;:::-;12789:5;;-1:-1:-1;12841:3:1;12826:19;;12813:33;;-1:-1:-1;12899:3:1;12884:19;;12871:33;;12916:16;;;12913:36;;;12945:1;12942;12935:12;12913:36;;12984:60;13036:7;13025:8;13014:9;13010:24;12984:60;:::i;:::-;12958:86;;13063:8;13053:18;;;13090:8;13080:18;;;13145:3;13134:9;13130:19;13117:33;13107:43;;11806:1350;;;;;;;;;;;;;:::o;13564:992::-;13683:6;13691;13699;13707;13715;13723;13731;13784:3;13772:9;13763:7;13759:23;13755:33;13752:53;;;13801:1;13798;13791:12;13752:53;13837:9;13824:23;13814:33;;13898:2;13887:9;13883:18;13870:32;-1:-1:-1;;;;;13962:2:1;13954:6;13951:14;13948:34;;;13978:1;13975;13968:12;13948:34;14017:58;14067:7;14058:6;14047:9;14043:22;14017:58;:::i;:::-;14094:8;;-1:-1:-1;13991:84:1;-1:-1:-1;14182:2:1;14167:18;;14154:32;;-1:-1:-1;14198:16:1;;;14195:36;;;14227:1;14224;14217:12;14195:36;;14266:60;14318:7;14307:8;14296:9;14292:24;14266:60;:::i;:::-;14345:8;;-1:-1:-1;14240:86:1;-1:-1:-1;;14430:2:1;14415:18;;14402:32;14443:31;14402:32;14443:31;:::i;:::-;14493:5;14483:15;;;14545:3;14534:9;14530:19;14517:33;14507:43;;13564:992;;;;;;;;;;:::o;14561:127::-;14622:10;14617:3;14613:20;14610:1;14603:31;14653:4;14650:1;14643:15;14677:4;14674:1;14667:15;14693:127;14754:10;14749:3;14745:20;14742:1;14735:31;14785:4;14782:1;14775:15;14809:4;14806:1;14799:15;14825:135;14864:3;-1:-1:-1;;14885:17:1;;14882:43;;;14905:18;;:::i;:::-;-1:-1:-1;14952:1:1;14941:13;;14825:135::o;14965:181::-;15023:4;-1:-1:-1;;;;;15048:6:1;15045:30;15042:56;;;15078:18;;:::i;:::-;-1:-1:-1;15123:1:1;15119:14;15135:4;15115:25;;14965:181::o;15151:1329::-;15262:6;15270;15323:2;15311:9;15302:7;15298:23;15294:32;15291:52;;;15339:1;15336;15329:12;15291:52;15379:9;15366:23;-1:-1:-1;;;;;15449:2:1;15441:6;15438:14;15435:34;;;15465:1;15462;15455:12;15435:34;15488:50;15530:7;15521:6;15510:9;15506:22;15488:50;:::i;:::-;15478:60;;15557:2;15547:12;;15612:2;15601:9;15597:18;15584:32;15641:2;15631:8;15628:16;15625:36;;;15657:1;15654;15647:12;15625:36;15680:24;;15735:4;15727:13;;15723:27;-1:-1:-1;15713:55:1;;15764:1;15761;15754:12;15713:55;15800:2;15787:16;15823:58;15839:41;15877:2;15839:41;:::i;15823:58::-;15915:15;;;15997:1;15993:10;;;;15985:19;;15981:28;;;15946:12;;;;16021:19;;;16018:39;;;16053:1;16050;16043:12;16018:39;16085:2;16081;16077:11;16097:353;16113:6;16108:3;16105:15;16097:353;;;16199:3;16186:17;16235:2;16222:11;16219:19;16216:109;;;16279:1;16308:2;16304;16297:14;16216:109;16350:57;16399:7;16394:2;16380:11;16376:2;16372:20;16368:29;16350:57;:::i;:::-;16338:70;;-1:-1:-1;16428:12:1;;;;16130;;16097:353;;;16101:3;16469:5;16459:15;;;;;;;;15151:1329;;;;;:::o;16485:142::-;16561:20;;16590:31;16561:20;16590:31;:::i;:::-;16485:142;;;:::o;16632:533::-;16727:6;16735;16743;16796:2;16784:9;16775:7;16771:23;16767:32;16764:52;;;16812:1;16809;16802:12;16764:52;16852:9;16839:23;-1:-1:-1;;;;;16877:6:1;16874:30;16871:50;;;16917:1;16914;16907:12;16871:50;16940;16982:7;16973:6;16962:9;16958:22;16940:50;:::i;:::-;16930:60;;;17040:2;17029:9;17025:18;17012:32;17053:31;17078:5;17053:31;:::i;:::-;16632:533;;17103:5;;-1:-1:-1;;;17155:2:1;17140:18;;;;17127:32;;16632:533::o;17170:271::-;17353:6;17345;17340:3;17327:33;17309:3;17379:16;;17404:13;;;17379:16;17170:271;-1:-1:-1;17170:271:1:o;17446:267::-;17535:6;17530:3;17523:19;17587:6;17580:5;17573:4;17568:3;17564:14;17551:43;-1:-1:-1;17639:1:1;17614:16;;;17632:4;17610:27;;;17603:38;;;;17695:2;17674:15;;;-1:-1:-1;;17670:29:1;17661:39;;;17657:50;;17446:267::o;17718:625::-;17991:2;17980:9;17973:21;17954:4;18017:62;18075:2;18064:9;18060:18;18052:6;18044;18017:62;:::i;:::-;18127:9;18119:6;18115:22;18110:2;18099:9;18095:18;18088:50;18161;18204:6;18196;18188;18161:50;:::i;:::-;18147:64;;18259:9;18251:6;18247:22;18242:2;18231:9;18227:18;18220:50;18287;18330:6;18322;18314;18287:50;:::i;:::-;18279:58;17718:625;-1:-1:-1;;;;;;;;;17718:625:1:o;18348:700::-;18651:3;18640:9;18633:22;18614:4;18678:63;18736:3;18725:9;18721:19;18713:6;18705;18678:63;:::i;:::-;18789:9;18781:6;18777:22;18772:2;18761:9;18757:18;18750:50;18823;18866:6;18858;18850;18823:50;:::i;:::-;18809:64;;18921:9;18913:6;18909:22;18904:2;18893:9;18889:18;18882:50;18949;18992:6;18984;18976;18949:50;:::i;:::-;18941:58;;;19035:6;19030:2;19019:9;19015:18;19008:34;18348:700;;;;;;;;;;:::o;19053:128::-;19093:3;19124:1;19120:6;19117:1;19114:13;19111:39;;;19130:18;;:::i;:::-;-1:-1:-1;19166:9:1;;19053:128::o;19186:247::-;19345:2;19334:9;19327:21;19308:4;19365:62;19423:2;19412:9;19408:18;19400:6;19392;19365:62;:::i;19438:390::-;19516:6;19524;19577:2;19565:9;19556:7;19552:23;19548:32;19545:52;;;19593:1;19590;19583:12;19545:52;19633:9;19620:23;-1:-1:-1;;;;;19658:6:1;19655:30;19652:50;;;19698:1;19695;19688:12;19652:50;19721;19763:7;19754:6;19743:9;19739:22;19721:50;:::i;:::-;19711:60;19818:2;19803:18;;;;19790:32;;-1:-1:-1;;;;19438:390:1:o;19833:1110::-;19993:6;20001;20009;20017;20025;20033;20041;20049;20102:3;20090:9;20081:7;20077:23;20073:33;20070:53;;;20119:1;20116;20109:12;20070:53;20159:9;20146:23;-1:-1:-1;;;;;20229:2:1;20221:6;20218:14;20215:34;;;20245:1;20242;20235:12;20215:34;20268:50;20310:7;20301:6;20290:9;20286:22;20268:50;:::i;:::-;20258:60;;20371:2;20360:9;20356:18;20343:32;20327:48;;20400:2;20390:8;20387:16;20384:36;;;20416:1;20413;20406:12;20384:36;20439:52;20483:7;20472:8;20461:9;20457:24;20439:52;:::i;:::-;20429:62;;20510:46;20552:2;20541:9;20537:18;20510:46;:::i;:::-;20500:56;;20603:2;20592:9;20588:18;20575:32;20565:42;;20660:3;20649:9;20645:19;20632:33;20616:49;;20690:2;20680:8;20677:16;20674:36;;;20706:1;20703;20696:12;20674:36;;20729:52;20773:7;20762:8;20751:9;20747:24;20729:52;:::i;:::-;19833:1110;;;;-1:-1:-1;19833:1110:1;;;;20719:62;20828:3;20813:19;;20800:33;;-1:-1:-1;20880:3:1;20865:19;;20852:33;;20932:3;20917:19;20904:33;;-1:-1:-1;19833:1110:1;-1:-1:-1;;;19833:1110:1:o;20948:735::-;21002:5;21055:3;21048:4;21040:6;21036:17;21032:27;21022:55;;21073:1;21070;21063:12;21022:55;21109:6;21096:20;21135:4;21159:58;21175:41;21213:2;21175:41;:::i;21159:58::-;21251:15;;;21337:1;21333:10;;;;21321:23;;21317:32;;;21282:12;;;;21361:15;;;21358:35;;;21389:1;21386;21379:12;21358:35;21425:2;21417:6;21413:15;21437:217;21453:6;21448:3;21445:15;21437:217;;;21533:3;21520:17;21550:31;21575:5;21550:31;:::i;:::-;21594:18;;21632:12;;;;21470;;21437:217;;21688:416;21781:6;21789;21842:2;21830:9;21821:7;21817:23;21813:32;21810:52;;;21858:1;21855;21848:12;21810:52;21898:9;21885:23;-1:-1:-1;;;;;21923:6:1;21920:30;21917:50;;;21963:1;21960;21953:12;21917:50;21986:61;22039:7;22030:6;22019:9;22015:22;21986:61;:::i;22109:609::-;22422:3;22411:9;22404:22;22385:4;22449:57;22501:3;22490:9;22486:19;22478:6;22449:57;:::i;:::-;22542:6;22537:2;22526:9;22522:18;22515:34;22597:9;22589:6;22585:22;22580:2;22569:9;22565:18;22558:50;22625:44;22662:6;22654;22625:44;:::i;:::-;22617:52;;;22705:6;22700:2;22689:9;22685:18;22678:34;22109:609;;;;;;;:::o;22723:919::-;22844:6;22852;22860;22868;22876;22929:3;22917:9;22908:7;22904:23;22900:33;22897:53;;;22946:1;22943;22936:12;22897:53;22986:9;22973:23;-1:-1:-1;;;;;23056:2:1;23048:6;23045:14;23042:34;;;23072:1;23069;23062:12;23042:34;23095:50;23137:7;23128:6;23117:9;23113:22;23095:50;:::i;:::-;23085:60;;23198:2;23187:9;23183:18;23170:32;23154:48;;23227:2;23217:8;23214:16;23211:36;;;23243:1;23240;23233:12;23211:36;;23266:52;23310:7;23299:8;23288:9;23284:24;23266:52;:::i;:::-;23256:62;;;23368:2;23357:9;23353:18;23340:32;23412:4;23405:5;23401:16;23394:5;23391:27;23381:55;;23432:1;23429;23422:12;23381:55;23455:5;-1:-1:-1;23507:2:1;23492:18;;23479:32;;-1:-1:-1;23563:3:1;23548:19;;23535:33;23577;23535;23577;:::i;:::-;23629:7;23619:17;;;22723:919;;;;;;;;:::o;23647:380::-;23726:1;23722:12;;;;23769;;;23790:61;;23844:4;23836:6;23832:17;23822:27;;23790:61;23897:2;23889:6;23886:14;23866:18;23863:38;23860:161;;;23943:10;23938:3;23934:20;23931:1;23924:31;23978:4;23975:1;23968:15;24006:4;24003:1;23996:15;23860:161;;23647:380;;;:::o;24032:1028::-;24211:6;24219;24227;24235;24243;24251;24304:3;24292:9;24283:7;24279:23;24275:33;24272:53;;;24321:1;24318;24311:12;24272:53;24361:9;24348:23;-1:-1:-1;;;;;24431:2:1;24423:6;24420:14;24417:34;;;24447:1;24444;24437:12;24417:34;24470:61;24523:7;24514:6;24503:9;24499:22;24470:61;:::i;:::-;24460:71;;24578:2;24567:9;24563:18;24550:32;24540:42;;24635:2;24624:9;24620:18;24607:32;24591:48;;24664:2;24654:8;24651:16;24648:36;;;24680:1;24677;24670:12;24648:36;24703:63;24758:7;24747:8;24736:9;24732:24;24703:63;:::i;:::-;24693:73;;24813:2;24802:9;24798:18;24785:32;24775:42;;24870:3;24859:9;24855:19;24842:33;24826:49;;24900:2;24890:8;24887:16;24884:36;;;24916:1;24913;24906:12;24884:36;;24939:63;24994:7;24983:8;24972:9;24968:24;24939:63;:::i;:::-;24929:73;;;25049:3;25038:9;25034:19;25021:33;25011:43;;24032:1028;;;;;;;;:::o;25315:274::-;25444:3;25482:6;25476:13;25498:53;25544:6;25539:3;25532:4;25524:6;25520:17;25498:53;:::i;:::-;25567:16;;;;;25315:274;-1:-1:-1;;25315:274:1:o;25594:889::-;25953:3;25942:9;25935:22;25916:4;25980:63;26038:3;26027:9;26023:19;26015:6;26007;25980:63;:::i;:::-;26091:9;26083:6;26079:22;26074:2;26063:9;26059:18;26052:50;26125;26168:6;26160;26152;26125:50;:::i;:::-;26111:64;;26223:9;26215:6;26211:22;26206:2;26195:9;26191:18;26184:50;26257;26300:6;26292;26284;26257:50;:::i;:::-;26243:64;;26355:9;26347:6;26343:22;26338:2;26327:9;26323:18;26316:50;26383;26426:6;26418;26410;26383:50;:::i;:::-;26375:58;;;26470:6;26464:3;26453:9;26449:19;26442:35;25594:889;;;;;;;;;;;;:::o;26488:893::-;26620:6;26628;26636;26644;26652;26660;26713:3;26701:9;26692:7;26688:23;26684:33;26681:53;;;26730:1;26727;26720:12;26681:53;26770:9;26757:23;-1:-1:-1;;;;;26840:2:1;26832:6;26829:14;26826:34;;;26856:1;26853;26846:12;26826:34;26879:50;26921:7;26912:6;26901:9;26897:22;26879:50;:::i;:::-;26869:60;;26982:2;26971:9;26967:18;26954:32;26938:48;;27011:2;27001:8;26998:16;26995:36;;;27027:1;27024;27017:12;26995:36;;27050:52;27094:7;27083:8;27072:9;27068:24;27050:52;:::i;:::-;27040:62;;;27152:2;27141:9;27137:18;27124:32;27165:31;27190:5;27165:31;:::i;:::-;26488:893;;;;-1:-1:-1;27215:5:1;;27267:2;27252:18;;27239:32;;-1:-1:-1;27318:3:1;27303:19;;27290:33;;27370:3;27355:19;;;27342:33;;-1:-1:-1;26488:893:1;-1:-1:-1;;26488:893:1:o;27386:309::-;27462:5;27491:53;27507:36;27536:6;27507:36;:::i;27491:53::-;27482:62;;27567:6;27560:5;27553:21;27607:3;27598:6;27593:3;27589:16;27586:25;27583:45;;;27624:1;27621;27614:12;27583:45;27637:52;27682:6;27675:4;27668:5;27664:16;27659:3;27637:52;:::i;27700:1088::-;27764:5;27817:3;27810:4;27802:6;27798:17;27794:27;27784:55;;27835:1;27832;27825:12;27784:55;27864:6;27858:13;27890:4;27914:58;27930:41;27968:2;27930:41;:::i;27914:58::-;28006:15;;;28092:1;28088:10;;;;28076:23;;28072:32;;;28037:12;;;;28116:15;;;28113:35;;;28144:1;28141;28134:12;28113:35;28180:2;28172:6;28168:15;28192:567;28208:6;28203:3;28200:15;28192:567;;;28287:3;28281:10;-1:-1:-1;;;;;28310:11:1;28307:35;28304:125;;;28383:1;28412:2;28408;28401:14;28304:125;28452:24;;28511:2;28503:11;;28499:21;-1:-1:-1;28489:119:1;;28562:1;28591:2;28587;28580:14;28489:119;28633:83;28712:3;28706:2;28702;28698:11;28692:18;28687:2;28683;28679:11;28633:83;:::i;:::-;28621:96;;-1:-1:-1;28737:12:1;;;;28225;;28192:567;;28793:236;28846:5;28899:3;28892:4;28884:6;28880:17;28876:27;28866:55;;28917:1;28914;28907:12;28866:55;28939:84;29019:3;29010:6;29004:13;28997:4;28989:6;28985:17;28939:84;:::i;29034:892::-;29097:5;29150:3;29143:4;29135:6;29131:17;29127:27;29117:55;;29168:1;29165;29158:12;29117:55;29197:6;29191:13;29223:4;29247:58;29263:41;29301:2;29263:41;:::i;29247:58::-;29339:15;;;29425:1;29421:10;;;;29409:23;;29405:32;;;29370:12;;;;29449:15;;;29446:35;;;29477:1;29474;29467:12;29446:35;29513:2;29505:6;29501:15;29525:372;29541:6;29536:3;29533:15;29525:372;;;29620:3;29614:10;-1:-1:-1;;;;;29643:11:1;29640:35;29637:125;;;29716:1;29745:2;29741;29734:14;29637:125;29787:67;29850:3;29845:2;29831:11;29823:6;29819:24;29815:33;29787:67;:::i;:::-;29775:80;;-1:-1:-1;29875:12:1;;;;29558;;29525:372;;29931:1585;30140:6;30148;30156;30164;30172;30225:3;30213:9;30204:7;30200:23;30196:33;30193:53;;;30242:1;30239;30232:12;30193:53;30271:9;30265:16;30255:26;;30300:2;30345;30334:9;30330:18;30324:25;30378:1;30371:5;30368:12;30358:40;;30394:1;30391;30384:12;30358:40;30466:2;30451:18;;30445:25;30417:5;;-1:-1:-1;;;;;;30519:14:1;;;30516:34;;;30546:1;30543;30536:12;30516:34;30584:6;30573:9;30569:22;30559:32;;30629:7;30622:4;30618:2;30614:13;30610:27;30600:55;;30651:1;30648;30641:12;30600:55;30680:2;30674:9;30703:58;30719:41;30757:2;30719:41;:::i;30703:58::-;30795:15;;;30877:1;30873:10;;;;30865:19;;30861:28;;;30826:12;;;;30901:19;;;30898:39;;;30933:1;30930;30923:12;30898:39;30957:11;;;;30977:135;30993:6;30988:3;30985:15;30977:135;;;31059:10;;31047:23;;31010:12;;;;31090;;;;30977:135;;;31182:2;31167:18;;31161:25;31131:5;;-1:-1:-1;31161:25:1;-1:-1:-1;;;31198:16:1;;;31195:36;;;31227:1;31224;31217:12;31195:36;31250:73;31315:7;31304:8;31293:9;31289:24;31250:73;:::i;:::-;31240:83;;31369:3;31358:9;31354:19;31348:26;31332:42;;31399:2;31389:8;31386:16;31383:36;;;31415:1;31412;31405:12;31383:36;;;31438:72;31502:7;31491:8;31480:9;31476:24;31438:72;:::i;:::-;31428:82;;;29931:1585;;;;;;;;:::o;31521:127::-;31582:10;31577:3;31573:20;31570:1;31563:31;31613:4;31610:1;31603:15;31637:4;31634:1;31627:15;31934:289;32109:2;32098:9;32091:21;32072:4;32129:45;32170:2;32159:9;32155:18;32147:6;32129:45;:::i;:::-;32121:53;;32210:6;32205:2;32194:9;32190:18;32183:34;31934:289;;;;;:::o;32507:953::-;32855:4;32884:3;32914:6;32903:9;32896:25;32957:6;32952:2;32941:9;32937:18;32930:34;33000:2;32995;32984:9;32980:18;32973:30;33026:45;33067:2;33056:9;33052:18;33044:6;33026:45;:::i;:::-;33012:59;;33119:9;33111:6;33107:22;33102:2;33091:9;33087:18;33080:50;33153:33;33179:6;33171;33153:33;:::i;:::-;-1:-1:-1;;;;;33223:32:1;;33217:3;33202:19;;33195:61;33243:3;33272:19;;33265:35;;;33337:22;;;33331:3;33316:19;;33309:51;33139:47;-1:-1:-1;33377:33:1;33139:47;33395:6;33377:33;:::i;:::-;33369:41;;;33447:6;33441:3;33430:9;33426:19;33419:35;32507:953;;;;;;;;;;;:::o;34027:251::-;34097:6;34150:2;34138:9;34129:7;34125:23;34121:32;34118:52;;;34166:1;34163;34156:12;34118:52;34198:9;34192:16;34217:31;34242:5;34217:31;:::i;34283:348::-;34472:6;34467:3;34460:19;34442:3;34508:6;34502:13;34524:60;34577:6;34572:2;34567:3;34563:12;34558:2;34550:6;34546:15;34524:60;:::i;:::-;34604:16;;;;34622:2;34600:25;;34283:348;-1:-1:-1;;;34283:348:1:o;34636:184::-;34706:6;34759:2;34747:9;34738:7;34734:23;34730:32;34727:52;;;34775:1;34772;34765:12;34727:52;-1:-1:-1;34798:16:1;;34636:184;-1:-1:-1;34636:184:1:o;34825:315::-;-1:-1:-1;;;;;35000:32:1;;34982:51;;35069:2;35064;35049:18;;35042:30;;;-1:-1:-1;;35089:45:1;;35115:18;;35107:6;35089:45;:::i;35145:164::-;35221:13;;35270;;35263:21;35253:32;;35243:60;;35299:1;35296;35289:12;35314:414;35399:6;35407;35460:2;35448:9;35439:7;35435:23;35431:32;35428:52;;;35476:1;35473;35466:12;35428:52;35499:37;35526:9;35499:37;:::i;:::-;35489:47;;35580:2;35569:9;35565:18;35559:25;-1:-1:-1;;;;;35599:6:1;35596:30;35593:50;;;35639:1;35636;35629:12;35593:50;35662:60;35714:7;35705:6;35694:9;35690:22;35662:60;:::i;:::-;35652:70;;;35314:414;;;;;:::o;35733:202::-;35800:6;35853:2;35841:9;35832:7;35828:23;35824:32;35821:52;;;35869:1;35866;35859:12;35821:52;35892:37;35919:9;35892:37;:::i;35940:763::-;36269:3;36258:9;36251:22;36232:4;36296:46;36337:3;36326:9;36322:19;36314:6;36296:46;:::i;:::-;36390:9;36382:6;36378:22;36373:2;36362:9;36358:18;36351:50;36424:33;36450:6;36442;36424:33;:::i;:::-;36410:47;;36505:9;36497:6;36493:22;36488:2;36477:9;36473:18;36466:50;36533:33;36559:6;36551;36533:33;:::i;:::-;36597:2;36582:18;;36575:34;;;;-1:-1:-1;;36640:3:1;36625:19;;36618:35;;;;36684:3;36669:19;;;36662:35;36525:41;35940:763;-1:-1:-1;;;35940:763:1:o;36708:697::-;37017:6;37006:9;36999:25;37060:6;37055:2;37044:9;37040:18;37033:34;37103:3;37098:2;37087:9;37083:18;37076:31;36980:4;37130:46;37171:3;37160:9;37156:19;37148:6;37130:46;:::i;:::-;37224:9;37216:6;37212:22;37207:2;37196:9;37192:18;37185:50;37252:33;37278:6;37270;37252:33;:::i;:::-;-1:-1:-1;;;;;37322:32:1;;;;37316:3;37301:19;;37294:61;-1:-1:-1;;37342:3:1;37371:19;37364:35;37244:41;36708:697;-1:-1:-1;;;;36708:697:1:o;37410:606::-;37687:3;37676:9;37669:22;37650:4;37714:46;37755:3;37744:9;37740:19;37732:6;37714:46;:::i;:::-;37808:9;37800:6;37796:22;37791:2;37780:9;37776:18;37769:50;37836:33;37862:6;37854;37836:33;:::i;:::-;37917:4;37905:17;;;;37900:2;37885:18;;37878:45;-1:-1:-1;;37954:2:1;37939:18;;37932:34;;;;37997:3;37982:19;;;37975:35;37828:41;37410:606;-1:-1:-1;;37410:606:1:o;38285:317::-;38462:2;38451:9;38444:21;38425:4;38482:45;38523:2;38512:9;38508:18;38500:6;38482:45;:::i;:::-;38474:53;;38592:1;38588;38583:3;38579:11;38575:19;38567:6;38563:32;38558:2;38547:9;38543:18;38536:60;38285:317;;;;;:::o;38859:527::-;39112:3;39101:9;39094:22;39075:4;39139:46;39180:3;39169:9;39165:19;39157:6;39139:46;:::i;:::-;39233:9;39225:6;39221:22;39216:2;39205:9;39201:18;39194:50;39261:33;39287:6;39279;39261:33;:::i;:::-;39325:2;39310:18;;39303:34;;;;-1:-1:-1;;39368:2:1;39353:18;39346:34;39253:41;38859:527;-1:-1:-1;;38859:527:1:o;40748:125::-;40788:4;40816:1;40813;40810:8;40807:34;;;40821:18;;:::i;:::-;-1:-1:-1;40858:9:1;;40748:125::o;40878:136::-;40917:3;40945:5;40935:39;;40954:18;;:::i;:::-;-1:-1:-1;;;40990:18:1;;40878:136::o;41019:359::-;41204:19;;;41248:2;41239:12;;41232:28;;;;41298:2;41294:15;-1:-1:-1;;41290:53:1;41285:2;41276:12;;41269:75;41369:2;41360:12;;41019:359::o

Swarm Source

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