ETH Price: $2,671.31 (+1.29%)

Token

Zeneca x Nas Academy On Chain (ZENXNAS)
 

Overview

Max Total Supply

172 ZENXNAS

Holders

172

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
pumilia.eth
Balance
1 ZENXNAS
0xef95A24922728442c3b9FC53AAb0a14DdBA9Fd0A
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ZenecaxNasAcademyOnChainNFTs

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 8888 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-23
*/

// File: contracts/Base64.sol


// Contract Author: FuriousFlash (https://twitter.com/FuriousFlashETH)
pragma solidity ^0.8.13;

/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);
        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)
            for {
                let i := 0
            } lt(i, len) {
            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)
                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)
                mstore(resultPtr, out)
                resultPtr := add(resultPtr, 4)
            }
            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }
            mstore(result, encodedLen)
        }
        return string(result);
    }
}
// File: @openzeppelin/contracts/utils/Counters.sol


// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;


/**
 * @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 {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. 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.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @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) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // 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 (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): 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) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

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

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * 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));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/security/Pausable.sol


// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: contracts/ZenecaxNasAcademy.sol


pragma solidity ^0.8.13;









/**
 * @title Zeneca x Nas Academy On Chain NFTs
 * @author FuriousFlash (https://twitter.com/FuriousFlashETH)
 */
contract ZenecaxNasAcademyOnChainNFTs is
    ERC721Enumerable,
    Pausable,
    Ownable,
    ReentrancyGuard
{
    using ECDSA for bytes32;
    using Strings for uint256;
    using Counters for Counters.Counter;

    Counters.Counter public tokenIds;
    string public baseTokenURI;
    string public baseImageURI;

    uint256 public immutable maxSupply;
    uint256 public immutable firstSaleSupply;

    /**
     * @notice Construct a Zeneca x Nas Academy On Chain NFTs Contract instance
     * @param name Token name
     * @param symbol Token symbol
     * @param baseTokenURI_ Base URI for all tokens
     */
    constructor(
        string memory name,
        string memory symbol,
        string memory baseTokenURI_,
        string memory baseImageURI_,
        uint256 maxSupply_,
        uint256 firstSaleSupply_
    ) ERC721(name, symbol) {
        require(maxSupply_ > 0, "INVALID_SUPPLY");
        baseTokenURI = baseTokenURI_;
        baseImageURI = baseImageURI_;
        maxSupply = maxSupply_;
        firstSaleSupply = firstSaleSupply_;

        // Start token IDs at 1
        tokenIds.increment();
    }

    // Used to validate authorized mint addresses
    address private signerAddress = 0x0cCF0888754C15f2624952AbE6b491239148F2F1;

    // Used as refund address for tokens
    address private refundAddress =
        0x69446130C42d1558cDB61A166cBc9E344264e432;
    
    uint256 private tokensWithMetadata = 0;

    mapping(address => uint256) public totalMintedPerAddress;
    mapping(uint256 => bytes) private tokensMetadata;

    struct Ticket {
        string author;
        string imageURI;
        string quote;
    }

    struct BaseMetadata {
        string metadataStart;
        string metadataDescription1;
        string metadataImage;
        string metadataAttributesStart;
        string metadataAttribute1;
        string metadataAttribute2;
        string metadataAttribute3;
        string metadataAttribute4;
        string metadataAttributesEnd;
        string metadataEnd;
    }

    BaseMetadata private baseMeta =
        BaseMetadata({
            metadataStart: '{ "name": "Zeneca x Nas Academy Ticket #',
            metadataDescription1: '", "description": "Exclusive Ticket for purchasing & completing Zeneca x Nas Academy Class',
            metadataImage: '", "image": "',
            metadataAttributesStart: '", "attributes": [ { ',
            metadataAttribute1: '"trait_type": "Serial Number", "value": "',
            metadataAttribute2: '" }, { "trait_type": "Author", "value": "',
            metadataAttribute3: '" }, { "trait_type": "Issue Year", "value": "2022"',
            metadataAttribute4: ' }, { "trait_type": "Quote", "value": "',
            metadataAttributesEnd: '" } ]',
            metadataEnd: " }"
        });

    string private metadataIdentifier = "data:application/json;base64,";
    string private metadataPreRevealEnd = '", "description": "Pre-Reveal Ticket for purchasing & completing Zeneca x Nas Academy Class", "image": "ipfs://QmcDSSmgYhMsuKojNpvZZq7gqrsRAyFC8nVmKC4n4B33up" }';

    string[] private quotes;
    string[] private authors;

    bool public isFirstSaleActive = false;
    bool public isSecondSaleActive = false;
    bool public isOnChain = true;

    function compareStrings(string memory a, string memory b)
        private
        pure
        returns (bool)
    {
        return (keccak256(abi.encodePacked((a))) !=
            keccak256(abi.encodePacked((b))));
    }

    function _baseImageURI() internal view virtual returns (string memory) {
        return baseImageURI;
    }

    function getTicket(
        string memory author,
        string memory quote,
        uint256 tokenId
    ) private view returns (Ticket memory) {
        require(compareStrings(author, ""), "AUTHOR_NEEDED");
        require(compareStrings(quote, ""), "QUOTE_NEEDED");

        Ticket memory tickt;
        tickt.author = author;
        tickt.quote = quote;
        tickt.imageURI = string(abi.encodePacked(_baseURI(), tokenId.toString(), ".png"));

        return tickt;
    }

    function getTicketFromIndex(
        uint256 index,
        uint256 tokenId
    ) private view returns (Ticket memory) {
        require(index >= 0, "INVALID_INDEX");

        Ticket memory tickt;
        tickt.author = authors[index];
        tickt.quote = quotes[index];
        tickt.imageURI = string(abi.encodePacked(_baseImageURI(), tokenId.toString(), ".png"));

        return tickt;
    }

    function getDefaultMetadata(uint256 tokenId)
        private
        view
        returns (string memory)
    {
        return
            string(
                abi.encodePacked(
                    baseMeta.metadataStart,
                    tokenId.toString(),
                    metadataPreRevealEnd
                )
            );
    }


    function getMetadata(uint256 tokenId, Ticket memory tickt)
        private
        view
        returns (string memory)
    {
        bytes memory metadataMainData = abi.encodePacked(
            tokenId.toString(),
            baseMeta.metadataDescription1,
            baseMeta.metadataImage,
            tickt.imageURI
        );
        bytes memory metadataAttributes1 = abi.encodePacked(
            baseMeta.metadataAttributesStart,
            baseMeta.metadataAttribute1
        );
        bytes memory metadataAttributes2 = abi.encodePacked(
            tokenId.toString(),
            baseMeta.metadataAttribute2,
            tickt.author
        );
        bytes memory metadataAttributes3 = abi.encodePacked(
            baseMeta.metadataAttribute3,
            baseMeta.metadataAttribute4,
            tickt.quote,
            baseMeta.metadataAttributesEnd
        );

        bytes memory metadataAttributes = abi.encodePacked(
            metadataAttributes1,
            metadataAttributes2,
            metadataAttributes3
        );
        return
            string(
                abi.encodePacked(
                    baseMeta.metadataStart,
                    metadataMainData,
                    metadataAttributes,
                    baseMeta.metadataEnd
                )
            );
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return baseTokenURI;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(_exists(tokenId), "URI query for nonexistent token");

        if (isOnChain) {
            return
                string(
                    abi.encodePacked(
                        metadataIdentifier,
                        Base64.encode(tokensMetadata[tokenId])
                    )
                );
        } else {
            return string(abi.encodePacked(_baseURI(), tokenId.toString(), ".json"));
        }
    }

    /**
     * To be updated by contract owner to allow for the first tranche of members to mint
     */
    function setFirstSaleState(bool _firstSaleActiveState) public onlyOwner {
        require(
            isFirstSaleActive != _firstSaleActiveState,
            "NEW_STATE_IDENTICAL_TO_OLD_STATE"
        );
        isFirstSaleActive = _firstSaleActiveState;
    }

    /**
     * To be updated once maxSupply equals totalSupply. This will deactivate minting.
     * Can also be activated by contract owner to begin public sale
     */
    function setSecondSaleState(bool _secondSaleActiveState) public onlyOwner {
        require(
            isSecondSaleActive != _secondSaleActiveState,
            "NEW_STATE_IDENTICAL_TO_OLD_STATE"
        );
        isSecondSaleActive = _secondSaleActiveState;
    }

    /**
     * To be updated by owner to switch from On-Chain to Off-Chain if On-Chain Metadata has issues
     */
    function setIsOnChain(bool _isOnChain) public onlyOwner {
        require(
            isOnChain != _isOnChain,
            "NEW_STATE_IDENTICAL_TO_OLD_STATE"
        );
        isOnChain = _isOnChain;
    }

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

    modifier whenNotPausedorAuthorised() {
        require(
            !paused() || msg.sender == refundAddress,
            "TRANSACTION_NOT_ALLOWED"
        );
        _;
    }

    /**
     * When the contract is paused, all token transfers are prevented.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override whenNotPausedorAuthorised {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function setSignerAddress(address _signerAddress) external onlyOwner {
        require(_signerAddress != address(0));
        signerAddress = _signerAddress;
    }

    function setRefundAddress(address _refundAddress)
        external
        onlyOwner
    {
        require(_refundAddress != address(0));
        refundAddress = _refundAddress;
    }

    /**
     * Update the base token URI
     */
    function setBaseURI(string calldata _newBaseURI) external onlyOwner {
        baseTokenURI = _newBaseURI;
    }

    /**
     * Update the base image URI
     */
    function setBaseImageURI(string calldata _newBaseImageURI) external onlyOwner {
        baseImageURI = _newBaseImageURI;
    }

    /**
     * Update metadata attributes
     */
    function setBaseMetaData(string[] calldata _newBaseMetaData)
        external
        onlyOwner
    {
        require(
            _newBaseMetaData.length == 11,
            "INCORRECT_BASE_METADATA_ATTRIBUTES"
        );

        baseMeta = BaseMetadata({
            metadataStart: _newBaseMetaData[0],
            metadataDescription1: _newBaseMetaData[1],
            metadataImage: _newBaseMetaData[2],
            metadataAttributesStart: _newBaseMetaData[3],
            metadataAttribute1: _newBaseMetaData[4],
            metadataAttribute2: _newBaseMetaData[5],
            metadataAttribute3: _newBaseMetaData[6],
            metadataAttribute4: _newBaseMetaData[7],
            metadataAttributesEnd: _newBaseMetaData[8],
            metadataEnd: _newBaseMetaData[9]
        });
    }

    /**
     * Update quotes
     */
    function setQuotes(string[] memory _allQuotes)
        external
        onlyOwner
    {
        quotes = _allQuotes;
    }

    /**
     * Update authors
     */
    function setAuthors(string[] memory _allAuthors)
        external
        onlyOwner
    {
        authors = _allAuthors;
    }

    /**
     * Function to set token metadata
     */
    function setTokenMetaDataWithRange(
        uint256 _tokenStart, 
        uint256 _tokenEnd, 
        uint256[] calldata metadataMappings
    ) external onlyOwner {
        require(_tokenStart <= _tokenEnd, "INVALID_TOKEN_RANGE");
        require(_tokenEnd - _tokenStart + 1 == metadataMappings.length, "INCORRECT_METADATA_MAPPING");

        if(_tokenEnd > tokensWithMetadata){
            tokensWithMetadata = _tokenEnd;
        }

        for(uint256 i = _tokenStart; i < _tokenEnd + 1; i++){
            tokensMetadata[i] = bytes(getMetadata(i, getTicketFromIndex(metadataMappings[i - _tokenStart], i)));
        }
    }

    /**
     * Set Metadata if incorrect metadata got assigned
     */
    function setMetadata(uint256 tokenId, bytes calldata _metadata)
        external
        onlyOwner
    {
        require(_exists(tokenId), "Setting metadata for nonexistent token");
        tokensMetadata[tokenId] = _metadata;
    }

    /**
     * Set Metadata for multiple tickets if incorrect metadata got assigned
     */
    function setMultipleMetadata(
        uint256[] calldata tokens,
        bytes[] calldata _metadataArray
    ) external onlyOwner {
        require(
            tokens.length == _metadataArray.length,
            "NEED_SAME_NUMBER_OF_TOKENS_AND_METADATA"
        );

        uint256 i;
        for (i = 0; i < tokens.length; i++) {
            require(
                _exists(tokens[i]),
                "Setting metadata for nonexistent token"
            );
        }
        for (i = 0; i < tokens.length; i++) {
            tokensMetadata[tokens[i]] = _metadataArray[i];
        }
    }

    /**
     * Returns all the token ids owned by a given address
     */
    function allTokensOwnedByAddress(address owner) external view returns (uint256[] memory) {
        uint256 totalTokensOwned = balanceOf(owner);
        uint256[] memory allTokenIds = new uint256[](totalTokensOwned);
        for (uint256 i = 0; i < totalTokensOwned; i++) {
            allTokenIds[i] = (tokenOfOwnerByIndex(owner, i));
        }
        return allTokenIds;
    }

    function verifyAddressSigner(bytes32 messageHash, bytes memory signature)
        private
        view
        returns (bool)
    {
        return
            signerAddress ==
            messageHash.toEthSignedMessageHash().recover(signature);
    }

    function hashMessage(address sender, uint256 maximumAllowedMints) private pure returns (bytes32) {
        return keccak256(abi.encode(sender, maximumAllowedMints));
    }

    /**
     * @notice Allow for token minting for an approved minter with a valid message signature.
     * The address of the sender is hashed and signed with the server's private key and verified.
     */
    function mint(
        bytes32 messageHash,
        bytes calldata signature,
        uint256 numberOfMints,
        uint256 maximumAllowedMints
    ) external virtual nonReentrant {
        require(isFirstSaleActive || isSecondSaleActive, "SALE_IS_NOT_ACTIVE");
        require(totalMintedPerAddress[msg.sender] + numberOfMints <= maximumAllowedMints, "MINT_TOO_LARGE");
        require(hashMessage(msg.sender, maximumAllowedMints) == messageHash, "MESSAGE_INVALID");
        require(
            verifyAddressSigner(messageHash, signature),
            "SIGNATURE_VALIDATION_FAILED"
        );

        uint256 currentSupply = totalSupply();

        if (isFirstSaleActive) {
            require(currentSupply + numberOfMints <= firstSaleSupply, "NOT_ENOUGH_MINTS_AVAILABLE");
        } else {
            require(currentSupply + numberOfMints <= maxSupply, "NOT_ENOUGH_MINTS_AVAILABLE");
        }

        totalMintedPerAddress[msg.sender] += numberOfMints;
        for (uint256 i = 0; i < numberOfMints; i++) {
            uint256 currentId = tokenIds.current();
            if (currentId > tokensWithMetadata) {
                tokensMetadata[currentId] = bytes(
                    getDefaultMetadata(
                        currentId
                    )
                );
            }
            _safeMint(msg.sender, currentId);
            tokenIds.increment();
        }

        if (isFirstSaleActive && (currentSupply + numberOfMints >= firstSaleSupply)) {
            isFirstSaleActive = false;
        } else if (isSecondSaleActive && (currentSupply + numberOfMints >= maxSupply)) {
            isSecondSaleActive = false;
        }
    }

    /**
     * @notice Allow for token minting for an approved minter with a valid message signature.
     * The address of the sender is hashed and signed with the server's private key and verified.
     * Also providing metadata while minting for one mint
     */
    function mintWithMetaData(
        bytes32 messageHash,
        bytes calldata signature,
        uint256 numberOfMints,
        uint256 maximumAllowedMints,
        string[] calldata metaData
    ) external virtual nonReentrant {
        require(isFirstSaleActive || isSecondSaleActive, "SALE_IS_NOT_ACTIVE");
        require(numberOfMints == 1, "ONLY_ONE_MINT_ALLOWED_WHILE_SETTING_METADATA");
        require(totalMintedPerAddress[msg.sender] + numberOfMints <= maximumAllowedMints, "MINT_TOO_LARGE");
        require(hashMessage(msg.sender, maximumAllowedMints) == messageHash, "MESSAGE_INVALID");
        require(
            verifyAddressSigner(messageHash, signature),
            "SIGNATURE_VALIDATION_FAILED"
        );
        require(metaData.length == 2, "INVALID_MATADATA");

        uint256 currentId = tokenIds.current();

        if (isFirstSaleActive) {
            require(currentId <= firstSaleSupply, "NOT_ENOUGH_MINTS_AVAILABLE");
        } else {
            require(currentId <= maxSupply, "NOT_ENOUGH_MINTS_AVAILABLE");
        }

        totalMintedPerAddress[msg.sender] += numberOfMints;

        tokensMetadata[currentId] = bytes(
            getMetadata(
                currentId,
                getTicket(
                    metaData[0],
                    metaData[1],
                    currentId
                )
            )
        );
        _safeMint(msg.sender, currentId);
        tokenIds.increment();

        if (isFirstSaleActive && (currentId == firstSaleSupply)) {
            isFirstSaleActive = false;
        } else if (isSecondSaleActive && (currentId == maxSupply)) {
            isSecondSaleActive = false;
        }
    }

    /**
     * @notice Refund token.
     * @param _tokenId The id of the token to refund.
     */
    function refund(uint256 _tokenId) external nonReentrant {
        require(ownerOf(_tokenId) == msg.sender, "MUST_OWN_TOKEN");

        // Transfer token to Academy wallet
        _transfer(msg.sender, refundAddress, _tokenId);
    }

    /**
     * @notice Allow owner to send `mintNumber` tokens without cost to multiple addresses
     */
    function gift(address[] calldata receivers, uint256 mintNumber)
        external
        onlyOwner
    {
        require(
            (tokenIds.current() - 1 + (receivers.length * mintNumber)) <=
                maxSupply,
            "MINT_TOO_LARGE"
        );

        for (uint256 i = 0; i < receivers.length; i++) {
            for (uint256 j = 0; j < mintNumber; j++) {
                _safeMint(receivers[i], tokenIds.current());
                tokenIds.increment();
            }
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseTokenURI_","type":"string"},{"internalType":"string","name":"baseImageURI_","type":"string"},{"internalType":"uint256","name":"maxSupply_","type":"uint256"},{"internalType":"uint256","name":"firstSaleSupply_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"allTokensOwnedByAddress","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseImageURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"firstSaleSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256","name":"mintNumber","type":"uint256"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isFirstSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOnChain","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSecondSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"messageHash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"numberOfMints","type":"uint256"},{"internalType":"uint256","name":"maximumAllowedMints","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"messageHash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"numberOfMints","type":"uint256"},{"internalType":"uint256","name":"maximumAllowedMints","type":"uint256"},{"internalType":"string[]","name":"metaData","type":"string[]"}],"name":"mintWithMetaData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"refund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"_allAuthors","type":"string[]"}],"name":"setAuthors","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseImageURI","type":"string"}],"name":"setBaseImageURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"_newBaseMetaData","type":"string[]"}],"name":"setBaseMetaData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_firstSaleActiveState","type":"bool"}],"name":"setFirstSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isOnChain","type":"bool"}],"name":"setIsOnChain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_metadata","type":"bytes"}],"name":"setMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokens","type":"uint256[]"},{"internalType":"bytes[]","name":"_metadataArray","type":"bytes[]"}],"name":"setMultipleMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"_allQuotes","type":"string[]"}],"name":"setQuotes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_refundAddress","type":"address"}],"name":"setRefundAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_secondSaleActiveState","type":"bool"}],"name":"setSecondSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signerAddress","type":"address"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenStart","type":"uint256"},{"internalType":"uint256","name":"_tokenEnd","type":"uint256"},{"internalType":"uint256[]","name":"metadataMappings","type":"uint256[]"}],"name":"setTokenMetaDataWithRange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenIds","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalMintedPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

600f80546001600160a01b0319908116730ccf0888754c15f2624952abe6b491239148f2f117909155601080549091167369446130c42d1558cdb61a166cbc9e344264e4321790556000601155610260604052602861020081815260c091829190620060866102203981526020016040518060800160405280605a8152602001620061d2605a913981526020016040518060400160405280600d81526020016c1116101134b6b0b3b2911d101160991b81525081526020016040518060400160405280601581526020017f222c202261747472696275746573223a205b207b200000000000000000000000815250815260200160405180606001604052806029815260200162006180602991398152602001604051806060016040528060298152602001620061a96029913981526020016040518060600160405280603281526020016200614e6032913981526020016040518060600160405280602781526020016200622c602791398152604080518082018252600581526422207d205d60d81b60208281019190915280840191909152815180830183526002815261207d60f01b81830152919092015281518051601492620001c2928492910190620004d8565b506020828101518051620001dd9260018501920190620004d8565b5060408201518051620001fb916002840191602090910190620004d8565b506060820151805162000219916003840191602090910190620004d8565b506080820151805162000237916004840191602090910190620004d8565b5060a0820151805162000255916005840191602090910190620004d8565b5060c0820151805162000273916006840191602090910190620004d8565b5060e0820151805162000291916007840191602090910190620004d8565b506101008201518051620002b0916008840191602090910190620004d8565b506101208201518051620002cf916009840191602090910190620004d8565b505060408051808201909152601d8082527f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006020909201918252620003199250601e9190620004d8565b506040518060c0016040528060a08152602001620060ae60a0913980516200034a91601f91602090910190620004d8565b506022805462ffffff1916620100001790553480156200036957600080fd5b5060405162006253380380620062538339810160408190526200038c916200064b565b855186908690620003a5906000906020850190620004d8565b508051620003bb906001906020840190620004d8565b5050600a805460ff1916905550620003d33362000475565b6001600b55816200041b5760405162461bcd60e51b815260206004820152600e60248201526d494e56414c49445f535550504c5960901b604482015260640160405180910390fd5b83516200043090600d906020870190620004d8565b5082516200044690600e906020860190620004d8565b50608082905260a081905262000469600c620004cf602090811b62002f6517901c565b50505050505062000752565b600a80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b80546001019055565b828054620004e69062000716565b90600052602060002090601f0160209004810192826200050a576000855562000555565b82601f106200052557805160ff191683800117855562000555565b8280016001018555821562000555579182015b828111156200055557825182559160200191906001019062000538565b506200056392915062000567565b5090565b5b8082111562000563576000815560010162000568565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620005a657600080fd5b81516001600160401b0380821115620005c357620005c36200057e565b604051601f8301601f19908116603f01168101908282118183101715620005ee57620005ee6200057e565b816040528381526020925086838588010111156200060b57600080fd5b600091505b838210156200062f578582018301518183018401529082019062000610565b83821115620006415760008385830101525b9695505050505050565b60008060008060008060c087890312156200066557600080fd5b86516001600160401b03808211156200067d57600080fd5b6200068b8a838b0162000594565b97506020890151915080821115620006a257600080fd5b620006b08a838b0162000594565b96506040890151915080821115620006c757600080fd5b620006d58a838b0162000594565b95506060890151915080821115620006ec57600080fd5b50620006fb89828a0162000594565b9350506080870151915060a087015190509295509295509295565b600181811c908216806200072b57607f821691505b6020821081036200074c57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a0516158cf620007b7600039600081816104340152818161102c015281816111d10152818161253c0152612751015260008181610685015281816110aa01528181611225015281816125b10152818161279b01526128e401526158cf6000f3fe608060405234801561001057600080fd5b506004361061032b5760003560e01c8063714cff56116101b2578063a22cb465116100f9578063c87b56dd116100a2578063e985e9c51161007c578063e985e9c5146106a7578063e9c50271146106e3578063eeef15ce146106f6578063f2fde38b1461070857600080fd5b8063c87b56dd14610665578063d547cfb714610678578063d5abeb011461068057600080fd5b8063c0f4af70116100d3578063c0f4af701461062c578063c14c52221461063f578063c251119d1461065257600080fd5b8063a22cb465146105f3578063b43305df14610606578063b88d4fde1461061957600080fd5b80638af9a4741161015b57806395d89b411161013557806395d89b41146105c55780639a0d7f44146105cd578063a19f6eb2146105e057600080fd5b80638af9a474146105895780638da5cb5b1461059c57806391e91a1a146105b257600080fd5b80637920fe561161018c5780637920fe561461055b5780638456cb591461056e5780638647ca761461057657600080fd5b8063714cff5614610541578063715018a61461054b57806374f82e301461055357600080fd5b80632f94c546116102765780634f6ccce71161021f5780636352211e116101f95780636352211e1461050857806366a8ef7f1461051b57806370a082311461052e57600080fd5b80634f6ccce7146104d757806355f804b3146104ea5780635c975abb146104fd57600080fd5b80633f4ba83a116102505780633f4ba83a146104a957806342842e0e146104b15780634a12b846146104c457600080fd5b80632f94c5461461046957806331fa3eb91461048957806333080d711461049c57600080fd5b806315b75bea116102d8578063278ecde1116102b2578063278ecde11461041c5780632b7f329c1461042f5780632f745c591461045657600080fd5b806315b75bea146103ee57806318160ddd1461040157806323b872dd1461040957600080fd5b8063081812fc11610309578063081812fc14610382578063095ea7b3146103ad5780630adda465146103c057600080fd5b806301ffc9a714610330578063046dc1661461035857806306fdde031461036d575b600080fd5b61034361033e366004614b3e565b61071b565b60405190151581526020015b60405180910390f35b61036b610366366004614b79565b610777565b005b610375610829565b60405161034f9190614bec565b610395610390366004614bff565b6108bb565b6040516001600160a01b03909116815260200161034f565b61036b6103bb366004614c18565b610961565b6103e06103ce366004614b79565b60126020526000908152604090205481565b60405190815260200161034f565b61036b6103fc366004614b79565b610a92565b6008546103e0565b61036b610417366004614c42565b610b3f565b61036b61042a366004614bff565b610bc6565b6103e07f000000000000000000000000000000000000000000000000000000000000000081565b6103e0610464366004614c18565b610c9d565b61047c610477366004614b79565b610d45565b60405161034f9190614c7e565b61036b610497366004614d04565b610de7565b6022546103439060ff1681565b61036b61128c565b61036b6104bf366004614c42565b6112f6565b61036b6104d2366004614d72565b611311565b6103e06104e5366004614bff565b6113de565b61036b6104f8366004614d8d565b611482565b600a5460ff16610343565b610395610516366004614bff565b6114ee565b61036b610529366004614e87565b611579565b6103e061053c366004614b79565b6115f0565b600c546103e09081565b61036b61168a565b6103756116f4565b61036b610569366004614e87565b611782565b61036b6117f4565b61036b610584366004614d8d565b61185c565b61036b610597366004614fa4565b6118c8565b600a5461010090046001600160a01b0316610395565b61036b6105c0366004614d72565b611a70565b610375611b69565b61036b6105db366004614ff7565b611b78565b61036b6105ee36600461502d565b61211d565b61036b610601366004615079565b612226565b61036b6106143660046150ac565b612231565b61036b610627366004615139565b6127fa565b61036b61063a3660046151b5565b612882565b61036b61064d366004615201565b6129f5565b6022546103439062010000900460ff1681565b610375610673366004614bff565b612c0d565b610375612d76565b6103e07f000000000000000000000000000000000000000000000000000000000000000081565b6103436106b5366004615261565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61036b6106f1366004614d72565b612d83565b60225461034390610100900460ff1681565b61036b610716366004614b79565b612e7d565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d63000000000000000000000000000000000000000000000000000000001480610771575061077182612f6e565b92915050565b600a546001600160a01b036101009091041633146107dc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b0381166107ef57600080fd5b600f80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6060600080546108389061528b565b80601f01602080910402602001604051908101604052809291908181526020018280546108649061528b565b80156108b15780601f10610886576101008083540402835291602001916108b1565b820191906000526020600020905b81548152906001019060200180831161089457829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109455760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016107d3565b506000908152600460205260409020546001600160a01b031690565b600061096c826114ee565b9050806001600160a01b0316836001600160a01b0316036109f55760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016107d3565b336001600160a01b0382161480610a115750610a1181336106b5565b610a835760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107d3565b610a8d8383613051565b505050565b600a546001600160a01b03610100909104163314610af25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b6001600160a01b038116610b0557600080fd5b601080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b610b4933826130d7565b610bbb5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016107d3565b610a8d8383836131df565b6002600b5403610c185760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107d3565b6002600b5533610c27826114ee565b6001600160a01b031614610c7d5760405162461bcd60e51b815260206004820152600e60248201527f4d5553545f4f574e5f544f4b454e00000000000000000000000000000000000060448201526064016107d3565b601054610c959033906001600160a01b0316836131df565b506001600b55565b6000610ca8836115f0565b8210610d1c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e647300000000000000000000000000000000000000000060648201526084016107d3565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b60606000610d52836115f0565b905060008167ffffffffffffffff811115610d6f57610d6f614dcf565b604051908082528060200260200182016040528015610d98578160200160208202803683370190505b50905060005b82811015610ddf57610db08582610c9d565b828281518110610dc257610dc26152de565b602090810291909101015280610dd78161533c565b915050610d9e565b509392505050565b6002600b5403610e395760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107d3565b6002600b5560225460ff1680610e565750602254610100900460ff165b610ea25760405162461bcd60e51b815260206004820152601260248201527f53414c455f49535f4e4f545f414354495645000000000000000000000000000060448201526064016107d3565b336000908152601260205260409020548190610ebf908490615374565b1115610f0d5760405162461bcd60e51b815260206004820152600e60248201527f4d494e545f544f4f5f4c4152474500000000000000000000000000000000000060448201526064016107d3565b6040805133602080830191909152818301849052825180830384018152606090920190925280519101208514610f855760405162461bcd60e51b815260206004820152600f60248201527f4d4553534147455f494e56414c4944000000000000000000000000000000000060448201526064016107d3565b610fc58585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506133cf92505050565b6110115760405162461bcd60e51b815260206004820152601b60248201527f5349474e41545552455f56414c49444154494f4e5f4641494c4544000000000060448201526064016107d3565b600061101c60085490565b60225490915060ff16156110a8577f00000000000000000000000000000000000000000000000000000000000000006110558483615374565b11156110a35760405162461bcd60e51b815260206004820152601a60248201527f4e4f545f454e4f5547485f4d494e54535f415641494c41424c4500000000000060448201526064016107d3565b611121565b7f00000000000000000000000000000000000000000000000000000000000000006110d38483615374565b11156111215760405162461bcd60e51b815260206004820152601a60248201527f4e4f545f454e4f5547485f4d494e54535f415641494c41424c4500000000000060448201526064016107d3565b3360009081526012602052604081208054859290611140908490615374565b90915550600090505b838110156111c157600061115c600c5490565b9050601154811115611196576111718161344a565b600082815260136020908152604090912082516111949391929190910190614953565b505b6111a0338261346b565b6111ae600c80546001019055565b50806111b98161533c565b915050611149565b5060225460ff1680156111fd57507f00000000000000000000000000000000000000000000000000000000000000006111fa8483615374565b10155b15611211576022805460ff1916905561127f565b602254610100900460ff16801561125157507f000000000000000000000000000000000000000000000000000000000000000061124e8483615374565b10155b1561127f57602280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b50506001600b5550505050565b600a546001600160a01b036101009091041633146112ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b6112f4613485565b565b610a8d838383604051806020016040528060008152506127fa565b600a546001600160a01b036101009091041633146113715760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b60225481151560ff9091161515036113cb5760405162461bcd60e51b815260206004820181905260248201527f4e45575f53544154455f4944454e544943414c5f544f5f4f4c445f535441544560448201526064016107d3565b6022805460ff1916911515919091179055565b60006113e960085490565b821061145d5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e6473000000000000000000000000000000000000000060648201526084016107d3565b60088281548110611470576114706152de565b90600052602060002001549050919050565b600a546001600160a01b036101009091041633146114e25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b610a8d600d83836149d7565b6000818152600260205260408120546001600160a01b0316806107715760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016107d3565b600a546001600160a01b036101009091041633146115d95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b80516115ec906021906020840190614a4b565b5050565b60006001600160a01b03821661166e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016107d3565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b036101009091041633146116ea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b6112f46000613521565b600e80546117019061528b565b80601f016020809104026020016040519081016040528092919081815260200182805461172d9061528b565b801561177a5780601f1061174f5761010080835404028352916020019161177a565b820191906000526020600020905b81548152906001019060200180831161175d57829003601f168201915b505050505081565b600a546001600160a01b036101009091041633146117e25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b80516115ec9060209081840190614a4b565b600a546001600160a01b036101009091041633146118545760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b6112f4613592565b600a546001600160a01b036101009091041633146118bc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b610a8d600e83836149d7565b600a546001600160a01b036101009091041633146119285760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b828411156119785760405162461bcd60e51b815260206004820152601360248201527f494e56414c49445f544f4b454e5f52414e47450000000000000000000000000060448201526064016107d3565b80611983858561538c565b61198e906001615374565b146119db5760405162461bcd60e51b815260206004820152601a60248201527f494e434f52524543545f4d455441444154415f4d415050494e4700000000000060448201526064016107d3565b6011548311156119eb5760118390555b835b6119f8846001615374565b811015611a6957611a3381611a2e8585611a128a8561538c565b818110611a2157611a216152de565b905060200201358461361a565b6137f8565b60008281526013602090815260409091208251611a569391929190910190614953565b5080611a618161533c565b9150506119ed565b5050505050565b600a546001600160a01b03610100909104163314611ad05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b801515602260019054906101000a900460ff16151503611b325760405162461bcd60e51b815260206004820181905260248201527f4e45575f53544154455f4944454e544943414c5f544f5f4f4c445f535441544560448201526064016107d3565b60228054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b6060600180546108389061528b565b600a546001600160a01b03610100909104163314611bd85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b600b8114611c4e5760405162461bcd60e51b815260206004820152602260248201527f494e434f52524543545f424153455f4d455441444154415f415454524942555460448201527f455300000000000000000000000000000000000000000000000000000000000060648201526084016107d3565b60405180610140016040528083836000818110611c6d57611c6d6152de565b9050602002810190611c7f91906153a3565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200183836001818110611ccc57611ccc6152de565b9050602002810190611cde91906153a3565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200183836002818110611d2b57611d2b6152de565b9050602002810190611d3d91906153a3565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200183836003818110611d8a57611d8a6152de565b9050602002810190611d9c91906153a3565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200183836004818110611de957611de96152de565b9050602002810190611dfb91906153a3565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200183836005818110611e4857611e486152de565b9050602002810190611e5a91906153a3565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200183836006818110611ea757611ea76152de565b9050602002810190611eb991906153a3565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200183836007818110611f0657611f066152de565b9050602002810190611f1891906153a3565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200183836008818110611f6557611f656152de565b9050602002810190611f7791906153a3565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200183836009818110611fc457611fc46152de565b9050602002810190611fd691906153a3565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152508051805160149161202291839160200190614953565b50602082810151805161203b9260018501920190614953565b5060408201518051612057916002840191602090910190614953565b5060608201518051612073916003840191602090910190614953565b506080820151805161208f916004840191602090910190614953565b5060a082015180516120ab916005840191602090910190614953565b5060c082015180516120c7916006840191602090910190614953565b5060e082015180516120e3916007840191602090910190614953565b506101008201518051612100916008840191602090910190614953565b506101208201518051611a69916009840191602090910190614953565b600a546001600160a01b0361010090910416331461217d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b6000838152600260205260409020546001600160a01b03166122075760405162461bcd60e51b815260206004820152602660248201527f53657474696e67206d6574616461746120666f72206e6f6e6578697374656e7460448201527f20746f6b656e000000000000000000000000000000000000000000000000000060648201526084016107d3565b60008381526013602052604090206122209083836149d7565b50505050565b6115ec338383613917565b6002600b54036122835760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107d3565b6002600b5560225460ff16806122a05750602254610100900460ff165b6122ec5760405162461bcd60e51b815260206004820152601260248201527f53414c455f49535f4e4f545f414354495645000000000000000000000000000060448201526064016107d3565b836001146123625760405162461bcd60e51b815260206004820152602c60248201527f4f4e4c595f4f4e455f4d494e545f414c4c4f5745445f5748494c455f5345545460448201527f494e475f4d45544144415441000000000000000000000000000000000000000060648201526084016107d3565b33600090815260126020526040902054839061237f908690615374565b11156123cd5760405162461bcd60e51b815260206004820152600e60248201527f4d494e545f544f4f5f4c4152474500000000000000000000000000000000000060448201526064016107d3565b60408051336020808301919091528183018690528251808303840181526060909201909252805191012087146124455760405162461bcd60e51b815260206004820152600f60248201527f4d4553534147455f494e56414c4944000000000000000000000000000000000060448201526064016107d3565b6124858787878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506133cf92505050565b6124d15760405162461bcd60e51b815260206004820152601b60248201527f5349474e41545552455f56414c49444154494f4e5f4641494c4544000000000060448201526064016107d3565b600281146125215760405162461bcd60e51b815260206004820152601060248201527f494e56414c49445f4d415441444154410000000000000000000000000000000060448201526064016107d3565b600061252c600c5490565b60225490915060ff16156125af577f00000000000000000000000000000000000000000000000000000000000000008111156125aa5760405162461bcd60e51b815260206004820152601a60248201527f4e4f545f454e4f5547485f4d494e54535f415641494c41424c4500000000000060448201526064016107d3565b61261f565b7f000000000000000000000000000000000000000000000000000000000000000081111561261f5760405162461bcd60e51b815260206004820152601a60248201527f4e4f545f454e4f5547485f4d494e54535f415641494c41424c4500000000000060448201526064016107d3565b336000908152601260205260408120805487929061263e908490615374565b90915550612706905081611a2e858560008161265c5761265c6152de565b905060200281019061266e91906153a3565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250899250889150600190508181106126b8576126b86152de565b90506020028101906126ca91906153a3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508892506139e5915050565b600082815260136020908152604090912082516127299391929190910190614953565b50612734338261346b565b612742600c80546001019055565b60225460ff16801561277357507f000000000000000000000000000000000000000000000000000000000000000081145b15612787576022805460ff191690556127eb565b602254610100900460ff1680156127bd57507f000000000000000000000000000000000000000000000000000000000000000081145b156127eb57602280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b50506001600b55505050505050565b61280433836130d7565b6128765760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016107d3565b61222084848484613b40565b600a546001600160a01b036101009091041633146128e25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b7f000000000000000000000000000000000000000000000000000000000000000061290d8284615408565b6001612918600c5490565b612922919061538c565b61292c9190615374565b111561297a5760405162461bcd60e51b815260206004820152600e60248201527f4d494e545f544f4f5f4c4152474500000000000000000000000000000000000060448201526064016107d3565b60005b828110156122205760005b828110156129e2576129c28585848181106129a5576129a56152de565b90506020020160208101906129ba9190614b79565b600c5461346b565b6129d0600c80546001019055565b806129da8161533c565b915050612988565b50806129ed8161533c565b91505061297d565b600a546001600160a01b03610100909104163314612a555760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b828114612aca5760405162461bcd60e51b815260206004820152602760248201527f4e4545445f53414d455f4e554d4245525f4f465f544f4b454e535f414e445f4d60448201527f455441444154410000000000000000000000000000000000000000000000000060648201526084016107d3565b60005b83811015612b9257612b0e858583818110612aea57612aea6152de565b905060200201356000908152600260205260409020546001600160a01b0316151590565b612b805760405162461bcd60e51b815260206004820152602660248201527f53657474696e67206d6574616461746120666f72206e6f6e6578697374656e7460448201527f20746f6b656e000000000000000000000000000000000000000000000000000060648201526084016107d3565b80612b8a8161533c565b915050612acd565b5060005b83811015611a6957828282818110612bb057612bb06152de565b9050602002810190612bc291906153a3565b60136000888886818110612bd857612bd86152de565b9050602002013581526020019081526020016000209190612bfa9291906149d7565b5080612c058161533c565b915050612b96565b6000818152600260205260409020546060906001600160a01b0316612c745760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e0060448201526064016107d3565b60225462010000900460ff1615612d4f5760008281526013602052604090208054601e91612d2891612ca59061528b565b80601f0160208091040260200160405190810160405280929190818152602001828054612cd19061528b565b8015612d1e5780601f10612cf357610100808354040283529160200191612d1e565b820191906000526020600020905b815481529060010190602001808311612d0157829003601f168201915b5050505050613bc9565b604051602001612d399291906154f7565b6040516020818303038152906040529050919050565b612d57613da6565b612d6083613db5565b604051602001612d3992919061551c565b919050565b600d80546117019061528b565b600a546001600160a01b03610100909104163314612de35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b801515602260029054906101000a900460ff16151503612e455760405162461bcd60e51b815260206004820181905260248201527f4e45575f53544154455f4944454e544943414c5f544f5f4f4c445f535441544560448201526064016107d3565b6022805491151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff909216919091179055565b600a546001600160a01b03610100909104163314612edd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b6001600160a01b038116612f595760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107d3565b612f6281613521565b50565b80546001019055565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061300157507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061077157507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610771565b600081815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038416908117909155819061309e826114ee565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166131615760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016107d3565b600061316c836114ee565b9050806001600160a01b0316846001600160a01b031614806131a75750836001600160a01b031661319c846108bb565b6001600160a01b0316145b806131d757506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166131f2826114ee565b6001600160a01b03161461326e5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e657200000000000000000000000000000000000000000000000000000060648201526084016107d3565b6001600160a01b0382166132e95760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016107d3565b6132f4838383613eea565b6132ff600082613051565b6001600160a01b038316600090815260036020526040812080546001929061332890849061538c565b90915550506001600160a01b0382166000908152600360205260408120805460019290613356908490615374565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006134328261342c856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90613f5d565b600f546001600160a01b039182169116149392505050565b6060601461345783613db5565b601f604051602001612d3993929190615573565b6115ec828260405180602001604052806000815250613f79565b600a5460ff166134d75760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016107d3565b600a805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600a80546001600160a01b038381166101008181027fffffffffffffffffffffff0000000000000000000000000000000000000000ff85161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a5460ff16156135e55760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016107d3565b600a805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586135043390565b61363e60405180606001604052806060815260200160608152602001606081525090565b61366260405180606001604052806060815260200160608152602001606081525090565b60218481548110613675576136756152de565b90600052602060002001805461368a9061528b565b80601f01602080910402602001604051908101604052809291908181526020018280546136b69061528b565b80156137035780601f106136d857610100808354040283529160200191613703565b820191906000526020600020905b8154815290600101906020018083116136e657829003601f168201915b5050509183525050602080548590811061371f5761371f6152de565b9060005260206000200180546137349061528b565b80601f01602080910402602001604051908101604052809291908181526020018280546137609061528b565b80156137ad5780601f10613782576101008083540402835291602001916137ad565b820191906000526020600020905b81548152906001019060200180831161379057829003601f168201915b505050505081604001819052506137c2614002565b6137cb84613db5565b6040516020016137dc9291906155a6565b60408051808303601f1901815291905260208201529392505050565b6060600061380584613db5565b60208085015160405161382193926015926016929091016155fd565b60408051601f1981840301815290829052915060009061384990601790601890602001615641565b6040516020818303038152906040529050600061386586613db5565b855160405161387a9291601991602001615656565b60408051601f19818403018152828252908701519092506000916138aa91601a91601b9190601c90602001615690565b604051602081830303815290604052905060008383836040516020016138d2939291906156c7565b60408051601f198184030181529082905291506138fb9060149087908490601d90602001615700565b6040516020818303038152906040529550505050505092915050565b816001600160a01b0316836001600160a01b0316036139785760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107d3565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613a0960405180606001604052806060815260200160608152602001606081525090565b613a228460405180602001604052806000815250614011565b613a6e5760405162461bcd60e51b815260206004820152600d60248201527f415554484f525f4e45454445440000000000000000000000000000000000000060448201526064016107d3565b613a878360405180602001604052806000815250614011565b613ad35760405162461bcd60e51b815260206004820152600c60248201527f51554f54455f4e4545444544000000000000000000000000000000000000000060448201526064016107d3565b613af760405180606001604052806060815260200160608152602001606081525090565b84815260408101849052613b09613da6565b613b1284613db5565b604051602001613b239291906155a6565b60408051808303601f190181529190526020820152949350505050565b613b4b8484846131df565b613b578484848461406b565b6122205760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016107d3565b80516060906000819003613bed575050604080516020810190915260008152919050565b60006003613bfc836002615374565b613c06919061575e565b613c11906004615408565b90506000613c20826020615374565b67ffffffffffffffff811115613c3857613c38614dcf565b6040519080825280601f01601f191660200182016040528015613c62576020820181803683370190505b509050600060405180606001604052806040815260200161585a604091399050600181016020830160005b86811015613cee576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101613c8d565b506003860660018114613d085760028114613d5257613d98565b7f3d3d0000000000000000000000000000000000000000000000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe830152613d98565b7f3d000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301525b505050918152949350505050565b6060600d80546108389061528b565b606081600003613df857505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115613e225780613e0c8161533c565b9150613e1b9050600a8361575e565b9150613dfc565b60008167ffffffffffffffff811115613e3d57613e3d614dcf565b6040519080825280601f01601f191660200182016040528015613e67576020820181803683370190505b5090505b84156131d757613e7c60018361538c565b9150613e89600a86615772565b613e94906030615374565b60f81b818381518110613ea957613ea96152de565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613ee3600a8661575e565b9450613e6b565b600a5460ff161580613f0657506010546001600160a01b031633145b613f525760405162461bcd60e51b815260206004820152601760248201527f5452414e53414354494f4e5f4e4f545f414c4c4f57454400000000000000000060448201526064016107d3565b610a8d83838361420c565b6000806000613f6c85856142c4565b91509150610ddf81614332565b613f83838361451e565b613f90600084848461406b565b610a8d5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016107d3565b6060600e80546108389061528b565b6000816040516020016140249190615786565b604051602081830303815290604052805190602001208360405160200161404b9190615786565b604051602081830303815290604052805190602001201415905092915050565b60006001600160a01b0384163b15614201576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a02906140c89033908990889088906004016157a2565b6020604051808303816000875af1925050508015614103575060408051601f3d908101601f19168201909252614100918101906157de565b60015b6141b6573d808015614131576040519150601f19603f3d011682016040523d82523d6000602084013e614136565b606091505b5080516000036141ae5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016107d3565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490506131d7565b506001949350505050565b6001600160a01b0383166142675761426281600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61428a565b816001600160a01b0316836001600160a01b03161461428a5761428a8382614684565b6001600160a01b0382166142a157610a8d81614721565b826001600160a01b0316826001600160a01b031614610a8d57610a8d82826147d0565b60008082516041036142fa5760208301516040840151606085015160001a6142ee87828585614814565b9450945050505061432b565b82516040036143235760208301516040840151614318868383614901565b93509350505061432b565b506000905060025b9250929050565b6000816004811115614346576143466157fb565b0361434e5750565b6001816004811115614362576143626157fb565b036143af5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016107d3565b60028160048111156143c3576143c36157fb565b036144105760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016107d3565b6003816004811115614424576144246157fb565b036144975760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016107d3565b60048160048111156144ab576144ab6157fb565b03612f625760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016107d3565b6001600160a01b0382166145745760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107d3565b6000818152600260205260409020546001600160a01b0316156145d95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107d3565b6145e560008383613eea565b6001600160a01b038216600090815260036020526040812080546001929061460e908490615374565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001614691846115f0565b61469b919061538c565b6000838152600760205260409020549091508082146146ee576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906147339060019061538c565b6000838152600960205260408120546008805493945090928490811061475b5761475b6152de565b90600052602060002001549050806008838154811061477c5761477c6152de565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806147b4576147b461582a565b6001900381819060005260206000200160009055905550505050565b60006147db836115f0565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561484b57506000905060036148f8565b8460ff16601b1415801561486357508460ff16601c14155b1561487457506000905060046148f8565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156148c8573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166148f1576000600192509250506148f8565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83168161493760ff86901c601b615374565b905061494587828885614814565b935093505050935093915050565b82805461495f9061528b565b90600052602060002090601f01602090048101928261498157600085556149c7565b82601f1061499a57805160ff19168380011785556149c7565b828001600101855582156149c7579182015b828111156149c75782518255916020019190600101906149ac565b506149d3929150614aa4565b5090565b8280546149e39061528b565b90600052602060002090601f016020900481019282614a0557600085556149c7565b82601f10614a1e5782800160ff198235161785556149c7565b828001600101855582156149c7579182015b828111156149c7578235825591602001919060010190614a30565b828054828255906000526020600020908101928215614a98579160200282015b82811115614a985782518051614a88918491602090910190614953565b5091602001919060010190614a6b565b506149d3929150614ab9565b5b808211156149d35760008155600101614aa5565b808211156149d3576000614acd8282614ad6565b50600101614ab9565b508054614ae29061528b565b6000825580601f10614af2575050565b601f016020900490600052602060002090810190612f629190614aa4565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114612f6257600080fd5b600060208284031215614b5057600080fd5b8135614b5b81614b10565b9392505050565b80356001600160a01b0381168114612d7157600080fd5b600060208284031215614b8b57600080fd5b614b5b82614b62565b60005b83811015614baf578181015183820152602001614b97565b838111156122205750506000910152565b60008151808452614bd8816020860160208601614b94565b601f01601f19169290920160200192915050565b602081526000614b5b6020830184614bc0565b600060208284031215614c1157600080fd5b5035919050565b60008060408385031215614c2b57600080fd5b614c3483614b62565b946020939093013593505050565b600080600060608486031215614c5757600080fd5b614c6084614b62565b9250614c6e60208501614b62565b9150604084013590509250925092565b6020808252825182820181905260009190848201906040850190845b81811015614cb657835183529284019291840191600101614c9a565b50909695505050505050565b60008083601f840112614cd457600080fd5b50813567ffffffffffffffff811115614cec57600080fd5b60208301915083602082850101111561432b57600080fd5b600080600080600060808688031215614d1c57600080fd5b85359450602086013567ffffffffffffffff811115614d3a57600080fd5b614d4688828901614cc2565b9699909850959660408101359660609091013595509350505050565b80358015158114612d7157600080fd5b600060208284031215614d8457600080fd5b614b5b82614d62565b60008060208385031215614da057600080fd5b823567ffffffffffffffff811115614db757600080fd5b614dc385828601614cc2565b90969095509350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614e2757614e27614dcf565b604052919050565b600067ffffffffffffffff831115614e4957614e49614dcf565b614e5c6020601f19601f86011601614dfe565b9050828152838383011115614e7057600080fd5b828260208301376000602084830101529392505050565b60006020808385031215614e9a57600080fd5b823567ffffffffffffffff80821115614eb257600080fd5b818501915085601f830112614ec657600080fd5b813581811115614ed857614ed8614dcf565b8060051b614ee7858201614dfe565b9182528381018501918581019089841115614f0157600080fd5b86860192505b83831015614f5257823585811115614f1f5760008081fd5b8601603f81018b13614f315760008081fd5b614f428b8983013560408401614e2f565b8352509186019190860190614f07565b9998505050505050505050565b60008083601f840112614f7157600080fd5b50813567ffffffffffffffff811115614f8957600080fd5b6020830191508360208260051b850101111561432b57600080fd5b60008060008060608587031215614fba57600080fd5b8435935060208501359250604085013567ffffffffffffffff811115614fdf57600080fd5b614feb87828801614f5f565b95989497509550505050565b6000806020838503121561500a57600080fd5b823567ffffffffffffffff81111561502157600080fd5b614dc385828601614f5f565b60008060006040848603121561504257600080fd5b83359250602084013567ffffffffffffffff81111561506057600080fd5b61506c86828701614cc2565b9497909650939450505050565b6000806040838503121561508c57600080fd5b61509583614b62565b91506150a360208401614d62565b90509250929050565b600080600080600080600060a0888a0312156150c757600080fd5b87359650602088013567ffffffffffffffff808211156150e657600080fd5b6150f28b838c01614cc2565b909850965060408a0135955060608a0135945060808a013591508082111561511957600080fd5b506151268a828b01614f5f565b989b979a50959850939692959293505050565b6000806000806080858703121561514f57600080fd5b61515885614b62565b935061516660208601614b62565b925060408501359150606085013567ffffffffffffffff81111561518957600080fd5b8501601f8101871361519a57600080fd5b6151a987823560208401614e2f565b91505092959194509250565b6000806000604084860312156151ca57600080fd5b833567ffffffffffffffff8111156151e157600080fd5b6151ed86828701614f5f565b909790965060209590950135949350505050565b6000806000806040858703121561521757600080fd5b843567ffffffffffffffff8082111561522f57600080fd5b61523b88838901614f5f565b9096509450602087013591508082111561525457600080fd5b50614feb87828801614f5f565b6000806040838503121561527457600080fd5b61527d83614b62565b91506150a360208401614b62565b600181811c9082168061529f57607f821691505b6020821081036152d8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361536d5761536d61530d565b5060010190565b600082198211156153875761538761530d565b500190565b60008282101561539e5761539e61530d565b500390565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126153d857600080fd5b83018035915067ffffffffffffffff8211156153f357600080fd5b60200191503681900382131561432b57600080fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156154405761544061530d565b500290565b8054600090600181811c908083168061545f57607f831692505b60208084108203615499577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b8180156154ad57600181146154be576154eb565b60ff198616895284890196506154eb565b60008881526020902060005b868110156154e35781548b8201529085019083016154ca565b505084890196505b50505050505092915050565b60006155038285615445565b8351615513818360208801614b94565b01949350505050565b6000835161552e818460208801614b94565b835190830190615542818360208801614b94565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b600061557f8286615445565b845161558f818360208901614b94565b61559b81830186615445565b979650505050505050565b600083516155b8818460208801614b94565b8351908301906155cc818360208801614b94565b7f2e706e67000000000000000000000000000000000000000000000000000000009101908152600401949350505050565b6000855161560f818460208a01614b94565b61562461561e82850188615445565b86615445565b90508351615636818360208801614b94565b019695505050505050565b60006131d76156508386615445565b84615445565b60008451615668818460208901614b94565b61567481840186615445565b90508351615686818360208801614b94565b0195945050505050565b600061569f61561e8388615445565b84516156af818360208901614b94565b6156bb81830186615445565b98975050505050505050565b600084516156d9818460208901614b94565b8451908301906156ed818360208901614b94565b8451910190615686818360208801614b94565b600061570c8287615445565b855161571c818360208a01614b94565b85519101906156af818360208901614b94565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261576d5761576d61572f565b500490565b6000826157815761578161572f565b500690565b60008251615798818460208701614b94565b9190910192915050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526157d46080830184614bc0565b9695505050505050565b6000602082840312156157f057600080fd5b8151614b5b81614b10565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212205a2a420a628f6fa540fafb658c63e49f670c7059b5f741fe44910dd37517e63764736f6c634300080d00337b20226e616d65223a20225a656e6563612078204e61732041636164656d79205469636b65742023222c20226465736372697074696f6e223a20225072652d52657665616c205469636b657420666f722070757263686173696e67202620636f6d706c6574696e67205a656e6563612078204e61732041636164656d7920436c617373222c2022696d616765223a2022697066733a2f2f516d634453536d6759684d73754b6f6a4e70765a5a7137677172735241794643386e566d4b43346e34423333757022207d22207d2c207b202274726169745f74797065223a202249737375652059656172222c202276616c7565223a202232303232222274726169745f74797065223a202253657269616c204e756d626572222c202276616c7565223a202222207d2c207b202274726169745f74797065223a2022417574686f72222c202276616c7565223a2022222c20226465736372697074696f6e223a20224578636c7573697665205469636b657420666f722070757263686173696e67202620636f6d706c6574696e67205a656e6563612078204e61732041636164656d7920436c617373207d2c207b202274726169745f74797065223a202251756f7465222c202276616c7565223a202200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000001d5a656e6563612078204e61732041636164656d79204f6e20436861696e00000000000000000000000000000000000000000000000000000000000000000000075a454e584e4153000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d564e46783676505870436648684e7973543359556439356e395a716a676674785a4d3750416f7866576955392f000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d564e46783676505870436648684e7973543359556439356e395a716a676674785a4d3750416f7866576955392f00000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061032b5760003560e01c8063714cff56116101b2578063a22cb465116100f9578063c87b56dd116100a2578063e985e9c51161007c578063e985e9c5146106a7578063e9c50271146106e3578063eeef15ce146106f6578063f2fde38b1461070857600080fd5b8063c87b56dd14610665578063d547cfb714610678578063d5abeb011461068057600080fd5b8063c0f4af70116100d3578063c0f4af701461062c578063c14c52221461063f578063c251119d1461065257600080fd5b8063a22cb465146105f3578063b43305df14610606578063b88d4fde1461061957600080fd5b80638af9a4741161015b57806395d89b411161013557806395d89b41146105c55780639a0d7f44146105cd578063a19f6eb2146105e057600080fd5b80638af9a474146105895780638da5cb5b1461059c57806391e91a1a146105b257600080fd5b80637920fe561161018c5780637920fe561461055b5780638456cb591461056e5780638647ca761461057657600080fd5b8063714cff5614610541578063715018a61461054b57806374f82e301461055357600080fd5b80632f94c546116102765780634f6ccce71161021f5780636352211e116101f95780636352211e1461050857806366a8ef7f1461051b57806370a082311461052e57600080fd5b80634f6ccce7146104d757806355f804b3146104ea5780635c975abb146104fd57600080fd5b80633f4ba83a116102505780633f4ba83a146104a957806342842e0e146104b15780634a12b846146104c457600080fd5b80632f94c5461461046957806331fa3eb91461048957806333080d711461049c57600080fd5b806315b75bea116102d8578063278ecde1116102b2578063278ecde11461041c5780632b7f329c1461042f5780632f745c591461045657600080fd5b806315b75bea146103ee57806318160ddd1461040157806323b872dd1461040957600080fd5b8063081812fc11610309578063081812fc14610382578063095ea7b3146103ad5780630adda465146103c057600080fd5b806301ffc9a714610330578063046dc1661461035857806306fdde031461036d575b600080fd5b61034361033e366004614b3e565b61071b565b60405190151581526020015b60405180910390f35b61036b610366366004614b79565b610777565b005b610375610829565b60405161034f9190614bec565b610395610390366004614bff565b6108bb565b6040516001600160a01b03909116815260200161034f565b61036b6103bb366004614c18565b610961565b6103e06103ce366004614b79565b60126020526000908152604090205481565b60405190815260200161034f565b61036b6103fc366004614b79565b610a92565b6008546103e0565b61036b610417366004614c42565b610b3f565b61036b61042a366004614bff565b610bc6565b6103e07f00000000000000000000000000000000000000000000000000000000000003e881565b6103e0610464366004614c18565b610c9d565b61047c610477366004614b79565b610d45565b60405161034f9190614c7e565b61036b610497366004614d04565b610de7565b6022546103439060ff1681565b61036b61128c565b61036b6104bf366004614c42565b6112f6565b61036b6104d2366004614d72565b611311565b6103e06104e5366004614bff565b6113de565b61036b6104f8366004614d8d565b611482565b600a5460ff16610343565b610395610516366004614bff565b6114ee565b61036b610529366004614e87565b611579565b6103e061053c366004614b79565b6115f0565b600c546103e09081565b61036b61168a565b6103756116f4565b61036b610569366004614e87565b611782565b61036b6117f4565b61036b610584366004614d8d565b61185c565b61036b610597366004614fa4565b6118c8565b600a5461010090046001600160a01b0316610395565b61036b6105c0366004614d72565b611a70565b610375611b69565b61036b6105db366004614ff7565b611b78565b61036b6105ee36600461502d565b61211d565b61036b610601366004615079565b612226565b61036b6106143660046150ac565b612231565b61036b610627366004615139565b6127fa565b61036b61063a3660046151b5565b612882565b61036b61064d366004615201565b6129f5565b6022546103439062010000900460ff1681565b610375610673366004614bff565b612c0d565b610375612d76565b6103e07f00000000000000000000000000000000000000000000000000000000000003e881565b6103436106b5366004615261565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61036b6106f1366004614d72565b612d83565b60225461034390610100900460ff1681565b61036b610716366004614b79565b612e7d565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d63000000000000000000000000000000000000000000000000000000001480610771575061077182612f6e565b92915050565b600a546001600160a01b036101009091041633146107dc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b0381166107ef57600080fd5b600f80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6060600080546108389061528b565b80601f01602080910402602001604051908101604052809291908181526020018280546108649061528b565b80156108b15780601f10610886576101008083540402835291602001916108b1565b820191906000526020600020905b81548152906001019060200180831161089457829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109455760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016107d3565b506000908152600460205260409020546001600160a01b031690565b600061096c826114ee565b9050806001600160a01b0316836001600160a01b0316036109f55760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016107d3565b336001600160a01b0382161480610a115750610a1181336106b5565b610a835760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107d3565b610a8d8383613051565b505050565b600a546001600160a01b03610100909104163314610af25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b6001600160a01b038116610b0557600080fd5b601080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b610b4933826130d7565b610bbb5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016107d3565b610a8d8383836131df565b6002600b5403610c185760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107d3565b6002600b5533610c27826114ee565b6001600160a01b031614610c7d5760405162461bcd60e51b815260206004820152600e60248201527f4d5553545f4f574e5f544f4b454e00000000000000000000000000000000000060448201526064016107d3565b601054610c959033906001600160a01b0316836131df565b506001600b55565b6000610ca8836115f0565b8210610d1c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e647300000000000000000000000000000000000000000060648201526084016107d3565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b60606000610d52836115f0565b905060008167ffffffffffffffff811115610d6f57610d6f614dcf565b604051908082528060200260200182016040528015610d98578160200160208202803683370190505b50905060005b82811015610ddf57610db08582610c9d565b828281518110610dc257610dc26152de565b602090810291909101015280610dd78161533c565b915050610d9e565b509392505050565b6002600b5403610e395760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107d3565b6002600b5560225460ff1680610e565750602254610100900460ff165b610ea25760405162461bcd60e51b815260206004820152601260248201527f53414c455f49535f4e4f545f414354495645000000000000000000000000000060448201526064016107d3565b336000908152601260205260409020548190610ebf908490615374565b1115610f0d5760405162461bcd60e51b815260206004820152600e60248201527f4d494e545f544f4f5f4c4152474500000000000000000000000000000000000060448201526064016107d3565b6040805133602080830191909152818301849052825180830384018152606090920190925280519101208514610f855760405162461bcd60e51b815260206004820152600f60248201527f4d4553534147455f494e56414c4944000000000000000000000000000000000060448201526064016107d3565b610fc58585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506133cf92505050565b6110115760405162461bcd60e51b815260206004820152601b60248201527f5349474e41545552455f56414c49444154494f4e5f4641494c4544000000000060448201526064016107d3565b600061101c60085490565b60225490915060ff16156110a8577f00000000000000000000000000000000000000000000000000000000000003e86110558483615374565b11156110a35760405162461bcd60e51b815260206004820152601a60248201527f4e4f545f454e4f5547485f4d494e54535f415641494c41424c4500000000000060448201526064016107d3565b611121565b7f00000000000000000000000000000000000000000000000000000000000003e86110d38483615374565b11156111215760405162461bcd60e51b815260206004820152601a60248201527f4e4f545f454e4f5547485f4d494e54535f415641494c41424c4500000000000060448201526064016107d3565b3360009081526012602052604081208054859290611140908490615374565b90915550600090505b838110156111c157600061115c600c5490565b9050601154811115611196576111718161344a565b600082815260136020908152604090912082516111949391929190910190614953565b505b6111a0338261346b565b6111ae600c80546001019055565b50806111b98161533c565b915050611149565b5060225460ff1680156111fd57507f00000000000000000000000000000000000000000000000000000000000003e86111fa8483615374565b10155b15611211576022805460ff1916905561127f565b602254610100900460ff16801561125157507f00000000000000000000000000000000000000000000000000000000000003e861124e8483615374565b10155b1561127f57602280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b50506001600b5550505050565b600a546001600160a01b036101009091041633146112ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b6112f4613485565b565b610a8d838383604051806020016040528060008152506127fa565b600a546001600160a01b036101009091041633146113715760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b60225481151560ff9091161515036113cb5760405162461bcd60e51b815260206004820181905260248201527f4e45575f53544154455f4944454e544943414c5f544f5f4f4c445f535441544560448201526064016107d3565b6022805460ff1916911515919091179055565b60006113e960085490565b821061145d5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e6473000000000000000000000000000000000000000060648201526084016107d3565b60088281548110611470576114706152de565b90600052602060002001549050919050565b600a546001600160a01b036101009091041633146114e25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b610a8d600d83836149d7565b6000818152600260205260408120546001600160a01b0316806107715760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016107d3565b600a546001600160a01b036101009091041633146115d95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b80516115ec906021906020840190614a4b565b5050565b60006001600160a01b03821661166e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016107d3565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b036101009091041633146116ea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b6112f46000613521565b600e80546117019061528b565b80601f016020809104026020016040519081016040528092919081815260200182805461172d9061528b565b801561177a5780601f1061174f5761010080835404028352916020019161177a565b820191906000526020600020905b81548152906001019060200180831161175d57829003601f168201915b505050505081565b600a546001600160a01b036101009091041633146117e25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b80516115ec9060209081840190614a4b565b600a546001600160a01b036101009091041633146118545760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b6112f4613592565b600a546001600160a01b036101009091041633146118bc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b610a8d600e83836149d7565b600a546001600160a01b036101009091041633146119285760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b828411156119785760405162461bcd60e51b815260206004820152601360248201527f494e56414c49445f544f4b454e5f52414e47450000000000000000000000000060448201526064016107d3565b80611983858561538c565b61198e906001615374565b146119db5760405162461bcd60e51b815260206004820152601a60248201527f494e434f52524543545f4d455441444154415f4d415050494e4700000000000060448201526064016107d3565b6011548311156119eb5760118390555b835b6119f8846001615374565b811015611a6957611a3381611a2e8585611a128a8561538c565b818110611a2157611a216152de565b905060200201358461361a565b6137f8565b60008281526013602090815260409091208251611a569391929190910190614953565b5080611a618161533c565b9150506119ed565b5050505050565b600a546001600160a01b03610100909104163314611ad05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b801515602260019054906101000a900460ff16151503611b325760405162461bcd60e51b815260206004820181905260248201527f4e45575f53544154455f4944454e544943414c5f544f5f4f4c445f535441544560448201526064016107d3565b60228054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b6060600180546108389061528b565b600a546001600160a01b03610100909104163314611bd85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b600b8114611c4e5760405162461bcd60e51b815260206004820152602260248201527f494e434f52524543545f424153455f4d455441444154415f415454524942555460448201527f455300000000000000000000000000000000000000000000000000000000000060648201526084016107d3565b60405180610140016040528083836000818110611c6d57611c6d6152de565b9050602002810190611c7f91906153a3565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200183836001818110611ccc57611ccc6152de565b9050602002810190611cde91906153a3565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200183836002818110611d2b57611d2b6152de565b9050602002810190611d3d91906153a3565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200183836003818110611d8a57611d8a6152de565b9050602002810190611d9c91906153a3565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200183836004818110611de957611de96152de565b9050602002810190611dfb91906153a3565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200183836005818110611e4857611e486152de565b9050602002810190611e5a91906153a3565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200183836006818110611ea757611ea76152de565b9050602002810190611eb991906153a3565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200183836007818110611f0657611f066152de565b9050602002810190611f1891906153a3565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200183836008818110611f6557611f656152de565b9050602002810190611f7791906153a3565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200183836009818110611fc457611fc46152de565b9050602002810190611fd691906153a3565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152508051805160149161202291839160200190614953565b50602082810151805161203b9260018501920190614953565b5060408201518051612057916002840191602090910190614953565b5060608201518051612073916003840191602090910190614953565b506080820151805161208f916004840191602090910190614953565b5060a082015180516120ab916005840191602090910190614953565b5060c082015180516120c7916006840191602090910190614953565b5060e082015180516120e3916007840191602090910190614953565b506101008201518051612100916008840191602090910190614953565b506101208201518051611a69916009840191602090910190614953565b600a546001600160a01b0361010090910416331461217d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b6000838152600260205260409020546001600160a01b03166122075760405162461bcd60e51b815260206004820152602660248201527f53657474696e67206d6574616461746120666f72206e6f6e6578697374656e7460448201527f20746f6b656e000000000000000000000000000000000000000000000000000060648201526084016107d3565b60008381526013602052604090206122209083836149d7565b50505050565b6115ec338383613917565b6002600b54036122835760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107d3565b6002600b5560225460ff16806122a05750602254610100900460ff165b6122ec5760405162461bcd60e51b815260206004820152601260248201527f53414c455f49535f4e4f545f414354495645000000000000000000000000000060448201526064016107d3565b836001146123625760405162461bcd60e51b815260206004820152602c60248201527f4f4e4c595f4f4e455f4d494e545f414c4c4f5745445f5748494c455f5345545460448201527f494e475f4d45544144415441000000000000000000000000000000000000000060648201526084016107d3565b33600090815260126020526040902054839061237f908690615374565b11156123cd5760405162461bcd60e51b815260206004820152600e60248201527f4d494e545f544f4f5f4c4152474500000000000000000000000000000000000060448201526064016107d3565b60408051336020808301919091528183018690528251808303840181526060909201909252805191012087146124455760405162461bcd60e51b815260206004820152600f60248201527f4d4553534147455f494e56414c4944000000000000000000000000000000000060448201526064016107d3565b6124858787878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506133cf92505050565b6124d15760405162461bcd60e51b815260206004820152601b60248201527f5349474e41545552455f56414c49444154494f4e5f4641494c4544000000000060448201526064016107d3565b600281146125215760405162461bcd60e51b815260206004820152601060248201527f494e56414c49445f4d415441444154410000000000000000000000000000000060448201526064016107d3565b600061252c600c5490565b60225490915060ff16156125af577f00000000000000000000000000000000000000000000000000000000000003e88111156125aa5760405162461bcd60e51b815260206004820152601a60248201527f4e4f545f454e4f5547485f4d494e54535f415641494c41424c4500000000000060448201526064016107d3565b61261f565b7f00000000000000000000000000000000000000000000000000000000000003e881111561261f5760405162461bcd60e51b815260206004820152601a60248201527f4e4f545f454e4f5547485f4d494e54535f415641494c41424c4500000000000060448201526064016107d3565b336000908152601260205260408120805487929061263e908490615374565b90915550612706905081611a2e858560008161265c5761265c6152de565b905060200281019061266e91906153a3565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250899250889150600190508181106126b8576126b86152de565b90506020028101906126ca91906153a3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508892506139e5915050565b600082815260136020908152604090912082516127299391929190910190614953565b50612734338261346b565b612742600c80546001019055565b60225460ff16801561277357507f00000000000000000000000000000000000000000000000000000000000003e881145b15612787576022805460ff191690556127eb565b602254610100900460ff1680156127bd57507f00000000000000000000000000000000000000000000000000000000000003e881145b156127eb57602280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555b50506001600b55505050505050565b61280433836130d7565b6128765760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016107d3565b61222084848484613b40565b600a546001600160a01b036101009091041633146128e25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b7f00000000000000000000000000000000000000000000000000000000000003e861290d8284615408565b6001612918600c5490565b612922919061538c565b61292c9190615374565b111561297a5760405162461bcd60e51b815260206004820152600e60248201527f4d494e545f544f4f5f4c4152474500000000000000000000000000000000000060448201526064016107d3565b60005b828110156122205760005b828110156129e2576129c28585848181106129a5576129a56152de565b90506020020160208101906129ba9190614b79565b600c5461346b565b6129d0600c80546001019055565b806129da8161533c565b915050612988565b50806129ed8161533c565b91505061297d565b600a546001600160a01b03610100909104163314612a555760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b828114612aca5760405162461bcd60e51b815260206004820152602760248201527f4e4545445f53414d455f4e554d4245525f4f465f544f4b454e535f414e445f4d60448201527f455441444154410000000000000000000000000000000000000000000000000060648201526084016107d3565b60005b83811015612b9257612b0e858583818110612aea57612aea6152de565b905060200201356000908152600260205260409020546001600160a01b0316151590565b612b805760405162461bcd60e51b815260206004820152602660248201527f53657474696e67206d6574616461746120666f72206e6f6e6578697374656e7460448201527f20746f6b656e000000000000000000000000000000000000000000000000000060648201526084016107d3565b80612b8a8161533c565b915050612acd565b5060005b83811015611a6957828282818110612bb057612bb06152de565b9050602002810190612bc291906153a3565b60136000888886818110612bd857612bd86152de565b9050602002013581526020019081526020016000209190612bfa9291906149d7565b5080612c058161533c565b915050612b96565b6000818152600260205260409020546060906001600160a01b0316612c745760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e0060448201526064016107d3565b60225462010000900460ff1615612d4f5760008281526013602052604090208054601e91612d2891612ca59061528b565b80601f0160208091040260200160405190810160405280929190818152602001828054612cd19061528b565b8015612d1e5780601f10612cf357610100808354040283529160200191612d1e565b820191906000526020600020905b815481529060010190602001808311612d0157829003601f168201915b5050505050613bc9565b604051602001612d399291906154f7565b6040516020818303038152906040529050919050565b612d57613da6565b612d6083613db5565b604051602001612d3992919061551c565b919050565b600d80546117019061528b565b600a546001600160a01b03610100909104163314612de35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b801515602260029054906101000a900460ff16151503612e455760405162461bcd60e51b815260206004820181905260248201527f4e45575f53544154455f4944454e544943414c5f544f5f4f4c445f535441544560448201526064016107d3565b6022805491151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff909216919091179055565b600a546001600160a01b03610100909104163314612edd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107d3565b6001600160a01b038116612f595760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107d3565b612f6281613521565b50565b80546001019055565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061300157507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061077157507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610771565b600081815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038416908117909155819061309e826114ee565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166131615760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016107d3565b600061316c836114ee565b9050806001600160a01b0316846001600160a01b031614806131a75750836001600160a01b031661319c846108bb565b6001600160a01b0316145b806131d757506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166131f2826114ee565b6001600160a01b03161461326e5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e657200000000000000000000000000000000000000000000000000000060648201526084016107d3565b6001600160a01b0382166132e95760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016107d3565b6132f4838383613eea565b6132ff600082613051565b6001600160a01b038316600090815260036020526040812080546001929061332890849061538c565b90915550506001600160a01b0382166000908152600360205260408120805460019290613356908490615374565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006134328261342c856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90613f5d565b600f546001600160a01b039182169116149392505050565b6060601461345783613db5565b601f604051602001612d3993929190615573565b6115ec828260405180602001604052806000815250613f79565b600a5460ff166134d75760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016107d3565b600a805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600a80546001600160a01b038381166101008181027fffffffffffffffffffffff0000000000000000000000000000000000000000ff85161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a5460ff16156135e55760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016107d3565b600a805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586135043390565b61363e60405180606001604052806060815260200160608152602001606081525090565b61366260405180606001604052806060815260200160608152602001606081525090565b60218481548110613675576136756152de565b90600052602060002001805461368a9061528b565b80601f01602080910402602001604051908101604052809291908181526020018280546136b69061528b565b80156137035780601f106136d857610100808354040283529160200191613703565b820191906000526020600020905b8154815290600101906020018083116136e657829003601f168201915b5050509183525050602080548590811061371f5761371f6152de565b9060005260206000200180546137349061528b565b80601f01602080910402602001604051908101604052809291908181526020018280546137609061528b565b80156137ad5780601f10613782576101008083540402835291602001916137ad565b820191906000526020600020905b81548152906001019060200180831161379057829003601f168201915b505050505081604001819052506137c2614002565b6137cb84613db5565b6040516020016137dc9291906155a6565b60408051808303601f1901815291905260208201529392505050565b6060600061380584613db5565b60208085015160405161382193926015926016929091016155fd565b60408051601f1981840301815290829052915060009061384990601790601890602001615641565b6040516020818303038152906040529050600061386586613db5565b855160405161387a9291601991602001615656565b60408051601f19818403018152828252908701519092506000916138aa91601a91601b9190601c90602001615690565b604051602081830303815290604052905060008383836040516020016138d2939291906156c7565b60408051601f198184030181529082905291506138fb9060149087908490601d90602001615700565b6040516020818303038152906040529550505050505092915050565b816001600160a01b0316836001600160a01b0316036139785760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107d3565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613a0960405180606001604052806060815260200160608152602001606081525090565b613a228460405180602001604052806000815250614011565b613a6e5760405162461bcd60e51b815260206004820152600d60248201527f415554484f525f4e45454445440000000000000000000000000000000000000060448201526064016107d3565b613a878360405180602001604052806000815250614011565b613ad35760405162461bcd60e51b815260206004820152600c60248201527f51554f54455f4e4545444544000000000000000000000000000000000000000060448201526064016107d3565b613af760405180606001604052806060815260200160608152602001606081525090565b84815260408101849052613b09613da6565b613b1284613db5565b604051602001613b239291906155a6565b60408051808303601f190181529190526020820152949350505050565b613b4b8484846131df565b613b578484848461406b565b6122205760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016107d3565b80516060906000819003613bed575050604080516020810190915260008152919050565b60006003613bfc836002615374565b613c06919061575e565b613c11906004615408565b90506000613c20826020615374565b67ffffffffffffffff811115613c3857613c38614dcf565b6040519080825280601f01601f191660200182016040528015613c62576020820181803683370190505b509050600060405180606001604052806040815260200161585a604091399050600181016020830160005b86811015613cee576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101613c8d565b506003860660018114613d085760028114613d5257613d98565b7f3d3d0000000000000000000000000000000000000000000000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe830152613d98565b7f3d000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301525b505050918152949350505050565b6060600d80546108389061528b565b606081600003613df857505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115613e225780613e0c8161533c565b9150613e1b9050600a8361575e565b9150613dfc565b60008167ffffffffffffffff811115613e3d57613e3d614dcf565b6040519080825280601f01601f191660200182016040528015613e67576020820181803683370190505b5090505b84156131d757613e7c60018361538c565b9150613e89600a86615772565b613e94906030615374565b60f81b818381518110613ea957613ea96152de565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613ee3600a8661575e565b9450613e6b565b600a5460ff161580613f0657506010546001600160a01b031633145b613f525760405162461bcd60e51b815260206004820152601760248201527f5452414e53414354494f4e5f4e4f545f414c4c4f57454400000000000000000060448201526064016107d3565b610a8d83838361420c565b6000806000613f6c85856142c4565b91509150610ddf81614332565b613f83838361451e565b613f90600084848461406b565b610a8d5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016107d3565b6060600e80546108389061528b565b6000816040516020016140249190615786565b604051602081830303815290604052805190602001208360405160200161404b9190615786565b604051602081830303815290604052805190602001201415905092915050565b60006001600160a01b0384163b15614201576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a02906140c89033908990889088906004016157a2565b6020604051808303816000875af1925050508015614103575060408051601f3d908101601f19168201909252614100918101906157de565b60015b6141b6573d808015614131576040519150601f19603f3d011682016040523d82523d6000602084013e614136565b606091505b5080516000036141ae5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016107d3565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490506131d7565b506001949350505050565b6001600160a01b0383166142675761426281600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61428a565b816001600160a01b0316836001600160a01b03161461428a5761428a8382614684565b6001600160a01b0382166142a157610a8d81614721565b826001600160a01b0316826001600160a01b031614610a8d57610a8d82826147d0565b60008082516041036142fa5760208301516040840151606085015160001a6142ee87828585614814565b9450945050505061432b565b82516040036143235760208301516040840151614318868383614901565b93509350505061432b565b506000905060025b9250929050565b6000816004811115614346576143466157fb565b0361434e5750565b6001816004811115614362576143626157fb565b036143af5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016107d3565b60028160048111156143c3576143c36157fb565b036144105760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016107d3565b6003816004811115614424576144246157fb565b036144975760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016107d3565b60048160048111156144ab576144ab6157fb565b03612f625760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016107d3565b6001600160a01b0382166145745760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107d3565b6000818152600260205260409020546001600160a01b0316156145d95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107d3565b6145e560008383613eea565b6001600160a01b038216600090815260036020526040812080546001929061460e908490615374565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001614691846115f0565b61469b919061538c565b6000838152600760205260409020549091508082146146ee576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906147339060019061538c565b6000838152600960205260408120546008805493945090928490811061475b5761475b6152de565b90600052602060002001549050806008838154811061477c5761477c6152de565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806147b4576147b461582a565b6001900381819060005260206000200160009055905550505050565b60006147db836115f0565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561484b57506000905060036148f8565b8460ff16601b1415801561486357508460ff16601c14155b1561487457506000905060046148f8565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156148c8573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166148f1576000600192509250506148f8565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83168161493760ff86901c601b615374565b905061494587828885614814565b935093505050935093915050565b82805461495f9061528b565b90600052602060002090601f01602090048101928261498157600085556149c7565b82601f1061499a57805160ff19168380011785556149c7565b828001600101855582156149c7579182015b828111156149c75782518255916020019190600101906149ac565b506149d3929150614aa4565b5090565b8280546149e39061528b565b90600052602060002090601f016020900481019282614a0557600085556149c7565b82601f10614a1e5782800160ff198235161785556149c7565b828001600101855582156149c7579182015b828111156149c7578235825591602001919060010190614a30565b828054828255906000526020600020908101928215614a98579160200282015b82811115614a985782518051614a88918491602090910190614953565b5091602001919060010190614a6b565b506149d3929150614ab9565b5b808211156149d35760008155600101614aa5565b808211156149d3576000614acd8282614ad6565b50600101614ab9565b508054614ae29061528b565b6000825580601f10614af2575050565b601f016020900490600052602060002090810190612f629190614aa4565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114612f6257600080fd5b600060208284031215614b5057600080fd5b8135614b5b81614b10565b9392505050565b80356001600160a01b0381168114612d7157600080fd5b600060208284031215614b8b57600080fd5b614b5b82614b62565b60005b83811015614baf578181015183820152602001614b97565b838111156122205750506000910152565b60008151808452614bd8816020860160208601614b94565b601f01601f19169290920160200192915050565b602081526000614b5b6020830184614bc0565b600060208284031215614c1157600080fd5b5035919050565b60008060408385031215614c2b57600080fd5b614c3483614b62565b946020939093013593505050565b600080600060608486031215614c5757600080fd5b614c6084614b62565b9250614c6e60208501614b62565b9150604084013590509250925092565b6020808252825182820181905260009190848201906040850190845b81811015614cb657835183529284019291840191600101614c9a565b50909695505050505050565b60008083601f840112614cd457600080fd5b50813567ffffffffffffffff811115614cec57600080fd5b60208301915083602082850101111561432b57600080fd5b600080600080600060808688031215614d1c57600080fd5b85359450602086013567ffffffffffffffff811115614d3a57600080fd5b614d4688828901614cc2565b9699909850959660408101359660609091013595509350505050565b80358015158114612d7157600080fd5b600060208284031215614d8457600080fd5b614b5b82614d62565b60008060208385031215614da057600080fd5b823567ffffffffffffffff811115614db757600080fd5b614dc385828601614cc2565b90969095509350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614e2757614e27614dcf565b604052919050565b600067ffffffffffffffff831115614e4957614e49614dcf565b614e5c6020601f19601f86011601614dfe565b9050828152838383011115614e7057600080fd5b828260208301376000602084830101529392505050565b60006020808385031215614e9a57600080fd5b823567ffffffffffffffff80821115614eb257600080fd5b818501915085601f830112614ec657600080fd5b813581811115614ed857614ed8614dcf565b8060051b614ee7858201614dfe565b9182528381018501918581019089841115614f0157600080fd5b86860192505b83831015614f5257823585811115614f1f5760008081fd5b8601603f81018b13614f315760008081fd5b614f428b8983013560408401614e2f565b8352509186019190860190614f07565b9998505050505050505050565b60008083601f840112614f7157600080fd5b50813567ffffffffffffffff811115614f8957600080fd5b6020830191508360208260051b850101111561432b57600080fd5b60008060008060608587031215614fba57600080fd5b8435935060208501359250604085013567ffffffffffffffff811115614fdf57600080fd5b614feb87828801614f5f565b95989497509550505050565b6000806020838503121561500a57600080fd5b823567ffffffffffffffff81111561502157600080fd5b614dc385828601614f5f565b60008060006040848603121561504257600080fd5b83359250602084013567ffffffffffffffff81111561506057600080fd5b61506c86828701614cc2565b9497909650939450505050565b6000806040838503121561508c57600080fd5b61509583614b62565b91506150a360208401614d62565b90509250929050565b600080600080600080600060a0888a0312156150c757600080fd5b87359650602088013567ffffffffffffffff808211156150e657600080fd5b6150f28b838c01614cc2565b909850965060408a0135955060608a0135945060808a013591508082111561511957600080fd5b506151268a828b01614f5f565b989b979a50959850939692959293505050565b6000806000806080858703121561514f57600080fd5b61515885614b62565b935061516660208601614b62565b925060408501359150606085013567ffffffffffffffff81111561518957600080fd5b8501601f8101871361519a57600080fd5b6151a987823560208401614e2f565b91505092959194509250565b6000806000604084860312156151ca57600080fd5b833567ffffffffffffffff8111156151e157600080fd5b6151ed86828701614f5f565b909790965060209590950135949350505050565b6000806000806040858703121561521757600080fd5b843567ffffffffffffffff8082111561522f57600080fd5b61523b88838901614f5f565b9096509450602087013591508082111561525457600080fd5b50614feb87828801614f5f565b6000806040838503121561527457600080fd5b61527d83614b62565b91506150a360208401614b62565b600181811c9082168061529f57607f821691505b6020821081036152d8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361536d5761536d61530d565b5060010190565b600082198211156153875761538761530d565b500190565b60008282101561539e5761539e61530d565b500390565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126153d857600080fd5b83018035915067ffffffffffffffff8211156153f357600080fd5b60200191503681900382131561432b57600080fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156154405761544061530d565b500290565b8054600090600181811c908083168061545f57607f831692505b60208084108203615499577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b8180156154ad57600181146154be576154eb565b60ff198616895284890196506154eb565b60008881526020902060005b868110156154e35781548b8201529085019083016154ca565b505084890196505b50505050505092915050565b60006155038285615445565b8351615513818360208801614b94565b01949350505050565b6000835161552e818460208801614b94565b835190830190615542818360208801614b94565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b600061557f8286615445565b845161558f818360208901614b94565b61559b81830186615445565b979650505050505050565b600083516155b8818460208801614b94565b8351908301906155cc818360208801614b94565b7f2e706e67000000000000000000000000000000000000000000000000000000009101908152600401949350505050565b6000855161560f818460208a01614b94565b61562461561e82850188615445565b86615445565b90508351615636818360208801614b94565b019695505050505050565b60006131d76156508386615445565b84615445565b60008451615668818460208901614b94565b61567481840186615445565b90508351615686818360208801614b94565b0195945050505050565b600061569f61561e8388615445565b84516156af818360208901614b94565b6156bb81830186615445565b98975050505050505050565b600084516156d9818460208901614b94565b8451908301906156ed818360208901614b94565b8451910190615686818360208801614b94565b600061570c8287615445565b855161571c818360208a01614b94565b85519101906156af818360208901614b94565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261576d5761576d61572f565b500490565b6000826157815761578161572f565b500690565b60008251615798818460208701614b94565b9190910192915050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526157d46080830184614bc0565b9695505050505050565b6000602082840312156157f057600080fd5b8151614b5b81614b10565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212205a2a420a628f6fa540fafb658c63e49f670c7059b5f741fe44910dd37517e63764736f6c634300080d0033

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

00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000001d5a656e6563612078204e61732041636164656d79204f6e20436861696e00000000000000000000000000000000000000000000000000000000000000000000075a454e584e4153000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d564e46783676505870436648684e7973543359556439356e395a716a676674785a4d3750416f7866576955392f000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d564e46783676505870436648684e7973543359556439356e395a716a676674785a4d3750416f7866576955392f00000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Zeneca x Nas Academy On Chain
Arg [1] : symbol (string): ZENXNAS
Arg [2] : baseTokenURI_ (string): ipfs://QmVNFx6vPXpCfHhNysT3YUd95n9ZqjgftxZM7PAoxfWiU9/
Arg [3] : baseImageURI_ (string): ipfs://QmVNFx6vPXpCfHhNysT3YUd95n9ZqjgftxZM7PAoxfWiU9/
Arg [4] : maxSupply_ (uint256): 1000
Arg [5] : firstSaleSupply_ (uint256): 1000

-----Encoded View---------------
16 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [3] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [4] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [5] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [6] : 000000000000000000000000000000000000000000000000000000000000001d
Arg [7] : 5a656e6563612078204e61732041636164656d79204f6e20436861696e000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [9] : 5a454e584e415300000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [11] : 697066733a2f2f516d564e46783676505870436648684e797354335955643935
Arg [12] : 6e395a716a676674785a4d3750416f7866576955392f00000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [14] : 697066733a2f2f516d564e46783676505870436648684e797354335955643935
Arg [15] : 6e395a716a676674785a4d3750416f7866576955392f00000000000000000000


Deployed Bytecode Sourcemap

63823:18435:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57466:224;;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;57466:224:0;;;;;;;;72735:166;;;;;;:::i;:::-;;:::i;:::-;;44286:100;;;:::i;:::-;;;;;;;:::i;45845:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2189:55:1;;;2171:74;;2159:2;2144:18;45845:221:0;2025:226:1;45368:411:0;;;;;;:::i;:::-;;:::i;65315:56::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2661:25:1;;;2649:2;2634:18;65315:56:0;2515:177:1;72909:189:0;;;;;;:::i;:::-;;:::i;58106:113::-;58194:10;:17;58106:113;;46595:339;;;;;;:::i;:::-;;:::i;81381:237::-;;;;;;:::i;:::-;;:::i;64199:40::-;;;;;57774:256;;;;;;:::i;:::-;;:::i;76514:385::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;77566:1700::-;;;;;;:::i;:::-;;:::i;67053:37::-;;;;;;;;;72160:65;;;:::i;47005:185::-;;;;;;:::i;:::-;;:::i;71022:267::-;;;;;;:::i;:::-;;:::i;58296:233::-;;;;;;:::i;:::-;;:::i;73158:113::-;;;;;;:::i;:::-;;:::i;22513:86::-;22584:7;;;;22513:86;;43980:239;;;;;;:::i;:::-;;:::i;74561:131::-;;;;;;:::i;:::-;;:::i;43710:208::-;;;;;;:::i;:::-;;:::i;64051:32::-;;;;;;;20564:103;;;:::i;64123:26::-;;;:::i;74385:127::-;;;;;;:::i;:::-;;:::i;72091:61::-;;;:::i;73331:128::-;;;;;;:::i;:::-;;:::i;74757:639::-;;;;;;:::i;:::-;;:::i;19913:87::-;19986:6;;;;;-1:-1:-1;;;;;19986:6:0;19913:87;;71471:273;;;;;;:::i;:::-;;:::i;44455:104::-;;;:::i;73520:817::-;;;;;;:::i;:::-;;:::i;75478:238::-;;;;;;:::i;:::-;;:::i;46138:155::-;;;;;;:::i;:::-;;:::i;79545:1725::-;;;;;;:::i;:::-;;:::i;47261:328::-;;;;;;:::i;:::-;;:::i;81735:520::-;;;;;;:::i;:::-;;:::i;75819:610::-;;;;;;:::i;:::-;;:::i;67142:28::-;;;;;;;;;;;;70309:597;;;;;;:::i;:::-;;:::i;64090:26::-;;;:::i;64158:34::-;;;;;46364:164;;;;;;:::i;:::-;-1:-1:-1;;;;;46485:25:0;;;46461:4;46485:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;46364:164;71870:213;;;;;;:::i;:::-;;:::i;67097:38::-;;;;;;;;;;;;20822:201;;;;;;:::i;:::-;;:::i;57466:224::-;57568:4;57592:50;;;57607:35;57592:50;;:90;;;57646:36;57670:11;57646:23;:36::i;:::-;57585:97;57466:224;-1:-1:-1;;57466:224:0:o;72735:166::-;19986:6;;-1:-1:-1;;;;;19986:6:0;;;;;18717:10;20133:23;20125:68;;;;-1:-1:-1;;;20125:68:0;;13330:2:1;20125:68:0;;;13312:21:1;;;13349:18;;;13342:30;13408:34;13388:18;;;13381:62;13460:18;;20125:68:0;;;;;;;;;-1:-1:-1;;;;;72823:28:0;::::1;72815:37;;;::::0;::::1;;72863:13;:30:::0;;;::::1;-1:-1:-1::0;;;;;72863:30:0;;;::::1;::::0;;;::::1;::::0;;72735:166::o;44286:100::-;44340:13;44373:5;44366:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44286:100;:::o;45845:221::-;45921:7;49188:16;;;:7;:16;;;;;;-1:-1:-1;;;;;49188:16:0;45941:73;;;;-1:-1:-1;;;45941:73:0;;14133:2:1;45941:73:0;;;14115:21:1;14172:2;14152:18;;;14145:30;14211:34;14191:18;;;14184:62;14282:14;14262:18;;;14255:42;14314:19;;45941:73:0;13931:408:1;45941:73:0;-1:-1:-1;46034:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;46034:24:0;;45845:221::o;45368:411::-;45449:13;45465:23;45480:7;45465:14;:23::i;:::-;45449:39;;45513:5;-1:-1:-1;;;;;45507:11:0;:2;-1:-1:-1;;;;;45507:11:0;;45499:57;;;;-1:-1:-1;;;45499:57:0;;14546:2:1;45499:57:0;;;14528:21:1;14585:2;14565:18;;;14558:30;14624:34;14604:18;;;14597:62;14695:3;14675:18;;;14668:31;14716:19;;45499:57:0;14344:397:1;45499:57:0;18717:10;-1:-1:-1;;;;;45591:21:0;;;;:62;;-1:-1:-1;45616:37:0;45633:5;18717:10;46364:164;:::i;45616:37::-;45569:168;;;;-1:-1:-1;;;45569:168:0;;14948:2:1;45569:168:0;;;14930:21:1;14987:2;14967:18;;;14960:30;15026:34;15006:18;;;14999:62;15097:26;15077:18;;;15070:54;15141:19;;45569:168:0;14746:420:1;45569:168:0;45750:21;45759:2;45763:7;45750:8;:21::i;:::-;45438:341;45368:411;;:::o;72909:189::-;19986:6;;-1:-1:-1;;;;;19986:6:0;;;;;18717:10;20133:23;20125:68;;;;-1:-1:-1;;;20125:68:0;;13330:2:1;20125:68:0;;;13312:21:1;;;13349:18;;;13342:30;13408:34;13388:18;;;13381:62;13460:18;;20125:68:0;13128:356:1;20125:68:0;-1:-1:-1;;;;;73020:28:0;::::1;73012:37;;;::::0;::::1;;73060:13;:30:::0;;;::::1;-1:-1:-1::0;;;;;73060:30:0;;;::::1;::::0;;;::::1;::::0;;72909:189::o;46595:339::-;46790:41;18717:10;46823:7;46790:18;:41::i;:::-;46782:103;;;;-1:-1:-1;;;46782:103:0;;15373:2:1;46782:103:0;;;15355:21:1;15412:2;15392:18;;;15385:30;15451:34;15431:18;;;15424:62;15522:19;15502:18;;;15495:47;15559:19;;46782:103:0;15171:413:1;46782:103:0;46898:28;46908:4;46914:2;46918:7;46898:9;:28::i;81381:237::-;5353:1;5951:7;;:19;5943:63;;;;-1:-1:-1;;;5943:63:0;;15791:2:1;5943:63:0;;;15773:21:1;15830:2;15810:18;;;15803:30;15869:33;15849:18;;;15842:61;15920:18;;5943:63:0;15589:355:1;5943:63:0;5353:1;6084:7;:18;81477:10:::1;81456:17;81464:8:::0;81456:7:::1;:17::i;:::-;-1:-1:-1::0;;;;;81456:31:0::1;;81448:58;;;::::0;-1:-1:-1;;;81448:58:0;;16151:2:1;81448:58:0::1;::::0;::::1;16133:21:1::0;16190:2;16170:18;;;16163:30;16229:16;16209:18;;;16202:44;16263:18;;81448:58:0::1;15949:338:1::0;81448:58:0::1;81586:13;::::0;81564:46:::1;::::0;81574:10:::1;::::0;-1:-1:-1;;;;;81586:13:0::1;81601:8:::0;81564:9:::1;:46::i;:::-;-1:-1:-1::0;5309:1:0;6263:7;:22;81381:237::o;57774:256::-;57871:7;57907:23;57924:5;57907:16;:23::i;:::-;57899:5;:31;57891:87;;;;-1:-1:-1;;;57891:87:0;;16494:2:1;57891:87:0;;;16476:21:1;16533:2;16513:18;;;16506:30;16572:34;16552:18;;;16545:62;16643:13;16623:18;;;16616:41;16674:19;;57891:87:0;16292:407:1;57891:87:0;-1:-1:-1;;;;;;57996:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;57774:256::o;76514:385::-;76585:16;76614:24;76641:16;76651:5;76641:9;:16::i;:::-;76614:43;;76668:28;76713:16;76699:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;76699:31:0;;76668:62;;76746:9;76741:122;76765:16;76761:1;:20;76741:122;;;76821:29;76841:5;76848:1;76821:19;:29::i;:::-;76803:11;76815:1;76803:14;;;;;;;;:::i;:::-;;;;;;;;;;:48;76783:3;;;;:::i;:::-;;;;76741:122;;;-1:-1:-1;76880:11:0;76514:385;-1:-1:-1;;;76514:385:0:o;77566:1700::-;5353:1;5951:7;;:19;5943:63;;;;-1:-1:-1;;;5943:63:0;;15791:2:1;5943:63:0;;;15773:21:1;15830:2;15810:18;;;15803:30;15869:33;15849:18;;;15842:61;15920:18;;5943:63:0;15589:355:1;5943:63:0;5353:1;6084:7;:18;77771:17:::1;::::0;::::1;;::::0;:39:::1;;-1:-1:-1::0;77792:18:0::1;::::0;::::1;::::0;::::1;;;77771:39;77763:70;;;::::0;-1:-1:-1;;;77763:70:0;;17484:2:1;77763:70:0::1;::::0;::::1;17466:21:1::0;17523:2;17503:18;;;17496:30;17562:20;17542:18;;;17535:48;17600:18;;77763:70:0::1;17282:342:1::0;77763:70:0::1;77874:10;77852:33;::::0;;;:21:::1;:33;::::0;;;;;77905:19;;77852:49:::1;::::0;77888:13;;77852:49:::1;:::i;:::-;:72;;77844:99;;;::::0;-1:-1:-1;;;77844:99:0;;17964:2:1;77844:99:0::1;::::0;::::1;17946:21:1::0;18003:2;17983:18;;;17976:30;18042:16;18022:18;;;18015:44;18076:18;;77844:99:0::1;17762:338:1::0;77844:99:0::1;77298:39:::0;;;77974:10:::1;77298:39:::0;;;;29375:74:1;;;;29465:18;;;29458:34;;;77298:39:0;;;;;;;;;29348:18:1;;;;77298:39:0;;;77288:50;;;;;78010:11;77962:59:::1;77954:87;;;::::0;-1:-1:-1;;;77954:87:0;;18307:2:1;77954:87:0::1;::::0;::::1;18289:21:1::0;18346:2;18326:18;;;18319:30;18385:17;18365:18;;;18358:45;18420:18;;77954:87:0::1;18105:339:1::0;77954:87:0::1;78074:43;78094:11;78107:9;;78074:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;78074:19:0::1;::::0;-1:-1:-1;;;78074:43:0:i:1;:::-;78052:120;;;::::0;-1:-1:-1;;;78052:120:0;;18651:2:1;78052:120:0::1;::::0;::::1;18633:21:1::0;18690:2;18670:18;;;18663:30;18729:29;18709:18;;;18702:57;18776:18;;78052:120:0::1;18449:351:1::0;78052:120:0::1;78185:21;78209:13;58194:10:::0;:17;;58106:113;78209:13:::1;78239:17;::::0;78185:37;;-1:-1:-1;78239:17:0::1;;78235:251;;;78314:15;78281:29;78297:13:::0;78281;:29:::1;:::i;:::-;:48;;78273:87;;;::::0;-1:-1:-1;;;78273:87:0;;19007:2:1;78273:87:0::1;::::0;::::1;18989:21:1::0;19046:2;19026:18;;;19019:30;19085:28;19065:18;;;19058:56;19131:18;;78273:87:0::1;18805:350:1::0;78273:87:0::1;78235:251;;;78434:9;78401:29;78417:13:::0;78401;:29:::1;:::i;:::-;:42;;78393:81;;;::::0;-1:-1:-1;;;78393:81:0;;19007:2:1;78393:81:0::1;::::0;::::1;18989:21:1::0;19046:2;19026:18;;;19019:30;19085:28;19065:18;;;19058:56;19131:18;;78393:81:0::1;18805:350:1::0;78393:81:0::1;78520:10;78498:33;::::0;;;:21:::1;:33;::::0;;;;:50;;78535:13;;78498:33;:50:::1;::::0;78535:13;;78498:50:::1;:::i;:::-;::::0;;;-1:-1:-1;78564:9:0::1;::::0;-1:-1:-1;78559:428:0::1;78583:13;78579:1;:17;78559:428;;;78618:17;78638:18;:8;3040:14:::0;;2948:114;78638:18:::1;78618:38;;78687:18;;78675:9;:30;78671:223;;;78782:77;78827:9;78782:18;:77::i;:::-;78726:25;::::0;;;:14:::1;:25;::::0;;;;;;;:152;;::::1;::::0;:25;;:152;;;::::1;::::0;::::1;:::i;:::-;;78671:223;78908:32;78918:10;78930:9;78908;:32::i;:::-;78955:20;:8;3159:19:::0;;3177:1;3159:19;;;3070:127;78955:20:::1;-1:-1:-1::0;78598:3:0;::::1;::::0;::::1;:::i;:::-;;;;78559:428;;;-1:-1:-1::0;79003:17:0::1;::::0;::::1;;:71:::0;::::1;;;-1:-1:-1::0;79058:15:0::1;79025:29;79041:13:::0;79025;:29:::1;:::i;:::-;:48;;79003:71;78999:260;;;79091:17;:25:::0;;-1:-1:-1;;79091:25:0::1;::::0;;78999:260:::1;;;79138:18;::::0;::::1;::::0;::::1;;;:66:::0;::::1;;;-1:-1:-1::0;79194:9:0::1;79161:29;79177:13:::0;79161;:29:::1;:::i;:::-;:42;;79138:66;79134:125;;;79221:18;:26:::0;;;::::1;::::0;;79134:125:::1;-1:-1:-1::0;;5309:1:0;6263:7;:22;-1:-1:-1;;;;77566:1700:0:o;72160:65::-;19986:6;;-1:-1:-1;;;;;19986:6:0;;;;;18717:10;20133:23;20125:68;;;;-1:-1:-1;;;20125:68:0;;13330:2:1;20125:68:0;;;13312:21:1;;;13349:18;;;13342:30;13408:34;13388:18;;;13381:62;13460:18;;20125:68:0;13128:356:1;20125:68:0;72207:10:::1;:8;:10::i;:::-;72160:65::o:0;47005:185::-;47143:39;47160:4;47166:2;47170:7;47143:39;;;;;;;;;;;;:16;:39::i;71022:267::-;19986:6;;-1:-1:-1;;;;;19986:6:0;;;;;18717:10;20133:23;20125:68;;;;-1:-1:-1;;;20125:68:0;;13330:2:1;20125:68:0;;;13312:21:1;;;13349:18;;;13342:30;13408:34;13388:18;;;13381:62;13460:18;;20125:68:0;13128:356:1;20125:68:0;71127:17:::1;::::0;:42;::::1;;:17;::::0;;::::1;:42;;::::0;71105:124:::1;;;::::0;-1:-1:-1;;;71105:124:0;;19362:2:1;71105:124:0::1;::::0;::::1;19344:21:1::0;;;19381:18;;;19374:30;19440:34;19420:18;;;19413:62;19492:18;;71105:124:0::1;19160:356:1::0;71105:124:0::1;71240:17;:41:::0;;-1:-1:-1;;71240:41:0::1;::::0;::::1;;::::0;;;::::1;::::0;;71022:267::o;58296:233::-;58371:7;58407:30;58194:10;:17;;58106:113;58407:30;58399:5;:38;58391:95;;;;-1:-1:-1;;;58391:95:0;;19723:2:1;58391:95:0;;;19705:21:1;19762:2;19742:18;;;19735:30;19801:34;19781:18;;;19774:62;19872:14;19852:18;;;19845:42;19904:19;;58391:95:0;19521:408:1;58391:95:0;58504:10;58515:5;58504:17;;;;;;;;:::i;:::-;;;;;;;;;58497:24;;58296:233;;;:::o;73158:113::-;19986:6;;-1:-1:-1;;;;;19986:6:0;;;;;18717:10;20133:23;20125:68;;;;-1:-1:-1;;;20125:68:0;;13330:2:1;20125:68:0;;;13312:21:1;;;13349:18;;;13342:30;13408:34;13388:18;;;13381:62;13460:18;;20125:68:0;13128:356:1;20125:68:0;73237:26:::1;:12;73252:11:::0;;73237:26:::1;:::i;43980:239::-:0;44052:7;44088:16;;;:7;:16;;;;;;-1:-1:-1;;;;;44088:16:0;;44115:73;;;;-1:-1:-1;;;44115:73:0;;20136:2:1;44115:73:0;;;20118:21:1;20175:2;20155:18;;;20148:30;20214:34;20194:18;;;20187:62;20285:11;20265:18;;;20258:39;20314:19;;44115:73:0;19934:405:1;74561:131:0;19986:6;;-1:-1:-1;;;;;19986:6:0;;;;;18717:10;20133:23;20125:68;;;;-1:-1:-1;;;20125:68:0;;13330:2:1;20125:68:0;;;13312:21:1;;;13349:18;;;13342:30;13408:34;13388:18;;;13381:62;13460:18;;20125:68:0;13128:356:1;20125:68:0;74663:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;74561:131:::0;:::o;43710:208::-;43782:7;-1:-1:-1;;;;;43810:19:0;;43802:74;;;;-1:-1:-1;;;43802:74:0;;20546:2:1;43802:74:0;;;20528:21:1;20585:2;20565:18;;;20558:30;20624:34;20604:18;;;20597:62;20695:12;20675:18;;;20668:40;20725:19;;43802:74:0;20344:406:1;43802:74:0;-1:-1:-1;;;;;;43894:16:0;;;;;:9;:16;;;;;;;43710:208::o;20564:103::-;19986:6;;-1:-1:-1;;;;;19986:6:0;;;;;18717:10;20133:23;20125:68;;;;-1:-1:-1;;;20125:68:0;;13330:2:1;20125:68:0;;;13312:21:1;;;13349:18;;;13342:30;13408:34;13388:18;;;13381:62;13460:18;;20125:68:0;13128:356:1;20125:68:0;20629:30:::1;20656:1;20629:18;:30::i;64123:26::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;74385:127::-;19986:6;;-1:-1:-1;;;;;19986:6:0;;;;;18717:10;20133:23;20125:68;;;;-1:-1:-1;;;20125:68:0;;13330:2:1;20125:68:0;;;13312:21:1;;;13349:18;;;13342:30;13408:34;13388:18;;;13381:62;13460:18;;20125:68:0;13128:356:1;20125:68:0;74485:19;;::::1;::::0;:6:::1;::::0;:19;;::::1;::::0;::::1;:::i;72091:61::-:0;19986:6;;-1:-1:-1;;;;;19986:6:0;;;;;18717:10;20133:23;20125:68;;;;-1:-1:-1;;;20125:68:0;;13330:2:1;20125:68:0;;;13312:21:1;;;13349:18;;;13342:30;13408:34;13388:18;;;13381:62;13460:18;;20125:68:0;13128:356:1;20125:68:0;72136:8:::1;:6;:8::i;73331:128::-:0;19986:6;;-1:-1:-1;;;;;19986:6:0;;;;;18717:10;20133:23;20125:68;;;;-1:-1:-1;;;20125:68:0;;13330:2:1;20125:68:0;;;13312:21:1;;;13349:18;;;13342:30;13408:34;13388:18;;;13381:62;13460:18;;20125:68:0;13128:356:1;20125:68:0;73420:31:::1;:12;73435:16:::0;;73420:31:::1;:::i;74757:639::-:0;19986:6;;-1:-1:-1;;;;;19986:6:0;;;;;18717:10;20133:23;20125:68;;;;-1:-1:-1;;;20125:68:0;;13330:2:1;20125:68:0;;;13312:21:1;;;13349:18;;;13342:30;13408:34;13388:18;;;13381:62;13460:18;;20125:68:0;13128:356:1;20125:68:0;74958:9:::1;74943:11;:24;;74935:56;;;::::0;-1:-1:-1;;;74935:56:0;;20957:2:1;74935:56:0::1;::::0;::::1;20939:21:1::0;20996:2;20976:18;;;20969:30;21035:21;21015:18;;;21008:49;21074:18;;74935:56:0::1;20755:343:1::0;74935:56:0::1;75041:16:::0;75010:23:::1;75022:11:::0;75010:9;:23:::1;:::i;:::-;:27;::::0;75036:1:::1;75010:27;:::i;:::-;:54;75002:93;;;::::0;-1:-1:-1;;;75002:93:0;;21435:2:1;75002:93:0::1;::::0;::::1;21417:21:1::0;21474:2;21454:18;;;21447:30;21513:28;21493:18;;;21486:56;21559:18;;75002:93:0::1;21233:350:1::0;75002:93:0::1;75123:18;;75111:9;:30;75108:91;;;75157:18;:30:::0;;;75108:91:::1;75227:11:::0;75211:178:::1;75244:13;:9:::0;75256:1:::1;75244:13;:::i;:::-;75240:1;:17;75211:178;;;75304:72;75316:1:::0;75319:56:::1;75338:16:::0;;75355:15:::1;75359:11:::0;75316:1;75355:15:::1;:::i;:::-;75338:33;;;;;;;:::i;:::-;;;;;;;75373:1;75319:18;:56::i;:::-;75304:11;:72::i;:::-;75278:17;::::0;;;:14:::1;:17;::::0;;;;;;;:99;;::::1;::::0;:17;;:99;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;75259:3:0;::::1;::::0;::::1;:::i;:::-;;;;75211:178;;;;74757:639:::0;;;;:::o;71471:273::-;19986:6;;-1:-1:-1;;;;;19986:6:0;;;;;18717:10;20133:23;20125:68;;;;-1:-1:-1;;;20125:68:0;;13330:2:1;20125:68:0;;;13312:21:1;;;13349:18;;;13342:30;13408:34;13388:18;;;13381:62;13460:18;;20125:68:0;13128:356:1;20125:68:0;71600:22:::1;71578:44;;:18;;;;;;;;;;;:44;;::::0;71556:126:::1;;;::::0;-1:-1:-1;;;71556:126:0;;19362:2:1;71556:126:0::1;::::0;::::1;19344:21:1::0;;;19381:18;;;19374:30;19440:34;19420:18;;;19413:62;19492:18;;71556:126:0::1;19160:356:1::0;71556:126:0::1;71693:18;:43:::0;;;::::1;;;;::::0;;;::::1;::::0;;;::::1;::::0;;71471:273::o;44455:104::-;44511:13;44544:7;44537:14;;;;;:::i;73520:817::-;19986:6;;-1:-1:-1;;;;;19986:6:0;;;;;18717:10;20133:23;20125:68;;;;-1:-1:-1;;;20125:68:0;;13330:2:1;20125:68:0;;;13312:21:1;;;13349:18;;;13342:30;13408:34;13388:18;;;13381:62;13460:18;;20125:68:0;13128:356:1;20125:68:0;73683:2:::1;73656:29:::0;::::1;73634:113;;;::::0;-1:-1:-1;;;73634:113:0;;21790:2:1;73634:113:0::1;::::0;::::1;21772:21:1::0;21829:2;21809:18;;;21802:30;21868:34;21848:18;;;21841:62;21939:4;21919:18;;;21912:32;21961:19;;73634:113:0::1;21588:398:1::0;73634:113:0::1;73771:558;;;;;;;;73814:16;;73831:1;73814:19;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;73771:558;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;;73771:558:0;;;-1:-1:-1;73771:558:0::1;;73870:16:::0;;73887:1:::1;73870:19:::0;;::::1;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;73771:558;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;;73771:558:0;;;-1:-1:-1;73771:558:0::1;;73919:16:::0;;73936:1:::1;73919:19:::0;;::::1;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;73771:558;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;;73771:558:0;;;-1:-1:-1;73771:558:0::1;;73978:16:::0;;73995:1:::1;73978:19:::0;;::::1;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;73771:558;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;;73771:558:0;;;-1:-1:-1;73771:558:0::1;;74032:16:::0;;74049:1:::1;74032:19:::0;;::::1;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;73771:558;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;;73771:558:0;;;-1:-1:-1;73771:558:0::1;;74086:16:::0;;74103:1:::1;74086:19:::0;;::::1;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;73771:558;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;;73771:558:0;;;-1:-1:-1;73771:558:0::1;;74140:16:::0;;74157:1:::1;74140:19:::0;;::::1;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;73771:558;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;;73771:558:0;;;-1:-1:-1;73771:558:0::1;;74194:16:::0;;74211:1:::1;74194:19:::0;;::::1;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;73771:558;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;;73771:558:0;;;-1:-1:-1;73771:558:0::1;;74251:16:::0;;74268:1:::1;74251:19:::0;;::::1;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;73771:558;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;;73771:558:0;;;-1:-1:-1;73771:558:0::1;;74298:16:::0;;74315:1:::1;74298:19:::0;;::::1;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;73771:558;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;;73771:558:0;;-1:-1:-1;73760:569:0;;;;:8:::1;::::0;:569:::1;::::0;:8;;:569:::1;;::::0;::::1;:::i;:::-;-1:-1:-1::0;73760:569:0::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;73760:569:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;73760:569:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;73760:569:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;73760:569:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;73760:569:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;73760:569:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;73760:569:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;73760:569:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;75478:238::-:0;19986:6;;-1:-1:-1;;;;;19986:6:0;;;;;18717:10;20133:23;20125:68;;;;-1:-1:-1;;;20125:68:0;;13330:2:1;20125:68:0;;;13312:21:1;;;13349:18;;;13342:30;13408:34;13388:18;;;13381:62;13460:18;;20125:68:0;13128:356:1;20125:68:0;49164:4;49188:16;;;:7;:16;;;;;;-1:-1:-1;;;;;49188:16:0;75595:67:::1;;;::::0;-1:-1:-1;;;75595:67:0;;22779:2:1;75595:67:0::1;::::0;::::1;22761:21:1::0;22818:2;22798:18;;;22791:30;22857:34;22837:18;;;22830:62;22928:8;22908:18;;;22901:36;22954:19;;75595:67:0::1;22577:402:1::0;75595:67:0::1;75673:23;::::0;;;:14:::1;:23;::::0;;;;:35:::1;::::0;75699:9;;75673:35:::1;:::i;:::-;;75478:238:::0;;;:::o;46138:155::-;46233:52;18717:10;46266:8;46276;46233:18;:52::i;79545:1725::-;5353:1;5951:7;;:19;5943:63;;;;-1:-1:-1;;;5943:63:0;;15791:2:1;5943:63:0;;;15773:21:1;15830:2;15810:18;;;15803:30;15869:33;15849:18;;;15842:61;15920:18;;5943:63:0;15589:355:1;5943:63:0;5353:1;6084:7;:18;79799:17:::1;::::0;::::1;;::::0;:39:::1;;-1:-1:-1::0;79820:18:0::1;::::0;::::1;::::0;::::1;;;79799:39;79791:70;;;::::0;-1:-1:-1;;;79791:70:0;;17484:2:1;79791:70:0::1;::::0;::::1;17466:21:1::0;17523:2;17503:18;;;17496:30;17562:20;17542:18;;;17535:48;17600:18;;79791:70:0::1;17282:342:1::0;79791:70:0::1;79880:13;79897:1;79880:18;79872:75;;;::::0;-1:-1:-1;;;79872:75:0;;23186:2:1;79872:75:0::1;::::0;::::1;23168:21:1::0;23225:2;23205:18;;;23198:30;23264:34;23244:18;;;23237:62;23335:14;23315:18;;;23308:42;23367:19;;79872:75:0::1;22984:408:1::0;79872:75:0::1;79988:10;79966:33;::::0;;;:21:::1;:33;::::0;;;;;80019:19;;79966:49:::1;::::0;80002:13;;79966:49:::1;:::i;:::-;:72;;79958:99;;;::::0;-1:-1:-1;;;79958:99:0;;17964:2:1;79958:99:0::1;::::0;::::1;17946:21:1::0;18003:2;17983:18;;;17976:30;18042:16;18022:18;;;18015:44;18076:18;;79958:99:0::1;17762:338:1::0;79958:99:0::1;77298:39:::0;;;80088:10:::1;77298:39:::0;;;;29375:74:1;;;;29465:18;;;29458:34;;;77298:39:0;;;;;;;;;29348:18:1;;;;77298:39:0;;;77288:50;;;;;80124:11;80076:59:::1;80068:87;;;::::0;-1:-1:-1;;;80068:87:0;;18307:2:1;80068:87:0::1;::::0;::::1;18289:21:1::0;18346:2;18326:18;;;18319:30;18385:17;18365:18;;;18358:45;18420:18;;80068:87:0::1;18105:339:1::0;80068:87:0::1;80188:43;80208:11;80221:9;;80188:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;80188:19:0::1;::::0;-1:-1:-1;;;80188:43:0:i:1;:::-;80166:120;;;::::0;-1:-1:-1;;;80166:120:0;;18651:2:1;80166:120:0::1;::::0;::::1;18633:21:1::0;18690:2;18670:18;;;18663:30;18729:29;18709:18;;;18702:57;18776:18;;80166:120:0::1;18449:351:1::0;80166:120:0::1;80324:1;80305:20:::0;::::1;80297:49;;;::::0;-1:-1:-1;;;80297:49:0;;23599:2:1;80297:49:0::1;::::0;::::1;23581:21:1::0;23638:2;23618:18;;;23611:30;23677:18;23657;;;23650:46;23713:18;;80297:49:0::1;23397:340:1::0;80297:49:0::1;80359:17;80379:18;:8;3040:14:::0;;2948:114;80379:18:::1;80414:17;::::0;80359:38;;-1:-1:-1;80414:17:0::1;;80410:211;;;80469:15;80456:9;:28;;80448:67;;;::::0;-1:-1:-1;;;80448:67:0;;19007:2:1;80448:67:0::1;::::0;::::1;18989:21:1::0;19046:2;19026:18;;;19019:30;19085:28;19065:18;;;19058:56;19131:18;;80448:67:0::1;18805:350:1::0;80448:67:0::1;80410:211;;;80569:9;80556;:22;;80548:61;;;::::0;-1:-1:-1;;;80548:61:0;;19007:2:1;80548:61:0::1;::::0;::::1;18989:21:1::0;19046:2;19026:18;;;19019:30;19085:28;19065:18;;;19058:56;19131:18;;80548:61:0::1;18805:350:1::0;80548:61:0::1;80655:10;80633:33;::::0;;;:21:::1;:33;::::0;;;;:50;;80670:13;;80633:33;:50:::1;::::0;80670:13;;80633:50:::1;:::i;:::-;::::0;;;-1:-1:-1;80744:201:0::1;::::0;-1:-1:-1;80774:9:0;80802:128:::1;80834:8:::0;;80843:1:::1;80834:11:::0;::::1;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;80802:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;80868:8:0;;-1:-1:-1;80868:8:0;;-1:-1:-1;80877:1:0::1;::::0;-1:-1:-1;80868:11:0;;::::1;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;80802:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;80902:9:0;;-1:-1:-1;80802:9:0::1;::::0;-1:-1:-1;;80802:128:0:i:1;80744:201::-;80696:25;::::0;;;:14:::1;:25;::::0;;;;;;;:260;;::::1;::::0;:25;;:260;;;::::1;::::0;::::1;:::i;:::-;;80967:32;80977:10;80989:9;80967;:32::i;:::-;81010:20;:8;3159:19:::0;;3177:1;3159:19;;;3070:127;81010:20:::1;81047:17;::::0;::::1;;:51:::0;::::1;;;;81082:15;81069:9;:28;81047:51;81043:220;;;81115:17;:25:::0;;-1:-1:-1;;81115:25:0::1;::::0;;81043:220:::1;;;81162:18;::::0;::::1;::::0;::::1;;;:46:::0;::::1;;;;81198:9;81185;:22;81162:46;81158:105;;;81225:18;:26:::0;;;::::1;::::0;;81158:105:::1;-1:-1:-1::0;;5309:1:0;6263:7;:22;-1:-1:-1;;;;;;79545:1725:0:o;47261:328::-;47436:41;18717:10;47469:7;47436:18;:41::i;:::-;47428:103;;;;-1:-1:-1;;;47428:103:0;;15373:2:1;47428:103:0;;;15355:21:1;15412:2;15392:18;;;15385:30;15451:34;15431:18;;;15424:62;15522:19;15502:18;;;15495:47;15559:19;;47428:103:0;15171:413:1;47428:103:0;47542:39;47556:4;47562:2;47566:7;47575:5;47542:13;:39::i;81735:520::-;19986:6;;-1:-1:-1;;;;;19986:6:0;;;;;18717:10;20133:23;20125:68;;;;-1:-1:-1;;;20125:68:0;;13330:2:1;20125:68:0;;;13312:21:1;;;13349:18;;;13342:30;13408:34;13388:18;;;13381:62;13460:18;;20125:68:0;13128:356:1;20125:68:0;81953:9:::1;81901:29;81920:10:::0;81901:9;:29:::1;:::i;:::-;81896:1;81875:18;:8;3040:14:::0;;2948:114;81875:18:::1;:22;;;;:::i;:::-;:56;;;;:::i;:::-;81874:88;;81852:152;;;::::0;-1:-1:-1;;;81852:152:0;;17964:2:1;81852:152:0::1;::::0;::::1;17946:21:1::0;18003:2;17983:18;;;17976:30;18042:16;18022:18;;;18015:44;18076:18;;81852:152:0::1;17762:338:1::0;81852:152:0::1;82022:9;82017:231;82037:20:::0;;::::1;82017:231;;;82084:9;82079:158;82103:10;82099:1;:14;82079:158;;;82139:43;82149:9;;82159:1;82149:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;82163:8;3040:14:::0;82139:9:::1;:43::i;:::-;82201:20;:8;3159:19:::0;;3177:1;3159:19;;;3070:127;82201:20:::1;82115:3:::0;::::1;::::0;::::1;:::i;:::-;;;;82079:158;;;-1:-1:-1::0;82059:3:0;::::1;::::0;::::1;:::i;:::-;;;;82017:231;;75819:610:::0;19986:6;;-1:-1:-1;;;;;19986:6:0;;;;;18717:10;20133:23;20125:68;;;;-1:-1:-1;;;20125:68:0;;13330:2:1;20125:68:0;;;13312:21:1;;;13349:18;;;13342:30;13408:34;13388:18;;;13381:62;13460:18;;20125:68:0;13128:356:1;20125:68:0;75985:38;;::::1;75963:127;;;::::0;-1:-1:-1;;;75963:127:0;;24177:2:1;75963:127:0::1;::::0;::::1;24159:21:1::0;24216:2;24196:18;;;24189:30;24255:34;24235:18;;;24228:62;24326:9;24306:18;;;24299:37;24353:19;;75963:127:0::1;23975:403:1::0;75963:127:0::1;76103:9;76123:181;76135:17:::0;;::::1;76123:181;;;76200:18;76208:6;;76215:1;76208:9;;;;;;;:::i;:::-;;;;;;;49164:4:::0;49188:16;;;:7;:16;;;;;;-1:-1:-1;;;;;49188:16:0;:30;;;49099:127;76200:18:::1;76174:118;;;::::0;-1:-1:-1;;;76174:118:0;;22779:2:1;76174:118:0::1;::::0;::::1;22761:21:1::0;22818:2;22798:18;;;22791:30;22857:34;22837:18;;;22830:62;22928:8;22908:18;;;22901:36;22954:19;;76174:118:0::1;22577:402:1::0;76174:118:0::1;76154:3:::0;::::1;::::0;::::1;:::i;:::-;;;;76123:181;;;-1:-1:-1::0;76323:1:0::1;76314:108;76326:17:::0;;::::1;76314:108;;;76393:14;;76408:1;76393:17;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;76365:14;:25;76380:6;;76387:1;76380:9;;;;;;;:::i;:::-;;;;;;;76365:25;;;;;;;;;;;:45;;;;;;;:::i;:::-;-1:-1:-1::0;76345:3:0;::::1;::::0;::::1;:::i;:::-;;;;76314:108;;70309:597:::0;49164:4;49188:16;;;:7;:16;;;;;;70427:13;;-1:-1:-1;;;;;49188:16:0;70458:60;;;;-1:-1:-1;;;70458:60:0;;25170:2:1;70458:60:0;;;25152:21:1;25209:2;25189:18;;;25182:30;25248:33;25228:18;;;25221:61;25299:18;;70458:60:0;24968:355:1;70458:60:0;70535:9;;;;;;;70531:368;;;70716:23;;;;:14;:23;;;;;70702:38;;70657:18;;70702:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:38::i;:::-;70614:149;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70561:221;;70309:597;;;:::o;70531:368::-;70846:10;:8;:10::i;:::-;70858:18;:7;:16;:18::i;:::-;70829:57;;;;;;;;;:::i;70531:368::-;70309:597;;;:::o;64090:26::-;;;;;;;:::i;71870:213::-;19986:6;;-1:-1:-1;;;;;19986:6:0;;;;;18717:10;20133:23;20125:68;;;;-1:-1:-1;;;20125:68:0;;13330:2:1;20125:68:0;;;13312:21:1;;;13349:18;;;13342:30;13408:34;13388:18;;;13381:62;13460:18;;20125:68:0;13128:356:1;20125:68:0;71972:10:::1;71959:23;;:9;;;;;;;;;;;:23;;::::0;71937:105:::1;;;::::0;-1:-1:-1;;;71937:105:0;;19362:2:1;71937:105:0::1;::::0;::::1;19344:21:1::0;;;19381:18;;;19374:30;19440:34;19420:18;;;19413:62;19492:18;;71937:105:0::1;19160:356:1::0;71937:105:0::1;72053:9;:22:::0;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;71870:213::o;20822:201::-;19986:6;;-1:-1:-1;;;;;19986:6:0;;;;;18717:10;20133:23;20125:68;;;;-1:-1:-1;;;20125:68:0;;13330:2:1;20125:68:0;;;13312:21:1;;;13349:18;;;13342:30;13408:34;13388:18;;;13381:62;13460:18;;20125:68:0;13128:356:1;20125:68:0;-1:-1:-1;;;;;20911:22:0;::::1;20903:73;;;::::0;-1:-1:-1;;;20903:73:0;;27772:2:1;20903:73:0::1;::::0;::::1;27754:21:1::0;27811:2;27791:18;;;27784:30;27850:34;27830:18;;;27823:62;27921:8;27901:18;;;27894:36;27947:19;;20903:73:0::1;27570:402:1::0;20903:73:0::1;20987:28;21006:8;20987:18;:28::i;:::-;20822:201:::0;:::o;3070:127::-;3159:19;;3177:1;3159:19;;;3070:127::o;43341:305::-;43443:4;43480:40;;;43495:25;43480:40;;:105;;-1:-1:-1;43537:48:0;;;43552:33;43537:48;43480:105;:158;;;-1:-1:-1;35139:25:0;35124:40;;;;43602:36;35015:157;53245:174;53320:24;;;;:15;:24;;;;;:29;;;;-1:-1:-1;;;;;53320:29:0;;;;;;;;:24;;53374:23;53320:24;53374:14;:23::i;:::-;-1:-1:-1;;;;;53365:46:0;;;;;;;;;;;53245:174;;:::o;49393:348::-;49486:4;49188:16;;;:7;:16;;;;;;-1:-1:-1;;;;;49188:16:0;49503:73;;;;-1:-1:-1;;;49503:73:0;;28179:2:1;49503:73:0;;;28161:21:1;28218:2;28198:18;;;28191:30;28257:34;28237:18;;;28230:62;28328:14;28308:18;;;28301:42;28360:19;;49503:73:0;27977:408:1;49503:73:0;49587:13;49603:23;49618:7;49603:14;:23::i;:::-;49587:39;;49656:5;-1:-1:-1;;;;;49645:16:0;:7;-1:-1:-1;;;;;49645:16:0;;:51;;;;49689:7;-1:-1:-1;;;;;49665:31:0;:20;49677:7;49665:11;:20::i;:::-;-1:-1:-1;;;;;49665:31:0;;49645:51;:87;;;-1:-1:-1;;;;;;46485:25:0;;;46461:4;46485:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;49700:32;49637:96;49393:348;-1:-1:-1;;;;49393:348:0:o;52502:625::-;52661:4;-1:-1:-1;;;;;52634:31:0;:23;52649:7;52634:14;:23::i;:::-;-1:-1:-1;;;;;52634:31:0;;52626:81;;;;-1:-1:-1;;;52626:81:0;;28592:2:1;52626:81:0;;;28574:21:1;28631:2;28611:18;;;28604:30;28670:34;28650:18;;;28643:62;28741:7;28721:18;;;28714:35;28766:19;;52626:81:0;28390:401:1;52626:81:0;-1:-1:-1;;;;;52726:16:0;;52718:65;;;;-1:-1:-1;;;52718:65:0;;28998:2:1;52718:65:0;;;28980:21:1;29037:2;29017:18;;;29010:30;29076:34;29056:18;;;29049:62;29147:6;29127:18;;;29120:34;29171:19;;52718:65:0;28796:400:1;52718:65:0;52796:39;52817:4;52823:2;52827:7;52796:20;:39::i;:::-;52900:29;52917:1;52921:7;52900:8;:29::i;:::-;-1:-1:-1;;;;;52942:15:0;;;;;;:9;:15;;;;;:20;;52961:1;;52942:15;:20;;52961:1;;52942:20;:::i;:::-;;;;-1:-1:-1;;;;;;;52973:13:0;;;;;;:9;:13;;;;;:18;;52990:1;;52973:13;:18;;52990:1;;52973:18;:::i;:::-;;;;-1:-1:-1;;53002:16:0;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;53002:21:0;;;;;;;;;53041:27;;53002:16;;53041:27;;;;;;;45438:341;45368:411;;:::o;76907:258::-;77030:4;77102:55;77147:9;77102:36;:11;16845:58;;37431:66:1;16845:58:0;;;37419:79:1;37514:12;;;37507:28;;;16712:7:0;;37551:12:1;;16845:58:0;;;;;;;;;;;;16835:69;;;;;;16828:76;;16643:269;;;;77102:36;:44;;:55::i;:::-;77072:13;;-1:-1:-1;;;;;77072:85:0;;;:13;;:85;;76907:258;-1:-1:-1;;;76907:258:0:o;68449:357::-;68543:13;68658:8;68703:18;:7;:16;:18::i;:::-;68744:20;68619:164;;;;;;;;;;:::i;50083:110::-;50159:26;50169:2;50173:7;50159:26;;;;;;;;;;;;:9;:26::i;23572:120::-;22584:7;;;;23108:41;;;;-1:-1:-1;;;23108:41:0;;30166:2:1;23108:41:0;;;30148:21:1;30205:2;30185:18;;;30178:30;30244:22;30224:18;;;30217:50;30284:18;;23108:41:0;29964:344:1;23108:41:0;23631:7:::1;:15:::0;;-1:-1:-1;;23631:15:0::1;::::0;;23662:22:::1;18717:10:::0;23671:12:::1;23662:22;::::0;-1:-1:-1;;;;;2189:55:1;;;2171:74;;2159:2;2144:18;23662:22:0::1;;;;;;;23572:120::o:0;21183:191::-;21276:6;;;-1:-1:-1;;;;;21293:17:0;;;21276:6;21293:17;;;;;;;;;;21326:40;;21276:6;;;;;;;;21326:40;;21257:16;;21326:40;21246:128;21183:191;:::o;23313:118::-;22584:7;;;;22838:9;22830:38;;;;-1:-1:-1;;;22830:38:0;;30515:2:1;22830:38:0;;;30497:21:1;30554:2;30534:18;;;30527:30;30593:18;30573;;;30566:46;30629:18;;22830:38:0;30313:340:1;22830:38:0;23373:7:::1;:14:::0;;-1:-1:-1;;23373:14:0::1;23383:4;23373:14;::::0;;23403:20:::1;23410:12;18717:10:::0;;18637:98;68032:409;68139:13;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;68139:13:0;68214:19;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;68214:19:0;68259:7;68267:5;68259:14;;;;;;;;:::i;:::-;;;;;;;;68244:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;68244:29:0;;;-1:-1:-1;;68298:6:0;:13;;68305:5;;68298:13;;;;;;:::i;:::-;;;;;;;;68284:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:11;;:27;;;;68363:15;:13;:15::i;:::-;68380:18;:7;:16;:18::i;:::-;68346:61;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;68346:61:0;;;;;;;68322:14;;:86;:14;68032:409;-1:-1:-1;;;68032:409:0:o;68816:1364::-;68924:13;68955:29;69018:18;:7;:16;:18::i;:::-;69132:14;;;;;68987:170;;;;;69051:29;;69095:22;;69132:14;;68987:170;;:::i;:::-;;;;-1:-1:-1;;68987:170:0;;;;;;;;;;;-1:-1:-1;69168:32:0;;69203:116;;69234:32;;69281:27;;68987:170;69203:116;;:::i;:::-;;;;;;;;;;;;;69168:151;;69330:32;69396:18;:7;:16;:18::i;:::-;69471:12;;69365:129;;;;;69429:27;;69365:129;;;:::i;:::-;;;;-1:-1:-1;;69365:129:0;;;;;;;;;69655:11;;;;69365:129;;-1:-1:-1;69505:32:0;;69540:182;;69571:27;;69613;;69655:11;69681:30;;69365:129;69540:182;;:::i;:::-;;;;;;;;;;;;;69505:217;;69735:31;69800:19;69834;69868;69769:129;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;69769:129:0;;;;;;;;;;;-1:-1:-1;69954:203:0;;69993:8;;70038:16;;69769:129;;70118:20;;69769:129;69954:203;;:::i;:::-;;;;;;;;;;;;;69909:263;;;;;;;68816:1364;;;;:::o;53561:315::-;53716:8;-1:-1:-1;;;;;53707:17:0;:5;-1:-1:-1;;;;;53707:17:0;;53699:55;;;;-1:-1:-1;;;53699:55:0;;35152:2:1;53699:55:0;;;35134:21:1;35191:2;35171:18;;;35164:30;35230:27;35210:18;;;35203:55;35275:18;;53699:55:0;34950:349:1;53699:55:0;-1:-1:-1;;;;;53765:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;53765:46:0;;;;;;;;;;53827:41;;586::1;;;53827::0;;559:18:1;53827:41:0;;;;;;;53561:315;;;:::o;67531:493::-;67666:13;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;67666:13:0;67700:26;67715:6;67700:26;;;;;;;;;;;;:14;:26::i;:::-;67692:52;;;;-1:-1:-1;;;67692:52:0;;35506:2:1;67692:52:0;;;35488:21:1;35545:2;35525:18;;;35518:30;35584:15;35564:18;;;35557:43;35617:18;;67692:52:0;35304:337:1;67692:52:0;67763:25;67778:5;67763:25;;;;;;;;;;;;:14;:25::i;:::-;67755:50;;;;-1:-1:-1;;;67755:50:0;;35848:2:1;67755:50:0;;;35830:21:1;35887:2;35867:18;;;35860:30;35926:14;35906:18;;;35899:42;35958:18;;67755:50:0;35646:336:1;67755:50:0;67818:19;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;67818:19:0;67848:21;;;67880:11;;;:19;;;67951:10;:8;:10::i;:::-;67963:18;:7;:16;:18::i;:::-;67934:56;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;67934:56:0;;;;;;;67910:14;;:81;:14;67531:493;-1:-1:-1;;;;67531:493:0:o;48471:315::-;48628:28;48638:4;48644:2;48648:7;48628:9;:28::i;:::-;48675:48;48698:4;48704:2;48708:7;48717:5;48675:22;:48::i;:::-;48667:111;;;;-1:-1:-1;;;48667:111:0;;36189:2:1;48667:111:0;;;36171:21:1;36228:2;36208:18;;;36201:30;36267:34;36247:18;;;36240:62;36338:20;36318:18;;;36311:48;36376:19;;48667:111:0;35987:414:1;482:1589:0;580:11;;540:13;;566:11;606:8;;;602:23;;-1:-1:-1;;616:9:0;;;;;;;;;-1:-1:-1;616:9:0;;;482:1589;-1:-1:-1;482:1589:0:o;602:23::-;677:18;715:1;704:7;:3;710:1;704:7;:::i;:::-;703:13;;;;:::i;:::-;698:19;;:1;:19;:::i;:::-;677:40;-1:-1:-1;775:19:0;807:15;677:40;820:2;807:15;:::i;:::-;797:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;797:26:0;;775:48;;834:18;855:5;;;;;;;;;;;;;;;;;834:26;;924:1;917:5;913:13;969:2;961:6;957:15;1018:1;986:769;1041:3;1038:1;1035:10;986:769;;;1094:1;1137:12;;;;;1131:19;1230:4;1218:2;1214:14;;;;;1196:40;;1190:47;1339:2;1335:14;;;1331:25;;1317:40;;1311:47;1468:1;1464:13;;;1460:24;;1446:39;;1440:46;1588:16;;;;1574:31;;1568:38;1266:1;1262:11;;;1360:4;1307:58;;;1298:68;1391:11;;1436:57;;;1427:67;;;;1519:11;;1564:49;;1555:59;1643:3;1639:13;1670:22;;1738:1;1723:17;;;;1087:9;986:769;;;990:44;1785:1;1780:3;1776:11;1806:1;1801:84;;;;1904:1;1899:82;;;;1769:212;;1801:84;1853:16;1834:17;;;1827:43;1801:84;;1899:82;1951:14;1932:17;;;1925:41;1769:212;-1:-1:-1;;;1995:26:0;;;2002:6;482:1589;-1:-1:-1;;;;482:1589:0:o;70188:113::-;70248:13;70281:12;70274:19;;;;;:::i;6665:723::-;6721:13;6942:5;6951:1;6942:10;6938:53;;-1:-1:-1;;6969:10:0;;;;;;;;;;;;;;;;;;6665:723::o;6938:53::-;7016:5;7001:12;7057:78;7064:9;;7057:78;;7090:8;;;;:::i;:::-;;-1:-1:-1;7113:10:0;;-1:-1:-1;7121:2:0;7113:10;;:::i;:::-;;;7057:78;;;7145:19;7177:6;7167:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7167:17:0;;7145:39;;7195:154;7202:10;;7195:154;;7229:11;7239:1;7229:11;;:::i;:::-;;-1:-1:-1;7298:10:0;7306:2;7298:5;:10;:::i;:::-;7285:24;;:2;:24;:::i;:::-;7272:39;;7255:6;7262;7255:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;7326:11:0;7335:2;7326:11;;:::i;:::-;;;7195:154;;72512:215;22584:7;;;;72303:9;:40;;;-1:-1:-1;72330:13:0;;-1:-1:-1;;;;;72330:13:0;72316:10;:27;72303:40;72281:113;;;;-1:-1:-1;;;72281:113:0;;37039:2:1;72281:113:0;;;37021:21:1;37078:2;37058:18;;;37051:30;37117:25;37097:18;;;37090:53;37160:18;;72281:113:0;36837:347:1;72281:113:0;72674:45:::1;72701:4;72707:2;72711:7;72674:26;:45::i;12841:231::-:0;12919:7;12940:17;12959:18;12981:27;12992:4;12998:9;12981:10;:27::i;:::-;12939:69;;;;13019:18;13031:5;13019:11;:18::i;50420:321::-;50550:18;50556:2;50560:7;50550:5;:18::i;:::-;50601:54;50632:1;50636:2;50640:7;50649:5;50601:22;:54::i;:::-;50579:154;;;;-1:-1:-1;;;50579:154:0;;36189:2:1;50579:154:0;;;36171:21:1;36228:2;36208:18;;;36201:30;36267:34;36247:18;;;36240:62;36338:20;36318:18;;;36311:48;36376:19;;50579:154:0;35987:414:1;67414:109:0;67470:13;67503:12;67496:19;;;;;:::i;67179:227::-;67286:4;67393:1;67375:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;67365:32;;;;;;67344:1;67326:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;67316:32;;;;;;:81;;67308:90;;67179:227;;;;:::o;54441:799::-;54596:4;-1:-1:-1;;;;;54617:13:0;;25227:19;:23;54613:620;;54653:72;;;;;-1:-1:-1;;;;;54653:36:0;;;;;:72;;18717:10;;54704:4;;54710:7;;54719:5;;54653:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54653:72:0;;;;;;;;-1:-1:-1;;54653:72:0;;;;;;;;;;;;:::i;:::-;;;54649:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54895:6;:13;54912:1;54895:18;54891:272;;54938:60;;-1:-1:-1;;;54938:60:0;;36189:2:1;54938:60:0;;;36171:21:1;36228:2;36208:18;;;36201:30;36267:34;36247:18;;;36240:62;36338:20;36318:18;;;36311:48;36376:19;;54938:60:0;35987:414:1;54891:272:0;55113:6;55107:13;55098:6;55094:2;55090:15;55083:38;54649:529;54776:51;;54786:41;54776:51;;-1:-1:-1;54769:58:0;;54613:620;-1:-1:-1;55217:4:0;54441:799;;;;;;:::o;59142:589::-;-1:-1:-1;;;;;59348:18:0;;59344:187;;59383:40;59415:7;60558:10;:17;;60531:24;;;;:15;:24;;;;;:44;;;60586:24;;;;;;;;;;;;60454:164;59383:40;59344:187;;;59453:2;-1:-1:-1;;;;;59445:10:0;:4;-1:-1:-1;;;;;59445:10:0;;59441:90;;59472:47;59505:4;59511:7;59472:32;:47::i;:::-;-1:-1:-1;;;;;59545:16:0;;59541:183;;59578:45;59615:7;59578:36;:45::i;59541:183::-;59651:4;-1:-1:-1;;;;;59645:10:0;:2;-1:-1:-1;;;;;59645:10:0;;59641:83;;59672:40;59700:2;59704:7;59672:27;:40::i;10731:1308::-;10812:7;10821:12;11046:9;:16;11066:2;11046:22;11042:990;;11342:4;11327:20;;11321:27;11392:4;11377:20;;11371:27;11450:4;11435:20;;11429:27;11085:9;11421:36;11493:25;11504:4;11421:36;11321:27;11371;11493:10;:25::i;:::-;11486:32;;;;;;;;;11042:990;11540:9;:16;11560:2;11540:22;11536:496;;11815:4;11800:20;;11794:27;11866:4;11851:20;;11845:27;11908:23;11919:4;11794:27;11845;11908:10;:23::i;:::-;11901:30;;;;;;;;11536:496;-1:-1:-1;11980:1:0;;-1:-1:-1;11984:35:0;11536:496;10731:1308;;;;;:::o;9002:643::-;9080:20;9071:5;:29;;;;;;;;:::i;:::-;;9067:571;;9002:643;:::o;9067:571::-;9178:29;9169:5;:38;;;;;;;;:::i;:::-;;9165:473;;9224:34;;-1:-1:-1;;;9224:34:0;;39017:2:1;9224:34:0;;;38999:21:1;39056:2;39036:18;;;39029:30;39095:26;39075:18;;;39068:54;39139:18;;9224:34:0;38815:348:1;9165:473:0;9289:35;9280:5;:44;;;;;;;;:::i;:::-;;9276:362;;9341:41;;-1:-1:-1;;;9341:41:0;;39370:2:1;9341:41:0;;;39352:21:1;39409:2;39389:18;;;39382:30;39448:33;39428:18;;;39421:61;39499:18;;9341:41:0;39168:355:1;9276:362:0;9413:30;9404:5;:39;;;;;;;;:::i;:::-;;9400:238;;9460:44;;-1:-1:-1;;;9460:44:0;;39730:2:1;9460:44:0;;;39712:21:1;39769:2;39749:18;;;39742:30;39808:34;39788:18;;;39781:62;39879:4;39859:18;;;39852:32;39901:19;;9460:44:0;39528:398:1;9400:238:0;9535:30;9526:5;:39;;;;;;;;:::i;:::-;;9522:116;;9582:44;;-1:-1:-1;;;9582:44:0;;40133:2:1;9582:44:0;;;40115:21:1;40172:2;40152:18;;;40145:30;40211:34;40191:18;;;40184:62;40282:4;40262:18;;;40255:32;40304:19;;9582:44:0;39931:398:1;51077:439:0;-1:-1:-1;;;;;51157:16:0;;51149:61;;;;-1:-1:-1;;;51149:61:0;;40536:2:1;51149:61:0;;;40518:21:1;;;40555:18;;;40548:30;40614:34;40594:18;;;40587:62;40666:18;;51149:61:0;40334:356:1;51149:61:0;49164:4;49188:16;;;:7;:16;;;;;;-1:-1:-1;;;;;49188:16:0;:30;51221:58;;;;-1:-1:-1;;;51221:58:0;;40897:2:1;51221:58:0;;;40879:21:1;40936:2;40916:18;;;40909:30;40975;40955:18;;;40948:58;41023:18;;51221:58:0;40695:352:1;51221:58:0;51292:45;51321:1;51325:2;51329:7;51292:20;:45::i;:::-;-1:-1:-1;;;;;51350:13:0;;;;;;:9;:13;;;;;:18;;51367:1;;51350:13;:18;;51367:1;;51350:18;:::i;:::-;;;;-1:-1:-1;;51379:16:0;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;51379:21:0;;;;;;;;51418:33;;51379:16;;;51418:33;;51379:16;;51418:33;74663:21:::1;74561:131:::0;:::o;61245:988::-;61511:22;61561:1;61536:22;61553:4;61536:16;:22::i;:::-;:26;;;;:::i;:::-;61573:18;61594:26;;;:17;:26;;;;;;61511:51;;-1:-1:-1;61727:28:0;;;61723:328;;-1:-1:-1;;;;;61794:18:0;;61772:19;61794:18;;;:12;:18;;;;;;;;:34;;;;;;;;;61845:30;;;;;;:44;;;61962:30;;:17;:30;;;;;:43;;;61723:328;-1:-1:-1;62147:26:0;;;;:17;:26;;;;;;;;62140:33;;;-1:-1:-1;;;;;62191:18:0;;;;;:12;:18;;;;;:34;;;;;;;62184:41;61245:988::o;62528:1079::-;62806:10;:17;62781:22;;62806:21;;62826:1;;62806:21;:::i;:::-;62838:18;62859:24;;;:15;:24;;;;;;63232:10;:26;;62781:46;;-1:-1:-1;62859:24:0;;62781:46;;63232:26;;;;;;:::i;:::-;;;;;;;;;63210:48;;63296:11;63271:10;63282;63271:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;63376:28;;;:15;:28;;;;;;;:41;;;63548:24;;;;;63541:31;63583:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;62599:1008;;;62528:1079;:::o;60032:221::-;60117:14;60134:20;60151:2;60134:16;:20::i;:::-;-1:-1:-1;;;;;60165:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;60210:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;60032:221:0:o;14293:1632::-;14424:7;;15358:66;15345:79;;15341:163;;;-1:-1:-1;15457:1:0;;-1:-1:-1;15461:30:0;15441:51;;15341:163;15518:1;:7;;15523:2;15518:7;;:18;;;;;15529:1;:7;;15534:2;15529:7;;15518:18;15514:102;;;-1:-1:-1;15569:1:0;;-1:-1:-1;15573:30:0;15553:51;;15514:102;15730:24;;;15713:14;15730:24;;;;;;;;;41468:25:1;;;41541:4;41529:17;;41509:18;;;41502:45;;;;41563:18;;;41556:34;;;41606:18;;;41599:34;;;15730:24:0;;41440:19:1;;15730:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15730:24:0;;-1:-1:-1;;15730:24:0;;;-1:-1:-1;;;;;;;15769:20:0;;15765:103;;15822:1;15826:29;15806:50;;;;;;;15765:103;15888:6;-1:-1:-1;15896:20:0;;-1:-1:-1;14293:1632:0;;;;;;;;:::o;13335:344::-;13449:7;;13508:66;13495:80;;13449:7;13602:25;13618:3;13603:18;;;13625:2;13602:25;:::i;:::-;13586:42;;13646:25;13657:4;13663:1;13666;13669;13646:10;:25::i;:::-;13639:32;;;;;;13335:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;14:177:1:-;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;:::-;430:5;196:245;-1:-1:-1;;;196:245:1:o;638:196::-;706:20;;-1:-1:-1;;;;;755:54:1;;745:65;;735:93;;824:1;821;814:12;839:186;898:6;951:2;939:9;930:7;926:23;922:32;919:52;;;967:1;964;957:12;919:52;990:29;1009:9;990:29;:::i;1030:258::-;1102:1;1112:113;1126:6;1123:1;1120:13;1112:113;;;1202:11;;;1196:18;1183:11;;;1176:39;1148:2;1141:10;1112:113;;;1243:6;1240:1;1237:13;1234:48;;;-1:-1:-1;;1278:1:1;1260:16;;1253:27;1030:258::o;1293:317::-;1335:3;1373:5;1367:12;1400:6;1395:3;1388:19;1416:63;1472:6;1465:4;1460:3;1456:14;1449:4;1442:5;1438:16;1416:63;:::i;:::-;1524:2;1512:15;-1:-1:-1;;1508:88:1;1499:98;;;;1599:4;1495:109;;1293:317;-1:-1:-1;;1293:317:1:o;1615:220::-;1764:2;1753:9;1746:21;1727:4;1784:45;1825:2;1814:9;1810:18;1802:6;1784:45;:::i;1840:180::-;1899:6;1952:2;1940:9;1931:7;1927:23;1923:32;1920:52;;;1968:1;1965;1958:12;1920:52;-1:-1:-1;1991:23:1;;1840:180;-1:-1:-1;1840:180:1:o;2256:254::-;2324:6;2332;2385:2;2373:9;2364:7;2360:23;2356:32;2353:52;;;2401:1;2398;2391:12;2353:52;2424:29;2443:9;2424:29;:::i;:::-;2414:39;2500:2;2485:18;;;;2472:32;;-1:-1:-1;;;2256:254:1:o;2697:328::-;2774:6;2782;2790;2843:2;2831:9;2822:7;2818:23;2814:32;2811:52;;;2859:1;2856;2849:12;2811:52;2882:29;2901:9;2882:29;:::i;:::-;2872:39;;2930:38;2964:2;2953:9;2949:18;2930:38;:::i;:::-;2920:48;;3015:2;3004:9;3000:18;2987:32;2977:42;;2697:328;;;;;:::o;3030:632::-;3201:2;3253:21;;;3323:13;;3226:18;;;3345:22;;;3172:4;;3201:2;3424:15;;;;3398:2;3383:18;;;3172:4;3467:169;3481:6;3478:1;3475:13;3467:169;;;3542:13;;3530:26;;3611:15;;;;3576:12;;;;3503:1;3496:9;3467:169;;;-1:-1:-1;3653:3:1;;3030:632;-1:-1:-1;;;;;;3030:632:1:o;3667:347::-;3718:8;3728:6;3782:3;3775:4;3767:6;3763:17;3759:27;3749:55;;3800:1;3797;3790:12;3749:55;-1:-1:-1;3823:20:1;;3866:18;3855:30;;3852:50;;;3898:1;3895;3888:12;3852:50;3935:4;3927:6;3923:17;3911:29;;3987:3;3980:4;3971:6;3963;3959:19;3955:30;3952:39;3949:59;;;4004:1;4001;3994:12;4019:614;4116:6;4124;4132;4140;4148;4201:3;4189:9;4180:7;4176:23;4172:33;4169:53;;;4218:1;4215;4208:12;4169:53;4254:9;4241:23;4231:33;;4315:2;4304:9;4300:18;4287:32;4342:18;4334:6;4331:30;4328:50;;;4374:1;4371;4364:12;4328:50;4413:58;4463:7;4454:6;4443:9;4439:22;4413:58;:::i;:::-;4019:614;;4490:8;;-1:-1:-1;4387:84:1;;4572:2;4557:18;;4544:32;;4623:2;4608:18;;;4595:32;;-1:-1:-1;4019:614:1;-1:-1:-1;;;;4019:614:1:o;4638:160::-;4703:20;;4759:13;;4752:21;4742:32;;4732:60;;4788:1;4785;4778:12;4803:180;4859:6;4912:2;4900:9;4891:7;4887:23;4883:32;4880:52;;;4928:1;4925;4918:12;4880:52;4951:26;4967:9;4951:26;:::i;4988:410::-;5059:6;5067;5120:2;5108:9;5099:7;5095:23;5091:32;5088:52;;;5136:1;5133;5126:12;5088:52;5176:9;5163:23;5209:18;5201:6;5198:30;5195:50;;;5241:1;5238;5231:12;5195:50;5280:58;5330:7;5321:6;5310:9;5306:22;5280:58;:::i;:::-;5357:8;;5254:84;;-1:-1:-1;4988:410:1;-1:-1:-1;;;;4988:410:1:o;5403:184::-;5455:77;5452:1;5445:88;5552:4;5549:1;5542:15;5576:4;5573:1;5566:15;5592:334;5663:2;5657:9;5719:2;5709:13;;-1:-1:-1;;5705:86:1;5693:99;;5822:18;5807:34;;5843:22;;;5804:62;5801:88;;;5869:18;;:::i;:::-;5905:2;5898:22;5592:334;;-1:-1:-1;5592:334:1:o;5931:466::-;5996:5;6030:18;6022:6;6019:30;6016:56;;;6052:18;;:::i;:::-;6090:116;6200:4;-1:-1:-1;;6126:2:1;6118:6;6114:15;6110:88;6106:99;6090:116;:::i;:::-;6081:125;;6229:6;6222:5;6215:21;6269:3;6260:6;6255:3;6251:16;6248:25;6245:45;;;6286:1;6283;6276:12;6245:45;6335:6;6330:3;6323:4;6316:5;6312:16;6299:43;6389:1;6382:4;6373:6;6366:5;6362:18;6358:29;6351:40;5931:466;;;;;:::o;6402:1372::-;6496:6;6527:2;6570;6558:9;6549:7;6545:23;6541:32;6538:52;;;6586:1;6583;6576:12;6538:52;6626:9;6613:23;6655:18;6696:2;6688:6;6685:14;6682:34;;;6712:1;6709;6702:12;6682:34;6750:6;6739:9;6735:22;6725:32;;6795:7;6788:4;6784:2;6780:13;6776:27;6766:55;;6817:1;6814;6807:12;6766:55;6853:2;6840:16;6875:2;6871;6868:10;6865:36;;;6881:18;;:::i;:::-;6927:2;6924:1;6920:10;6950:28;6974:2;6970;6966:11;6950:28;:::i;:::-;7012:15;;;7082:11;;;7078:20;;;7043:12;;;;7110:19;;;7107:39;;;7142:1;7139;7132:12;7107:39;7174:2;7170;7166:11;7155:22;;7186:558;7202:6;7197:3;7194:15;7186:558;;;7288:3;7275:17;7324:2;7311:11;7308:19;7305:109;;;7368:1;7397:2;7393;7386:14;7305:109;7437:20;;7492:2;7484:11;;7480:25;-1:-1:-1;7470:123:1;;7547:1;7576:2;7572;7565:14;7470:123;7618:83;7693:7;7687:2;7683;7679:11;7666:25;7661:2;7657;7653:11;7618:83;:::i;:::-;7606:96;;-1:-1:-1;7219:12:1;;;;7722;;;;7186:558;;;7763:5;6402:1372;-1:-1:-1;;;;;;;;;6402:1372:1:o;7779:367::-;7842:8;7852:6;7906:3;7899:4;7891:6;7887:17;7883:27;7873:55;;7924:1;7921;7914:12;7873:55;-1:-1:-1;7947:20:1;;7990:18;7979:30;;7976:50;;;8022:1;8019;8012:12;7976:50;8059:4;8051:6;8047:17;8035:29;;8119:3;8112:4;8102:6;8099:1;8095:14;8087:6;8083:27;8079:38;8076:47;8073:67;;;8136:1;8133;8126:12;8151:573;8255:6;8263;8271;8279;8332:2;8320:9;8311:7;8307:23;8303:32;8300:52;;;8348:1;8345;8338:12;8300:52;8384:9;8371:23;8361:33;;8441:2;8430:9;8426:18;8413:32;8403:42;;8496:2;8485:9;8481:18;8468:32;8523:18;8515:6;8512:30;8509:50;;;8555:1;8552;8545:12;8509:50;8594:70;8656:7;8647:6;8636:9;8632:22;8594:70;:::i;:::-;8151:573;;;;-1:-1:-1;8683:8:1;-1:-1:-1;;;;8151:573:1:o;8729:449::-;8827:6;8835;8888:2;8876:9;8867:7;8863:23;8859:32;8856:52;;;8904:1;8901;8894:12;8856:52;8944:9;8931:23;8977:18;8969:6;8966:30;8963:50;;;9009:1;9006;8999:12;8963:50;9048:70;9110:7;9101:6;9090:9;9086:22;9048:70;:::i;9183:477::-;9262:6;9270;9278;9331:2;9319:9;9310:7;9306:23;9302:32;9299:52;;;9347:1;9344;9337:12;9299:52;9383:9;9370:23;9360:33;;9444:2;9433:9;9429:18;9416:32;9471:18;9463:6;9460:30;9457:50;;;9503:1;9500;9493:12;9457:50;9542:58;9592:7;9583:6;9572:9;9568:22;9542:58;:::i;:::-;9183:477;;9619:8;;-1:-1:-1;9516:84:1;;-1:-1:-1;;;;9183:477:1:o;9665:254::-;9730:6;9738;9791:2;9779:9;9770:7;9766:23;9762:32;9759:52;;;9807:1;9804;9797:12;9759:52;9830:29;9849:9;9830:29;:::i;:::-;9820:39;;9878:35;9909:2;9898:9;9894:18;9878:35;:::i;:::-;9868:45;;9665:254;;;;;:::o;9924:963::-;10069:6;10077;10085;10093;10101;10109;10117;10170:3;10158:9;10149:7;10145:23;10141:33;10138:53;;;10187:1;10184;10177:12;10138:53;10223:9;10210:23;10200:33;;10284:2;10273:9;10269:18;10256:32;10307:18;10348:2;10340:6;10337:14;10334:34;;;10364:1;10361;10354:12;10334:34;10403:58;10453:7;10444:6;10433:9;10429:22;10403:58;:::i;:::-;10480:8;;-1:-1:-1;10377:84:1;-1:-1:-1;10562:2:1;10547:18;;10534:32;;-1:-1:-1;10613:2:1;10598:18;;10585:32;;-1:-1:-1;10670:3:1;10655:19;;10642:33;;-1:-1:-1;10687:16:1;;;10684:36;;;10716:1;10713;10706:12;10684:36;;10755:72;10819:7;10808:8;10797:9;10793:24;10755:72;:::i;:::-;9924:963;;;;-1:-1:-1;9924:963:1;;-1:-1:-1;9924:963:1;;;;10729:98;;-1:-1:-1;;;9924:963:1:o;10892:667::-;10987:6;10995;11003;11011;11064:3;11052:9;11043:7;11039:23;11035:33;11032:53;;;11081:1;11078;11071:12;11032:53;11104:29;11123:9;11104:29;:::i;:::-;11094:39;;11152:38;11186:2;11175:9;11171:18;11152:38;:::i;:::-;11142:48;;11237:2;11226:9;11222:18;11209:32;11199:42;;11292:2;11281:9;11277:18;11264:32;11319:18;11311:6;11308:30;11305:50;;;11351:1;11348;11341:12;11305:50;11374:22;;11427:4;11419:13;;11415:27;-1:-1:-1;11405:55:1;;11456:1;11453;11446:12;11405:55;11479:74;11545:7;11540:2;11527:16;11522:2;11518;11514:11;11479:74;:::i;:::-;11469:84;;;10892:667;;;;;;;:::o;11564:505::-;11659:6;11667;11675;11728:2;11716:9;11707:7;11703:23;11699:32;11696:52;;;11744:1;11741;11734:12;11696:52;11784:9;11771:23;11817:18;11809:6;11806:30;11803:50;;;11849:1;11846;11839:12;11803:50;11888:70;11950:7;11941:6;11930:9;11926:22;11888:70;:::i;:::-;11977:8;;11862:96;;-1:-1:-1;12059:2:1;12044:18;;;;12031:32;;11564:505;-1:-1:-1;;;;11564:505:1:o;12074:784::-;12207:6;12215;12223;12231;12284:2;12272:9;12263:7;12259:23;12255:32;12252:52;;;12300:1;12297;12290:12;12252:52;12340:9;12327:23;12369:18;12410:2;12402:6;12399:14;12396:34;;;12426:1;12423;12416:12;12396:34;12465:70;12527:7;12518:6;12507:9;12503:22;12465:70;:::i;:::-;12554:8;;-1:-1:-1;12439:96:1;-1:-1:-1;12642:2:1;12627:18;;12614:32;;-1:-1:-1;12658:16:1;;;12655:36;;;12687:1;12684;12677:12;12655:36;;12726:72;12790:7;12779:8;12768:9;12764:24;12726:72;:::i;12863:260::-;12931:6;12939;12992:2;12980:9;12971:7;12967:23;12963:32;12960:52;;;13008:1;13005;12998:12;12960:52;13031:29;13050:9;13031:29;:::i;:::-;13021:39;;13079:38;13113:2;13102:9;13098:18;13079:38;:::i;13489:437::-;13568:1;13564:12;;;;13611;;;13632:61;;13686:4;13678:6;13674:17;13664:27;;13632:61;13739:2;13731:6;13728:14;13708:18;13705:38;13702:218;;13776:77;13773:1;13766:88;13877:4;13874:1;13867:15;13905:4;13902:1;13895:15;13702:218;;13489:437;;;:::o;16704:184::-;16756:77;16753:1;16746:88;16853:4;16850:1;16843:15;16877:4;16874:1;16867:15;16893:184;16945:77;16942:1;16935:88;17042:4;17039:1;17032:15;17066:4;17063:1;17056:15;17082:195;17121:3;17152:66;17145:5;17142:77;17139:103;;17222:18;;:::i;:::-;-1:-1:-1;17269:1:1;17258:13;;17082:195::o;17629:128::-;17669:3;17700:1;17696:6;17693:1;17690:13;17687:39;;;17706:18;;:::i;:::-;-1:-1:-1;17742:9:1;;17629:128::o;21103:125::-;21143:4;21171:1;21168;21165:8;21162:34;;;21176:18;;:::i;:::-;-1:-1:-1;21213:9:1;;21103:125::o;21991:581::-;22069:4;22075:6;22135:11;22122:25;22225:66;22214:8;22198:14;22194:29;22190:102;22170:18;22166:127;22156:155;;22307:1;22304;22297:12;22156:155;22334:33;;22386:20;;;-1:-1:-1;22429:18:1;22418:30;;22415:50;;;22461:1;22458;22451:12;22415:50;22494:4;22482:17;;-1:-1:-1;22525:14:1;22521:27;;;22511:38;;22508:58;;;22562:1;22559;22552:12;23742:228;23782:7;23908:1;23840:66;23836:74;23833:1;23830:81;23825:1;23818:9;23811:17;23807:105;23804:131;;;23915:18;;:::i;:::-;-1:-1:-1;23955:9:1;;23742:228::o;25454:1088::-;25539:12;;25504:3;;25594:1;25614:18;;;;25667;;;;25694:61;;25748:4;25740:6;25736:17;25726:27;;25694:61;25774:2;25822;25814:6;25811:14;25791:18;25788:38;25785:218;;25859:77;25856:1;25849:88;25960:4;25957:1;25950:15;25988:4;25985:1;25978:15;25785:218;26019:18;26046:162;;;;26222:1;26217:319;;;;26012:524;;26046:162;-1:-1:-1;;26083:9:1;26079:82;26074:3;26067:95;26191:6;26186:3;26182:16;26175:23;;26046:162;;26217:319;25401:1;25394:14;;;25438:4;25425:18;;26311:1;26325:165;26339:6;26336:1;26333:13;26325:165;;;26417:14;;26404:11;;;26397:35;26460:16;;;;26354:10;;26325:165;;;26329:3;;26519:6;26514:3;26510:16;26503:23;;26012:524;;;;;;;25454:1088;;;;:::o;26547:376::-;26723:3;26751:38;26785:3;26777:6;26751:38;:::i;:::-;26818:6;26812:13;26834:52;26879:6;26875:2;26868:4;26860:6;26856:17;26834:52;:::i;:::-;26902:15;;26547:376;-1:-1:-1;;;;26547:376:1:o;26928:637::-;27208:3;27246:6;27240:13;27262:53;27308:6;27303:3;27296:4;27288:6;27284:17;27262:53;:::i;:::-;27378:13;;27337:16;;;;27400:57;27378:13;27337:16;27434:4;27422:17;;27400:57;:::i;:::-;27522:7;27479:20;;27508:22;;;27557:1;27546:13;;26928:637;-1:-1:-1;;;;26928:637:1:o;29503:456::-;29724:3;29752:38;29786:3;29778:6;29752:38;:::i;:::-;29819:6;29813:13;29835:52;29880:6;29876:2;29869:4;29861:6;29857:17;29835:52;:::i;:::-;29903:50;29945:6;29941:2;29937:15;29929:6;29903:50;:::i;:::-;29896:57;29503:456;-1:-1:-1;;;;;;;29503:456:1:o;31000:636::-;31280:3;31318:6;31312:13;31334:53;31380:6;31375:3;31368:4;31360:6;31356:17;31334:53;:::i;:::-;31450:13;;31409:16;;;;31472:57;31450:13;31409:16;31506:4;31494:17;;31472:57;:::i;:::-;31594:6;31551:20;;31580:21;;;31628:1;31617:13;;31000:636;-1:-1:-1;;;;31000:636:1:o;31641:621::-;31910:3;31948:6;31942:13;31964:53;32010:6;32005:3;31998:4;31990:6;31986:17;31964:53;:::i;:::-;32036:86;32070:51;32113:6;32108:3;32104:16;32096:6;32070:51;:::i;:::-;32062:6;32036:86;:::i;:::-;32026:96;;32153:6;32147:13;32169:54;32214:8;32210:2;32203:4;32195:6;32191:17;32169:54;:::i;:::-;32239:17;;31641:621;-1:-1:-1;;;;;;31641:621:1:o;32267:277::-;32440:3;32465:73;32499:38;32533:3;32525:6;32499:38;:::i;:::-;32491:6;32465:73;:::i;32549:541::-;32773:3;32811:6;32805:13;32827:53;32873:6;32868:3;32861:4;32853:6;32849:17;32827:53;:::i;:::-;32899:51;32942:6;32937:3;32933:16;32925:6;32899:51;:::i;:::-;32889:61;;32981:6;32975:13;32997:54;33042:8;33038:2;33031:4;33023:6;33019:17;32997:54;:::i;:::-;33067:17;;32549:541;-1:-1:-1;;;;;32549:541:1:o;33095:536::-;33361:3;33389:73;33423:38;33457:3;33449:6;33423:38;:::i;33389:73::-;33491:6;33485:13;33507:52;33552:6;33548:2;33541:4;33533:6;33529:17;33507:52;:::i;:::-;33575:50;33617:6;33613:2;33609:15;33601:6;33575:50;:::i;:::-;33568:57;33095:536;-1:-1:-1;;;;;;;;33095:536:1:o;33636:658::-;33857:3;33895:6;33889:13;33911:53;33957:6;33952:3;33945:4;33937:6;33933:17;33911:53;:::i;:::-;34027:13;;33986:16;;;;34049:57;34027:13;33986:16;34083:4;34071:17;;34049:57;:::i;:::-;34173:13;;34128:20;;;34195:57;34173:13;34128:20;34229:4;34217:17;;34195:57;:::i;34299:646::-;34564:3;34592:38;34626:3;34618:6;34592:38;:::i;:::-;34659:6;34653:13;34675:52;34720:6;34716:2;34709:4;34701:6;34697:17;34675:52;:::i;:::-;34789:13;;34749:15;;;34811:57;34789:13;34749:15;34845:4;34833:17;;34811:57;:::i;36406:184::-;36458:77;36455:1;36448:88;36555:4;36552:1;36545:15;36579:4;36576:1;36569:15;36595:120;36635:1;36661;36651:35;;36666:18;;:::i;:::-;-1:-1:-1;36700:9:1;;36595:120::o;36720:112::-;36752:1;36778;36768:35;;36783:18;;:::i;:::-;-1:-1:-1;36817:9:1;;36720:112::o;37574:276::-;37705:3;37743:6;37737:13;37759:53;37805:6;37800:3;37793:4;37785:6;37781:17;37759:53;:::i;:::-;37828:16;;;;;37574:276;-1:-1:-1;;37574:276:1:o;37855:512::-;38049:4;-1:-1:-1;;;;;38159:2:1;38151:6;38147:15;38136:9;38129:34;38211:2;38203:6;38199:15;38194:2;38183:9;38179:18;38172:43;;38251:6;38246:2;38235:9;38231:18;38224:34;38294:3;38289:2;38278:9;38274:18;38267:31;38315:46;38356:3;38345:9;38341:19;38333:6;38315:46;:::i;:::-;38307:54;37855:512;-1:-1:-1;;;;;;37855:512:1:o;38372:249::-;38441:6;38494:2;38482:9;38473:7;38469:23;38465:32;38462:52;;;38510:1;38507;38500:12;38462:52;38542:9;38536:16;38561:30;38585:5;38561:30;:::i;38626:184::-;38678:77;38675:1;38668:88;38775:4;38772:1;38765:15;38799:4;38796:1;38789:15;41052:184;41104:77;41101:1;41094:88;41201:4;41198:1;41191:15;41225:4;41222:1;41215:15

Swarm Source

ipfs://5a2a420a628f6fa540fafb658c63e49f670c7059b5f741fe44910dd37517e637
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.