ETH Price: $3,483.77 (+4.13%)

Token

TheLoopssessed (Loopsssd)
 

Overview

Max Total Supply

5,000 Loopsssd

Holders

2,112

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 Loopsssd
0x1C6D8d942410248A3487c880Ad9FbBd1e913FE86
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:
Loopssssd

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: contracts/IMeta.sol



//             _,.---._       _,.---._        _ __      ,-,--.    ,-,--.    ,-,--.    ,-,--.               
//   _.-.    ,-.' , -  `.   ,-.' , -  `.   .-`.' ,`.  ,-.'-  _\ ,-.'-  _\ ,-.'-  _\ ,-.'-  _\  _,..---._   
// .-,.'|   /==/_,  ,  - \ /==/_,  ,  - \ /==/, -   \/==/_ ,_.'/==/_ ,_.'/==/_ ,_.'/==/_ ,_.'/==/,   -  \  
//|==|, |  |==|   .=.     |==|   .=.     |==| _ .=. |\==\  \   \==\  \   \==\  \   \==\  \   |==|   _   _\ 
//|==|- |  |==|_ : ;=:  - |==|_ : ;=:  - |==| , '=',| \==\ -\   \==\ -\   \==\ -\   \==\ -\  |==|  .=.   | 
//|==|, |  |==| , '='     |==| , '='     |==|-  '..'  _\==\ ,\  _\==\ ,\  _\==\ ,\  _\==\ ,\ |==|,|   | -| 
//|==|- `-._\==\ -    ,_ / \==\ -    ,_ /|==|,  |    /==/\/ _ |/==/\/ _ |/==/\/ _ |/==/\/ _ ||==|  '='   / 
///==/ - , ,/'.='. -   .'   '.='. -   .' /==/ - |    \==\ - , /\==\ - , /\==\ - , /\==\ - , /|==|-,   _`/  
//`--`-----'   `--`--''       `--`--''   `--`---'     `--`---'  `--`---'  `--`---'  `--`---' `-.`.____.' 
//creator : @TheLoopssessed
//website : loopssssd.xyz

pragma solidity ^0.8.0;

interface IMeta 
{
    function getMetadata(uint256 tokenId) external view returns (string memory);
}
// File: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/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/security/Pausable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;


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

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

    bool private _paused;

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

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

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

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

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

// File: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A {
    /**
     * 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();

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

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    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;
        // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`.
        uint24 extraData;
    }

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

    // ==============================
    //            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);

    // ==============================
    //            IERC721
    // ==============================

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

    // ==============================
    //        IERC721Metadata
    // ==============================

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

    // ==============================
    //            IERC2309
    // ==============================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`,
     * as defined in the ERC2309 standard. See `_mintERC2309` for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev ERC721 token receiver interface.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @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 IERC721A {
    // Mask of an entry in packed address data.
    uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with `_mintERC2309`.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to `_mintERC2309`
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The tokenId of the next token to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _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 `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see `_totalMinted`.
     */
    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();
        }
    }

    /**
     * @dev 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 Returns the total number of tokens burned.
     */
    function _totalBurned() internal view returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

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

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

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

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

    /**
     * Sets the auxiliary 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 {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // 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.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA);
    }

    /**
     * Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * 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) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, BITMASK_ADDRESS)
            // `owner | (block.timestamp << BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

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

    /**
     * @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, _toString(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, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << BITPOS_NEXT_INITIALIZED`.
            result := shl(BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ownerOf(tokenId);

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

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @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 == _msgSenderERC721A()) revert ApproveToCaller();

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), 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-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 {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            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 && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not 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.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    /**
     * @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 for each mint.
     */
    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` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 tokenId = startTokenId;
            uint256 end = startTokenId + quantity;
            do {
                emit Transfer(address(0), to, tokenId++);
            } while (tokenId < end);

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

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

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals;
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            // Compute the slot.
            mstore(0x00, tokenId)
            mstore(0x20, tokenApprovalsPtr.slot)
            approvedAddressSlot := keccak256(0x00, 0x40)
            // Load the slot's value from storage.
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    /**
     * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`.
     */
    function _isOwnerOrApproved(
        address approvedAddress,
        address from,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean.
            from := and(from, BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, BITMASK_ADDRESS)
            // `msgSender == from || msgSender == approvedAddress`.
            result := or(eq(msgSender, from), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @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 transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // 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 {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        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 {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // 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 {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        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 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 ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << BITPOS_EXTRA_DATA;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * 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 _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

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

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for {
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp {
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } {
                // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }

            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}

// File: contracts/Loopssssd.sol

//SPDX-License-Identifier: MIT

//             _,.---._       _,.---._        _ __      ,-,--.    ,-,--.    ,-,--.    ,-,--.               
//   _.-.    ,-.' , -  `.   ,-.' , -  `.   .-`.' ,`.  ,-.'-  _\ ,-.'-  _\ ,-.'-  _\ ,-.'-  _\  _,..---._   
// .-,.'|   /==/_,  ,  - \ /==/_,  ,  - \ /==/, -   \/==/_ ,_.'/==/_ ,_.'/==/_ ,_.'/==/_ ,_.'/==/,   -  \  
//|==|, |  |==|   .=.     |==|   .=.     |==| _ .=. |\==\  \   \==\  \   \==\  \   \==\  \   |==|   _   _\ 
//|==|- |  |==|_ : ;=:  - |==|_ : ;=:  - |==| , '=',| \==\ -\   \==\ -\   \==\ -\   \==\ -\  |==|  .=.   | 
//|==|, |  |==| , '='     |==| , '='     |==|-  '..'  _\==\ ,\  _\==\ ,\  _\==\ ,\  _\==\ ,\ |==|,|   | -| 
//|==|- `-._\==\ -    ,_ / \==\ -    ,_ /|==|,  |    /==/\/ _ |/==/\/ _ |/==/\/ _ |/==/\/ _ ||==|  '='   / 
///==/ - , ,/'.='. -   .'   '.='. -   .' /==/ - |    \==\ - , /\==\ - , /\==\ - , /\==\ - , /|==|-,   _`/  
//`--`-----'   `--`--''       `--`--''   `--`---'     `--`---'  `--`---'  `--`---'  `--`---' `-.`.____.' 
//creator : @TheLoopssessed
//website : loopssssd.xyz

pragma solidity ^0.8.0; 







contract Loopssssd is ERC721A, Ownable, Pausable 
{
    using Strings for uint256;
    
    uint256 public totalColSize = 5000;
    mapping(address => uint256) public mintList;
    uint256 public walletMintLimit = 2;
    bytes32 public WLMerkleRoot = 0xec85fdcc3b5d1f75860fbb011d86280c43ba670aa6bf82b9d1b2db18c12bbf93;
    address public mdProvider;
    string private baseTokenURI;
    bool public providerBasedURI;
    bool public WLFreeMintActive;
    bool public publicFreeMintActive;

    constructor
    ( 
       string memory _name,
       string memory _symbol,
       string memory _baseTokenURI
    ) ERC721A(_name, _symbol) 
    {
        baseTokenURI = _baseTokenURI;
    }

    modifier callerIsUser() 
    {
        require(tx.origin == msg.sender, "Caller is contract");
        _;
    }

    modifier onlyWLFreeMintActive() {
        require(WLFreeMintActive, "WL Minting is not active");
        _;
    }
    modifier onlyPublicFreeMintActive() {
        require(publicFreeMintActive, "Public Minting is not active");
        _;
    }

    function setMdProvider(address _mdProvider) external onlyOwner {
        mdProvider = _mdProvider;
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(_exists(_tokenId), "Token not existed");
        require( providerBasedURI ? ( mdProvider != address(0) ) : ( keccak256(abi.encodePacked(baseTokenURI)) != keccak256(abi.encodePacked("")) ),
            "Invalid metadata provider address"
        );

        return providerBasedURI ? IMeta(mdProvider).getMetadata(_tokenId) : string(abi.encodePacked(baseTokenURI, _tokenId.toString(),".json"));
    }
    
    
    function setBaseURI(string calldata _baseTokenURI) external onlyOwner 
    {
        baseTokenURI = _baseTokenURI;
    }


    function _startTokenId() internal pure override returns (uint256) {
        return 1;
    }

    function setFreeWLMerkleRoot(bytes32 _WLMerkleRoot)
        external
        onlyOwner
    {
        WLMerkleRoot = _WLMerkleRoot;
    }


    function WLFreeMint(bytes32[] calldata _merkleProof, uint256 quantity)
        external
        payable
        onlyWLFreeMintActive
        callerIsUser 
    {
        
        require(mintList[msg.sender] + quantity <= walletMintLimit, "Up to 2 mints allowed per wallet");
        require(totalSupply() + quantity <= totalColSize, "EXCEED_COL_SIZE");   

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(
             MerkleProof.verify(_merkleProof, WLMerkleRoot, leaf),
             "You are not whitelisted"
         );

        mintList[msg.sender] += quantity;
        _safeMint(msg.sender, quantity);
    }

    function publicFreeMint(uint256 quantity)
        external
        payable
        onlyPublicFreeMintActive
        callerIsUser    
    {
        
        require(mintList[msg.sender] + quantity <= walletMintLimit, "Up to 2 mints allowed per wallet");
        require(totalSupply() + quantity <= totalColSize, "EXCEED_COL_SIZE");

        mintList[msg.sender] += quantity;
        _safeMint(msg.sender, quantity);
    }
    
    function teamMint(uint256 quantity)
        external
        payable
        onlyOwner
    {
        require(quantity > 0, "Invalid quantity");
        require(totalSupply() + quantity <= totalColSize, "EXCEED_COL_SIZE");

        _safeMint(msg.sender, quantity);
    }

    function airdrop(address toAdd,uint256 quantity)
        external
        payable
        onlyOwner
    {
        require(quantity > 0, "Invalid quantity");
        require(totalSupply() + quantity <= totalColSize, "EXCEED_COL_SIZE");

        _safeMint(toAdd, quantity);
    }

    function toggleProviderBasedURI() 
        external 
        onlyOwner 
    {
        providerBasedURI = !providerBasedURI;
    }

    function toggleWLFreeMint() 
        external 
        onlyOwner 
    {
        WLFreeMintActive = !WLFreeMintActive;
    }
    function togglePublicFreeMint() 
        external 
        onlyOwner 
    {
        publicFreeMintActive = !publicFreeMintActive;
    }
    function toggleSoldOut() 
        external 
        onlyOwner 
    {
        WLFreeMintActive = !WLFreeMintActive;
        publicFreeMintActive = !publicFreeMintActive;
    }

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

    function unpause() external onlyOwner {
        _unpause();
    }
    
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 tokenId,
        uint256 quantity
    ) internal override(ERC721A) whenNotPaused 
    {
        super._beforeTokenTransfers(from, to, tokenId, quantity);
    }

    function changeSupply(uint256 _decreaseAmount) 
        external 
        onlyOwner 
    {
        require(_decreaseAmount > 0 ,"Amount must be greater than 0");
        require(totalSupply() < totalColSize ,"Just sold out" );
        require(totalColSize - _decreaseAmount >= totalSupply() ,"Insufficient amount" );
        totalColSize -= _decreaseAmount;
    }

    function changeMintLimitPerWallet(uint256 _newWalletMintLimit) 
        external 
        onlyOwner 
    {
        require(_newWalletMintLimit > 0 ,"Invalid value");
        walletMintLimit = _newWalletMintLimit;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_baseTokenURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"WLFreeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"WLFreeMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WLMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"toAdd","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"payable","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":[{"internalType":"uint256","name":"_newWalletMintLimit","type":"uint256"}],"name":"changeMintLimitPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_decreaseAmount","type":"uint256"}],"name":"changeSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mdProvider","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"providerBasedURI","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicFreeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicFreeMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_WLMerkleRoot","type":"bytes32"}],"name":"setFreeWLMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_mdProvider","type":"address"}],"name":"setMdProvider","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"teamMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"toggleProviderBasedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSoldOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWLFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalColSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"walletMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040526113886009556002600b557fec85fdcc3b5d1f75860fbb011d86280c43ba670aa6bf82b9d1b2db18c12bbf9360001b600c553480156200004357600080fd5b50604051620045da380380620045da833981810160405281019062000069919062000317565b8282816002908051906020019062000083929190620001e9565b5080600390805190602001906200009c929190620001e9565b50620000ad6200011260201b60201c565b6000819055505050620000d5620000c96200011b60201b60201c565b6200012360201b60201c565b6000600860146101000a81548160ff02191690831515021790555080600e908051906020019062000108929190620001e9565b5050505062000554565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001f79062000465565b90600052602060002090601f0160209004810192826200021b576000855562000267565b82601f106200023657805160ff191683800117855562000267565b8280016001018555821562000267579182015b828111156200026657825182559160200191906001019062000249565b5b5090506200027691906200027a565b5090565b5b80821115620002955760008160009055506001016200027b565b5090565b6000620002b0620002aa84620003f9565b620003d0565b905082815260208101848484011115620002cf57620002ce62000534565b5b620002dc8482856200042f565b509392505050565b600082601f830112620002fc57620002fb6200052f565b5b81516200030e84826020860162000299565b91505092915050565b6000806000606084860312156200033357620003326200053e565b5b600084015167ffffffffffffffff81111562000354576200035362000539565b5b6200036286828701620002e4565b935050602084015167ffffffffffffffff81111562000386576200038562000539565b5b6200039486828701620002e4565b925050604084015167ffffffffffffffff811115620003b857620003b762000539565b5b620003c686828701620002e4565b9150509250925092565b6000620003dc620003ef565b9050620003ea82826200049b565b919050565b6000604051905090565b600067ffffffffffffffff82111562000417576200041662000500565b5b620004228262000543565b9050602081019050919050565b60005b838110156200044f57808201518184015260208101905062000432565b838111156200045f576000848401525b50505050565b600060028204905060018216806200047e57607f821691505b60208210811415620004955762000494620004d1565b5b50919050565b620004a68262000543565b810181811067ffffffffffffffff82111715620004c857620004c762000500565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b61407680620005646000396000f3fe6080604052600436106102465760003560e01c806370a08231116101395780638ed21d6a116100b6578063bef432c61161007a578063bef432c61461079a578063c566fc15146107d7578063c87b56dd14610802578063e985e9c51461083f578063f2fde38b1461087c578063fec627e0146108a557610246565b80638ed21d6a146106db57806395d89b41146106f2578063a22cb4651461071d578063aea4832814610746578063b88d4fde1461077157610246565b80637bb232ad116100fd5780637bb232ad146106275780637dc64bba146106525780638456cb591461067d5780638ba4cc3c146106945780638da5cb5b146106b057610246565b806370a0823114610566578063715018a6146105a357806374c28561146105ba57806378c68e16146105e55780637a2c88f11461061057610246565b806340b29b4a116101c757806355f804b31161018b57806355f804b3146104a25780635c975abb146104cb5780636352211e146104f657806363b28ee6146105335780636f3fc2871461054f57610246565b806340b29b4a146103e057806342842e0e146104095780634ac50c901461043257806352148e731461044e5780635501298f1461047757610246565b806323b872dd1161020e57806323b872dd146103445780632d1c34e81461036d5780632fbba1151461038457806339a7919f146103a05780633f4ba83a146103c957610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f057806318160ddd14610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190612f7f565b6108ce565b60405161027f9190613587565b60405180910390f35b34801561029457600080fd5b5061029d610960565b6040516102aa91906135bd565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d5919061306f565b6109f2565b6040516102e79190613520565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190612eb2565b610a6e565b005b34801561032557600080fd5b5061032e610baf565b60405161033b91906137ff565b60405180910390f35b34801561035057600080fd5b5061036b60048036038101906103669190612d9c565b610bc6565b005b34801561037957600080fd5b50610382610eeb565b005b61039e6004803603810190610399919061306f565b610f1f565b005b3480156103ac57600080fd5b506103c760048036038101906103c2919061306f565b610fce565b005b3480156103d557600080fd5b506103de6110d7565b005b3480156103ec57600080fd5b506104076004803603810190610402919061306f565b6110e9565b005b34801561041557600080fd5b50610430600480360381019061042b9190612d9c565b61113e565b005b61044c60048036038101906104479190612ef2565b61115e565b005b34801561045a57600080fd5b5061047560048036038101906104709190612d2f565b61141f565b005b34801561048357600080fd5b5061048c61146b565b6040516104999190613587565b60405180910390f35b3480156104ae57600080fd5b506104c960048036038101906104c49190612fd9565b61147e565b005b3480156104d757600080fd5b506104e061149c565b6040516104ed9190613587565b60405180910390f35b34801561050257600080fd5b5061051d6004803603810190610518919061306f565b6114b3565b60405161052a9190613520565b60405180910390f35b61054d6004803603810190610548919061306f565b6114c5565b005b34801561055b57600080fd5b506105646116cb565b005b34801561057257600080fd5b5061058d60048036038101906105889190612d2f565b6116ff565b60405161059a91906137ff565b60405180910390f35b3480156105af57600080fd5b506105b86117b8565b005b3480156105c657600080fd5b506105cf6117cc565b6040516105dc91906137ff565b60405180910390f35b3480156105f157600080fd5b506105fa6117d2565b6040516106079190613520565b60405180910390f35b34801561061c57600080fd5b506106256117f8565b005b34801561063357600080fd5b5061063c611856565b60405161064991906137ff565b60405180910390f35b34801561065e57600080fd5b5061066761185c565b6040516106749190613587565b60405180910390f35b34801561068957600080fd5b5061069261186f565b005b6106ae60048036038101906106a99190612eb2565b611881565b005b3480156106bc57600080fd5b506106c5611931565b6040516106d29190613520565b60405180910390f35b3480156106e757600080fd5b506106f061195b565b005b3480156106fe57600080fd5b5061070761198f565b60405161071491906135bd565b60405180910390f35b34801561072957600080fd5b50610744600480360381019061073f9190612e72565b611a21565b005b34801561075257600080fd5b5061075b611b99565b60405161076891906135a2565b60405180910390f35b34801561077d57600080fd5b5061079860048036038101906107939190612def565b611b9f565b005b3480156107a657600080fd5b506107c160048036038101906107bc9190612d2f565b611c12565b6040516107ce91906137ff565b60405180910390f35b3480156107e357600080fd5b506107ec611c2a565b6040516107f99190613587565b60405180910390f35b34801561080e57600080fd5b506108296004803603810190610824919061306f565b611c3d565b60405161083691906135bd565b60405180910390f35b34801561084b57600080fd5b5061086660048036038101906108619190612d5c565b611e7e565b6040516108739190613587565b60405180910390f35b34801561088857600080fd5b506108a3600480360381019061089e9190612d2f565b611f12565b005b3480156108b157600080fd5b506108cc60048036038101906108c79190612f52565b611f96565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109595750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461096f90613a74565b80601f016020809104026020016040519081016040528092919081815260200182805461099b90613a74565b80156109e85780601f106109bd576101008083540402835291602001916109e8565b820191906000526020600020905b8154815290600101906020018083116109cb57829003601f168201915b5050505050905090565b60006109fd82611fa8565b610a33576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a79826114b3565b90508073ffffffffffffffffffffffffffffffffffffffff16610a9a612007565b73ffffffffffffffffffffffffffffffffffffffff1614610afd57610ac681610ac1612007565b611e7e565b610afc576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610bb961200f565b6001546000540303905090565b6000610bd182612018565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c38576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610c44846120e6565b91509150610c5a8187610c55612007565b612108565b610ca657610c6f86610c6a612007565b611e7e565b610ca5576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610d0d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d1a868686600161214c565b8015610d2557600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610df385610dcf888887612166565b7c02000000000000000000000000000000000000000000000000000000001761218e565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610e7b576000600185019050600060046000838152602001908152602001600020541415610e79576000548114610e78578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ee386868660016121b9565b505050505050565b610ef36121bf565b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b610f276121bf565b60008111610f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f61906136bf565b60405180910390fd5b60095481610f76610baf565b610f8091906138f9565b1115610fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb89061361f565b60405180910390fd5b610fcb338261223d565b50565b610fd66121bf565b60008111611019576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110109061365f565b60405180910390fd5b600954611024610baf565b10611064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105b906136df565b60405180910390fd5b61106c610baf565b8160095461107a9190613980565b10156110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b2906137bf565b60405180910390fd5b80600960008282546110cd9190613980565b9250508190555050565b6110df6121bf565b6110e761225b565b565b6110f16121bf565b60008111611134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112b9061377f565b60405180910390fd5b80600b8190555050565b61115983838360405180602001604052806000815250611b9f565b505050565b600f60019054906101000a900460ff166111ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a4906137df565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461121b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112129061379f565b60405180910390fd5b600b5481600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461126991906138f9565b11156112aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a1906136ff565b60405180910390fd5b600954816112b6610baf565b6112c091906138f9565b1115611301576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f89061361f565b60405180910390fd5b60003360405160200161131491906134aa565b60405160208183030381529060405280519060200120905061137a848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600c54836122be565b6113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b09061371f565b60405180910390fd5b81600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461140891906138f9565b92505081905550611419338361223d565b50505050565b6114276121bf565b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f60019054906101000a900460ff1681565b6114866121bf565b8181600e9190611497929190612a82565b505050565b6000600860149054906101000a900460ff16905090565b60006114be82612018565b9050919050565b600f60029054906101000a900460ff16611514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150b906135df565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611582576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115799061379f565b60405180910390fd5b600b5481600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115d091906138f9565b1115611611576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611608906136ff565b60405180910390fd5b6009548161161d610baf565b61162791906138f9565b1115611668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165f9061361f565b60405180910390fd5b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116b791906138f9565b925050819055506116c8338261223d565b50565b6116d36121bf565b600f60029054906101000a900460ff1615600f60026101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611767576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6117c06121bf565b6117ca60006122d5565b565b600b5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6118006121bf565b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550600f60029054906101000a900460ff1615600f60026101000a81548160ff021916908315150217905550565b60095481565b600f60029054906101000a900460ff1681565b6118776121bf565b61187f61239b565b565b6118896121bf565b600081116118cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c3906136bf565b60405180910390fd5b600954816118d8610baf565b6118e291906138f9565b1115611923576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191a9061361f565b60405180910390fd5b61192d828261223d565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119636121bf565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b60606003805461199e90613a74565b80601f01602080910402602001604051908101604052809291908181526020018280546119ca90613a74565b8015611a175780601f106119ec57610100808354040283529160200191611a17565b820191906000526020600020905b8154815290600101906020018083116119fa57829003601f168201915b5050505050905090565b611a29612007565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a8e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611a9b612007565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b48612007565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b8d9190613587565b60405180910390a35050565b600c5481565b611baa848484610bc6565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611c0c57611bd5848484846123fe565b611c0b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600a6020528060005260406000206000915090505481565b600f60009054906101000a900460ff1681565b6060611c4882611fa8565b611c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7e9061369f565b60405180910390fd5b600f60009054906101000a900460ff16611cef57604051602001611caa9061350b565b60405160208183030381529060405280519060200120600e604051602001611cd291906134c5565b604051602081830303815290604052805190602001201415611d43565b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b611d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d799061375f565b60405180910390fd5b600f60009054906101000a900460ff16611dc657600e611da18361255e565b604051602001611db29291906134dc565b604051602081830303815290604052611e77565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a574cea4836040518263ffffffff1660e01b8152600401611e2191906137ff565b60006040518083038186803b158015611e3957600080fd5b505afa158015611e4d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611e769190613026565b5b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f1a6121bf565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f819061363f565b60405180910390fd5b611f93816122d5565b50565b611f9e6121bf565b80600c8190555050565b600081611fb361200f565b11158015611fc2575060005482105b8015612000575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b6000808290508061202761200f565b116120af576000548110156120ae5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156120ac575b60008114156120a2576004600083600190039350838152602001908152602001600020549050612077565b80925050506120e1565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b6121546126bf565b61216084848484612709565b50505050565b60008060e883901c905060e861217d86868461270f565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6121c7612718565b73ffffffffffffffffffffffffffffffffffffffff166121e5611931565b73ffffffffffffffffffffffffffffffffffffffff161461223b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122329061373f565b60405180910390fd5b565b612257828260405180602001604052806000815250612720565b5050565b6122636127bd565b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6122a7612718565b6040516122b49190613520565b60405180910390a1565b6000826122cb8584612806565b1490509392505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123a36126bf565b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586123e7612718565b6040516123f49190613520565b60405180910390a1565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612424612007565b8786866040518563ffffffff1660e01b8152600401612446949392919061353b565b602060405180830381600087803b15801561246057600080fd5b505af192505050801561249157506040513d601f19601f8201168201806040525081019061248e9190612fac565b60015b61250b573d80600081146124c1576040519150601f19603f3d011682016040523d82523d6000602084013e6124c6565b606091505b50600081511415612503576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008214156125a6576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126ba565b600082905060005b600082146125d85780806125c190613ad7565b915050600a826125d1919061394f565b91506125ae565b60008167ffffffffffffffff8111156125f4576125f3613c31565b5b6040519080825280601f01601f1916602001820160405280156126265781602001600182028036833780820191505090505b5090505b600085146126b35760018261263f9190613980565b9150600a8561264e9190613b44565b603061265a91906138f9565b60f81b8183815181106126705761266f613c02565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126ac919061394f565b945061262a565b8093505050505b919050565b6126c761149c565b15612707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fe9061367f565b60405180910390fd5b565b50505050565b60009392505050565b600033905090565b61272a838361285c565b60008373ffffffffffffffffffffffffffffffffffffffff163b146127b857600080549050600083820390505b61276a60008683806001019450866123fe565b6127a0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106127575781600054146127b557600080fd5b50505b505050565b6127c561149c565b612804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fb906135ff565b60405180910390fd5b565b60008082905060005b84518110156128515761283c8286838151811061282f5761282e613c02565b5b6020026020010151612a30565b9150808061284990613ad7565b91505061280f565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128c9576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612904576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612911600084838561214c565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612988836129796000866000612166565b61298285612a5b565b1761218e565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106129ac57806000819055505050612a2b60008483856121b9565b505050565b6000818310612a4857612a438284612a6b565b612a53565b612a528383612a6b565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b828054612a8e90613a74565b90600052602060002090601f016020900481019282612ab05760008555612af7565b82601f10612ac957803560ff1916838001178555612af7565b82800160010185558215612af7579182015b82811115612af6578235825591602001919060010190612adb565b5b509050612b049190612b08565b5090565b5b80821115612b21576000816000905550600101612b09565b5090565b6000612b38612b338461383f565b61381a565b905082815260208101848484011115612b5457612b53613c6f565b5b612b5f848285613a32565b509392505050565b6000612b7a612b7584613870565b61381a565b905082815260208101848484011115612b9657612b95613c6f565b5b612ba1848285613a41565b509392505050565b600081359050612bb881613fcd565b92915050565b60008083601f840112612bd457612bd3613c65565b5b8235905067ffffffffffffffff811115612bf157612bf0613c60565b5b602083019150836020820283011115612c0d57612c0c613c6a565b5b9250929050565b600081359050612c2381613fe4565b92915050565b600081359050612c3881613ffb565b92915050565b600081359050612c4d81614012565b92915050565b600081519050612c6281614012565b92915050565b600082601f830112612c7d57612c7c613c65565b5b8135612c8d848260208601612b25565b91505092915050565b60008083601f840112612cac57612cab613c65565b5b8235905067ffffffffffffffff811115612cc957612cc8613c60565b5b602083019150836001820283011115612ce557612ce4613c6a565b5b9250929050565b600082601f830112612d0157612d00613c65565b5b8151612d11848260208601612b67565b91505092915050565b600081359050612d2981614029565b92915050565b600060208284031215612d4557612d44613c79565b5b6000612d5384828501612ba9565b91505092915050565b60008060408385031215612d7357612d72613c79565b5b6000612d8185828601612ba9565b9250506020612d9285828601612ba9565b9150509250929050565b600080600060608486031215612db557612db4613c79565b5b6000612dc386828701612ba9565b9350506020612dd486828701612ba9565b9250506040612de586828701612d1a565b9150509250925092565b60008060008060808587031215612e0957612e08613c79565b5b6000612e1787828801612ba9565b9450506020612e2887828801612ba9565b9350506040612e3987828801612d1a565b925050606085013567ffffffffffffffff811115612e5a57612e59613c74565b5b612e6687828801612c68565b91505092959194509250565b60008060408385031215612e8957612e88613c79565b5b6000612e9785828601612ba9565b9250506020612ea885828601612c14565b9150509250929050565b60008060408385031215612ec957612ec8613c79565b5b6000612ed785828601612ba9565b9250506020612ee885828601612d1a565b9150509250929050565b600080600060408486031215612f0b57612f0a613c79565b5b600084013567ffffffffffffffff811115612f2957612f28613c74565b5b612f3586828701612bbe565b93509350506020612f4886828701612d1a565b9150509250925092565b600060208284031215612f6857612f67613c79565b5b6000612f7684828501612c29565b91505092915050565b600060208284031215612f9557612f94613c79565b5b6000612fa384828501612c3e565b91505092915050565b600060208284031215612fc257612fc1613c79565b5b6000612fd084828501612c53565b91505092915050565b60008060208385031215612ff057612fef613c79565b5b600083013567ffffffffffffffff81111561300e5761300d613c74565b5b61301a85828601612c96565b92509250509250929050565b60006020828403121561303c5761303b613c79565b5b600082015167ffffffffffffffff81111561305a57613059613c74565b5b61306684828501612cec565b91505092915050565b60006020828403121561308557613084613c79565b5b600061309384828501612d1a565b91505092915050565b6130a5816139b4565b82525050565b6130bc6130b7826139b4565b613b20565b82525050565b6130cb816139c6565b82525050565b6130da816139d2565b82525050565b60006130eb826138b6565b6130f581856138cc565b9350613105818560208601613a41565b61310e81613c7e565b840191505092915050565b6000613124826138c1565b61312e81856138dd565b935061313e818560208601613a41565b61314781613c7e565b840191505092915050565b600061315d826138c1565b61316781856138ee565b9350613177818560208601613a41565b80840191505092915050565b6000815461319081613a74565b61319a81866138ee565b945060018216600081146131b557600181146131c6576131f9565b60ff198316865281860193506131f9565b6131cf856138a1565b60005b838110156131f1578154818901526001820191506020810190506131d2565b838801955050505b50505092915050565b600061320f601c836138dd565b915061321a82613c9c565b602082019050919050565b60006132326014836138dd565b915061323d82613cc5565b602082019050919050565b6000613255600f836138dd565b915061326082613cee565b602082019050919050565b60006132786026836138dd565b915061328382613d17565b604082019050919050565b600061329b601d836138dd565b91506132a682613d66565b602082019050919050565b60006132be6010836138dd565b91506132c982613d8f565b602082019050919050565b60006132e16011836138dd565b91506132ec82613db8565b602082019050919050565b60006133046010836138dd565b915061330f82613de1565b602082019050919050565b6000613327600d836138dd565b915061333282613e0a565b602082019050919050565b600061334a6020836138dd565b915061335582613e33565b602082019050919050565b600061336d6017836138dd565b915061337882613e5c565b602082019050919050565b60006133906005836138ee565b915061339b82613e85565b600582019050919050565b60006133b36020836138dd565b91506133be82613eae565b602082019050919050565b60006133d66021836138dd565b91506133e182613ed7565b604082019050919050565b60006133f9600d836138dd565b915061340482613f26565b602082019050919050565b600061341c6012836138dd565b915061342782613f4f565b602082019050919050565b600061343f6013836138dd565b915061344a82613f78565b602082019050919050565b60006134626000836138ee565b915061346d82613fa1565b600082019050919050565b60006134856018836138dd565b915061349082613fa4565b602082019050919050565b6134a481613a28565b82525050565b60006134b682846130ab565b60148201915081905092915050565b60006134d18284613183565b915081905092915050565b60006134e88285613183565b91506134f48284613152565b91506134ff82613383565b91508190509392505050565b600061351682613455565b9150819050919050565b6000602082019050613535600083018461309c565b92915050565b6000608082019050613550600083018761309c565b61355d602083018661309c565b61356a604083018561349b565b818103606083015261357c81846130e0565b905095945050505050565b600060208201905061359c60008301846130c2565b92915050565b60006020820190506135b760008301846130d1565b92915050565b600060208201905081810360008301526135d78184613119565b905092915050565b600060208201905081810360008301526135f881613202565b9050919050565b6000602082019050818103600083015261361881613225565b9050919050565b6000602082019050818103600083015261363881613248565b9050919050565b600060208201905081810360008301526136588161326b565b9050919050565b600060208201905081810360008301526136788161328e565b9050919050565b60006020820190508181036000830152613698816132b1565b9050919050565b600060208201905081810360008301526136b8816132d4565b9050919050565b600060208201905081810360008301526136d8816132f7565b9050919050565b600060208201905081810360008301526136f88161331a565b9050919050565b600060208201905081810360008301526137188161333d565b9050919050565b6000602082019050818103600083015261373881613360565b9050919050565b60006020820190508181036000830152613758816133a6565b9050919050565b60006020820190508181036000830152613778816133c9565b9050919050565b60006020820190508181036000830152613798816133ec565b9050919050565b600060208201905081810360008301526137b88161340f565b9050919050565b600060208201905081810360008301526137d881613432565b9050919050565b600060208201905081810360008301526137f881613478565b9050919050565b6000602082019050613814600083018461349b565b92915050565b6000613824613835565b90506138308282613aa6565b919050565b6000604051905090565b600067ffffffffffffffff82111561385a57613859613c31565b5b61386382613c7e565b9050602081019050919050565b600067ffffffffffffffff82111561388b5761388a613c31565b5b61389482613c7e565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061390482613a28565b915061390f83613a28565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561394457613943613b75565b5b828201905092915050565b600061395a82613a28565b915061396583613a28565b92508261397557613974613ba4565b5b828204905092915050565b600061398b82613a28565b915061399683613a28565b9250828210156139a9576139a8613b75565b5b828203905092915050565b60006139bf82613a08565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613a5f578082015181840152602081019050613a44565b83811115613a6e576000848401525b50505050565b60006002820490506001821680613a8c57607f821691505b60208210811415613aa057613a9f613bd3565b5b50919050565b613aaf82613c7e565b810181811067ffffffffffffffff82111715613ace57613acd613c31565b5b80604052505050565b6000613ae282613a28565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b1557613b14613b75565b5b600182019050919050565b6000613b2b82613b32565b9050919050565b6000613b3d82613c8f565b9050919050565b6000613b4f82613a28565b9150613b5a83613a28565b925082613b6a57613b69613ba4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f5075626c6963204d696e74696e67206973206e6f742061637469766500000000600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4558434545445f434f4c5f53495a450000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f416d6f756e74206d7573742062652067726561746572207468616e2030000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f546f6b656e206e6f742065786973746564000000000000000000000000000000600082015250565b7f496e76616c6964207175616e7469747900000000000000000000000000000000600082015250565b7f4a75737420736f6c64206f757400000000000000000000000000000000000000600082015250565b7f557020746f2032206d696e747320616c6c6f776564207065722077616c6c6574600082015250565b7f596f7520617265206e6f742077686974656c6973746564000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e76616c6964206d657461646174612070726f76696465722061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c69642076616c756500000000000000000000000000000000000000600082015250565b7f43616c6c657220697320636f6e74726163740000000000000000000000000000600082015250565b7f496e73756666696369656e7420616d6f756e7400000000000000000000000000600082015250565b50565b7f574c204d696e74696e67206973206e6f74206163746976650000000000000000600082015250565b613fd6816139b4565b8114613fe157600080fd5b50565b613fed816139c6565b8114613ff857600080fd5b50565b614004816139d2565b811461400f57600080fd5b50565b61401b816139dc565b811461402657600080fd5b50565b61403281613a28565b811461403d57600080fd5b5056fea2646970667358221220f459ece54c7ccb593bafb74606845b744ad7a7de61407f7d9b81795c46b898d164736f6c63430008070033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000e5468654c6f6f707373657373656400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084c6f6f7073737364000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005268747470733a2f2f73746f726167656170692e666c65656b2e636f2f35343637646635372d376636322d346565362d396637632d3236613238663164633735382d6275636b65742f7365637265745f6d642f0000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102465760003560e01c806370a08231116101395780638ed21d6a116100b6578063bef432c61161007a578063bef432c61461079a578063c566fc15146107d7578063c87b56dd14610802578063e985e9c51461083f578063f2fde38b1461087c578063fec627e0146108a557610246565b80638ed21d6a146106db57806395d89b41146106f2578063a22cb4651461071d578063aea4832814610746578063b88d4fde1461077157610246565b80637bb232ad116100fd5780637bb232ad146106275780637dc64bba146106525780638456cb591461067d5780638ba4cc3c146106945780638da5cb5b146106b057610246565b806370a0823114610566578063715018a6146105a357806374c28561146105ba57806378c68e16146105e55780637a2c88f11461061057610246565b806340b29b4a116101c757806355f804b31161018b57806355f804b3146104a25780635c975abb146104cb5780636352211e146104f657806363b28ee6146105335780636f3fc2871461054f57610246565b806340b29b4a146103e057806342842e0e146104095780634ac50c901461043257806352148e731461044e5780635501298f1461047757610246565b806323b872dd1161020e57806323b872dd146103445780632d1c34e81461036d5780632fbba1151461038457806339a7919f146103a05780633f4ba83a146103c957610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063095ea7b3146102f057806318160ddd14610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190612f7f565b6108ce565b60405161027f9190613587565b60405180910390f35b34801561029457600080fd5b5061029d610960565b6040516102aa91906135bd565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d5919061306f565b6109f2565b6040516102e79190613520565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190612eb2565b610a6e565b005b34801561032557600080fd5b5061032e610baf565b60405161033b91906137ff565b60405180910390f35b34801561035057600080fd5b5061036b60048036038101906103669190612d9c565b610bc6565b005b34801561037957600080fd5b50610382610eeb565b005b61039e6004803603810190610399919061306f565b610f1f565b005b3480156103ac57600080fd5b506103c760048036038101906103c2919061306f565b610fce565b005b3480156103d557600080fd5b506103de6110d7565b005b3480156103ec57600080fd5b506104076004803603810190610402919061306f565b6110e9565b005b34801561041557600080fd5b50610430600480360381019061042b9190612d9c565b61113e565b005b61044c60048036038101906104479190612ef2565b61115e565b005b34801561045a57600080fd5b5061047560048036038101906104709190612d2f565b61141f565b005b34801561048357600080fd5b5061048c61146b565b6040516104999190613587565b60405180910390f35b3480156104ae57600080fd5b506104c960048036038101906104c49190612fd9565b61147e565b005b3480156104d757600080fd5b506104e061149c565b6040516104ed9190613587565b60405180910390f35b34801561050257600080fd5b5061051d6004803603810190610518919061306f565b6114b3565b60405161052a9190613520565b60405180910390f35b61054d6004803603810190610548919061306f565b6114c5565b005b34801561055b57600080fd5b506105646116cb565b005b34801561057257600080fd5b5061058d60048036038101906105889190612d2f565b6116ff565b60405161059a91906137ff565b60405180910390f35b3480156105af57600080fd5b506105b86117b8565b005b3480156105c657600080fd5b506105cf6117cc565b6040516105dc91906137ff565b60405180910390f35b3480156105f157600080fd5b506105fa6117d2565b6040516106079190613520565b60405180910390f35b34801561061c57600080fd5b506106256117f8565b005b34801561063357600080fd5b5061063c611856565b60405161064991906137ff565b60405180910390f35b34801561065e57600080fd5b5061066761185c565b6040516106749190613587565b60405180910390f35b34801561068957600080fd5b5061069261186f565b005b6106ae60048036038101906106a99190612eb2565b611881565b005b3480156106bc57600080fd5b506106c5611931565b6040516106d29190613520565b60405180910390f35b3480156106e757600080fd5b506106f061195b565b005b3480156106fe57600080fd5b5061070761198f565b60405161071491906135bd565b60405180910390f35b34801561072957600080fd5b50610744600480360381019061073f9190612e72565b611a21565b005b34801561075257600080fd5b5061075b611b99565b60405161076891906135a2565b60405180910390f35b34801561077d57600080fd5b5061079860048036038101906107939190612def565b611b9f565b005b3480156107a657600080fd5b506107c160048036038101906107bc9190612d2f565b611c12565b6040516107ce91906137ff565b60405180910390f35b3480156107e357600080fd5b506107ec611c2a565b6040516107f99190613587565b60405180910390f35b34801561080e57600080fd5b506108296004803603810190610824919061306f565b611c3d565b60405161083691906135bd565b60405180910390f35b34801561084b57600080fd5b5061086660048036038101906108619190612d5c565b611e7e565b6040516108739190613587565b60405180910390f35b34801561088857600080fd5b506108a3600480360381019061089e9190612d2f565b611f12565b005b3480156108b157600080fd5b506108cc60048036038101906108c79190612f52565b611f96565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109595750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461096f90613a74565b80601f016020809104026020016040519081016040528092919081815260200182805461099b90613a74565b80156109e85780601f106109bd576101008083540402835291602001916109e8565b820191906000526020600020905b8154815290600101906020018083116109cb57829003601f168201915b5050505050905090565b60006109fd82611fa8565b610a33576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a79826114b3565b90508073ffffffffffffffffffffffffffffffffffffffff16610a9a612007565b73ffffffffffffffffffffffffffffffffffffffff1614610afd57610ac681610ac1612007565b611e7e565b610afc576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610bb961200f565b6001546000540303905090565b6000610bd182612018565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c38576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610c44846120e6565b91509150610c5a8187610c55612007565b612108565b610ca657610c6f86610c6a612007565b611e7e565b610ca5576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610d0d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d1a868686600161214c565b8015610d2557600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610df385610dcf888887612166565b7c02000000000000000000000000000000000000000000000000000000001761218e565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610e7b576000600185019050600060046000838152602001908152602001600020541415610e79576000548114610e78578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ee386868660016121b9565b505050505050565b610ef36121bf565b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b610f276121bf565b60008111610f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f61906136bf565b60405180910390fd5b60095481610f76610baf565b610f8091906138f9565b1115610fc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb89061361f565b60405180910390fd5b610fcb338261223d565b50565b610fd66121bf565b60008111611019576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110109061365f565b60405180910390fd5b600954611024610baf565b10611064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105b906136df565b60405180910390fd5b61106c610baf565b8160095461107a9190613980565b10156110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b2906137bf565b60405180910390fd5b80600960008282546110cd9190613980565b9250508190555050565b6110df6121bf565b6110e761225b565b565b6110f16121bf565b60008111611134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112b9061377f565b60405180910390fd5b80600b8190555050565b61115983838360405180602001604052806000815250611b9f565b505050565b600f60019054906101000a900460ff166111ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a4906137df565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461121b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112129061379f565b60405180910390fd5b600b5481600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461126991906138f9565b11156112aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a1906136ff565b60405180910390fd5b600954816112b6610baf565b6112c091906138f9565b1115611301576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f89061361f565b60405180910390fd5b60003360405160200161131491906134aa565b60405160208183030381529060405280519060200120905061137a848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600c54836122be565b6113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b09061371f565b60405180910390fd5b81600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461140891906138f9565b92505081905550611419338361223d565b50505050565b6114276121bf565b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f60019054906101000a900460ff1681565b6114866121bf565b8181600e9190611497929190612a82565b505050565b6000600860149054906101000a900460ff16905090565b60006114be82612018565b9050919050565b600f60029054906101000a900460ff16611514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150b906135df565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611582576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115799061379f565b60405180910390fd5b600b5481600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115d091906138f9565b1115611611576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611608906136ff565b60405180910390fd5b6009548161161d610baf565b61162791906138f9565b1115611668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165f9061361f565b60405180910390fd5b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116b791906138f9565b925050819055506116c8338261223d565b50565b6116d36121bf565b600f60029054906101000a900460ff1615600f60026101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611767576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6117c06121bf565b6117ca60006122d5565b565b600b5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6118006121bf565b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550600f60029054906101000a900460ff1615600f60026101000a81548160ff021916908315150217905550565b60095481565b600f60029054906101000a900460ff1681565b6118776121bf565b61187f61239b565b565b6118896121bf565b600081116118cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c3906136bf565b60405180910390fd5b600954816118d8610baf565b6118e291906138f9565b1115611923576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191a9061361f565b60405180910390fd5b61192d828261223d565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119636121bf565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b60606003805461199e90613a74565b80601f01602080910402602001604051908101604052809291908181526020018280546119ca90613a74565b8015611a175780601f106119ec57610100808354040283529160200191611a17565b820191906000526020600020905b8154815290600101906020018083116119fa57829003601f168201915b5050505050905090565b611a29612007565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a8e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611a9b612007565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b48612007565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b8d9190613587565b60405180910390a35050565b600c5481565b611baa848484610bc6565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611c0c57611bd5848484846123fe565b611c0b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600a6020528060005260406000206000915090505481565b600f60009054906101000a900460ff1681565b6060611c4882611fa8565b611c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7e9061369f565b60405180910390fd5b600f60009054906101000a900460ff16611cef57604051602001611caa9061350b565b60405160208183030381529060405280519060200120600e604051602001611cd291906134c5565b604051602081830303815290604052805190602001201415611d43565b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b611d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d799061375f565b60405180910390fd5b600f60009054906101000a900460ff16611dc657600e611da18361255e565b604051602001611db29291906134dc565b604051602081830303815290604052611e77565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a574cea4836040518263ffffffff1660e01b8152600401611e2191906137ff565b60006040518083038186803b158015611e3957600080fd5b505afa158015611e4d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611e769190613026565b5b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f1a6121bf565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f819061363f565b60405180910390fd5b611f93816122d5565b50565b611f9e6121bf565b80600c8190555050565b600081611fb361200f565b11158015611fc2575060005482105b8015612000575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b6000808290508061202761200f565b116120af576000548110156120ae5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156120ac575b60008114156120a2576004600083600190039350838152602001908152602001600020549050612077565b80925050506120e1565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b6121546126bf565b61216084848484612709565b50505050565b60008060e883901c905060e861217d86868461270f565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6121c7612718565b73ffffffffffffffffffffffffffffffffffffffff166121e5611931565b73ffffffffffffffffffffffffffffffffffffffff161461223b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122329061373f565b60405180910390fd5b565b612257828260405180602001604052806000815250612720565b5050565b6122636127bd565b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6122a7612718565b6040516122b49190613520565b60405180910390a1565b6000826122cb8584612806565b1490509392505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123a36126bf565b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586123e7612718565b6040516123f49190613520565b60405180910390a1565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612424612007565b8786866040518563ffffffff1660e01b8152600401612446949392919061353b565b602060405180830381600087803b15801561246057600080fd5b505af192505050801561249157506040513d601f19601f8201168201806040525081019061248e9190612fac565b60015b61250b573d80600081146124c1576040519150601f19603f3d011682016040523d82523d6000602084013e6124c6565b606091505b50600081511415612503576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008214156125a6576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126ba565b600082905060005b600082146125d85780806125c190613ad7565b915050600a826125d1919061394f565b91506125ae565b60008167ffffffffffffffff8111156125f4576125f3613c31565b5b6040519080825280601f01601f1916602001820160405280156126265781602001600182028036833780820191505090505b5090505b600085146126b35760018261263f9190613980565b9150600a8561264e9190613b44565b603061265a91906138f9565b60f81b8183815181106126705761266f613c02565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126ac919061394f565b945061262a565b8093505050505b919050565b6126c761149c565b15612707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fe9061367f565b60405180910390fd5b565b50505050565b60009392505050565b600033905090565b61272a838361285c565b60008373ffffffffffffffffffffffffffffffffffffffff163b146127b857600080549050600083820390505b61276a60008683806001019450866123fe565b6127a0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106127575781600054146127b557600080fd5b50505b505050565b6127c561149c565b612804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fb906135ff565b60405180910390fd5b565b60008082905060005b84518110156128515761283c8286838151811061282f5761282e613c02565b5b6020026020010151612a30565b9150808061284990613ad7565b91505061280f565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128c9576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612904576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612911600084838561214c565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612988836129796000866000612166565b61298285612a5b565b1761218e565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106129ac57806000819055505050612a2b60008483856121b9565b505050565b6000818310612a4857612a438284612a6b565b612a53565b612a528383612a6b565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b828054612a8e90613a74565b90600052602060002090601f016020900481019282612ab05760008555612af7565b82601f10612ac957803560ff1916838001178555612af7565b82800160010185558215612af7579182015b82811115612af6578235825591602001919060010190612adb565b5b509050612b049190612b08565b5090565b5b80821115612b21576000816000905550600101612b09565b5090565b6000612b38612b338461383f565b61381a565b905082815260208101848484011115612b5457612b53613c6f565b5b612b5f848285613a32565b509392505050565b6000612b7a612b7584613870565b61381a565b905082815260208101848484011115612b9657612b95613c6f565b5b612ba1848285613a41565b509392505050565b600081359050612bb881613fcd565b92915050565b60008083601f840112612bd457612bd3613c65565b5b8235905067ffffffffffffffff811115612bf157612bf0613c60565b5b602083019150836020820283011115612c0d57612c0c613c6a565b5b9250929050565b600081359050612c2381613fe4565b92915050565b600081359050612c3881613ffb565b92915050565b600081359050612c4d81614012565b92915050565b600081519050612c6281614012565b92915050565b600082601f830112612c7d57612c7c613c65565b5b8135612c8d848260208601612b25565b91505092915050565b60008083601f840112612cac57612cab613c65565b5b8235905067ffffffffffffffff811115612cc957612cc8613c60565b5b602083019150836001820283011115612ce557612ce4613c6a565b5b9250929050565b600082601f830112612d0157612d00613c65565b5b8151612d11848260208601612b67565b91505092915050565b600081359050612d2981614029565b92915050565b600060208284031215612d4557612d44613c79565b5b6000612d5384828501612ba9565b91505092915050565b60008060408385031215612d7357612d72613c79565b5b6000612d8185828601612ba9565b9250506020612d9285828601612ba9565b9150509250929050565b600080600060608486031215612db557612db4613c79565b5b6000612dc386828701612ba9565b9350506020612dd486828701612ba9565b9250506040612de586828701612d1a565b9150509250925092565b60008060008060808587031215612e0957612e08613c79565b5b6000612e1787828801612ba9565b9450506020612e2887828801612ba9565b9350506040612e3987828801612d1a565b925050606085013567ffffffffffffffff811115612e5a57612e59613c74565b5b612e6687828801612c68565b91505092959194509250565b60008060408385031215612e8957612e88613c79565b5b6000612e9785828601612ba9565b9250506020612ea885828601612c14565b9150509250929050565b60008060408385031215612ec957612ec8613c79565b5b6000612ed785828601612ba9565b9250506020612ee885828601612d1a565b9150509250929050565b600080600060408486031215612f0b57612f0a613c79565b5b600084013567ffffffffffffffff811115612f2957612f28613c74565b5b612f3586828701612bbe565b93509350506020612f4886828701612d1a565b9150509250925092565b600060208284031215612f6857612f67613c79565b5b6000612f7684828501612c29565b91505092915050565b600060208284031215612f9557612f94613c79565b5b6000612fa384828501612c3e565b91505092915050565b600060208284031215612fc257612fc1613c79565b5b6000612fd084828501612c53565b91505092915050565b60008060208385031215612ff057612fef613c79565b5b600083013567ffffffffffffffff81111561300e5761300d613c74565b5b61301a85828601612c96565b92509250509250929050565b60006020828403121561303c5761303b613c79565b5b600082015167ffffffffffffffff81111561305a57613059613c74565b5b61306684828501612cec565b91505092915050565b60006020828403121561308557613084613c79565b5b600061309384828501612d1a565b91505092915050565b6130a5816139b4565b82525050565b6130bc6130b7826139b4565b613b20565b82525050565b6130cb816139c6565b82525050565b6130da816139d2565b82525050565b60006130eb826138b6565b6130f581856138cc565b9350613105818560208601613a41565b61310e81613c7e565b840191505092915050565b6000613124826138c1565b61312e81856138dd565b935061313e818560208601613a41565b61314781613c7e565b840191505092915050565b600061315d826138c1565b61316781856138ee565b9350613177818560208601613a41565b80840191505092915050565b6000815461319081613a74565b61319a81866138ee565b945060018216600081146131b557600181146131c6576131f9565b60ff198316865281860193506131f9565b6131cf856138a1565b60005b838110156131f1578154818901526001820191506020810190506131d2565b838801955050505b50505092915050565b600061320f601c836138dd565b915061321a82613c9c565b602082019050919050565b60006132326014836138dd565b915061323d82613cc5565b602082019050919050565b6000613255600f836138dd565b915061326082613cee565b602082019050919050565b60006132786026836138dd565b915061328382613d17565b604082019050919050565b600061329b601d836138dd565b91506132a682613d66565b602082019050919050565b60006132be6010836138dd565b91506132c982613d8f565b602082019050919050565b60006132e16011836138dd565b91506132ec82613db8565b602082019050919050565b60006133046010836138dd565b915061330f82613de1565b602082019050919050565b6000613327600d836138dd565b915061333282613e0a565b602082019050919050565b600061334a6020836138dd565b915061335582613e33565b602082019050919050565b600061336d6017836138dd565b915061337882613e5c565b602082019050919050565b60006133906005836138ee565b915061339b82613e85565b600582019050919050565b60006133b36020836138dd565b91506133be82613eae565b602082019050919050565b60006133d66021836138dd565b91506133e182613ed7565b604082019050919050565b60006133f9600d836138dd565b915061340482613f26565b602082019050919050565b600061341c6012836138dd565b915061342782613f4f565b602082019050919050565b600061343f6013836138dd565b915061344a82613f78565b602082019050919050565b60006134626000836138ee565b915061346d82613fa1565b600082019050919050565b60006134856018836138dd565b915061349082613fa4565b602082019050919050565b6134a481613a28565b82525050565b60006134b682846130ab565b60148201915081905092915050565b60006134d18284613183565b915081905092915050565b60006134e88285613183565b91506134f48284613152565b91506134ff82613383565b91508190509392505050565b600061351682613455565b9150819050919050565b6000602082019050613535600083018461309c565b92915050565b6000608082019050613550600083018761309c565b61355d602083018661309c565b61356a604083018561349b565b818103606083015261357c81846130e0565b905095945050505050565b600060208201905061359c60008301846130c2565b92915050565b60006020820190506135b760008301846130d1565b92915050565b600060208201905081810360008301526135d78184613119565b905092915050565b600060208201905081810360008301526135f881613202565b9050919050565b6000602082019050818103600083015261361881613225565b9050919050565b6000602082019050818103600083015261363881613248565b9050919050565b600060208201905081810360008301526136588161326b565b9050919050565b600060208201905081810360008301526136788161328e565b9050919050565b60006020820190508181036000830152613698816132b1565b9050919050565b600060208201905081810360008301526136b8816132d4565b9050919050565b600060208201905081810360008301526136d8816132f7565b9050919050565b600060208201905081810360008301526136f88161331a565b9050919050565b600060208201905081810360008301526137188161333d565b9050919050565b6000602082019050818103600083015261373881613360565b9050919050565b60006020820190508181036000830152613758816133a6565b9050919050565b60006020820190508181036000830152613778816133c9565b9050919050565b60006020820190508181036000830152613798816133ec565b9050919050565b600060208201905081810360008301526137b88161340f565b9050919050565b600060208201905081810360008301526137d881613432565b9050919050565b600060208201905081810360008301526137f881613478565b9050919050565b6000602082019050613814600083018461349b565b92915050565b6000613824613835565b90506138308282613aa6565b919050565b6000604051905090565b600067ffffffffffffffff82111561385a57613859613c31565b5b61386382613c7e565b9050602081019050919050565b600067ffffffffffffffff82111561388b5761388a613c31565b5b61389482613c7e565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061390482613a28565b915061390f83613a28565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561394457613943613b75565b5b828201905092915050565b600061395a82613a28565b915061396583613a28565b92508261397557613974613ba4565b5b828204905092915050565b600061398b82613a28565b915061399683613a28565b9250828210156139a9576139a8613b75565b5b828203905092915050565b60006139bf82613a08565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613a5f578082015181840152602081019050613a44565b83811115613a6e576000848401525b50505050565b60006002820490506001821680613a8c57607f821691505b60208210811415613aa057613a9f613bd3565b5b50919050565b613aaf82613c7e565b810181811067ffffffffffffffff82111715613ace57613acd613c31565b5b80604052505050565b6000613ae282613a28565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b1557613b14613b75565b5b600182019050919050565b6000613b2b82613b32565b9050919050565b6000613b3d82613c8f565b9050919050565b6000613b4f82613a28565b9150613b5a83613a28565b925082613b6a57613b69613ba4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f5075626c6963204d696e74696e67206973206e6f742061637469766500000000600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4558434545445f434f4c5f53495a450000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f416d6f756e74206d7573742062652067726561746572207468616e2030000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f546f6b656e206e6f742065786973746564000000000000000000000000000000600082015250565b7f496e76616c6964207175616e7469747900000000000000000000000000000000600082015250565b7f4a75737420736f6c64206f757400000000000000000000000000000000000000600082015250565b7f557020746f2032206d696e747320616c6c6f776564207065722077616c6c6574600082015250565b7f596f7520617265206e6f742077686974656c6973746564000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e76616c6964206d657461646174612070726f76696465722061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c69642076616c756500000000000000000000000000000000000000600082015250565b7f43616c6c657220697320636f6e74726163740000000000000000000000000000600082015250565b7f496e73756666696369656e7420616d6f756e7400000000000000000000000000600082015250565b50565b7f574c204d696e74696e67206973206e6f74206163746976650000000000000000600082015250565b613fd6816139b4565b8114613fe157600080fd5b50565b613fed816139c6565b8114613ff857600080fd5b50565b614004816139d2565b811461400f57600080fd5b50565b61401b816139dc565b811461402657600080fd5b50565b61403281613a28565b811461403d57600080fd5b5056fea2646970667358221220f459ece54c7ccb593bafb74606845b744ad7a7de61407f7d9b81795c46b898d164736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000e5468654c6f6f707373657373656400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084c6f6f7073737364000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005268747470733a2f2f73746f726167656170692e666c65656b2e636f2f35343637646635372d376636322d346565362d396637632d3236613238663164633735382d6275636b65742f7365637265745f6d642f0000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): TheLoopssessed
Arg [1] : _symbol (string): Loopsssd
Arg [2] : _baseTokenURI (string): https://storageapi.fleek.co/5467df57-7f62-4ee6-9f7c-26a28f1dc758-bucket/secret_md/

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [4] : 5468654c6f6f7073736573736564000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [6] : 4c6f6f7073737364000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000052
Arg [8] : 68747470733a2f2f73746f726167656170692e666c65656b2e636f2f35343637
Arg [9] : 646635372d376636322d346565362d396637632d323661323866316463373538
Arg [10] : 2d6275636b65742f7365637265745f6d642f0000000000000000000000000000


Deployed Bytecode Sourcemap

64547:5506:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33268:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38915:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40861:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40409:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32322:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50126:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68562:128;;;;;;;;;;;;;:::i;:::-;;67840:278;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69445:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69101:67;;;;;;;;;;;;;:::i;:::-;;69824:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41751:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66725:663;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65644:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64979:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66340:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14994:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38704:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67396:432;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68696:140;;;;;;;;;;;;;:::i;:::-;;33947:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17859:103;;;;;;;;;;;;;:::i;:::-;;64734:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64878:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68842:180;;;;;;;;;;;;;:::i;:::-;;64643:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65014:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69030:63;;;;;;;;;;;;;:::i;:::-;;68126:286;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17211:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68420:134;;;;;;;;;;;;;:::i;:::-;;39084:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41137:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64775:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42007:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64684:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64944:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65758:564;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41516:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18117:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66574:141;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33268:615;33353:4;33668:10;33653:25;;:11;:25;;;;:102;;;;33745:10;33730:25;;:11;:25;;;;33653:102;:179;;;;33822:10;33807:25;;:11;:25;;;;33653:179;33633:199;;33268:615;;;:::o;38915:100::-;38969:13;39002:5;38995:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38915:100;:::o;40861:204::-;40929:7;40954:16;40962:7;40954;:16::i;:::-;40949:64;;40979:34;;;;;;;;;;;;;;40949:64;41033:15;:24;41049:7;41033:24;;;;;;;;;;;;;;;;;;;;;41026:31;;40861:204;;;:::o;40409:386::-;40482:13;40498:16;40506:7;40498;:16::i;:::-;40482:32;;40554:5;40531:28;;:19;:17;:19::i;:::-;:28;;;40527:175;;40579:44;40596:5;40603:19;:17;:19::i;:::-;40579:16;:44::i;:::-;40574:128;;40651:35;;;;;;;;;;;;;;40574:128;40527:175;40741:2;40714:15;:24;40730:7;40714:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40779:7;40775:2;40759:28;;40768:5;40759:28;;;;;;;;;;;;40471:324;40409:386;;:::o;32322:315::-;32375:7;32603:15;:13;:15::i;:::-;32588:12;;32572:13;;:28;:46;32565:53;;32322:315;:::o;50126:2800::-;50260:27;50290;50309:7;50290:18;:27::i;:::-;50260:57;;50375:4;50334:45;;50350:19;50334:45;;;50330:86;;50388:28;;;;;;;;;;;;;;50330:86;50430:27;50459:23;50486:28;50506:7;50486:19;:28::i;:::-;50429:85;;;;50614:62;50633:15;50650:4;50656:19;:17;:19::i;:::-;50614:18;:62::i;:::-;50609:174;;50696:43;50713:4;50719:19;:17;:19::i;:::-;50696:16;:43::i;:::-;50691:92;;50748:35;;;;;;;;;;;;;;50691:92;50609:174;50814:1;50800:16;;:2;:16;;;50796:52;;;50825:23;;;;;;;;;;;;;;50796:52;50861:43;50883:4;50889:2;50893:7;50902:1;50861:21;:43::i;:::-;50997:15;50994:160;;;51137:1;51116:19;51109:30;50994:160;51532:18;:24;51551:4;51532:24;;;;;;;;;;;;;;;;51530:26;;;;;;;;;;;;51601:18;:22;51620:2;51601:22;;;;;;;;;;;;;;;;51599:24;;;;;;;;;;;51923:145;51960:2;52008:45;52023:4;52029:2;52033:19;52008:14;:45::i;:::-;29550:8;51981:72;51923:18;:145::i;:::-;51894:17;:26;51912:7;51894:26;;;;;;;;;;;:174;;;;52238:1;29550:8;52188:19;:46;:51;52184:626;;;52260:19;52292:1;52282:7;:11;52260:33;;52449:1;52415:17;:30;52433:11;52415:30;;;;;;;;;;;;:35;52411:384;;;52553:13;;52538:11;:28;52534:242;;52733:19;52700:17;:30;52718:11;52700:30;;;;;;;;;;;:52;;;;52534:242;52411:384;52241:569;52184:626;52857:7;52853:2;52838:27;;52847:4;52838:27;;;;;;;;;;;;52876:42;52897:4;52903:2;52907:7;52916:1;52876:20;:42::i;:::-;50249:2677;;;50126:2800;;;:::o;68562:128::-;17097:13;:11;:13::i;:::-;68666:16:::1;;;;;;;;;;;68665:17;68646:16;;:36;;;;;;;;;;;;;;;;;;68562:128::o:0;67840:278::-;17097:13;:11;:13::i;:::-;67965:1:::1;67954:8;:12;67946:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;68034:12;;68022:8;68006:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:40;;67998:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68079:31;68089:10;68101:8;68079:9;:31::i;:::-;67840:278:::0;:::o;69445:371::-;17097:13;:11;:13::i;:::-;69574:1:::1;69556:15;:19;69548:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;69644:12;;69628:13;:11;:13::i;:::-;:28;69620:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;69728:13;:11;:13::i;:::-;69709:15;69694:12;;:30;;;;:::i;:::-;:47;;69686:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;69793:15;69777:12;;:31;;;;;;;:::i;:::-;;;;;;;;69445:371:::0;:::o;69101:67::-;17097:13;:11;:13::i;:::-;69150:10:::1;:8;:10::i;:::-;69101:67::o:0;69824:224::-;17097:13;:11;:13::i;:::-;69973:1:::1;69951:19;:23;69943:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;70021:19;70003:15;:37;;;;69824:224:::0;:::o;41751:185::-;41889:39;41906:4;41912:2;41916:7;41889:39;;;;;;;;;;;;:16;:39::i;:::-;41751:185;;;:::o;66725:663::-;65437:16;;;;;;;;;;;65429:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;65325:10:::1;65312:23;;:9;:23;;;65304:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;66953:15:::2;;66941:8;66918;:20;66927:10;66918:20;;;;;;;;;;;;;;;;:31;;;;:::i;:::-;:50;;66910:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;67052:12;;67040:8;67024:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:40;;67016:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67100:12;67142:10;67125:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;67115:39;;;;;;67100:54;;67188:52;67207:12;;67188:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67221:12;;67235:4;67188:18;:52::i;:::-;67165:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;67330:8;67306;:20;67315:10;67306:20;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;67349:31;67359:10;67371:8;67349:9;:31::i;:::-;66889:499;66725:663:::0;;;:::o;65644:106::-;17097:13;:11;:13::i;:::-;65731:11:::1;65718:10;;:24;;;;;;;;;;;;;;;;;;65644:106:::0;:::o;64979:28::-;;;;;;;;;;;;;:::o;66340:123::-;17097:13;:11;:13::i;:::-;66442::::1;;66427:12;:28;;;;;;;:::i;:::-;;66340:123:::0;;:::o;14994:86::-;15041:4;15065:7;;;;;;;;;;;15058:14;;14994:86;:::o;38704:144::-;38768:7;38811:27;38830:7;38811:18;:27::i;:::-;38788:52;;38704:144;;;:::o;67396:432::-;65563:20;;;;;;;;;;;65555:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;65325:10:::1;65312:23;;:9;:23;;;65304:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;67602:15:::2;;67590:8;67567;:20;67576:10;67567:20;;;;;;;;;;;;;;;;:31;;;;:::i;:::-;:50;;67559:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;67701:12;;67689:8;67673:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:40;;67665:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67770:8;67746;:20;67755:10;67746:20;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;67789:31;67799:10;67811:8;67789:9;:31::i;:::-;67396:432:::0;:::o;68696:140::-;17097:13;:11;:13::i;:::-;68808:20:::1;;;;;;;;;;;68807:21;68784:20;;:44;;;;;;;;;;;;;;;;;;68696:140::o:0;33947:224::-;34011:7;34052:1;34035:19;;:5;:19;;;34031:60;;;34063:28;;;;;;;;;;;;;;34031:60;28502:13;34109:18;:25;34128:5;34109:25;;;;;;;;;;;;;;;;:54;34102:61;;33947:224;;;:::o;17859:103::-;17097:13;:11;:13::i;:::-;17924:30:::1;17951:1;17924:18;:30::i;:::-;17859:103::o:0;64734:34::-;;;;:::o;64878:25::-;;;;;;;;;;;;;:::o;68842:180::-;17097:13;:11;:13::i;:::-;68943:16:::1;;;;;;;;;;;68942:17;68923:16;;:36;;;;;;;;;;;;;;;;;;68994:20;;;;;;;;;;;68993:21;68970:20;;:44;;;;;;;;;;;;;;;;;;68842:180::o:0;64643:34::-;;;;:::o;65014:32::-;;;;;;;;;;;;;:::o;69030:63::-;17097:13;:11;:13::i;:::-;69077:8:::1;:6;:8::i;:::-;69030:63::o:0;68126:286::-;17097:13;:11;:13::i;:::-;68264:1:::1;68253:8;:12;68245:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;68333:12;;68321:8;68305:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:40;;68297:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68378:26;68388:5;68395:8;68378:9;:26::i;:::-;68126:286:::0;;:::o;17211:87::-;17257:7;17284:6;;;;;;;;;;;17277:13;;17211:87;:::o;68420:134::-;17097:13;:11;:13::i;:::-;68530:16:::1;;;;;;;;;;;68529:17;68510:16;;:36;;;;;;;;;;;;;;;;;;68420:134::o:0;39084:104::-;39140:13;39173:7;39166:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39084:104;:::o;41137:308::-;41248:19;:17;:19::i;:::-;41236:31;;:8;:31;;;41232:61;;;41276:17;;;;;;;;;;;;;;41232:61;41358:8;41306:18;:39;41325:19;:17;:19::i;:::-;41306:39;;;;;;;;;;;;;;;:49;41346:8;41306:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;41418:8;41382:55;;41397:19;:17;:19::i;:::-;41382:55;;;41428:8;41382:55;;;;;;:::i;:::-;;;;;;;;41137:308;;:::o;64775:96::-;;;;:::o;42007:399::-;42174:31;42187:4;42193:2;42197:7;42174:12;:31::i;:::-;42238:1;42220:2;:14;;;:19;42216:183;;42259:56;42290:4;42296:2;42300:7;42309:5;42259:30;:56::i;:::-;42254:145;;42343:40;;;;;;;;;;;;;;42254:145;42216:183;42007:399;;;;:::o;64684:43::-;;;;;;;;;;;;;;;;;:::o;64944:28::-;;;;;;;;;;;;;:::o;65758:564::-;65877:13;65916:17;65924:8;65916:7;:17::i;:::-;65908:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;65975:16;;;;;;;;;;;:130;;66082:20;;;;;;;:::i;:::-;;;;;;;;;;;;;66072:31;;;;;;66054:12;66037:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;66027:41;;;;;;:76;;65975:130;;;66018:1;65996:24;;:10;;;;;;;;;;;:24;;;;65975:130;65966:200;;;;;;;;;;;;:::i;:::-;;;;;;;;;66186:16;;;;;;;;;;;:128;;66271:12;66285:19;:8;:17;:19::i;:::-;66254:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66186:128;;;66211:10;;;;;;;;;;;66205:29;;;66235:8;66205:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66186:128;66179:135;;65758:564;;;:::o;41516:164::-;41613:4;41637:18;:25;41656:5;41637:25;;;;;;;;;;;;;;;:35;41663:8;41637:35;;;;;;;;;;;;;;;;;;;;;;;;;41630:42;;41516:164;;;;:::o;18117:201::-;17097:13;:11;:13::i;:::-;18226:1:::1;18206:22;;:8;:22;;;;18198:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;18282:28;18301:8;18282:18;:28::i;:::-;18117:201:::0;:::o;66574:141::-;17097:13;:11;:13::i;:::-;66694::::1;66679:12;:28;;;;66574:141:::0;:::o;42661:273::-;42718:4;42774:7;42755:15;:13;:15::i;:::-;:26;;:66;;;;;42808:13;;42798:7;:23;42755:66;:152;;;;;42906:1;29272:8;42859:17;:26;42877:7;42859:26;;;;;;;;;;;;:43;:48;42755:152;42735:172;;42661:273;;;:::o;61222:105::-;61282:7;61309:10;61302:17;;61222:105;:::o;66473:93::-;66530:7;66557:1;66550:8;;66473:93;:::o;35621:1129::-;35688:7;35708:12;35723:7;35708:22;;35791:4;35772:15;:13;:15::i;:::-;:23;35768:915;;35825:13;;35818:4;:20;35814:869;;;35863:14;35880:17;:23;35898:4;35880:23;;;;;;;;;;;;35863:40;;35996:1;29272:8;35969:6;:23;:28;35965:699;;;36488:113;36505:1;36495:6;:11;36488:113;;;36548:17;:25;36566:6;;;;;;;36548:25;;;;;;;;;;;;36539:34;;36488:113;;;36634:6;36627:13;;;;;;35965:699;35840:843;35814:869;35768:915;36711:31;;;;;;;;;;;;;;35621:1129;;;;:::o;48462:652::-;48557:27;48586:23;48627:53;48683:15;48627:71;;48869:7;48863:4;48856:21;48904:22;48898:4;48891:36;48980:4;48974;48964:21;48941:44;;49076:19;49070:26;49051:45;;48807:300;48462:652;;;:::o;49227:645::-;49369:11;49531:15;49525:4;49521:26;49513:34;;49690:15;49679:9;49675:31;49662:44;;49837:15;49826:9;49823:30;49816:4;49805:9;49802:19;49799:55;49789:65;;49227:645;;;;;:::o;69180:257::-;14599:19;:17;:19::i;:::-;69373:56:::1;69401:4;69407:2;69411:7;69420:8;69373:27;:56::i;:::-;69180:257:::0;;;;:::o;58367:309::-;58502:7;58522:16;29673:3;58548:19;:40;;58522:67;;29673:3;58615:31;58626:4;58632:2;58636:9;58615:10;:31::i;:::-;58607:40;;:61;;58600:68;;;58367:309;;;;;:::o;38195:447::-;38275:14;38443:15;38436:5;38432:27;38423:36;;38617:5;38603:11;38579:22;38575:40;38572:51;38565:5;38562:62;38552:72;;38195:447;;;;:::o;60873:158::-;;;;;:::o;17376:132::-;17451:12;:10;:12::i;:::-;17440:23;;:7;:5;:7::i;:::-;:23;;;17432:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17376:132::o;43018:104::-;43087:27;43097:2;43101:8;43087:27;;;;;;;;;;;;:9;:27::i;:::-;43018:104;;:::o;15849:120::-;14858:16;:14;:16::i;:::-;15918:5:::1;15908:7;;:15;;;;;;;;;;;;;;;;;;15939:22;15948:12;:10;:12::i;:::-;15939:22;;;;;;:::i;:::-;;;;;;;;15849:120::o:0;4922:190::-;5047:4;5100;5071:25;5084:5;5091:4;5071:12;:25::i;:::-;:33;5064:40;;4922:190;;;;;:::o;18478:191::-;18552:16;18571:6;;;;;;;;;;;18552:25;;18597:8;18588:6;;:17;;;;;;;;;;;;;;;;;;18652:8;18621:40;;18642:8;18621:40;;;;;;;;;;;;18541:128;18478:191;:::o;15590:118::-;14599:19;:17;:19::i;:::-;15660:4:::1;15650:7;;:14;;;;;;;;;;;;;;;;;;15680:20;15687:12;:10;:12::i;:::-;15680:20;;;;;;:::i;:::-;;;;;;;;15590:118::o:0;56877:716::-;57040:4;57086:2;57061:45;;;57107:19;:17;:19::i;:::-;57128:4;57134:7;57143:5;57061:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;57057:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57361:1;57344:6;:13;:18;57340:235;;;57390:40;;;;;;;;;;;;;;57340:235;57533:6;57527:13;57518:6;57514:2;57510:15;57503:38;57057:529;57230:54;;;57220:64;;;:6;:64;;;;57213:71;;;56877:716;;;;;;:::o;1636:723::-;1692:13;1922:1;1913:5;:10;1909:53;;;1940:10;;;;;;;;;;;;;;;;;;;;;1909:53;1972:12;1987:5;1972:20;;2003:14;2028:78;2043:1;2035:4;:9;2028:78;;2061:8;;;;;:::i;:::-;;;;2092:2;2084:10;;;;;:::i;:::-;;;2028:78;;;2116:19;2148:6;2138:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2116:39;;2166:154;2182:1;2173:5;:10;2166:154;;2210:1;2200:11;;;;;:::i;:::-;;;2277:2;2269:5;:10;;;;:::i;:::-;2256:2;:24;;;;:::i;:::-;2243:39;;2226:6;2233;2226:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2306:2;2297:11;;;;;:::i;:::-;;;2166:154;;;2344:6;2330:21;;;;;1636:723;;;;:::o;15153:108::-;15224:8;:6;:8::i;:::-;15223:9;15215:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;15153:108::o;60055:159::-;;;;;:::o;59252:147::-;59389:6;59252:147;;;;;:::o;13107:98::-;13160:7;13187:10;13180:17;;13107:98;:::o;43538:681::-;43661:19;43667:2;43671:8;43661:5;:19::i;:::-;43740:1;43722:2;:14;;;:19;43718:483;;43762:11;43776:13;;43762:27;;43808:13;43830:8;43824:3;:14;43808:30;;43857:233;43888:62;43927:1;43931:2;43935:7;;;;;;43944:5;43888:30;:62::i;:::-;43883:167;;43986:40;;;;;;;;;;;;;;43883:167;44085:3;44077:5;:11;43857:233;;44172:3;44155:13;;:20;44151:34;;44177:8;;;44151:34;43743:458;;43718:483;43538:681;;;:::o;15338:108::-;15405:8;:6;:8::i;:::-;15397:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;15338:108::o;5789:296::-;5872:7;5892:20;5915:4;5892:27;;5935:9;5930:118;5954:5;:12;5950:1;:16;5930:118;;;6003:33;6013:12;6027:5;6033:1;6027:8;;;;;;;;:::i;:::-;;;;;;;;6003:9;:33::i;:::-;5988:48;;5968:3;;;;;:::i;:::-;;;;5930:118;;;;6065:12;6058:19;;;5789:296;;;;:::o;44492:1529::-;44557:20;44580:13;;44557:36;;44622:1;44608:16;;:2;:16;;;44604:48;;;44633:19;;;;;;;;;;;;;;44604:48;44679:1;44667:8;:13;44663:44;;;44689:18;;;;;;;;;;;;;;44663:44;44720:61;44750:1;44754:2;44758:12;44772:8;44720:21;:61::i;:::-;45263:1;28639:2;45234:1;:25;;45233:31;45221:8;:44;45195:18;:22;45214:2;45195:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;45542:139;45579:2;45633:33;45656:1;45660:2;45664:1;45633:14;:33::i;:::-;45600:30;45621:8;45600:20;:30::i;:::-;:66;45542:18;:139::i;:::-;45508:17;:31;45526:12;45508:31;;;;;;;;;;;:173;;;;45698:15;45716:12;45698:30;;45743:11;45772:8;45757:12;:23;45743:37;;45795:101;45847:9;;;;;;45843:2;45822:35;;45839:1;45822:35;;;;;;;;;;;;45891:3;45881:7;:13;45795:101;;45928:3;45912:13;:19;;;;44969:974;;45953:60;45982:1;45986:2;45990:12;46004:8;45953:20;:60::i;:::-;44546:1475;44492:1529;;:::o;11996:149::-;12059:7;12090:1;12086;:5;:51;;12117:20;12132:1;12135;12117:14;:20::i;:::-;12086:51;;;12094:20;12109:1;12112;12094:14;:20::i;:::-;12086:51;12079:58;;11996:149;;;;:::o;40025:322::-;40095:14;40326:1;40316:8;40313:15;40288:23;40284:45;40274:55;;40025:322;;;:::o;12153:268::-;12221:13;12328:1;12322:4;12315:15;12357:1;12351:4;12344:15;12398:4;12392;12382:21;12373:30;;12153:268;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:421::-;512:5;537:66;553:49;595:6;553:49;:::i;:::-;537:66;:::i;:::-;528:75;;626:6;619:5;612:21;664:4;657:5;653:16;702:3;693:6;688:3;684:16;681:25;678:112;;;709:79;;:::i;:::-;678:112;799:39;831:6;826:3;821;799:39;:::i;:::-;518:326;423:421;;;;;:::o;850:139::-;896:5;934:6;921:20;912:29;;950:33;977:5;950:33;:::i;:::-;850:139;;;;:::o;1012:568::-;1085:8;1095:6;1145:3;1138:4;1130:6;1126:17;1122:27;1112:122;;1153:79;;:::i;:::-;1112:122;1266:6;1253:20;1243:30;;1296:18;1288:6;1285:30;1282:117;;;1318:79;;:::i;:::-;1282:117;1432:4;1424:6;1420:17;1408:29;;1486:3;1478:4;1470:6;1466:17;1456:8;1452:32;1449:41;1446:128;;;1493:79;;:::i;:::-;1446:128;1012:568;;;;;:::o;1586:133::-;1629:5;1667:6;1654:20;1645:29;;1683:30;1707:5;1683:30;:::i;:::-;1586:133;;;;:::o;1725:139::-;1771:5;1809:6;1796:20;1787:29;;1825:33;1852:5;1825:33;:::i;:::-;1725:139;;;;:::o;1870:137::-;1915:5;1953:6;1940:20;1931:29;;1969:32;1995:5;1969:32;:::i;:::-;1870:137;;;;:::o;2013:141::-;2069:5;2100:6;2094:13;2085:22;;2116:32;2142:5;2116:32;:::i;:::-;2013:141;;;;:::o;2173:338::-;2228:5;2277:3;2270:4;2262:6;2258:17;2254:27;2244:122;;2285:79;;:::i;:::-;2244:122;2402:6;2389:20;2427:78;2501:3;2493:6;2486:4;2478:6;2474:17;2427:78;:::i;:::-;2418:87;;2234:277;2173:338;;;;:::o;2531:553::-;2589:8;2599:6;2649:3;2642:4;2634:6;2630:17;2626:27;2616:122;;2657:79;;:::i;:::-;2616:122;2770:6;2757:20;2747:30;;2800:18;2792:6;2789:30;2786:117;;;2822:79;;:::i;:::-;2786:117;2936:4;2928:6;2924:17;2912:29;;2990:3;2982:4;2974:6;2970:17;2960:8;2956:32;2953:41;2950:128;;;2997:79;;:::i;:::-;2950:128;2531:553;;;;;:::o;3104:355::-;3171:5;3220:3;3213:4;3205:6;3201:17;3197:27;3187:122;;3228:79;;:::i;:::-;3187:122;3338:6;3332:13;3363:90;3449:3;3441:6;3434:4;3426:6;3422:17;3363:90;:::i;:::-;3354:99;;3177:282;3104:355;;;;:::o;3465:139::-;3511:5;3549:6;3536:20;3527:29;;3565:33;3592:5;3565:33;:::i;:::-;3465:139;;;;:::o;3610:329::-;3669:6;3718:2;3706:9;3697:7;3693:23;3689:32;3686:119;;;3724:79;;:::i;:::-;3686:119;3844:1;3869:53;3914:7;3905:6;3894:9;3890:22;3869:53;:::i;:::-;3859:63;;3815:117;3610:329;;;;:::o;3945:474::-;4013:6;4021;4070:2;4058:9;4049:7;4045:23;4041:32;4038:119;;;4076:79;;:::i;:::-;4038:119;4196:1;4221:53;4266:7;4257:6;4246:9;4242:22;4221:53;:::i;:::-;4211:63;;4167:117;4323:2;4349:53;4394:7;4385:6;4374:9;4370:22;4349:53;:::i;:::-;4339:63;;4294:118;3945:474;;;;;:::o;4425:619::-;4502:6;4510;4518;4567:2;4555:9;4546:7;4542:23;4538:32;4535:119;;;4573:79;;:::i;:::-;4535:119;4693:1;4718:53;4763:7;4754:6;4743:9;4739:22;4718:53;:::i;:::-;4708:63;;4664:117;4820:2;4846:53;4891:7;4882:6;4871:9;4867:22;4846:53;:::i;:::-;4836:63;;4791:118;4948:2;4974:53;5019:7;5010:6;4999:9;4995:22;4974:53;:::i;:::-;4964:63;;4919:118;4425:619;;;;;:::o;5050:943::-;5145:6;5153;5161;5169;5218:3;5206:9;5197:7;5193:23;5189:33;5186:120;;;5225:79;;:::i;:::-;5186:120;5345:1;5370:53;5415:7;5406:6;5395:9;5391:22;5370:53;:::i;:::-;5360:63;;5316:117;5472:2;5498:53;5543:7;5534:6;5523:9;5519:22;5498:53;:::i;:::-;5488:63;;5443:118;5600:2;5626:53;5671:7;5662:6;5651:9;5647:22;5626:53;:::i;:::-;5616:63;;5571:118;5756:2;5745:9;5741:18;5728:32;5787:18;5779:6;5776:30;5773:117;;;5809:79;;:::i;:::-;5773:117;5914:62;5968:7;5959:6;5948:9;5944:22;5914:62;:::i;:::-;5904:72;;5699:287;5050:943;;;;;;;:::o;5999:468::-;6064:6;6072;6121:2;6109:9;6100:7;6096:23;6092:32;6089:119;;;6127:79;;:::i;:::-;6089:119;6247:1;6272:53;6317:7;6308:6;6297:9;6293:22;6272:53;:::i;:::-;6262:63;;6218:117;6374:2;6400:50;6442:7;6433:6;6422:9;6418:22;6400:50;:::i;:::-;6390:60;;6345:115;5999:468;;;;;:::o;6473:474::-;6541:6;6549;6598:2;6586:9;6577:7;6573:23;6569:32;6566:119;;;6604:79;;:::i;:::-;6566:119;6724:1;6749:53;6794:7;6785:6;6774:9;6770:22;6749:53;:::i;:::-;6739:63;;6695:117;6851:2;6877:53;6922:7;6913:6;6902:9;6898:22;6877:53;:::i;:::-;6867:63;;6822:118;6473:474;;;;;:::o;6953:704::-;7048:6;7056;7064;7113:2;7101:9;7092:7;7088:23;7084:32;7081:119;;;7119:79;;:::i;:::-;7081:119;7267:1;7256:9;7252:17;7239:31;7297:18;7289:6;7286:30;7283:117;;;7319:79;;:::i;:::-;7283:117;7432:80;7504:7;7495:6;7484:9;7480:22;7432:80;:::i;:::-;7414:98;;;;7210:312;7561:2;7587:53;7632:7;7623:6;7612:9;7608:22;7587:53;:::i;:::-;7577:63;;7532:118;6953:704;;;;;:::o;7663:329::-;7722:6;7771:2;7759:9;7750:7;7746:23;7742:32;7739:119;;;7777:79;;:::i;:::-;7739:119;7897:1;7922:53;7967:7;7958:6;7947:9;7943:22;7922:53;:::i;:::-;7912:63;;7868:117;7663:329;;;;:::o;7998:327::-;8056:6;8105:2;8093:9;8084:7;8080:23;8076:32;8073:119;;;8111:79;;:::i;:::-;8073:119;8231:1;8256:52;8300:7;8291:6;8280:9;8276:22;8256:52;:::i;:::-;8246:62;;8202:116;7998:327;;;;:::o;8331:349::-;8400:6;8449:2;8437:9;8428:7;8424:23;8420:32;8417:119;;;8455:79;;:::i;:::-;8417:119;8575:1;8600:63;8655:7;8646:6;8635:9;8631:22;8600:63;:::i;:::-;8590:73;;8546:127;8331:349;;;;:::o;8686:529::-;8757:6;8765;8814:2;8802:9;8793:7;8789:23;8785:32;8782:119;;;8820:79;;:::i;:::-;8782:119;8968:1;8957:9;8953:17;8940:31;8998:18;8990:6;8987:30;8984:117;;;9020:79;;:::i;:::-;8984:117;9133:65;9190:7;9181:6;9170:9;9166:22;9133:65;:::i;:::-;9115:83;;;;8911:297;8686:529;;;;;:::o;9221:524::-;9301:6;9350:2;9338:9;9329:7;9325:23;9321:32;9318:119;;;9356:79;;:::i;:::-;9318:119;9497:1;9486:9;9482:17;9476:24;9527:18;9519:6;9516:30;9513:117;;;9549:79;;:::i;:::-;9513:117;9654:74;9720:7;9711:6;9700:9;9696:22;9654:74;:::i;:::-;9644:84;;9447:291;9221:524;;;;:::o;9751:329::-;9810:6;9859:2;9847:9;9838:7;9834:23;9830:32;9827:119;;;9865:79;;:::i;:::-;9827:119;9985:1;10010:53;10055:7;10046:6;10035:9;10031:22;10010:53;:::i;:::-;10000:63;;9956:117;9751:329;;;;:::o;10086:118::-;10173:24;10191:5;10173:24;:::i;:::-;10168:3;10161:37;10086:118;;:::o;10210:157::-;10315:45;10335:24;10353:5;10335:24;:::i;:::-;10315:45;:::i;:::-;10310:3;10303:58;10210:157;;:::o;10373:109::-;10454:21;10469:5;10454:21;:::i;:::-;10449:3;10442:34;10373:109;;:::o;10488:118::-;10575:24;10593:5;10575:24;:::i;:::-;10570:3;10563:37;10488:118;;:::o;10612:360::-;10698:3;10726:38;10758:5;10726:38;:::i;:::-;10780:70;10843:6;10838:3;10780:70;:::i;:::-;10773:77;;10859:52;10904:6;10899:3;10892:4;10885:5;10881:16;10859:52;:::i;:::-;10936:29;10958:6;10936:29;:::i;:::-;10931:3;10927:39;10920:46;;10702:270;10612:360;;;;:::o;10978:364::-;11066:3;11094:39;11127:5;11094:39;:::i;:::-;11149:71;11213:6;11208:3;11149:71;:::i;:::-;11142:78;;11229:52;11274:6;11269:3;11262:4;11255:5;11251:16;11229:52;:::i;:::-;11306:29;11328:6;11306:29;:::i;:::-;11301:3;11297:39;11290:46;;11070:272;10978:364;;;;:::o;11348:377::-;11454:3;11482:39;11515:5;11482:39;:::i;:::-;11537:89;11619:6;11614:3;11537:89;:::i;:::-;11530:96;;11635:52;11680:6;11675:3;11668:4;11661:5;11657:16;11635:52;:::i;:::-;11712:6;11707:3;11703:16;11696:23;;11458:267;11348:377;;;;:::o;11755:845::-;11858:3;11895:5;11889:12;11924:36;11950:9;11924:36;:::i;:::-;11976:89;12058:6;12053:3;11976:89;:::i;:::-;11969:96;;12096:1;12085:9;12081:17;12112:1;12107:137;;;;12258:1;12253:341;;;;12074:520;;12107:137;12191:4;12187:9;12176;12172:25;12167:3;12160:38;12227:6;12222:3;12218:16;12211:23;;12107:137;;12253:341;12320:38;12352:5;12320:38;:::i;:::-;12380:1;12394:154;12408:6;12405:1;12402:13;12394:154;;;12482:7;12476:14;12472:1;12467:3;12463:11;12456:35;12532:1;12523:7;12519:15;12508:26;;12430:4;12427:1;12423:12;12418:17;;12394:154;;;12577:6;12572:3;12568:16;12561:23;;12260:334;;12074:520;;11862:738;;11755:845;;;;:::o;12606:366::-;12748:3;12769:67;12833:2;12828:3;12769:67;:::i;:::-;12762:74;;12845:93;12934:3;12845:93;:::i;:::-;12963:2;12958:3;12954:12;12947:19;;12606:366;;;:::o;12978:::-;13120:3;13141:67;13205:2;13200:3;13141:67;:::i;:::-;13134:74;;13217:93;13306:3;13217:93;:::i;:::-;13335:2;13330:3;13326:12;13319:19;;12978:366;;;:::o;13350:::-;13492:3;13513:67;13577:2;13572:3;13513:67;:::i;:::-;13506:74;;13589:93;13678:3;13589:93;:::i;:::-;13707:2;13702:3;13698:12;13691:19;;13350:366;;;:::o;13722:::-;13864:3;13885:67;13949:2;13944:3;13885:67;:::i;:::-;13878:74;;13961:93;14050:3;13961:93;:::i;:::-;14079:2;14074:3;14070:12;14063:19;;13722:366;;;:::o;14094:::-;14236:3;14257:67;14321:2;14316:3;14257:67;:::i;:::-;14250:74;;14333:93;14422:3;14333:93;:::i;:::-;14451:2;14446:3;14442:12;14435:19;;14094:366;;;:::o;14466:::-;14608:3;14629:67;14693:2;14688:3;14629:67;:::i;:::-;14622:74;;14705:93;14794:3;14705:93;:::i;:::-;14823:2;14818:3;14814:12;14807:19;;14466:366;;;:::o;14838:::-;14980:3;15001:67;15065:2;15060:3;15001:67;:::i;:::-;14994:74;;15077:93;15166:3;15077:93;:::i;:::-;15195:2;15190:3;15186:12;15179:19;;14838:366;;;:::o;15210:::-;15352:3;15373:67;15437:2;15432:3;15373:67;:::i;:::-;15366:74;;15449:93;15538:3;15449:93;:::i;:::-;15567:2;15562:3;15558:12;15551:19;;15210:366;;;:::o;15582:::-;15724:3;15745:67;15809:2;15804:3;15745:67;:::i;:::-;15738:74;;15821:93;15910:3;15821:93;:::i;:::-;15939:2;15934:3;15930:12;15923:19;;15582:366;;;:::o;15954:::-;16096:3;16117:67;16181:2;16176:3;16117:67;:::i;:::-;16110:74;;16193:93;16282:3;16193:93;:::i;:::-;16311:2;16306:3;16302:12;16295:19;;15954:366;;;:::o;16326:::-;16468:3;16489:67;16553:2;16548:3;16489:67;:::i;:::-;16482:74;;16565:93;16654:3;16565:93;:::i;:::-;16683:2;16678:3;16674:12;16667:19;;16326:366;;;:::o;16698:400::-;16858:3;16879:84;16961:1;16956:3;16879:84;:::i;:::-;16872:91;;16972:93;17061:3;16972:93;:::i;:::-;17090:1;17085:3;17081:11;17074:18;;16698:400;;;:::o;17104:366::-;17246:3;17267:67;17331:2;17326:3;17267:67;:::i;:::-;17260:74;;17343:93;17432:3;17343:93;:::i;:::-;17461:2;17456:3;17452:12;17445:19;;17104:366;;;:::o;17476:::-;17618:3;17639:67;17703:2;17698:3;17639:67;:::i;:::-;17632:74;;17715:93;17804:3;17715:93;:::i;:::-;17833:2;17828:3;17824:12;17817:19;;17476:366;;;:::o;17848:::-;17990:3;18011:67;18075:2;18070:3;18011:67;:::i;:::-;18004:74;;18087:93;18176:3;18087:93;:::i;:::-;18205:2;18200:3;18196:12;18189:19;;17848:366;;;:::o;18220:::-;18362:3;18383:67;18447:2;18442:3;18383:67;:::i;:::-;18376:74;;18459:93;18548:3;18459:93;:::i;:::-;18577:2;18572:3;18568:12;18561:19;;18220:366;;;:::o;18592:::-;18734:3;18755:67;18819:2;18814:3;18755:67;:::i;:::-;18748:74;;18831:93;18920:3;18831:93;:::i;:::-;18949:2;18944:3;18940:12;18933:19;;18592:366;;;:::o;18964:400::-;19124:3;19145:84;19227:1;19222:3;19145:84;:::i;:::-;19138:91;;19238:93;19327:3;19238:93;:::i;:::-;19356:1;19351:3;19347:11;19340:18;;18964:400;;;:::o;19370:366::-;19512:3;19533:67;19597:2;19592:3;19533:67;:::i;:::-;19526:74;;19609:93;19698:3;19609:93;:::i;:::-;19727:2;19722:3;19718:12;19711:19;;19370:366;;;:::o;19742:118::-;19829:24;19847:5;19829:24;:::i;:::-;19824:3;19817:37;19742:118;;:::o;19866:256::-;19978:3;19993:75;20064:3;20055:6;19993:75;:::i;:::-;20093:2;20088:3;20084:12;20077:19;;20113:3;20106:10;;19866:256;;;;:::o;20128:269::-;20257:3;20279:92;20367:3;20358:6;20279:92;:::i;:::-;20272:99;;20388:3;20381:10;;20128:269;;;;:::o;20403:695::-;20681:3;20703:92;20791:3;20782:6;20703:92;:::i;:::-;20696:99;;20812:95;20903:3;20894:6;20812:95;:::i;:::-;20805:102;;20924:148;21068:3;20924:148;:::i;:::-;20917:155;;21089:3;21082:10;;20403:695;;;;;:::o;21104:381::-;21289:3;21311:148;21455:3;21311:148;:::i;:::-;21304:155;;21476:3;21469:10;;21104:381;;;:::o;21491:222::-;21584:4;21622:2;21611:9;21607:18;21599:26;;21635:71;21703:1;21692:9;21688:17;21679:6;21635:71;:::i;:::-;21491:222;;;;:::o;21719:640::-;21914:4;21952:3;21941:9;21937:19;21929:27;;21966:71;22034:1;22023:9;22019:17;22010:6;21966:71;:::i;:::-;22047:72;22115:2;22104:9;22100:18;22091:6;22047:72;:::i;:::-;22129;22197:2;22186:9;22182:18;22173:6;22129:72;:::i;:::-;22248:9;22242:4;22238:20;22233:2;22222:9;22218:18;22211:48;22276:76;22347:4;22338:6;22276:76;:::i;:::-;22268:84;;21719:640;;;;;;;:::o;22365:210::-;22452:4;22490:2;22479:9;22475:18;22467:26;;22503:65;22565:1;22554:9;22550:17;22541:6;22503:65;:::i;:::-;22365:210;;;;:::o;22581:222::-;22674:4;22712:2;22701:9;22697:18;22689:26;;22725:71;22793:1;22782:9;22778:17;22769:6;22725:71;:::i;:::-;22581:222;;;;:::o;22809:313::-;22922:4;22960:2;22949:9;22945:18;22937:26;;23009:9;23003:4;22999:20;22995:1;22984:9;22980:17;22973:47;23037:78;23110:4;23101:6;23037:78;:::i;:::-;23029:86;;22809:313;;;;:::o;23128:419::-;23294:4;23332:2;23321:9;23317:18;23309:26;;23381:9;23375:4;23371:20;23367:1;23356:9;23352:17;23345:47;23409:131;23535:4;23409:131;:::i;:::-;23401:139;;23128:419;;;:::o;23553:::-;23719:4;23757:2;23746:9;23742:18;23734:26;;23806:9;23800:4;23796:20;23792:1;23781:9;23777:17;23770:47;23834:131;23960:4;23834:131;:::i;:::-;23826:139;;23553:419;;;:::o;23978:::-;24144:4;24182:2;24171:9;24167:18;24159:26;;24231:9;24225:4;24221:20;24217:1;24206:9;24202:17;24195:47;24259:131;24385:4;24259:131;:::i;:::-;24251:139;;23978:419;;;:::o;24403:::-;24569:4;24607:2;24596:9;24592:18;24584:26;;24656:9;24650:4;24646:20;24642:1;24631:9;24627:17;24620:47;24684:131;24810:4;24684:131;:::i;:::-;24676:139;;24403:419;;;:::o;24828:::-;24994:4;25032:2;25021:9;25017:18;25009:26;;25081:9;25075:4;25071:20;25067:1;25056:9;25052:17;25045:47;25109:131;25235:4;25109:131;:::i;:::-;25101:139;;24828:419;;;:::o;25253:::-;25419:4;25457:2;25446:9;25442:18;25434:26;;25506:9;25500:4;25496:20;25492:1;25481:9;25477:17;25470:47;25534:131;25660:4;25534:131;:::i;:::-;25526:139;;25253:419;;;:::o;25678:::-;25844:4;25882:2;25871:9;25867:18;25859:26;;25931:9;25925:4;25921:20;25917:1;25906:9;25902:17;25895:47;25959:131;26085:4;25959:131;:::i;:::-;25951:139;;25678:419;;;:::o;26103:::-;26269:4;26307:2;26296:9;26292:18;26284:26;;26356:9;26350:4;26346:20;26342:1;26331:9;26327:17;26320:47;26384:131;26510:4;26384:131;:::i;:::-;26376:139;;26103:419;;;:::o;26528:::-;26694:4;26732:2;26721:9;26717:18;26709:26;;26781:9;26775:4;26771:20;26767:1;26756:9;26752:17;26745:47;26809:131;26935:4;26809:131;:::i;:::-;26801:139;;26528:419;;;:::o;26953:::-;27119:4;27157:2;27146:9;27142:18;27134:26;;27206:9;27200:4;27196:20;27192:1;27181:9;27177:17;27170:47;27234:131;27360:4;27234:131;:::i;:::-;27226:139;;26953:419;;;:::o;27378:::-;27544:4;27582:2;27571:9;27567:18;27559:26;;27631:9;27625:4;27621:20;27617:1;27606:9;27602:17;27595:47;27659:131;27785:4;27659:131;:::i;:::-;27651:139;;27378:419;;;:::o;27803:::-;27969:4;28007:2;27996:9;27992:18;27984:26;;28056:9;28050:4;28046:20;28042:1;28031:9;28027:17;28020:47;28084:131;28210:4;28084:131;:::i;:::-;28076:139;;27803:419;;;:::o;28228:::-;28394:4;28432:2;28421:9;28417:18;28409:26;;28481:9;28475:4;28471:20;28467:1;28456:9;28452:17;28445:47;28509:131;28635:4;28509:131;:::i;:::-;28501:139;;28228:419;;;:::o;28653:::-;28819:4;28857:2;28846:9;28842:18;28834:26;;28906:9;28900:4;28896:20;28892:1;28881:9;28877:17;28870:47;28934:131;29060:4;28934:131;:::i;:::-;28926:139;;28653:419;;;:::o;29078:::-;29244:4;29282:2;29271:9;29267:18;29259:26;;29331:9;29325:4;29321:20;29317:1;29306:9;29302:17;29295:47;29359:131;29485:4;29359:131;:::i;:::-;29351:139;;29078:419;;;:::o;29503:::-;29669:4;29707:2;29696:9;29692:18;29684:26;;29756:9;29750:4;29746:20;29742:1;29731:9;29727:17;29720:47;29784:131;29910:4;29784:131;:::i;:::-;29776:139;;29503:419;;;:::o;29928:::-;30094:4;30132:2;30121:9;30117:18;30109:26;;30181:9;30175:4;30171:20;30167:1;30156:9;30152:17;30145:47;30209:131;30335:4;30209:131;:::i;:::-;30201:139;;29928:419;;;:::o;30353:222::-;30446:4;30484:2;30473:9;30469:18;30461:26;;30497:71;30565:1;30554:9;30550:17;30541:6;30497:71;:::i;:::-;30353:222;;;;:::o;30581:129::-;30615:6;30642:20;;:::i;:::-;30632:30;;30671:33;30699:4;30691:6;30671:33;:::i;:::-;30581:129;;;:::o;30716:75::-;30749:6;30782:2;30776:9;30766:19;;30716:75;:::o;30797:307::-;30858:4;30948:18;30940:6;30937:30;30934:56;;;30970:18;;:::i;:::-;30934:56;31008:29;31030:6;31008:29;:::i;:::-;31000:37;;31092:4;31086;31082:15;31074:23;;30797:307;;;:::o;31110:308::-;31172:4;31262:18;31254:6;31251:30;31248:56;;;31284:18;;:::i;:::-;31248:56;31322:29;31344:6;31322:29;:::i;:::-;31314:37;;31406:4;31400;31396:15;31388:23;;31110:308;;;:::o;31424:141::-;31473:4;31496:3;31488:11;;31519:3;31516:1;31509:14;31553:4;31550:1;31540:18;31532:26;;31424:141;;;:::o;31571:98::-;31622:6;31656:5;31650:12;31640:22;;31571:98;;;:::o;31675:99::-;31727:6;31761:5;31755:12;31745:22;;31675:99;;;:::o;31780:168::-;31863:11;31897:6;31892:3;31885:19;31937:4;31932:3;31928:14;31913:29;;31780:168;;;;:::o;31954:169::-;32038:11;32072:6;32067:3;32060:19;32112:4;32107:3;32103:14;32088:29;;31954:169;;;;:::o;32129:148::-;32231:11;32268:3;32253:18;;32129:148;;;;:::o;32283:305::-;32323:3;32342:20;32360:1;32342:20;:::i;:::-;32337:25;;32376:20;32394:1;32376:20;:::i;:::-;32371:25;;32530:1;32462:66;32458:74;32455:1;32452:81;32449:107;;;32536:18;;:::i;:::-;32449:107;32580:1;32577;32573:9;32566:16;;32283:305;;;;:::o;32594:185::-;32634:1;32651:20;32669:1;32651:20;:::i;:::-;32646:25;;32685:20;32703:1;32685:20;:::i;:::-;32680:25;;32724:1;32714:35;;32729:18;;:::i;:::-;32714:35;32771:1;32768;32764:9;32759:14;;32594:185;;;;:::o;32785:191::-;32825:4;32845:20;32863:1;32845:20;:::i;:::-;32840:25;;32879:20;32897:1;32879:20;:::i;:::-;32874:25;;32918:1;32915;32912:8;32909:34;;;32923:18;;:::i;:::-;32909:34;32968:1;32965;32961:9;32953:17;;32785:191;;;;:::o;32982:96::-;33019:7;33048:24;33066:5;33048:24;:::i;:::-;33037:35;;32982:96;;;:::o;33084:90::-;33118:7;33161:5;33154:13;33147:21;33136:32;;33084:90;;;:::o;33180:77::-;33217:7;33246:5;33235:16;;33180:77;;;:::o;33263:149::-;33299:7;33339:66;33332:5;33328:78;33317:89;;33263:149;;;:::o;33418:126::-;33455:7;33495:42;33488:5;33484:54;33473:65;;33418:126;;;:::o;33550:77::-;33587:7;33616:5;33605:16;;33550:77;;;:::o;33633:154::-;33717:6;33712:3;33707;33694:30;33779:1;33770:6;33765:3;33761:16;33754:27;33633:154;;;:::o;33793:307::-;33861:1;33871:113;33885:6;33882:1;33879:13;33871:113;;;33970:1;33965:3;33961:11;33955:18;33951:1;33946:3;33942:11;33935:39;33907:2;33904:1;33900:10;33895:15;;33871:113;;;34002:6;33999:1;33996:13;33993:101;;;34082:1;34073:6;34068:3;34064:16;34057:27;33993:101;33842:258;33793:307;;;:::o;34106:320::-;34150:6;34187:1;34181:4;34177:12;34167:22;;34234:1;34228:4;34224:12;34255:18;34245:81;;34311:4;34303:6;34299:17;34289:27;;34245:81;34373:2;34365:6;34362:14;34342:18;34339:38;34336:84;;;34392:18;;:::i;:::-;34336:84;34157:269;34106:320;;;:::o;34432:281::-;34515:27;34537:4;34515:27;:::i;:::-;34507:6;34503:40;34645:6;34633:10;34630:22;34609:18;34597:10;34594:34;34591:62;34588:88;;;34656:18;;:::i;:::-;34588:88;34696:10;34692:2;34685:22;34475:238;34432:281;;:::o;34719:233::-;34758:3;34781:24;34799:5;34781:24;:::i;:::-;34772:33;;34827:66;34820:5;34817:77;34814:103;;;34897:18;;:::i;:::-;34814:103;34944:1;34937:5;34933:13;34926:20;;34719:233;;;:::o;34958:100::-;34997:7;35026:26;35046:5;35026:26;:::i;:::-;35015:37;;34958:100;;;:::o;35064:94::-;35103:7;35132:20;35146:5;35132:20;:::i;:::-;35121:31;;35064:94;;;:::o;35164:176::-;35196:1;35213:20;35231:1;35213:20;:::i;:::-;35208:25;;35247:20;35265:1;35247:20;:::i;:::-;35242:25;;35286:1;35276:35;;35291:18;;:::i;:::-;35276:35;35332:1;35329;35325:9;35320:14;;35164:176;;;;:::o;35346:180::-;35394:77;35391:1;35384:88;35491:4;35488:1;35481:15;35515:4;35512:1;35505:15;35532:180;35580:77;35577:1;35570:88;35677:4;35674:1;35667:15;35701:4;35698:1;35691:15;35718:180;35766:77;35763:1;35756:88;35863:4;35860:1;35853:15;35887:4;35884:1;35877:15;35904:180;35952:77;35949:1;35942:88;36049:4;36046:1;36039:15;36073:4;36070:1;36063:15;36090:180;36138:77;36135:1;36128:88;36235:4;36232:1;36225:15;36259:4;36256:1;36249:15;36276:117;36385:1;36382;36375:12;36399:117;36508:1;36505;36498:12;36522:117;36631:1;36628;36621:12;36645:117;36754:1;36751;36744:12;36768:117;36877:1;36874;36867:12;36891:117;37000:1;36997;36990:12;37014:102;37055:6;37106:2;37102:7;37097:2;37090:5;37086:14;37082:28;37072:38;;37014:102;;;:::o;37122:94::-;37155:8;37203:5;37199:2;37195:14;37174:35;;37122:94;;;:::o;37222:178::-;37362:30;37358:1;37350:6;37346:14;37339:54;37222:178;:::o;37406:170::-;37546:22;37542:1;37534:6;37530:14;37523:46;37406:170;:::o;37582:165::-;37722:17;37718:1;37710:6;37706:14;37699:41;37582:165;:::o;37753:225::-;37893:34;37889:1;37881:6;37877:14;37870:58;37962:8;37957:2;37949:6;37945:15;37938:33;37753:225;:::o;37984:179::-;38124:31;38120:1;38112:6;38108:14;38101:55;37984:179;:::o;38169:166::-;38309:18;38305:1;38297:6;38293:14;38286:42;38169:166;:::o;38341:167::-;38481:19;38477:1;38469:6;38465:14;38458:43;38341:167;:::o;38514:166::-;38654:18;38650:1;38642:6;38638:14;38631:42;38514:166;:::o;38686:163::-;38826:15;38822:1;38814:6;38810:14;38803:39;38686:163;:::o;38855:182::-;38995:34;38991:1;38983:6;38979:14;38972:58;38855:182;:::o;39043:173::-;39183:25;39179:1;39171:6;39167:14;39160:49;39043:173;:::o;39222:155::-;39362:7;39358:1;39350:6;39346:14;39339:31;39222:155;:::o;39383:182::-;39523:34;39519:1;39511:6;39507:14;39500:58;39383:182;:::o;39571:220::-;39711:34;39707:1;39699:6;39695:14;39688:58;39780:3;39775:2;39767:6;39763:15;39756:28;39571:220;:::o;39797:163::-;39937:15;39933:1;39925:6;39921:14;39914:39;39797:163;:::o;39966:168::-;40106:20;40102:1;40094:6;40090:14;40083:44;39966:168;:::o;40140:169::-;40280:21;40276:1;40268:6;40264:14;40257:45;40140:169;:::o;40315:114::-;;:::o;40435:174::-;40575:26;40571:1;40563:6;40559:14;40552:50;40435:174;:::o;40615:122::-;40688:24;40706:5;40688:24;:::i;:::-;40681:5;40678:35;40668:63;;40727:1;40724;40717:12;40668:63;40615:122;:::o;40743:116::-;40813:21;40828:5;40813:21;:::i;:::-;40806:5;40803:32;40793:60;;40849:1;40846;40839:12;40793:60;40743:116;:::o;40865:122::-;40938:24;40956:5;40938:24;:::i;:::-;40931:5;40928:35;40918:63;;40977:1;40974;40967:12;40918:63;40865:122;:::o;40993:120::-;41065:23;41082:5;41065:23;:::i;:::-;41058:5;41055:34;41045:62;;41103:1;41100;41093:12;41045:62;40993:120;:::o;41119:122::-;41192:24;41210:5;41192:24;:::i;:::-;41185:5;41182:35;41172:63;;41231:1;41228;41221:12;41172:63;41119:122;:::o

Swarm Source

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