ETH Price: $3,395.59 (+1.31%)
Gas: 7 Gwei

Token

Puzzlr (PUZZ)
 

Overview

Max Total Supply

339 PUZZ

Holders

314

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 PUZZ
0x410788a2ff8b2a984f10d493b0e9043252c82660
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:
Puzzlr

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 2000 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-07
*/

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/alloutwar_character.sol


//     _  _     _    _ _  ___        _ __        __         
//   _| || |_  / \  | | |/ _ \ _   _| |\ \      / /_ _ _ __ 
//  |_  ..  _|/ _ \ | | | | | | | | | __\ \ /\ / / _` | '__|
//  |_      _/ ___ \| | | |_| | |_| | |_ \ V  V / (_| | |   
//    |_||_|/_/   \_\_|_|\___/ \__,_|\__| \_/\_/ \__,_|_|   













pragma solidity ^0.8.1;

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

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

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

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

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

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

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

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

contract ERC721A is
    Context,
    ERC165,
    IERC721,
    IERC721Metadata,
    IERC721Enumerable
{
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 public currentIndex = 0;

    uint256 internal immutable collectionSize;
    uint256 internal immutable maxBatchSize;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) private _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

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

    /**
     * @dev
     * `maxBatchSize` refers to how much a minter can mint at a time.
     * `collectionSize_` refers to how many tokens are in the collection.
     */
    constructor(
        string memory name_,
        string memory symbol_,
        uint256 maxBatchSize_,
        uint256 collectionSize_
    ) {
        require(
            collectionSize_ > 0,
            "ERC721A: collection must have a nonzero supply"
        );
        require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
        _name = name_;
        _symbol = symbol_;
        maxBatchSize = maxBatchSize_;
        collectionSize = collectionSize_;
    }

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

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


    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) private {
        address owner = ERC721A.ownerOf(tokenId);

        _beforeTokenTransfers(owner, address(0), tokenId, 1);

        

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721A.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _addressData[owner].balance -= 1;
        }
        delete _ownerships[tokenId];

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

        _afterTokenTransfers(owner, address(0), tokenId,1);
    }


    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        override
        returns (uint256)
    {
        require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx = 0;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; i < numMintedSoFar; i++) {
            TokenOwnership memory ownership = _ownerships[i];
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                if (tokenIdsIdx == index) {
                    return i;
                }
                tokenIdsIdx++;
            }
        }
        revert("ERC721A: unable to get token of owner by index");
    }

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

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

    function _numberMinted(address owner) internal view returns (uint256) {
        require(
            owner != address(0),
            "ERC721A: number minted query for the zero address"
        );
        return uint256(_addressData[owner].numberMinted);
    }

    function ownershipOf(uint256 tokenId)
        internal
        view
        returns (TokenOwnership memory)
    {
        require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

        uint256 lowestTokenToCheck;
        if (tokenId >= maxBatchSize) {
            lowestTokenToCheck = tokenId - maxBatchSize + 1;
        }

        for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
            TokenOwnership memory ownership = _ownerships[curr];
            if (ownership.addr != address(0)) {
                return ownership;
            }
        }

        revert("ERC721A: unable to determine the owner of token");
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        override
    {
        require(operator != _msgSender(), "ERC721A: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721A: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, "");
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - there must be `quantity` tokens remaining unminted in the total collection.
     * - `to` cannot be the zero address.
     * - `quantity` cannot be larger than the max batch size.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), "ERC721A: mint to the zero address");
        // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
        require(!_exists(startTokenId), "ERC721A: token already minted");
        require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        AddressData memory addressData = _addressData[to];
        _addressData[to] = AddressData(
            addressData.balance + uint128(quantity),
            addressData.numberMinted + uint128(quantity)
        );
        _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

        uint256 updatedIndex = startTokenId;

        for (uint256 i = 0; i < quantity; i++) {
            emit Transfer(address(0), to, updatedIndex);
            require(
                _checkOnERC721Received(address(0), to, updatedIndex, _data),
                "ERC721A: transfer to non ERC721Receiver implementer"
            );
            updatedIndex++;
        }

        currentIndex = updatedIndex;
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(
            isApprovedOrOwner,
            "ERC721A: transfer caller is not owner nor approved"
        );

        require(
            prevOwnership.addr == from,
            "ERC721A: transfer from incorrect owner"
        );
        require(to != address(0), "ERC721A: transfer to the zero address");

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        _addressData[from].balance -= 1;
        _addressData[to].balance += 1;
        _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

        // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId] = TokenOwnership(
                    prevOwnership.addr,
                    prevOwnership.startTimestamp
                );
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

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

    uint256 public nextOwnerToExplicitlySet = 0;

    /**
     * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
     */
    function _setOwnersExplicit(uint256 quantity) internal {
        uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
        require(quantity > 0, "quantity must be nonzero");
        uint256 endIndex = oldNextOwnerToSet + quantity - 1;
        if (endIndex > collectionSize - 1) {
            endIndex = collectionSize - 1;
        }
        // We know if the last one in the group exists, all in the group exist, due to serial ordering.
        require(_exists(endIndex), "not enough minted yet for this cleanup");
        for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
            if (_ownerships[i].addr == address(0)) {
                TokenOwnership memory ownership = ownershipOf(i);
                _ownerships[i] = TokenOwnership(
                    ownership.addr,
                    ownership.startTimestamp
                );
            }
        }
        nextOwnerToExplicitlySet = endIndex + 1;
    }

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

contract Puzzlr is ERC721A, Ownable {

    enum Status{ PAUSED, PUBLIC }
    event minted(uint256 count);
  

    uint public TOTAL_SIZE = 10000;
    uint public constant MAX_MINT = 10;
    uint public FREE_COUNT = 2501;
    uint public MINT_PRICE = 8800000000000000;
    Status public saleStatus = Status.PAUSED;

    mapping(address => uint256) ADDRESS_BLOCK_BOUGHT;
    mapping(address => bool)  hasMintedFree;

    string private baseURI = "https://metadata.puzzlrnft.com";

    constructor() ERC721A("Puzzlr", "PUZZ", 10, 200000) { 

    }

    modifier securityChecks() {
       require(msg.sender == tx.origin,"NO_CONTRACTS_ALLOWED");
       require(ADDRESS_BLOCK_BOUGHT[msg.sender] != block.timestamp,"CANT_MINT_SAME_BLOCK");
        _; 
    }

    function mint(uint count) external payable securityChecks {
        require(saleStatus != Status.PAUSED, "PuzzlrPlay2Earn: Sales are off");
        require(totalSupply() + count <= TOTAL_SIZE, "PuzzlrPlay2Earn: Number of requested tokens will exceed collection size");
        require(numberMinted(msg.sender) + count <= MAX_MINT, "PuzzlrPlay2Earn: Number of requested tokens exceeds allowance (10)");
        require(msg.value >= payableAmount(count), "PuzzlrPlay2Earn: Ether value sent is not sufficient");
        ADDRESS_BLOCK_BOUGHT[msg.sender] = block.timestamp;
        _safeMint(msg.sender, count);
    }

    function payableAmount(uint count) public returns(uint) {
        require(saleStatus != Status.PAUSED, "PuzzlrPlay2Earn: Sales are off");
        require(msg.sender != address(0));

        if(!hasMintedFree[msg.sender]) {
            if(FREE_COUNT > 0) {
                count -= 1;
                FREE_COUNT -= 1;
                hasMintedFree[msg.sender] = true;
            }
        }

        uint price = MINT_PRICE;
        return count * price;
    }


    function setBaseURI(string calldata URI) external onlyOwner {
        baseURI = URI;
    }

    // Allow both owner and marketing to call withdraw
    function withdraw() external onlyOwner {
        require(address(this).balance > 0, "No balance to withdraw");
        uint256 balance = address(this).balance;
        payable(owner()).transfer(balance);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(_exists(tokenId),"Token not minted yet");
        
        return string(abi.encodePacked(
            baseURI,"/meta/",
            Strings.toString(tokenId),
            ".json"));
    }

    function contractURI() public view returns (string memory) {
        return string(abi.encodePacked(baseURI,"/meta/contract.json"));
    }

    function tokensOfOwner(address owner)
        public
        view
        returns (uint256[] memory)
    {
        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 numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }
 
    function hasFreeMintDone(address wallet) external view returns (bool) {
        return hasMintedFree[wallet];
    }


    // Only Owner
    function setStatus(Status status) external onlyOwner {
        saleStatus = status;
    }

    function setPrice(uint256 _pubPrice) external onlyOwner {
        MINT_PRICE = _pubPrice;
    }

    function setFreeCount(uint count) external onlyOwner {
        FREE_COUNT = count;
    }

    function setTotal(uint count) external onlyOwner {
        TOTAL_SIZE = count;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"}],"name":"minted","type":"event"},{"inputs":[],"name":"FREE_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentIndex","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":"wallet","type":"address"}],"name":"hasFreeMintDone","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"payableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStatus","outputs":[{"internalType":"enum Puzzlr.Status","name":"","type":"uint8"}],"stateMutability":"view","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":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setFreeCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pubPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Puzzlr.Status","name":"status","type":"uint8"}],"name":"setStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setTotal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60008080556007556127106009556109c5600a55661f438daa060000600b55600c805460ff19169055610100604052601e60c08190527f68747470733a2f2f6d657461646174612e70757a7a6c726e66742e636f6d000060e09081526200006a91600f919062000225565b503480156200007857600080fd5b5060405180604001604052806006815260200165283abd3d363960d11b81525060405180604001604052806004815260200163282aad2d60e11b815250600a62030d4060008111620001285760405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b60648201526084015b60405180910390fd5b600082116200018a5760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b60648201526084016200011f565b83516200019f90600190602087019062000225565b508251620001b590600290602086019062000225565b5060a09190915260805250620001cd905033620001d3565b62000308565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200023390620002cb565b90600052602060002090601f016020900481019282620002575760008555620002a2565b82601f106200027257805160ff1916838001178555620002a2565b82800160010185558215620002a2579182015b82811115620002a257825182559160200191906001019062000285565b50620002b0929150620002b4565b5090565b5b80821115620002b05760008155600101620002b5565b600181811c90821680620002e057607f821691505b602082108114156200030257634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a051612bd36200033960003960008181611b3601528181611b600152612151015260005050612bd36000f3fe6080604052600436106102855760003560e01c8063715018a611610153578063c63b2f68116100cb578063e8a3d4851161007f578063f0292a0311610064578063f0292a0314610700578063f2fde38b14610715578063f9020e331461073557600080fd5b8063e8a3d485146106a2578063e985e9c5146106b757600080fd5b8063d7224ba0116100b0578063d7224ba014610633578063dc33e68114610649578063e502282a1461066957600080fd5b8063c63b2f68146105fd578063c87b56dd1461061357600080fd5b806395d89b4111610122578063a22cb46511610107578063a22cb465146105a7578063b88d4fde146105c7578063c002d23d146105e757600080fd5b806395d89b411461057f578063a0712d681461059457600080fd5b8063715018a6146104ff5780638462151c146105145780638da5cb5b1461054157806391b7f5ed1461055f57600080fd5b806326987b60116102015780634f6ccce7116101b55780636352211e1161019a5780636352211e1461049f5780636a420614146104bf57806370a08231146104df57600080fd5b80634f6ccce71461045f57806355f804b31461047f57600080fd5b80632f745c59116101e65780632f745c591461040a5780633ccfd60b1461042a57806342842e0e1461043f57600080fd5b806326987b60146103d45780632e49d78b146103ea57600080fd5b806316de56cb116102585780631f8d1d501161023d5780631f8d1d501461037457806323b872dd1461039457806324f314fe146103b457600080fd5b806316de56cb1461033b57806318160ddd1461035f57600080fd5b806301ffc9a71461028a57806306fdde03146102bf578063081812fc146102e1578063095ea7b314610319575b600080fd5b34801561029657600080fd5b506102aa6102a536600461268d565b61075c565b60405190151581526020015b60405180910390f35b3480156102cb57600080fd5b506102d461082d565b6040516102b69190612992565b3480156102ed57600080fd5b506103016102fc36600461275a565b6108bf565b6040516001600160a01b0390911681526020016102b6565b34801561032557600080fd5b50610339610334366004612663565b61095f565b005b34801561034757600080fd5b50610351600a5481565b6040519081526020016102b6565b34801561036b57600080fd5b50600054610351565b34801561038057600080fd5b5061033961038f36600461275a565b610a92565b3480156103a057600080fd5b506103396103af36600461250f565b610a9f565b3480156103c057600080fd5b506103516103cf36600461275a565b610aaa565b3480156103e057600080fd5b5061035160005481565b3480156103f657600080fd5b506103396104053660046126c7565b610b8f565b34801561041657600080fd5b50610351610425366004612663565b610bbd565b34801561043657600080fd5b50610339610d55565b34801561044b57600080fd5b5061033961045a36600461250f565b610dfc565b34801561046b57600080fd5b5061035161047a36600461275a565b610e17565b34801561048b57600080fd5b5061033961049a3660046126e8565b610e93565b3480156104ab57600080fd5b506103016104ba36600461275a565b610ea7565b3480156104cb57600080fd5b506103396104da36600461275a565b610eb9565b3480156104eb57600080fd5b506103516104fa3660046124c1565b610ec6565b34801561050b57600080fd5b50610339610f72565b34801561052057600080fd5b5061053461052f3660046124c1565b610f86565b6040516102b69190612926565b34801561054d57600080fd5b506008546001600160a01b0316610301565b34801561056b57600080fd5b5061033961057a36600461275a565b611028565b34801561058b57600080fd5b506102d4611035565b6103396105a236600461275a565b611044565b3480156105b357600080fd5b506103396105c2366004612627565b611357565b3480156105d357600080fd5b506103396105e236600461254b565b61141c565b3480156105f357600080fd5b50610351600b5481565b34801561060957600080fd5b5061035160095481565b34801561061f57600080fd5b506102d461062e36600461275a565b6114ab565b34801561063f57600080fd5b5061035160075481565b34801561065557600080fd5b506103516106643660046124c1565b611536565b34801561067557600080fd5b506102aa6106843660046124c1565b6001600160a01b03166000908152600e602052604090205460ff1690565b3480156106ae57600080fd5b506102d4611541565b3480156106c357600080fd5b506102aa6106d23660046124dc565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561070c57600080fd5b50610351600a81565b34801561072157600080fd5b506103396107303660046124c1565b611569565b34801561074157600080fd5b50600c5461074f9060ff1681565b6040516102b6919061296a565b60006001600160e01b031982167f80ac58cd0000000000000000000000000000000000000000000000000000000014806107bf57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806107f357506001600160e01b031982167f780e9d6300000000000000000000000000000000000000000000000000000000145b8061082757507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b60606001805461083c90612aaf565b80601f016020809104026020016040519081016040528092919081815260200182805461086890612aaf565b80156108b55780601f1061088a576101008083540402835291602001916108b5565b820191906000526020600020905b81548152906001019060200180831161089857829003601f168201915b5050505050905090565b60006108cc826000541190565b6109435760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201527f78697374656e7420746f6b656e0000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600061096a82610ea7565b9050806001600160a01b0316836001600160a01b031614156109f45760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201527f6572000000000000000000000000000000000000000000000000000000000000606482015260840161093a565b336001600160a01b0382161480610a105750610a1081336106d2565b610a825760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606482015260840161093a565b610a8d8383836115f6565b505050565b610a9a61166a565b600955565b610a8d8383836116c4565b600080600c5460ff166001811115610ac457610ac4612b45565b1415610b125760405162461bcd60e51b815260206004820152601e60248201527f50757a7a6c72506c6179324561726e3a2053616c657320617265206f66660000604482015260640161093a565b33610b1c57600080fd5b336000908152600e602052604090205460ff16610b7b57600a5415610b7b57610b46600183612a55565b91506001600a6000828254610b5b9190612a55565b9091555050336000908152600e60205260409020805460ff191660011790555b600b54610b888184612a05565b9392505050565b610b9761166a565b600c805482919060ff191660018381811115610bb557610bb5612b45565b021790555050565b6000610bc883610ec6565b8210610c3c5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60448201527f6473000000000000000000000000000000000000000000000000000000000000606482015260840161093a565b600080549080805b83811015610ce6576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610c9757805192505b876001600160a01b0316836001600160a01b03161415610cd35786841415610cc55750935061082792505050565b83610ccf81612aea565b9450505b5080610cde81612aea565b915050610c44565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201527f6f776e657220627920696e646578000000000000000000000000000000000000606482015260840161093a565b610d5d61166a565b60004711610dad5760405162461bcd60e51b815260206004820152601660248201527f4e6f2062616c616e636520746f20776974686472617700000000000000000000604482015260640161093a565b47610dc06008546001600160a01b031690565b6001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015610df8573d6000803e3d6000fd5b5050565b610a8d8383836040518060200160405280600081525061141c565b600080548210610e8f5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560448201527f6e64730000000000000000000000000000000000000000000000000000000000606482015260840161093a565b5090565b610e9b61166a565b610a8d600f8383612415565b6000610eb282611aa1565b5192915050565b610ec161166a565b600a55565b60006001600160a01b038216610f445760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201527f65726f2061646472657373000000000000000000000000000000000000000000606482015260840161093a565b506001600160a01b03166000908152600460205260409020546fffffffffffffffffffffffffffffffff1690565b610f7a61166a565b610f846000611c6c565b565b60606000610f9383610ec6565b905060008167ffffffffffffffff811115610fb057610fb0612b71565b604051908082528060200260200182016040528015610fd9578160200160208202803683370190505b50905060005b8281101561102057610ff18582610bbd565b82828151811061100357611003612b5b565b60209081029190910101528061101881612aea565b915050610fdf565b509392505050565b61103061166a565b600b55565b60606002805461083c90612aaf565b3332146110935760405162461bcd60e51b815260206004820152601460248201527f4e4f5f434f4e5452414354535f414c4c4f574544000000000000000000000000604482015260640161093a565b336000908152600d60205260409020544214156110f25760405162461bcd60e51b815260206004820152601460248201527f43414e545f4d494e545f53414d455f424c4f434b000000000000000000000000604482015260640161093a565b6000600c5460ff16600181111561110b5761110b612b45565b14156111595760405162461bcd60e51b815260206004820152601e60248201527f50757a7a6c72506c6179324561726e3a2053616c657320617265206f66660000604482015260640161093a565b6009548161116660005490565b61117091906129d9565b111561120a5760405162461bcd60e51b815260206004820152604760248201527f50757a7a6c72506c6179324561726e3a204e756d626572206f6620726571756560448201527f7374656420746f6b656e732077696c6c2065786365656420636f6c6c6563746960648201527f6f6e2073697a6500000000000000000000000000000000000000000000000000608482015260a40161093a565b600a8161121633611536565b61122091906129d9565b11156112ba5760405162461bcd60e51b815260206004820152604260248201527f50757a7a6c72506c6179324561726e3a204e756d626572206f6620726571756560448201527f7374656420746f6b656e73206578636565647320616c6c6f77616e636520283160648201527f3029000000000000000000000000000000000000000000000000000000000000608482015260a40161093a565b6112c381610aaa565b3410156113385760405162461bcd60e51b815260206004820152603360248201527f50757a7a6c72506c6179324561726e3a2045746865722076616c75652073656e60448201527f74206973206e6f742073756666696369656e7400000000000000000000000000606482015260840161093a565b336000818152600d602052604090204290556113549082611cd6565b50565b6001600160a01b0382163314156113b05760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604482015260640161093a565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6114278484846116c4565b61143384848484611cf0565b6114a55760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e74657200000000000000000000000000606482015260840161093a565b50505050565b60606114b8826000541190565b6115045760405162461bcd60e51b815260206004820152601460248201527f546f6b656e206e6f74206d696e74656420796574000000000000000000000000604482015260640161093a565b600f61150f83611e86565b604051602001611520929190612872565b6040516020818303038152906040529050919050565b600061082782611fb8565b6060600f6040516020016115559190612839565b604051602081830303815290604052905090565b61157161166a565b6001600160a01b0381166115ed5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161093a565b61135481611c6c565b60008281526005602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b03163314610f845760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161093a565b60006116cf82611aa1565b80519091506000906001600160a01b0316336001600160a01b031614806117065750336116fb846108bf565b6001600160a01b0316145b806117185750815161171890336106d2565b90508061178d5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000606482015260840161093a565b846001600160a01b031682600001516001600160a01b0316146118185760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f727265637460448201527f206f776e65720000000000000000000000000000000000000000000000000000606482015260840161093a565b6001600160a01b0384166118945760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161093a565b6118a460008484600001516115f6565b6001600160a01b03851660009081526004602052604081208054600192906118df9084906fffffffffffffffffffffffffffffffff16612a24565b82546101009290920a6fffffffffffffffffffffffffffffffff8181021990931691831602179091556001600160a01b03861660009081526004602052604081208054600194509092611934918591166129a5565b82546fffffffffffffffffffffffffffffffff9182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b031990911691909216171790556119c58460016129d9565b6000818152600360205260409020549091506001600160a01b0316611a57576119ef816000541190565b15611a575760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6040805180820190915260008082526020820152611ac0826000541190565b611b325760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360448201527f74656e7420746f6b656e00000000000000000000000000000000000000000000606482015260840161093a565b60007f00000000000000000000000000000000000000000000000000000000000000008310611b9357611b857f000000000000000000000000000000000000000000000000000000000000000084612a55565b611b909060016129d9565b90505b825b818110611bfd576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611bea57949350505050565b5080611bf581612a98565b915050611b95565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000606482015260840161093a565b600880546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610df8828260405180602001604052806000815250612078565b60006001600160a01b0384163b15611e7a576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290611d4d9033908990889088906004016128ea565b602060405180830381600087803b158015611d6757600080fd5b505af1925050508015611d97575060408051601f3d908101601f19168201909252611d94918101906126aa565b60015b611e47573d808015611dc5576040519150601f19603f3d011682016040523d82523d6000602084013e611dca565b606091505b508051611e3f5760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e74657200000000000000000000000000606482015260840161093a565b805181602001fd5b6001600160e01b0319167f150b7a0200000000000000000000000000000000000000000000000000000000149050611e7e565b5060015b949350505050565b606081611ec657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611ef05780611eda81612aea565b9150611ee99050600a836129f1565b9150611eca565b60008167ffffffffffffffff811115611f0b57611f0b612b71565b6040519080825280601f01601f191660200182016040528015611f35576020820181803683370190505b5090505b8415611e7e57611f4a600183612a55565b9150611f57600a86612b05565b611f629060306129d9565b60f81b818381518110611f7757611f77612b5b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611fb1600a866129f1565b9450611f39565b60006001600160a01b0382166120365760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527f20746865207a65726f2061646472657373000000000000000000000000000000606482015260840161093a565b506001600160a01b031660009081526004602052604090205470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1690565b6000546001600160a01b0384166120f75760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161093a565b612102816000541190565b1561214f5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604482015260640161093a565b7f00000000000000000000000000000000000000000000000000000000000000008311156121e55760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960448201527f6768000000000000000000000000000000000000000000000000000000000000606482015260840161093a565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000090910416918101919091528151808301909252805190919081906122579087906129a5565b6fffffffffffffffffffffffffffffffff16815260200185836020015161227e91906129a5565b6fffffffffffffffffffffffffffffffff9081169091526001600160a01b03808816600081815260046020908152604080832087519783015187167001000000000000000000000000000000000297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b8581101561240a5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46123786000888488611cf0565b6123ea5760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e74657200000000000000000000000000606482015260840161093a565b816123f481612aea565b925050808061240290612aea565b91505061232b565b506000819055611a99565b82805461242190612aaf565b90600052602060002090601f0160209004810192826124435760008555612489565b82601f1061245c5782800160ff19823516178555612489565b82800160010185558215612489579182015b8281111561248957823582559160200191906001019061246e565b50610e8f9291505b80821115610e8f5760008155600101612491565b80356001600160a01b03811681146124bc57600080fd5b919050565b6000602082840312156124d357600080fd5b610b88826124a5565b600080604083850312156124ef57600080fd5b6124f8836124a5565b9150612506602084016124a5565b90509250929050565b60008060006060848603121561252457600080fd5b61252d846124a5565b925061253b602085016124a5565b9150604084013590509250925092565b6000806000806080858703121561256157600080fd5b61256a856124a5565b9350612578602086016124a5565b925060408501359150606085013567ffffffffffffffff8082111561259c57600080fd5b818701915087601f8301126125b057600080fd5b8135818111156125c2576125c2612b71565b604051601f8201601f19908116603f011681019083821181831017156125ea576125ea612b71565b816040528281528a602084870101111561260357600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561263a57600080fd5b612643836124a5565b91506020830135801515811461265857600080fd5b809150509250929050565b6000806040838503121561267657600080fd5b61267f836124a5565b946020939093013593505050565b60006020828403121561269f57600080fd5b8135610b8881612b87565b6000602082840312156126bc57600080fd5b8151610b8881612b87565b6000602082840312156126d957600080fd5b813560028110610b8857600080fd5b600080602083850312156126fb57600080fd5b823567ffffffffffffffff8082111561271357600080fd5b818501915085601f83011261272757600080fd5b81358181111561273657600080fd5b86602082850101111561274857600080fd5b60209290920196919550909350505050565b60006020828403121561276c57600080fd5b5035919050565b6000815180845261278b816020860160208601612a6c565b601f01601f19169290920160200192915050565b8054600090600181811c90808316806127b957607f831692505b60208084108214156127db57634e487b7160e01b600052602260045260246000fd5b8180156127ef57600181146128005761282d565b60ff1986168952848901965061282d565b60008881526020902060005b868110156128255781548b82015290850190830161280c565b505084890196505b50505050505092915050565b6000612845828461279f565b7f2f6d6574612f636f6e74726163742e6a736f6e0000000000000000000000000081526013019392505050565b600061287e828561279f565b7f2f6d6574612f0000000000000000000000000000000000000000000000000000815283516128b4816006840160208801612a6c565b7f2e6a736f6e00000000000000000000000000000000000000000000000000000060069290910191820152600b01949350505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261291c6080830184612773565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561295e57835183529284019291840191600101612942565b50909695505050505050565b602081016002831061298c57634e487b7160e01b600052602160045260246000fd5b91905290565b602081526000610b886020830184612773565b60006fffffffffffffffffffffffffffffffff8083168185168083038211156129d0576129d0612b19565b01949350505050565b600082198211156129ec576129ec612b19565b500190565b600082612a0057612a00612b2f565b500490565b6000816000190483118215151615612a1f57612a1f612b19565b500290565b60006fffffffffffffffffffffffffffffffff83811690831681811015612a4d57612a4d612b19565b039392505050565b600082821015612a6757612a67612b19565b500390565b60005b83811015612a87578181015183820152602001612a6f565b838111156114a55750506000910152565b600081612aa757612aa7612b19565b506000190190565b600181811c90821680612ac357607f821691505b60208210811415612ae457634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612afe57612afe612b19565b5060010190565b600082612b1457612b14612b2f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461135457600080fdfea2646970667358221220f2a7928f3591564194169c40d579dbddbb8530f62a3c88fc75aa97bcc14f483564736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102855760003560e01c8063715018a611610153578063c63b2f68116100cb578063e8a3d4851161007f578063f0292a0311610064578063f0292a0314610700578063f2fde38b14610715578063f9020e331461073557600080fd5b8063e8a3d485146106a2578063e985e9c5146106b757600080fd5b8063d7224ba0116100b0578063d7224ba014610633578063dc33e68114610649578063e502282a1461066957600080fd5b8063c63b2f68146105fd578063c87b56dd1461061357600080fd5b806395d89b4111610122578063a22cb46511610107578063a22cb465146105a7578063b88d4fde146105c7578063c002d23d146105e757600080fd5b806395d89b411461057f578063a0712d681461059457600080fd5b8063715018a6146104ff5780638462151c146105145780638da5cb5b1461054157806391b7f5ed1461055f57600080fd5b806326987b60116102015780634f6ccce7116101b55780636352211e1161019a5780636352211e1461049f5780636a420614146104bf57806370a08231146104df57600080fd5b80634f6ccce71461045f57806355f804b31461047f57600080fd5b80632f745c59116101e65780632f745c591461040a5780633ccfd60b1461042a57806342842e0e1461043f57600080fd5b806326987b60146103d45780632e49d78b146103ea57600080fd5b806316de56cb116102585780631f8d1d501161023d5780631f8d1d501461037457806323b872dd1461039457806324f314fe146103b457600080fd5b806316de56cb1461033b57806318160ddd1461035f57600080fd5b806301ffc9a71461028a57806306fdde03146102bf578063081812fc146102e1578063095ea7b314610319575b600080fd5b34801561029657600080fd5b506102aa6102a536600461268d565b61075c565b60405190151581526020015b60405180910390f35b3480156102cb57600080fd5b506102d461082d565b6040516102b69190612992565b3480156102ed57600080fd5b506103016102fc36600461275a565b6108bf565b6040516001600160a01b0390911681526020016102b6565b34801561032557600080fd5b50610339610334366004612663565b61095f565b005b34801561034757600080fd5b50610351600a5481565b6040519081526020016102b6565b34801561036b57600080fd5b50600054610351565b34801561038057600080fd5b5061033961038f36600461275a565b610a92565b3480156103a057600080fd5b506103396103af36600461250f565b610a9f565b3480156103c057600080fd5b506103516103cf36600461275a565b610aaa565b3480156103e057600080fd5b5061035160005481565b3480156103f657600080fd5b506103396104053660046126c7565b610b8f565b34801561041657600080fd5b50610351610425366004612663565b610bbd565b34801561043657600080fd5b50610339610d55565b34801561044b57600080fd5b5061033961045a36600461250f565b610dfc565b34801561046b57600080fd5b5061035161047a36600461275a565b610e17565b34801561048b57600080fd5b5061033961049a3660046126e8565b610e93565b3480156104ab57600080fd5b506103016104ba36600461275a565b610ea7565b3480156104cb57600080fd5b506103396104da36600461275a565b610eb9565b3480156104eb57600080fd5b506103516104fa3660046124c1565b610ec6565b34801561050b57600080fd5b50610339610f72565b34801561052057600080fd5b5061053461052f3660046124c1565b610f86565b6040516102b69190612926565b34801561054d57600080fd5b506008546001600160a01b0316610301565b34801561056b57600080fd5b5061033961057a36600461275a565b611028565b34801561058b57600080fd5b506102d4611035565b6103396105a236600461275a565b611044565b3480156105b357600080fd5b506103396105c2366004612627565b611357565b3480156105d357600080fd5b506103396105e236600461254b565b61141c565b3480156105f357600080fd5b50610351600b5481565b34801561060957600080fd5b5061035160095481565b34801561061f57600080fd5b506102d461062e36600461275a565b6114ab565b34801561063f57600080fd5b5061035160075481565b34801561065557600080fd5b506103516106643660046124c1565b611536565b34801561067557600080fd5b506102aa6106843660046124c1565b6001600160a01b03166000908152600e602052604090205460ff1690565b3480156106ae57600080fd5b506102d4611541565b3480156106c357600080fd5b506102aa6106d23660046124dc565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561070c57600080fd5b50610351600a81565b34801561072157600080fd5b506103396107303660046124c1565b611569565b34801561074157600080fd5b50600c5461074f9060ff1681565b6040516102b6919061296a565b60006001600160e01b031982167f80ac58cd0000000000000000000000000000000000000000000000000000000014806107bf57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806107f357506001600160e01b031982167f780e9d6300000000000000000000000000000000000000000000000000000000145b8061082757507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b60606001805461083c90612aaf565b80601f016020809104026020016040519081016040528092919081815260200182805461086890612aaf565b80156108b55780601f1061088a576101008083540402835291602001916108b5565b820191906000526020600020905b81548152906001019060200180831161089857829003601f168201915b5050505050905090565b60006108cc826000541190565b6109435760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201527f78697374656e7420746f6b656e0000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600061096a82610ea7565b9050806001600160a01b0316836001600160a01b031614156109f45760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201527f6572000000000000000000000000000000000000000000000000000000000000606482015260840161093a565b336001600160a01b0382161480610a105750610a1081336106d2565b610a825760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606482015260840161093a565b610a8d8383836115f6565b505050565b610a9a61166a565b600955565b610a8d8383836116c4565b600080600c5460ff166001811115610ac457610ac4612b45565b1415610b125760405162461bcd60e51b815260206004820152601e60248201527f50757a7a6c72506c6179324561726e3a2053616c657320617265206f66660000604482015260640161093a565b33610b1c57600080fd5b336000908152600e602052604090205460ff16610b7b57600a5415610b7b57610b46600183612a55565b91506001600a6000828254610b5b9190612a55565b9091555050336000908152600e60205260409020805460ff191660011790555b600b54610b888184612a05565b9392505050565b610b9761166a565b600c805482919060ff191660018381811115610bb557610bb5612b45565b021790555050565b6000610bc883610ec6565b8210610c3c5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60448201527f6473000000000000000000000000000000000000000000000000000000000000606482015260840161093a565b600080549080805b83811015610ce6576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610c9757805192505b876001600160a01b0316836001600160a01b03161415610cd35786841415610cc55750935061082792505050565b83610ccf81612aea565b9450505b5080610cde81612aea565b915050610c44565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201527f6f776e657220627920696e646578000000000000000000000000000000000000606482015260840161093a565b610d5d61166a565b60004711610dad5760405162461bcd60e51b815260206004820152601660248201527f4e6f2062616c616e636520746f20776974686472617700000000000000000000604482015260640161093a565b47610dc06008546001600160a01b031690565b6001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015610df8573d6000803e3d6000fd5b5050565b610a8d8383836040518060200160405280600081525061141c565b600080548210610e8f5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560448201527f6e64730000000000000000000000000000000000000000000000000000000000606482015260840161093a565b5090565b610e9b61166a565b610a8d600f8383612415565b6000610eb282611aa1565b5192915050565b610ec161166a565b600a55565b60006001600160a01b038216610f445760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201527f65726f2061646472657373000000000000000000000000000000000000000000606482015260840161093a565b506001600160a01b03166000908152600460205260409020546fffffffffffffffffffffffffffffffff1690565b610f7a61166a565b610f846000611c6c565b565b60606000610f9383610ec6565b905060008167ffffffffffffffff811115610fb057610fb0612b71565b604051908082528060200260200182016040528015610fd9578160200160208202803683370190505b50905060005b8281101561102057610ff18582610bbd565b82828151811061100357611003612b5b565b60209081029190910101528061101881612aea565b915050610fdf565b509392505050565b61103061166a565b600b55565b60606002805461083c90612aaf565b3332146110935760405162461bcd60e51b815260206004820152601460248201527f4e4f5f434f4e5452414354535f414c4c4f574544000000000000000000000000604482015260640161093a565b336000908152600d60205260409020544214156110f25760405162461bcd60e51b815260206004820152601460248201527f43414e545f4d494e545f53414d455f424c4f434b000000000000000000000000604482015260640161093a565b6000600c5460ff16600181111561110b5761110b612b45565b14156111595760405162461bcd60e51b815260206004820152601e60248201527f50757a7a6c72506c6179324561726e3a2053616c657320617265206f66660000604482015260640161093a565b6009548161116660005490565b61117091906129d9565b111561120a5760405162461bcd60e51b815260206004820152604760248201527f50757a7a6c72506c6179324561726e3a204e756d626572206f6620726571756560448201527f7374656420746f6b656e732077696c6c2065786365656420636f6c6c6563746960648201527f6f6e2073697a6500000000000000000000000000000000000000000000000000608482015260a40161093a565b600a8161121633611536565b61122091906129d9565b11156112ba5760405162461bcd60e51b815260206004820152604260248201527f50757a7a6c72506c6179324561726e3a204e756d626572206f6620726571756560448201527f7374656420746f6b656e73206578636565647320616c6c6f77616e636520283160648201527f3029000000000000000000000000000000000000000000000000000000000000608482015260a40161093a565b6112c381610aaa565b3410156113385760405162461bcd60e51b815260206004820152603360248201527f50757a7a6c72506c6179324561726e3a2045746865722076616c75652073656e60448201527f74206973206e6f742073756666696369656e7400000000000000000000000000606482015260840161093a565b336000818152600d602052604090204290556113549082611cd6565b50565b6001600160a01b0382163314156113b05760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604482015260640161093a565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6114278484846116c4565b61143384848484611cf0565b6114a55760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e74657200000000000000000000000000606482015260840161093a565b50505050565b60606114b8826000541190565b6115045760405162461bcd60e51b815260206004820152601460248201527f546f6b656e206e6f74206d696e74656420796574000000000000000000000000604482015260640161093a565b600f61150f83611e86565b604051602001611520929190612872565b6040516020818303038152906040529050919050565b600061082782611fb8565b6060600f6040516020016115559190612839565b604051602081830303815290604052905090565b61157161166a565b6001600160a01b0381166115ed5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161093a565b61135481611c6c565b60008281526005602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b03163314610f845760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161093a565b60006116cf82611aa1565b80519091506000906001600160a01b0316336001600160a01b031614806117065750336116fb846108bf565b6001600160a01b0316145b806117185750815161171890336106d2565b90508061178d5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000606482015260840161093a565b846001600160a01b031682600001516001600160a01b0316146118185760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f727265637460448201527f206f776e65720000000000000000000000000000000000000000000000000000606482015260840161093a565b6001600160a01b0384166118945760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161093a565b6118a460008484600001516115f6565b6001600160a01b03851660009081526004602052604081208054600192906118df9084906fffffffffffffffffffffffffffffffff16612a24565b82546101009290920a6fffffffffffffffffffffffffffffffff8181021990931691831602179091556001600160a01b03861660009081526004602052604081208054600194509092611934918591166129a5565b82546fffffffffffffffffffffffffffffffff9182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b031990911691909216171790556119c58460016129d9565b6000818152600360205260409020549091506001600160a01b0316611a57576119ef816000541190565b15611a575760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6040805180820190915260008082526020820152611ac0826000541190565b611b325760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360448201527f74656e7420746f6b656e00000000000000000000000000000000000000000000606482015260840161093a565b60007f000000000000000000000000000000000000000000000000000000000000000a8310611b9357611b857f000000000000000000000000000000000000000000000000000000000000000a84612a55565b611b909060016129d9565b90505b825b818110611bfd576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611bea57949350505050565b5080611bf581612a98565b915050611b95565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000606482015260840161093a565b600880546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610df8828260405180602001604052806000815250612078565b60006001600160a01b0384163b15611e7a576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290611d4d9033908990889088906004016128ea565b602060405180830381600087803b158015611d6757600080fd5b505af1925050508015611d97575060408051601f3d908101601f19168201909252611d94918101906126aa565b60015b611e47573d808015611dc5576040519150601f19603f3d011682016040523d82523d6000602084013e611dca565b606091505b508051611e3f5760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e74657200000000000000000000000000606482015260840161093a565b805181602001fd5b6001600160e01b0319167f150b7a0200000000000000000000000000000000000000000000000000000000149050611e7e565b5060015b949350505050565b606081611ec657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611ef05780611eda81612aea565b9150611ee99050600a836129f1565b9150611eca565b60008167ffffffffffffffff811115611f0b57611f0b612b71565b6040519080825280601f01601f191660200182016040528015611f35576020820181803683370190505b5090505b8415611e7e57611f4a600183612a55565b9150611f57600a86612b05565b611f629060306129d9565b60f81b818381518110611f7757611f77612b5b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611fb1600a866129f1565b9450611f39565b60006001600160a01b0382166120365760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527f20746865207a65726f2061646472657373000000000000000000000000000000606482015260840161093a565b506001600160a01b031660009081526004602052604090205470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1690565b6000546001600160a01b0384166120f75760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161093a565b612102816000541190565b1561214f5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604482015260640161093a565b7f000000000000000000000000000000000000000000000000000000000000000a8311156121e55760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960448201527f6768000000000000000000000000000000000000000000000000000000000000606482015260840161093a565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000090910416918101919091528151808301909252805190919081906122579087906129a5565b6fffffffffffffffffffffffffffffffff16815260200185836020015161227e91906129a5565b6fffffffffffffffffffffffffffffffff9081169091526001600160a01b03808816600081815260046020908152604080832087519783015187167001000000000000000000000000000000000297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b8581101561240a5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46123786000888488611cf0565b6123ea5760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e74657200000000000000000000000000606482015260840161093a565b816123f481612aea565b925050808061240290612aea565b91505061232b565b506000819055611a99565b82805461242190612aaf565b90600052602060002090601f0160209004810192826124435760008555612489565b82601f1061245c5782800160ff19823516178555612489565b82800160010185558215612489579182015b8281111561248957823582559160200191906001019061246e565b50610e8f9291505b80821115610e8f5760008155600101612491565b80356001600160a01b03811681146124bc57600080fd5b919050565b6000602082840312156124d357600080fd5b610b88826124a5565b600080604083850312156124ef57600080fd5b6124f8836124a5565b9150612506602084016124a5565b90509250929050565b60008060006060848603121561252457600080fd5b61252d846124a5565b925061253b602085016124a5565b9150604084013590509250925092565b6000806000806080858703121561256157600080fd5b61256a856124a5565b9350612578602086016124a5565b925060408501359150606085013567ffffffffffffffff8082111561259c57600080fd5b818701915087601f8301126125b057600080fd5b8135818111156125c2576125c2612b71565b604051601f8201601f19908116603f011681019083821181831017156125ea576125ea612b71565b816040528281528a602084870101111561260357600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561263a57600080fd5b612643836124a5565b91506020830135801515811461265857600080fd5b809150509250929050565b6000806040838503121561267657600080fd5b61267f836124a5565b946020939093013593505050565b60006020828403121561269f57600080fd5b8135610b8881612b87565b6000602082840312156126bc57600080fd5b8151610b8881612b87565b6000602082840312156126d957600080fd5b813560028110610b8857600080fd5b600080602083850312156126fb57600080fd5b823567ffffffffffffffff8082111561271357600080fd5b818501915085601f83011261272757600080fd5b81358181111561273657600080fd5b86602082850101111561274857600080fd5b60209290920196919550909350505050565b60006020828403121561276c57600080fd5b5035919050565b6000815180845261278b816020860160208601612a6c565b601f01601f19169290920160200192915050565b8054600090600181811c90808316806127b957607f831692505b60208084108214156127db57634e487b7160e01b600052602260045260246000fd5b8180156127ef57600181146128005761282d565b60ff1986168952848901965061282d565b60008881526020902060005b868110156128255781548b82015290850190830161280c565b505084890196505b50505050505092915050565b6000612845828461279f565b7f2f6d6574612f636f6e74726163742e6a736f6e0000000000000000000000000081526013019392505050565b600061287e828561279f565b7f2f6d6574612f0000000000000000000000000000000000000000000000000000815283516128b4816006840160208801612a6c565b7f2e6a736f6e00000000000000000000000000000000000000000000000000000060069290910191820152600b01949350505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261291c6080830184612773565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561295e57835183529284019291840191600101612942565b50909695505050505050565b602081016002831061298c57634e487b7160e01b600052602160045260246000fd5b91905290565b602081526000610b886020830184612773565b60006fffffffffffffffffffffffffffffffff8083168185168083038211156129d0576129d0612b19565b01949350505050565b600082198211156129ec576129ec612b19565b500190565b600082612a0057612a00612b2f565b500490565b6000816000190483118215151615612a1f57612a1f612b19565b500290565b60006fffffffffffffffffffffffffffffffff83811690831681811015612a4d57612a4d612b19565b039392505050565b600082821015612a6757612a67612b19565b500390565b60005b83811015612a87578181015183820152602001612a6f565b838111156114a55750506000910152565b600081612aa757612aa7612b19565b506000190190565b600181811c90821680612ac357607f821691505b60208210811415612ae457634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612afe57612afe612b19565b5060010190565b600082612b1457612b14612b2f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461135457600080fdfea2646970667358221220f2a7928f3591564194169c40d579dbddbb8530f62a3c88fc75aa97bcc14f483564736f6c63430008070033

Deployed Bytecode Sourcemap

54707:3822:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40782:422;;;;;;;;;;-1:-1:-1;40782:422:0;;;;;:::i;:::-;;:::i;:::-;;;8399:14:1;;8392:22;8374:41;;8362:2;8347:18;40782:422:0;;;;;;;;42743:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;44438:292::-;;;;;;;;;;-1:-1:-1;44438:292:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7014:55:1;;;6996:74;;6984:2;6969:18;44438:292:0;6850:226:1;43959:413:0;;;;;;;;;;-1:-1:-1;43959:413:0;;;;;:::i;:::-;;:::i;:::-;;54905:29;;;;;;;;;;;;;;;;;;;20389:25:1;;;20377:2;20362:18;54905:29:0;20243:177:1;37991:100:0;;;;;;;;;;-1:-1:-1;38044:7:0;38071:12;37991:100;;58440:86;;;;;;;;;;-1:-1:-1;58440:86:0;;;;;:::i;:::-;;:::i;45465:162::-;;;;;;;;;;-1:-1:-1;45465:162:0;;;;;:::i;:::-;;:::i;56118:474::-;;;;;;;;;;-1:-1:-1;56118:474:0;;;;;:::i;:::-;;:::i;36425:31::-;;;;;;;;;;;;;;;;58138:91;;;;;;;;;;-1:-1:-1;58138:91:0;;;;;:::i;:::-;;:::i;39846:864::-;;;;;;;;;;-1:-1:-1;39846:864:0;;;;;:::i;:::-;;:::i;56758:213::-;;;;;;;;;;;;;:::i;45698:177::-;;;;;;;;;;-1:-1:-1;45698:177:0;;;;;:::i;:::-;;:::i;38168:228::-;;;;;;;;;;-1:-1:-1;38168:228:0;;;;;:::i;:::-;;:::i;56602:92::-;;;;;;;;;;-1:-1:-1;56602:92:0;;;;;:::i;:::-;;:::i;42552:124::-;;;;;;;;;;-1:-1:-1;42552:124:0;;;;;:::i;:::-;;:::i;58342:90::-;;;;;;;;;;-1:-1:-1;58342:90:0;;;;;:::i;:::-;;:::i;41268:258::-;;;;;;;;;;-1:-1:-1;41268:258:0;;;;;:::i;:::-;;:::i;11202:103::-;;;;;;;;;;;;;:::i;57486:376::-;;;;;;;;;;-1:-1:-1;57486:376:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;10554:87::-;;;;;;;;;;-1:-1:-1;10627:6:0;;-1:-1:-1;;;;;10627:6:0;10554:87;;58237:97;;;;;;;;;;-1:-1:-1;58237:97:0;;;;;:::i;:::-;;:::i;42912:104::-;;;;;;;;;;;;;:::i;55491:619::-;;;;;;:::i;:::-;;:::i;44802:311::-;;;;;;;;;;-1:-1:-1;44802:311:0;;;;;:::i;:::-;;:::i;45946:355::-;;;;;;;;;;-1:-1:-1;45946:355:0;;;;;:::i;:::-;;:::i;54941:41::-;;;;;;;;;;;;;;;;54827:30;;;;;;;;;;;;;;;;56979:351;;;;;;;;;;-1:-1:-1;56979:351:0;;;;;:::i;:::-;;:::i;50827:43::-;;;;;;;;;;;;;;;;57870:113;;;;;;;;;;-1:-1:-1;57870:113:0;;;;;:::i;:::-;;:::i;57992:117::-;;;;;;;;;;-1:-1:-1;57992:117:0;;;;;:::i;:::-;-1:-1:-1;;;;;58080:21:0;58056:4;58080:21;;;:13;:21;;;;;;;;;57992:117;57338:140;;;;;;;;;;;;;:::i;45184:214::-;;;;;;;;;;-1:-1:-1;45184:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;45355:25:0;;;45326:4;45355:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;45184:214;54864:34;;;;;;;;;;;;54896:2;54864:34;;11460:201;;;;;;;;;;-1:-1:-1;11460:201:0;;;;;:::i;:::-;;:::i;54989:40::-;;;;;;;;;;-1:-1:-1;54989:40:0;;;;;;;;;;;;;;;:::i;40782:422::-;40929:4;-1:-1:-1;;;;;;40971:40:0;;40986:25;40971:40;;:105;;-1:-1:-1;;;;;;;41028:48:0;;41043:33;41028:48;40971:105;:172;;;-1:-1:-1;;;;;;;41093:50:0;;41108:35;41093:50;40971:172;:225;;;-1:-1:-1;17476:25:0;-1:-1:-1;;;;;;17461:40:0;;;41160:36;40951:245;40782:422;-1:-1:-1;;40782:422:0:o;42743:100::-;42797:13;42830:5;42823:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42743:100;:::o;44438:292::-;44542:7;44589:16;44597:7;46613:4;46647:12;-1:-1:-1;46637:22:0;46556:111;44589:16;44567:111;;;;-1:-1:-1;;;44567:111:0;;19628:2:1;44567:111:0;;;19610:21:1;19667:2;19647:18;;;19640:30;19706:34;19686:18;;;19679:62;19777:15;19757:18;;;19750:43;19810:19;;44567:111:0;;;;;;;;;-1:-1:-1;44698:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;44698:24:0;;44438:292::o;43959:413::-;44032:13;44048:24;44064:7;44048:15;:24::i;:::-;44032:40;;44097:5;-1:-1:-1;;;;;44091:11:0;:2;-1:-1:-1;;;;;44091:11:0;;;44083:58;;;;-1:-1:-1;;;44083:58:0;;16385:2:1;44083:58:0;;;16367:21:1;16424:2;16404:18;;;16397:30;16463:34;16443:18;;;16436:62;16534:4;16514:18;;;16507:32;16556:19;;44083:58:0;16183:398:1;44083:58:0;9185:10;-1:-1:-1;;;;;44176:21:0;;;;:62;;-1:-1:-1;44201:37:0;44218:5;9185:10;45184:214;:::i;44201:37::-;44154:169;;;;-1:-1:-1;;;44154:169:0;;13234:2:1;44154:169:0;;;13216:21:1;13273:2;13253:18;;;13246:30;13312:34;13292:18;;;13285:62;13383:27;13363:18;;;13356:55;13428:19;;44154:169:0;13032:421:1;44154:169:0;44336:28;44345:2;44349:7;44358:5;44336:8;:28::i;:::-;44021:351;43959:413;;:::o;58440:86::-;10440:13;:11;:13::i;:::-;58500:10:::1;:18:::0;58440:86::o;45465:162::-;45591:28;45601:4;45607:2;45611:7;45591:9;:28::i;56118:474::-;56168:4;;56193:10;;;;;:27;;;;;;;:::i;:::-;;;56185:70;;;;-1:-1:-1;;;56185:70:0;;10823:2:1;56185:70:0;;;10805:21:1;10862:2;10842:18;;;10835:30;10901:32;10881:18;;;10874:60;10951:18;;56185:70:0;10621:354:1;56185:70:0;56274:10;56266:33;;;;;;56330:10;56316:25;;;;:13;:25;;;;;;;;56312:206;;56361:10;;:14;56358:149;;56396:10;56405:1;56396:10;;:::i;:::-;;;56439:1;56425:10;;:15;;;;;;;:::i;:::-;;;;-1:-1:-1;;56473:10:0;56459:25;;;;:13;:25;;;;;:32;;-1:-1:-1;;56459:32:0;56487:4;56459:32;;;56358:149;56543:10;;56571:13;56543:10;56571:5;:13;:::i;:::-;56564:20;56118:474;-1:-1:-1;;;56118:474:0:o;58138:91::-;10440:13;:11;:13::i;:::-;58202:10:::1;:19:::0;;58215:6;;58202:10;-1:-1:-1;;58202:19:0::1;::::0;58215:6;58202:19;;::::1;;;;;;:::i;:::-;;;;;;58138:91:::0;:::o;39846:864::-;39971:7;40012:16;40022:5;40012:9;:16::i;:::-;40004:5;:24;39996:71;;;;-1:-1:-1;;;39996:71:0;;9253:2:1;39996:71:0;;;9235:21:1;9292:2;9272:18;;;9265:30;9331:34;9311:18;;;9304:62;9402:4;9382:18;;;9375:32;9424:19;;39996:71:0;9051:398:1;39996:71:0;40078:22;38071:12;;;40078:22;;40210:426;40234:14;40230:1;:18;40210:426;;;40270:31;40304:14;;;:11;:14;;;;;;;;;40270:48;;;;;;;;;-1:-1:-1;;;;;40270:48:0;;;;;-1:-1:-1;;;40270:48:0;;;;;;;;;;;;40337:28;40333:103;;40406:14;;;-1:-1:-1;40333:103:0;40475:5;-1:-1:-1;;;;;40454:26:0;:17;-1:-1:-1;;;;;40454:26:0;;40450:175;;;40520:5;40505:11;:20;40501:77;;;-1:-1:-1;40557:1:0;-1:-1:-1;40550:8:0;;-1:-1:-1;;;40550:8:0;40501:77;40596:13;;;;:::i;:::-;;;;40450:175;-1:-1:-1;40250:3:0;;;;:::i;:::-;;;;40210:426;;;-1:-1:-1;40646:56:0;;-1:-1:-1;;;40646:56:0;;18448:2:1;40646:56:0;;;18430:21:1;18487:2;18467:18;;;18460:30;18526:34;18506:18;;;18499:62;18597:16;18577:18;;;18570:44;18631:19;;40646:56:0;18246:410:1;56758:213:0;10440:13;:11;:13::i;:::-;56840:1:::1;56816:21;:25;56808:60;;;::::0;-1:-1:-1;;;56808:60:0;;15614:2:1;56808:60:0::1;::::0;::::1;15596:21:1::0;15653:2;15633:18;;;15626:30;15692:24;15672:18;;;15665:52;15734:18;;56808:60:0::1;15412:346:1::0;56808:60:0::1;56897:21;56937:7;10627:6:::0;;-1:-1:-1;;;;;10627:6:0;;10554:87;56937:7:::1;-1:-1:-1::0;;;;;56929:25:0::1;:34;56955:7;56929:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;56797:174;56758:213::o:0;45698:177::-;45828:39;45845:4;45851:2;45855:7;45828:39;;;;;;;;;;;;:16;:39::i;38168:228::-;38271:7;38071:12;;38304:5;:21;38296:69;;;;-1:-1:-1;;;38296:69:0;;11657:2:1;38296:69:0;;;11639:21:1;11696:2;11676:18;;;11669:30;11735:34;11715:18;;;11708:62;11806:5;11786:18;;;11779:33;11829:19;;38296:69:0;11455:399:1;38296:69:0;-1:-1:-1;38383:5:0;38168:228::o;56602:92::-;10440:13;:11;:13::i;:::-;56673::::1;:7;56683:3:::0;;56673:13:::1;:::i;42552:124::-:0;42616:7;42643:20;42655:7;42643:11;:20::i;:::-;:25;;42552:124;-1:-1:-1;;42552:124:0:o;58342:90::-;10440:13;:11;:13::i;:::-;58406:10:::1;:18:::0;58342:90::o;41268:258::-;41332:7;-1:-1:-1;;;;;41374:19:0;;41352:112;;;;-1:-1:-1;;;41352:112:0;;13660:2:1;41352:112:0;;;13642:21:1;13699:2;13679:18;;;13672:30;13738:34;13718:18;;;13711:62;13809:13;13789:18;;;13782:41;13840:19;;41352:112:0;13458:407:1;41352:112:0;-1:-1:-1;;;;;;41490:19:0;;;;;:12;:19;;;;;:27;;;;41268:258::o;11202:103::-;10440:13;:11;:13::i;:::-;11267:30:::1;11294:1;11267:18;:30::i;:::-;11202:103::o:0;57486:376::-;57572:16;57606:18;57627:16;57637:5;57627:9;:16::i;:::-;57606:37;;57654:25;57696:10;57682:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57682:25:0;;57654:53;;57723:9;57718:111;57742:10;57738:1;:14;57718:111;;;57788:29;57808:5;57815:1;57788:19;:29::i;:::-;57774:8;57783:1;57774:11;;;;;;;;:::i;:::-;;;;;;;;;;:43;57754:3;;;;:::i;:::-;;;;57718:111;;;-1:-1:-1;57846:8:0;57486:376;-1:-1:-1;;;57486:376:0:o;58237:97::-;10440:13;:11;:13::i;:::-;58304:10:::1;:22:::0;58237:97::o;42912:104::-;42968:13;43001:7;42994:14;;;;;:::i;55491:619::-;55322:10;55336:9;55322:23;55314:55;;;;-1:-1:-1;;;55314:55:0;;18863:2:1;55314:55:0;;;18845:21:1;18902:2;18882:18;;;18875:30;18941:22;18921:18;;;18914:50;18981:18;;55314:55:0;18661:344:1;55314:55:0;55408:10;55387:32;;;;:20;:32;;;;;;55423:15;55387:51;;55379:83;;;;-1:-1:-1;;;55379:83:0;;12885:2:1;55379:83:0;;;12867:21:1;12924:2;12904:18;;;12897:30;12963:22;12943:18;;;12936:50;13003:18;;55379:83:0;12683:344:1;55379:83:0;55582:13:::1;55568:10;::::0;::::1;;::::0;:27;::::1;;;;;;:::i;:::-;;;55560:70;;;::::0;-1:-1:-1;;;55560:70:0;;10823:2:1;55560:70:0::1;::::0;::::1;10805:21:1::0;10862:2;10842:18;;;10835:30;10901:32;10881:18;;;10874:60;10951:18;;55560:70:0::1;10621:354:1::0;55560:70:0::1;55674:10;;55665:5;55649:13;38044:7:::0;38071:12;;37991:100;55649:13:::1;:21;;;;:::i;:::-;:35;;55641:119;;;::::0;-1:-1:-1;;;55641:119:0;;17968:2:1;55641:119:0::1;::::0;::::1;17950:21:1::0;18007:2;17987:18;;;17980:30;18046:34;18026:18;;;18019:62;18117:34;18097:18;;;18090:62;18189:9;18168:19;;;18161:38;18216:19;;55641:119:0::1;17766:475:1::0;55641:119:0::1;54896:2;55806:5;55779:24;55792:10;55779:12;:24::i;:::-;:32;;;;:::i;:::-;:44;;55771:123;;;::::0;-1:-1:-1;;;55771:123:0;;11182:2:1;55771:123:0::1;::::0;::::1;11164:21:1::0;11221:2;11201:18;;;11194:30;11260:34;11240:18;;;11233:62;11331:34;11311:18;;;11304:62;11403:4;11382:19;;;11375:33;11425:19;;55771:123:0::1;10980:470:1::0;55771:123:0::1;55926:20;55940:5;55926:13;:20::i;:::-;55913:9;:33;;55905:97;;;::::0;-1:-1:-1;;;55905:97:0;;15965:2:1;55905:97:0::1;::::0;::::1;15947:21:1::0;16004:2;15984:18;;;15977:30;16043:34;16023:18;;;16016:62;16114:21;16094:18;;;16087:49;16153:19;;55905:97:0::1;15763:415:1::0;55905:97:0::1;56034:10;56013:32;::::0;;;:20:::1;:32;::::0;;;;56048:15:::1;56013:50:::0;;56074:28:::1;::::0;56096:5;56074:9:::1;:28::i;:::-;55491:619:::0;:::o;44802:311::-;-1:-1:-1;;;;;44920:24:0;;9185:10;44920:24;;44912:63;;;;-1:-1:-1;;;44912:63:0;;14840:2:1;44912:63:0;;;14822:21:1;14879:2;14859:18;;;14852:30;14918:28;14898:18;;;14891:56;14964:18;;44912:63:0;14638:350:1;44912:63:0;9185:10;44988:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;44988:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;44988:53:0;;;;;;;;;;45057:48;;8374:41:1;;;44988:42:0;;9185:10;45057:48;;8347:18:1;45057:48:0;;;;;;;44802:311;;:::o;45946:355::-;46105:28;46115:4;46121:2;46125:7;46105:9;:28::i;:::-;46166:48;46189:4;46195:2;46199:7;46208:5;46166:22;:48::i;:::-;46144:149;;;;-1:-1:-1;;;46144:149:0;;16788:2:1;46144:149:0;;;16770:21:1;16827:2;16807:18;;;16800:30;16866:34;16846:18;;;16839:62;16937:21;16917:18;;;16910:49;16976:19;;46144:149:0;16586:415:1;46144:149:0;45946:355;;;;:::o;56979:351::-;57097:13;57136:16;57144:7;46613:4;46647:12;-1:-1:-1;46637:22:0;46556:111;57136:16;57128:48;;;;-1:-1:-1;;;57128:48:0;;9656:2:1;57128:48:0;;;9638:21:1;9695:2;9675:18;;;9668:30;9734:22;9714:18;;;9707:50;9774:18;;57128:48:0;9454:344:1;57128:48:0;57242:7;57273:25;57290:7;57273:16;:25::i;:::-;57211:110;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57197:125;;56979:351;;;:::o;57870:113::-;57928:7;57955:20;57969:5;57955:13;:20::i;57338:140::-;57382:13;57439:7;57422:47;;;;;;;;:::i;:::-;;;;;;;;;;;;;57408:62;;57338:140;:::o;11460:201::-;10440:13;:11;:13::i;:::-;-1:-1:-1;;;;;11549:22:0;::::1;11541:73;;;::::0;-1:-1:-1;;;11541:73:0;;10005:2:1;11541:73:0::1;::::0;::::1;9987:21:1::0;10044:2;10024:18;;;10017:30;10083:34;10063:18;;;10056:62;10154:8;10134:18;;;10127:36;10180:19;;11541:73:0::1;9803:402:1::0;11541:73:0::1;11625:28;11644:8;11625:18;:28::i;50623:196::-:0;50738:24;;;;:15;:24;;;;;;:29;;;;-1:-1:-1;;;;;50738:29:0;;;;;;;;;50783:28;;50738:24;;50783:28;;;;;;;50623:196;;;:::o;10719:132::-;10627:6;;-1:-1:-1;;;;;10627:6:0;9185:10;10783:23;10775:68;;;;-1:-1:-1;;;10775:68:0;;14479:2:1;10775:68:0;;;14461:21:1;;;14498:18;;;14491:30;14557:34;14537:18;;;14530:62;14609:18;;10775:68:0;14277:356:1;48796:1709:0;48911:35;48949:20;48961:7;48949:11;:20::i;:::-;49024:18;;48911:58;;-1:-1:-1;48982:22:0;;-1:-1:-1;;;;;49008:34:0;9185:10;-1:-1:-1;;;;;49008:34:0;;:87;;;-1:-1:-1;9185:10:0;49059:20;49071:7;49059:11;:20::i;:::-;-1:-1:-1;;;;;49059:36:0;;49008:87;:154;;;-1:-1:-1;49129:18:0;;49112:50;;9185:10;45184:214;:::i;49112:50::-;48982:181;;49198:17;49176:117;;;;-1:-1:-1;;;49176:117:0;;15195:2:1;49176:117:0;;;15177:21:1;15234:2;15214:18;;;15207:30;15273:34;15253:18;;;15246:62;15344:20;15324:18;;;15317:48;15382:19;;49176:117:0;14993:414:1;49176:117:0;49350:4;-1:-1:-1;;;;;49328:26:0;:13;:18;;;-1:-1:-1;;;;;49328:26:0;;49306:114;;;;-1:-1:-1;;;49306:114:0;;14072:2:1;49306:114:0;;;14054:21:1;14111:2;14091:18;;;14084:30;14150:34;14130:18;;;14123:62;14221:8;14201:18;;;14194:36;14247:19;;49306:114:0;13870:402:1;49306:114:0;-1:-1:-1;;;;;49439:16:0;;49431:66;;;;-1:-1:-1;;;49431:66:0;;12061:2:1;49431:66:0;;;12043:21:1;12100:2;12080:18;;;12073:30;12139:34;12119:18;;;12112:62;12210:7;12190:18;;;12183:35;12235:19;;49431:66:0;11859:401:1;49431:66:0;49618:49;49635:1;49639:7;49648:13;:18;;;49618:8;:49::i;:::-;-1:-1:-1;;;;;49680:18:0;;;;;;:12;:18;;;;;:31;;49710:1;;49680:18;:31;;49710:1;;49680:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49722:16:0;;-1:-1:-1;49722:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;49722:16:0;;:29;;-1:-1:-1;;49722:29:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49785:43:0;;;;;;;;-1:-1:-1;;;;;49785:43:0;;;;;;49811:15;49785:43;;;;;;;;;-1:-1:-1;49762:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;49762:66:0;-1:-1:-1;;;;;;49762:66:0;;;;;;;;;;;50090:11;49774:7;-1:-1:-1;50090:11:0;:::i;:::-;50157:1;50116:24;;;:11;:24;;;;;:29;50068:33;;-1:-1:-1;;;;;;50116:29:0;50112:288;;50180:20;50188:11;46613:4;46647:12;-1:-1:-1;46637:22:0;46556:111;50180:20;50176:213;;;50248:125;;;;;;;;50285:18;;-1:-1:-1;;;;;50248:125:0;;;;;;50326:28;;;;50248:125;;;;;;;;;;-1:-1:-1;50221:24:0;;;:11;:24;;;;;;;:152;;;;;;;;;-1:-1:-1;;;50221:152:0;-1:-1:-1;;;;;;50221:152:0;;;;;;;;;;;;50176:213;50436:7;50432:2;-1:-1:-1;;;;;50417:27:0;50426:4;-1:-1:-1;;;;;50417:27:0;;;;;;;;;;;50455:42;48900:1605;;;48796:1709;;;:::o;41808:682::-;-1:-1:-1;;;;;;;;;;;;;;;;;41943:16:0;41951:7;46613:4;46647:12;-1:-1:-1;46637:22:0;46556:111;41943:16;41935:71;;;;-1:-1:-1;;;41935:71:0;;10412:2:1;41935:71:0;;;10394:21:1;10451:2;10431:18;;;10424:30;10490:34;10470:18;;;10463:62;10561:12;10541:18;;;10534:40;10591:19;;41935:71:0;10210:406:1;41935:71:0;42019:26;42071:12;42060:7;:23;42056:103;;42121:22;42131:12;42121:7;:22;:::i;:::-;:26;;42146:1;42121:26;:::i;:::-;42100:47;;42056:103;42191:7;42171:242;42208:18;42200:4;:26;42171:242;;42251:31;42285:17;;;:11;:17;;;;;;;;;42251:51;;;;;;;;;-1:-1:-1;;;;;42251:51:0;;;;;-1:-1:-1;;;42251:51:0;;;;;;;;;;;;42321:28;42317:85;;42377:9;41808:682;-1:-1:-1;;;;41808:682:0:o;42317:85::-;-1:-1:-1;42228:6:0;;;;:::i;:::-;;;;42171:242;;;-1:-1:-1;42425:57:0;;-1:-1:-1;;;42425:57:0;;19212:2:1;42425:57:0;;;19194:21:1;19251:2;19231:18;;;19224:30;19290:34;19270:18;;;19263:62;19361:17;19341:18;;;19334:45;19396:19;;42425:57:0;19010:411:1;11821:191:0;11914:6;;;-1:-1:-1;;;;;11931:17:0;;;;;;;;;;;11964:40;;11914:6;;;11931:17;11914:6;;11964:40;;11895:16;;11964:40;11884:128;11821:191;:::o;46675:104::-;46744:27;46754:2;46758:8;46744:27;;;;;;;;;;;;:9;:27::i;52498:985::-;52653:4;-1:-1:-1;;;;;52674:13:0;;1401:19;:23;52670:806;;52727:175;;;;;-1:-1:-1;;;;;52727:36:0;;;;;:175;;9185:10;;52821:4;;52848:7;;52878:5;;52727:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52727:175:0;;;;;;;;-1:-1:-1;;52727:175:0;;;;;;;;;;;;:::i;:::-;;;52706:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53089:13:0;;53085:321;;53132:109;;-1:-1:-1;;;53132:109:0;;16788:2:1;53132:109:0;;;16770:21:1;16827:2;16807:18;;;16800:30;16866:34;16846:18;;;16839:62;16937:21;16917:18;;;16910:49;16976:19;;53132:109:0;16586:415:1;53085:321:0;53356:6;53350:13;53341:6;53337:2;53333:15;53326:38;52706:715;-1:-1:-1;;;;;;52966:55:0;52976:45;52966:55;;-1:-1:-1;52959:62:0;;52670:806;-1:-1:-1;53460:4:0;52670:806;52498:985;;;;;;:::o;12449:723::-;12505:13;12726:10;12722:53;;-1:-1:-1;;12753:10:0;;;;;;;;;;;;;;;;;;12449:723::o;12722:53::-;12800:5;12785:12;12841:78;12848:9;;12841:78;;12874:8;;;;:::i;:::-;;-1:-1:-1;12897:10:0;;-1:-1:-1;12905:2:0;12897:10;;:::i;:::-;;;12841:78;;;12929:19;12961:6;12951:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12951:17:0;;12929:39;;12979:154;12986:10;;12979:154;;13013:11;13023:1;13013:11;;:::i;:::-;;-1:-1:-1;13082:10:0;13090:2;13082:5;:10;:::i;:::-;13069:24;;:2;:24;:::i;:::-;13056:39;;13039:6;13046;13039:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;13110:11:0;13119:2;13110:11;;:::i;:::-;;;12979:154;;41534:266;41595:7;-1:-1:-1;;;;;41637:19:0;;41615:118;;;;-1:-1:-1;;;41615:118:0;;12467:2:1;41615:118:0;;;12449:21:1;12506:2;12486:18;;;12479:30;12545:34;12525:18;;;12518:62;12616:19;12596:18;;;12589:47;12653:19;;41615:118:0;12265:413:1;41615:118:0;-1:-1:-1;;;;;;41759:19:0;;;;;:12;:19;;;;;:32;;;;;;;41534:266::o;47142:1400::-;47265:20;47288:12;-1:-1:-1;;;;;47319:16:0;;47311:62;;;;-1:-1:-1;;;47311:62:0;;17566:2:1;47311:62:0;;;17548:21:1;17605:2;17585:18;;;17578:30;17644:34;17624:18;;;17617:62;17715:3;17695:18;;;17688:31;17736:19;;47311:62:0;17364:397:1;47311:62:0;47518:21;47526:12;46613:4;46647:12;-1:-1:-1;46637:22:0;46556:111;47518:21;47517:22;47509:64;;;;-1:-1:-1;;;47509:64:0;;17208:2:1;47509:64:0;;;17190:21:1;17247:2;17227:18;;;17220:30;17286:31;17266:18;;;17259:59;17335:18;;47509:64:0;17006:353:1;47509:64:0;47604:12;47592:8;:24;;47584:71;;;;-1:-1:-1;;;47584:71:0;;20042:2:1;47584:71:0;;;20024:21:1;20081:2;20061:18;;;20054:30;20120:34;20100:18;;;20093:62;20191:4;20171:18;;;20164:32;20213:19;;47584:71:0;19840:398:1;47584:71:0;-1:-1:-1;;;;;47775:16:0;;47742:30;47775:16;;;:12;:16;;;;;;;;;47742:49;;;;;;;;;;;;;;;;;;;;;;;;;;;47821:135;;;;;;;;47847:19;;47742:49;;47821:135;;;47847:39;;47877:8;;47847:39;:::i;:::-;47821:135;;;;;;47936:8;47901:11;:24;;;:44;;;;:::i;:::-;47821:135;;;;;;;-1:-1:-1;;;;;47802:16:0;;;;;;;:12;:16;;;;;;;;:154;;;;;;;;;;;;;;;;;;;;;47995:43;;;;;;;;;;;48021:15;47995:43;;;;;;;;47967:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;47967:71:0;-1:-1:-1;;;;;;47967:71:0;;;;;;;;;;;;;;;;;;47979:12;;48099:325;48123:8;48119:1;:12;48099:325;;;48158:38;;48183:12;;-1:-1:-1;;;;;48158:38:0;;;48175:1;;48158:38;;48175:1;;48158:38;48237:59;48268:1;48272:2;48276:12;48290:5;48237:22;:59::i;:::-;48211:172;;;;-1:-1:-1;;;48211:172:0;;16788:2:1;48211:172:0;;;16770:21:1;16827:2;16807:18;;;16800:30;16866:34;16846:18;;;16839:62;16937:21;16917:18;;;16910:49;16976:19;;48211:172:0;16586:415:1;48211:172:0;48398:14;;;;:::i;:::-;;;;48133:3;;;;;:::i;:::-;;;;48099:325;;;-1:-1:-1;48436:12:0;:27;;;48474:60;45946:355;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:196:1;82:20;;-1:-1:-1;;;;;131:54:1;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:186::-;274:6;327:2;315:9;306:7;302:23;298:32;295:52;;;343:1;340;333:12;295:52;366:29;385:9;366:29;:::i;406:260::-;474:6;482;535:2;523:9;514:7;510:23;506:32;503:52;;;551:1;548;541:12;503:52;574:29;593:9;574:29;:::i;:::-;564:39;;622:38;656:2;645:9;641:18;622:38;:::i;:::-;612:48;;406:260;;;;;:::o;671:328::-;748:6;756;764;817:2;805:9;796:7;792:23;788:32;785:52;;;833:1;830;823:12;785:52;856:29;875:9;856:29;:::i;:::-;846:39;;904:38;938:2;927:9;923:18;904:38;:::i;:::-;894:48;;989:2;978:9;974:18;961:32;951:42;;671:328;;;;;:::o;1004:1197::-;1099:6;1107;1115;1123;1176:3;1164:9;1155:7;1151:23;1147:33;1144:53;;;1193:1;1190;1183:12;1144:53;1216:29;1235:9;1216:29;:::i;:::-;1206:39;;1264:38;1298:2;1287:9;1283:18;1264:38;:::i;:::-;1254:48;;1349:2;1338:9;1334:18;1321:32;1311:42;;1404:2;1393:9;1389:18;1376:32;1427:18;1468:2;1460:6;1457:14;1454:34;;;1484:1;1481;1474:12;1454:34;1522:6;1511:9;1507:22;1497:32;;1567:7;1560:4;1556:2;1552:13;1548:27;1538:55;;1589:1;1586;1579:12;1538:55;1625:2;1612:16;1647:2;1643;1640:10;1637:36;;;1653:18;;:::i;:::-;1787:2;1781:9;1849:4;1841:13;;-1:-1:-1;;1837:22:1;;;1861:2;1833:31;1829:40;1817:53;;;1885:18;;;1905:22;;;1882:46;1879:72;;;1931:18;;:::i;:::-;1971:10;1967:2;1960:22;2006:2;1998:6;1991:18;2046:7;2041:2;2036;2032;2028:11;2024:20;2021:33;2018:53;;;2067:1;2064;2057:12;2018:53;2123:2;2118;2114;2110:11;2105:2;2097:6;2093:15;2080:46;2168:1;2163:2;2158;2150:6;2146:15;2142:24;2135:35;2189:6;2179:16;;;;;;;1004:1197;;;;;;;:::o;2206:347::-;2271:6;2279;2332:2;2320:9;2311:7;2307:23;2303:32;2300:52;;;2348:1;2345;2338:12;2300:52;2371:29;2390:9;2371:29;:::i;:::-;2361:39;;2450:2;2439:9;2435:18;2422:32;2497:5;2490:13;2483:21;2476:5;2473:32;2463:60;;2519:1;2516;2509:12;2463:60;2542:5;2532:15;;;2206:347;;;;;:::o;2558:254::-;2626:6;2634;2687:2;2675:9;2666:7;2662:23;2658:32;2655:52;;;2703:1;2700;2693:12;2655:52;2726:29;2745:9;2726:29;:::i;:::-;2716:39;2802:2;2787:18;;;;2774:32;;-1:-1:-1;;;2558:254:1:o;2817:245::-;2875:6;2928:2;2916:9;2907:7;2903:23;2899:32;2896:52;;;2944:1;2941;2934:12;2896:52;2983:9;2970:23;3002:30;3026:5;3002:30;:::i;3067:249::-;3136:6;3189:2;3177:9;3168:7;3164:23;3160:32;3157:52;;;3205:1;3202;3195:12;3157:52;3237:9;3231:16;3256:30;3280:5;3256:30;:::i;3321:267::-;3391:6;3444:2;3432:9;3423:7;3419:23;3415:32;3412:52;;;3460:1;3457;3450:12;3412:52;3499:9;3486:23;3538:1;3531:5;3528:12;3518:40;;3554:1;3551;3544:12;3593:592;3664:6;3672;3725:2;3713:9;3704:7;3700:23;3696:32;3693:52;;;3741:1;3738;3731:12;3693:52;3781:9;3768:23;3810:18;3851:2;3843:6;3840:14;3837:34;;;3867:1;3864;3857:12;3837:34;3905:6;3894:9;3890:22;3880:32;;3950:7;3943:4;3939:2;3935:13;3931:27;3921:55;;3972:1;3969;3962:12;3921:55;4012:2;3999:16;4038:2;4030:6;4027:14;4024:34;;;4054:1;4051;4044:12;4024:34;4099:7;4094:2;4085:6;4081:2;4077:15;4073:24;4070:37;4067:57;;;4120:1;4117;4110:12;4067:57;4151:2;4143:11;;;;;4173:6;;-1:-1:-1;3593:592:1;;-1:-1:-1;;;;3593:592:1:o;4190:180::-;4249:6;4302:2;4290:9;4281:7;4277:23;4273:32;4270:52;;;4318:1;4315;4308:12;4270:52;-1:-1:-1;4341:23:1;;4190:180;-1:-1:-1;4190:180:1:o;4375:316::-;4416:3;4454:5;4448:12;4481:6;4476:3;4469:19;4497:63;4553:6;4546:4;4541:3;4537:14;4530:4;4523:5;4519:16;4497:63;:::i;:::-;4605:2;4593:15;-1:-1:-1;;4589:88:1;4580:98;;;;4680:4;4576:109;;4375:316;-1:-1:-1;;4375:316:1:o;4696:1088::-;4781:12;;4746:3;;4836:1;4856:18;;;;4909;;;;4936:61;;4990:4;4982:6;4978:17;4968:27;;4936:61;5016:2;5064;5056:6;5053:14;5033:18;5030:38;5027:218;;;-1:-1:-1;;;5098:1:1;5091:88;5202:4;5199:1;5192:15;5230:4;5227:1;5220:15;5027:218;5261:18;5288:162;;;;5464:1;5459:319;;;;5254:524;;5288:162;-1:-1:-1;;5325:9:1;5321:82;5316:3;5309:95;5433:6;5428:3;5424:16;5417:23;;5288:162;;5459:319;20498:1;20491:14;;;20535:4;20522:18;;5553:1;5567:165;5581:6;5578:1;5575:13;5567:165;;;5659:14;;5646:11;;;5639:35;5702:16;;;;5596:10;;5567:165;;;5571:3;;5761:6;5756:3;5752:16;5745:23;;5254:524;;;;;;;4696:1088;;;;:::o;5789:370::-;6018:3;6046:38;6080:3;6072:6;6046:38;:::i;:::-;6104:21;6093:33;;6150:2;6142:11;;5789:370;-1:-1:-1;;;5789:370:1:o;6164:681::-;6542:3;6570:38;6604:3;6596:6;6570:38;:::i;:::-;6628:8;6624:2;6617:20;6666:6;6660:13;6682:60;6735:6;6731:1;6727:2;6723:10;6716:4;6708:6;6704:17;6682:60;:::i;:::-;6804:7;6800:1;6761:15;;;;6792:10;;;6785:27;6836:2;6828:11;;6164:681;-1:-1:-1;;;;6164:681:1:o;7081:511::-;7275:4;-1:-1:-1;;;;;7385:2:1;7377:6;7373:15;7362:9;7355:34;7437:2;7429:6;7425:15;7420:2;7409:9;7405:18;7398:43;;7477:6;7472:2;7461:9;7457:18;7450:34;7520:3;7515:2;7504:9;7500:18;7493:31;7541:45;7581:3;7570:9;7566:19;7558:6;7541:45;:::i;:::-;7533:53;7081:511;-1:-1:-1;;;;;;7081:511:1:o;7597:632::-;7768:2;7820:21;;;7890:13;;7793:18;;;7912:22;;;7739:4;;7768:2;7991:15;;;;7965:2;7950:18;;;7739:4;8034:169;8048:6;8045:1;8042:13;8034:169;;;8109:13;;8097:26;;8178:15;;;;8143:12;;;;8070:1;8063:9;8034:169;;;-1:-1:-1;8220:3:1;;7597:632;-1:-1:-1;;;;;;7597:632:1:o;8426:396::-;8569:2;8554:18;;8602:1;8591:13;;8581:201;;-1:-1:-1;;;8635:1:1;8628:88;8739:4;8736:1;8729:15;8767:4;8764:1;8757:15;8581:201;8791:25;;;8426:396;:::o;8827:219::-;8976:2;8965:9;8958:21;8939:4;8996:44;9036:2;9025:9;9021:18;9013:6;8996:44;:::i;20551:253::-;20591:3;20619:34;20680:2;20677:1;20673:10;20710:2;20707:1;20703:10;20741:3;20737:2;20733:12;20728:3;20725:21;20722:47;;;20749:18;;:::i;:::-;20785:13;;20551:253;-1:-1:-1;;;;20551:253:1:o;20809:128::-;20849:3;20880:1;20876:6;20873:1;20870:13;20867:39;;;20886:18;;:::i;:::-;-1:-1:-1;20922:9:1;;20809:128::o;20942:120::-;20982:1;21008;20998:35;;21013:18;;:::i;:::-;-1:-1:-1;21047:9:1;;20942:120::o;21067:228::-;21107:7;21233:1;-1:-1:-1;;21161:74:1;21158:1;21155:81;21150:1;21143:9;21136:17;21132:105;21129:131;;;21240:18;;:::i;:::-;-1:-1:-1;21280:9:1;;21067:228::o;21300:246::-;21340:4;21369:34;21453:10;;;;21423;;21475:12;;;21472:38;;;21490:18;;:::i;:::-;21527:13;;21300:246;-1:-1:-1;;;21300:246:1:o;21551:125::-;21591:4;21619:1;21616;21613:8;21610:34;;;21624:18;;:::i;:::-;-1:-1:-1;21661:9:1;;21551:125::o;21681:258::-;21753:1;21763:113;21777:6;21774:1;21771:13;21763:113;;;21853:11;;;21847:18;21834:11;;;21827:39;21799:2;21792:10;21763:113;;;21894:6;21891:1;21888:13;21885:48;;;-1:-1:-1;;21929:1:1;21911:16;;21904:27;21681:258::o;21944:196::-;21983:3;22011:5;22001:39;;22020:18;;:::i;:::-;-1:-1:-1;;;22056:78:1;;21944:196::o;22145:437::-;22224:1;22220:12;;;;22267;;;22288:61;;22342:4;22334:6;22330:17;22320:27;;22288:61;22395:2;22387:6;22384:14;22364:18;22361:38;22358:218;;;-1:-1:-1;;;22429:1:1;22422:88;22533:4;22530:1;22523:15;22561:4;22558:1;22551:15;22358:218;;22145:437;;;:::o;22587:195::-;22626:3;-1:-1:-1;;22650:5:1;22647:77;22644:103;;;22727:18;;:::i;:::-;-1:-1:-1;22774:1:1;22763:13;;22587:195::o;22787:112::-;22819:1;22845;22835:35;;22850:18;;:::i;:::-;-1:-1:-1;22884:9:1;;22787:112::o;22904:184::-;-1:-1:-1;;;22953:1:1;22946:88;23053:4;23050:1;23043:15;23077:4;23074:1;23067:15;23093:184;-1:-1:-1;;;23142:1:1;23135:88;23242:4;23239:1;23232:15;23266:4;23263:1;23256:15;23282:184;-1:-1:-1;;;23331:1:1;23324:88;23431:4;23428:1;23421:15;23455:4;23452:1;23445:15;23471:184;-1:-1:-1;;;23520:1:1;23513:88;23620:4;23617:1;23610:15;23644:4;23641:1;23634:15;23660:184;-1:-1:-1;;;23709:1:1;23702:88;23809:4;23806:1;23799:15;23833:4;23830:1;23823:15;23849:177;-1:-1:-1;;;;;;23927:5:1;23923:78;23916:5;23913:89;23903:117;;24016:1;24013;24006:12

Swarm Source

ipfs://f2a7928f3591564194169c40d579dbddbb8530f62a3c88fc75aa97bcc14f4835
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.