Token NFT

 

Overview ERC-721

Total Supply:
3 NFT

Holders:
2 addresses

Transfers:
-

 
Loading
[ Download CSV Export  ] 
Loading
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
NFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// 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 (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.7.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
                /// @solidity memory-safe-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 (last updated v4.6.0) (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 `IERC721Receiver.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 (last updated v4.7.0) (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`.
     *
     * 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;

    /**
     * @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 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

// 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.7.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: address zero is not a valid owner");
        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: invalid token ID");
        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) {
        _requireMinted(tokenId);

        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 overridden 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 token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        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: caller is not token 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: caller is not token 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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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 an {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 an {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 Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    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/m00se.sol



pragma solidity >=0.7.0 <0.9.0;




contract NFT is ERC721Enumerable, Ownable {
    using Strings for uint256;
    string public baseURI;
    string public baseExtension = ".json";
    string public notRevealedUri;
    uint256 public cost = 0 ether;
    uint256 public whiteListCost = 0 ether;
    uint256 public maxSupply = 10000;
    uint256 public maxMintAmount = 20;
    uint256 public nftPerAddressLimit = 3;
    bool public paused = false;
    bool public revealed = false;

    mapping(address => uint256) public addressMintedBalance;

    
    bytes32 public whitelistMerkleRoot;



    constructor(
        string memory _name,
        string memory _symbol,
        string memory _initBaseURI,
        string memory _initNotRevealedUri
    ) ERC721(_name, _symbol) {
        setBaseURI(_initBaseURI);
        setNotRevealedURI(_initNotRevealedUri);
    }

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

   
    function mint(uint256 _mintAmount) public payable {
        require(!paused, "the contract is paused");
        uint256 supply = totalSupply();
        require(_mintAmount > 0, "need to mint at least 1 NFT");
        require(
            _mintAmount <= maxMintAmount,
            "max mint amount per session exceeded"
        );
        require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded");

        if (msg.sender != owner()) {
            require(msg.value >= cost * _mintAmount, "insufficient funds");
        }

        for (uint256 i = 1; i <= _mintAmount; i++) {
            addressMintedBalance[msg.sender]++;
            _safeMint(msg.sender, supply + i);
        }
    }

    
    modifier isValidMerkleProof(bytes32[] calldata merkleProof, bytes32 root) {
        require(
            MerkleProof.verify(
                merkleProof,
                root,
                keccak256(abi.encodePacked(msg.sender))
            ),
            "Address does not exist in list"
        );
        _;
    }

    modifier isCorrectPayment(uint256 price, uint256 numberOfTokens) {
        require(
            price * numberOfTokens == msg.value,
            "Incorrect ETH value sent"
        );
        _;
    }

    function mintWhitelist(bytes32[] calldata merkleProof)
        public
        payable
        isValidMerkleProof(merkleProof, whitelistMerkleRoot)
        isCorrectPayment(whiteListCost, 1)
    {
        uint256 supply = totalSupply();
        require(supply + 1 <= maxSupply, "max NFT limit exceeded");
        _safeMint(msg.sender, supply + 1);
    }

    function setWhitelistMerkleRoot(bytes32 merkleRoot) external onlyOwner {
        whitelistMerkleRoot = merkleRoot;
    }

    //////////////////////////////////////

    function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

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

        if (revealed == false) {
            return notRevealedUri;
        }

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

    //only owner
    function reveal() public onlyOwner {
        revealed = true;
    }

    function setNftPerAddressLimit(uint256 _limit) public onlyOwner {
        nftPerAddressLimit = _limit;
    }

    function setCost(uint256 _newCost) public onlyOwner {
        cost = _newCost;
    }

    function setWhitelistCost(uint256 _newCost) public onlyOwner {
        whiteListCost = _newCost;
    }

    function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
        maxMintAmount = _newmaxMintAmount;
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function setBaseExtension(string memory _newBaseExtension)
        public
        onlyOwner
    {
        baseExtension = _newBaseExtension;
    }

    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }

    function pause(bool _state) public onlyOwner {
        paused = _state;
    }

    function withdraw() public payable onlyOwner {
        (bool os, ) = payable(owner()).call{value: address(this).balance}("");
        require(os);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"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":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"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","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":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","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":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","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":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setWhitelistCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","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":[{"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":[],"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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c90805190602001906200005192919062000338565b506000600e556000600f55612710601055601460115560036012556000601360006101000a81548160ff0219169083151502179055506000601360016101000a81548160ff021916908315150217905550348015620000af57600080fd5b5060405162005112380380620051128339818101604052810190620000d5919062000466565b83838160009080519060200190620000ef92919062000338565b5080600190805190602001906200010892919062000338565b5050506200012b6200011f6200015760201b60201c565b6200015f60201b60201c565b6200013c826200022560201b60201c565b6200014d816200025160201b60201c565b505050506200075b565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002356200027d60201b60201c565b80600b90805190602001906200024d92919062000338565b5050565b620002616200027d60201b60201c565b80600d90805190602001906200027992919062000338565b5050565b6200028d6200015760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002b36200030e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200030c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000303906200057b565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003469062000643565b90600052602060002090601f0160209004810192826200036a5760008555620003b6565b82601f106200038557805160ff1916838001178555620003b6565b82800160010185558215620003b6579182015b82811115620003b557825182559160200191906001019062000398565b5b509050620003c59190620003c9565b5090565b5b80821115620003e4576000816000905550600101620003ca565b5090565b6000620003ff620003f984620005c6565b6200059d565b9050828152602081018484840111156200041e576200041d62000712565b5b6200042b8482856200060d565b509392505050565b600082601f8301126200044b576200044a6200070d565b5b81516200045d848260208601620003e8565b91505092915050565b600080600080608085870312156200048357620004826200071c565b5b600085015167ffffffffffffffff811115620004a457620004a362000717565b5b620004b28782880162000433565b945050602085015167ffffffffffffffff811115620004d657620004d562000717565b5b620004e48782880162000433565b935050604085015167ffffffffffffffff81111562000508576200050762000717565b5b620005168782880162000433565b925050606085015167ffffffffffffffff8111156200053a576200053962000717565b5b620005488782880162000433565b91505092959194509250565b600062000563602083620005fc565b9150620005708262000732565b602082019050919050565b60006020820190508181036000830152620005968162000554565b9050919050565b6000620005a9620005bc565b9050620005b7828262000679565b919050565b6000604051905090565b600067ffffffffffffffff821115620005e457620005e3620006de565b5b620005ef8262000721565b9050602081019050919050565b600082825260208201905092915050565b60005b838110156200062d57808201518184015260208101905062000610565b838111156200063d576000848401525b50505050565b600060028204905060018216806200065c57607f821691505b60208210811415620006735762000672620006af565b5b50919050565b620006848262000721565b810181811067ffffffffffffffff82111715620006a657620006a5620006de565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6149a7806200076b6000396000f3fe6080604052600436106102725760003560e01c80636c0360eb1161014f578063b88d4fde116100c1578063d49479eb1161007a578063d49479eb14610929578063d5abeb0114610952578063da3ef23f1461097d578063e985e9c5146109a6578063f2c4ce1e146109e3578063f2fde38b14610a0c57610272565b8063b88d4fde1461081b578063ba7d2c7614610844578063bd32fb661461086f578063c668286214610898578063c87b56dd146108c3578063d0eb26b01461090057610272565b80639257e044116101135780639257e0441461073e57806395d89b4114610769578063a0712d6814610794578063a22cb465146107b0578063a475b5dd146107d9578063aa98e0c6146107f057610272565b80636c0360eb1461066b57806370a0823114610696578063715018a6146106d35780637f00c7a6146106ea5780638da5cb5b1461071357610272565b80632f745c59116101e857806344d84381116101ac57806344d84381146105565780634f6ccce71461057257806351830227146105af57806355f804b3146105da5780635c975abb146106035780636352211e1461062e57610272565b80632f745c59146104805780633ccfd60b146104bd57806342842e0e146104c7578063438b6300146104f057806344a0d68a1461052d57610272565b8063095ea7b31161023a578063095ea7b31461037057806313faede61461039957806318160ddd146103c457806318cae269146103ef578063239c70ae1461042c57806323b872dd1461045757610272565b806301ffc9a71461027757806302329a29146102b457806306fdde03146102dd578063081812fc14610308578063081c8c4414610345575b600080fd5b34801561028357600080fd5b5061029e600480360381019061029991906133e6565b610a35565b6040516102ab9190613ae2565b60405180910390f35b3480156102c057600080fd5b506102db60048036038101906102d6919061338c565b610aaf565b005b3480156102e957600080fd5b506102f2610ad4565b6040516102ff9190613b18565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a9190613489565b610b66565b60405161033c9190613a59565b60405180910390f35b34801561035157600080fd5b5061035a610bac565b6040516103679190613b18565b60405180910390f35b34801561037c57600080fd5b50610397600480360381019061039291906132ff565b610c3a565b005b3480156103a557600080fd5b506103ae610d52565b6040516103bb9190613e1a565b60405180910390f35b3480156103d057600080fd5b506103d9610d58565b6040516103e69190613e1a565b60405180910390f35b3480156103fb57600080fd5b506104166004803603810190610411919061317c565b610d65565b6040516104239190613e1a565b60405180910390f35b34801561043857600080fd5b50610441610d7d565b60405161044e9190613e1a565b60405180910390f35b34801561046357600080fd5b5061047e600480360381019061047991906131e9565b610d83565b005b34801561048c57600080fd5b506104a760048036038101906104a291906132ff565b610de3565b6040516104b49190613e1a565b60405180910390f35b6104c5610e88565b005b3480156104d357600080fd5b506104ee60048036038101906104e991906131e9565b610f10565b005b3480156104fc57600080fd5b506105176004803603810190610512919061317c565b610f30565b6040516105249190613ac0565b60405180910390f35b34801561053957600080fd5b50610554600480360381019061054f9190613489565b610fde565b005b610570600480360381019061056b919061333f565b610ff0565b005b34801561057e57600080fd5b5061059960048036038101906105949190613489565b611175565b6040516105a69190613e1a565b60405180910390f35b3480156105bb57600080fd5b506105c46111e6565b6040516105d19190613ae2565b60405180910390f35b3480156105e657600080fd5b5061060160048036038101906105fc9190613440565b6111f9565b005b34801561060f57600080fd5b5061061861121b565b6040516106259190613ae2565b60405180910390f35b34801561063a57600080fd5b5061065560048036038101906106509190613489565b61122e565b6040516106629190613a59565b60405180910390f35b34801561067757600080fd5b506106806112e0565b60405161068d9190613b18565b60405180910390f35b3480156106a257600080fd5b506106bd60048036038101906106b8919061317c565b61136e565b6040516106ca9190613e1a565b60405180910390f35b3480156106df57600080fd5b506106e8611426565b005b3480156106f657600080fd5b50610711600480360381019061070c9190613489565b61143a565b005b34801561071f57600080fd5b5061072861144c565b6040516107359190613a59565b60405180910390f35b34801561074a57600080fd5b50610753611476565b6040516107609190613e1a565b60405180910390f35b34801561077557600080fd5b5061077e61147c565b60405161078b9190613b18565b60405180910390f35b6107ae60048036038101906107a99190613489565b61150e565b005b3480156107bc57600080fd5b506107d760048036038101906107d291906132bf565b61175d565b005b3480156107e557600080fd5b506107ee611773565b005b3480156107fc57600080fd5b50610805611798565b6040516108129190613afd565b60405180910390f35b34801561082757600080fd5b50610842600480360381019061083d919061323c565b61179e565b005b34801561085057600080fd5b50610859611800565b6040516108669190613e1a565b60405180910390f35b34801561087b57600080fd5b50610896600480360381019061089191906133b9565b611806565b005b3480156108a457600080fd5b506108ad611818565b6040516108ba9190613b18565b60405180910390f35b3480156108cf57600080fd5b506108ea60048036038101906108e59190613489565b6118a6565b6040516108f79190613b18565b60405180910390f35b34801561090c57600080fd5b5061092760048036038101906109229190613489565b6119ff565b005b34801561093557600080fd5b50610950600480360381019061094b9190613489565b611a11565b005b34801561095e57600080fd5b50610967611a23565b6040516109749190613e1a565b60405180910390f35b34801561098957600080fd5b506109a4600480360381019061099f9190613440565b611a29565b005b3480156109b257600080fd5b506109cd60048036038101906109c891906131a9565b611a4b565b6040516109da9190613ae2565b60405180910390f35b3480156109ef57600080fd5b50610a0a6004803603810190610a059190613440565b611adf565b005b348015610a1857600080fd5b50610a336004803603810190610a2e919061317c565b611b01565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aa85750610aa782611b85565b5b9050919050565b610ab7611c67565b80601360006101000a81548160ff02191690831515021790555050565b606060008054610ae39061412d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0f9061412d565b8015610b5c5780601f10610b3157610100808354040283529160200191610b5c565b820191906000526020600020905b815481529060010190602001808311610b3f57829003601f168201915b5050505050905090565b6000610b7182611ce5565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600d8054610bb99061412d565b80601f0160208091040260200160405190810160405280929190818152602001828054610be59061412d565b8015610c325780601f10610c0757610100808354040283529160200191610c32565b820191906000526020600020905b815481529060010190602001808311610c1557829003601f168201915b505050505081565b6000610c458261122e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cad90613d5a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cd5611d30565b73ffffffffffffffffffffffffffffffffffffffff161480610d045750610d0381610cfe611d30565b611a4b565b5b610d43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3a90613c9a565b60405180910390fd5b610d4d8383611d38565b505050565b600e5481565b6000600880549050905090565b60146020528060005260406000206000915090505481565b60115481565b610d94610d8e611d30565b82611df1565b610dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dca90613dda565b60405180910390fd5b610dde838383611e86565b505050565b6000610dee8361136e565b8210610e2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2690613b3a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e90611c67565b6000610e9a61144c565b73ffffffffffffffffffffffffffffffffffffffff1647604051610ebd90613a44565b60006040518083038185875af1925050503d8060008114610efa576040519150601f19603f3d011682016040523d82523d6000602084013e610eff565b606091505b5050905080610f0d57600080fd5b50565b610f2b8383836040518060200160405280600081525061179e565b505050565b60606000610f3d8361136e565b905060008167ffffffffffffffff811115610f5b57610f5a614319565b5b604051908082528060200260200182016040528015610f895781602001602082028036833780820191505090505b50905060005b82811015610fd357610fa18582610de3565b828281518110610fb457610fb36142ea565b5b6020026020010181815250508080610fcb90614190565b915050610f8f565b508092505050919050565b610fe6611c67565b80600e8190555050565b8181601554611067838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050823360405160200161104c91906139f8565b604051602081830303815290604052805190602001206120ed565b6110a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109d90613c1a565b60405180910390fd5b600f5460013481836110b89190613fdf565b146110f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ef90613dba565b60405180910390fd5b6000611102610d58565b90506010546001826111149190613f58565b1115611155576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114c90613c5a565b60405180910390fd5b61116b336001836111669190613f58565b612104565b5050505050505050565b600061117f610d58565b82106111c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b790613d9a565b60405180910390fd5b600882815481106111d4576111d36142ea565b5b90600052602060002001549050919050565b601360019054906101000a900460ff1681565b611201611c67565b80600b9080519060200190611217929190612f25565b5050565b601360009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ce90613d3a565b60405180910390fd5b80915050919050565b600b80546112ed9061412d565b80601f01602080910402602001604051908101604052809291908181526020018280546113199061412d565b80156113665780601f1061133b57610100808354040283529160200191611366565b820191906000526020600020905b81548152906001019060200180831161134957829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d690613c3a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61142e611c67565b6114386000612122565b565b611442611c67565b8060118190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f5481565b60606001805461148b9061412d565b80601f01602080910402602001604051908101604052809291908181526020018280546114b79061412d565b80156115045780601f106114d957610100808354040283529160200191611504565b820191906000526020600020905b8154815290600101906020018083116114e757829003601f168201915b5050505050905090565b601360009054906101000a900460ff161561155e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155590613cfa565b60405180910390fd5b6000611568610d58565b9050600082116115ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a490613dfa565b60405180910390fd5b6011548211156115f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e990613c7a565b60405180910390fd5b60105482826116019190613f58565b1115611642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163990613c5a565b60405180910390fd5b61164a61144c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116cd5781600e5461168a9190613fdf565b3410156116cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c390613d7a565b60405180910390fd5b5b6000600190505b82811161175857601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061172b90614190565b91905055506117453382846117409190613f58565b612104565b808061175090614190565b9150506116d4565b505050565b61176f611768611d30565b83836121e8565b5050565b61177b611c67565b6001601360016101000a81548160ff021916908315150217905550565b60155481565b6117af6117a9611d30565b83611df1565b6117ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e590613dda565b60405180910390fd5b6117fa84848484612355565b50505050565b60125481565b61180e611c67565b8060158190555050565b600c80546118259061412d565b80601f01602080910402602001604051908101604052809291908181526020018280546118519061412d565b801561189e5780601f106118735761010080835404028352916020019161189e565b820191906000526020600020905b81548152906001019060200180831161188157829003601f168201915b505050505081565b60606118b1826123b1565b6118f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e790613d1a565b60405180910390fd5b60001515601360019054906101000a900460ff161515141561199e57600d80546119199061412d565b80601f01602080910402602001604051908101604052809291908181526020018280546119459061412d565b80156119925780601f1061196757610100808354040283529160200191611992565b820191906000526020600020905b81548152906001019060200180831161197557829003601f168201915b505050505090506119fa565b60006119a861241d565b905060008151116119c857604051806020016040528060008152506119f6565b806119d2846124af565b600c6040516020016119e693929190613a13565b6040516020818303038152906040525b9150505b919050565b611a07611c67565b8060128190555050565b611a19611c67565b80600f8190555050565b60105481565b611a31611c67565b80600c9080519060200190611a47929190612f25565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ae7611c67565b80600d9080519060200190611afd929190612f25565b5050565b611b09611c67565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7090613b7a565b60405180910390fd5b611b8281612122565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c5057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611c605750611c5f82612610565b5b9050919050565b611c6f611d30565b73ffffffffffffffffffffffffffffffffffffffff16611c8d61144c565b73ffffffffffffffffffffffffffffffffffffffff1614611ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cda90613cda565b60405180910390fd5b565b611cee816123b1565b611d2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2490613d3a565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611dab8361122e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611dfd8361122e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e3f5750611e3e8185611a4b565b5b80611e7d57508373ffffffffffffffffffffffffffffffffffffffff16611e6584610b66565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ea68261122e565b73ffffffffffffffffffffffffffffffffffffffff1614611efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef390613b9a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6390613bda565b60405180910390fd5b611f7783838361267a565b611f82600082611d38565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fd29190614039565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120299190613f58565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120e883838361278e565b505050565b6000826120fa8584612793565b1490509392505050565b61211e8282604051806020016040528060008152506127e9565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224e90613bfa565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123489190613ae2565b60405180910390a3505050565b612360848484611e86565b61236c84848484612844565b6123ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a290613b5a565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600b805461242c9061412d565b80601f01602080910402602001604051908101604052809291908181526020018280546124589061412d565b80156124a55780601f1061247a576101008083540402835291602001916124a5565b820191906000526020600020905b81548152906001019060200180831161248857829003601f168201915b5050505050905090565b606060008214156124f7576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061260b565b600082905060005b6000821461252957808061251290614190565b915050600a826125229190613fae565b91506124ff565b60008167ffffffffffffffff81111561254557612544614319565b5b6040519080825280601f01601f1916602001820160405280156125775781602001600182028036833780820191505090505b5090505b60008514612604576001826125909190614039565b9150600a8561259f91906141fd565b60306125ab9190613f58565b60f81b8183815181106125c1576125c06142ea565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125fd9190613fae565b945061257b565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6126858383836129db565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126c8576126c3816129e0565b612707565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612706576127058382612a29565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561274a5761274581612b96565b612789565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612788576127878282612c67565b5b5b505050565b505050565b60008082905060005b84518110156127de576127c9828683815181106127bc576127bb6142ea565b5b6020026020010151612ce6565b915080806127d690614190565b91505061279c565b508091505092915050565b6127f38383612d11565b6128006000848484612844565b61283f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283690613b5a565b60405180910390fd5b505050565b60006128658473ffffffffffffffffffffffffffffffffffffffff16612eeb565b156129ce578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261288e611d30565b8786866040518563ffffffff1660e01b81526004016128b09493929190613a74565b602060405180830381600087803b1580156128ca57600080fd5b505af19250505080156128fb57506040513d601f19601f820116820180604052508101906128f89190613413565b60015b61297e573d806000811461292b576040519150601f19603f3d011682016040523d82523d6000602084013e612930565b606091505b50600081511415612976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296d90613b5a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129d3565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612a368461136e565b612a409190614039565b9050600060076000848152602001908152602001600020549050818114612b25576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612baa9190614039565b9050600060096000848152602001908152602001600020549050600060088381548110612bda57612bd96142ea565b5b906000526020600020015490508060088381548110612bfc57612bfb6142ea565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612c4b57612c4a6142bb565b5b6001900381819060005260206000200160009055905550505050565b6000612c728361136e565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000818310612cfe57612cf98284612f0e565b612d09565b612d088383612f0e565b5b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7890613cba565b60405180910390fd5b612d8a816123b1565b15612dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc190613bba565b60405180910390fd5b612dd66000838361267a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e269190613f58565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ee76000838361278e565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b828054612f319061412d565b90600052602060002090601f016020900481019282612f535760008555612f9a565b82601f10612f6c57805160ff1916838001178555612f9a565b82800160010185558215612f9a579182015b82811115612f99578251825591602001919060010190612f7e565b5b509050612fa79190612fab565b5090565b5b80821115612fc4576000816000905550600101612fac565b5090565b6000612fdb612fd684613e5a565b613e35565b905082815260208101848484011115612ff757612ff6614357565b5b6130028482856140eb565b509392505050565b600061301d61301884613e8b565b613e35565b90508281526020810184848401111561303957613038614357565b5b6130448482856140eb565b509392505050565b60008135905061305b816148fe565b92915050565b60008083601f8401126130775761307661434d565b5b8235905067ffffffffffffffff81111561309457613093614348565b5b6020830191508360208202830111156130b0576130af614352565b5b9250929050565b6000813590506130c681614915565b92915050565b6000813590506130db8161492c565b92915050565b6000813590506130f081614943565b92915050565b60008151905061310581614943565b92915050565b600082601f8301126131205761311f61434d565b5b8135613130848260208601612fc8565b91505092915050565b600082601f83011261314e5761314d61434d565b5b813561315e84826020860161300a565b91505092915050565b6000813590506131768161495a565b92915050565b60006020828403121561319257613191614361565b5b60006131a08482850161304c565b91505092915050565b600080604083850312156131c0576131bf614361565b5b60006131ce8582860161304c565b92505060206131df8582860161304c565b9150509250929050565b60008060006060848603121561320257613201614361565b5b60006132108682870161304c565b93505060206132218682870161304c565b925050604061323286828701613167565b9150509250925092565b6000806000806080858703121561325657613255614361565b5b60006132648782880161304c565b94505060206132758782880161304c565b935050604061328687828801613167565b925050606085013567ffffffffffffffff8111156132a7576132a661435c565b5b6132b38782880161310b565b91505092959194509250565b600080604083850312156132d6576132d5614361565b5b60006132e48582860161304c565b92505060206132f5858286016130b7565b9150509250929050565b6000806040838503121561331657613315614361565b5b60006133248582860161304c565b925050602061333585828601613167565b9150509250929050565b6000806020838503121561335657613355614361565b5b600083013567ffffffffffffffff8111156133745761337361435c565b5b61338085828601613061565b92509250509250929050565b6000602082840312156133a2576133a1614361565b5b60006133b0848285016130b7565b91505092915050565b6000602082840312156133cf576133ce614361565b5b60006133dd848285016130cc565b91505092915050565b6000602082840312156133fc576133fb614361565b5b600061340a848285016130e1565b91505092915050565b60006020828403121561342957613428614361565b5b6000613437848285016130f6565b91505092915050565b60006020828403121561345657613455614361565b5b600082013567ffffffffffffffff8111156134745761347361435c565b5b61348084828501613139565b91505092915050565b60006020828403121561349f5761349e614361565b5b60006134ad84828501613167565b91505092915050565b60006134c283836139da565b60208301905092915050565b6134d78161406d565b82525050565b6134ee6134e98261406d565b6141d9565b82525050565b60006134ff82613ee1565b6135098185613f0f565b935061351483613ebc565b8060005b8381101561354557815161352c88826134b6565b975061353783613f02565b925050600181019050613518565b5085935050505092915050565b61355b8161407f565b82525050565b61356a8161408b565b82525050565b600061357b82613eec565b6135858185613f20565b93506135958185602086016140fa565b61359e81614366565b840191505092915050565b60006135b482613ef7565b6135be8185613f3c565b93506135ce8185602086016140fa565b6135d781614366565b840191505092915050565b60006135ed82613ef7565b6135f78185613f4d565b93506136078185602086016140fa565b80840191505092915050565b600081546136208161412d565b61362a8186613f4d565b94506001821660008114613645576001811461365657613689565b60ff19831686528186019350613689565b61365f85613ecc565b60005b8381101561368157815481890152600182019150602081019050613662565b838801955050505b50505092915050565b600061369f602b83613f3c565b91506136aa82614384565b604082019050919050565b60006136c2603283613f3c565b91506136cd826143d3565b604082019050919050565b60006136e5602683613f3c565b91506136f082614422565b604082019050919050565b6000613708602583613f3c565b915061371382614471565b604082019050919050565b600061372b601c83613f3c565b9150613736826144c0565b602082019050919050565b600061374e602483613f3c565b9150613759826144e9565b604082019050919050565b6000613771601983613f3c565b915061377c82614538565b602082019050919050565b6000613794601e83613f3c565b915061379f82614561565b602082019050919050565b60006137b7602983613f3c565b91506137c28261458a565b604082019050919050565b60006137da601683613f3c565b91506137e5826145d9565b602082019050919050565b60006137fd602483613f3c565b915061380882614602565b604082019050919050565b6000613820603e83613f3c565b915061382b82614651565b604082019050919050565b6000613843602083613f3c565b915061384e826146a0565b602082019050919050565b6000613866602083613f3c565b9150613871826146c9565b602082019050919050565b6000613889601683613f3c565b9150613894826146f2565b602082019050919050565b60006138ac602f83613f3c565b91506138b78261471b565b604082019050919050565b60006138cf601883613f3c565b91506138da8261476a565b602082019050919050565b60006138f2602183613f3c565b91506138fd82614793565b604082019050919050565b6000613915600083613f31565b9150613920826147e2565b600082019050919050565b6000613938601283613f3c565b9150613943826147e5565b602082019050919050565b600061395b602c83613f3c565b91506139668261480e565b604082019050919050565b600061397e601883613f3c565b91506139898261485d565b602082019050919050565b60006139a1602e83613f3c565b91506139ac82614886565b604082019050919050565b60006139c4601b83613f3c565b91506139cf826148d5565b602082019050919050565b6139e3816140e1565b82525050565b6139f2816140e1565b82525050565b6000613a0482846134dd565b60148201915081905092915050565b6000613a1f82866135e2565b9150613a2b82856135e2565b9150613a378284613613565b9150819050949350505050565b6000613a4f82613908565b9150819050919050565b6000602082019050613a6e60008301846134ce565b92915050565b6000608082019050613a8960008301876134ce565b613a9660208301866134ce565b613aa360408301856139e9565b8181036060830152613ab58184613570565b905095945050505050565b60006020820190508181036000830152613ada81846134f4565b905092915050565b6000602082019050613af76000830184613552565b92915050565b6000602082019050613b126000830184613561565b92915050565b60006020820190508181036000830152613b3281846135a9565b905092915050565b60006020820190508181036000830152613b5381613692565b9050919050565b60006020820190508181036000830152613b73816136b5565b9050919050565b60006020820190508181036000830152613b93816136d8565b9050919050565b60006020820190508181036000830152613bb3816136fb565b9050919050565b60006020820190508181036000830152613bd38161371e565b9050919050565b60006020820190508181036000830152613bf381613741565b9050919050565b60006020820190508181036000830152613c1381613764565b9050919050565b60006020820190508181036000830152613c3381613787565b9050919050565b60006020820190508181036000830152613c53816137aa565b9050919050565b60006020820190508181036000830152613c73816137cd565b9050919050565b60006020820190508181036000830152613c93816137f0565b9050919050565b60006020820190508181036000830152613cb381613813565b9050919050565b60006020820190508181036000830152613cd381613836565b9050919050565b60006020820190508181036000830152613cf381613859565b9050919050565b60006020820190508181036000830152613d138161387c565b9050919050565b60006020820190508181036000830152613d338161389f565b9050919050565b60006020820190508181036000830152613d53816138c2565b9050919050565b60006020820190508181036000830152613d73816138e5565b9050919050565b60006020820190508181036000830152613d938161392b565b9050919050565b60006020820190508181036000830152613db38161394e565b9050919050565b60006020820190508181036000830152613dd381613971565b9050919050565b60006020820190508181036000830152613df381613994565b9050919050565b60006020820190508181036000830152613e13816139b7565b9050919050565b6000602082019050613e2f60008301846139e9565b92915050565b6000613e3f613e50565b9050613e4b828261415f565b919050565b6000604051905090565b600067ffffffffffffffff821115613e7557613e74614319565b5b613e7e82614366565b9050602081019050919050565b600067ffffffffffffffff821115613ea657613ea5614319565b5b613eaf82614366565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613f63826140e1565b9150613f6e836140e1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613fa357613fa261422e565b5b828201905092915050565b6000613fb9826140e1565b9150613fc4836140e1565b925082613fd457613fd361425d565b5b828204905092915050565b6000613fea826140e1565b9150613ff5836140e1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561402e5761402d61422e565b5b828202905092915050565b6000614044826140e1565b915061404f836140e1565b9250828210156140625761406161422e565b5b828203905092915050565b6000614078826140c1565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156141185780820151818401526020810190506140fd565b83811115614127576000848401525b50505050565b6000600282049050600182168061414557607f821691505b602082108114156141595761415861428c565b5b50919050565b61416882614366565b810181811067ffffffffffffffff8211171561418757614186614319565b5b80604052505050565b600061419b826140e1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156141ce576141cd61422e565b5b600182019050919050565b60006141e4826141eb565b9050919050565b60006141f682614377565b9050919050565b6000614208826140e1565b9150614213836140e1565b9250826142235761422261425d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4164647265737320646f6573206e6f7420657869737420696e206c6973740000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b7f6d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f496e636f7272656374204554482076616c75652073656e740000000000000000600082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b6149078161406d565b811461491257600080fd5b50565b61491e8161407f565b811461492957600080fd5b50565b6149358161408b565b811461494057600080fd5b50565b61494c81614095565b811461495757600080fd5b50565b614963816140e1565b811461496e57600080fd5b5056fea264697066735822122024a354289f4588dd2216e751ef6b1d0a91f39ad3cbc6ccf7053bc4fa6910700564736f6c63430008070033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000034e4654000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034e4654000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034e4654000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034e46540000000000000000000000000000000000000000000000000000000000

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000034e4654000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034e4654000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034e4654000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034e46540000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): NFT
Arg [1] : _symbol (string): NFT
Arg [2] : _initBaseURI (string): NFT
Arg [3] : _initNotRevealedUri (string): NFT

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 4e46540000000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [7] : 4e46540000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [9] : 4e46540000000000000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [11] : 4e46540000000000000000000000000000000000000000000000000000000000


Deployed ByteCode Sourcemap

54960:5141:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48735:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59856:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35469:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36982:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55113:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36499:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55148:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49375:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55422:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55268:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37682:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49043:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59943:155;;;:::i;:::-;;38089:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57771:390;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59115:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57226:361;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49565:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55385:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59451:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55352:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35180:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55041:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34911:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13998:103;;;;;;;;;;;;;:::i;:::-;;59321:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13350:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55184:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35638:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55948:714;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37225:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58920:69;;;;;;;;;;;;;:::i;:::-;;55492:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38345:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55308:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57595:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55069:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58169:725;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58997:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59209:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55229:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59563:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37451:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59722:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14256:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48735:224;48837:4;48876:35;48861:50;;;:11;:50;;;;:90;;;;48915:36;48939:11;48915:23;:36::i;:::-;48861:90;48854:97;;48735:224;;;:::o;59856:79::-;13236:13;:11;:13::i;:::-;59921:6:::1;59912;;:15;;;;;;;;;;;;;;;;;;59856:79:::0;:::o;35469:100::-;35523:13;35556:5;35549:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35469:100;:::o;36982:171::-;37058:7;37078:23;37093:7;37078:14;:23::i;:::-;37121:15;:24;37137:7;37121:24;;;;;;;;;;;;;;;;;;;;;37114:31;;36982:171;;;:::o;55113:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36499:417::-;36580:13;36596:23;36611:7;36596:14;:23::i;:::-;36580:39;;36644:5;36638:11;;:2;:11;;;;36630:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;36738:5;36722:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;36747:37;36764:5;36771:12;:10;:12::i;:::-;36747:16;:37::i;:::-;36722:62;36700:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;36887:21;36896:2;36900:7;36887:8;:21::i;:::-;36569:347;36499:417;;:::o;55148:29::-;;;;:::o;49375:113::-;49436:7;49463:10;:17;;;;49456:24;;49375:113;:::o;55422:55::-;;;;;;;;;;;;;;;;;:::o;55268:33::-;;;;:::o;37682:336::-;37877:41;37896:12;:10;:12::i;:::-;37910:7;37877:18;:41::i;:::-;37869:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;37982:28;37992:4;37998:2;38002:7;37982:9;:28::i;:::-;37682:336;;;:::o;49043:256::-;49140:7;49176:23;49193:5;49176:16;:23::i;:::-;49168:5;:31;49160:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;49265:12;:19;49278:5;49265:19;;;;;;;;;;;;;;;:26;49285:5;49265:26;;;;;;;;;;;;49258:33;;49043:256;;;;:::o;59943:155::-;13236:13;:11;:13::i;:::-;60000:7:::1;60021;:5;:7::i;:::-;60013:21;;60042;60013:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59999:69;;;60087:2;60079:11;;;::::0;::::1;;59988:110;59943:155::o:0;38089:185::-;38227:39;38244:4;38250:2;38254:7;38227:39;;;;;;;;;;;;:16;:39::i;:::-;38089:185;;;:::o;57771:390::-;57858:16;57892:23;57918:17;57928:6;57918:9;:17::i;:::-;57892:43;;57946:25;57988:15;57974:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57946:58;;58020:9;58015:113;58035:15;58031:1;:19;58015:113;;;58086:30;58106:6;58114:1;58086:19;:30::i;:::-;58072:8;58081:1;58072:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;58052:3;;;;;:::i;:::-;;;;58015:113;;;;58145:8;58138:15;;;;57771:390;;;:::o;59115:86::-;13236:13;:11;:13::i;:::-;59185:8:::1;59178:4;:15;;;;59115:86:::0;:::o;57226:361::-;57342:11;;57355:19;;56783:144;56820:11;;56783:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56850:4;56900:10;56883:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;56873:39;;;;;;56783:18;:144::i;:::-;56761:224;;;;;;;;;;;;:::i;:::-;;;;;;;;;57402:13:::1;;57417:1;57137:9;57119:14;57111:5;:22;;;;:::i;:::-;:35;57089:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;57436:14:::2;57453:13;:11;:13::i;:::-;57436:30;;57499:9;;57494:1;57485:6;:10;;;;:::i;:::-;:23;;57477:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;57546:33;57556:10;57577:1;57568:6;:10;;;;:::i;:::-;57546:9;:33::i;:::-;57425:162;56996:1:::1;;57226:361:::0;;;;;:::o;49565:233::-;49640:7;49676:30;:28;:30::i;:::-;49668:5;:38;49660:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;49773:10;49784:5;49773:17;;;;;;;;:::i;:::-;;;;;;;;;;49766:24;;49565:233;;;:::o;55385:28::-;;;;;;;;;;;;;:::o;59451:104::-;13236:13;:11;:13::i;:::-;59536:11:::1;59526:7;:21;;;;;;;;;;;;:::i;:::-;;59451:104:::0;:::o;55352:26::-;;;;;;;;;;;;;:::o;35180:222::-;35252:7;35272:13;35288:7;:16;35296:7;35288:16;;;;;;;;;;;;;;;;;;;;;35272:32;;35340:1;35323:19;;:5;:19;;;;35315:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;35389:5;35382:12;;;35180:222;;;:::o;55041:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34911:207::-;34983:7;35028:1;35011:19;;:5;:19;;;;35003:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35094:9;:16;35104:5;35094:16;;;;;;;;;;;;;;;;35087:23;;34911:207;;;:::o;13998:103::-;13236:13;:11;:13::i;:::-;14063:30:::1;14090:1;14063:18;:30::i;:::-;13998:103::o:0;59321:122::-;13236:13;:11;:13::i;:::-;59418:17:::1;59402:13;:33;;;;59321:122:::0;:::o;13350:87::-;13396:7;13423:6;;;;;;;;;;;13416:13;;13350:87;:::o;55184:38::-;;;;:::o;35638:104::-;35694:13;35727:7;35720:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35638:104;:::o;55948:714::-;56018:6;;;;;;;;;;;56017:7;56009:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;56062:14;56079:13;:11;:13::i;:::-;56062:30;;56125:1;56111:11;:15;56103:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;56206:13;;56191:11;:28;;56169:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;56326:9;;56311:11;56302:6;:20;;;;:::i;:::-;:33;;56294:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56393:7;:5;:7::i;:::-;56379:21;;:10;:21;;;56375:116;;56445:11;56438:4;;:18;;;;:::i;:::-;56425:9;:31;;56417:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;56375:116;56508:9;56520:1;56508:13;;56503:152;56528:11;56523:1;:16;56503:152;;56561:20;:32;56582:10;56561:32;;;;;;;;;;;;;;;;:34;;;;;;;;;:::i;:::-;;;;;;56610:33;56620:10;56641:1;56632:6;:10;;;;:::i;:::-;56610:9;:33::i;:::-;56541:3;;;;;:::i;:::-;;;;56503:152;;;;55998:664;55948:714;:::o;37225:155::-;37320:52;37339:12;:10;:12::i;:::-;37353:8;37363;37320:18;:52::i;:::-;37225:155;;:::o;58920:69::-;13236:13;:11;:13::i;:::-;58977:4:::1;58966:8;;:15;;;;;;;;;;;;;;;;;;58920:69::o:0;55492:34::-;;;;:::o;38345:323::-;38519:41;38538:12;:10;:12::i;:::-;38552:7;38519:18;:41::i;:::-;38511:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;38622:38;38636:4;38642:2;38646:7;38655:4;38622:13;:38::i;:::-;38345:323;;;;:::o;55308:37::-;;;;:::o;57595:122::-;13236:13;:11;:13::i;:::-;57699:10:::1;57677:19;:32;;;;57595:122:::0;:::o;55069:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58169:725::-;58287:13;58340:16;58348:7;58340;:16::i;:::-;58318:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;58460:5;58448:17;;:8;;;;;;;;;;;:17;;;58444:71;;;58489:14;58482:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58444:71;58527:28;58558:10;:8;:10::i;:::-;58527:41;;58630:1;58605:14;58599:28;:32;:287;;;;;;;;;;;;;;;;;58723:14;58764:18;:7;:16;:18::i;:::-;58809:13;58680:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58599:287;58579:307;;;58169:725;;;;:::o;58997:110::-;13236:13;:11;:13::i;:::-;59093:6:::1;59072:18;:27;;;;58997:110:::0;:::o;59209:104::-;13236:13;:11;:13::i;:::-;59297:8:::1;59281:13;:24;;;;59209:104:::0;:::o;55229:32::-;;;;:::o;59563:151::-;13236:13;:11;:13::i;:::-;59689:17:::1;59673:13;:33;;;;;;;;;;;;:::i;:::-;;59563:151:::0;:::o;37451:164::-;37548:4;37572:18;:25;37591:5;37572:25;;;;;;;;;;;;;;;:35;37598:8;37572:35;;;;;;;;;;;;;;;;;;;;;;;;;37565:42;;37451:164;;;;:::o;59722:126::-;13236:13;:11;:13::i;:::-;59825:15:::1;59808:14;:32;;;;;;;;;;;;:::i;:::-;;59722:126:::0;:::o;14256:201::-;13236:13;:11;:13::i;:::-;14365:1:::1;14345:22;;:8;:22;;;;14337:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14421:28;14440:8;14421:18;:28::i;:::-;14256:201:::0;:::o;34542:305::-;34644:4;34696:25;34681:40;;;:11;:40;;;;:105;;;;34753:33;34738:48;;;:11;:48;;;;34681:105;:158;;;;34803:36;34827:11;34803:23;:36::i;:::-;34681:158;34661:178;;34542:305;;;:::o;13515:132::-;13590:12;:10;:12::i;:::-;13579:23;;:7;:5;:7::i;:::-;:23;;;13571:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13515:132::o;44957:135::-;45039:16;45047:7;45039;:16::i;:::-;45031:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;44957:135;:::o;11901:98::-;11954:7;11981:10;11974:17;;11901:98;:::o;44236:174::-;44338:2;44311:15;:24;44327:7;44311:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;44394:7;44390:2;44356:46;;44365:23;44380:7;44365:14;:23::i;:::-;44356:46;;;;;;;;;;;;44236:174;;:::o;40469:264::-;40562:4;40579:13;40595:23;40610:7;40595:14;:23::i;:::-;40579:39;;40648:5;40637:16;;:7;:16;;;:52;;;;40657:32;40674:5;40681:7;40657:16;:32::i;:::-;40637:52;:87;;;;40717:7;40693:31;;:20;40705:7;40693:11;:20::i;:::-;:31;;;40637:87;40629:96;;;40469:264;;;;:::o;43492:625::-;43651:4;43624:31;;:23;43639:7;43624:14;:23::i;:::-;:31;;;43616:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;43730:1;43716:16;;:2;:16;;;;43708:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;43786:39;43807:4;43813:2;43817:7;43786:20;:39::i;:::-;43890:29;43907:1;43911:7;43890:8;:29::i;:::-;43951:1;43932:9;:15;43942:4;43932:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;43980:1;43963:9;:13;43973:2;43963:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;44011:2;43992:7;:16;44000:7;43992:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;44050:7;44046:2;44031:27;;44040:4;44031:27;;;;;;;;;;;;44071:38;44091:4;44097:2;44101:7;44071:19;:38::i;:::-;43492:625;;;:::o;1219:190::-;1344:4;1397;1368:25;1381:5;1388:4;1368:12;:25::i;:::-;:33;1361:40;;1219:190;;;;;:::o;41075:110::-;41151:26;41161:2;41165:7;41151:26;;;;;;;;;;;;:9;:26::i;:::-;41075:110;;:::o;14617:191::-;14691:16;14710:6;;;;;;;;;;;14691:25;;14736:8;14727:6;;:17;;;;;;;;;;;;;;;;;;14791:8;14760:40;;14781:8;14760:40;;;;;;;;;;;;14680:128;14617:191;:::o;44553:315::-;44708:8;44699:17;;:5;:17;;;;44691:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;44795:8;44757:18;:25;44776:5;44757:25;;;;;;;;;;;;;;;:35;44783:8;44757:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;44841:8;44819:41;;44834:5;44819:41;;;44851:8;44819:41;;;;;;:::i;:::-;;;;;;;;44553:315;;;:::o;39549:313::-;39705:28;39715:4;39721:2;39725:7;39705:9;:28::i;:::-;39752:47;39775:4;39781:2;39785:7;39794:4;39752:22;:47::i;:::-;39744:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;39549:313;;;;:::o;40175:127::-;40240:4;40292:1;40264:30;;:7;:16;40272:7;40264:16;;;;;;;;;;;;;;;;;;;;;:30;;;;40257:37;;40175:127;;;:::o;55827:108::-;55887:13;55920:7;55913:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55827:108;:::o;9155:723::-;9211:13;9441:1;9432:5;:10;9428:53;;;9459:10;;;;;;;;;;;;;;;;;;;;;9428:53;9491:12;9506:5;9491:20;;9522:14;9547:78;9562:1;9554:4;:9;9547:78;;9580:8;;;;;:::i;:::-;;;;9611:2;9603:10;;;;;:::i;:::-;;;9547:78;;;9635:19;9667:6;9657:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9635:39;;9685:154;9701:1;9692:5;:10;9685:154;;9729:1;9719:11;;;;;:::i;:::-;;;9796:2;9788:5;:10;;;;:::i;:::-;9775:2;:24;;;;:::i;:::-;9762:39;;9745:6;9752;9745:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9825:2;9816:11;;;;;:::i;:::-;;;9685:154;;;9863:6;9849:21;;;;;9155:723;;;;:::o;26204:157::-;26289:4;26328:25;26313:40;;;:11;:40;;;;26306:47;;26204:157;;;:::o;50411:589::-;50555:45;50582:4;50588:2;50592:7;50555:26;:45::i;:::-;50633:1;50617:18;;:4;:18;;;50613:187;;;50652:40;50684:7;50652:31;:40::i;:::-;50613:187;;;50722:2;50714:10;;:4;:10;;;50710:90;;50741:47;50774:4;50780:7;50741:32;:47::i;:::-;50710:90;50613:187;50828:1;50814:16;;:2;:16;;;50810:183;;;50847:45;50884:7;50847:36;:45::i;:::-;50810:183;;;50920:4;50914:10;;:2;:10;;;50910:83;;50941:40;50969:2;50973:7;50941:27;:40::i;:::-;50910:83;50810:183;50411:589;;;:::o;47592:125::-;;;;:::o;2086:296::-;2169:7;2189:20;2212:4;2189:27;;2232:9;2227:118;2251:5;:12;2247:1;:16;2227:118;;;2300:33;2310:12;2324:5;2330:1;2324:8;;;;;;;;:::i;:::-;;;;;;;;2300:9;:33::i;:::-;2285:48;;2265:3;;;;;:::i;:::-;;;;2227:118;;;;2362:12;2355:19;;;2086:296;;;;:::o;41412:319::-;41541:18;41547:2;41551:7;41541:5;:18::i;:::-;41592:53;41623:1;41627:2;41631:7;41640:4;41592:22;:53::i;:::-;41570:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;41412:319;;;:::o;45656:853::-;45810:4;45831:15;:2;:13;;;:15::i;:::-;45827:675;;;45883:2;45867:36;;;45904:12;:10;:12::i;:::-;45918:4;45924:7;45933:4;45867:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45863:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46125:1;46108:6;:13;:18;46104:328;;;46151:60;;;;;;;;;;:::i;:::-;;;;;;;;46104:328;46382:6;46376:13;46367:6;46363:2;46359:15;46352:38;45863:584;45999:41;;;45989:51;;;:6;:51;;;;45982:58;;;;;45827:675;46486:4;46479:11;;45656:853;;;;;;;:::o;47081:126::-;;;;:::o;51723:164::-;51827:10;:17;;;;51800:15;:24;51816:7;51800:24;;;;;;;;;;;:44;;;;51855:10;51871:7;51855:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51723:164;:::o;52514:988::-;52780:22;52830:1;52805:22;52822:4;52805:16;:22::i;:::-;:26;;;;:::i;:::-;52780:51;;52842:18;52863:17;:26;52881:7;52863:26;;;;;;;;;;;;52842:47;;53010:14;52996:10;:28;52992:328;;53041:19;53063:12;:18;53076:4;53063:18;;;;;;;;;;;;;;;:34;53082:14;53063:34;;;;;;;;;;;;53041:56;;53147:11;53114:12;:18;53127:4;53114:18;;;;;;;;;;;;;;;:30;53133:10;53114:30;;;;;;;;;;;:44;;;;53264:10;53231:17;:30;53249:11;53231:30;;;;;;;;;;;:43;;;;53026:294;52992:328;53416:17;:26;53434:7;53416:26;;;;;;;;;;;53409:33;;;53460:12;:18;53473:4;53460:18;;;;;;;;;;;;;;;:34;53479:14;53460:34;;;;;;;;;;;53453:41;;;52595:907;;52514:988;;:::o;53797:1079::-;54050:22;54095:1;54075:10;:17;;;;:21;;;;:::i;:::-;54050:46;;54107:18;54128:15;:24;54144:7;54128:24;;;;;;;;;;;;54107:45;;54479:19;54501:10;54512:14;54501:26;;;;;;;;:::i;:::-;;;;;;;;;;54479:48;;54565:11;54540:10;54551;54540:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;54676:10;54645:15;:28;54661:11;54645:28;;;;;;;;;;;:41;;;;54817:15;:24;54833:7;54817:24;;;;;;;;;;;54810:31;;;54852:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53868:1008;;;53797:1079;:::o;51301:221::-;51386:14;51403:20;51420:2;51403:16;:20::i;:::-;51386:37;;51461:7;51434:12;:16;51447:2;51434:16;;;;;;;;;;;;;;;:24;51451:6;51434:24;;;;;;;;;;;:34;;;;51508:6;51479:17;:26;51497:7;51479:26;;;;;;;;;;;:35;;;;51375:147;51301:221;;:::o;8293:149::-;8356:7;8387:1;8383;:5;:51;;8414:20;8429:1;8432;8414:14;:20::i;:::-;8383:51;;;8391:20;8406:1;8409;8391:14;:20::i;:::-;8383:51;8376:58;;8293:149;;;;:::o;42067:439::-;42161:1;42147:16;;:2;:16;;;;42139:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;42220:16;42228:7;42220;:16::i;:::-;42219:17;42211:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;42282:45;42311:1;42315:2;42319:7;42282:20;:45::i;:::-;42357:1;42340:9;:13;42350:2;42340:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;42388:2;42369:7;:16;42377:7;42369:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42433:7;42429:2;42408:33;;42425:1;42408:33;;;;;;;;;;;;42454:44;42482:1;42486:2;42490:7;42454:19;:44::i;:::-;42067:439;;:::o;16048:326::-;16108:4;16365:1;16343:7;:19;;;:23;16336:30;;16048:326;;;:::o;8450:268::-;8518:13;8625:1;8619:4;8612:15;8654:1;8648:4;8641:15;8695:4;8689;8679:21;8670:30;;8450:268;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:139::-;1762:5;1800:6;1787:20;1778:29;;1816:33;1843:5;1816:33;:::i;:::-;1716:139;;;;:::o;1861:137::-;1906:5;1944:6;1931:20;1922:29;;1960:32;1986:5;1960:32;:::i;:::-;1861:137;;;;:::o;2004:141::-;2060:5;2091:6;2085:13;2076:22;;2107:32;2133:5;2107:32;:::i;:::-;2004:141;;;;:::o;2164:338::-;2219:5;2268:3;2261:4;2253:6;2249:17;2245:27;2235:122;;2276:79;;:::i;:::-;2235:122;2393:6;2380:20;2418:78;2492:3;2484:6;2477:4;2469:6;2465:17;2418:78;:::i;:::-;2409:87;;2225:277;2164:338;;;;:::o;2522:340::-;2578:5;2627:3;2620:4;2612:6;2608:17;2604:27;2594:122;;2635:79;;:::i;:::-;2594:122;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2584:278;2522:340;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2868:139;;;;:::o;3013:329::-;3072:6;3121:2;3109:9;3100:7;3096:23;3092:32;3089:119;;;3127:79;;:::i;:::-;3089:119;3247:1;3272:53;3317:7;3308:6;3297:9;3293:22;3272:53;:::i;:::-;3262:63;;3218:117;3013:329;;;;:::o;3348:474::-;3416:6;3424;3473:2;3461:9;3452:7;3448:23;3444:32;3441:119;;;3479:79;;:::i;:::-;3441:119;3599:1;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3570:117;3726:2;3752:53;3797:7;3788:6;3777:9;3773:22;3752:53;:::i;:::-;3742:63;;3697:118;3348:474;;;;;:::o;3828:619::-;3905:6;3913;3921;3970:2;3958:9;3949:7;3945:23;3941:32;3938:119;;;3976:79;;:::i;:::-;3938:119;4096:1;4121:53;4166:7;4157:6;4146:9;4142:22;4121:53;:::i;:::-;4111:63;;4067:117;4223:2;4249:53;4294:7;4285:6;4274:9;4270:22;4249:53;:::i;:::-;4239:63;;4194:118;4351:2;4377:53;4422:7;4413:6;4402:9;4398:22;4377:53;:::i;:::-;4367:63;;4322:118;3828:619;;;;;:::o;4453:943::-;4548:6;4556;4564;4572;4621:3;4609:9;4600:7;4596:23;4592:33;4589:120;;;4628:79;;:::i;:::-;4589:120;4748:1;4773:53;4818:7;4809:6;4798:9;4794:22;4773:53;:::i;:::-;4763:63;;4719:117;4875:2;4901:53;4946:7;4937:6;4926:9;4922:22;4901:53;:::i;:::-;4891:63;;4846:118;5003:2;5029:53;5074:7;5065:6;5054:9;5050:22;5029:53;:::i;:::-;5019:63;;4974:118;5159:2;5148:9;5144:18;5131:32;5190:18;5182:6;5179:30;5176:117;;;5212:79;;:::i;:::-;5176:117;5317:62;5371:7;5362:6;5351:9;5347:22;5317:62;:::i;:::-;5307:72;;5102:287;4453:943;;;;;;;:::o;5402:468::-;5467:6;5475;5524:2;5512:9;5503:7;5499:23;5495:32;5492:119;;;5530:79;;:::i;:::-;5492:119;5650:1;5675:53;5720:7;5711:6;5700:9;5696:22;5675:53;:::i;:::-;5665:63;;5621:117;5777:2;5803:50;5845:7;5836:6;5825:9;5821:22;5803:50;:::i;:::-;5793:60;;5748:115;5402:468;;;;;:::o;5876:474::-;5944:6;5952;6001:2;5989:9;5980:7;5976:23;5972:32;5969:119;;;6007:79;;:::i;:::-;5969:119;6127:1;6152:53;6197:7;6188:6;6177:9;6173:22;6152:53;:::i;:::-;6142:63;;6098:117;6254:2;6280:53;6325:7;6316:6;6305:9;6301:22;6280:53;:::i;:::-;6270:63;;6225:118;5876:474;;;;;:::o;6356:559::-;6442:6;6450;6499:2;6487:9;6478:7;6474:23;6470:32;6467:119;;;6505:79;;:::i;:::-;6467:119;6653:1;6642:9;6638:17;6625:31;6683:18;6675:6;6672:30;6669:117;;;6705:79;;:::i;:::-;6669:117;6818:80;6890:7;6881:6;6870:9;6866:22;6818:80;:::i;:::-;6800:98;;;;6596:312;6356:559;;;;;:::o;6921:323::-;6977:6;7026:2;7014:9;7005:7;7001:23;6997:32;6994:119;;;7032:79;;:::i;:::-;6994:119;7152:1;7177:50;7219:7;7210:6;7199:9;7195:22;7177:50;:::i;:::-;7167:60;;7123:114;6921:323;;;;:::o;7250:329::-;7309:6;7358:2;7346:9;7337:7;7333:23;7329:32;7326:119;;;7364:79;;:::i;:::-;7326:119;7484:1;7509:53;7554:7;7545:6;7534:9;7530:22;7509:53;:::i;:::-;7499:63;;7455:117;7250:329;;;;:::o;7585:327::-;7643:6;7692:2;7680:9;7671:7;7667:23;7663:32;7660:119;;;7698:79;;:::i;:::-;7660:119;7818:1;7843:52;7887:7;7878:6;7867:9;7863:22;7843:52;:::i;:::-;7833:62;;7789:116;7585:327;;;;:::o;7918:349::-;7987:6;8036:2;8024:9;8015:7;8011:23;8007:32;8004:119;;;8042:79;;:::i;:::-;8004:119;8162:1;8187:63;8242:7;8233:6;8222:9;8218:22;8187:63;:::i;:::-;8177:73;;8133:127;7918:349;;;;:::o;8273:509::-;8342:6;8391:2;8379:9;8370:7;8366:23;8362:32;8359:119;;;8397:79;;:::i;:::-;8359:119;8545:1;8534:9;8530:17;8517:31;8575:18;8567:6;8564:30;8561:117;;;8597:79;;:::i;:::-;8561:117;8702:63;8757:7;8748:6;8737:9;8733:22;8702:63;:::i;:::-;8692:73;;8488:287;8273:509;;;;:::o;8788:329::-;8847:6;8896:2;8884:9;8875:7;8871:23;8867:32;8864:119;;;8902:79;;:::i;:::-;8864:119;9022:1;9047:53;9092:7;9083:6;9072:9;9068:22;9047:53;:::i;:::-;9037:63;;8993:117;8788:329;;;;:::o;9123:179::-;9192:10;9213:46;9255:3;9247:6;9213:46;:::i;:::-;9291:4;9286:3;9282:14;9268:28;;9123:179;;;;:::o;9308:118::-;9395:24;9413:5;9395:24;:::i;:::-;9390:3;9383:37;9308:118;;:::o;9432:157::-;9537:45;9557:24;9575:5;9557:24;:::i;:::-;9537:45;:::i;:::-;9532:3;9525:58;9432:157;;:::o;9625:732::-;9744:3;9773:54;9821:5;9773:54;:::i;:::-;9843:86;9922:6;9917:3;9843:86;:::i;:::-;9836:93;;9953:56;10003:5;9953:56;:::i;:::-;10032:7;10063:1;10048:284;10073:6;10070:1;10067:13;10048:284;;;10149:6;10143:13;10176:63;10235:3;10220:13;10176:63;:::i;:::-;10169:70;;10262:60;10315:6;10262:60;:::i;:::-;10252:70;;10108:224;10095:1;10092;10088:9;10083:14;;10048:284;;;10052:14;10348:3;10341:10;;9749:608;;;9625:732;;;;:::o;10363:109::-;10444:21;10459:5;10444:21;:::i;:::-;10439:3;10432:34;10363:109;;:::o;10478:118::-;10565:24;10583:5;10565:24;:::i;:::-;10560:3;10553:37;10478:118;;:::o;10602:360::-;10688:3;10716:38;10748:5;10716:38;:::i;:::-;10770:70;10833:6;10828:3;10770:70;:::i;:::-;10763:77;;10849:52;10894:6;10889:3;10882:4;10875:5;10871:16;10849:52;:::i;:::-;10926:29;10948:6;10926:29;:::i;:::-;10921:3;10917:39;10910:46;;10692:270;10602:360;;;;:::o;10968:364::-;11056:3;11084:39;11117:5;11084:39;:::i;:::-;11139:71;11203:6;11198:3;11139:71;:::i;:::-;11132:78;;11219:52;11264:6;11259:3;11252:4;11245:5;11241:16;11219:52;:::i;:::-;11296:29;11318:6;11296:29;:::i;:::-;11291:3;11287:39;11280:46;;11060:272;10968:364;;;;:::o;11338:377::-;11444:3;11472:39;11505:5;11472:39;:::i;:::-;11527:89;11609:6;11604:3;11527:89;:::i;:::-;11520:96;;11625:52;11670:6;11665:3;11658:4;11651:5;11647:16;11625:52;:::i;:::-;11702:6;11697:3;11693:16;11686:23;;11448:267;11338:377;;;;:::o;11745:845::-;11848:3;11885:5;11879:12;11914:36;11940:9;11914:36;:::i;:::-;11966:89;12048:6;12043:3;11966:89;:::i;:::-;11959:96;;12086:1;12075:9;12071:17;12102:1;12097:137;;;;12248:1;12243:341;;;;12064:520;;12097:137;12181:4;12177:9;12166;12162:25;12157:3;12150:38;12217:6;12212:3;12208:16;12201:23;;12097:137;;12243:341;12310:38;12342:5;12310:38;:::i;:::-;12370:1;12384:154;12398:6;12395:1;12392:13;12384:154;;;12472:7;12466:14;12462:1;12457:3;12453:11;12446:35;12522:1;12513:7;12509:15;12498:26;;12420:4;12417:1;12413:12;12408:17;;12384:154;;;12567:6;12562:3;12558:16;12551:23;;12250:334;;12064:520;;11852:738;;11745:845;;;;:::o;12596:366::-;12738:3;12759:67;12823:2;12818:3;12759:67;:::i;:::-;12752:74;;12835:93;12924:3;12835:93;:::i;:::-;12953:2;12948:3;12944:12;12937:19;;12596:366;;;:::o;12968:::-;13110:3;13131:67;13195:2;13190:3;13131:67;:::i;:::-;13124:74;;13207:93;13296:3;13207:93;:::i;:::-;13325:2;13320:3;13316:12;13309:19;;12968:366;;;:::o;13340:::-;13482:3;13503:67;13567:2;13562:3;13503:67;:::i;:::-;13496:74;;13579:93;13668:3;13579:93;:::i;:::-;13697:2;13692:3;13688:12;13681:19;;13340:366;;;:::o;13712:::-;13854:3;13875:67;13939:2;13934:3;13875:67;:::i;:::-;13868:74;;13951:93;14040:3;13951:93;:::i;:::-;14069:2;14064:3;14060:12;14053:19;;13712:366;;;:::o;14084:::-;14226:3;14247:67;14311:2;14306:3;14247:67;:::i;:::-;14240:74;;14323:93;14412:3;14323:93;:::i;:::-;14441:2;14436:3;14432:12;14425:19;;14084:366;;;:::o;14456:::-;14598:3;14619:67;14683:2;14678:3;14619:67;:::i;:::-;14612:74;;14695:93;14784:3;14695:93;:::i;:::-;14813:2;14808:3;14804:12;14797:19;;14456:366;;;:::o;14828:::-;14970:3;14991:67;15055:2;15050:3;14991:67;:::i;:::-;14984:74;;15067:93;15156:3;15067:93;:::i;:::-;15185:2;15180:3;15176:12;15169:19;;14828:366;;;:::o;15200:::-;15342:3;15363:67;15427:2;15422:3;15363:67;:::i;:::-;15356:74;;15439:93;15528:3;15439:93;:::i;:::-;15557:2;15552:3;15548:12;15541:19;;15200:366;;;:::o;15572:::-;15714:3;15735:67;15799:2;15794:3;15735:67;:::i;:::-;15728:74;;15811:93;15900:3;15811:93;:::i;:::-;15929:2;15924:3;15920:12;15913:19;;15572:366;;;:::o;15944:::-;16086:3;16107:67;16171:2;16166:3;16107:67;:::i;:::-;16100:74;;16183:93;16272:3;16183:93;:::i;:::-;16301:2;16296:3;16292:12;16285:19;;15944:366;;;:::o;16316:::-;16458:3;16479:67;16543:2;16538:3;16479:67;:::i;:::-;16472:74;;16555:93;16644:3;16555:93;:::i;:::-;16673:2;16668:3;16664:12;16657:19;;16316:366;;;:::o;16688:::-;16830:3;16851:67;16915:2;16910:3;16851:67;:::i;:::-;16844:74;;16927:93;17016:3;16927:93;:::i;:::-;17045:2;17040:3;17036:12;17029:19;;16688:366;;;:::o;17060:::-;17202:3;17223:67;17287:2;17282:3;17223:67;:::i;:::-;17216:74;;17299:93;17388:3;17299:93;:::i;:::-;17417:2;17412:3;17408:12;17401:19;;17060:366;;;:::o;17432:::-;17574:3;17595:67;17659:2;17654:3;17595:67;:::i;:::-;17588:74;;17671:93;17760:3;17671:93;:::i;:::-;17789:2;17784:3;17780:12;17773:19;;17432:366;;;:::o;17804:::-;17946:3;17967:67;18031:2;18026:3;17967:67;:::i;:::-;17960:74;;18043:93;18132:3;18043:93;:::i;:::-;18161:2;18156:3;18152:12;18145:19;;17804:366;;;:::o;18176:::-;18318:3;18339:67;18403:2;18398:3;18339:67;:::i;:::-;18332:74;;18415:93;18504:3;18415:93;:::i;:::-;18533:2;18528:3;18524:12;18517:19;;18176:366;;;:::o;18548:::-;18690:3;18711:67;18775:2;18770:3;18711:67;:::i;:::-;18704:74;;18787:93;18876:3;18787:93;:::i;:::-;18905:2;18900:3;18896:12;18889:19;;18548:366;;;:::o;18920:::-;19062:3;19083:67;19147:2;19142:3;19083:67;:::i;:::-;19076:74;;19159:93;19248:3;19159:93;:::i;:::-;19277:2;19272:3;19268:12;19261:19;;18920:366;;;:::o;19292:398::-;19451:3;19472:83;19553:1;19548:3;19472:83;:::i;:::-;19465:90;;19564:93;19653:3;19564:93;:::i;:::-;19682:1;19677:3;19673:11;19666:18;;19292:398;;;:::o;19696:366::-;19838:3;19859:67;19923:2;19918:3;19859:67;:::i;:::-;19852:74;;19935:93;20024:3;19935:93;:::i;:::-;20053:2;20048:3;20044:12;20037:19;;19696:366;;;:::o;20068:::-;20210:3;20231:67;20295:2;20290:3;20231:67;:::i;:::-;20224:74;;20307:93;20396:3;20307:93;:::i;:::-;20425:2;20420:3;20416:12;20409:19;;20068:366;;;:::o;20440:::-;20582:3;20603:67;20667:2;20662:3;20603:67;:::i;:::-;20596:74;;20679:93;20768:3;20679:93;:::i;:::-;20797:2;20792:3;20788:12;20781:19;;20440:366;;;:::o;20812:::-;20954:3;20975:67;21039:2;21034:3;20975:67;:::i;:::-;20968:74;;21051:93;21140:3;21051:93;:::i;:::-;21169:2;21164:3;21160:12;21153:19;;20812:366;;;:::o;21184:::-;21326:3;21347:67;21411:2;21406:3;21347:67;:::i;:::-;21340:74;;21423:93;21512:3;21423:93;:::i;:::-;21541:2;21536:3;21532:12;21525:19;;21184:366;;;:::o;21556:108::-;21633:24;21651:5;21633:24;:::i;:::-;21628:3;21621:37;21556:108;;:::o;21670:118::-;21757:24;21775:5;21757:24;:::i;:::-;21752:3;21745:37;21670:118;;:::o;21794:256::-;21906:3;21921:75;21992:3;21983:6;21921:75;:::i;:::-;22021:2;22016:3;22012:12;22005:19;;22041:3;22034:10;;21794:256;;;;:::o;22056:589::-;22281:3;22303:95;22394:3;22385:6;22303:95;:::i;:::-;22296:102;;22415:95;22506:3;22497:6;22415:95;:::i;:::-;22408:102;;22527:92;22615:3;22606:6;22527:92;:::i;:::-;22520:99;;22636:3;22629:10;;22056:589;;;;;;:::o;22651:379::-;22835:3;22857:147;23000:3;22857:147;:::i;:::-;22850:154;;23021:3;23014:10;;22651:379;;;:::o;23036:222::-;23129:4;23167:2;23156:9;23152:18;23144:26;;23180:71;23248:1;23237:9;23233:17;23224:6;23180:71;:::i;:::-;23036:222;;;;:::o;23264:640::-;23459:4;23497:3;23486:9;23482:19;23474:27;;23511:71;23579:1;23568:9;23564:17;23555:6;23511:71;:::i;:::-;23592:72;23660:2;23649:9;23645:18;23636:6;23592:72;:::i;:::-;23674;23742:2;23731:9;23727:18;23718:6;23674:72;:::i;:::-;23793:9;23787:4;23783:20;23778:2;23767:9;23763:18;23756:48;23821:76;23892:4;23883:6;23821:76;:::i;:::-;23813:84;;23264:640;;;;;;;:::o;23910:373::-;24053:4;24091:2;24080:9;24076:18;24068:26;;24140:9;24134:4;24130:20;24126:1;24115:9;24111:17;24104:47;24168:108;24271:4;24262:6;24168:108;:::i;:::-;24160:116;;23910:373;;;;:::o;24289:210::-;24376:4;24414:2;24403:9;24399:18;24391:26;;24427:65;24489:1;24478:9;24474:17;24465:6;24427:65;:::i;:::-;24289:210;;;;:::o;24505:222::-;24598:4;24636:2;24625:9;24621:18;24613:26;;24649:71;24717:1;24706:9;24702:17;24693:6;24649:71;:::i;:::-;24505:222;;;;:::o;24733:313::-;24846:4;24884:2;24873:9;24869:18;24861:26;;24933:9;24927:4;24923:20;24919:1;24908:9;24904:17;24897:47;24961:78;25034:4;25025:6;24961:78;:::i;:::-;24953:86;;24733:313;;;;:::o;25052:419::-;25218:4;25256:2;25245:9;25241:18;25233:26;;25305:9;25299:4;25295:20;25291:1;25280:9;25276:17;25269:47;25333:131;25459:4;25333:131;:::i;:::-;25325:139;;25052:419;;;:::o;25477:::-;25643:4;25681:2;25670:9;25666:18;25658:26;;25730:9;25724:4;25720:20;25716:1;25705:9;25701:17;25694:47;25758:131;25884:4;25758:131;:::i;:::-;25750:139;;25477:419;;;:::o;25902:::-;26068:4;26106:2;26095:9;26091:18;26083:26;;26155:9;26149:4;26145:20;26141:1;26130:9;26126:17;26119:47;26183:131;26309:4;26183:131;:::i;:::-;26175:139;;25902:419;;;:::o;26327:::-;26493:4;26531:2;26520:9;26516:18;26508:26;;26580:9;26574:4;26570:20;26566:1;26555:9;26551:17;26544:47;26608:131;26734:4;26608:131;:::i;:::-;26600:139;;26327:419;;;:::o;26752:::-;26918:4;26956:2;26945:9;26941:18;26933:26;;27005:9;26999:4;26995:20;26991:1;26980:9;26976:17;26969:47;27033:131;27159:4;27033:131;:::i;:::-;27025:139;;26752:419;;;:::o;27177:::-;27343:4;27381:2;27370:9;27366:18;27358:26;;27430:9;27424:4;27420:20;27416:1;27405:9;27401:17;27394:47;27458:131;27584:4;27458:131;:::i;:::-;27450:139;;27177:419;;;:::o;27602:::-;27768:4;27806:2;27795:9;27791:18;27783:26;;27855:9;27849:4;27845:20;27841:1;27830:9;27826:17;27819:47;27883:131;28009:4;27883:131;:::i;:::-;27875:139;;27602:419;;;:::o;28027:::-;28193:4;28231:2;28220:9;28216:18;28208:26;;28280:9;28274:4;28270:20;28266:1;28255:9;28251:17;28244:47;28308:131;28434:4;28308:131;:::i;:::-;28300:139;;28027:419;;;:::o;28452:::-;28618:4;28656:2;28645:9;28641:18;28633:26;;28705:9;28699:4;28695:20;28691:1;28680:9;28676:17;28669:47;28733:131;28859:4;28733:131;:::i;:::-;28725:139;;28452:419;;;:::o;28877:::-;29043:4;29081:2;29070:9;29066:18;29058:26;;29130:9;29124:4;29120:20;29116:1;29105:9;29101:17;29094:47;29158:131;29284:4;29158:131;:::i;:::-;29150:139;;28877:419;;;:::o;29302:::-;29468:4;29506:2;29495:9;29491:18;29483:26;;29555:9;29549:4;29545:20;29541:1;29530:9;29526:17;29519:47;29583:131;29709:4;29583:131;:::i;:::-;29575:139;;29302:419;;;:::o;29727:::-;29893:4;29931:2;29920:9;29916:18;29908:26;;29980:9;29974:4;29970:20;29966:1;29955:9;29951:17;29944:47;30008:131;30134:4;30008:131;:::i;:::-;30000:139;;29727:419;;;:::o;30152:::-;30318:4;30356:2;30345:9;30341:18;30333:26;;30405:9;30399:4;30395:20;30391:1;30380:9;30376:17;30369:47;30433:131;30559:4;30433:131;:::i;:::-;30425:139;;30152:419;;;:::o;30577:::-;30743:4;30781:2;30770:9;30766:18;30758:26;;30830:9;30824:4;30820:20;30816:1;30805:9;30801:17;30794:47;30858:131;30984:4;30858:131;:::i;:::-;30850:139;;30577:419;;;:::o;31002:::-;31168:4;31206:2;31195:9;31191:18;31183:26;;31255:9;31249:4;31245:20;31241:1;31230:9;31226:17;31219:47;31283:131;31409:4;31283:131;:::i;:::-;31275:139;;31002:419;;;:::o;31427:::-;31593:4;31631:2;31620:9;31616:18;31608:26;;31680:9;31674:4;31670:20;31666:1;31655:9;31651:17;31644:47;31708:131;31834:4;31708:131;:::i;:::-;31700:139;;31427:419;;;:::o;31852:::-;32018:4;32056:2;32045:9;32041:18;32033:26;;32105:9;32099:4;32095:20;32091:1;32080:9;32076:17;32069:47;32133:131;32259:4;32133:131;:::i;:::-;32125:139;;31852:419;;;:::o;32277:::-;32443:4;32481:2;32470:9;32466:18;32458:26;;32530:9;32524:4;32520:20;32516:1;32505:9;32501:17;32494:47;32558:131;32684:4;32558:131;:::i;:::-;32550:139;;32277:419;;;:::o;32702:::-;32868:4;32906:2;32895:9;32891:18;32883:26;;32955:9;32949:4;32945:20;32941:1;32930:9;32926:17;32919:47;32983:131;33109:4;32983:131;:::i;:::-;32975:139;;32702:419;;;:::o;33127:::-;33293:4;33331:2;33320:9;33316:18;33308:26;;33380:9;33374:4;33370:20;33366:1;33355:9;33351:17;33344:47;33408:131;33534:4;33408:131;:::i;:::-;33400:139;;33127:419;;;:::o;33552:::-;33718:4;33756:2;33745:9;33741:18;33733:26;;33805:9;33799:4;33795:20;33791:1;33780:9;33776:17;33769:47;33833:131;33959:4;33833:131;:::i;:::-;33825:139;;33552:419;;;:::o;33977:::-;34143:4;34181:2;34170:9;34166:18;34158:26;;34230:9;34224:4;34220:20;34216:1;34205:9;34201:17;34194:47;34258:131;34384:4;34258:131;:::i;:::-;34250:139;;33977:419;;;:::o;34402:::-;34568:4;34606:2;34595:9;34591:18;34583:26;;34655:9;34649:4;34645:20;34641:1;34630:9;34626:17;34619:47;34683:131;34809:4;34683:131;:::i;:::-;34675:139;;34402:419;;;:::o;34827:222::-;34920:4;34958:2;34947:9;34943:18;34935:26;;34971:71;35039:1;35028:9;35024:17;35015:6;34971:71;:::i;:::-;34827:222;;;;:::o;35055:129::-;35089:6;35116:20;;:::i;:::-;35106:30;;35145:33;35173:4;35165:6;35145:33;:::i;:::-;35055:129;;;:::o;35190:75::-;35223:6;35256:2;35250:9;35240:19;;35190:75;:::o;35271:307::-;35332:4;35422:18;35414:6;35411:30;35408:56;;;35444:18;;:::i;:::-;35408:56;35482:29;35504:6;35482:29;:::i;:::-;35474:37;;35566:4;35560;35556:15;35548:23;;35271:307;;;:::o;35584:308::-;35646:4;35736:18;35728:6;35725:30;35722:56;;;35758:18;;:::i;:::-;35722:56;35796:29;35818:6;35796:29;:::i;:::-;35788:37;;35880:4;35874;35870:15;35862:23;;35584:308;;;:::o;35898:132::-;35965:4;35988:3;35980:11;;36018:4;36013:3;36009:14;36001:22;;35898:132;;;:::o;36036:141::-;36085:4;36108:3;36100:11;;36131:3;36128:1;36121:14;36165:4;36162:1;36152:18;36144:26;;36036:141;;;:::o;36183:114::-;36250:6;36284:5;36278:12;36268:22;;36183:114;;;:::o;36303:98::-;36354:6;36388:5;36382:12;36372:22;;36303:98;;;:::o;36407:99::-;36459:6;36493:5;36487:12;36477:22;;36407:99;;;:::o;36512:113::-;36582:4;36614;36609:3;36605:14;36597:22;;36512:113;;;:::o;36631:184::-;36730:11;36764:6;36759:3;36752:19;36804:4;36799:3;36795:14;36780:29;;36631:184;;;;:::o;36821:168::-;36904:11;36938:6;36933:3;36926:19;36978:4;36973:3;36969:14;36954:29;;36821:168;;;;:::o;36995:147::-;37096:11;37133:3;37118:18;;36995:147;;;;:::o;37148:169::-;37232:11;37266:6;37261:3;37254:19;37306:4;37301:3;37297:14;37282:29;;37148:169;;;;:::o;37323:148::-;37425:11;37462:3;37447:18;;37323:148;;;;:::o;37477:305::-;37517:3;37536:20;37554:1;37536:20;:::i;:::-;37531:25;;37570:20;37588:1;37570:20;:::i;:::-;37565:25;;37724:1;37656:66;37652:74;37649:1;37646:81;37643:107;;;37730:18;;:::i;:::-;37643:107;37774:1;37771;37767:9;37760:16;;37477:305;;;;:::o;37788:185::-;37828:1;37845:20;37863:1;37845:20;:::i;:::-;37840:25;;37879:20;37897:1;37879:20;:::i;:::-;37874:25;;37918:1;37908:35;;37923:18;;:::i;:::-;37908:35;37965:1;37962;37958:9;37953:14;;37788:185;;;;:::o;37979:348::-;38019:7;38042:20;38060:1;38042:20;:::i;:::-;38037:25;;38076:20;38094:1;38076:20;:::i;:::-;38071:25;;38264:1;38196:66;38192:74;38189:1;38186:81;38181:1;38174:9;38167:17;38163:105;38160:131;;;38271:18;;:::i;:::-;38160:131;38319:1;38316;38312:9;38301:20;;37979:348;;;;:::o;38333:191::-;38373:4;38393:20;38411:1;38393:20;:::i;:::-;38388:25;;38427:20;38445:1;38427:20;:::i;:::-;38422:25;;38466:1;38463;38460:8;38457:34;;;38471:18;;:::i;:::-;38457:34;38516:1;38513;38509:9;38501:17;;38333:191;;;;:::o;38530:96::-;38567:7;38596:24;38614:5;38596:24;:::i;:::-;38585:35;;38530:96;;;:::o;38632:90::-;38666:7;38709:5;38702:13;38695:21;38684:32;;38632:90;;;:::o;38728:77::-;38765:7;38794:5;38783:16;;38728:77;;;:::o;38811:149::-;38847:7;38887:66;38880:5;38876:78;38865:89;;38811:149;;;:::o;38966:126::-;39003:7;39043:42;39036:5;39032:54;39021:65;;38966:126;;;:::o;39098:77::-;39135:7;39164:5;39153:16;;39098:77;;;:::o;39181:154::-;39265:6;39260:3;39255;39242:30;39327:1;39318:6;39313:3;39309:16;39302:27;39181:154;;;:::o;39341:307::-;39409:1;39419:113;39433:6;39430:1;39427:13;39419:113;;;39518:1;39513:3;39509:11;39503:18;39499:1;39494:3;39490:11;39483:39;39455:2;39452:1;39448:10;39443:15;;39419:113;;;39550:6;39547:1;39544:13;39541:101;;;39630:1;39621:6;39616:3;39612:16;39605:27;39541:101;39390:258;39341:307;;;:::o;39654:320::-;39698:6;39735:1;39729:4;39725:12;39715:22;;39782:1;39776:4;39772:12;39803:18;39793:81;;39859:4;39851:6;39847:17;39837:27;;39793:81;39921:2;39913:6;39910:14;39890:18;39887:38;39884:84;;;39940:18;;:::i;:::-;39884:84;39705:269;39654:320;;;:::o;39980:281::-;40063:27;40085:4;40063:27;:::i;:::-;40055:6;40051:40;40193:6;40181:10;40178:22;40157:18;40145:10;40142:34;40139:62;40136:88;;;40204:18;;:::i;:::-;40136:88;40244:10;40240:2;40233:22;40023:238;39980:281;;:::o;40267:233::-;40306:3;40329:24;40347:5;40329:24;:::i;:::-;40320:33;;40375:66;40368:5;40365:77;40362:103;;;40445:18;;:::i;:::-;40362:103;40492:1;40485:5;40481:13;40474:20;;40267:233;;;:::o;40506:100::-;40545:7;40574:26;40594:5;40574:26;:::i;:::-;40563:37;;40506:100;;;:::o;40612:94::-;40651:7;40680:20;40694:5;40680:20;:::i;:::-;40669:31;;40612:94;;;:::o;40712:176::-;40744:1;40761:20;40779:1;40761:20;:::i;:::-;40756:25;;40795:20;40813:1;40795:20;:::i;:::-;40790:25;;40834:1;40824:35;;40839:18;;:::i;:::-;40824:35;40880:1;40877;40873:9;40868:14;;40712:176;;;;:::o;40894:180::-;40942:77;40939:1;40932:88;41039:4;41036:1;41029:15;41063:4;41060:1;41053:15;41080:180;41128:77;41125:1;41118:88;41225:4;41222:1;41215:15;41249:4;41246:1;41239:15;41266:180;41314:77;41311:1;41304:88;41411:4;41408:1;41401:15;41435:4;41432:1;41425:15;41452:180;41500:77;41497:1;41490:88;41597:4;41594:1;41587:15;41621:4;41618:1;41611:15;41638:180;41686:77;41683:1;41676:88;41783:4;41780:1;41773:15;41807:4;41804:1;41797:15;41824:180;41872:77;41869:1;41862:88;41969:4;41966:1;41959:15;41993:4;41990:1;41983:15;42010:117;42119:1;42116;42109:12;42133:117;42242:1;42239;42232:12;42256:117;42365:1;42362;42355:12;42379:117;42488:1;42485;42478:12;42502:117;42611:1;42608;42601:12;42625:117;42734:1;42731;42724:12;42748:102;42789:6;42840:2;42836:7;42831:2;42824:5;42820:14;42816:28;42806:38;;42748:102;;;:::o;42856:94::-;42889:8;42937:5;42933:2;42929:14;42908:35;;42856:94;;;:::o;42956:230::-;43096:34;43092:1;43084:6;43080:14;43073:58;43165:13;43160:2;43152:6;43148:15;43141:38;42956:230;:::o;43192:237::-;43332:34;43328:1;43320:6;43316:14;43309:58;43401:20;43396:2;43388:6;43384:15;43377:45;43192:237;:::o;43435:225::-;43575:34;43571:1;43563:6;43559:14;43552:58;43644:8;43639:2;43631:6;43627:15;43620:33;43435:225;:::o;43666:224::-;43806:34;43802:1;43794:6;43790:14;43783:58;43875:7;43870:2;43862:6;43858:15;43851:32;43666:224;:::o;43896:178::-;44036:30;44032:1;44024:6;44020:14;44013:54;43896:178;:::o;44080:223::-;44220:34;44216:1;44208:6;44204:14;44197:58;44289:6;44284:2;44276:6;44272:15;44265:31;44080:223;:::o;44309:175::-;44449:27;44445:1;44437:6;44433:14;44426:51;44309:175;:::o;44490:180::-;44630:32;44626:1;44618:6;44614:14;44607:56;44490:180;:::o;44676:228::-;44816:34;44812:1;44804:6;44800:14;44793:58;44885:11;44880:2;44872:6;44868:15;44861:36;44676:228;:::o;44910:172::-;45050:24;45046:1;45038:6;45034:14;45027:48;44910:172;:::o;45088:223::-;45228:34;45224:1;45216:6;45212:14;45205:58;45297:6;45292:2;45284:6;45280:15;45273:31;45088:223;:::o;45317:249::-;45457:34;45453:1;45445:6;45441:14;45434:58;45526:32;45521:2;45513:6;45509:15;45502:57;45317:249;:::o;45572:182::-;45712:34;45708:1;45700:6;45696:14;45689:58;45572:182;:::o;45760:::-;45900:34;45896:1;45888:6;45884:14;45877:58;45760:182;:::o;45948:172::-;46088:24;46084:1;46076:6;46072:14;46065:48;45948:172;:::o;46126:234::-;46266:34;46262:1;46254:6;46250:14;46243:58;46335:17;46330:2;46322:6;46318:15;46311:42;46126:234;:::o;46366:174::-;46506:26;46502:1;46494:6;46490:14;46483:50;46366:174;:::o;46546:220::-;46686:34;46682:1;46674:6;46670:14;46663:58;46755:3;46750:2;46742:6;46738:15;46731:28;46546:220;:::o;46772:114::-;;:::o;46892:168::-;47032:20;47028:1;47020:6;47016:14;47009:44;46892:168;:::o;47066:231::-;47206:34;47202:1;47194:6;47190:14;47183:58;47275:14;47270:2;47262:6;47258:15;47251:39;47066:231;:::o;47303:174::-;47443:26;47439:1;47431:6;47427:14;47420:50;47303:174;:::o;47483:233::-;47623:34;47619:1;47611:6;47607:14;47600:58;47692:16;47687:2;47679:6;47675:15;47668:41;47483:233;:::o;47722:177::-;47862:29;47858:1;47850:6;47846:14;47839:53;47722:177;:::o;47905:122::-;47978:24;47996:5;47978:24;:::i;:::-;47971:5;47968:35;47958:63;;48017:1;48014;48007:12;47958:63;47905:122;:::o;48033:116::-;48103:21;48118:5;48103:21;:::i;:::-;48096:5;48093:32;48083:60;;48139:1;48136;48129:12;48083:60;48033:116;:::o;48155:122::-;48228:24;48246:5;48228:24;:::i;:::-;48221:5;48218:35;48208:63;;48267:1;48264;48257:12;48208:63;48155:122;:::o;48283:120::-;48355:23;48372:5;48355:23;:::i;:::-;48348:5;48345:34;48335:62;;48393:1;48390;48383:12;48335:62;48283:120;:::o;48409:122::-;48482:24;48500:5;48482:24;:::i;:::-;48475:5;48472:35;48462:63;;48521:1;48518;48511:12;48462:63;48409:122;:::o

Swarm Source

ipfs://24a354289f4588dd2216e751ef6b1d0a91f39ad3cbc6ccf7053bc4fa69107005
Loading