ETH Price: $2,628.67 (+6.51%)

Token

UWA GENESIS (UWAG)
 

Overview

Max Total Supply

760 UWAG

Holders

150

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 UWAG
0x1c4B48a5a48a978e621657dB5f8f8917942426fb
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:
UWA_GENESIS

Compiler Version
v0.8.15+commit.e14f2714

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-27
*/

// 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/security/ReentrancyGuard.sol


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/interfaces/IERC2981.sol


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// File: erc721a/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

/**
 * @dev Interface of ERC721A.
 */
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();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores 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 via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @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() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 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`,
     * 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,
        bytes calldata data
    ) external;

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` 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](https://eips.ethereum.org/EIPS/eip-2309) 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.2.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


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

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Reference type for token approval.
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // 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 `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID 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 => TokenApprovalRef) private _tokenApprovals;

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

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

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

    /**
     * @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 virtual 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 virtual 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 virtual 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 virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual 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 virtual {
        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;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    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: [ERC165](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.
    }

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

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    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 '';
    }

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around over time.
     */
    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

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

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

    /**
     * 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 initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

    /**
     * @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) public virtual override {
        address owner = ownerOf(tokenId);

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

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

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @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) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

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

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

    /**
     * @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. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

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

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(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 `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @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 memory _data
    ) public virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @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 Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns 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))
                }
            }
        }
    }

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @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 virtual {
        uint256 startTokenId = _currentIndex;
        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 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

            _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 virtual {
        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 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 virtual {
        _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 Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

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

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(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++;
        }
    }

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        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 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 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;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @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 virtual 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.
                // The ASCII index of the '0' character is 48.
                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/UWAG_CONTRACT.sol


pragma solidity ^0.8.9;







contract UWA_GENESIS is 
     ERC721A, 
     IERC2981,
     Ownable, 
     ReentrancyGuard 
{
  using Strings for uint256;
  string public hiddenMetadataUri = "ipfs://QmYi3kqfJCtZ1pcu1wcmHuJgxSn9RVWuzoxytBYjkNu4pJ";
  uint256 public maxSupply = 777;
  uint256 public mintAmount = 2;
  bytes32 public merkleRoot; 
  address public royaltyAddress = 0xdE551e3D1A6c09Bd94d8bdF753055d394126AB86;
  uint256 public royalty = 100; // Must be a whole number 7.5% is 75
  string public uriPrefix = '';
  string public uriSuffix = '.json';
  bool public paused = false;
  bool public revealed = false;
  mapping(address => bool) public addressClaimed; // mark if claimed
  constructor() 
  ERC721A("UWA GENESIS", "UWAG") {
  }

/// @dev === MODIFIER ===
  modifier mintCompliance() {
    require(!paused, 'The sale is paused!');
    require(totalSupply() + mintAmount <= maxSupply, 'Sold out!');
    require(!addressClaimed[_msgSender()], 'Address already claimed!');
    _;
  }

/// @dev === Minting Function - Input ====
  function mint(bytes32[] calldata _merkleProof) external payable
  mintCompliance() 
  nonReentrant
  {
    bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));
    require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), 'Invalid signature!');
    addressClaimed[_msgSender()] = true;
    _safeMint(_msgSender(), mintAmount);
  }

  function mintForAddress(uint256 _amount, address _receiver) public onlyOwner {
    require(totalSupply() + _amount < maxSupply, 'Sold out!');
    _safeMint(_receiver, _amount);
  }

/// @dev === Override ERC721A ===
  function _startTokenId() internal view virtual override returns (uint256) {
      return 1;
    }

  function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
    require(_exists(_tokenId), 'Nonexistent token!');
    if (revealed == false) {
      return hiddenMetadataUri;
    }

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix))
        : '';
  }

/// @dev === Owner Control/Configuration Functions ===
  function pause() public onlyOwner {
    paused = !paused;
  }

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

  function setMintAmount(uint256 _amount) public onlyOwner {
    mintAmount = _amount;
  }
  
  function setUriPrefix(string memory _uriPrefix) public onlyOwner {
    uriPrefix = _uriPrefix;
  }

  function setUriSuffix(string memory _uriSuffix) public onlyOwner {
    uriSuffix = _uriSuffix;
  }
  
  function setRevealed() public onlyOwner {
    revealed = true;
  }

  function setRoyaltyAddress(address _royaltyAddress) public onlyOwner {
    royaltyAddress = _royaltyAddress;
  }

  function setRoyaly(uint256 _royalty) external onlyOwner {
        royalty = _royalty;
  }

/// @dev === INTERNAL READ-ONLY ===
  function _baseURI() internal view virtual override returns (string memory) {
    return uriPrefix;
  }

/// @dev === Withdraw ====
  function withdraw() public onlyOwner nonReentrant {
    (bool os, ) = payable(owner()).call{value: address(this).balance}('');
    require(os);
  }

//IERC2981 Royalty Standard
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external view override returns (address receiver, uint256 royaltyAmount)
    {
        require(_exists(tokenId), "Nonexistent token");
        return (royaltyAddress, (salePrice * royalty) / 1000);
    }                                                

/// @dev === Support Functions ==
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, IERC165) returns (bool) {
        return
            interfaceId == type(IERC2981).interfaceId ||
            super.supportsInterface(interfaceId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"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":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyAddress","type":"address"}],"name":"setRoyaltyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_royalty","type":"uint256"}],"name":"setRoyaly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","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":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052604051806060016040528060358152602001620041fe60359139600a90816200002e919062000567565b50610309600b556002600c5573de551e3d1a6c09bd94d8bdf753055d394126ab86600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506064600f556040518060200160405280600081525060109081620000b4919062000567565b506040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060119081620000fb919062000567565b506000601260006101000a81548160ff0219169083151502179055506000601260016101000a81548160ff0219169083151502179055503480156200013f57600080fd5b506040518060400160405280600b81526020017f5557412047454e455349530000000000000000000000000000000000000000008152506040518060400160405280600481526020017f55574147000000000000000000000000000000000000000000000000000000008152508160029081620001bd919062000567565b508060039081620001cf919062000567565b50620001e06200021660201b60201c565b600081905550505062000208620001fc6200021f60201b60201c565b6200022760201b60201c565b60016009819055506200064e565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200036f57607f821691505b60208210810362000385576200038462000327565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003ef7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003b0565b620003fb8683620003b0565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000448620004426200043c8462000413565b6200041d565b62000413565b9050919050565b6000819050919050565b620004648362000427565b6200047c62000473826200044f565b848454620003bd565b825550505050565b600090565b6200049362000484565b620004a081848462000459565b505050565b5b81811015620004c857620004bc60008262000489565b600181019050620004a6565b5050565b601f8211156200051757620004e1816200038b565b620004ec84620003a0565b81016020851015620004fc578190505b620005146200050b85620003a0565b830182620004a5565b50505b505050565b600082821c905092915050565b60006200053c600019846008026200051c565b1980831691505092915050565b600062000557838362000529565b9150826002028217905092915050565b6200057282620002ed565b67ffffffffffffffff8111156200058e576200058d620002f8565b5b6200059a825462000356565b620005a7828285620004cc565b600060209050601f831160018114620005df5760008415620005ca578287015190505b620005d6858262000549565b86555062000646565b601f198416620005ef866200038b565b60005b828110156200061957848901518255600182019150602085019450602081019050620005f2565b8683101562000639578489015162000635601f89168262000529565b8355505b6001600288020188555050505b505050505050565b613ba0806200065e6000396000f3fe60806040526004361061023b5760003560e01c806370a082311161012e578063a45ba8e7116100ab578063c87b56dd1161006f578063c87b56dd14610819578063d5abeb0114610856578063e985e9c514610881578063efbd73f4146108be578063f2fde38b146108e75761023b565b8063a45ba8e714610755578063ad2f852a14610780578063b77a147b146107ab578063b88d4fde146107c7578063c7cd997f146107f05761023b565b80637ec4a659116100f25780637ec4a659146106965780638456cb59146106bf5780638da5cb5b146106d657806395d89b4114610701578063a22cb4651461072c5761023b565b806370a08231146105b3578063715018a6146105f0578063772dc32f1461060757806377b7399e146106445780637cb647591461066d5761023b565b80632eb4a7ab116101bc5780635503a0e8116101805780635503a0e8146104ca5780635a2bcc18146104f55780635c975abb1461052057806362b99ad41461054b5780636352211e146105765761023b565b80632eb4a7ab1461041d5780633bd64968146104485780633ccfd60b1461045f57806342842e0e14610476578063518302271461049f5761023b565b806316ba10e01161020357806316ba10e01461033757806318160ddd1461036057806323b872dd1461038b57806329ee566c146103b45780632a55205a146103df5761023b565b806301ffc9a71461024057806306d254da1461027d57806306fdde03146102a6578063081812fc146102d1578063095ea7b31461030e575b600080fd5b34801561024c57600080fd5b50610267600480360381019061026291906127df565b610910565b6040516102749190612827565b60405180910390f35b34801561028957600080fd5b506102a4600480360381019061029f91906128a0565b61098a565b005b3480156102b257600080fd5b506102bb6109d6565b6040516102c89190612966565b60405180910390f35b3480156102dd57600080fd5b506102f860048036038101906102f391906129be565b610a68565b60405161030591906129fa565b60405180910390f35b34801561031a57600080fd5b5061033560048036038101906103309190612a15565b610ae7565b005b34801561034357600080fd5b5061035e60048036038101906103599190612b8a565b610c2b565b005b34801561036c57600080fd5b50610375610c46565b6040516103829190612be2565b60405180910390f35b34801561039757600080fd5b506103b260048036038101906103ad9190612bfd565b610c5d565b005b3480156103c057600080fd5b506103c9610f7f565b6040516103d69190612be2565b60405180910390f35b3480156103eb57600080fd5b5061040660048036038101906104019190612c50565b610f85565b604051610414929190612c90565b60405180910390f35b34801561042957600080fd5b50610432611019565b60405161043f9190612cd2565b60405180910390f35b34801561045457600080fd5b5061045d61101f565b005b34801561046b57600080fd5b50610474611044565b005b34801561048257600080fd5b5061049d60048036038101906104989190612bfd565b611121565b005b3480156104ab57600080fd5b506104b4611141565b6040516104c19190612827565b60405180910390f35b3480156104d657600080fd5b506104df611154565b6040516104ec9190612966565b60405180910390f35b34801561050157600080fd5b5061050a6111e2565b6040516105179190612be2565b60405180910390f35b34801561052c57600080fd5b506105356111e8565b6040516105429190612827565b60405180910390f35b34801561055757600080fd5b506105606111fb565b60405161056d9190612966565b60405180910390f35b34801561058257600080fd5b5061059d600480360381019061059891906129be565b611289565b6040516105aa91906129fa565b60405180910390f35b3480156105bf57600080fd5b506105da60048036038101906105d591906128a0565b61129b565b6040516105e79190612be2565b60405180910390f35b3480156105fc57600080fd5b50610605611353565b005b34801561061357600080fd5b5061062e600480360381019061062991906128a0565b611367565b60405161063b9190612827565b60405180910390f35b34801561065057600080fd5b5061066b600480360381019061066691906129be565b611387565b005b34801561067957600080fd5b50610694600480360381019061068f9190612d19565b611399565b005b3480156106a257600080fd5b506106bd60048036038101906106b89190612b8a565b6113ab565b005b3480156106cb57600080fd5b506106d46113c6565b005b3480156106e257600080fd5b506106eb6113fa565b6040516106f891906129fa565b60405180910390f35b34801561070d57600080fd5b50610716611424565b6040516107239190612966565b60405180910390f35b34801561073857600080fd5b50610753600480360381019061074e9190612d72565b6114b6565b005b34801561076157600080fd5b5061076a61162d565b6040516107779190612966565b60405180910390f35b34801561078c57600080fd5b506107956116bb565b6040516107a291906129fa565b60405180910390f35b6107c560048036038101906107c09190612e12565b6116e1565b005b3480156107d357600080fd5b506107ee60048036038101906107e99190612f00565b6119a9565b005b3480156107fc57600080fd5b50610817600480360381019061081291906129be565b611a1c565b005b34801561082557600080fd5b50610840600480360381019061083b91906129be565b611a2e565b60405161084d9190612966565b60405180910390f35b34801561086257600080fd5b5061086b611b86565b6040516108789190612be2565b60405180910390f35b34801561088d57600080fd5b506108a860048036038101906108a39190612f83565b611b8c565b6040516108b59190612827565b60405180910390f35b3480156108ca57600080fd5b506108e560048036038101906108e09190612fc3565b611c20565b005b3480156108f357600080fd5b5061090e600480360381019061090991906128a0565b611c8c565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610983575061098282611d0f565b5b9050919050565b610992611da1565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600280546109e590613032565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1190613032565b8015610a5e5780601f10610a3357610100808354040283529160200191610a5e565b820191906000526020600020905b815481529060010190602001808311610a4157829003601f168201915b5050505050905090565b6000610a7382611e1f565b610aa9576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610af282611289565b90508073ffffffffffffffffffffffffffffffffffffffff16610b13611e7e565b73ffffffffffffffffffffffffffffffffffffffff1614610b7657610b3f81610b3a611e7e565b611b8c565b610b75576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610c33611da1565b8060119081610c42919061320f565b5050565b6000610c50611e86565b6001546000540303905090565b6000610c6882611e8f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ccf576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610cdb84611f5b565b91509150610cf18187610cec611e7e565b611f82565b610d3d57610d0686610d01611e7e565b611b8c565b610d3c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610da3576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610db08686866001611fc6565b8015610dbb57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610e8985610e65888887611fcc565b7c020000000000000000000000000000000000000000000000000000000017611ff4565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610f0f5760006001850190506000600460008381526020019081526020016000205403610f0d576000548114610f0c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f77868686600161201f565b505050505050565b600f5481565b600080610f9184611e1f565b610fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc79061332d565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166103e8600f5485611004919061337c565b61100e9190613405565b915091509250929050565b600d5481565b611027611da1565b6001601260016101000a81548160ff021916908315150217905550565b61104c611da1565b600260095403611091576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108890613482565b60405180910390fd5b600260098190555060006110a36113fa565b73ffffffffffffffffffffffffffffffffffffffff16476040516110c6906134d3565b60006040518083038185875af1925050503d8060008114611103576040519150601f19603f3d011682016040523d82523d6000602084013e611108565b606091505b505090508061111657600080fd5b506001600981905550565b61113c838383604051806020016040528060008152506119a9565b505050565b601260019054906101000a900460ff1681565b6011805461116190613032565b80601f016020809104026020016040519081016040528092919081815260200182805461118d90613032565b80156111da5780601f106111af576101008083540402835291602001916111da565b820191906000526020600020905b8154815290600101906020018083116111bd57829003601f168201915b505050505081565b600c5481565b601260009054906101000a900460ff1681565b6010805461120890613032565b80601f016020809104026020016040519081016040528092919081815260200182805461123490613032565b80156112815780601f1061125657610100808354040283529160200191611281565b820191906000526020600020905b81548152906001019060200180831161126457829003601f168201915b505050505081565b600061129482611e8f565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611302576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61135b611da1565b6113656000612025565b565b60136020528060005260406000206000915054906101000a900460ff1681565b61138f611da1565b80600f8190555050565b6113a1611da1565b80600d8190555050565b6113b3611da1565b80601090816113c2919061320f565b5050565b6113ce611da1565b601260009054906101000a900460ff1615601260006101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461143390613032565b80601f016020809104026020016040519081016040528092919081815260200182805461145f90613032565b80156114ac5780601f10611481576101008083540402835291602001916114ac565b820191906000526020600020905b81548152906001019060200180831161148f57829003601f168201915b5050505050905090565b6114be611e7e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611522576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061152f611e7e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115dc611e7e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116219190612827565b60405180910390a35050565b600a805461163a90613032565b80601f016020809104026020016040519081016040528092919081815260200182805461166690613032565b80156116b35780601f10611688576101008083540402835291602001916116b3565b820191906000526020600020905b81548152906001019060200180831161169657829003601f168201915b505050505081565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601260009054906101000a900460ff1615611731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172890613534565b60405180910390fd5b600b54600c5461173f610c46565b6117499190613554565b111561178a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611781906135f6565b60405180910390fd5b601360006117966120eb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561181e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181590613662565b60405180910390fd5b600260095403611863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185a90613482565b60405180910390fd5b600260098190555060006118756120eb565b60405160200161188591906136ca565b6040516020818303038152906040528051906020012090506118eb838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d54836120f3565b61192a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192190613731565b60405180910390fd5b6001601360006119386120eb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061199c6119946120eb565b600c5461210a565b5060016009819055505050565b6119b4848484610c5d565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611a16576119df84848484612128565b611a15576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611a24611da1565b80600c8190555050565b6060611a3982611e1f565b611a78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6f9061379d565b60405180910390fd5b60001515601260019054906101000a900460ff16151503611b2557600a8054611aa090613032565b80601f0160208091040260200160405190810160405280929190818152602001828054611acc90613032565b8015611b195780601f10611aee57610100808354040283529160200191611b19565b820191906000526020600020905b815481529060010190602001808311611afc57829003601f168201915b50505050509050611b81565b6000611b2f612278565b90506000815111611b4f5760405180602001604052806000815250611b7d565b80611b598461230a565b6011604051602001611b6d9392919061387c565b6040516020818303038152906040525b9150505b919050565b600b5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c28611da1565b600b5482611c34610c46565b611c3e9190613554565b10611c7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c75906135f6565b60405180910390fd5b611c88818361210a565b5050565b611c94611da1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfa9061391f565b60405180910390fd5b611d0c81612025565b50565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d6a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d9a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b611da96120eb565b73ffffffffffffffffffffffffffffffffffffffff16611dc76113fa565b73ffffffffffffffffffffffffffffffffffffffff1614611e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e149061398b565b60405180910390fd5b565b600081611e2a611e86565b11158015611e39575060005482105b8015611e77575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080611e9e611e86565b11611f2457600054811015611f235760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611f21575b60008103611f17576004600083600190039350838152602001908152602001600020549050611eed565b8092505050611f56565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611fe386868461246a565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6000826121008584612473565b1490509392505050565b6121248282604051806020016040528060008152506124c9565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261214e611e7e565b8786866040518563ffffffff1660e01b81526004016121709493929190613a00565b6020604051808303816000875af19250505080156121ac57506040513d601f19601f820116820180604052508101906121a99190613a61565b60015b612225573d80600081146121dc576040519150601f19603f3d011682016040523d82523d6000602084013e6121e1565b606091505b50600081510361221d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606010805461228790613032565b80601f01602080910402602001604051908101604052809291908181526020018280546122b390613032565b80156123005780601f106122d557610100808354040283529160200191612300565b820191906000526020600020905b8154815290600101906020018083116122e357829003601f168201915b5050505050905090565b606060008203612351576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612465565b600082905060005b6000821461238357808061236c90613a8e565b915050600a8261237c9190613405565b9150612359565b60008167ffffffffffffffff81111561239f5761239e612a5f565b5b6040519080825280601f01601f1916602001820160405280156123d15781602001600182028036833780820191505090505b5090505b6000851461245e576001826123ea9190613ad6565b9150600a856123f99190613b0a565b60306124059190613554565b60f81b81838151811061241b5761241a613b3b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124579190613405565b94506123d5565b8093505050505b919050565b60009392505050565b60008082905060005b84518110156124be576124a98286838151811061249c5761249b613b3b565b5b6020026020010151612566565b915080806124b690613a8e565b91505061247c565b508091505092915050565b6124d38383612591565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461256157600080549050600083820390505b6125136000868380600101945086612128565b612549576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061250057816000541461255e57600080fd5b50505b505050565b600081831061257e57612579828461274c565b612589565b612588838361274c565b5b905092915050565b600080549050600082036125d1576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125de6000848385611fc6565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612655836126466000866000611fcc565b61264f85612763565b17611ff4565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146126f657808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506126bb565b5060008203612731576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050612747600084838561201f565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6127bc81612787565b81146127c757600080fd5b50565b6000813590506127d9816127b3565b92915050565b6000602082840312156127f5576127f461277d565b5b6000612803848285016127ca565b91505092915050565b60008115159050919050565b6128218161280c565b82525050565b600060208201905061283c6000830184612818565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061286d82612842565b9050919050565b61287d81612862565b811461288857600080fd5b50565b60008135905061289a81612874565b92915050565b6000602082840312156128b6576128b561277d565b5b60006128c48482850161288b565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156129075780820151818401526020810190506128ec565b83811115612916576000848401525b50505050565b6000601f19601f8301169050919050565b6000612938826128cd565b61294281856128d8565b93506129528185602086016128e9565b61295b8161291c565b840191505092915050565b60006020820190508181036000830152612980818461292d565b905092915050565b6000819050919050565b61299b81612988565b81146129a657600080fd5b50565b6000813590506129b881612992565b92915050565b6000602082840312156129d4576129d361277d565b5b60006129e2848285016129a9565b91505092915050565b6129f481612862565b82525050565b6000602082019050612a0f60008301846129eb565b92915050565b60008060408385031215612a2c57612a2b61277d565b5b6000612a3a8582860161288b565b9250506020612a4b858286016129a9565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a978261291c565b810181811067ffffffffffffffff82111715612ab657612ab5612a5f565b5b80604052505050565b6000612ac9612773565b9050612ad58282612a8e565b919050565b600067ffffffffffffffff821115612af557612af4612a5f565b5b612afe8261291c565b9050602081019050919050565b82818337600083830152505050565b6000612b2d612b2884612ada565b612abf565b905082815260208101848484011115612b4957612b48612a5a565b5b612b54848285612b0b565b509392505050565b600082601f830112612b7157612b70612a55565b5b8135612b81848260208601612b1a565b91505092915050565b600060208284031215612ba057612b9f61277d565b5b600082013567ffffffffffffffff811115612bbe57612bbd612782565b5b612bca84828501612b5c565b91505092915050565b612bdc81612988565b82525050565b6000602082019050612bf76000830184612bd3565b92915050565b600080600060608486031215612c1657612c1561277d565b5b6000612c248682870161288b565b9350506020612c358682870161288b565b9250506040612c46868287016129a9565b9150509250925092565b60008060408385031215612c6757612c6661277d565b5b6000612c75858286016129a9565b9250506020612c86858286016129a9565b9150509250929050565b6000604082019050612ca560008301856129eb565b612cb26020830184612bd3565b9392505050565b6000819050919050565b612ccc81612cb9565b82525050565b6000602082019050612ce76000830184612cc3565b92915050565b612cf681612cb9565b8114612d0157600080fd5b50565b600081359050612d1381612ced565b92915050565b600060208284031215612d2f57612d2e61277d565b5b6000612d3d84828501612d04565b91505092915050565b612d4f8161280c565b8114612d5a57600080fd5b50565b600081359050612d6c81612d46565b92915050565b60008060408385031215612d8957612d8861277d565b5b6000612d978582860161288b565b9250506020612da885828601612d5d565b9150509250929050565b600080fd5b600080fd5b60008083601f840112612dd257612dd1612a55565b5b8235905067ffffffffffffffff811115612def57612dee612db2565b5b602083019150836020820283011115612e0b57612e0a612db7565b5b9250929050565b60008060208385031215612e2957612e2861277d565b5b600083013567ffffffffffffffff811115612e4757612e46612782565b5b612e5385828601612dbc565b92509250509250929050565b600067ffffffffffffffff821115612e7a57612e79612a5f565b5b612e838261291c565b9050602081019050919050565b6000612ea3612e9e84612e5f565b612abf565b905082815260208101848484011115612ebf57612ebe612a5a565b5b612eca848285612b0b565b509392505050565b600082601f830112612ee757612ee6612a55565b5b8135612ef7848260208601612e90565b91505092915050565b60008060008060808587031215612f1a57612f1961277d565b5b6000612f288782880161288b565b9450506020612f398782880161288b565b9350506040612f4a878288016129a9565b925050606085013567ffffffffffffffff811115612f6b57612f6a612782565b5b612f7787828801612ed2565b91505092959194509250565b60008060408385031215612f9a57612f9961277d565b5b6000612fa88582860161288b565b9250506020612fb98582860161288b565b9150509250929050565b60008060408385031215612fda57612fd961277d565b5b6000612fe8858286016129a9565b9250506020612ff98582860161288b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061304a57607f821691505b60208210810361305d5761305c613003565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026130c57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613088565b6130cf8683613088565b95508019841693508086168417925050509392505050565b6000819050919050565b600061310c61310761310284612988565b6130e7565b612988565b9050919050565b6000819050919050565b613126836130f1565b61313a61313282613113565b848454613095565b825550505050565b600090565b61314f613142565b61315a81848461311d565b505050565b5b8181101561317e57613173600082613147565b600181019050613160565b5050565b601f8211156131c35761319481613063565b61319d84613078565b810160208510156131ac578190505b6131c06131b885613078565b83018261315f565b50505b505050565b600082821c905092915050565b60006131e6600019846008026131c8565b1980831691505092915050565b60006131ff83836131d5565b9150826002028217905092915050565b613218826128cd565b67ffffffffffffffff81111561323157613230612a5f565b5b61323b8254613032565b613246828285613182565b600060209050601f8311600181146132795760008415613267578287015190505b61327185826131f3565b8655506132d9565b601f19841661328786613063565b60005b828110156132af5784890151825560018201915060208501945060208101905061328a565b868310156132cc57848901516132c8601f8916826131d5565b8355505b6001600288020188555050505b505050505050565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b60006133176011836128d8565b9150613322826132e1565b602082019050919050565b600060208201905081810360008301526133468161330a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061338782612988565b915061339283612988565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156133cb576133ca61334d565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061341082612988565b915061341b83612988565b92508261342b5761342a6133d6565b5b828204905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061346c601f836128d8565b915061347782613436565b602082019050919050565b6000602082019050818103600083015261349b8161345f565b9050919050565b600081905092915050565b50565b60006134bd6000836134a2565b91506134c8826134ad565b600082019050919050565b60006134de826134b0565b9150819050919050565b7f5468652073616c65206973207061757365642100000000000000000000000000600082015250565b600061351e6013836128d8565b9150613529826134e8565b602082019050919050565b6000602082019050818103600083015261354d81613511565b9050919050565b600061355f82612988565b915061356a83612988565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561359f5761359e61334d565b5b828201905092915050565b7f536f6c64206f7574210000000000000000000000000000000000000000000000600082015250565b60006135e06009836128d8565b91506135eb826135aa565b602082019050919050565b6000602082019050818103600083015261360f816135d3565b9050919050565b7f4164647265737320616c726561647920636c61696d6564210000000000000000600082015250565b600061364c6018836128d8565b915061365782613616565b602082019050919050565b6000602082019050818103600083015261367b8161363f565b9050919050565b60008160601b9050919050565b600061369a82613682565b9050919050565b60006136ac8261368f565b9050919050565b6136c46136bf82612862565b6136a1565b82525050565b60006136d682846136b3565b60148201915081905092915050565b7f496e76616c6964207369676e6174757265210000000000000000000000000000600082015250565b600061371b6012836128d8565b9150613726826136e5565b602082019050919050565b6000602082019050818103600083015261374a8161370e565b9050919050565b7f4e6f6e6578697374656e7420746f6b656e210000000000000000000000000000600082015250565b60006137876012836128d8565b915061379282613751565b602082019050919050565b600060208201905081810360008301526137b68161377a565b9050919050565b600081905092915050565b60006137d3826128cd565b6137dd81856137bd565b93506137ed8185602086016128e9565b80840191505092915050565b6000815461380681613032565b61381081866137bd565b9450600182166000811461382b576001811461384057613873565b60ff1983168652811515820286019350613873565b61384985613063565b60005b8381101561386b5781548189015260018201915060208101905061384c565b838801955050505b50505092915050565b600061388882866137c8565b915061389482856137c8565b91506138a082846137f9565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006139096026836128d8565b9150613914826138ad565b604082019050919050565b60006020820190508181036000830152613938816138fc565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006139756020836128d8565b91506139808261393f565b602082019050919050565b600060208201905081810360008301526139a481613968565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006139d2826139ab565b6139dc81856139b6565b93506139ec8185602086016128e9565b6139f58161291c565b840191505092915050565b6000608082019050613a1560008301876129eb565b613a2260208301866129eb565b613a2f6040830185612bd3565b8181036060830152613a4181846139c7565b905095945050505050565b600081519050613a5b816127b3565b92915050565b600060208284031215613a7757613a7661277d565b5b6000613a8584828501613a4c565b91505092915050565b6000613a9982612988565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613acb57613aca61334d565b5b600182019050919050565b6000613ae182612988565b9150613aec83612988565b925082821015613aff57613afe61334d565b5b828203905092915050565b6000613b1582612988565b9150613b2083612988565b925082613b3057613b2f6133d6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220783d7c5a0b6b07d9217de646d2ef2771a9d907004ad5e27510b16b9655903d4864736f6c634300080f0033697066733a2f2f516d5969336b71664a43745a317063753177636d48754a6778536e39525657757a6f78797442596a6b4e7534704a

Deployed Bytecode

0x60806040526004361061023b5760003560e01c806370a082311161012e578063a45ba8e7116100ab578063c87b56dd1161006f578063c87b56dd14610819578063d5abeb0114610856578063e985e9c514610881578063efbd73f4146108be578063f2fde38b146108e75761023b565b8063a45ba8e714610755578063ad2f852a14610780578063b77a147b146107ab578063b88d4fde146107c7578063c7cd997f146107f05761023b565b80637ec4a659116100f25780637ec4a659146106965780638456cb59146106bf5780638da5cb5b146106d657806395d89b4114610701578063a22cb4651461072c5761023b565b806370a08231146105b3578063715018a6146105f0578063772dc32f1461060757806377b7399e146106445780637cb647591461066d5761023b565b80632eb4a7ab116101bc5780635503a0e8116101805780635503a0e8146104ca5780635a2bcc18146104f55780635c975abb1461052057806362b99ad41461054b5780636352211e146105765761023b565b80632eb4a7ab1461041d5780633bd64968146104485780633ccfd60b1461045f57806342842e0e14610476578063518302271461049f5761023b565b806316ba10e01161020357806316ba10e01461033757806318160ddd1461036057806323b872dd1461038b57806329ee566c146103b45780632a55205a146103df5761023b565b806301ffc9a71461024057806306d254da1461027d57806306fdde03146102a6578063081812fc146102d1578063095ea7b31461030e575b600080fd5b34801561024c57600080fd5b50610267600480360381019061026291906127df565b610910565b6040516102749190612827565b60405180910390f35b34801561028957600080fd5b506102a4600480360381019061029f91906128a0565b61098a565b005b3480156102b257600080fd5b506102bb6109d6565b6040516102c89190612966565b60405180910390f35b3480156102dd57600080fd5b506102f860048036038101906102f391906129be565b610a68565b60405161030591906129fa565b60405180910390f35b34801561031a57600080fd5b5061033560048036038101906103309190612a15565b610ae7565b005b34801561034357600080fd5b5061035e60048036038101906103599190612b8a565b610c2b565b005b34801561036c57600080fd5b50610375610c46565b6040516103829190612be2565b60405180910390f35b34801561039757600080fd5b506103b260048036038101906103ad9190612bfd565b610c5d565b005b3480156103c057600080fd5b506103c9610f7f565b6040516103d69190612be2565b60405180910390f35b3480156103eb57600080fd5b5061040660048036038101906104019190612c50565b610f85565b604051610414929190612c90565b60405180910390f35b34801561042957600080fd5b50610432611019565b60405161043f9190612cd2565b60405180910390f35b34801561045457600080fd5b5061045d61101f565b005b34801561046b57600080fd5b50610474611044565b005b34801561048257600080fd5b5061049d60048036038101906104989190612bfd565b611121565b005b3480156104ab57600080fd5b506104b4611141565b6040516104c19190612827565b60405180910390f35b3480156104d657600080fd5b506104df611154565b6040516104ec9190612966565b60405180910390f35b34801561050157600080fd5b5061050a6111e2565b6040516105179190612be2565b60405180910390f35b34801561052c57600080fd5b506105356111e8565b6040516105429190612827565b60405180910390f35b34801561055757600080fd5b506105606111fb565b60405161056d9190612966565b60405180910390f35b34801561058257600080fd5b5061059d600480360381019061059891906129be565b611289565b6040516105aa91906129fa565b60405180910390f35b3480156105bf57600080fd5b506105da60048036038101906105d591906128a0565b61129b565b6040516105e79190612be2565b60405180910390f35b3480156105fc57600080fd5b50610605611353565b005b34801561061357600080fd5b5061062e600480360381019061062991906128a0565b611367565b60405161063b9190612827565b60405180910390f35b34801561065057600080fd5b5061066b600480360381019061066691906129be565b611387565b005b34801561067957600080fd5b50610694600480360381019061068f9190612d19565b611399565b005b3480156106a257600080fd5b506106bd60048036038101906106b89190612b8a565b6113ab565b005b3480156106cb57600080fd5b506106d46113c6565b005b3480156106e257600080fd5b506106eb6113fa565b6040516106f891906129fa565b60405180910390f35b34801561070d57600080fd5b50610716611424565b6040516107239190612966565b60405180910390f35b34801561073857600080fd5b50610753600480360381019061074e9190612d72565b6114b6565b005b34801561076157600080fd5b5061076a61162d565b6040516107779190612966565b60405180910390f35b34801561078c57600080fd5b506107956116bb565b6040516107a291906129fa565b60405180910390f35b6107c560048036038101906107c09190612e12565b6116e1565b005b3480156107d357600080fd5b506107ee60048036038101906107e99190612f00565b6119a9565b005b3480156107fc57600080fd5b50610817600480360381019061081291906129be565b611a1c565b005b34801561082557600080fd5b50610840600480360381019061083b91906129be565b611a2e565b60405161084d9190612966565b60405180910390f35b34801561086257600080fd5b5061086b611b86565b6040516108789190612be2565b60405180910390f35b34801561088d57600080fd5b506108a860048036038101906108a39190612f83565b611b8c565b6040516108b59190612827565b60405180910390f35b3480156108ca57600080fd5b506108e560048036038101906108e09190612fc3565b611c20565b005b3480156108f357600080fd5b5061090e600480360381019061090991906128a0565b611c8c565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610983575061098282611d0f565b5b9050919050565b610992611da1565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600280546109e590613032565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1190613032565b8015610a5e5780601f10610a3357610100808354040283529160200191610a5e565b820191906000526020600020905b815481529060010190602001808311610a4157829003601f168201915b5050505050905090565b6000610a7382611e1f565b610aa9576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610af282611289565b90508073ffffffffffffffffffffffffffffffffffffffff16610b13611e7e565b73ffffffffffffffffffffffffffffffffffffffff1614610b7657610b3f81610b3a611e7e565b611b8c565b610b75576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610c33611da1565b8060119081610c42919061320f565b5050565b6000610c50611e86565b6001546000540303905090565b6000610c6882611e8f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ccf576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610cdb84611f5b565b91509150610cf18187610cec611e7e565b611f82565b610d3d57610d0686610d01611e7e565b611b8c565b610d3c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610da3576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610db08686866001611fc6565b8015610dbb57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610e8985610e65888887611fcc565b7c020000000000000000000000000000000000000000000000000000000017611ff4565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610f0f5760006001850190506000600460008381526020019081526020016000205403610f0d576000548114610f0c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f77868686600161201f565b505050505050565b600f5481565b600080610f9184611e1f565b610fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc79061332d565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166103e8600f5485611004919061337c565b61100e9190613405565b915091509250929050565b600d5481565b611027611da1565b6001601260016101000a81548160ff021916908315150217905550565b61104c611da1565b600260095403611091576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108890613482565b60405180910390fd5b600260098190555060006110a36113fa565b73ffffffffffffffffffffffffffffffffffffffff16476040516110c6906134d3565b60006040518083038185875af1925050503d8060008114611103576040519150601f19603f3d011682016040523d82523d6000602084013e611108565b606091505b505090508061111657600080fd5b506001600981905550565b61113c838383604051806020016040528060008152506119a9565b505050565b601260019054906101000a900460ff1681565b6011805461116190613032565b80601f016020809104026020016040519081016040528092919081815260200182805461118d90613032565b80156111da5780601f106111af576101008083540402835291602001916111da565b820191906000526020600020905b8154815290600101906020018083116111bd57829003601f168201915b505050505081565b600c5481565b601260009054906101000a900460ff1681565b6010805461120890613032565b80601f016020809104026020016040519081016040528092919081815260200182805461123490613032565b80156112815780601f1061125657610100808354040283529160200191611281565b820191906000526020600020905b81548152906001019060200180831161126457829003601f168201915b505050505081565b600061129482611e8f565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611302576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61135b611da1565b6113656000612025565b565b60136020528060005260406000206000915054906101000a900460ff1681565b61138f611da1565b80600f8190555050565b6113a1611da1565b80600d8190555050565b6113b3611da1565b80601090816113c2919061320f565b5050565b6113ce611da1565b601260009054906101000a900460ff1615601260006101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461143390613032565b80601f016020809104026020016040519081016040528092919081815260200182805461145f90613032565b80156114ac5780601f10611481576101008083540402835291602001916114ac565b820191906000526020600020905b81548152906001019060200180831161148f57829003601f168201915b5050505050905090565b6114be611e7e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611522576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061152f611e7e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115dc611e7e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116219190612827565b60405180910390a35050565b600a805461163a90613032565b80601f016020809104026020016040519081016040528092919081815260200182805461166690613032565b80156116b35780601f10611688576101008083540402835291602001916116b3565b820191906000526020600020905b81548152906001019060200180831161169657829003601f168201915b505050505081565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601260009054906101000a900460ff1615611731576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172890613534565b60405180910390fd5b600b54600c5461173f610c46565b6117499190613554565b111561178a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611781906135f6565b60405180910390fd5b601360006117966120eb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561181e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181590613662565b60405180910390fd5b600260095403611863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185a90613482565b60405180910390fd5b600260098190555060006118756120eb565b60405160200161188591906136ca565b6040516020818303038152906040528051906020012090506118eb838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d54836120f3565b61192a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192190613731565b60405180910390fd5b6001601360006119386120eb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061199c6119946120eb565b600c5461210a565b5060016009819055505050565b6119b4848484610c5d565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611a16576119df84848484612128565b611a15576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611a24611da1565b80600c8190555050565b6060611a3982611e1f565b611a78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6f9061379d565b60405180910390fd5b60001515601260019054906101000a900460ff16151503611b2557600a8054611aa090613032565b80601f0160208091040260200160405190810160405280929190818152602001828054611acc90613032565b8015611b195780601f10611aee57610100808354040283529160200191611b19565b820191906000526020600020905b815481529060010190602001808311611afc57829003601f168201915b50505050509050611b81565b6000611b2f612278565b90506000815111611b4f5760405180602001604052806000815250611b7d565b80611b598461230a565b6011604051602001611b6d9392919061387c565b6040516020818303038152906040525b9150505b919050565b600b5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c28611da1565b600b5482611c34610c46565b611c3e9190613554565b10611c7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c75906135f6565b60405180910390fd5b611c88818361210a565b5050565b611c94611da1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfa9061391f565b60405180910390fd5b611d0c81612025565b50565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d6a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d9a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b611da96120eb565b73ffffffffffffffffffffffffffffffffffffffff16611dc76113fa565b73ffffffffffffffffffffffffffffffffffffffff1614611e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e149061398b565b60405180910390fd5b565b600081611e2a611e86565b11158015611e39575060005482105b8015611e77575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080611e9e611e86565b11611f2457600054811015611f235760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611f21575b60008103611f17576004600083600190039350838152602001908152602001600020549050611eed565b8092505050611f56565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611fe386868461246a565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b6000826121008584612473565b1490509392505050565b6121248282604051806020016040528060008152506124c9565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261214e611e7e565b8786866040518563ffffffff1660e01b81526004016121709493929190613a00565b6020604051808303816000875af19250505080156121ac57506040513d601f19601f820116820180604052508101906121a99190613a61565b60015b612225573d80600081146121dc576040519150601f19603f3d011682016040523d82523d6000602084013e6121e1565b606091505b50600081510361221d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606010805461228790613032565b80601f01602080910402602001604051908101604052809291908181526020018280546122b390613032565b80156123005780601f106122d557610100808354040283529160200191612300565b820191906000526020600020905b8154815290600101906020018083116122e357829003601f168201915b5050505050905090565b606060008203612351576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612465565b600082905060005b6000821461238357808061236c90613a8e565b915050600a8261237c9190613405565b9150612359565b60008167ffffffffffffffff81111561239f5761239e612a5f565b5b6040519080825280601f01601f1916602001820160405280156123d15781602001600182028036833780820191505090505b5090505b6000851461245e576001826123ea9190613ad6565b9150600a856123f99190613b0a565b60306124059190613554565b60f81b81838151811061241b5761241a613b3b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124579190613405565b94506123d5565b8093505050505b919050565b60009392505050565b60008082905060005b84518110156124be576124a98286838151811061249c5761249b613b3b565b5b6020026020010151612566565b915080806124b690613a8e565b91505061247c565b508091505092915050565b6124d38383612591565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461256157600080549050600083820390505b6125136000868380600101945086612128565b612549576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061250057816000541461255e57600080fd5b50505b505050565b600081831061257e57612579828461274c565b612589565b612588838361274c565b5b905092915050565b600080549050600082036125d1576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125de6000848385611fc6565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612655836126466000866000611fcc565b61264f85612763565b17611ff4565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146126f657808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506126bb565b5060008203612731576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050612747600084838561201f565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6127bc81612787565b81146127c757600080fd5b50565b6000813590506127d9816127b3565b92915050565b6000602082840312156127f5576127f461277d565b5b6000612803848285016127ca565b91505092915050565b60008115159050919050565b6128218161280c565b82525050565b600060208201905061283c6000830184612818565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061286d82612842565b9050919050565b61287d81612862565b811461288857600080fd5b50565b60008135905061289a81612874565b92915050565b6000602082840312156128b6576128b561277d565b5b60006128c48482850161288b565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156129075780820151818401526020810190506128ec565b83811115612916576000848401525b50505050565b6000601f19601f8301169050919050565b6000612938826128cd565b61294281856128d8565b93506129528185602086016128e9565b61295b8161291c565b840191505092915050565b60006020820190508181036000830152612980818461292d565b905092915050565b6000819050919050565b61299b81612988565b81146129a657600080fd5b50565b6000813590506129b881612992565b92915050565b6000602082840312156129d4576129d361277d565b5b60006129e2848285016129a9565b91505092915050565b6129f481612862565b82525050565b6000602082019050612a0f60008301846129eb565b92915050565b60008060408385031215612a2c57612a2b61277d565b5b6000612a3a8582860161288b565b9250506020612a4b858286016129a9565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a978261291c565b810181811067ffffffffffffffff82111715612ab657612ab5612a5f565b5b80604052505050565b6000612ac9612773565b9050612ad58282612a8e565b919050565b600067ffffffffffffffff821115612af557612af4612a5f565b5b612afe8261291c565b9050602081019050919050565b82818337600083830152505050565b6000612b2d612b2884612ada565b612abf565b905082815260208101848484011115612b4957612b48612a5a565b5b612b54848285612b0b565b509392505050565b600082601f830112612b7157612b70612a55565b5b8135612b81848260208601612b1a565b91505092915050565b600060208284031215612ba057612b9f61277d565b5b600082013567ffffffffffffffff811115612bbe57612bbd612782565b5b612bca84828501612b5c565b91505092915050565b612bdc81612988565b82525050565b6000602082019050612bf76000830184612bd3565b92915050565b600080600060608486031215612c1657612c1561277d565b5b6000612c248682870161288b565b9350506020612c358682870161288b565b9250506040612c46868287016129a9565b9150509250925092565b60008060408385031215612c6757612c6661277d565b5b6000612c75858286016129a9565b9250506020612c86858286016129a9565b9150509250929050565b6000604082019050612ca560008301856129eb565b612cb26020830184612bd3565b9392505050565b6000819050919050565b612ccc81612cb9565b82525050565b6000602082019050612ce76000830184612cc3565b92915050565b612cf681612cb9565b8114612d0157600080fd5b50565b600081359050612d1381612ced565b92915050565b600060208284031215612d2f57612d2e61277d565b5b6000612d3d84828501612d04565b91505092915050565b612d4f8161280c565b8114612d5a57600080fd5b50565b600081359050612d6c81612d46565b92915050565b60008060408385031215612d8957612d8861277d565b5b6000612d978582860161288b565b9250506020612da885828601612d5d565b9150509250929050565b600080fd5b600080fd5b60008083601f840112612dd257612dd1612a55565b5b8235905067ffffffffffffffff811115612def57612dee612db2565b5b602083019150836020820283011115612e0b57612e0a612db7565b5b9250929050565b60008060208385031215612e2957612e2861277d565b5b600083013567ffffffffffffffff811115612e4757612e46612782565b5b612e5385828601612dbc565b92509250509250929050565b600067ffffffffffffffff821115612e7a57612e79612a5f565b5b612e838261291c565b9050602081019050919050565b6000612ea3612e9e84612e5f565b612abf565b905082815260208101848484011115612ebf57612ebe612a5a565b5b612eca848285612b0b565b509392505050565b600082601f830112612ee757612ee6612a55565b5b8135612ef7848260208601612e90565b91505092915050565b60008060008060808587031215612f1a57612f1961277d565b5b6000612f288782880161288b565b9450506020612f398782880161288b565b9350506040612f4a878288016129a9565b925050606085013567ffffffffffffffff811115612f6b57612f6a612782565b5b612f7787828801612ed2565b91505092959194509250565b60008060408385031215612f9a57612f9961277d565b5b6000612fa88582860161288b565b9250506020612fb98582860161288b565b9150509250929050565b60008060408385031215612fda57612fd961277d565b5b6000612fe8858286016129a9565b9250506020612ff98582860161288b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061304a57607f821691505b60208210810361305d5761305c613003565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026130c57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613088565b6130cf8683613088565b95508019841693508086168417925050509392505050565b6000819050919050565b600061310c61310761310284612988565b6130e7565b612988565b9050919050565b6000819050919050565b613126836130f1565b61313a61313282613113565b848454613095565b825550505050565b600090565b61314f613142565b61315a81848461311d565b505050565b5b8181101561317e57613173600082613147565b600181019050613160565b5050565b601f8211156131c35761319481613063565b61319d84613078565b810160208510156131ac578190505b6131c06131b885613078565b83018261315f565b50505b505050565b600082821c905092915050565b60006131e6600019846008026131c8565b1980831691505092915050565b60006131ff83836131d5565b9150826002028217905092915050565b613218826128cd565b67ffffffffffffffff81111561323157613230612a5f565b5b61323b8254613032565b613246828285613182565b600060209050601f8311600181146132795760008415613267578287015190505b61327185826131f3565b8655506132d9565b601f19841661328786613063565b60005b828110156132af5784890151825560018201915060208501945060208101905061328a565b868310156132cc57848901516132c8601f8916826131d5565b8355505b6001600288020188555050505b505050505050565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b60006133176011836128d8565b9150613322826132e1565b602082019050919050565b600060208201905081810360008301526133468161330a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061338782612988565b915061339283612988565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156133cb576133ca61334d565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061341082612988565b915061341b83612988565b92508261342b5761342a6133d6565b5b828204905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061346c601f836128d8565b915061347782613436565b602082019050919050565b6000602082019050818103600083015261349b8161345f565b9050919050565b600081905092915050565b50565b60006134bd6000836134a2565b91506134c8826134ad565b600082019050919050565b60006134de826134b0565b9150819050919050565b7f5468652073616c65206973207061757365642100000000000000000000000000600082015250565b600061351e6013836128d8565b9150613529826134e8565b602082019050919050565b6000602082019050818103600083015261354d81613511565b9050919050565b600061355f82612988565b915061356a83612988565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561359f5761359e61334d565b5b828201905092915050565b7f536f6c64206f7574210000000000000000000000000000000000000000000000600082015250565b60006135e06009836128d8565b91506135eb826135aa565b602082019050919050565b6000602082019050818103600083015261360f816135d3565b9050919050565b7f4164647265737320616c726561647920636c61696d6564210000000000000000600082015250565b600061364c6018836128d8565b915061365782613616565b602082019050919050565b6000602082019050818103600083015261367b8161363f565b9050919050565b60008160601b9050919050565b600061369a82613682565b9050919050565b60006136ac8261368f565b9050919050565b6136c46136bf82612862565b6136a1565b82525050565b60006136d682846136b3565b60148201915081905092915050565b7f496e76616c6964207369676e6174757265210000000000000000000000000000600082015250565b600061371b6012836128d8565b9150613726826136e5565b602082019050919050565b6000602082019050818103600083015261374a8161370e565b9050919050565b7f4e6f6e6578697374656e7420746f6b656e210000000000000000000000000000600082015250565b60006137876012836128d8565b915061379282613751565b602082019050919050565b600060208201905081810360008301526137b68161377a565b9050919050565b600081905092915050565b60006137d3826128cd565b6137dd81856137bd565b93506137ed8185602086016128e9565b80840191505092915050565b6000815461380681613032565b61381081866137bd565b9450600182166000811461382b576001811461384057613873565b60ff1983168652811515820286019350613873565b61384985613063565b60005b8381101561386b5781548189015260018201915060208101905061384c565b838801955050505b50505092915050565b600061388882866137c8565b915061389482856137c8565b91506138a082846137f9565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006139096026836128d8565b9150613914826138ad565b604082019050919050565b60006020820190508181036000830152613938816138fc565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006139756020836128d8565b91506139808261393f565b602082019050919050565b600060208201905081810360008301526139a481613968565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006139d2826139ab565b6139dc81856139b6565b93506139ec8185602086016128e9565b6139f58161291c565b840191505092915050565b6000608082019050613a1560008301876129eb565b613a2260208301866129eb565b613a2f6040830185612bd3565b8181036060830152613a4181846139c7565b905095945050505050565b600081519050613a5b816127b3565b92915050565b600060208284031215613a7757613a7661277d565b5b6000613a8584828501613a4c565b91505092915050565b6000613a9982612988565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613acb57613aca61334d565b5b600182019050919050565b6000613ae182612988565b9150613aec83612988565b925082821015613aff57613afe61334d565b5b828203905092915050565b6000613b1582612988565b9150613b2083612988565b925082613b3057613b2f6133d6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220783d7c5a0b6b07d9217de646d2ef2771a9d907004ad5e27510b16b9655903d4864736f6c634300080f0033

Deployed Bytecode Sourcemap

70717:3948:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74420:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73477:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38726:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45209:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44650:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73295:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34477:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48916:2817;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71122:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74056:273;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;71012:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73403:68;;;;;;;;;;;;;:::i;:::-;;73869:150;;;;;;;;;;;;;:::i;:::-;;51829:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71294:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71225:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70978:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71263:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71192:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40119:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35661:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16757:103;;;;;;;;;;;;;:::i;:::-;;71327:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73597:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72987:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73189:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72918:63;;;;;;;;;;;;;:::i;:::-;;16109:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38902:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45767:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70849:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71043:74;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71762:345;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52612:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73091:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72442:414;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70943:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46232:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72113:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17015:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74420:242;74523:4;74575:26;74560:41;;;:11;:41;;;;:94;;;;74618:36;74642:11;74618:23;:36::i;:::-;74560:94;74540:114;;74420:242;;;:::o;73477:114::-;15995:13;:11;:13::i;:::-;73570:15:::1;73553:14;;:32;;;;;;;;;;;;;;;;;;73477:114:::0;:::o;38726:100::-;38780:13;38813:5;38806:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38726:100;:::o;45209:218::-;45285:7;45310:16;45318:7;45310;:16::i;:::-;45305:64;;45335:34;;;;;;;;;;;;;;45305:64;45389:15;:24;45405:7;45389:24;;;;;;;;;;;:30;;;;;;;;;;;;45382:37;;45209:218;;;:::o;44650:400::-;44731:13;44747:16;44755:7;44747;:16::i;:::-;44731:32;;44803:5;44780:28;;:19;:17;:19::i;:::-;:28;;;44776:175;;44828:44;44845:5;44852:19;:17;:19::i;:::-;44828:16;:44::i;:::-;44823:128;;44900:35;;;;;;;;;;;;;;44823:128;44776:175;44996:2;44963:15;:24;44979:7;44963:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;45034:7;45030:2;45014:28;;45023:5;45014:28;;;;;;;;;;;;44720:330;44650:400;;:::o;73295:100::-;15995:13;:11;:13::i;:::-;73379:10:::1;73367:9;:22;;;;;;:::i;:::-;;73295:100:::0;:::o;34477:323::-;34538:7;34766:15;:13;:15::i;:::-;34751:12;;34735:13;;:28;:46;34728:53;;34477:323;:::o;48916:2817::-;49050:27;49080;49099:7;49080:18;:27::i;:::-;49050:57;;49165:4;49124:45;;49140:19;49124:45;;;49120:86;;49178:28;;;;;;;;;;;;;;49120:86;49220:27;49249:23;49276:35;49303:7;49276:26;:35::i;:::-;49219:92;;;;49411:68;49436:15;49453:4;49459:19;:17;:19::i;:::-;49411:24;:68::i;:::-;49406:180;;49499:43;49516:4;49522:19;:17;:19::i;:::-;49499:16;:43::i;:::-;49494:92;;49551:35;;;;;;;;;;;;;;49494:92;49406:180;49617:1;49603:16;;:2;:16;;;49599:52;;49628:23;;;;;;;;;;;;;;49599:52;49664:43;49686:4;49692:2;49696:7;49705:1;49664:21;:43::i;:::-;49800:15;49797:160;;;49940:1;49919:19;49912:30;49797:160;50337:18;:24;50356:4;50337:24;;;;;;;;;;;;;;;;50335:26;;;;;;;;;;;;50406:18;:22;50425:2;50406:22;;;;;;;;;;;;;;;;50404:24;;;;;;;;;;;50728:146;50765:2;50814:45;50829:4;50835:2;50839:19;50814:14;:45::i;:::-;30876:8;50786:73;50728:18;:146::i;:::-;50699:17;:26;50717:7;50699:26;;;;;;;;;;;:175;;;;51045:1;30876:8;50994:19;:47;:52;50990:627;;51067:19;51099:1;51089:7;:11;51067:33;;51256:1;51222:17;:30;51240:11;51222:30;;;;;;;;;;;;:35;51218:384;;51360:13;;51345:11;:28;51341:242;;51540:19;51507:17;:30;51525:11;51507:30;;;;;;;;;;;:52;;;;51341:242;51218:384;51048:569;50990:627;51664:7;51660:2;51645:27;;51654:4;51645:27;;;;;;;;;;;;51683:42;51704:4;51710:2;51714:7;51723:1;51683:20;:42::i;:::-;49039:2694;;;48916:2817;;;:::o;71122:28::-;;;;:::o;74056:273::-;74154:16;74172:21;74219:16;74227:7;74219;:16::i;:::-;74211:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;74276:14;;;;;;;;;;;74316:4;74305:7;;74293:9;:19;;;;:::i;:::-;74292:28;;;;:::i;:::-;74268:53;;;;74056:273;;;;;:::o;71012:25::-;;;;:::o;73403:68::-;15995:13;:11;:13::i;:::-;73461:4:::1;73450:8;;:15;;;;;;;;;;;;;;;;;;73403:68::o:0;73869:150::-;15995:13;:11;:13::i;:::-;4309:1:::1;4907:7;;:19:::0;4899:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;4309:1;5040:7;:18;;;;73927:7:::2;73948;:5;:7::i;:::-;73940:21;;73969;73940:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73926:69;;;74010:2;74002:11;;;::::0;::::2;;73919:100;4265:1:::1;5219:7;:22;;;;73869:150::o:0;51829:185::-;51967:39;51984:4;51990:2;51994:7;51967:39;;;;;;;;;;;;:16;:39::i;:::-;51829:185;;;:::o;71294:28::-;;;;;;;;;;;;;:::o;71225:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;70978:29::-;;;;:::o;71263:26::-;;;;;;;;;;;;;:::o;71192:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40119:152::-;40191:7;40234:27;40253:7;40234:18;:27::i;:::-;40211:52;;40119:152;;;:::o;35661:233::-;35733:7;35774:1;35757:19;;:5;:19;;;35753:60;;35785:28;;;;;;;;;;;;;;35753:60;29820:13;35831:18;:25;35850:5;35831:25;;;;;;;;;;;;;;;;:55;35824:62;;35661:233;;;:::o;16757:103::-;15995:13;:11;:13::i;:::-;16822:30:::1;16849:1;16822:18;:30::i;:::-;16757:103::o:0;71327:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;73597:91::-;15995:13;:11;:13::i;:::-;73674:8:::1;73664:7;:18;;;;73597:91:::0;:::o;72987:98::-;15995:13;:11;:13::i;:::-;73068:11:::1;73055:10;:24;;;;72987:98:::0;:::o;73189:100::-;15995:13;:11;:13::i;:::-;73273:10:::1;73261:9;:22;;;;;;:::i;:::-;;73189:100:::0;:::o;72918:63::-;15995:13;:11;:13::i;:::-;72969:6:::1;;;;;;;;;;;72968:7;72959:6;;:16;;;;;;;;;;;;;;;;;;72918:63::o:0;16109:87::-;16155:7;16182:6;;;;;;;;;;;16175:13;;16109:87;:::o;38902:104::-;38958:13;38991:7;38984:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38902:104;:::o;45767:308::-;45878:19;:17;:19::i;:::-;45866:31;;:8;:31;;;45862:61;;45906:17;;;;;;;;;;;;;;45862:61;45988:8;45936:18;:39;45955:19;:17;:19::i;:::-;45936:39;;;;;;;;;;;;;;;:49;45976:8;45936:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;46048:8;46012:55;;46027:19;:17;:19::i;:::-;46012:55;;;46058:8;46012:55;;;;;;:::i;:::-;;;;;;;;45767:308;;:::o;70849:89::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;71043:74::-;;;;;;;;;;;;;:::o;71762:345::-;71527:6;;;;;;;;;;;71526:7;71518:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;71602:9;;71588:10;;71572:13;:11;:13::i;:::-;:26;;;;:::i;:::-;:39;;71564:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;71641:14;:28;71656:12;:10;:12::i;:::-;71641:28;;;;;;;;;;;;;;;;;;;;;;;;;71640:29;71632:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;4309:1:::1;4907:7;;:19:::0;4899:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;4309:1;5040:7;:18;;;;71873:12:::2;71915;:10;:12::i;:::-;71898:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;71888:41;;;;;;71873:56;;71944:50;71963:12;;71944:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71977:10;;71989:4;71944:18;:50::i;:::-;71936:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;72055:4;72024:14;:28;72039:12;:10;:12::i;:::-;72024:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;72066;72076:12;:10;:12::i;:::-;72090:10;;72066:9;:35::i;:::-;71866:241;4265:1:::1;5219:7;:22;;;;71762:345:::0;;:::o;52612:399::-;52779:31;52792:4;52798:2;52802:7;52779:12;:31::i;:::-;52843:1;52825:2;:14;;;:19;52821:183;;52864:56;52895:4;52901:2;52905:7;52914:5;52864:30;:56::i;:::-;52859:145;;52948:40;;;;;;;;;;;;;;52859:145;52821:183;52612:399;;;;:::o;73091:90::-;15995:13;:11;:13::i;:::-;73168:7:::1;73155:10;:20;;;;73091:90:::0;:::o;72442:414::-;72516:13;72546:17;72554:8;72546:7;:17::i;:::-;72538:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;72609:5;72597:17;;:8;;;;;;;;;;;:17;;;72593:64;;72632:17;72625:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72593:64;72665:28;72696:10;:8;:10::i;:::-;72665:41;;72751:1;72726:14;72720:28;:32;:130;;;;;;;;;;;;;;;;;72788:14;72804:19;:8;:17;:19::i;:::-;72825:9;72771:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;72720:130;72713:137;;;72442:414;;;;:::o;70943:30::-;;;;:::o;46232:164::-;46329:4;46353:18;:25;46372:5;46353:25;;;;;;;;;;;;;;;:35;46379:8;46353:35;;;;;;;;;;;;;;;;;;;;;;;;;46346:42;;46232:164;;;;:::o;72113:183::-;15995:13;:11;:13::i;:::-;72231:9:::1;;72221:7;72205:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:35;72197:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;72261:29;72271:9;72282:7;72261:9;:29::i;:::-;72113:183:::0;;:::o;17015:201::-;15995:13;:11;:13::i;:::-;17124:1:::1;17104:22;;:8;:22;;::::0;17096:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;17180:28;17199:8;17180:18;:28::i;:::-;17015:201:::0;:::o;37824:639::-;37909:4;38248:10;38233:25;;:11;:25;;;;:102;;;;38325:10;38310:25;;:11;:25;;;;38233:102;:179;;;;38402:10;38387:25;;:11;:25;;;;38233:179;38213:199;;37824:639;;;:::o;16274:132::-;16349:12;:10;:12::i;:::-;16338:23;;:7;:5;:7::i;:::-;:23;;;16330:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16274:132::o;46654:282::-;46719:4;46775:7;46756:15;:13;:15::i;:::-;:26;;:66;;;;;46809:13;;46799:7;:23;46756:66;:153;;;;;46908:1;30596:8;46860:17;:26;46878:7;46860:26;;;;;;;;;;;;:44;:49;46756:153;46736:173;;46654:282;;;:::o;68420:105::-;68480:7;68507:10;68500:17;;68420:105;:::o;72337:99::-;72402:7;72427:1;72420:8;;72337:99;:::o;41274:1275::-;41341:7;41361:12;41376:7;41361:22;;41444:4;41425:15;:13;:15::i;:::-;:23;41421:1061;;41478:13;;41471:4;:20;41467:1015;;;41516:14;41533:17;:23;41551:4;41533:23;;;;;;;;;;;;41516:40;;41650:1;30596:8;41622:6;:24;:29;41618:845;;42287:113;42304:1;42294:6;:11;42287:113;;42347:17;:25;42365:6;;;;;;;42347:25;;;;;;;;;;;;42338:34;;42287:113;;;42433:6;42426:13;;;;;;41618:845;41493:989;41467:1015;41421:1061;42510:31;;;;;;;;;;;;;;41274:1275;;;;:::o;47817:479::-;47919:27;47948:23;47989:38;48030:15;:24;48046:7;48030:24;;;;;;;;;;;47989:65;;48201:18;48178:41;;48258:19;48252:26;48233:45;;48163:126;47817:479;;;:::o;47045:659::-;47194:11;47359:16;47352:5;47348:28;47339:37;;47519:16;47508:9;47504:32;47491:45;;47669:15;47658:9;47655:30;47647:5;47636:9;47633:20;47630:56;47620:66;;47045:659;;;;;:::o;53673:159::-;;;;;:::o;67729:311::-;67864:7;67884:16;31000:3;67910:19;:41;;67884:68;;31000:3;67978:31;67989:4;67995:2;67999:9;67978:10;:31::i;:::-;67970:40;;:62;;67963:69;;;67729:311;;;;;:::o;43097:450::-;43177:14;43345:16;43338:5;43334:28;43325:37;;43522:5;43508:11;43483:23;43479:41;43476:52;43469:5;43466:63;43456:73;;43097:450;;;;:::o;54497:158::-;;;;;:::o;17376:191::-;17450:16;17469:6;;;;;;;;;;;17450:25;;17495:8;17486:6;;:17;;;;;;;;;;;;;;;;;;17550:8;17519:40;;17540:8;17519:40;;;;;;;;;;;;17439:128;17376:191;:::o;14660:98::-;14713:7;14740:10;14733:17;;14660:98;:::o;6475:190::-;6600:4;6653;6624:25;6637:5;6644:4;6624:12;:25::i;:::-;:33;6617:40;;6475:190;;;;;:::o;62252:112::-;62329:27;62339:2;62343:8;62329:27;;;;;;;;;;;;:9;:27::i;:::-;62252:112;;:::o;55095:716::-;55258:4;55304:2;55279:45;;;55325:19;:17;:19::i;:::-;55346:4;55352:7;55361:5;55279:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;55275:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55579:1;55562:6;:13;:18;55558:235;;55608:40;;;;;;;;;;;;;;55558:235;55751:6;55745:13;55736:6;55732:2;55728:15;55721:38;55275:529;55448:54;;;55438:64;;;:6;:64;;;;55431:71;;;55095:716;;;;;;:::o;73731:104::-;73791:13;73820:9;73813:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73731:104;:::o;430:723::-;486:13;716:1;707:5;:10;703:53;;734:10;;;;;;;;;;;;;;;;;;;;;703:53;766:12;781:5;766:20;;797:14;822:78;837:1;829:4;:9;822:78;;855:8;;;;;:::i;:::-;;;;886:2;878:10;;;;;:::i;:::-;;;822:78;;;910:19;942:6;932:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:39;;960:154;976:1;967:5;:10;960:154;;1004:1;994:11;;;;;:::i;:::-;;;1071:2;1063:5;:10;;;;:::i;:::-;1050:2;:24;;;;:::i;:::-;1037:39;;1020:6;1027;1020:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1100:2;1091:11;;;;;:::i;:::-;;;960:154;;;1138:6;1124:21;;;;;430:723;;;;:::o;67430:147::-;67567:6;67430:147;;;;;:::o;7342:296::-;7425:7;7445:20;7468:4;7445:27;;7488:9;7483:118;7507:5;:12;7503:1;:16;7483:118;;;7556:33;7566:12;7580:5;7586:1;7580:8;;;;;;;;:::i;:::-;;;;;;;;7556:9;:33::i;:::-;7541:48;;7521:3;;;;;:::i;:::-;;;;7483:118;;;;7618:12;7611:19;;;7342:296;;;;:::o;61479:689::-;61610:19;61616:2;61620:8;61610:5;:19::i;:::-;61689:1;61671:2;:14;;;:19;61667:483;;61711:11;61725:13;;61711:27;;61757:13;61779:8;61773:3;:14;61757:30;;61806:233;61837:62;61876:1;61880:2;61884:7;;;;;;61893:5;61837:30;:62::i;:::-;61832:167;;61935:40;;;;;;;;;;;;;;61832:167;62034:3;62026:5;:11;61806:233;;62121:3;62104:13;;:20;62100:34;;62126:8;;;62100:34;61692:458;;61667:483;61479:689;;;:::o;13549:149::-;13612:7;13643:1;13639;:5;:51;;13670:20;13685:1;13688;13670:14;:20::i;:::-;13639:51;;;13647:20;13662:1;13665;13647:14;:20::i;:::-;13639:51;13632:58;;13549:149;;;;:::o;56273:2454::-;56346:20;56369:13;;56346:36;;56409:1;56397:8;:13;56393:44;;56419:18;;;;;;;;;;;;;;56393:44;56450:61;56480:1;56484:2;56488:12;56502:8;56450:21;:61::i;:::-;56994:1;29958:2;56964:1;:26;;56963:32;56951:8;:45;56925:18;:22;56944:2;56925:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;57273:139;57310:2;57364:33;57387:1;57391:2;57395:1;57364:14;:33::i;:::-;57331:30;57352:8;57331:20;:30::i;:::-;:66;57273:18;:139::i;:::-;57239:17;:31;57257:12;57239:31;;;;;;;;;;;:173;;;;57429:16;57460:11;57489:8;57474:12;:23;57460:37;;57744:16;57740:2;57736:25;57724:37;;58116:12;58076:8;58035:1;57973:25;57914:1;57853;57826:335;58241:1;58227:12;58223:20;58181:346;58282:3;58273:7;58270:16;58181:346;;58500:7;58490:8;58487:1;58460:25;58457:1;58454;58449:59;58335:1;58326:7;58322:15;58311:26;;58181:346;;;58185:77;58572:1;58560:8;:13;58556:45;;58582:19;;;;;;;;;;;;;;58556:45;58634:3;58618:13;:19;;;;56699:1950;;58659:60;58688:1;58692:2;58696:12;58710:8;58659:20;:60::i;:::-;56335:2392;56273:2454;;:::o;13706:268::-;13774:13;13881:1;13875:4;13868:15;13910:1;13904:4;13897:15;13951:4;13945;13935:21;13926:30;;13706:268;;;;:::o;43649:324::-;43719:14;43952:1;43942:8;43939:15;43913:24;43909:46;43899:56;;43649:324;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:329::-;2084:6;2133:2;2121:9;2112:7;2108:23;2104:32;2101:119;;;2139:79;;:::i;:::-;2101:119;2259:1;2284:53;2329:7;2320:6;2309:9;2305:22;2284:53;:::i;:::-;2274:63;;2230:117;2025:329;;;;:::o;2360:99::-;2412:6;2446:5;2440:12;2430:22;;2360:99;;;:::o;2465:169::-;2549:11;2583:6;2578:3;2571:19;2623:4;2618:3;2614:14;2599:29;;2465:169;;;;:::o;2640:307::-;2708:1;2718:113;2732:6;2729:1;2726:13;2718:113;;;2817:1;2812:3;2808:11;2802:18;2798:1;2793:3;2789:11;2782:39;2754:2;2751:1;2747:10;2742:15;;2718:113;;;2849:6;2846:1;2843:13;2840:101;;;2929:1;2920:6;2915:3;2911:16;2904:27;2840:101;2689:258;2640:307;;;:::o;2953:102::-;2994:6;3045:2;3041:7;3036:2;3029:5;3025:14;3021:28;3011:38;;2953:102;;;:::o;3061:364::-;3149:3;3177:39;3210:5;3177:39;:::i;:::-;3232:71;3296:6;3291:3;3232:71;:::i;:::-;3225:78;;3312:52;3357:6;3352:3;3345:4;3338:5;3334:16;3312:52;:::i;:::-;3389:29;3411:6;3389:29;:::i;:::-;3384:3;3380:39;3373:46;;3153:272;3061:364;;;;:::o;3431:313::-;3544:4;3582:2;3571:9;3567:18;3559:26;;3631:9;3625:4;3621:20;3617:1;3606:9;3602:17;3595:47;3659:78;3732:4;3723:6;3659:78;:::i;:::-;3651:86;;3431:313;;;;:::o;3750:77::-;3787:7;3816:5;3805:16;;3750:77;;;:::o;3833:122::-;3906:24;3924:5;3906:24;:::i;:::-;3899:5;3896:35;3886:63;;3945:1;3942;3935:12;3886:63;3833:122;:::o;3961:139::-;4007:5;4045:6;4032:20;4023:29;;4061:33;4088:5;4061:33;:::i;:::-;3961:139;;;;:::o;4106:329::-;4165:6;4214:2;4202:9;4193:7;4189:23;4185:32;4182:119;;;4220:79;;:::i;:::-;4182:119;4340:1;4365:53;4410:7;4401:6;4390:9;4386:22;4365:53;:::i;:::-;4355:63;;4311:117;4106:329;;;;:::o;4441:118::-;4528:24;4546:5;4528:24;:::i;:::-;4523:3;4516:37;4441:118;;:::o;4565:222::-;4658:4;4696:2;4685:9;4681:18;4673:26;;4709:71;4777:1;4766:9;4762:17;4753:6;4709:71;:::i;:::-;4565:222;;;;:::o;4793:474::-;4861:6;4869;4918:2;4906:9;4897:7;4893:23;4889:32;4886:119;;;4924:79;;:::i;:::-;4886:119;5044:1;5069:53;5114:7;5105:6;5094:9;5090:22;5069:53;:::i;:::-;5059:63;;5015:117;5171:2;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5142:118;4793:474;;;;;:::o;5273:117::-;5382:1;5379;5372:12;5396:117;5505:1;5502;5495:12;5519:180;5567:77;5564:1;5557:88;5664:4;5661:1;5654:15;5688:4;5685:1;5678:15;5705:281;5788:27;5810:4;5788:27;:::i;:::-;5780:6;5776:40;5918:6;5906:10;5903:22;5882:18;5870:10;5867:34;5864:62;5861:88;;;5929:18;;:::i;:::-;5861:88;5969:10;5965:2;5958:22;5748:238;5705:281;;:::o;5992:129::-;6026:6;6053:20;;:::i;:::-;6043:30;;6082:33;6110:4;6102:6;6082:33;:::i;:::-;5992:129;;;:::o;6127:308::-;6189:4;6279:18;6271:6;6268:30;6265:56;;;6301:18;;:::i;:::-;6265:56;6339:29;6361:6;6339:29;:::i;:::-;6331:37;;6423:4;6417;6413:15;6405:23;;6127:308;;;:::o;6441:154::-;6525:6;6520:3;6515;6502:30;6587:1;6578:6;6573:3;6569:16;6562:27;6441:154;;;:::o;6601:412::-;6679:5;6704:66;6720:49;6762:6;6720:49;:::i;:::-;6704:66;:::i;:::-;6695:75;;6793:6;6786:5;6779:21;6831:4;6824:5;6820:16;6869:3;6860:6;6855:3;6851:16;6848:25;6845:112;;;6876:79;;:::i;:::-;6845:112;6966:41;7000:6;6995:3;6990;6966:41;:::i;:::-;6685:328;6601:412;;;;;:::o;7033:340::-;7089:5;7138:3;7131:4;7123:6;7119:17;7115:27;7105:122;;7146:79;;:::i;:::-;7105:122;7263:6;7250:20;7288:79;7363:3;7355:6;7348:4;7340:6;7336:17;7288:79;:::i;:::-;7279:88;;7095:278;7033:340;;;;:::o;7379:509::-;7448:6;7497:2;7485:9;7476:7;7472:23;7468:32;7465:119;;;7503:79;;:::i;:::-;7465:119;7651:1;7640:9;7636:17;7623:31;7681:18;7673:6;7670:30;7667:117;;;7703:79;;:::i;:::-;7667:117;7808:63;7863:7;7854:6;7843:9;7839:22;7808:63;:::i;:::-;7798:73;;7594:287;7379:509;;;;:::o;7894:118::-;7981:24;7999:5;7981:24;:::i;:::-;7976:3;7969:37;7894:118;;:::o;8018:222::-;8111:4;8149:2;8138:9;8134:18;8126:26;;8162:71;8230:1;8219:9;8215:17;8206:6;8162:71;:::i;:::-;8018:222;;;;:::o;8246:619::-;8323:6;8331;8339;8388:2;8376:9;8367:7;8363:23;8359:32;8356:119;;;8394:79;;:::i;:::-;8356:119;8514:1;8539:53;8584:7;8575:6;8564:9;8560:22;8539:53;:::i;:::-;8529:63;;8485:117;8641:2;8667:53;8712:7;8703:6;8692:9;8688:22;8667:53;:::i;:::-;8657:63;;8612:118;8769:2;8795:53;8840:7;8831:6;8820:9;8816:22;8795:53;:::i;:::-;8785:63;;8740:118;8246:619;;;;;:::o;8871:474::-;8939:6;8947;8996:2;8984:9;8975:7;8971:23;8967:32;8964:119;;;9002:79;;:::i;:::-;8964:119;9122:1;9147:53;9192:7;9183:6;9172:9;9168:22;9147:53;:::i;:::-;9137:63;;9093:117;9249:2;9275:53;9320:7;9311:6;9300:9;9296:22;9275:53;:::i;:::-;9265:63;;9220:118;8871:474;;;;;:::o;9351:332::-;9472:4;9510:2;9499:9;9495:18;9487:26;;9523:71;9591:1;9580:9;9576:17;9567:6;9523:71;:::i;:::-;9604:72;9672:2;9661:9;9657:18;9648:6;9604:72;:::i;:::-;9351:332;;;;;:::o;9689:77::-;9726:7;9755:5;9744:16;;9689:77;;;:::o;9772:118::-;9859:24;9877:5;9859:24;:::i;:::-;9854:3;9847:37;9772:118;;:::o;9896:222::-;9989:4;10027:2;10016:9;10012:18;10004:26;;10040:71;10108:1;10097:9;10093:17;10084:6;10040:71;:::i;:::-;9896:222;;;;:::o;10124:122::-;10197:24;10215:5;10197:24;:::i;:::-;10190:5;10187:35;10177:63;;10236:1;10233;10226:12;10177:63;10124:122;:::o;10252:139::-;10298:5;10336:6;10323:20;10314:29;;10352:33;10379:5;10352:33;:::i;:::-;10252:139;;;;:::o;10397:329::-;10456:6;10505:2;10493:9;10484:7;10480:23;10476:32;10473:119;;;10511:79;;:::i;:::-;10473:119;10631:1;10656:53;10701:7;10692:6;10681:9;10677:22;10656:53;:::i;:::-;10646:63;;10602:117;10397:329;;;;:::o;10732:116::-;10802:21;10817:5;10802:21;:::i;:::-;10795:5;10792:32;10782:60;;10838:1;10835;10828:12;10782:60;10732:116;:::o;10854:133::-;10897:5;10935:6;10922:20;10913:29;;10951:30;10975:5;10951:30;:::i;:::-;10854:133;;;;:::o;10993:468::-;11058:6;11066;11115:2;11103:9;11094:7;11090:23;11086:32;11083:119;;;11121:79;;:::i;:::-;11083:119;11241:1;11266:53;11311:7;11302:6;11291:9;11287:22;11266:53;:::i;:::-;11256:63;;11212:117;11368:2;11394:50;11436:7;11427:6;11416:9;11412:22;11394:50;:::i;:::-;11384:60;;11339:115;10993:468;;;;;:::o;11467:117::-;11576:1;11573;11566:12;11590:117;11699:1;11696;11689:12;11730:568;11803:8;11813:6;11863:3;11856:4;11848:6;11844:17;11840:27;11830:122;;11871:79;;:::i;:::-;11830:122;11984:6;11971:20;11961:30;;12014:18;12006:6;12003:30;12000:117;;;12036:79;;:::i;:::-;12000:117;12150:4;12142:6;12138:17;12126:29;;12204:3;12196:4;12188:6;12184:17;12174:8;12170:32;12167:41;12164:128;;;12211:79;;:::i;:::-;12164:128;11730:568;;;;;:::o;12304:559::-;12390:6;12398;12447:2;12435:9;12426:7;12422:23;12418:32;12415:119;;;12453:79;;:::i;:::-;12415:119;12601:1;12590:9;12586:17;12573:31;12631:18;12623:6;12620:30;12617:117;;;12653:79;;:::i;:::-;12617:117;12766:80;12838:7;12829:6;12818:9;12814:22;12766:80;:::i;:::-;12748:98;;;;12544:312;12304:559;;;;;:::o;12869:307::-;12930:4;13020:18;13012:6;13009:30;13006:56;;;13042:18;;:::i;:::-;13006:56;13080:29;13102:6;13080:29;:::i;:::-;13072:37;;13164:4;13158;13154:15;13146:23;;12869:307;;;:::o;13182:410::-;13259:5;13284:65;13300:48;13341:6;13300:48;:::i;:::-;13284:65;:::i;:::-;13275:74;;13372:6;13365:5;13358:21;13410:4;13403:5;13399:16;13448:3;13439:6;13434:3;13430:16;13427:25;13424:112;;;13455:79;;:::i;:::-;13424:112;13545:41;13579:6;13574:3;13569;13545:41;:::i;:::-;13265:327;13182:410;;;;;:::o;13611:338::-;13666:5;13715:3;13708:4;13700:6;13696:17;13692:27;13682:122;;13723:79;;:::i;:::-;13682:122;13840:6;13827:20;13865:78;13939:3;13931:6;13924:4;13916:6;13912:17;13865:78;:::i;:::-;13856:87;;13672:277;13611:338;;;;:::o;13955:943::-;14050:6;14058;14066;14074;14123:3;14111:9;14102:7;14098:23;14094:33;14091:120;;;14130:79;;:::i;:::-;14091:120;14250:1;14275:53;14320:7;14311:6;14300:9;14296:22;14275:53;:::i;:::-;14265:63;;14221:117;14377:2;14403:53;14448:7;14439:6;14428:9;14424:22;14403:53;:::i;:::-;14393:63;;14348:118;14505:2;14531:53;14576:7;14567:6;14556:9;14552:22;14531:53;:::i;:::-;14521:63;;14476:118;14661:2;14650:9;14646:18;14633:32;14692:18;14684:6;14681:30;14678:117;;;14714:79;;:::i;:::-;14678:117;14819:62;14873:7;14864:6;14853:9;14849:22;14819:62;:::i;:::-;14809:72;;14604:287;13955:943;;;;;;;:::o;14904:474::-;14972:6;14980;15029:2;15017:9;15008:7;15004:23;15000:32;14997:119;;;15035:79;;:::i;:::-;14997:119;15155:1;15180:53;15225:7;15216:6;15205:9;15201:22;15180:53;:::i;:::-;15170:63;;15126:117;15282:2;15308:53;15353:7;15344:6;15333:9;15329:22;15308:53;:::i;:::-;15298:63;;15253:118;14904:474;;;;;:::o;15384:::-;15452:6;15460;15509:2;15497:9;15488:7;15484:23;15480:32;15477:119;;;15515:79;;:::i;:::-;15477:119;15635:1;15660:53;15705:7;15696:6;15685:9;15681:22;15660:53;:::i;:::-;15650:63;;15606:117;15762:2;15788:53;15833:7;15824:6;15813:9;15809:22;15788:53;:::i;:::-;15778:63;;15733:118;15384:474;;;;;:::o;15864:180::-;15912:77;15909:1;15902:88;16009:4;16006:1;15999:15;16033:4;16030:1;16023:15;16050:320;16094:6;16131:1;16125:4;16121:12;16111:22;;16178:1;16172:4;16168:12;16199:18;16189:81;;16255:4;16247:6;16243:17;16233:27;;16189:81;16317:2;16309:6;16306:14;16286:18;16283:38;16280:84;;16336:18;;:::i;:::-;16280:84;16101:269;16050:320;;;:::o;16376:141::-;16425:4;16448:3;16440:11;;16471:3;16468:1;16461:14;16505:4;16502:1;16492:18;16484:26;;16376:141;;;:::o;16523:93::-;16560:6;16607:2;16602;16595:5;16591:14;16587:23;16577:33;;16523:93;;;:::o;16622:107::-;16666:8;16716:5;16710:4;16706:16;16685:37;;16622:107;;;;:::o;16735:393::-;16804:6;16854:1;16842:10;16838:18;16877:97;16907:66;16896:9;16877:97;:::i;:::-;16995:39;17025:8;17014:9;16995:39;:::i;:::-;16983:51;;17067:4;17063:9;17056:5;17052:21;17043:30;;17116:4;17106:8;17102:19;17095:5;17092:30;17082:40;;16811:317;;16735:393;;;;;:::o;17134:60::-;17162:3;17183:5;17176:12;;17134:60;;;:::o;17200:142::-;17250:9;17283:53;17301:34;17310:24;17328:5;17310:24;:::i;:::-;17301:34;:::i;:::-;17283:53;:::i;:::-;17270:66;;17200:142;;;:::o;17348:75::-;17391:3;17412:5;17405:12;;17348:75;;;:::o;17429:269::-;17539:39;17570:7;17539:39;:::i;:::-;17600:91;17649:41;17673:16;17649:41;:::i;:::-;17641:6;17634:4;17628:11;17600:91;:::i;:::-;17594:4;17587:105;17505:193;17429:269;;;:::o;17704:73::-;17749:3;17704:73;:::o;17783:189::-;17860:32;;:::i;:::-;17901:65;17959:6;17951;17945:4;17901:65;:::i;:::-;17836:136;17783:189;;:::o;17978:186::-;18038:120;18055:3;18048:5;18045:14;18038:120;;;18109:39;18146:1;18139:5;18109:39;:::i;:::-;18082:1;18075:5;18071:13;18062:22;;18038:120;;;17978:186;;:::o;18170:543::-;18271:2;18266:3;18263:11;18260:446;;;18305:38;18337:5;18305:38;:::i;:::-;18389:29;18407:10;18389:29;:::i;:::-;18379:8;18375:44;18572:2;18560:10;18557:18;18554:49;;;18593:8;18578:23;;18554:49;18616:80;18672:22;18690:3;18672:22;:::i;:::-;18662:8;18658:37;18645:11;18616:80;:::i;:::-;18275:431;;18260:446;18170:543;;;:::o;18719:117::-;18773:8;18823:5;18817:4;18813:16;18792:37;;18719:117;;;;:::o;18842:169::-;18886:6;18919:51;18967:1;18963:6;18955:5;18952:1;18948:13;18919:51;:::i;:::-;18915:56;19000:4;18994;18990:15;18980:25;;18893:118;18842:169;;;;:::o;19016:295::-;19092:4;19238:29;19263:3;19257:4;19238:29;:::i;:::-;19230:37;;19300:3;19297:1;19293:11;19287:4;19284:21;19276:29;;19016:295;;;;:::o;19316:1395::-;19433:37;19466:3;19433:37;:::i;:::-;19535:18;19527:6;19524:30;19521:56;;;19557:18;;:::i;:::-;19521:56;19601:38;19633:4;19627:11;19601:38;:::i;:::-;19686:67;19746:6;19738;19732:4;19686:67;:::i;:::-;19780:1;19804:4;19791:17;;19836:2;19828:6;19825:14;19853:1;19848:618;;;;20510:1;20527:6;20524:77;;;20576:9;20571:3;20567:19;20561:26;20552:35;;20524:77;20627:67;20687:6;20680:5;20627:67;:::i;:::-;20621:4;20614:81;20483:222;19818:887;;19848:618;19900:4;19896:9;19888:6;19884:22;19934:37;19966:4;19934:37;:::i;:::-;19993:1;20007:208;20021:7;20018:1;20015:14;20007:208;;;20100:9;20095:3;20091:19;20085:26;20077:6;20070:42;20151:1;20143:6;20139:14;20129:24;;20198:2;20187:9;20183:18;20170:31;;20044:4;20041:1;20037:12;20032:17;;20007:208;;;20243:6;20234:7;20231:19;20228:179;;;20301:9;20296:3;20292:19;20286:26;20344:48;20386:4;20378:6;20374:17;20363:9;20344:48;:::i;:::-;20336:6;20329:64;20251:156;20228:179;20453:1;20449;20441:6;20437:14;20433:22;20427:4;20420:36;19855:611;;;19818:887;;19408:1303;;;19316:1395;;:::o;20717:167::-;20857:19;20853:1;20845:6;20841:14;20834:43;20717:167;:::o;20890:366::-;21032:3;21053:67;21117:2;21112:3;21053:67;:::i;:::-;21046:74;;21129:93;21218:3;21129:93;:::i;:::-;21247:2;21242:3;21238:12;21231:19;;20890:366;;;:::o;21262:419::-;21428:4;21466:2;21455:9;21451:18;21443:26;;21515:9;21509:4;21505:20;21501:1;21490:9;21486:17;21479:47;21543:131;21669:4;21543:131;:::i;:::-;21535:139;;21262:419;;;:::o;21687:180::-;21735:77;21732:1;21725:88;21832:4;21829:1;21822:15;21856:4;21853:1;21846:15;21873:348;21913:7;21936:20;21954:1;21936:20;:::i;:::-;21931:25;;21970:20;21988:1;21970:20;:::i;:::-;21965:25;;22158:1;22090:66;22086:74;22083:1;22080:81;22075:1;22068:9;22061:17;22057:105;22054:131;;;22165:18;;:::i;:::-;22054:131;22213:1;22210;22206:9;22195:20;;21873:348;;;;:::o;22227:180::-;22275:77;22272:1;22265:88;22372:4;22369:1;22362:15;22396:4;22393:1;22386:15;22413:185;22453:1;22470:20;22488:1;22470:20;:::i;:::-;22465:25;;22504:20;22522:1;22504:20;:::i;:::-;22499:25;;22543:1;22533:35;;22548:18;;:::i;:::-;22533:35;22590:1;22587;22583:9;22578:14;;22413:185;;;;:::o;22604:181::-;22744:33;22740:1;22732:6;22728:14;22721:57;22604:181;:::o;22791:366::-;22933:3;22954:67;23018:2;23013:3;22954:67;:::i;:::-;22947:74;;23030:93;23119:3;23030:93;:::i;:::-;23148:2;23143:3;23139:12;23132:19;;22791:366;;;:::o;23163:419::-;23329:4;23367:2;23356:9;23352:18;23344:26;;23416:9;23410:4;23406:20;23402:1;23391:9;23387:17;23380:47;23444:131;23570:4;23444:131;:::i;:::-;23436:139;;23163:419;;;:::o;23588:147::-;23689:11;23726:3;23711:18;;23588:147;;;;:::o;23741:114::-;;:::o;23861:398::-;24020:3;24041:83;24122:1;24117:3;24041:83;:::i;:::-;24034:90;;24133:93;24222:3;24133:93;:::i;:::-;24251:1;24246:3;24242:11;24235:18;;23861:398;;;:::o;24265:379::-;24449:3;24471:147;24614:3;24471:147;:::i;:::-;24464:154;;24635:3;24628:10;;24265:379;;;:::o;24650:169::-;24790:21;24786:1;24778:6;24774:14;24767:45;24650:169;:::o;24825:366::-;24967:3;24988:67;25052:2;25047:3;24988:67;:::i;:::-;24981:74;;25064:93;25153:3;25064:93;:::i;:::-;25182:2;25177:3;25173:12;25166:19;;24825:366;;;:::o;25197:419::-;25363:4;25401:2;25390:9;25386:18;25378:26;;25450:9;25444:4;25440:20;25436:1;25425:9;25421:17;25414:47;25478:131;25604:4;25478:131;:::i;:::-;25470:139;;25197:419;;;:::o;25622:305::-;25662:3;25681:20;25699:1;25681:20;:::i;:::-;25676:25;;25715:20;25733:1;25715:20;:::i;:::-;25710:25;;25869:1;25801:66;25797:74;25794:1;25791:81;25788:107;;;25875:18;;:::i;:::-;25788:107;25919:1;25916;25912:9;25905:16;;25622:305;;;;:::o;25933:159::-;26073:11;26069:1;26061:6;26057:14;26050:35;25933:159;:::o;26098:365::-;26240:3;26261:66;26325:1;26320:3;26261:66;:::i;:::-;26254:73;;26336:93;26425:3;26336:93;:::i;:::-;26454:2;26449:3;26445:12;26438:19;;26098:365;;;:::o;26469:419::-;26635:4;26673:2;26662:9;26658:18;26650:26;;26722:9;26716:4;26712:20;26708:1;26697:9;26693:17;26686:47;26750:131;26876:4;26750:131;:::i;:::-;26742:139;;26469:419;;;:::o;26894:174::-;27034:26;27030:1;27022:6;27018:14;27011:50;26894:174;:::o;27074:366::-;27216:3;27237:67;27301:2;27296:3;27237:67;:::i;:::-;27230:74;;27313:93;27402:3;27313:93;:::i;:::-;27431:2;27426:3;27422:12;27415:19;;27074:366;;;:::o;27446:419::-;27612:4;27650:2;27639:9;27635:18;27627:26;;27699:9;27693:4;27689:20;27685:1;27674:9;27670:17;27663:47;27727:131;27853:4;27727:131;:::i;:::-;27719:139;;27446:419;;;:::o;27871:94::-;27904:8;27952:5;27948:2;27944:14;27923:35;;27871:94;;;:::o;27971:::-;28010:7;28039:20;28053:5;28039:20;:::i;:::-;28028:31;;27971:94;;;:::o;28071:100::-;28110:7;28139:26;28159:5;28139:26;:::i;:::-;28128:37;;28071:100;;;:::o;28177:157::-;28282:45;28302:24;28320:5;28302:24;:::i;:::-;28282:45;:::i;:::-;28277:3;28270:58;28177:157;;:::o;28340:256::-;28452:3;28467:75;28538:3;28529:6;28467:75;:::i;:::-;28567:2;28562:3;28558:12;28551:19;;28587:3;28580:10;;28340:256;;;;:::o;28602:168::-;28742:20;28738:1;28730:6;28726:14;28719:44;28602:168;:::o;28776:366::-;28918:3;28939:67;29003:2;28998:3;28939:67;:::i;:::-;28932:74;;29015:93;29104:3;29015:93;:::i;:::-;29133:2;29128:3;29124:12;29117:19;;28776:366;;;:::o;29148:419::-;29314:4;29352:2;29341:9;29337:18;29329:26;;29401:9;29395:4;29391:20;29387:1;29376:9;29372:17;29365:47;29429:131;29555:4;29429:131;:::i;:::-;29421:139;;29148:419;;;:::o;29573:168::-;29713:20;29709:1;29701:6;29697:14;29690:44;29573:168;:::o;29747:366::-;29889:3;29910:67;29974:2;29969:3;29910:67;:::i;:::-;29903:74;;29986:93;30075:3;29986:93;:::i;:::-;30104:2;30099:3;30095:12;30088:19;;29747:366;;;:::o;30119:419::-;30285:4;30323:2;30312:9;30308:18;30300:26;;30372:9;30366:4;30362:20;30358:1;30347:9;30343:17;30336:47;30400:131;30526:4;30400:131;:::i;:::-;30392:139;;30119:419;;;:::o;30544:148::-;30646:11;30683:3;30668:18;;30544:148;;;;:::o;30698:377::-;30804:3;30832:39;30865:5;30832:39;:::i;:::-;30887:89;30969:6;30964:3;30887:89;:::i;:::-;30880:96;;30985:52;31030:6;31025:3;31018:4;31011:5;31007:16;30985:52;:::i;:::-;31062:6;31057:3;31053:16;31046:23;;30808:267;30698:377;;;;:::o;31105:874::-;31208:3;31245:5;31239:12;31274:36;31300:9;31274:36;:::i;:::-;31326:89;31408:6;31403:3;31326:89;:::i;:::-;31319:96;;31446:1;31435:9;31431:17;31462:1;31457:166;;;;31637:1;31632:341;;;;31424:549;;31457:166;31541:4;31537:9;31526;31522:25;31517:3;31510:38;31603:6;31596:14;31589:22;31581:6;31577:35;31572:3;31568:45;31561:52;;31457:166;;31632:341;31699:38;31731:5;31699:38;:::i;:::-;31759:1;31773:154;31787:6;31784:1;31781:13;31773:154;;;31861:7;31855:14;31851:1;31846:3;31842:11;31835:35;31911:1;31902:7;31898:15;31887:26;;31809:4;31806:1;31802:12;31797:17;;31773:154;;;31956:6;31951:3;31947:16;31940:23;;31639:334;;31424:549;;31212:767;;31105:874;;;;:::o;31985:589::-;32210:3;32232:95;32323:3;32314:6;32232:95;:::i;:::-;32225:102;;32344:95;32435:3;32426:6;32344:95;:::i;:::-;32337:102;;32456:92;32544:3;32535:6;32456:92;:::i;:::-;32449:99;;32565:3;32558:10;;31985:589;;;;;;:::o;32580:225::-;32720:34;32716:1;32708:6;32704:14;32697:58;32789:8;32784:2;32776:6;32772:15;32765:33;32580:225;:::o;32811:366::-;32953:3;32974:67;33038:2;33033:3;32974:67;:::i;:::-;32967:74;;33050:93;33139:3;33050:93;:::i;:::-;33168:2;33163:3;33159:12;33152:19;;32811:366;;;:::o;33183:419::-;33349:4;33387:2;33376:9;33372:18;33364:26;;33436:9;33430:4;33426:20;33422:1;33411:9;33407:17;33400:47;33464:131;33590:4;33464:131;:::i;:::-;33456:139;;33183:419;;;:::o;33608:182::-;33748:34;33744:1;33736:6;33732:14;33725:58;33608:182;:::o;33796:366::-;33938:3;33959:67;34023:2;34018:3;33959:67;:::i;:::-;33952:74;;34035:93;34124:3;34035:93;:::i;:::-;34153:2;34148:3;34144:12;34137:19;;33796:366;;;:::o;34168:419::-;34334:4;34372:2;34361:9;34357:18;34349:26;;34421:9;34415:4;34411:20;34407:1;34396:9;34392:17;34385:47;34449:131;34575:4;34449:131;:::i;:::-;34441:139;;34168:419;;;:::o;34593:98::-;34644:6;34678:5;34672:12;34662:22;;34593:98;;;:::o;34697:168::-;34780:11;34814:6;34809:3;34802:19;34854:4;34849:3;34845:14;34830:29;;34697:168;;;;:::o;34871:360::-;34957:3;34985:38;35017:5;34985:38;:::i;:::-;35039:70;35102:6;35097:3;35039:70;:::i;:::-;35032:77;;35118:52;35163:6;35158:3;35151:4;35144:5;35140:16;35118:52;:::i;:::-;35195:29;35217:6;35195:29;:::i;:::-;35190:3;35186:39;35179:46;;34961:270;34871:360;;;;:::o;35237:640::-;35432:4;35470:3;35459:9;35455:19;35447:27;;35484:71;35552:1;35541:9;35537:17;35528:6;35484:71;:::i;:::-;35565:72;35633:2;35622:9;35618:18;35609:6;35565:72;:::i;:::-;35647;35715:2;35704:9;35700:18;35691:6;35647:72;:::i;:::-;35766:9;35760:4;35756:20;35751:2;35740:9;35736:18;35729:48;35794:76;35865:4;35856:6;35794:76;:::i;:::-;35786:84;;35237:640;;;;;;;:::o;35883:141::-;35939:5;35970:6;35964:13;35955:22;;35986:32;36012:5;35986:32;:::i;:::-;35883:141;;;;:::o;36030:349::-;36099:6;36148:2;36136:9;36127:7;36123:23;36119:32;36116:119;;;36154:79;;:::i;:::-;36116:119;36274:1;36299:63;36354:7;36345:6;36334:9;36330:22;36299:63;:::i;:::-;36289:73;;36245:127;36030:349;;;;:::o;36385:233::-;36424:3;36447:24;36465:5;36447:24;:::i;:::-;36438:33;;36493:66;36486:5;36483:77;36480:103;;36563:18;;:::i;:::-;36480:103;36610:1;36603:5;36599:13;36592:20;;36385:233;;;:::o;36624:191::-;36664:4;36684:20;36702:1;36684:20;:::i;:::-;36679:25;;36718:20;36736:1;36718:20;:::i;:::-;36713:25;;36757:1;36754;36751:8;36748:34;;;36762:18;;:::i;:::-;36748:34;36807:1;36804;36800:9;36792:17;;36624:191;;;;:::o;36821:176::-;36853:1;36870:20;36888:1;36870:20;:::i;:::-;36865:25;;36904:20;36922:1;36904:20;:::i;:::-;36899:25;;36943:1;36933:35;;36948:18;;:::i;:::-;36933:35;36989:1;36986;36982:9;36977:14;;36821:176;;;;:::o;37003:180::-;37051:77;37048:1;37041:88;37148:4;37145:1;37138:15;37172:4;37169:1;37162:15

Swarm Source

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