ETH Price: $2,818.92 (+7.40%)
 

Overview

Max Total Supply

347 DOJO

Holders

147

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
971220.eth
Balance
1 DOJO
0x303a82af561556ddd1d09b08596e714b9217b01f
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Yukimi

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 20000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-27
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.11;

/**
 * @dev These functions deal with verification of Merkle Trees 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.
 */
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 Returns the rebuilt hash obtained by traversing a Merklee 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++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}

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


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

pragma solidity ^0.8.11;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


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

pragma solidity ^0.8.11;

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

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

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

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

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

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


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

pragma solidity ^0.8.11;

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

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

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


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

pragma solidity ^0.8.11;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.11;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.11;

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

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


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

pragma solidity ^0.8.11;

/**
 * @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.11;


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

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


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

pragma solidity ^0.8.11;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.11;


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

    /**
     * @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.11;


/**
 * @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: contracts/Yukimi/ERC721M.sol


pragma solidity ^0.8.10;

abstract contract ERC721M is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    string private _name;
    string private _symbol;
    address[] internal _owners;
    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;     
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }     
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        uint count = 0;
        uint length = _owners.length;
        for( uint i = 0; i < length; ++i ){
          if( owner == _owners[i] ){
            ++count;
          }
        }
        delete length;
        return count;
    }
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }
    function name() public view virtual override returns (string memory) {
        return _name;
    }
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721M.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }     
    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");
    }
	function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return tokenId < _owners.length && _owners[tokenId] != address(0);
    }
	function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721M.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }
	function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }
	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"
        );
    }
	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);
        _owners.push(to);

        emit Transfer(address(0), to, tokenId);
    }
	function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721M.ownerOf(tokenId);

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

        // Clear approvals
        _approve(address(0), tokenId);
        _owners[tokenId] = address(0);

        emit Transfer(owner, address(0), tokenId);
    }
	function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721M.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }
	function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721M.ownerOf(tokenId), to, tokenId);
    }
	function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }
	function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}
// File: contracts/Yukimi/ERC721Enum.sol


pragma solidity ^0.8.10;


abstract contract ERC721Enum is ERC721M, IERC721Enumerable {
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721M) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256 tokenId) {
        require(index < ERC721M.balanceOf(owner), "ERC721Enum: owner ioob");
        uint count;
        for( uint i; i < _owners.length; ++i ){
            if( owner == _owners[i] ){
                if( count == index )
                    return i;
                else
                    ++count;
            }
        }
        require(false, "ERC721Enum: owner ioob");
    }
    function tokensOfOwner(address owner) public view returns (uint256[] memory) {
        require(0 < ERC721M.balanceOf(owner), "ERC721Enum: owner ioob");
        uint256 tokenCount = balanceOf(owner);
        uint256[] memory tokenIds = new uint256[](tokenCount);
        for (uint256 i = 0; i < tokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(owner, i);
        }
        return tokenIds;
    }
    function totalSupply() public view virtual override returns (uint256) {
        return _owners.length;
    }
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enum.totalSupply(), "ERC721Enum: global ioob");
        return index;
    }
}
// File: contracts/Yukimi.sol


pragma solidity ^0.8.11;


contract Yukimi is ERC721Enum, Ownable, ReentrancyGuard {
	using Strings for uint256;
	string private baseURI;
	bool public revealed = false;
	string public baseExtension =".json";
    string public notRevealedUri;
	uint256 public reserved = 100;
	
	uint256 public cost = 0.07 ether;
	uint256 public maxSupply = 7777;
	uint256 public maxMint = 8;
	bool public publicSaleOpen = false; // Sale is not active
    bool public preSaleIsActive = false; // Presale is not active

	
	bytes32 public merkleRoot = ""; 
	mapping(address => uint) public whitelistRemaining; 
	mapping(address => bool) public whitelistClaimed; 
	uint256 public constant maxMintAmount = 4; 
	

	event Mint(address indexed owner, uint indexed tokenId);

	constructor(
	string memory _initBaseURI,
    string memory _initNotRevealedUri) 
    ERC721M("Yukimi", "DOJO") {
        setBaseURI(_initBaseURI);
        setNotRevealedURI(_initNotRevealedUri);
    }

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

    // Sale active/inactive

	function setPublicSale(bool val) public onlyOwner {
        publicSaleOpen = val;
    }

    function setPreSale(bool val) public onlyOwner {
        preSaleIsActive = val;
    }

	function mint(uint256 amount) public payable nonReentrant{
	require(publicSaleOpen, "Sale is not Active" );
	uint256 s = totalSupply();
	require(amount > 0, "need to mint at least 1" );
	require(amount <= maxMint, "max mint amount per session exceeded");
	require(s + amount <= maxSupply, "max NFT limit exceeded" );
	require(msg.value >= cost * amount, "Value is over or under price.");
	for (uint256 i = 0; i < amount; ++i) {
	_safeMint(msg.sender, s + i, "");
	}
	}

	function mintReserved(uint256 _amount) public onlyOwner {
        require( _amount <= reserved, "Can't reserve more than set amount" );
        reserved -= _amount;
        uint256 s = totalSupply();
        for(uint256 i; i < _amount; i++){
            _safeMint( msg.sender, s + i );
        }
        delete s;
	}
    

    function whitelistMint(uint amount, bytes32 leaf, bytes32[] memory proof) external payable {
        require(preSaleIsActive, "Sale is not Active" );
    require(keccak256(abi.encodePacked(msg.sender)) == leaf, "Sender and amount don't match Merkle leaf");

     require(verify(merkleRoot, leaf, proof), "Not a valid leaf in the Merkle tree");


    uint256 s = totalSupply();
    require(s + amount <= maxSupply, "Sold out");
    require(amount <= maxMintAmount, "Surpasses maxMintAmount");

    require(amount > 0, "Can't mint zero");

    require(msg.value == amount * cost, "Send proper ETH amount");

    require(whitelistRemaining[msg.sender] + amount <= maxMintAmount, "Can't mint more than remaining allocation");

    whitelistRemaining[msg.sender] += amount;

    for (uint256 i = 0; i < amount; ++i) {
    _safeMint(msg.sender, s + i, "");
    }
	}

	function verify(bytes32 _merkleRoot, bytes32 leaf, bytes32[] memory proof) public pure returns (bool) {
        return MerkleProof.verify(proof, _merkleRoot, leaf);
    }

	function reveal() public onlyOwner() {
      revealed = true;
	  }
	  
	  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))
        : "";
  }

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

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

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

	function setMaxMintAmount(uint256 _newMaxMintAmount) public onlyOwner {
	maxMint = _newMaxMintAmount;
	}

	function setmaxSupply(uint256 _newMaxSupply) public onlyOwner {
	maxSupply = _newMaxSupply;
	}

	function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
        merkleRoot = _merkleRoot;
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[{"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":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Mint","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":"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":"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":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[],"name":"preSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"_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":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"setPreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"setPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxSupply","type":"uint256"}],"name":"setmaxSupply","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":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"bytes32","name":"leaf","type":"bytes32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"leaf","type":"bytes32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

6008805460ff1916905560c06040526005608081905264173539b7b760d91b60a090815262000032916009919062000247565b506064600b5566f8b0a10e470000600c55611e61600d556008600e55600f805461ffff1916905560006010553480156200006b57600080fd5b5060405162003bbd38038062003bbd8339810160408190526200008e91620003ba565b604080518082018252600681526559756b696d6960d01b602080830191825283518085019094526004845263444f4a4f60e01b908401528151919291620000d89160009162000247565b508051620000ee90600190602084019062000247565b5050506200010b620001056200012e60201b60201c565b62000132565b60016006556200011b8262000184565b6200012681620001ec565b505062000461565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005546001600160a01b03163314620001d35760405162461bcd60e51b8152602060048201819052602482015260008051602062003b9d83398151915260448201526064015b60405180910390fd5b8051620001e890600790602084019062000247565b5050565b6005546001600160a01b03163314620002375760405162461bcd60e51b8152602060048201819052602482015260008051602062003b9d8339815191526044820152606401620001ca565b8051620001e890600a9060208401905b828054620002559062000424565b90600052602060002090601f016020900481019282620002795760008555620002c4565b82601f106200029457805160ff1916838001178555620002c4565b82800160010185558215620002c4579182015b82811115620002c4578251825591602001919060010190620002a7565b50620002d2929150620002d6565b5090565b5b80821115620002d25760008155600101620002d7565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200031557600080fd5b81516001600160401b0380821115620003325762000332620002ed565b604051601f8301601f19908116603f011681019082821181831017156200035d576200035d620002ed565b816040528381526020925086838588010111156200037a57600080fd5b600091505b838210156200039e57858201830151818301840152908201906200037f565b83821115620003b05760008385830101525b9695505050505050565b60008060408385031215620003ce57600080fd5b82516001600160401b0380821115620003e657600080fd5b620003f48683870162000303565b935060208501519150808211156200040b57600080fd5b506200041a8582860162000303565b9150509250929050565b600181811c908216806200043957607f821691505b602082108114156200045b57634e487b7160e01b600052602260045260246000fd5b50919050565b61372c80620004716000396000f3fe6080604052600436106103085760003560e01c80636352211e1161019a578063b88d4fde116100e1578063e63ec9471161008a578063f2fde38b11610064578063f2fde38b14610896578063f9e23799146108b6578063fe60d12c146108d057600080fd5b8063e63ec947146107f3578063e985e9c514610820578063f2c4ce1e1461087657600080fd5b8063cebbaf55116100bb578063cebbaf551461079a578063d5abeb01146107ad578063db4bec44146107c357600080fd5b8063b88d4fde14610745578063c668286214610765578063c87b56dd1461077a57600080fd5b80638da5cb5b11610143578063a0712d681161011d578063a0712d68146106fd578063a22cb46514610710578063a475b5dd1461073057600080fd5b80638da5cb5b1461069d57806395d89b41146106c85780639a5d140b146106dd57600080fd5b80637501f741116101745780637501f7411461063a5780637cb64759146106505780638462151c1461067057600080fd5b80636352211e146105e557806370a0823114610605578063715018a61461062557600080fd5b8063239c70ae1161025e57806342842e0e1161020757806351830227116101e1578063518302271461058b57806355f804b3146105a55780635aca1bb6146105c557600080fd5b806342842e0e1461052b57806344a0d68a1461054b5780634f6ccce71461056b57600080fd5b80632f745c59116102385780632f745c59146104e35780633423e548146105035780633ccfd60b1461052357600080fd5b8063239c70ae1461049857806323b872dd146104ad5780632eb4a7ab146104cd57600080fd5b8063095ea7b3116102c057806318160ddd1161029a57806318160ddd146104445780631f0234d814610459578063228025e81461047857600080fd5b8063095ea7b3146103e05780630d95ccc91461040057806313faede61461042057600080fd5b8063081812fc116102f1578063081812fc14610364578063081c8c44146103a9578063088a4ed0146103be57600080fd5b806301ffc9a71461030d57806306fdde0314610342575b600080fd5b34801561031957600080fd5b5061032d610328366004612f29565b6108e6565b60405190151581526020015b60405180910390f35b34801561034e57600080fd5b50610357610942565b6040516103399190612fbc565b34801561037057600080fd5b5061038461037f366004612fcf565b6109d4565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610339565b3480156103b557600080fd5b50610357610a7f565b3480156103ca57600080fd5b506103de6103d9366004612fcf565b610b0d565b005b3480156103ec57600080fd5b506103de6103fb366004613011565b610b79565b34801561040c57600080fd5b506103de61041b36600461304b565b610cd2565b34801561042c57600080fd5b50610436600c5481565b604051908152602001610339565b34801561045057600080fd5b50600254610436565b34801561046557600080fd5b50600f5461032d90610100900460ff1681565b34801561048457600080fd5b506103de610493366004612fcf565b610d70565b3480156104a457600080fd5b50610436600481565b3480156104b957600080fd5b506103de6104c8366004613066565b610ddc565b3480156104d957600080fd5b5061043660105481565b3480156104ef57600080fd5b506104366104fe366004613011565b610e63565b34801561050f57600080fd5b5061032d61051e3660046131a0565b610f7f565b6103de610f94565b34801561053757600080fd5b506103de610546366004613066565b611089565b34801561055757600080fd5b506103de610566366004612fcf565b6110a4565b34801561057757600080fd5b50610436610586366004612fcf565b611110565b34801561059757600080fd5b5060085461032d9060ff1681565b3480156105b157600080fd5b506103de6105c0366004613266565b61116d565b3480156105d157600080fd5b506103de6105e036600461304b565b6111eb565b3480156105f157600080fd5b50610384610600366004612fcf565b611283565b34801561061157600080fd5b506104366106203660046132af565b611330565b34801561063157600080fd5b506103de61142f565b34801561064657600080fd5b50610436600e5481565b34801561065c57600080fd5b506103de61066b366004612fcf565b6114a2565b34801561067c57600080fd5b5061069061068b3660046132af565b61150e565b60405161033991906132ca565b3480156106a957600080fd5b5060055473ffffffffffffffffffffffffffffffffffffffff16610384565b3480156106d457600080fd5b50610357611608565b3480156106e957600080fd5b506103de6106f8366004612fcf565b611617565b6103de61070b366004612fcf565b611740565b34801561071c57600080fd5b506103de61072b36600461330e565b6119be565b34801561073c57600080fd5b506103de611abb565b34801561075157600080fd5b506103de610760366004613341565b611b4f565b34801561077157600080fd5b50610357611bdd565b34801561078657600080fd5b50610357610795366004612fcf565b611bea565b6103de6107a83660046131a0565b611d62565b3480156107b957600080fd5b50610436600d5481565b3480156107cf57600080fd5b5061032d6107de3660046132af565b60126020526000908152604090205460ff1681565b3480156107ff57600080fd5b5061043661080e3660046132af565b60116020526000908152604090205481565b34801561082c57600080fd5b5061032d61083b3660046133bd565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260046020908152604080832093909416825291909152205460ff1690565b34801561088257600080fd5b506103de610891366004613266565b612140565b3480156108a257600080fd5b506103de6108b13660046132af565b6121ba565b3480156108c257600080fd5b50600f5461032d9060ff1681565b3480156108dc57600080fd5b50610436600b5481565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d6300000000000000000000000000000000000000000000000000000000148061093c575061093c826122b3565b92915050565b606060008054610951906133e7565b80601f016020809104026020016040519081016040528092919081815260200182805461097d906133e7565b80156109ca5780601f1061099f576101008083540402835291602001916109ca565b820191906000526020600020905b8154815290600101906020018083116109ad57829003601f168201915b5050505050905090565b60006109df82612396565b610a565760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600a8054610a8c906133e7565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab8906133e7565b8015610b055780601f10610ada57610100808354040283529160200191610b05565b820191906000526020600020905b815481529060010190602001808311610ae857829003601f168201915b505050505081565b60055473ffffffffffffffffffffffffffffffffffffffff163314610b745760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600e55565b6000610b8482611283565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c285760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610a4d565b3373ffffffffffffffffffffffffffffffffffffffff82161480610c515750610c51813361083b565b610cc35760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a4d565b610ccd83836123fa565b505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314610d395760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600f8054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b60055473ffffffffffffffffffffffffffffffffffffffff163314610dd75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600d55565b610de6338261249a565b610e585760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a4d565b610ccd8383836125d2565b6000610e6e83611330565b8210610ebc5760405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f62000000000000000000006044820152606401610a4d565b6000805b600254811015610f365760028181548110610edd57610edd61343b565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff86811691161415610f265783821415610f1a57915061093c9050565b610f2382613499565b91505b610f2f81613499565b9050610ec0565b5060405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f62000000000000000000006044820152606401610a4d565b6000610f8c8285856127a1565b949350505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314610ffb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600061101c60055473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff164760405160006040518083038185875af1925050503d8060008114611073576040519150601f19603f3d011682016040523d82523d6000602084013e611078565b606091505b505090508061108657600080fd5b50565b610ccd83838360405180602001604052806000815250611b4f565b60055473ffffffffffffffffffffffffffffffffffffffff16331461110b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600c55565b600061111b60025490565b82106111695760405162461bcd60e51b815260206004820152601760248201527f455243373231456e756d3a20676c6f62616c20696f6f620000000000000000006044820152606401610a4d565b5090565b60055473ffffffffffffffffffffffffffffffffffffffff1633146111d45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b80516111e7906007906020840190612e6b565b5050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146112525760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b600080600283815481106112995761129961343b565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1690508061093c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610a4d565b600073ffffffffffffffffffffffffffffffffffffffff82166113bb5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610a4d565b600254600090815b8181101561142657600281815481106113de576113de61343b565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff868116911614156114165761141383613499565b92505b61141f81613499565b90506113c3565b50909392505050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146114965760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b6114a060006127b7565b565b60055473ffffffffffffffffffffffffffffffffffffffff1633146115095760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b601055565b606061151982611330565b6000106115685760405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f62000000000000000000006044820152606401610a4d565b600061157383611330565b905060008167ffffffffffffffff811115611590576115906130a2565b6040519080825280602002602001820160405280156115b9578160200160208202803683370190505b50905060005b82811015611600576115d18582610e63565b8282815181106115e3576115e361343b565b6020908102919091010152806115f881613499565b9150506115bf565b509392505050565b606060018054610951906133e7565b60055473ffffffffffffffffffffffffffffffffffffffff16331461167e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600b548111156116f65760405162461bcd60e51b815260206004820152602260248201527f43616e27742072657365727665206d6f7265207468616e2073657420616d6f7560448201527f6e740000000000000000000000000000000000000000000000000000000000006064820152608401610a4d565b80600b600082825461170891906134d2565b909155505060025460005b82811015610ccd5761172e3361172983856134e9565b61282e565b8061173881613499565b915050611713565b600260065414156117935760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a4d565b6002600655600f5460ff166117ea5760405162461bcd60e51b815260206004820152601260248201527f53616c65206973206e6f742041637469766500000000000000000000000000006044820152606401610a4d565b60006117f560025490565b9050600082116118475760405162461bcd60e51b815260206004820152601760248201527f6e65656420746f206d696e74206174206c6561737420310000000000000000006044820152606401610a4d565b600e548211156118be5760405162461bcd60e51b8152602060048201526024808201527f6d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560448201527f65646564000000000000000000000000000000000000000000000000000000006064820152608401610a4d565b600d546118cb83836134e9565b11156119195760405162461bcd60e51b815260206004820152601660248201527f6d6178204e4654206c696d6974206578636565646564000000000000000000006044820152606401610a4d565b81600c546119279190613501565b3410156119765760405162461bcd60e51b815260206004820152601d60248201527f56616c7565206973206f766572206f7220756e6465722070726963652e0000006044820152606401610a4d565b60005b828110156119b4576119a43361198f83856134e9565b60405180602001604052806000815250612844565b6119ad81613499565b9050611979565b5050600160065550565b73ffffffffffffffffffffffffffffffffffffffff8216331415611a245760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a4d565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60055473ffffffffffffffffffffffffffffffffffffffff163314611b225760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b611b59338361249a565b611bcb5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a4d565b611bd7848484846128cd565b50505050565b60098054610a8c906133e7565b6060611bf582612396565b611c675760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610a4d565b60085460ff16611d0357600a8054611c7e906133e7565b80601f0160208091040260200160405190810160405280929190818152602001828054611caa906133e7565b8015611cf75780601f10611ccc57610100808354040283529160200191611cf7565b820191906000526020600020905b815481529060010190602001808311611cda57829003601f168201915b50505050509050919050565b6000611d0d612956565b90506000815111611d2d5760405180602001604052806000815250611d5b565b80611d3784612965565b6009604051602001611d4b9392919061353e565b6040516020818303038152906040525b9392505050565b600f54610100900460ff16611db95760405162461bcd60e51b815260206004820152601260248201527f53616c65206973206e6f742041637469766500000000000000000000000000006044820152606401610a4d565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b16602082015282906034016040516020818303038152906040528051906020012014611e755760405162461bcd60e51b815260206004820152602960248201527f53656e64657220616e6420616d6f756e7420646f6e2774206d61746368204d6560448201527f726b6c65206c65616600000000000000000000000000000000000000000000006064820152608401610a4d565b611e826010548383610f7f565b611ef45760405162461bcd60e51b815260206004820152602360248201527f4e6f7420612076616c6964206c65616620696e20746865204d65726b6c65207460448201527f72656500000000000000000000000000000000000000000000000000000000006064820152608401610a4d565b6000611eff60025490565b600d54909150611f0f85836134e9565b1115611f5d5760405162461bcd60e51b815260206004820152600860248201527f536f6c64206f75740000000000000000000000000000000000000000000000006044820152606401610a4d565b6004841115611fae5760405162461bcd60e51b815260206004820152601760248201527f537572706173736573206d61784d696e74416d6f756e740000000000000000006044820152606401610a4d565b60008411611ffe5760405162461bcd60e51b815260206004820152600f60248201527f43616e2774206d696e74207a65726f00000000000000000000000000000000006044820152606401610a4d565b600c5461200b9085613501565b34146120595760405162461bcd60e51b815260206004820152601660248201527f53656e642070726f7065722045544820616d6f756e74000000000000000000006044820152606401610a4d565b336000908152601160205260409020546004906120779086906134e9565b11156120eb5760405162461bcd60e51b815260206004820152602960248201527f43616e2774206d696e74206d6f7265207468616e2072656d61696e696e67206160448201527f6c6c6f636174696f6e00000000000000000000000000000000000000000000006064820152608401610a4d565b336000908152601160205260408120805486929061210a9084906134e9565b90915550600090505b84811015612139576121293361198f83856134e9565b61213281613499565b9050612113565b5050505050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146121a75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b80516111e790600a906020840190612e6b565b60055473ffffffffffffffffffffffffffffffffffffffff1633146122215760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b73ffffffffffffffffffffffffffffffffffffffff81166122aa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a4d565b611086816127b7565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061234657507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061093c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461093c565b6002546000908210801561093c5750600073ffffffffffffffffffffffffffffffffffffffff16600283815481106123d0576123d061343b565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141592915050565b600081815260036020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416908117909155819061245482611283565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006124a582612396565b6125175760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a4d565b600061252283611283565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061259157508373ffffffffffffffffffffffffffffffffffffffff16612579846109d4565b73ffffffffffffffffffffffffffffffffffffffff16145b80610f8c575073ffffffffffffffffffffffffffffffffffffffff80821660009081526004602090815260408083209388168352929052205460ff16610f8c565b8273ffffffffffffffffffffffffffffffffffffffff166125f282611283565b73ffffffffffffffffffffffffffffffffffffffff161461267b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610a4d565b73ffffffffffffffffffffffffffffffffffffffff82166127035760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610a4d565b61270e6000826123fa565b81600282815481106127225761272261343b565b6000918252602082200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b6000826127ae8584612a97565b14949350505050565b6005805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6111e78282604051806020016040528060008152505b61284e8383612b3b565b61285b6000848484612c95565b610ccd5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a4d565b6128d88484846125d2565b6128e484848484612c95565b611bd75760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a4d565b606060078054610951906133e7565b6060816129a557505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156129cf57806129b981613499565b91506129c89050600a83613668565b91506129a9565b60008167ffffffffffffffff8111156129ea576129ea6130a2565b6040519080825280601f01601f191660200182016040528015612a14576020820181803683370190505b5090505b8415610f8c57612a296001836134d2565b9150612a36600a8661367c565b612a419060306134e9565b60f81b818381518110612a5657612a5661343b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a90600a86613668565b9450612a18565b600081815b8451811015611600576000858281518110612ab957612ab961343b565b60200260200101519050808311612afb576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612b28565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612b3381613499565b915050612a9c565b73ffffffffffffffffffffffffffffffffffffffff8216612b9e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a4d565b612ba781612396565b15612bf45760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a4d565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600073ffffffffffffffffffffffffffffffffffffffff84163b15612e60576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290612d0c903390899088908890600401613690565b6020604051808303816000875af1925050508015612d65575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612d62918101906136d9565b60015b612e15573d808015612d93576040519150601f19603f3d011682016040523d82523d6000602084013e612d98565b606091505b508051612e0d5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a4d565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050610f8c565b506001949350505050565b828054612e77906133e7565b90600052602060002090601f016020900481019282612e995760008555612edf565b82601f10612eb257805160ff1916838001178555612edf565b82800160010185558215612edf579182015b82811115612edf578251825591602001919060010190612ec4565b506111699291505b808211156111695760008155600101612ee7565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461108657600080fd5b600060208284031215612f3b57600080fd5b8135611d5b81612efb565b60005b83811015612f61578181015183820152602001612f49565b83811115611bd75750506000910152565b60008151808452612f8a816020860160208601612f46565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611d5b6020830184612f72565b600060208284031215612fe157600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461300c57600080fd5b919050565b6000806040838503121561302457600080fd5b61302d83612fe8565b946020939093013593505050565b8035801515811461300c57600080fd5b60006020828403121561305d57600080fd5b611d5b8261303b565b60008060006060848603121561307b57600080fd5b61308484612fe8565b925061309260208501612fe8565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613118576131186130a2565b604052919050565b600082601f83011261313157600080fd5b8135602067ffffffffffffffff82111561314d5761314d6130a2565b8160051b61315c8282016130d1565b928352848101820192828101908785111561317657600080fd5b83870192505b848310156131955782358252918301919083019061317c565b979650505050505050565b6000806000606084860312156131b557600080fd5b8335925060208401359150604084013567ffffffffffffffff8111156131da57600080fd5b6131e686828701613120565b9150509250925092565b600067ffffffffffffffff83111561320a5761320a6130a2565b61323b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016130d1565b905082815283838301111561324f57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561327857600080fd5b813567ffffffffffffffff81111561328f57600080fd5b8201601f810184136132a057600080fd5b610f8c848235602084016131f0565b6000602082840312156132c157600080fd5b611d5b82612fe8565b6020808252825182820181905260009190848201906040850190845b81811015613302578351835292840192918401916001016132e6565b50909695505050505050565b6000806040838503121561332157600080fd5b61332a83612fe8565b91506133386020840161303b565b90509250929050565b6000806000806080858703121561335757600080fd5b61336085612fe8565b935061336e60208601612fe8565b925060408501359150606085013567ffffffffffffffff81111561339157600080fd5b8501601f810187136133a257600080fd5b6133b1878235602084016131f0565b91505092959194509250565b600080604083850312156133d057600080fd5b6133d983612fe8565b915061333860208401612fe8565b600181811c908216806133fb57607f821691505b60208210811415613435577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156134cb576134cb61346a565b5060010190565b6000828210156134e4576134e461346a565b500390565b600082198211156134fc576134fc61346a565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135395761353961346a565b500290565b6000845160206135518285838a01612f46565b8551918401916135648184848a01612f46565b8554920191600090600181811c908083168061358157607f831692505b8583108114156135b8577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b8080156135cc57600181146135fb57613628565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00851688528388019550613628565b60008b81526020902060005b858110156136205781548a820152908401908801613607565b505083880195505b50939b9a5050505050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261367757613677613639565b500490565b60008261368b5761368b613639565b500690565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526136cf6080830184612f72565b9695505050505050565b6000602082840312156136eb57600080fd5b8151611d5b81612efb56fea264697066735822122008be6bda78131100a2dc9252e7ad5eb2f8184300ca1dc815929a526ef710a29464736f6c634300080b00334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65720000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d697066733a2f2f516d63645a4572616e785847726951793933314e31766f6a724c4d31384d3536764c7639776b707a4c33616534762f556e72657665616c65644d657461646174612e6a736f6e00000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103085760003560e01c80636352211e1161019a578063b88d4fde116100e1578063e63ec9471161008a578063f2fde38b11610064578063f2fde38b14610896578063f9e23799146108b6578063fe60d12c146108d057600080fd5b8063e63ec947146107f3578063e985e9c514610820578063f2c4ce1e1461087657600080fd5b8063cebbaf55116100bb578063cebbaf551461079a578063d5abeb01146107ad578063db4bec44146107c357600080fd5b8063b88d4fde14610745578063c668286214610765578063c87b56dd1461077a57600080fd5b80638da5cb5b11610143578063a0712d681161011d578063a0712d68146106fd578063a22cb46514610710578063a475b5dd1461073057600080fd5b80638da5cb5b1461069d57806395d89b41146106c85780639a5d140b146106dd57600080fd5b80637501f741116101745780637501f7411461063a5780637cb64759146106505780638462151c1461067057600080fd5b80636352211e146105e557806370a0823114610605578063715018a61461062557600080fd5b8063239c70ae1161025e57806342842e0e1161020757806351830227116101e1578063518302271461058b57806355f804b3146105a55780635aca1bb6146105c557600080fd5b806342842e0e1461052b57806344a0d68a1461054b5780634f6ccce71461056b57600080fd5b80632f745c59116102385780632f745c59146104e35780633423e548146105035780633ccfd60b1461052357600080fd5b8063239c70ae1461049857806323b872dd146104ad5780632eb4a7ab146104cd57600080fd5b8063095ea7b3116102c057806318160ddd1161029a57806318160ddd146104445780631f0234d814610459578063228025e81461047857600080fd5b8063095ea7b3146103e05780630d95ccc91461040057806313faede61461042057600080fd5b8063081812fc116102f1578063081812fc14610364578063081c8c44146103a9578063088a4ed0146103be57600080fd5b806301ffc9a71461030d57806306fdde0314610342575b600080fd5b34801561031957600080fd5b5061032d610328366004612f29565b6108e6565b60405190151581526020015b60405180910390f35b34801561034e57600080fd5b50610357610942565b6040516103399190612fbc565b34801561037057600080fd5b5061038461037f366004612fcf565b6109d4565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610339565b3480156103b557600080fd5b50610357610a7f565b3480156103ca57600080fd5b506103de6103d9366004612fcf565b610b0d565b005b3480156103ec57600080fd5b506103de6103fb366004613011565b610b79565b34801561040c57600080fd5b506103de61041b36600461304b565b610cd2565b34801561042c57600080fd5b50610436600c5481565b604051908152602001610339565b34801561045057600080fd5b50600254610436565b34801561046557600080fd5b50600f5461032d90610100900460ff1681565b34801561048457600080fd5b506103de610493366004612fcf565b610d70565b3480156104a457600080fd5b50610436600481565b3480156104b957600080fd5b506103de6104c8366004613066565b610ddc565b3480156104d957600080fd5b5061043660105481565b3480156104ef57600080fd5b506104366104fe366004613011565b610e63565b34801561050f57600080fd5b5061032d61051e3660046131a0565b610f7f565b6103de610f94565b34801561053757600080fd5b506103de610546366004613066565b611089565b34801561055757600080fd5b506103de610566366004612fcf565b6110a4565b34801561057757600080fd5b50610436610586366004612fcf565b611110565b34801561059757600080fd5b5060085461032d9060ff1681565b3480156105b157600080fd5b506103de6105c0366004613266565b61116d565b3480156105d157600080fd5b506103de6105e036600461304b565b6111eb565b3480156105f157600080fd5b50610384610600366004612fcf565b611283565b34801561061157600080fd5b506104366106203660046132af565b611330565b34801561063157600080fd5b506103de61142f565b34801561064657600080fd5b50610436600e5481565b34801561065c57600080fd5b506103de61066b366004612fcf565b6114a2565b34801561067c57600080fd5b5061069061068b3660046132af565b61150e565b60405161033991906132ca565b3480156106a957600080fd5b5060055473ffffffffffffffffffffffffffffffffffffffff16610384565b3480156106d457600080fd5b50610357611608565b3480156106e957600080fd5b506103de6106f8366004612fcf565b611617565b6103de61070b366004612fcf565b611740565b34801561071c57600080fd5b506103de61072b36600461330e565b6119be565b34801561073c57600080fd5b506103de611abb565b34801561075157600080fd5b506103de610760366004613341565b611b4f565b34801561077157600080fd5b50610357611bdd565b34801561078657600080fd5b50610357610795366004612fcf565b611bea565b6103de6107a83660046131a0565b611d62565b3480156107b957600080fd5b50610436600d5481565b3480156107cf57600080fd5b5061032d6107de3660046132af565b60126020526000908152604090205460ff1681565b3480156107ff57600080fd5b5061043661080e3660046132af565b60116020526000908152604090205481565b34801561082c57600080fd5b5061032d61083b3660046133bd565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260046020908152604080832093909416825291909152205460ff1690565b34801561088257600080fd5b506103de610891366004613266565b612140565b3480156108a257600080fd5b506103de6108b13660046132af565b6121ba565b3480156108c257600080fd5b50600f5461032d9060ff1681565b3480156108dc57600080fd5b50610436600b5481565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d6300000000000000000000000000000000000000000000000000000000148061093c575061093c826122b3565b92915050565b606060008054610951906133e7565b80601f016020809104026020016040519081016040528092919081815260200182805461097d906133e7565b80156109ca5780601f1061099f576101008083540402835291602001916109ca565b820191906000526020600020905b8154815290600101906020018083116109ad57829003601f168201915b5050505050905090565b60006109df82612396565b610a565760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600a8054610a8c906133e7565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab8906133e7565b8015610b055780601f10610ada57610100808354040283529160200191610b05565b820191906000526020600020905b815481529060010190602001808311610ae857829003601f168201915b505050505081565b60055473ffffffffffffffffffffffffffffffffffffffff163314610b745760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600e55565b6000610b8482611283565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c285760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610a4d565b3373ffffffffffffffffffffffffffffffffffffffff82161480610c515750610c51813361083b565b610cc35760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a4d565b610ccd83836123fa565b505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314610d395760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600f8054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b60055473ffffffffffffffffffffffffffffffffffffffff163314610dd75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600d55565b610de6338261249a565b610e585760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a4d565b610ccd8383836125d2565b6000610e6e83611330565b8210610ebc5760405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f62000000000000000000006044820152606401610a4d565b6000805b600254811015610f365760028181548110610edd57610edd61343b565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff86811691161415610f265783821415610f1a57915061093c9050565b610f2382613499565b91505b610f2f81613499565b9050610ec0565b5060405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f62000000000000000000006044820152606401610a4d565b6000610f8c8285856127a1565b949350505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314610ffb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600061101c60055473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff164760405160006040518083038185875af1925050503d8060008114611073576040519150601f19603f3d011682016040523d82523d6000602084013e611078565b606091505b505090508061108657600080fd5b50565b610ccd83838360405180602001604052806000815250611b4f565b60055473ffffffffffffffffffffffffffffffffffffffff16331461110b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600c55565b600061111b60025490565b82106111695760405162461bcd60e51b815260206004820152601760248201527f455243373231456e756d3a20676c6f62616c20696f6f620000000000000000006044820152606401610a4d565b5090565b60055473ffffffffffffffffffffffffffffffffffffffff1633146111d45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b80516111e7906007906020840190612e6b565b5050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146112525760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b600080600283815481106112995761129961343b565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1690508061093c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610a4d565b600073ffffffffffffffffffffffffffffffffffffffff82166113bb5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610a4d565b600254600090815b8181101561142657600281815481106113de576113de61343b565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff868116911614156114165761141383613499565b92505b61141f81613499565b90506113c3565b50909392505050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146114965760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b6114a060006127b7565b565b60055473ffffffffffffffffffffffffffffffffffffffff1633146115095760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b601055565b606061151982611330565b6000106115685760405162461bcd60e51b815260206004820152601660248201527f455243373231456e756d3a206f776e657220696f6f62000000000000000000006044820152606401610a4d565b600061157383611330565b905060008167ffffffffffffffff811115611590576115906130a2565b6040519080825280602002602001820160405280156115b9578160200160208202803683370190505b50905060005b82811015611600576115d18582610e63565b8282815181106115e3576115e361343b565b6020908102919091010152806115f881613499565b9150506115bf565b509392505050565b606060018054610951906133e7565b60055473ffffffffffffffffffffffffffffffffffffffff16331461167e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600b548111156116f65760405162461bcd60e51b815260206004820152602260248201527f43616e27742072657365727665206d6f7265207468616e2073657420616d6f7560448201527f6e740000000000000000000000000000000000000000000000000000000000006064820152608401610a4d565b80600b600082825461170891906134d2565b909155505060025460005b82811015610ccd5761172e3361172983856134e9565b61282e565b8061173881613499565b915050611713565b600260065414156117935760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a4d565b6002600655600f5460ff166117ea5760405162461bcd60e51b815260206004820152601260248201527f53616c65206973206e6f742041637469766500000000000000000000000000006044820152606401610a4d565b60006117f560025490565b9050600082116118475760405162461bcd60e51b815260206004820152601760248201527f6e65656420746f206d696e74206174206c6561737420310000000000000000006044820152606401610a4d565b600e548211156118be5760405162461bcd60e51b8152602060048201526024808201527f6d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560448201527f65646564000000000000000000000000000000000000000000000000000000006064820152608401610a4d565b600d546118cb83836134e9565b11156119195760405162461bcd60e51b815260206004820152601660248201527f6d6178204e4654206c696d6974206578636565646564000000000000000000006044820152606401610a4d565b81600c546119279190613501565b3410156119765760405162461bcd60e51b815260206004820152601d60248201527f56616c7565206973206f766572206f7220756e6465722070726963652e0000006044820152606401610a4d565b60005b828110156119b4576119a43361198f83856134e9565b60405180602001604052806000815250612844565b6119ad81613499565b9050611979565b5050600160065550565b73ffffffffffffffffffffffffffffffffffffffff8216331415611a245760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a4d565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60055473ffffffffffffffffffffffffffffffffffffffff163314611b225760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b611b59338361249a565b611bcb5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a4d565b611bd7848484846128cd565b50505050565b60098054610a8c906133e7565b6060611bf582612396565b611c675760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610a4d565b60085460ff16611d0357600a8054611c7e906133e7565b80601f0160208091040260200160405190810160405280929190818152602001828054611caa906133e7565b8015611cf75780601f10611ccc57610100808354040283529160200191611cf7565b820191906000526020600020905b815481529060010190602001808311611cda57829003601f168201915b50505050509050919050565b6000611d0d612956565b90506000815111611d2d5760405180602001604052806000815250611d5b565b80611d3784612965565b6009604051602001611d4b9392919061353e565b6040516020818303038152906040525b9392505050565b600f54610100900460ff16611db95760405162461bcd60e51b815260206004820152601260248201527f53616c65206973206e6f742041637469766500000000000000000000000000006044820152606401610a4d565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b16602082015282906034016040516020818303038152906040528051906020012014611e755760405162461bcd60e51b815260206004820152602960248201527f53656e64657220616e6420616d6f756e7420646f6e2774206d61746368204d6560448201527f726b6c65206c65616600000000000000000000000000000000000000000000006064820152608401610a4d565b611e826010548383610f7f565b611ef45760405162461bcd60e51b815260206004820152602360248201527f4e6f7420612076616c6964206c65616620696e20746865204d65726b6c65207460448201527f72656500000000000000000000000000000000000000000000000000000000006064820152608401610a4d565b6000611eff60025490565b600d54909150611f0f85836134e9565b1115611f5d5760405162461bcd60e51b815260206004820152600860248201527f536f6c64206f75740000000000000000000000000000000000000000000000006044820152606401610a4d565b6004841115611fae5760405162461bcd60e51b815260206004820152601760248201527f537572706173736573206d61784d696e74416d6f756e740000000000000000006044820152606401610a4d565b60008411611ffe5760405162461bcd60e51b815260206004820152600f60248201527f43616e2774206d696e74207a65726f00000000000000000000000000000000006044820152606401610a4d565b600c5461200b9085613501565b34146120595760405162461bcd60e51b815260206004820152601660248201527f53656e642070726f7065722045544820616d6f756e74000000000000000000006044820152606401610a4d565b336000908152601160205260409020546004906120779086906134e9565b11156120eb5760405162461bcd60e51b815260206004820152602960248201527f43616e2774206d696e74206d6f7265207468616e2072656d61696e696e67206160448201527f6c6c6f636174696f6e00000000000000000000000000000000000000000000006064820152608401610a4d565b336000908152601160205260408120805486929061210a9084906134e9565b90915550600090505b84811015612139576121293361198f83856134e9565b61213281613499565b9050612113565b5050505050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146121a75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b80516111e790600a906020840190612e6b565b60055473ffffffffffffffffffffffffffffffffffffffff1633146122215760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a4d565b73ffffffffffffffffffffffffffffffffffffffff81166122aa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a4d565b611086816127b7565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061234657507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061093c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461093c565b6002546000908210801561093c5750600073ffffffffffffffffffffffffffffffffffffffff16600283815481106123d0576123d061343b565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141592915050565b600081815260036020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416908117909155819061245482611283565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006124a582612396565b6125175760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610a4d565b600061252283611283565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061259157508373ffffffffffffffffffffffffffffffffffffffff16612579846109d4565b73ffffffffffffffffffffffffffffffffffffffff16145b80610f8c575073ffffffffffffffffffffffffffffffffffffffff80821660009081526004602090815260408083209388168352929052205460ff16610f8c565b8273ffffffffffffffffffffffffffffffffffffffff166125f282611283565b73ffffffffffffffffffffffffffffffffffffffff161461267b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610a4d565b73ffffffffffffffffffffffffffffffffffffffff82166127035760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610a4d565b61270e6000826123fa565b81600282815481106127225761272261343b565b6000918252602082200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b6000826127ae8584612a97565b14949350505050565b6005805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6111e78282604051806020016040528060008152505b61284e8383612b3b565b61285b6000848484612c95565b610ccd5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a4d565b6128d88484846125d2565b6128e484848484612c95565b611bd75760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a4d565b606060078054610951906133e7565b6060816129a557505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156129cf57806129b981613499565b91506129c89050600a83613668565b91506129a9565b60008167ffffffffffffffff8111156129ea576129ea6130a2565b6040519080825280601f01601f191660200182016040528015612a14576020820181803683370190505b5090505b8415610f8c57612a296001836134d2565b9150612a36600a8661367c565b612a419060306134e9565b60f81b818381518110612a5657612a5661343b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a90600a86613668565b9450612a18565b600081815b8451811015611600576000858281518110612ab957612ab961343b565b60200260200101519050808311612afb576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612b28565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612b3381613499565b915050612a9c565b73ffffffffffffffffffffffffffffffffffffffff8216612b9e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a4d565b612ba781612396565b15612bf45760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a4d565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600073ffffffffffffffffffffffffffffffffffffffff84163b15612e60576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290612d0c903390899088908890600401613690565b6020604051808303816000875af1925050508015612d65575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612d62918101906136d9565b60015b612e15573d808015612d93576040519150601f19603f3d011682016040523d82523d6000602084013e612d98565b606091505b508051612e0d5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610a4d565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050610f8c565b506001949350505050565b828054612e77906133e7565b90600052602060002090601f016020900481019282612e995760008555612edf565b82601f10612eb257805160ff1916838001178555612edf565b82800160010185558215612edf579182015b82811115612edf578251825591602001919060010190612ec4565b506111699291505b808211156111695760008155600101612ee7565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461108657600080fd5b600060208284031215612f3b57600080fd5b8135611d5b81612efb565b60005b83811015612f61578181015183820152602001612f49565b83811115611bd75750506000910152565b60008151808452612f8a816020860160208601612f46565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611d5b6020830184612f72565b600060208284031215612fe157600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461300c57600080fd5b919050565b6000806040838503121561302457600080fd5b61302d83612fe8565b946020939093013593505050565b8035801515811461300c57600080fd5b60006020828403121561305d57600080fd5b611d5b8261303b565b60008060006060848603121561307b57600080fd5b61308484612fe8565b925061309260208501612fe8565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613118576131186130a2565b604052919050565b600082601f83011261313157600080fd5b8135602067ffffffffffffffff82111561314d5761314d6130a2565b8160051b61315c8282016130d1565b928352848101820192828101908785111561317657600080fd5b83870192505b848310156131955782358252918301919083019061317c565b979650505050505050565b6000806000606084860312156131b557600080fd5b8335925060208401359150604084013567ffffffffffffffff8111156131da57600080fd5b6131e686828701613120565b9150509250925092565b600067ffffffffffffffff83111561320a5761320a6130a2565b61323b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116016130d1565b905082815283838301111561324f57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561327857600080fd5b813567ffffffffffffffff81111561328f57600080fd5b8201601f810184136132a057600080fd5b610f8c848235602084016131f0565b6000602082840312156132c157600080fd5b611d5b82612fe8565b6020808252825182820181905260009190848201906040850190845b81811015613302578351835292840192918401916001016132e6565b50909695505050505050565b6000806040838503121561332157600080fd5b61332a83612fe8565b91506133386020840161303b565b90509250929050565b6000806000806080858703121561335757600080fd5b61336085612fe8565b935061336e60208601612fe8565b925060408501359150606085013567ffffffffffffffff81111561339157600080fd5b8501601f810187136133a257600080fd5b6133b1878235602084016131f0565b91505092959194509250565b600080604083850312156133d057600080fd5b6133d983612fe8565b915061333860208401612fe8565b600181811c908216806133fb57607f821691505b60208210811415613435577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156134cb576134cb61346a565b5060010190565b6000828210156134e4576134e461346a565b500390565b600082198211156134fc576134fc61346a565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135395761353961346a565b500290565b6000845160206135518285838a01612f46565b8551918401916135648184848a01612f46565b8554920191600090600181811c908083168061358157607f831692505b8583108114156135b8577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b8080156135cc57600181146135fb57613628565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00851688528388019550613628565b60008b81526020902060005b858110156136205781548a820152908401908801613607565b505083880195505b50939b9a5050505050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261367757613677613639565b500490565b60008261368b5761368b613639565b500690565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526136cf6080830184612f72565b9695505050505050565b6000602082840312156136eb57600080fd5b8151611d5b81612efb56fea264697066735822122008be6bda78131100a2dc9252e7ad5eb2f8184300ca1dc815929a526ef710a29464736f6c634300080b0033

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

0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d697066733a2f2f516d63645a4572616e785847726951793933314e31766f6a724c4d31384d3536764c7639776b707a4c33616534762f556e72657665616c65644d657461646174612e6a736f6e00000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): 0
Arg [1] : _initNotRevealedUri (string): ipfs://QmcdZEranxXGriQy931N1vojrLM18M56vLv9wkpzL3ae4v/UnrevealedMetadata.json

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [3] : 3000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 000000000000000000000000000000000000000000000000000000000000004d
Arg [5] : 697066733a2f2f516d63645a4572616e785847726951793933314e31766f6a72
Arg [6] : 4c4d31384d3536764c7639776b707a4c33616534762f556e72657665616c6564
Arg [7] : 4d657461646174612e6a736f6e00000000000000000000000000000000000000


Deployed Bytecode Sourcemap

37380:4513:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35839:225;;;;;;;;;;-1:-1:-1;35839:225:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;35839:225:0;;;;;;;;29909:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30543:221::-;;;;;;;;;;-1:-1:-1;30543:221:0;;;;;:::i;:::-;;:::i;:::-;;;1809:42:1;1797:55;;;1779:74;;1767:2;1752:18;30543:221:0;1633:226:1;37570:28:0;;;;;;;;;;;;;:::i;41424:106::-;;;;;;;;;;-1:-1:-1;41424:106:0;;;;;:::i;:::-;;:::i;:::-;;30125:412;;;;;;;;;;-1:-1:-1;30125:412:0;;;;;:::i;:::-;;:::i;38560:87::-;;;;;;;;;;-1:-1:-1;38560:87:0;;;;;:::i;:::-;;:::i;37638:32::-;;;;;;;;;;;;;;;;;;;2820:25:1;;;2808:2;2793:18;37638:32:0;2674:177:1;37000:110:0;;;;;;;;;;-1:-1:-1;37088:7:0;:14;37000:110;;37802:35;;;;;;;;;;-1:-1:-1;37802:35:0;;;;;;;;;;;41535:96;;;;;;;;;;-1:-1:-1;41535:96:0;;;;;:::i;:::-;;:::i;38014:41::-;;;;;;;;;;;;38054:1;38014:41;;31241:339;;;;;;;;;;-1:-1:-1;31241:339:0;;;;;:::i;:::-;;:::i;37871:30::-;;;;;;;;;;;;;;;;36070:500;;;;;;;;;;-1:-1:-1;36070:500:0;;;;;:::i;:::-;;:::i;40359:172::-;;;;;;;;;;-1:-1:-1;40359:172:0;;;;;:::i;:::-;;:::i;41745:145::-;;;:::i;31586:185::-;;;;;;;;;;-1:-1:-1;31586:185:0;;;;;:::i;:::-;;:::i;41343:76::-;;;;;;;;;;-1:-1:-1;41343:76:0;;;;;:::i;:::-;;:::i;37116:194::-;;;;;;;;;;-1:-1:-1;37116:194:0;;;;;:::i;:::-;;:::i;37495:28::-;;;;;;;;;;-1:-1:-1;37495:28:0;;;;;;;;41244:94;;;;;;;;;;-1:-1:-1;41244:94:0;;;;;:::i;:::-;;:::i;38463:89::-;;;;;;;;;;-1:-1:-1;38463:89:0;;;;;:::i;:::-;;:::i;29664:239::-;;;;;;;;;;-1:-1:-1;29664:239:0;;;;;:::i;:::-;;:::i;29244:414::-;;;;;;;;;;-1:-1:-1;29244:414:0;;;;;:::i;:::-;;:::i;9695:103::-;;;;;;;;;;;;;:::i;37709:26::-;;;;;;;;;;;;;;;;41636:104;;;;;;;;;;-1:-1:-1;41636:104:0;;;;;:::i;:::-;;:::i;36576:418::-;;;;;;;;;;-1:-1:-1;36576:418:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;9044:87::-;;;;;;;;;;-1:-1:-1;9117:6:0;;;;9044:87;;30015:104;;;;;;;;;;;;;:::i;39135:324::-;;;;;;;;;;-1:-1:-1;39135:324:0;;;;;:::i;:::-;;:::i;38652:478::-;;;;;;:::i;:::-;;:::i;30770:295::-;;;;;;;;;;-1:-1:-1;30770:295:0;;;;;:::i;:::-;;:::i;40536:68::-;;;;;;;;;;;;;:::i;31777:328::-;;;;;;;;;;-1:-1:-1;31777:328:0;;;;;:::i;:::-;;:::i;37527:36::-;;;;;;;;;;;;;:::i;40614:497::-;;;;;;;;;;-1:-1:-1;40614:497:0;;;;;:::i;:::-;;:::i;39473:881::-;;;;;;:::i;:::-;;:::i;37674:31::-;;;;;;;;;;;;;;;;37961:48;;;;;;;;;;-1:-1:-1;37961:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;37906:50;;;;;;;;;;-1:-1:-1;37906:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;31071:164;;;;;;;;;;-1:-1:-1;31071:164:0;;;;;:::i;:::-;31192:25;;;;31168:4;31192:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;31071:164;41116:120;;;;;;;;;;-1:-1:-1;41116:120:0;;;;;:::i;:::-;;:::i;9953:201::-;;;;;;;;;;-1:-1:-1;9953:201:0;;;;;:::i;:::-;;:::i;37739:34::-;;;;;;;;;;-1:-1:-1;37739:34:0;;;;;;;;37602:29;;;;;;;;;;;;;;;;35839:225;35942:4;35966:50;;;35981:35;35966:50;;:90;;;36020:36;36044:11;36020:23;:36::i;:::-;35959:97;35839:225;-1:-1:-1;;35839:225:0:o;29909:100::-;29963:13;29996:5;29989:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29909:100;:::o;30543:221::-;30619:7;30647:16;30655:7;30647;:16::i;:::-;30639:73;;;;-1:-1:-1;;;30639:73:0;;9374:2:1;30639:73:0;;;9356:21:1;9413:2;9393:18;;;9386:30;9452:34;9432:18;;;9425:62;9523:14;9503:18;;;9496:42;9555:19;;30639:73:0;;;;;;;;;-1:-1:-1;30732:24:0;;;;:15;:24;;;;;;;;;30543:221::o;37570:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41424:106::-;9117:6;;9264:23;9117:6;7847:10;9264:23;9256:68;;;;-1:-1:-1;;;9256:68:0;;9787:2:1;9256:68:0;;;9769:21:1;;;9806:18;;;9799:30;9865:34;9845:18;;;9838:62;9917:18;;9256:68:0;9585:356:1;9256:68:0;41498:7:::1;:27:::0;41424:106::o;30125:412::-;30206:13;30222:24;30238:7;30222:15;:24::i;:::-;30206:40;;30271:5;30265:11;;:2;:11;;;;30257:57;;;;-1:-1:-1;;;30257:57:0;;10148:2:1;30257:57:0;;;10130:21:1;10187:2;10167:18;;;10160:30;10226:34;10206:18;;;10199:62;10297:3;10277:18;;;10270:31;10318:19;;30257:57:0;9946:397:1;30257:57:0;7847:10;30349:21;;;;;:62;;-1:-1:-1;30374:37:0;30391:5;7847:10;31071:164;:::i;30374:37::-;30327:168;;;;-1:-1:-1;;;30327:168:0;;10550:2:1;30327:168:0;;;10532:21:1;10589:2;10569:18;;;10562:30;10628:34;10608:18;;;10601:62;10699:26;10679:18;;;10672:54;10743:19;;30327:168:0;10348:420:1;30327:168:0;30508:21;30517:2;30521:7;30508:8;:21::i;:::-;30195:342;30125:412;;:::o;38560:87::-;9117:6;;9264:23;9117:6;7847:10;9264:23;9256:68;;;;-1:-1:-1;;;9256:68:0;;9787:2:1;9256:68:0;;;9769:21:1;;;9806:18;;;9799:30;9865:34;9845:18;;;9838:62;9917:18;;9256:68:0;9585:356:1;9256:68:0;38618:15:::1;:21:::0;;;::::1;;;;::::0;;;::::1;::::0;;;::::1;::::0;;38560:87::o;41535:96::-;9117:6;;9264:23;9117:6;7847:10;9264:23;9256:68;;;;-1:-1:-1;;;9256:68:0;;9787:2:1;9256:68:0;;;9769:21:1;;;9806:18;;;9799:30;9865:34;9845:18;;;9838:62;9917:18;;9256:68:0;9585:356:1;9256:68:0;41601:9:::1;:25:::0;41535:96::o;31241:339::-;31436:41;7847:10;31469:7;31436:18;:41::i;:::-;31428:103;;;;-1:-1:-1;;;31428:103:0;;10975:2:1;31428:103:0;;;10957:21:1;11014:2;10994:18;;;10987:30;11053:34;11033:18;;;11026:62;11124:19;11104:18;;;11097:47;11161:19;;31428:103:0;10773:413:1;31428:103:0;31544:28;31554:4;31560:2;31564:7;31544:9;:28::i;36070:500::-;36159:15;36203:24;36221:5;36203:17;:24::i;:::-;36195:5;:32;36187:67;;;;-1:-1:-1;;;36187:67:0;;11393:2:1;36187:67:0;;;11375:21:1;11432:2;11412:18;;;11405:30;11471:24;11451:18;;;11444:52;11513:18;;36187:67:0;11191:346:1;36187:67:0;36265:10;36291:6;36286:226;36303:7;:14;36299:18;;36286:226;;;36352:7;36360:1;36352:10;;;;;;;;:::i;:::-;;;;;;;;;;;;36343:19;;;36352:10;;36343:19;36339:162;;;36396:5;36387;:14;36383:102;;;36432:1;-1:-1:-1;36425:8:0;;-1:-1:-1;36425:8:0;36383:102;36478:7;;;:::i;:::-;;;36383:102;36319:3;;;:::i;:::-;;;36286:226;;;-1:-1:-1;36522:40:0;;-1:-1:-1;;;36522:40:0;;11393:2:1;36522:40:0;;;11375:21:1;11432:2;11412:18;;;11405:30;11471:24;11451:18;;;11444:52;11513:18;;36522:40:0;11191:346:1;40359:172:0;40455:4;40479:44;40498:5;40505:11;40518:4;40479:18;:44::i;:::-;40472:51;40359:172;-1:-1:-1;;;;40359:172:0:o;41745:145::-;9117:6;;9264:23;9117:6;7847:10;9264:23;9256:68;;;;-1:-1:-1;;;9256:68:0;;9787:2:1;9256:68:0;;;9769:21:1;;;9806:18;;;9799:30;9865:34;9845:18;;;9838:62;9917:18;;9256:68:0;9585:356:1;9256:68:0;41798:7:::1;41819;9117:6:::0;;;;;9044:87;41819:7:::1;41811:21;;41840;41811:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41797:69;;;41881:2;41873:11;;;::::0;::::1;;41790:100;41745:145::o:0;31586:185::-;31724:39;31741:4;31747:2;31751:7;31724:39;;;;;;;;;;;;:16;:39::i;41343:76::-;9117:6;;9264:23;9117:6;7847:10;9264:23;9256:68;;;;-1:-1:-1;;;9256:68:0;;9787:2:1;9256:68:0;;;9769:21:1;;;9806:18;;;9799:30;9865:34;9845:18;;;9838:62;9917:18;;9256:68:0;9585:356:1;9256:68:0;41399:4:::1;:15:::0;41343:76::o;37116:194::-;37191:7;37227:24;37088:7;:14;;37000:110;37227:24;37219:5;:32;37211:68;;;;-1:-1:-1;;;37211:68:0;;12532:2:1;37211:68:0;;;12514:21:1;12571:2;12551:18;;;12544:30;12610:25;12590:18;;;12583:53;12653:18;;37211:68:0;12330:347:1;37211:68:0;-1:-1:-1;37297:5:0;37116:194::o;41244:94::-;9117:6;;9264:23;9117:6;7847:10;9264:23;9256:68;;;;-1:-1:-1;;;9256:68:0;;9787:2:1;9256:68:0;;;9769:21:1;;;9806:18;;;9799:30;9865:34;9845:18;;;9838:62;9917:18;;9256:68:0;9585:356:1;9256:68:0;41312:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;41244:94:::0;:::o;38463:89::-;9117:6;;9264:23;9117:6;7847:10;9264:23;9256:68;;;;-1:-1:-1;;;9256:68:0;;9787:2:1;9256:68:0;;;9769:21:1;;;9806:18;;;9799:30;9865:34;9845:18;;;9838:62;9917:18;;9256:68:0;9585:356:1;9256:68:0;38524:14:::1;:20:::0;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;38463:89::o;29664:239::-;29736:7;29756:13;29772:7;29780;29772:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;29807:19:0;29799:73;;;;-1:-1:-1;;;29799:73:0;;12884:2:1;29799:73:0;;;12866:21:1;12923:2;12903:18;;;12896:30;12962:34;12942:18;;;12935:62;13033:11;13013:18;;;13006:39;13062:19;;29799:73:0;12682:405:1;29244:414:0;29316:7;29344:19;;;29336:74;;;;-1:-1:-1;;;29336:74:0;;13294:2:1;29336:74:0;;;13276:21:1;13333:2;13313:18;;;13306:30;13372:34;13352:18;;;13345:62;13443:12;13423:18;;;13416:40;13473:19;;29336:74:0;13092:406:1;29336:74:0;29460:7;:14;29421:10;;;29485:119;29506:6;29502:1;:10;29485:119;;;29545:7;29553:1;29545:10;;;;;;;;:::i;:::-;;;;;;;;;;;;29536:19;;;29545:10;;29536:19;29532:61;;;29572:7;;;:::i;:::-;;;29532:61;29514:3;;;:::i;:::-;;;29485:119;;;-1:-1:-1;29645:5:0;;29244:414;-1:-1:-1;;;29244:414:0:o;9695:103::-;9117:6;;9264:23;9117:6;7847:10;9264:23;9256:68;;;;-1:-1:-1;;;9256:68:0;;9787:2:1;9256:68:0;;;9769:21:1;;;9806:18;;;9799:30;9865:34;9845:18;;;9838:62;9917:18;;9256:68:0;9585:356:1;9256:68:0;9760:30:::1;9787:1;9760:18;:30::i;:::-;9695:103::o:0;41636:104::-;9117:6;;9264:23;9117:6;7847:10;9264:23;9256:68;;;;-1:-1:-1;;;9256:68:0;;9787:2:1;9256:68:0;;;9769:21:1;;;9806:18;;;9799:30;9865:34;9845:18;;;9838:62;9917:18;;9256:68:0;9585:356:1;9256:68:0;41708:10:::1;:24:::0;41636:104::o;36576:418::-;36635:16;36676:24;36694:5;36676:17;:24::i;:::-;36672:1;:28;36664:63;;;;-1:-1:-1;;;36664:63:0;;11393:2:1;36664:63:0;;;11375:21:1;11432:2;11412:18;;;11405:30;11471:24;11451:18;;;11444:52;11513:18;;36664:63:0;11191:346:1;36664:63:0;36738:18;36759:16;36769:5;36759:9;:16::i;:::-;36738:37;;36786:25;36828:10;36814:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36814:25:0;;36786:53;;36855:9;36850:111;36874:10;36870:1;:14;36850:111;;;36920:29;36940:5;36947:1;36920:19;:29::i;:::-;36906:8;36915:1;36906:11;;;;;;;;:::i;:::-;;;;;;;;;;:43;36886:3;;;;:::i;:::-;;;;36850:111;;;-1:-1:-1;36978:8:0;36576:418;-1:-1:-1;;;36576:418:0:o;30015:104::-;30071:13;30104:7;30097:14;;;;;:::i;39135:324::-;9117:6;;9264:23;9117:6;7847:10;9264:23;9256:68;;;;-1:-1:-1;;;9256:68:0;;9787:2:1;9256:68:0;;;9769:21:1;;;9806:18;;;9799:30;9865:34;9845:18;;;9838:62;9917:18;;9256:68:0;9585:356:1;9256:68:0;39222:8:::1;;39211:7;:19;;39202:68;;;::::0;-1:-1:-1;;;39202:68:0;;13705:2:1;39202:68:0::1;::::0;::::1;13687:21:1::0;13744:2;13724:18;;;13717:30;13783:34;13763:18;;;13756:62;13854:4;13834:18;;;13827:32;13876:19;;39202:68:0::1;13503:398:1::0;39202:68:0::1;39293:7;39281:8;;:19;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;37088:7:0;:14;39351:9:::1;39347:89;39366:7;39362:1;:11;39347:89;;;39394:30;39405:10;39417:5;39421:1:::0;39417;:5:::1;:::i;:::-;39394:9;:30::i;:::-;39375:3:::0;::::1;::::0;::::1;:::i;:::-;;;;39347:89;;38652:478:::0;4015:1;4613:7;;:19;;4605:63;;;;-1:-1:-1;;;4605:63:0;;14371:2:1;4605:63:0;;;14353:21:1;14410:2;14390:18;;;14383:30;14449:33;14429:18;;;14422:61;14500:18;;4605:63:0;14169:355:1;4605:63:0;4015:1;4746:7;:18;38721:14:::1;::::0;::::1;;38713:46;;;::::0;-1:-1:-1;;;38713:46:0;;14731:2:1;38713:46:0::1;::::0;::::1;14713:21:1::0;14770:2;14750:18;;;14743:30;14809:20;14789:18;;;14782:48;14847:18;;38713:46:0::1;14529:342:1::0;38713:46:0::1;38763:9;38775:13;37088:7:::0;:14;;37000:110;38775:13:::1;38763:25;;38809:1;38800:6;:10;38792:47;;;::::0;-1:-1:-1;;;38792:47:0;;15078:2:1;38792:47:0::1;::::0;::::1;15060:21:1::0;15117:2;15097:18;;;15090:30;15156:25;15136:18;;;15129:53;15199:18;;38792:47:0::1;14876:347:1::0;38792:47:0::1;38861:7;;38851:6;:17;;38843:66;;;::::0;-1:-1:-1;;;38843:66:0;;15430:2:1;38843:66:0::1;::::0;::::1;15412:21:1::0;15469:2;15449:18;;;15442:30;15508:34;15488:18;;;15481:62;15579:6;15559:18;;;15552:34;15603:19;;38843:66:0::1;15228:400:1::0;38843:66:0::1;38935:9;::::0;38921:10:::1;38925:6:::0;38921:1;:10:::1;:::i;:::-;:23;;38913:59;;;::::0;-1:-1:-1;;;38913:59:0;;15835:2:1;38913:59:0::1;::::0;::::1;15817:21:1::0;15874:2;15854:18;;;15847:30;15913:24;15893:18;;;15886:52;15955:18;;38913:59:0::1;15633:346:1::0;38913:59:0::1;39004:6;38997:4;;:13;;;;:::i;:::-;38984:9;:26;;38976:68;;;::::0;-1:-1:-1;;;38976:68:0;;16419:2:1;38976:68:0::1;::::0;::::1;16401:21:1::0;16458:2;16438:18;;;16431:30;16497:31;16477:18;;;16470:59;16546:18;;38976:68:0::1;16217:353:1::0;38976:68:0::1;39053:9;39048:78;39072:6;39068:1;:10;39048:78;;;39089:32;39099:10;39111:5;39115:1:::0;39111;:5:::1;:::i;:::-;39089:32;;;;;;;;;;;::::0;:9:::1;:32::i;:::-;39080:3;::::0;::::1;:::i;:::-;;;39048:78;;;-1:-1:-1::0;;3971:1:0;4925:7;:22;-1:-1:-1;38652:478:0:o;30770:295::-;30873:24;;;7847:10;30873:24;;30865:62;;;;-1:-1:-1;;;30865:62:0;;16777:2:1;30865:62:0;;;16759:21:1;16816:2;16796:18;;;16789:30;16855:27;16835:18;;;16828:55;16900:18;;30865:62:0;16575:349:1;30865:62:0;7847:10;30940:32;;;;:18;:32;;;;;;;;;:42;;;;;;;;;;;;:53;;;;;;;;;;;;;31009:48;;586:41:1;;;30940:42:0;;7847:10;31009:48;;559:18:1;31009:48:0;;;;;;;30770:295;;:::o;40536:68::-;9117:6;;9264:23;9117:6;7847:10;9264:23;9256:68;;;;-1:-1:-1;;;9256:68:0;;9787:2:1;9256:68:0;;;9769:21:1;;;9806:18;;;9799:30;9865:34;9845:18;;;9838:62;9917:18;;9256:68:0;9585:356:1;9256:68:0;40582:8:::1;:15:::0;;;::::1;40593:4;40582:15;::::0;;40536:68::o;31777:328::-;31952:41;7847:10;31985:7;31952:18;:41::i;:::-;31944:103;;;;-1:-1:-1;;;31944:103:0;;10975:2:1;31944:103:0;;;10957:21:1;11014:2;10994:18;;;10987:30;11053:34;11033:18;;;11026:62;11124:19;11104:18;;;11097:47;11161:19;;31944:103:0;10773:413:1;31944:103:0;32058:39;32072:4;32078:2;32082:7;32091:5;32058:13;:39::i;:::-;31777:328;;;;:::o;37527:36::-;;;;;;;:::i;40614:497::-;40712:13;40753:16;40761:7;40753;:16::i;:::-;40737:97;;;;-1:-1:-1;;;40737:97:0;;17131:2:1;40737:97:0;;;17113:21:1;17170:2;17150:18;;;17143:30;17209:34;17189:18;;;17182:62;17280:17;17260:18;;;17253:45;17315:19;;40737:97:0;16929:411:1;40737:97:0;40850:8;;;;40847:62;;40887:14;40880:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40614:497;;;:::o;40847:62::-;40917:28;40948:10;:8;:10::i;:::-;40917:41;;41003:1;40978:14;40972:28;:32;:133;;;;;;;;;;;;;;;;;41040:14;41056:18;:7;:16;:18::i;:::-;41076:13;41023:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40972:133;40965:140;40614:497;-1:-1:-1;;;40614:497:0:o;39473:881::-;39583:15;;;;;;;39575:47;;;;-1:-1:-1;;;39575:47:0;;14731:2:1;39575:47:0;;;14713:21:1;14770:2;14750:18;;;14743:30;14809:20;14789:18;;;14782:48;14847:18;;39575:47:0;14529:342:1;39575:47:0;39647:28;;19280:66:1;39664:10:0;19267:2:1;19263:15;19259:88;39647:28:0;;;19247:101:1;39680:4:0;;19364:12:1;;39647:28:0;;;;;;;;;;;;39637:39;;;;;;:47;39629:101;;;;-1:-1:-1;;;39629:101:0;;19589:2:1;39629:101:0;;;19571:21:1;19628:2;19608:18;;;19601:30;19667:34;19647:18;;;19640:62;19738:11;19718:18;;;19711:39;19767:19;;39629:101:0;19387:405:1;39629:101:0;39748:31;39755:10;;39767:4;39773:5;39748:6;:31::i;:::-;39740:79;;;;-1:-1:-1;;;39740:79:0;;19999:2:1;39740:79:0;;;19981:21:1;20038:2;20018:18;;;20011:30;20077:34;20057:18;;;20050:62;20148:5;20128:18;;;20121:33;20171:19;;39740:79:0;19797:399:1;39740:79:0;39830:9;39842:13;37088:7;:14;;37000:110;39842:13;39884:9;;39830:25;;-1:-1:-1;39870:10:0;39874:6;39830:25;39870:10;:::i;:::-;:23;;39862:44;;;;-1:-1:-1;;;39862:44:0;;20403:2:1;39862:44:0;;;20385:21:1;20442:1;20422:18;;;20415:29;20480:10;20460:18;;;20453:38;20508:18;;39862:44:0;20201:331:1;39862:44:0;38054:1;39921:6;:23;;39913:59;;;;-1:-1:-1;;;39913:59:0;;20739:2:1;39913:59:0;;;20721:21:1;20778:2;20758:18;;;20751:30;20817:25;20797:18;;;20790:53;20860:18;;39913:59:0;20537:347:1;39913:59:0;39998:1;39989:6;:10;39981:38;;;;-1:-1:-1;;;39981:38:0;;21091:2:1;39981:38:0;;;21073:21:1;21130:2;21110:18;;;21103:30;21169:17;21149:18;;;21142:45;21204:18;;39981:38:0;20889:339:1;39981:38:0;40058:4;;40049:13;;:6;:13;:::i;:::-;40036:9;:26;40028:61;;;;-1:-1:-1;;;40028:61:0;;21435:2:1;40028:61:0;;;21417:21:1;21474:2;21454:18;;;21447:30;21513:24;21493:18;;;21486:52;21555:18;;40028:61:0;21233:346:1;40028:61:0;40125:10;40106:30;;;;:18;:30;;;;;;38054:1;;40106:39;;40139:6;;40106:39;:::i;:::-;:56;;40098:110;;;;-1:-1:-1;;;40098:110:0;;21786:2:1;40098:110:0;;;21768:21:1;21825:2;21805:18;;;21798:30;21864:34;21844:18;;;21837:62;21935:11;21915:18;;;21908:39;21964:19;;40098:110:0;21584:405:1;40098:110:0;40236:10;40217:30;;;;:18;:30;;;;;:40;;40251:6;;40217:30;:40;;40251:6;;40217:40;:::i;:::-;;;;-1:-1:-1;40271:9:0;;-1:-1:-1;40266:84:0;40290:6;40286:1;:10;40266:84;;;40310:32;40320:10;40332:5;40336:1;40332;:5;:::i;40310:32::-;40298:3;;;:::i;:::-;;;40266:84;;;;39564:790;39473:881;;;:::o;41116:120::-;9117:6;;9264:23;9117:6;7847:10;9264:23;9256:68;;;;-1:-1:-1;;;9256:68:0;;9787:2:1;9256:68:0;;;9769:21:1;;;9806:18;;;9799:30;9865:34;9845:18;;;9838:62;9917:18;;9256:68:0;9585:356:1;9256:68:0;41198:32;;::::1;::::0;:14:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;9953:201::-:0;9117:6;;9264:23;9117:6;7847:10;9264:23;9256:68;;;;-1:-1:-1;;;9256:68:0;;9787:2:1;9256:68:0;;;9769:21:1;;;9806:18;;;9799:30;9865:34;9845:18;;;9838:62;9917:18;;9256:68:0;9585:356:1;9256:68:0;10042:22:::1;::::0;::::1;10034:73;;;::::0;-1:-1:-1;;;10034:73:0;;22196:2:1;10034:73:0::1;::::0;::::1;22178:21:1::0;22235:2;22215:18;;;22208:30;22274:34;22254:18;;;22247:62;22345:8;22325:18;;;22318:36;22371:19;;10034:73:0::1;21994:402:1::0;10034:73:0::1;10118:28;10137:8;10118:18;:28::i;28933:305::-:0;29035:4;29072:40;;;29087:25;29072:40;;:105;;-1:-1:-1;29129:48:0;;;29144:33;29129:48;29072:105;:158;;;-1:-1:-1;21604:25:0;21589:40;;;;29194:36;21480:157;32434:155;32533:7;:14;32499:4;;32523:24;;:58;;;;;32579:1;32551:30;;:7;32559;32551:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;:30;;32516:65;32434:155;-1:-1:-1;;32434:155:0:o;34586:175::-;34661:24;;;;:15;:24;;;;;:29;;;;;;;;;;;;;:24;;34715;34661;34715:15;:24::i;:::-;34706:47;;;;;;;;;;;;34586:175;;:::o;32592:349::-;32685:4;32710:16;32718:7;32710;:16::i;:::-;32702:73;;;;-1:-1:-1;;;32702:73:0;;22603:2:1;32702:73:0;;;22585:21:1;22642:2;22622:18;;;22615:30;22681:34;22661:18;;;22654:62;22752:14;22732:18;;;22725:42;22784:19;;32702:73:0;22401:408:1;32702:73:0;32786:13;32802:24;32818:7;32802:15;:24::i;:::-;32786:40;;32856:5;32845:16;;:7;:16;;;:51;;;;32889:7;32865:31;;:20;32877:7;32865:11;:20::i;:::-;:31;;;32845:51;:87;;;-1:-1:-1;31192:25:0;;;;31168:4;31192:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;32900:32;31071:164;34066:517;34226:4;34198:32;;:24;34214:7;34198:15;:24::i;:::-;:32;;;34190:86;;;;-1:-1:-1;;;34190:86:0;;23016:2:1;34190:86:0;;;22998:21:1;23055:2;23035:18;;;23028:30;23094:34;23074:18;;;23067:62;23165:11;23145:18;;;23138:39;23194:19;;34190:86:0;22814:405:1;34190:86:0;34295:16;;;34287:65;;;;-1:-1:-1;;;34287:65:0;;23426:2:1;34287:65:0;;;23408:21:1;23465:2;23445:18;;;23438:30;23504:34;23484:18;;;23477:62;23575:6;23555:18;;;23548:34;23599:19;;34287:65:0;23224:400:1;34287:65:0;34469:29;34486:1;34490:7;34469:8;:29::i;:::-;34528:2;34509:7;34517;34509:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;;;;;;;;;;34548:27;;34567:7;;34548:27;;;;;;;;;;34509:16;34548:27;34066:517;;;:::o;942:190::-;1067:4;1120;1091:25;1104:5;1111:4;1091:12;:25::i;:::-;:33;;942:190;-1:-1:-1;;;;942:190:0:o;10314:191::-;10407:6;;;;10424:17;;;;;;;;;;;10457:40;;10407:6;;;10424:17;10407:6;;10457:40;;10388:16;;10457:40;10377:128;10314:191;:::o;32944:110::-;33020:26;33030:2;33034:7;33020:26;;;;;;;;;;;;33057:321;33187:18;33193:2;33197:7;33187:5;:18::i;:::-;33238:54;33269:1;33273:2;33277:7;33286:5;33238:22;:54::i;:::-;33216:154;;;;-1:-1:-1;;;33216:154:0;;23831:2:1;33216:154:0;;;23813:21:1;23870:2;23850:18;;;23843:30;23909:34;23889:18;;;23882:62;23980:20;23960:18;;;23953:48;24018:19;;33216:154:0;23629:414:1;32116:315:0;32273:28;32283:4;32289:2;32293:7;32273:9;:28::i;:::-;32320:48;32343:4;32349:2;32353:7;32362:5;32320:22;:48::i;:::-;32312:111;;;;-1:-1:-1;;;32312:111:0;;23831:2:1;32312:111:0;;;23813:21:1;23870:2;23850:18;;;23843:30;23909:34;23889:18;;;23882:62;23980:20;23960:18;;;23953:48;24018:19;;32312:111:0;23629:414:1;38338:89:0;38389:13;38415:7;38408:14;;;;;:::i;5328:723::-;5384:13;5605:10;5601:53;;-1:-1:-1;;5632:10:0;;;;;;;;;;;;;;;;;;5328:723::o;5601:53::-;5679:5;5664:12;5720:78;5727:9;;5720:78;;5753:8;;;;:::i;:::-;;-1:-1:-1;5776:10:0;;-1:-1:-1;5784:2:0;5776:10;;:::i;:::-;;;5720:78;;;5808:19;5840:6;5830:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5830:17:0;;5808:39;;5858:154;5865:10;;5858:154;;5892:11;5902:1;5892:11;;:::i;:::-;;-1:-1:-1;5961:10:0;5969:2;5961:5;:10;:::i;:::-;5948:24;;:2;:24;:::i;:::-;5935:39;;5918:6;5925;5918:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;5989:11:0;5998:2;5989:11;;:::i;:::-;;;5858:154;;1494:701;1577:7;1620:4;1577:7;1635:523;1659:5;:12;1655:1;:16;1635:523;;;1693:20;1716:5;1722:1;1716:8;;;;;;;;:::i;:::-;;;;;;;1693:31;;1759:12;1743;:28;1739:408;;1896:44;;;;;;24636:19:1;;;24671:12;;;24664:28;;;24708:12;;1896:44:0;;;;;;;;;;;;1886:55;;;;;;1871:70;;1739:408;;;2086:44;;;;;;24636:19:1;;;24671:12;;;24664:28;;;24708:12;;2086:44:0;;;;;;;;;;;;2076:55;;;;;;2061:70;;1739:408;-1:-1:-1;1673:3:0;;;;:::i;:::-;;;;1635:523;;33381:346;33461:16;;;33453:61;;;;-1:-1:-1;;;33453:61:0;;24933:2:1;33453:61:0;;;24915:21:1;;;24952:18;;;24945:30;25011:34;24991:18;;;24984:62;25063:18;;33453:61:0;24731:356:1;33453:61:0;33534:16;33542:7;33534;:16::i;:::-;33533:17;33525:58;;;;-1:-1:-1;;;33525:58:0;;25294:2:1;33525:58:0;;;25276:21:1;25333:2;25313:18;;;25306:30;25372;25352:18;;;25345:58;25420:18;;33525:58:0;25092:352:1;33525:58:0;33652:7;:16;;;;;;;-1:-1:-1;33652:16:0;;;;;;;;;;;;;;;;;;33686:33;;33711:7;;-1:-1:-1;33686:33:0;;-1:-1:-1;;33686:33:0;33381:346;;:::o;34764:799::-;34919:4;34940:13;;;11656:20;11704:8;34936:620;;34976:72;;;;;:36;;;;;;:72;;7847:10;;35027:4;;35033:7;;35042:5;;34976:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34976:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34972:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35218:13:0;;35214:272;;35261:60;;-1:-1:-1;;;35261:60:0;;23831:2:1;35261:60:0;;;23813:21:1;23870:2;23850:18;;;23843:30;23909:34;23889:18;;;23882:62;23980:20;23960:18;;;23953:48;24018:19;;35261:60:0;23629:414:1;35214:272:0;35436:6;35430:13;35421:6;35417:2;35413:15;35406:38;34972:529;35099:51;;35109:41;35099:51;;-1:-1:-1;35092:58:0;;34936:620;-1:-1:-1;35540:4:0;34764:799;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:177:1;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;638:258::-;710:1;720:113;734:6;731:1;728:13;720:113;;;810:11;;;804:18;791:11;;;784:39;756:2;749:10;720:113;;;851:6;848:1;845:13;842:48;;;-1:-1:-1;;886:1:1;868:16;;861:27;638:258::o;901:317::-;943:3;981:5;975:12;1008:6;1003:3;996:19;1024:63;1080:6;1073:4;1068:3;1064:14;1057:4;1050:5;1046:16;1024:63;:::i;:::-;1132:2;1120:15;1137:66;1116:88;1107:98;;;;1207:4;1103:109;;901:317;-1:-1:-1;;901:317:1:o;1223:220::-;1372:2;1361:9;1354:21;1335:4;1392:45;1433:2;1422:9;1418:18;1410:6;1392:45;:::i;1448:180::-;1507:6;1560:2;1548:9;1539:7;1535:23;1531:32;1528:52;;;1576:1;1573;1566:12;1528:52;-1:-1:-1;1599:23:1;;1448:180;-1:-1:-1;1448:180:1:o;1864:196::-;1932:20;;1992:42;1981:54;;1971:65;;1961:93;;2050:1;2047;2040:12;1961:93;1864:196;;;:::o;2065:254::-;2133:6;2141;2194:2;2182:9;2173:7;2169:23;2165:32;2162:52;;;2210:1;2207;2200:12;2162:52;2233:29;2252:9;2233:29;:::i;:::-;2223:39;2309:2;2294:18;;;;2281:32;;-1:-1:-1;;;2065:254:1:o;2324:160::-;2389:20;;2445:13;;2438:21;2428:32;;2418:60;;2474:1;2471;2464:12;2489:180;2545:6;2598:2;2586:9;2577:7;2573:23;2569:32;2566:52;;;2614:1;2611;2604:12;2566:52;2637:26;2653:9;2637:26;:::i;2856:328::-;2933:6;2941;2949;3002:2;2990:9;2981:7;2977:23;2973:32;2970:52;;;3018:1;3015;3008:12;2970:52;3041:29;3060:9;3041:29;:::i;:::-;3031:39;;3089:38;3123:2;3112:9;3108:18;3089:38;:::i;:::-;3079:48;;3174:2;3163:9;3159:18;3146:32;3136:42;;2856:328;;;;;:::o;3371:184::-;3423:77;3420:1;3413:88;3520:4;3517:1;3510:15;3544:4;3541:1;3534:15;3560:334;3631:2;3625:9;3687:2;3677:13;;3692:66;3673:86;3661:99;;3790:18;3775:34;;3811:22;;;3772:62;3769:88;;;3837:18;;:::i;:::-;3873:2;3866:22;3560:334;;-1:-1:-1;3560:334:1:o;3899:712::-;3953:5;4006:3;3999:4;3991:6;3987:17;3983:27;3973:55;;4024:1;4021;4014:12;3973:55;4060:6;4047:20;4086:4;4109:18;4105:2;4102:26;4099:52;;;4131:18;;:::i;:::-;4177:2;4174:1;4170:10;4200:28;4224:2;4220;4216:11;4200:28;:::i;:::-;4262:15;;;4332;;;4328:24;;;4293:12;;;;4364:15;;;4361:35;;;4392:1;4389;4382:12;4361:35;4428:2;4420:6;4416:15;4405:26;;4440:142;4456:6;4451:3;4448:15;4440:142;;;4522:17;;4510:30;;4473:12;;;;4560;;;;4440:142;;;4600:5;3899:712;-1:-1:-1;;;;;;;3899:712:1:o;4616:484::-;4718:6;4726;4734;4787:2;4775:9;4766:7;4762:23;4758:32;4755:52;;;4803:1;4800;4793:12;4755:52;4839:9;4826:23;4816:33;;4896:2;4885:9;4881:18;4868:32;4858:42;;4951:2;4940:9;4936:18;4923:32;4978:18;4970:6;4967:30;4964:50;;;5010:1;5007;5000:12;4964:50;5033:61;5086:7;5077:6;5066:9;5062:22;5033:61;:::i;:::-;5023:71;;;4616:484;;;;;:::o;5105:466::-;5170:5;5204:18;5196:6;5193:30;5190:56;;;5226:18;;:::i;:::-;5264:116;5374:4;5305:66;5300:2;5292:6;5288:15;5284:88;5280:99;5264:116;:::i;:::-;5255:125;;5403:6;5396:5;5389:21;5443:3;5434:6;5429:3;5425:16;5422:25;5419:45;;;5460:1;5457;5450:12;5419:45;5509:6;5504:3;5497:4;5490:5;5486:16;5473:43;5563:1;5556:4;5547:6;5540:5;5536:18;5532:29;5525:40;5105:466;;;;;:::o;5576:451::-;5645:6;5698:2;5686:9;5677:7;5673:23;5669:32;5666:52;;;5714:1;5711;5704:12;5666:52;5754:9;5741:23;5787:18;5779:6;5776:30;5773:50;;;5819:1;5816;5809:12;5773:50;5842:22;;5895:4;5887:13;;5883:27;-1:-1:-1;5873:55:1;;5924:1;5921;5914:12;5873:55;5947:74;6013:7;6008:2;5995:16;5990:2;5986;5982:11;5947:74;:::i;6032:186::-;6091:6;6144:2;6132:9;6123:7;6119:23;6115:32;6112:52;;;6160:1;6157;6150:12;6112:52;6183:29;6202:9;6183:29;:::i;6408:632::-;6579:2;6631:21;;;6701:13;;6604:18;;;6723:22;;;6550:4;;6579:2;6802:15;;;;6776:2;6761:18;;;6550:4;6845:169;6859:6;6856:1;6853:13;6845:169;;;6920:13;;6908:26;;6989:15;;;;6954:12;;;;6881:1;6874:9;6845:169;;;-1:-1:-1;7031:3:1;;6408:632;-1:-1:-1;;;;;;6408:632:1:o;7045:254::-;7110:6;7118;7171:2;7159:9;7150:7;7146:23;7142:32;7139:52;;;7187:1;7184;7177:12;7139:52;7210:29;7229:9;7210:29;:::i;:::-;7200:39;;7258:35;7289:2;7278:9;7274:18;7258:35;:::i;:::-;7248:45;;7045:254;;;;;:::o;7304:667::-;7399:6;7407;7415;7423;7476:3;7464:9;7455:7;7451:23;7447:33;7444:53;;;7493:1;7490;7483:12;7444:53;7516:29;7535:9;7516:29;:::i;:::-;7506:39;;7564:38;7598:2;7587:9;7583:18;7564:38;:::i;:::-;7554:48;;7649:2;7638:9;7634:18;7621:32;7611:42;;7704:2;7693:9;7689:18;7676:32;7731:18;7723:6;7720:30;7717:50;;;7763:1;7760;7753:12;7717:50;7786:22;;7839:4;7831:13;;7827:27;-1:-1:-1;7817:55:1;;7868:1;7865;7858:12;7817:55;7891:74;7957:7;7952:2;7939:16;7934:2;7930;7926:11;7891:74;:::i;:::-;7881:84;;;7304:667;;;;;;;:::o;8465:260::-;8533:6;8541;8594:2;8582:9;8573:7;8569:23;8565:32;8562:52;;;8610:1;8607;8600:12;8562:52;8633:29;8652:9;8633:29;:::i;:::-;8623:39;;8681:38;8715:2;8704:9;8700:18;8681:38;:::i;8730:437::-;8809:1;8805:12;;;;8852;;;8873:61;;8927:4;8919:6;8915:17;8905:27;;8873:61;8980:2;8972:6;8969:14;8949:18;8946:38;8943:218;;;9017:77;9014:1;9007:88;9118:4;9115:1;9108:15;9146:4;9143:1;9136:15;8943:218;;8730:437;;;:::o;11542:184::-;11594:77;11591:1;11584:88;11691:4;11688:1;11681:15;11715:4;11712:1;11705:15;11731:184;11783:77;11780:1;11773:88;11880:4;11877:1;11870:15;11904:4;11901:1;11894:15;11920:195;11959:3;11990:66;11983:5;11980:77;11977:103;;;12060:18;;:::i;:::-;-1:-1:-1;12107:1:1;12096:13;;11920:195::o;13906:125::-;13946:4;13974:1;13971;13968:8;13965:34;;;13979:18;;:::i;:::-;-1:-1:-1;14016:9:1;;13906:125::o;14036:128::-;14076:3;14107:1;14103:6;14100:1;14097:13;14094:39;;;14113:18;;:::i;:::-;-1:-1:-1;14149:9:1;;14036:128::o;15984:228::-;16024:7;16150:1;16082:66;16078:74;16075:1;16072:81;16067:1;16060:9;16053:17;16049:105;16046:131;;;16157:18;;:::i;:::-;-1:-1:-1;16197:9:1;;15984:228::o;17471:1642::-;17695:3;17733:6;17727:13;17759:4;17772:51;17816:6;17811:3;17806:2;17798:6;17794:15;17772:51;:::i;:::-;17886:13;;17845:16;;;;17908:55;17886:13;17845:16;17930:15;;;17908:55;:::i;:::-;18052:13;;17985:20;;;18025:1;;18112;18134:18;;;;18187;;;;18214:93;;18292:4;18282:8;18278:19;18266:31;;18214:93;18355:2;18345:8;18342:16;18322:18;18319:40;18316:224;;;18394:77;18389:3;18382:90;18495:4;18492:1;18485:15;18525:4;18520:3;18513:17;18316:224;18556:18;18583:168;;;;18765:1;18760:328;;;;18549:539;;18583:168;18633:66;18622:9;18618:82;18611:5;18604:97;18732:8;18725:5;18721:20;18714:27;;18583:168;;18760:328;17418:1;17411:14;;;17455:4;17442:18;;18855:1;18869:169;18883:8;18880:1;18877:15;18869:169;;;18965:14;;18950:13;;;18943:37;19008:16;;;;18900:10;;18869:169;;;18873:3;;19069:8;19062:5;19058:20;19051:27;;18549:539;-1:-1:-1;19104:3:1;;17471:1642;-1:-1:-1;;;;;;;;;;;17471:1642:1:o;24048:184::-;24100:77;24097:1;24090:88;24197:4;24194:1;24187:15;24221:4;24218:1;24211:15;24237:120;24277:1;24303;24293:35;;24308:18;;:::i;:::-;-1:-1:-1;24342:9:1;;24237:120::o;24362:112::-;24394:1;24420;24410:35;;24425:18;;:::i;:::-;-1:-1:-1;24459:9:1;;24362:112::o;25449:512::-;25643:4;25672:42;25753:2;25745:6;25741:15;25730:9;25723:34;25805:2;25797:6;25793:15;25788:2;25777:9;25773:18;25766:43;;25845:6;25840:2;25829:9;25825:18;25818:34;25888:3;25883:2;25872:9;25868:18;25861:31;25909:46;25950:3;25939:9;25935:19;25927:6;25909:46;:::i;:::-;25901:54;25449:512;-1:-1:-1;;;;;;25449:512:1:o;25966:249::-;26035:6;26088:2;26076:9;26067:7;26063:23;26059:32;26056:52;;;26104:1;26101;26094:12;26056:52;26136:9;26130:16;26155:30;26179:5;26155:30;:::i

Swarm Source

ipfs://08be6bda78131100a2dc9252e7ad5eb2f8184300ca1dc815929a526ef710a294
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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