ETH Price: $2,443.59 (+0.98%)

GiftedTigers (GT)
 

Overview

TokenID

347

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
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:
GiftedTigers

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// 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/Address.sol


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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


// ERC721A Contracts v4.2.3
// 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();

    /**
     * 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 payable;

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

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

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

    /**
     * @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.3
// 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 {
    // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
    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 payable 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 {
        _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].value`.
        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 payable 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 payable 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 payable 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.
            // The duplicated `log4` removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            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`.
                )

                // The `iszero(eq(,))` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the `iszero` away for performance.
                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 str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

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

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

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

// File: contracts/GiftedTigers.sol


pragma solidity ^0.8.17;






contract GiftedTigers is ERC721A, ReentrancyGuard, Ownable {
  
  uint256 public mintPrice = 0.0225 ether;
  uint256 public presalePrice = 0.0175 ether;

  uint256 private reserveAtATime = 100;
  uint256 private reservedCount = 0;
  
  uint256 private maxReserveCount = 100;

  bytes32 public merkleRoot;
  string _baseTokenURI;

  bool public isActive = false;
  bool public isPresaleActive = false;

  uint256 public MAX_SUPPLY = 5555;
  uint256 public maximumAllowedTokensPerPurchase = 20;
  uint256 public maximumAllowedTokensPerWallet = 40;

  constructor(string memory baseURI) ERC721A("GiftedTigers", "GT") {
    setBaseURI(baseURI);
  }

  modifier saleIsOpen(uint256 _mintAmount) {
    uint256 currentSupply = totalSupply();

    require(currentSupply <= MAX_SUPPLY, "Sale has ended.");
    require(currentSupply + _mintAmount <= MAX_SUPPLY, "All CNR minted.");
    _;
  }

  modifier isValidMerkleProof(bytes32[] calldata merkleProof) {
        require(
            MerkleProof.verify(
                merkleProof,
                merkleRoot,
                keccak256(abi.encodePacked(msg.sender))
            ),
            "Address does not exist in list"
        );
      _;
  }

  modifier mintCompliance(uint256 _mintAmount) {
    require(tx.origin == msg.sender, "Calling from other contract is not allowed.");
    require(
      _mintAmount > 0 && numberMinted(msg.sender) + _mintAmount <= maximumAllowedTokensPerWallet,
       "Invalid mint amount or minted max amount already."
    );
    _;
  }

  function numberMinted(address owner) public view returns (uint256) {
    return _numberMinted(owner);
  }

  function setMerkleRootHash(bytes32 _rootHash) public onlyOwner {
    merkleRoot = _rootHash;
  }

  function setMaxReserve(uint256 val) public onlyOwner {
    maxReserveCount = val;
  }

  function setReserveAtATime(uint256 val) public onlyOwner {
    reserveAtATime = val;
  }

  function getReserveAtATime() external view returns (uint256) {
    return reserveAtATime;
  }


  function setMaximumAllowedTokens(uint256 _count) public onlyOwner {
    maximumAllowedTokensPerPurchase = _count;
  }

  function setMaximumAllowedTokensPerWallet(uint256 _count) public onlyOwner {
    maximumAllowedTokensPerWallet = _count;
  }

  function setMaxMintSupply(uint256 maxMintSupply) external  onlyOwner {
    MAX_SUPPLY = maxMintSupply;
  }

  function setPrice(uint256 _price) public onlyOwner {
    mintPrice = _price;
  }

  function setPresalePrice(uint256 _preslaePrice) public onlyOwner {
    presalePrice = _preslaePrice;
  }

  function toggleSaleStatus() public onlyOwner {
    isActive = !isActive;
  }

  function togglePresaleStatus() public onlyOwner {
    isPresaleActive = !isPresaleActive;
  }


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


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

  function airdrop(uint256 _count, address _address) external onlyOwner {
    uint256 supply = totalSupply();

    require(supply + _count <= MAX_SUPPLY, "Total supply exceeded.");
    require(supply <= MAX_SUPPLY, "Total supply spent.");

    _safeMint(_address, _count);
  }

  function batchAirdrop(uint256 _count, address[] calldata addresses) external onlyOwner {
    uint256 supply = totalSupply();

    require(supply + _count <= MAX_SUPPLY, "Total supply exceeded.");
    require(supply <= MAX_SUPPLY, "Total supply spent.");

    for (uint256 i = 0; i < addresses.length; i++) {
      require(addresses[i] != address(0), "Can't add a null address");
      _safeMint(addresses[i], _count);
    }
  }

  function mint(uint256 _count) public payable mintCompliance(_count) saleIsOpen(_count) nonReentrant {
     if (msg.sender != owner()) {
      require(isActive, "Sale is not active currently.");
    }

    require( _count <= maximumAllowedTokensPerPurchase, "Exceeds maximum allowed tokens");
    require(msg.value >= (mintPrice * _count), "Insufficient ETH amount sent.");

    _safeMint(msg.sender, _count);
    
  }

  function preSaleMint(bytes32[] calldata _merkleProof, uint256 _count) public payable isValidMerkleProof(_merkleProof) mintCompliance(_count) saleIsOpen(_count) nonReentrant{
    require(isPresaleActive, "Presale is not active");
    require(msg.value >= (presalePrice * _count), "Insufficient ETH amount sent.");

    _safeMint(msg.sender, _count);

  }

  function burnToken(uint256 tokenId) external onlyOwner {
      _burn(tokenId);
  }

  function batchBurn(uint256[] memory tokenIds) external onlyOwner {
        uint256 len = tokenIds.length;
        for (uint256 i; i < len; i++) {
            uint256 tokenid = tokenIds[i];
            _burn(tokenid);
        }
  }

  function withdraw() external onlyOwner nonReentrant{
    uint balance = address(this).balance;
     Address.sendValue(payable(owner()), balance);  
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","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":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","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":"_count","type":"uint256"},{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"batchAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserveAtATime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maximumAllowedTokensPerPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maximumAllowedTokensPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"preSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxMintSupply","type":"uint256"}],"name":"setMaxMintSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setMaxReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setMaximumAllowedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setMaximumAllowedTokensPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_rootHash","type":"bytes32"}],"name":"setMerkleRootHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_preslaePrice","type":"uint256"}],"name":"setPresalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setReserveAtATime","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":[],"name":"togglePresaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052664fefa17b724000600a55663e2c284391c000600b556064600c556000600d556064600e556000601160006101000a81548160ff0219169083151502179055506000601160016101000a81548160ff0219169083151502179055506115b3601255601460135560286014553480156200007c57600080fd5b5060405162004cc238038062004cc28339818101604052810190620000a29190620004d0565b6040518060400160405280600c81526020017f47696674656454696765727300000000000000000000000000000000000000008152506040518060400160405280600281526020017f475400000000000000000000000000000000000000000000000000000000000081525081600290816200011f91906200076c565b5080600390816200013191906200076c565b50620001426200018a60201b60201c565b6000819055505050600160088190555062000172620001666200018f60201b60201c565b6200019760201b60201c565b62000183816200025d60201b60201c565b50620008d6565b600090565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200026d6200028260201b60201c565b80601090816200027e91906200076c565b5050565b620002926200018f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002b86200031360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000311576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200030890620008b4565b60405180910390fd5b565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620003a6826200035b565b810181811067ffffffffffffffff82111715620003c857620003c76200036c565b5b80604052505050565b6000620003dd6200033d565b9050620003eb82826200039b565b919050565b600067ffffffffffffffff8211156200040e576200040d6200036c565b5b62000419826200035b565b9050602081019050919050565b60005b838110156200044657808201518184015260208101905062000429565b60008484015250505050565b6000620004696200046384620003f0565b620003d1565b90508281526020810184848401111562000488576200048762000356565b5b6200049584828562000426565b509392505050565b600082601f830112620004b557620004b462000351565b5b8151620004c784826020860162000452565b91505092915050565b600060208284031215620004e957620004e862000347565b5b600082015167ffffffffffffffff8111156200050a57620005096200034c565b5b62000518848285016200049d565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200057457607f821691505b6020821081036200058a57620005896200052c565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005f47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620005b5565b620006008683620005b5565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200064d62000647620006418462000618565b62000622565b62000618565b9050919050565b6000819050919050565b62000669836200062c565b62000681620006788262000654565b848454620005c2565b825550505050565b600090565b6200069862000689565b620006a58184846200065e565b505050565b5b81811015620006cd57620006c16000826200068e565b600181019050620006ab565b5050565b601f8211156200071c57620006e68162000590565b620006f184620005a5565b8101602085101562000701578190505b620007196200071085620005a5565b830182620006aa565b50505b505050565b600082821c905092915050565b6000620007416000198460080262000721565b1980831691505092915050565b60006200075c83836200072e565b9150826002028217905092915050565b620007778262000521565b67ffffffffffffffff8111156200079357620007926200036c565b5b6200079f82546200055b565b620007ac828285620006d1565b600060209050601f831160018114620007e45760008415620007cf578287015190505b620007db85826200074e565b8655506200084b565b601f198416620007f48662000590565b60005b828110156200081e57848901518255600182019150602085019450602081019050620007f7565b868310156200083e57848901516200083a601f8916826200072e565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200089c60208362000853565b9150620008a98262000864565b602082019050919050565b60006020820190508181036000830152620008cf816200088d565b9050919050565b6143dc80620008e66000396000f3fe6080604052600436106102715760003560e01c80637389fbb71161014f578063b88d4fde116100c1578063e7b62d961161007a578063e7b62d96146108af578063e985e9c5146108da578063ea6eb83614610917578063f2fde38b14610940578063f6c9d9e314610969578063fb7e6ccb1461099257610271565b8063b88d4fde1461079c578063bc63f02e146107b8578063c87b56dd146107e1578063cadf88181461081e578063dc33e68114610849578063dc8e92ea1461088657610271565b806391b7f5ed1161011357806391b7f5ed146106af57806395d89b41146106d85780639a3bf728146107035780639ba411b11461072e578063a0712d6814610757578063a22cb4651461077357610271565b80637389fbb7146105ff57806378179976146106285780637b47ec1a146106445780637bffb4ce1461066d5780638da5cb5b1461068457610271565b80633549345e116101e857806356a87caa116101ac57806356a87caa146104ef57806360d938dc146105185780636352211e146105435780636817c76c1461058057806370a08231146105ab578063715018a6146105e857610271565b80633549345e146104415780633ccfd60b1461046a57806342842e0e146104815780634dfea6271461049d57806355f804b3146104c657610271565b8063095ea7b31161023a578063095ea7b31461035d57806318160ddd1461037957806322f3e2d4146103a457806323b872dd146103cf5780632eb4a7ab146103eb57806332cb6b0c1461041657610271565b80620e7fa81461027657806301ffc9a7146102a1578063049c5c49146102de57806306fdde03146102f5578063081812fc14610320575b600080fd5b34801561028257600080fd5b5061028b6109bb565b6040516102989190612c22565b60405180910390f35b3480156102ad57600080fd5b506102c860048036038101906102c39190612ca9565b6109c1565b6040516102d59190612cf1565b60405180910390f35b3480156102ea57600080fd5b506102f3610a53565b005b34801561030157600080fd5b5061030a610a87565b6040516103179190612d9c565b60405180910390f35b34801561032c57600080fd5b5061034760048036038101906103429190612dea565b610b19565b6040516103549190612e58565b60405180910390f35b61037760048036038101906103729190612e9f565b610b98565b005b34801561038557600080fd5b5061038e610cdc565b60405161039b9190612c22565b60405180910390f35b3480156103b057600080fd5b506103b9610cf3565b6040516103c69190612cf1565b60405180910390f35b6103e960048036038101906103e49190612edf565b610d06565b005b3480156103f757600080fd5b50610400611028565b60405161040d9190612f4b565b60405180910390f35b34801561042257600080fd5b5061042b61102e565b6040516104389190612c22565b60405180910390f35b34801561044d57600080fd5b5061046860048036038101906104639190612dea565b611034565b005b34801561047657600080fd5b5061047f611046565b005b61049b60048036038101906104969190612edf565b6110bc565b005b3480156104a957600080fd5b506104c460048036038101906104bf9190612dea565b6110dc565b005b3480156104d257600080fd5b506104ed60048036038101906104e8919061309b565b6110ee565b005b3480156104fb57600080fd5b5061051660048036038101906105119190612dea565b611109565b005b34801561052457600080fd5b5061052d61111b565b60405161053a9190612cf1565b60405180910390f35b34801561054f57600080fd5b5061056a60048036038101906105659190612dea565b61112e565b6040516105779190612e58565b60405180910390f35b34801561058c57600080fd5b50610595611140565b6040516105a29190612c22565b60405180910390f35b3480156105b757600080fd5b506105d260048036038101906105cd91906130e4565b611146565b6040516105df9190612c22565b60405180910390f35b3480156105f457600080fd5b506105fd6111fe565b005b34801561060b57600080fd5b5061062660048036038101906106219190612dea565b611212565b005b610642600480360381019061063d9190613171565b611224565b005b34801561065057600080fd5b5061066b60048036038101906106669190612dea565b611556565b005b34801561067957600080fd5b5061068261156a565b005b34801561069057600080fd5b5061069961159e565b6040516106a69190612e58565b60405180910390f35b3480156106bb57600080fd5b506106d660048036038101906106d19190612dea565b6115c8565b005b3480156106e457600080fd5b506106ed6115da565b6040516106fa9190612d9c565b60405180910390f35b34801561070f57600080fd5b5061071861166c565b6040516107259190612c22565b60405180910390f35b34801561073a57600080fd5b50610755600480360381019061075091906131fd565b611672565b005b610771600480360381019061076c9190612dea565b611684565b005b34801561077f57600080fd5b5061079a60048036038101906107959190613256565b61197d565b005b6107b660048036038101906107b19190613337565b611a88565b005b3480156107c457600080fd5b506107df60048036038101906107da91906133ba565b611afb565b005b3480156107ed57600080fd5b5061080860048036038101906108039190612dea565b611bb3565b6040516108159190612d9c565b60405180910390f35b34801561082a57600080fd5b50610833611c51565b6040516108409190612c22565b60405180910390f35b34801561085557600080fd5b50610870600480360381019061086b91906130e4565b611c57565b60405161087d9190612c22565b60405180910390f35b34801561089257600080fd5b506108ad60048036038101906108a891906134bd565b611c69565b005b3480156108bb57600080fd5b506108c4611cc3565b6040516108d19190612c22565b60405180910390f35b3480156108e657600080fd5b5061090160048036038101906108fc9190613506565b611ccd565b60405161090e9190612cf1565b60405180910390f35b34801561092357600080fd5b5061093e60048036038101906109399190612dea565b611d61565b005b34801561094c57600080fd5b50610967600480360381019061096291906130e4565b611d73565b005b34801561097557600080fd5b50610990600480360381019061098b9190612dea565b611df6565b005b34801561099e57600080fd5b506109b960048036038101906109b4919061359c565b611e08565b005b600b5481565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a1c57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a4c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610a5b611fa0565b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b606060028054610a969061362b565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac29061362b565b8015610b0f5780601f10610ae457610100808354040283529160200191610b0f565b820191906000526020600020905b815481529060010190602001808311610af257829003601f168201915b5050505050905090565b6000610b248261201e565b610b5a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ba38261112e565b90508073ffffffffffffffffffffffffffffffffffffffff16610bc461207d565b73ffffffffffffffffffffffffffffffffffffffff1614610c2757610bf081610beb61207d565b611ccd565b610c26576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610ce6612085565b6001546000540303905090565b601160009054906101000a900460ff1681565b6000610d118261208a565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d78576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d8484612156565b91509150610d9a8187610d9561207d565b61217d565b610de657610daf86610daa61207d565b611ccd565b610de5576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610e4c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e5986868660016121c1565b8015610e6457600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610f3285610f0e8888876121c7565b7c0200000000000000000000000000000000000000000000000000000000176121ef565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610fb85760006001850190506000600460008381526020019081526020016000205403610fb6576000548114610fb5578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611020868686600161221a565b505050505050565b600f5481565b60125481565b61103c611fa0565b80600b8190555050565b61104e611fa0565b600260085403611093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108a906136a8565b60405180910390fd5b600260088190555060004790506110b16110ab61159e565b82612220565b506001600881905550565b6110d783838360405180602001604052806000815250611a88565b505050565b6110e4611fa0565b8060138190555050565b6110f6611fa0565b80601090816111059190613874565b5050565b611111611fa0565b80600e8190555050565b601160019054906101000a900460ff1681565b60006111398261208a565b9050919050565b600a5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111ad576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611206611fa0565b6112106000612314565b565b61121a611fa0565b8060128190555050565b828261129a828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600f543360405160200161127f919061398e565b604051602081830303815290604052805190602001206123da565b6112d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d0906139f5565b60405180910390fd5b823373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133f90613a87565b60405180910390fd5b60008111801561136d57506014548161136033611c57565b61136a9190613ad6565b11155b6113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390613b7c565b60405180910390fd5b8360006113b7610cdc565b90506012548111156113fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f590613be8565b60405180910390fd5b601254828261140d9190613ad6565b111561144e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144590613c54565b60405180910390fd5b600260085403611493576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148a906136a8565b60405180910390fd5b6002600881905550601160019054906101000a900460ff166114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e190613cc0565b60405180910390fd5b85600b546114f89190613ce0565b34101561153a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153190613d6e565b60405180910390fd5b61154433876123f1565b60016008819055505050505050505050565b61155e611fa0565b6115678161240f565b50565b611572611fa0565b601160019054906101000a900460ff1615601160016101000a81548160ff021916908315150217905550565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6115d0611fa0565b80600a8190555050565b6060600380546115e99061362b565b80601f01602080910402602001604051908101604052809291908181526020018280546116159061362b565b80156116625780601f1061163757610100808354040283529160200191611662565b820191906000526020600020905b81548152906001019060200180831161164557829003601f168201915b5050505050905090565b60135481565b61167a611fa0565b80600f8190555050565b803373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146116f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ea90613a87565b60405180910390fd5b60008111801561171857506014548161170b33611c57565b6117159190613ad6565b11155b611757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174e90613b7c565b60405180910390fd5b816000611762610cdc565b90506012548111156117a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a090613be8565b60405180910390fd5b60125482826117b89190613ad6565b11156117f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f090613c54565b60405180910390fd5b60026008540361183e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611835906136a8565b60405180910390fd5b600260088190555061184e61159e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118d057601160009054906101000a900460ff166118cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c690613dda565b60405180910390fd5b5b601354841115611915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190c90613e46565b60405180910390fd5b83600a546119239190613ce0565b341015611965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195c90613d6e565b60405180910390fd5b61196f33856123f1565b600160088190555050505050565b806007600061198a61207d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a3761207d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a7c9190612cf1565b60405180910390a35050565b611a93848484610d06565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611af557611abe8484848461241d565b611af4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611b03611fa0565b6000611b0d610cdc565b90506012548382611b1e9190613ad6565b1115611b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5690613eb2565b60405180910390fd5b601254811115611ba4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9b90613f1e565b60405180910390fd5b611bae82846123f1565b505050565b6060611bbe8261201e565b611bf4576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611bfe61256d565b90506000815103611c1e5760405180602001604052806000815250611c49565b80611c28846125ff565b604051602001611c39929190613f7a565b6040516020818303038152906040525b915050919050565b60145481565b6000611c628261264f565b9050919050565b611c71611fa0565b60008151905060005b81811015611cbe576000838281518110611c9757611c96613f9e565b5b60200260200101519050611caa8161240f565b508080611cb690613fcd565b915050611c7a565b505050565b6000600c54905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d69611fa0565b8060148190555050565b611d7b611fa0565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de190614087565b60405180910390fd5b611df381612314565b50565b611dfe611fa0565b80600c8190555050565b611e10611fa0565b6000611e1a610cdc565b90506012548482611e2b9190613ad6565b1115611e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6390613eb2565b60405180910390fd5b601254811115611eb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea890613f1e565b60405180910390fd5b60005b83839050811015611f9957600073ffffffffffffffffffffffffffffffffffffffff16848483818110611eea57611ee9613f9e565b5b9050602002016020810190611eff91906130e4565b73ffffffffffffffffffffffffffffffffffffffff1603611f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4c906140f3565b60405180910390fd5b611f86848483818110611f6b57611f6a613f9e565b5b9050602002016020810190611f8091906130e4565b866123f1565b8080611f9190613fcd565b915050611eb4565b5050505050565b611fa86126a6565b73ffffffffffffffffffffffffffffffffffffffff16611fc661159e565b73ffffffffffffffffffffffffffffffffffffffff161461201c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120139061415f565b60405180910390fd5b565b600081612029612085565b11158015612038575060005482105b8015612076575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080612099612085565b1161211f5760005481101561211e5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361211c575b600081036121125760046000836001900393508381526020019081526020016000205490506120e8565b8092505050612151565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86121de8686846126ae565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b80471015612263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225a906141cb565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516122899061421c565b60006040518083038185875af1925050503d80600081146122c6576040519150601f19603f3d011682016040523d82523d6000602084013e6122cb565b606091505b505090508061230f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612306906142a3565b60405180910390fd5b505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000826123e785846126b7565b1490509392505050565b61240b82826040518060200160405280600081525061270d565b5050565b61241a8160006127aa565b50565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261244361207d565b8786866040518563ffffffff1660e01b81526004016124659493929190614318565b6020604051808303816000875af19250505080156124a157506040513d601f19601f8201168201806040525081019061249e9190614379565b60015b61251a573d80600081146124d1576040519150601f19603f3d011682016040523d82523d6000602084013e6124d6565b606091505b506000815103612512576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606010805461257c9061362b565b80601f01602080910402602001604051908101604052809291908181526020018280546125a89061362b565b80156125f55780601f106125ca576101008083540402835291602001916125f5565b820191906000526020600020905b8154815290600101906020018083116125d857829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b60011561263a57600184039350600a81066030018453600a8104905080612618575b50828103602084039350808452505050919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b600033905090565b60009392505050565b60008082905060005b8451811015612702576126ed828683815181106126e0576126df613f9e565b5b60200260200101516129fc565b915080806126fa90613fcd565b9150506126c0565b508091505092915050565b6127178383612a27565b60008373ffffffffffffffffffffffffffffffffffffffff163b146127a557600080549050600083820390505b612757600086838060010194508661241d565b61278d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106127445781600054146127a257600080fd5b50505b505050565b60006127b58361208a565b905060008190506000806127c886612156565b915091508415612831576127e481846127df61207d565b61217d565b612830576127f9836127f461207d565b611ccd565b61282f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b61283f8360008860016121c1565b801561284a57600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506128f2836128af856000886121c7565b7c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000017176121ef565b600460008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036129785760006001870190506000600460008381526020019081526020016000205403612976576000548114612975578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129e283600088600161221a565b600160008154809291906001019190505550505050505050565b6000818310612a1457612a0f8284612be2565b612a1f565b612a1e8383612be2565b5b905092915050565b60008054905060008203612a67576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a7460008483856121c1565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612aeb83612adc60008660006121c7565b612ae585612bf9565b176121ef565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612b8c57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612b51565b5060008203612bc7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050612bdd600084838561221a565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b6000819050919050565b612c1c81612c09565b82525050565b6000602082019050612c376000830184612c13565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c8681612c51565b8114612c9157600080fd5b50565b600081359050612ca381612c7d565b92915050565b600060208284031215612cbf57612cbe612c47565b5b6000612ccd84828501612c94565b91505092915050565b60008115159050919050565b612ceb81612cd6565b82525050565b6000602082019050612d066000830184612ce2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d46578082015181840152602081019050612d2b565b60008484015250505050565b6000601f19601f8301169050919050565b6000612d6e82612d0c565b612d788185612d17565b9350612d88818560208601612d28565b612d9181612d52565b840191505092915050565b60006020820190508181036000830152612db68184612d63565b905092915050565b612dc781612c09565b8114612dd257600080fd5b50565b600081359050612de481612dbe565b92915050565b600060208284031215612e0057612dff612c47565b5b6000612e0e84828501612dd5565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e4282612e17565b9050919050565b612e5281612e37565b82525050565b6000602082019050612e6d6000830184612e49565b92915050565b612e7c81612e37565b8114612e8757600080fd5b50565b600081359050612e9981612e73565b92915050565b60008060408385031215612eb657612eb5612c47565b5b6000612ec485828601612e8a565b9250506020612ed585828601612dd5565b9150509250929050565b600080600060608486031215612ef857612ef7612c47565b5b6000612f0686828701612e8a565b9350506020612f1786828701612e8a565b9250506040612f2886828701612dd5565b9150509250925092565b6000819050919050565b612f4581612f32565b82525050565b6000602082019050612f606000830184612f3c565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612fa882612d52565b810181811067ffffffffffffffff82111715612fc757612fc6612f70565b5b80604052505050565b6000612fda612c3d565b9050612fe68282612f9f565b919050565b600067ffffffffffffffff82111561300657613005612f70565b5b61300f82612d52565b9050602081019050919050565b82818337600083830152505050565b600061303e61303984612feb565b612fd0565b90508281526020810184848401111561305a57613059612f6b565b5b61306584828561301c565b509392505050565b600082601f83011261308257613081612f66565b5b813561309284826020860161302b565b91505092915050565b6000602082840312156130b1576130b0612c47565b5b600082013567ffffffffffffffff8111156130cf576130ce612c4c565b5b6130db8482850161306d565b91505092915050565b6000602082840312156130fa576130f9612c47565b5b600061310884828501612e8a565b91505092915050565b600080fd5b600080fd5b60008083601f84011261313157613130612f66565b5b8235905067ffffffffffffffff81111561314e5761314d613111565b5b60208301915083602082028301111561316a57613169613116565b5b9250929050565b60008060006040848603121561318a57613189612c47565b5b600084013567ffffffffffffffff8111156131a8576131a7612c4c565b5b6131b48682870161311b565b935093505060206131c786828701612dd5565b9150509250925092565b6131da81612f32565b81146131e557600080fd5b50565b6000813590506131f7816131d1565b92915050565b60006020828403121561321357613212612c47565b5b6000613221848285016131e8565b91505092915050565b61323381612cd6565b811461323e57600080fd5b50565b6000813590506132508161322a565b92915050565b6000806040838503121561326d5761326c612c47565b5b600061327b85828601612e8a565b925050602061328c85828601613241565b9150509250929050565b600067ffffffffffffffff8211156132b1576132b0612f70565b5b6132ba82612d52565b9050602081019050919050565b60006132da6132d584613296565b612fd0565b9050828152602081018484840111156132f6576132f5612f6b565b5b61330184828561301c565b509392505050565b600082601f83011261331e5761331d612f66565b5b813561332e8482602086016132c7565b91505092915050565b6000806000806080858703121561335157613350612c47565b5b600061335f87828801612e8a565b945050602061337087828801612e8a565b935050604061338187828801612dd5565b925050606085013567ffffffffffffffff8111156133a2576133a1612c4c565b5b6133ae87828801613309565b91505092959194509250565b600080604083850312156133d1576133d0612c47565b5b60006133df85828601612dd5565b92505060206133f085828601612e8a565b9150509250929050565b600067ffffffffffffffff82111561341557613414612f70565b5b602082029050602081019050919050565b6000613439613434846133fa565b612fd0565b9050808382526020820190506020840283018581111561345c5761345b613116565b5b835b8181101561348557806134718882612dd5565b84526020840193505060208101905061345e565b5050509392505050565b600082601f8301126134a4576134a3612f66565b5b81356134b4848260208601613426565b91505092915050565b6000602082840312156134d3576134d2612c47565b5b600082013567ffffffffffffffff8111156134f1576134f0612c4c565b5b6134fd8482850161348f565b91505092915050565b6000806040838503121561351d5761351c612c47565b5b600061352b85828601612e8a565b925050602061353c85828601612e8a565b9150509250929050565b60008083601f84011261355c5761355b612f66565b5b8235905067ffffffffffffffff81111561357957613578613111565b5b60208301915083602082028301111561359557613594613116565b5b9250929050565b6000806000604084860312156135b5576135b4612c47565b5b60006135c386828701612dd5565b935050602084013567ffffffffffffffff8111156135e4576135e3612c4c565b5b6135f086828701613546565b92509250509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061364357607f821691505b602082108103613656576136556135fc565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613692601f83612d17565b915061369d8261365c565b602082019050919050565b600060208201905081810360008301526136c181613685565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261372a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826136ed565b61373486836136ed565b95508019841693508086168417925050509392505050565b6000819050919050565b600061377161376c61376784612c09565b61374c565b612c09565b9050919050565b6000819050919050565b61378b83613756565b61379f61379782613778565b8484546136fa565b825550505050565b600090565b6137b46137a7565b6137bf818484613782565b505050565b5b818110156137e3576137d86000826137ac565b6001810190506137c5565b5050565b601f821115613828576137f9816136c8565b613802846136dd565b81016020851015613811578190505b61382561381d856136dd565b8301826137c4565b50505b505050565b600082821c905092915050565b600061384b6000198460080261382d565b1980831691505092915050565b6000613864838361383a565b9150826002028217905092915050565b61387d82612d0c565b67ffffffffffffffff81111561389657613895612f70565b5b6138a0825461362b565b6138ab8282856137e7565b600060209050601f8311600181146138de57600084156138cc578287015190505b6138d68582613858565b86555061393e565b601f1984166138ec866136c8565b60005b82811015613914578489015182556001820191506020850194506020810190506138ef565b86831015613931578489015161392d601f89168261383a565b8355505b6001600288020188555050505b505050505050565b60008160601b9050919050565b600061395e82613946565b9050919050565b600061397082613953565b9050919050565b61398861398382612e37565b613965565b82525050565b600061399a8284613977565b60148201915081905092915050565b7f4164647265737320646f6573206e6f7420657869737420696e206c6973740000600082015250565b60006139df601e83612d17565b91506139ea826139a9565b602082019050919050565b60006020820190508181036000830152613a0e816139d2565b9050919050565b7f43616c6c696e672066726f6d206f7468657220636f6e7472616374206973206e60008201527f6f7420616c6c6f7765642e000000000000000000000000000000000000000000602082015250565b6000613a71602b83612d17565b9150613a7c82613a15565b604082019050919050565b60006020820190508181036000830152613aa081613a64565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ae182612c09565b9150613aec83612c09565b9250828201905080821115613b0457613b03613aa7565b5b92915050565b7f496e76616c6964206d696e7420616d6f756e74206f72206d696e746564206d6160008201527f7820616d6f756e7420616c72656164792e000000000000000000000000000000602082015250565b6000613b66603183612d17565b9150613b7182613b0a565b604082019050919050565b60006020820190508181036000830152613b9581613b59565b9050919050565b7f53616c652068617320656e6465642e0000000000000000000000000000000000600082015250565b6000613bd2600f83612d17565b9150613bdd82613b9c565b602082019050919050565b60006020820190508181036000830152613c0181613bc5565b9050919050565b7f416c6c20434e52206d696e7465642e0000000000000000000000000000000000600082015250565b6000613c3e600f83612d17565b9150613c4982613c08565b602082019050919050565b60006020820190508181036000830152613c6d81613c31565b9050919050565b7f50726573616c65206973206e6f74206163746976650000000000000000000000600082015250565b6000613caa601583612d17565b9150613cb582613c74565b602082019050919050565b60006020820190508181036000830152613cd981613c9d565b9050919050565b6000613ceb82612c09565b9150613cf683612c09565b9250828202613d0481612c09565b91508282048414831517613d1b57613d1a613aa7565b5b5092915050565b7f496e73756666696369656e742045544820616d6f756e742073656e742e000000600082015250565b6000613d58601d83612d17565b9150613d6382613d22565b602082019050919050565b60006020820190508181036000830152613d8781613d4b565b9050919050565b7f53616c65206973206e6f74206163746976652063757272656e746c792e000000600082015250565b6000613dc4601d83612d17565b9150613dcf82613d8e565b602082019050919050565b60006020820190508181036000830152613df381613db7565b9050919050565b7f45786365656473206d6178696d756d20616c6c6f77656420746f6b656e730000600082015250565b6000613e30601e83612d17565b9150613e3b82613dfa565b602082019050919050565b60006020820190508181036000830152613e5f81613e23565b9050919050565b7f546f74616c20737570706c792065786365656465642e00000000000000000000600082015250565b6000613e9c601683612d17565b9150613ea782613e66565b602082019050919050565b60006020820190508181036000830152613ecb81613e8f565b9050919050565b7f546f74616c20737570706c79207370656e742e00000000000000000000000000600082015250565b6000613f08601383612d17565b9150613f1382613ed2565b602082019050919050565b60006020820190508181036000830152613f3781613efb565b9050919050565b600081905092915050565b6000613f5482612d0c565b613f5e8185613f3e565b9350613f6e818560208601612d28565b80840191505092915050565b6000613f868285613f49565b9150613f928284613f49565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613fd882612c09565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361400a57614009613aa7565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614071602683612d17565b915061407c82614015565b604082019050919050565b600060208201905081810360008301526140a081614064565b9050919050565b7f43616e2774206164642061206e756c6c20616464726573730000000000000000600082015250565b60006140dd601883612d17565b91506140e8826140a7565b602082019050919050565b6000602082019050818103600083015261410c816140d0565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614149602083612d17565b915061415482614113565b602082019050919050565b600060208201905081810360008301526141788161413c565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b60006141b5601d83612d17565b91506141c08261417f565b602082019050919050565b600060208201905081810360008301526141e4816141a8565b9050919050565b600081905092915050565b50565b60006142066000836141eb565b9150614211826141f6565b600082019050919050565b6000614227826141f9565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b600061428d603a83612d17565b915061429882614231565b604082019050919050565b600060208201905081810360008301526142bc81614280565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006142ea826142c3565b6142f481856142ce565b9350614304818560208601612d28565b61430d81612d52565b840191505092915050565b600060808201905061432d6000830187612e49565b61433a6020830186612e49565b6143476040830185612c13565b818103606083015261435981846142df565b905095945050505050565b60008151905061437381612c7d565b92915050565b60006020828403121561438f5761438e612c47565b5b600061439d84828501614364565b9150509291505056fea26469706673582212203c21b0f51f2a2d947e8b2dfc2bfb54ffdbaf331c7dd18183221701378c3cae1564736f6c6343000811003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102715760003560e01c80637389fbb71161014f578063b88d4fde116100c1578063e7b62d961161007a578063e7b62d96146108af578063e985e9c5146108da578063ea6eb83614610917578063f2fde38b14610940578063f6c9d9e314610969578063fb7e6ccb1461099257610271565b8063b88d4fde1461079c578063bc63f02e146107b8578063c87b56dd146107e1578063cadf88181461081e578063dc33e68114610849578063dc8e92ea1461088657610271565b806391b7f5ed1161011357806391b7f5ed146106af57806395d89b41146106d85780639a3bf728146107035780639ba411b11461072e578063a0712d6814610757578063a22cb4651461077357610271565b80637389fbb7146105ff57806378179976146106285780637b47ec1a146106445780637bffb4ce1461066d5780638da5cb5b1461068457610271565b80633549345e116101e857806356a87caa116101ac57806356a87caa146104ef57806360d938dc146105185780636352211e146105435780636817c76c1461058057806370a08231146105ab578063715018a6146105e857610271565b80633549345e146104415780633ccfd60b1461046a57806342842e0e146104815780634dfea6271461049d57806355f804b3146104c657610271565b8063095ea7b31161023a578063095ea7b31461035d57806318160ddd1461037957806322f3e2d4146103a457806323b872dd146103cf5780632eb4a7ab146103eb57806332cb6b0c1461041657610271565b80620e7fa81461027657806301ffc9a7146102a1578063049c5c49146102de57806306fdde03146102f5578063081812fc14610320575b600080fd5b34801561028257600080fd5b5061028b6109bb565b6040516102989190612c22565b60405180910390f35b3480156102ad57600080fd5b506102c860048036038101906102c39190612ca9565b6109c1565b6040516102d59190612cf1565b60405180910390f35b3480156102ea57600080fd5b506102f3610a53565b005b34801561030157600080fd5b5061030a610a87565b6040516103179190612d9c565b60405180910390f35b34801561032c57600080fd5b5061034760048036038101906103429190612dea565b610b19565b6040516103549190612e58565b60405180910390f35b61037760048036038101906103729190612e9f565b610b98565b005b34801561038557600080fd5b5061038e610cdc565b60405161039b9190612c22565b60405180910390f35b3480156103b057600080fd5b506103b9610cf3565b6040516103c69190612cf1565b60405180910390f35b6103e960048036038101906103e49190612edf565b610d06565b005b3480156103f757600080fd5b50610400611028565b60405161040d9190612f4b565b60405180910390f35b34801561042257600080fd5b5061042b61102e565b6040516104389190612c22565b60405180910390f35b34801561044d57600080fd5b5061046860048036038101906104639190612dea565b611034565b005b34801561047657600080fd5b5061047f611046565b005b61049b60048036038101906104969190612edf565b6110bc565b005b3480156104a957600080fd5b506104c460048036038101906104bf9190612dea565b6110dc565b005b3480156104d257600080fd5b506104ed60048036038101906104e8919061309b565b6110ee565b005b3480156104fb57600080fd5b5061051660048036038101906105119190612dea565b611109565b005b34801561052457600080fd5b5061052d61111b565b60405161053a9190612cf1565b60405180910390f35b34801561054f57600080fd5b5061056a60048036038101906105659190612dea565b61112e565b6040516105779190612e58565b60405180910390f35b34801561058c57600080fd5b50610595611140565b6040516105a29190612c22565b60405180910390f35b3480156105b757600080fd5b506105d260048036038101906105cd91906130e4565b611146565b6040516105df9190612c22565b60405180910390f35b3480156105f457600080fd5b506105fd6111fe565b005b34801561060b57600080fd5b5061062660048036038101906106219190612dea565b611212565b005b610642600480360381019061063d9190613171565b611224565b005b34801561065057600080fd5b5061066b60048036038101906106669190612dea565b611556565b005b34801561067957600080fd5b5061068261156a565b005b34801561069057600080fd5b5061069961159e565b6040516106a69190612e58565b60405180910390f35b3480156106bb57600080fd5b506106d660048036038101906106d19190612dea565b6115c8565b005b3480156106e457600080fd5b506106ed6115da565b6040516106fa9190612d9c565b60405180910390f35b34801561070f57600080fd5b5061071861166c565b6040516107259190612c22565b60405180910390f35b34801561073a57600080fd5b50610755600480360381019061075091906131fd565b611672565b005b610771600480360381019061076c9190612dea565b611684565b005b34801561077f57600080fd5b5061079a60048036038101906107959190613256565b61197d565b005b6107b660048036038101906107b19190613337565b611a88565b005b3480156107c457600080fd5b506107df60048036038101906107da91906133ba565b611afb565b005b3480156107ed57600080fd5b5061080860048036038101906108039190612dea565b611bb3565b6040516108159190612d9c565b60405180910390f35b34801561082a57600080fd5b50610833611c51565b6040516108409190612c22565b60405180910390f35b34801561085557600080fd5b50610870600480360381019061086b91906130e4565b611c57565b60405161087d9190612c22565b60405180910390f35b34801561089257600080fd5b506108ad60048036038101906108a891906134bd565b611c69565b005b3480156108bb57600080fd5b506108c4611cc3565b6040516108d19190612c22565b60405180910390f35b3480156108e657600080fd5b5061090160048036038101906108fc9190613506565b611ccd565b60405161090e9190612cf1565b60405180910390f35b34801561092357600080fd5b5061093e60048036038101906109399190612dea565b611d61565b005b34801561094c57600080fd5b50610967600480360381019061096291906130e4565b611d73565b005b34801561097557600080fd5b50610990600480360381019061098b9190612dea565b611df6565b005b34801561099e57600080fd5b506109b960048036038101906109b4919061359c565b611e08565b005b600b5481565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a1c57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a4c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610a5b611fa0565b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b606060028054610a969061362b565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac29061362b565b8015610b0f5780601f10610ae457610100808354040283529160200191610b0f565b820191906000526020600020905b815481529060010190602001808311610af257829003601f168201915b5050505050905090565b6000610b248261201e565b610b5a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ba38261112e565b90508073ffffffffffffffffffffffffffffffffffffffff16610bc461207d565b73ffffffffffffffffffffffffffffffffffffffff1614610c2757610bf081610beb61207d565b611ccd565b610c26576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610ce6612085565b6001546000540303905090565b601160009054906101000a900460ff1681565b6000610d118261208a565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d78576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d8484612156565b91509150610d9a8187610d9561207d565b61217d565b610de657610daf86610daa61207d565b611ccd565b610de5576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610e4c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e5986868660016121c1565b8015610e6457600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610f3285610f0e8888876121c7565b7c0200000000000000000000000000000000000000000000000000000000176121ef565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610fb85760006001850190506000600460008381526020019081526020016000205403610fb6576000548114610fb5578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611020868686600161221a565b505050505050565b600f5481565b60125481565b61103c611fa0565b80600b8190555050565b61104e611fa0565b600260085403611093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108a906136a8565b60405180910390fd5b600260088190555060004790506110b16110ab61159e565b82612220565b506001600881905550565b6110d783838360405180602001604052806000815250611a88565b505050565b6110e4611fa0565b8060138190555050565b6110f6611fa0565b80601090816111059190613874565b5050565b611111611fa0565b80600e8190555050565b601160019054906101000a900460ff1681565b60006111398261208a565b9050919050565b600a5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111ad576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611206611fa0565b6112106000612314565b565b61121a611fa0565b8060128190555050565b828261129a828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600f543360405160200161127f919061398e565b604051602081830303815290604052805190602001206123da565b6112d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d0906139f5565b60405180910390fd5b823373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133f90613a87565b60405180910390fd5b60008111801561136d57506014548161136033611c57565b61136a9190613ad6565b11155b6113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390613b7c565b60405180910390fd5b8360006113b7610cdc565b90506012548111156113fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f590613be8565b60405180910390fd5b601254828261140d9190613ad6565b111561144e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144590613c54565b60405180910390fd5b600260085403611493576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148a906136a8565b60405180910390fd5b6002600881905550601160019054906101000a900460ff166114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e190613cc0565b60405180910390fd5b85600b546114f89190613ce0565b34101561153a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153190613d6e565b60405180910390fd5b61154433876123f1565b60016008819055505050505050505050565b61155e611fa0565b6115678161240f565b50565b611572611fa0565b601160019054906101000a900460ff1615601160016101000a81548160ff021916908315150217905550565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6115d0611fa0565b80600a8190555050565b6060600380546115e99061362b565b80601f01602080910402602001604051908101604052809291908181526020018280546116159061362b565b80156116625780601f1061163757610100808354040283529160200191611662565b820191906000526020600020905b81548152906001019060200180831161164557829003601f168201915b5050505050905090565b60135481565b61167a611fa0565b80600f8190555050565b803373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146116f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ea90613a87565b60405180910390fd5b60008111801561171857506014548161170b33611c57565b6117159190613ad6565b11155b611757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174e90613b7c565b60405180910390fd5b816000611762610cdc565b90506012548111156117a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a090613be8565b60405180910390fd5b60125482826117b89190613ad6565b11156117f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f090613c54565b60405180910390fd5b60026008540361183e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611835906136a8565b60405180910390fd5b600260088190555061184e61159e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118d057601160009054906101000a900460ff166118cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c690613dda565b60405180910390fd5b5b601354841115611915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190c90613e46565b60405180910390fd5b83600a546119239190613ce0565b341015611965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195c90613d6e565b60405180910390fd5b61196f33856123f1565b600160088190555050505050565b806007600061198a61207d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a3761207d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a7c9190612cf1565b60405180910390a35050565b611a93848484610d06565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611af557611abe8484848461241d565b611af4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611b03611fa0565b6000611b0d610cdc565b90506012548382611b1e9190613ad6565b1115611b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5690613eb2565b60405180910390fd5b601254811115611ba4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9b90613f1e565b60405180910390fd5b611bae82846123f1565b505050565b6060611bbe8261201e565b611bf4576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611bfe61256d565b90506000815103611c1e5760405180602001604052806000815250611c49565b80611c28846125ff565b604051602001611c39929190613f7a565b6040516020818303038152906040525b915050919050565b60145481565b6000611c628261264f565b9050919050565b611c71611fa0565b60008151905060005b81811015611cbe576000838281518110611c9757611c96613f9e565b5b60200260200101519050611caa8161240f565b508080611cb690613fcd565b915050611c7a565b505050565b6000600c54905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d69611fa0565b8060148190555050565b611d7b611fa0565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de190614087565b60405180910390fd5b611df381612314565b50565b611dfe611fa0565b80600c8190555050565b611e10611fa0565b6000611e1a610cdc565b90506012548482611e2b9190613ad6565b1115611e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6390613eb2565b60405180910390fd5b601254811115611eb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea890613f1e565b60405180910390fd5b60005b83839050811015611f9957600073ffffffffffffffffffffffffffffffffffffffff16848483818110611eea57611ee9613f9e565b5b9050602002016020810190611eff91906130e4565b73ffffffffffffffffffffffffffffffffffffffff1603611f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4c906140f3565b60405180910390fd5b611f86848483818110611f6b57611f6a613f9e565b5b9050602002016020810190611f8091906130e4565b866123f1565b8080611f9190613fcd565b915050611eb4565b5050505050565b611fa86126a6565b73ffffffffffffffffffffffffffffffffffffffff16611fc661159e565b73ffffffffffffffffffffffffffffffffffffffff161461201c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120139061415f565b60405180910390fd5b565b600081612029612085565b11158015612038575060005482105b8015612076575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080612099612085565b1161211f5760005481101561211e5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361211c575b600081036121125760046000836001900393508381526020019081526020016000205490506120e8565b8092505050612151565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86121de8686846126ae565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b80471015612263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225a906141cb565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516122899061421c565b60006040518083038185875af1925050503d80600081146122c6576040519150601f19603f3d011682016040523d82523d6000602084013e6122cb565b606091505b505090508061230f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612306906142a3565b60405180910390fd5b505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000826123e785846126b7565b1490509392505050565b61240b82826040518060200160405280600081525061270d565b5050565b61241a8160006127aa565b50565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261244361207d565b8786866040518563ffffffff1660e01b81526004016124659493929190614318565b6020604051808303816000875af19250505080156124a157506040513d601f19601f8201168201806040525081019061249e9190614379565b60015b61251a573d80600081146124d1576040519150601f19603f3d011682016040523d82523d6000602084013e6124d6565b606091505b506000815103612512576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606010805461257c9061362b565b80601f01602080910402602001604051908101604052809291908181526020018280546125a89061362b565b80156125f55780601f106125ca576101008083540402835291602001916125f5565b820191906000526020600020905b8154815290600101906020018083116125d857829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b60011561263a57600184039350600a81066030018453600a8104905080612618575b50828103602084039350808452505050919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b600033905090565b60009392505050565b60008082905060005b8451811015612702576126ed828683815181106126e0576126df613f9e565b5b60200260200101516129fc565b915080806126fa90613fcd565b9150506126c0565b508091505092915050565b6127178383612a27565b60008373ffffffffffffffffffffffffffffffffffffffff163b146127a557600080549050600083820390505b612757600086838060010194508661241d565b61278d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106127445781600054146127a257600080fd5b50505b505050565b60006127b58361208a565b905060008190506000806127c886612156565b915091508415612831576127e481846127df61207d565b61217d565b612830576127f9836127f461207d565b611ccd565b61282f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b61283f8360008860016121c1565b801561284a57600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506128f2836128af856000886121c7565b7c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000017176121ef565b600460008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036129785760006001870190506000600460008381526020019081526020016000205403612976576000548114612975578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129e283600088600161221a565b600160008154809291906001019190505550505050505050565b6000818310612a1457612a0f8284612be2565b612a1f565b612a1e8383612be2565b5b905092915050565b60008054905060008203612a67576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a7460008483856121c1565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612aeb83612adc60008660006121c7565b612ae585612bf9565b176121ef565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612b8c57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612b51565b5060008203612bc7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050612bdd600084838561221a565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b6000819050919050565b612c1c81612c09565b82525050565b6000602082019050612c376000830184612c13565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c8681612c51565b8114612c9157600080fd5b50565b600081359050612ca381612c7d565b92915050565b600060208284031215612cbf57612cbe612c47565b5b6000612ccd84828501612c94565b91505092915050565b60008115159050919050565b612ceb81612cd6565b82525050565b6000602082019050612d066000830184612ce2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d46578082015181840152602081019050612d2b565b60008484015250505050565b6000601f19601f8301169050919050565b6000612d6e82612d0c565b612d788185612d17565b9350612d88818560208601612d28565b612d9181612d52565b840191505092915050565b60006020820190508181036000830152612db68184612d63565b905092915050565b612dc781612c09565b8114612dd257600080fd5b50565b600081359050612de481612dbe565b92915050565b600060208284031215612e0057612dff612c47565b5b6000612e0e84828501612dd5565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e4282612e17565b9050919050565b612e5281612e37565b82525050565b6000602082019050612e6d6000830184612e49565b92915050565b612e7c81612e37565b8114612e8757600080fd5b50565b600081359050612e9981612e73565b92915050565b60008060408385031215612eb657612eb5612c47565b5b6000612ec485828601612e8a565b9250506020612ed585828601612dd5565b9150509250929050565b600080600060608486031215612ef857612ef7612c47565b5b6000612f0686828701612e8a565b9350506020612f1786828701612e8a565b9250506040612f2886828701612dd5565b9150509250925092565b6000819050919050565b612f4581612f32565b82525050565b6000602082019050612f606000830184612f3c565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612fa882612d52565b810181811067ffffffffffffffff82111715612fc757612fc6612f70565b5b80604052505050565b6000612fda612c3d565b9050612fe68282612f9f565b919050565b600067ffffffffffffffff82111561300657613005612f70565b5b61300f82612d52565b9050602081019050919050565b82818337600083830152505050565b600061303e61303984612feb565b612fd0565b90508281526020810184848401111561305a57613059612f6b565b5b61306584828561301c565b509392505050565b600082601f83011261308257613081612f66565b5b813561309284826020860161302b565b91505092915050565b6000602082840312156130b1576130b0612c47565b5b600082013567ffffffffffffffff8111156130cf576130ce612c4c565b5b6130db8482850161306d565b91505092915050565b6000602082840312156130fa576130f9612c47565b5b600061310884828501612e8a565b91505092915050565b600080fd5b600080fd5b60008083601f84011261313157613130612f66565b5b8235905067ffffffffffffffff81111561314e5761314d613111565b5b60208301915083602082028301111561316a57613169613116565b5b9250929050565b60008060006040848603121561318a57613189612c47565b5b600084013567ffffffffffffffff8111156131a8576131a7612c4c565b5b6131b48682870161311b565b935093505060206131c786828701612dd5565b9150509250925092565b6131da81612f32565b81146131e557600080fd5b50565b6000813590506131f7816131d1565b92915050565b60006020828403121561321357613212612c47565b5b6000613221848285016131e8565b91505092915050565b61323381612cd6565b811461323e57600080fd5b50565b6000813590506132508161322a565b92915050565b6000806040838503121561326d5761326c612c47565b5b600061327b85828601612e8a565b925050602061328c85828601613241565b9150509250929050565b600067ffffffffffffffff8211156132b1576132b0612f70565b5b6132ba82612d52565b9050602081019050919050565b60006132da6132d584613296565b612fd0565b9050828152602081018484840111156132f6576132f5612f6b565b5b61330184828561301c565b509392505050565b600082601f83011261331e5761331d612f66565b5b813561332e8482602086016132c7565b91505092915050565b6000806000806080858703121561335157613350612c47565b5b600061335f87828801612e8a565b945050602061337087828801612e8a565b935050604061338187828801612dd5565b925050606085013567ffffffffffffffff8111156133a2576133a1612c4c565b5b6133ae87828801613309565b91505092959194509250565b600080604083850312156133d1576133d0612c47565b5b60006133df85828601612dd5565b92505060206133f085828601612e8a565b9150509250929050565b600067ffffffffffffffff82111561341557613414612f70565b5b602082029050602081019050919050565b6000613439613434846133fa565b612fd0565b9050808382526020820190506020840283018581111561345c5761345b613116565b5b835b8181101561348557806134718882612dd5565b84526020840193505060208101905061345e565b5050509392505050565b600082601f8301126134a4576134a3612f66565b5b81356134b4848260208601613426565b91505092915050565b6000602082840312156134d3576134d2612c47565b5b600082013567ffffffffffffffff8111156134f1576134f0612c4c565b5b6134fd8482850161348f565b91505092915050565b6000806040838503121561351d5761351c612c47565b5b600061352b85828601612e8a565b925050602061353c85828601612e8a565b9150509250929050565b60008083601f84011261355c5761355b612f66565b5b8235905067ffffffffffffffff81111561357957613578613111565b5b60208301915083602082028301111561359557613594613116565b5b9250929050565b6000806000604084860312156135b5576135b4612c47565b5b60006135c386828701612dd5565b935050602084013567ffffffffffffffff8111156135e4576135e3612c4c565b5b6135f086828701613546565b92509250509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061364357607f821691505b602082108103613656576136556135fc565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613692601f83612d17565b915061369d8261365c565b602082019050919050565b600060208201905081810360008301526136c181613685565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261372a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826136ed565b61373486836136ed565b95508019841693508086168417925050509392505050565b6000819050919050565b600061377161376c61376784612c09565b61374c565b612c09565b9050919050565b6000819050919050565b61378b83613756565b61379f61379782613778565b8484546136fa565b825550505050565b600090565b6137b46137a7565b6137bf818484613782565b505050565b5b818110156137e3576137d86000826137ac565b6001810190506137c5565b5050565b601f821115613828576137f9816136c8565b613802846136dd565b81016020851015613811578190505b61382561381d856136dd565b8301826137c4565b50505b505050565b600082821c905092915050565b600061384b6000198460080261382d565b1980831691505092915050565b6000613864838361383a565b9150826002028217905092915050565b61387d82612d0c565b67ffffffffffffffff81111561389657613895612f70565b5b6138a0825461362b565b6138ab8282856137e7565b600060209050601f8311600181146138de57600084156138cc578287015190505b6138d68582613858565b86555061393e565b601f1984166138ec866136c8565b60005b82811015613914578489015182556001820191506020850194506020810190506138ef565b86831015613931578489015161392d601f89168261383a565b8355505b6001600288020188555050505b505050505050565b60008160601b9050919050565b600061395e82613946565b9050919050565b600061397082613953565b9050919050565b61398861398382612e37565b613965565b82525050565b600061399a8284613977565b60148201915081905092915050565b7f4164647265737320646f6573206e6f7420657869737420696e206c6973740000600082015250565b60006139df601e83612d17565b91506139ea826139a9565b602082019050919050565b60006020820190508181036000830152613a0e816139d2565b9050919050565b7f43616c6c696e672066726f6d206f7468657220636f6e7472616374206973206e60008201527f6f7420616c6c6f7765642e000000000000000000000000000000000000000000602082015250565b6000613a71602b83612d17565b9150613a7c82613a15565b604082019050919050565b60006020820190508181036000830152613aa081613a64565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ae182612c09565b9150613aec83612c09565b9250828201905080821115613b0457613b03613aa7565b5b92915050565b7f496e76616c6964206d696e7420616d6f756e74206f72206d696e746564206d6160008201527f7820616d6f756e7420616c72656164792e000000000000000000000000000000602082015250565b6000613b66603183612d17565b9150613b7182613b0a565b604082019050919050565b60006020820190508181036000830152613b9581613b59565b9050919050565b7f53616c652068617320656e6465642e0000000000000000000000000000000000600082015250565b6000613bd2600f83612d17565b9150613bdd82613b9c565b602082019050919050565b60006020820190508181036000830152613c0181613bc5565b9050919050565b7f416c6c20434e52206d696e7465642e0000000000000000000000000000000000600082015250565b6000613c3e600f83612d17565b9150613c4982613c08565b602082019050919050565b60006020820190508181036000830152613c6d81613c31565b9050919050565b7f50726573616c65206973206e6f74206163746976650000000000000000000000600082015250565b6000613caa601583612d17565b9150613cb582613c74565b602082019050919050565b60006020820190508181036000830152613cd981613c9d565b9050919050565b6000613ceb82612c09565b9150613cf683612c09565b9250828202613d0481612c09565b91508282048414831517613d1b57613d1a613aa7565b5b5092915050565b7f496e73756666696369656e742045544820616d6f756e742073656e742e000000600082015250565b6000613d58601d83612d17565b9150613d6382613d22565b602082019050919050565b60006020820190508181036000830152613d8781613d4b565b9050919050565b7f53616c65206973206e6f74206163746976652063757272656e746c792e000000600082015250565b6000613dc4601d83612d17565b9150613dcf82613d8e565b602082019050919050565b60006020820190508181036000830152613df381613db7565b9050919050565b7f45786365656473206d6178696d756d20616c6c6f77656420746f6b656e730000600082015250565b6000613e30601e83612d17565b9150613e3b82613dfa565b602082019050919050565b60006020820190508181036000830152613e5f81613e23565b9050919050565b7f546f74616c20737570706c792065786365656465642e00000000000000000000600082015250565b6000613e9c601683612d17565b9150613ea782613e66565b602082019050919050565b60006020820190508181036000830152613ecb81613e8f565b9050919050565b7f546f74616c20737570706c79207370656e742e00000000000000000000000000600082015250565b6000613f08601383612d17565b9150613f1382613ed2565b602082019050919050565b60006020820190508181036000830152613f3781613efb565b9050919050565b600081905092915050565b6000613f5482612d0c565b613f5e8185613f3e565b9350613f6e818560208601612d28565b80840191505092915050565b6000613f868285613f49565b9150613f928284613f49565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613fd882612c09565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361400a57614009613aa7565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614071602683612d17565b915061407c82614015565b604082019050919050565b600060208201905081810360008301526140a081614064565b9050919050565b7f43616e2774206164642061206e756c6c20616464726573730000000000000000600082015250565b60006140dd601883612d17565b91506140e8826140a7565b602082019050919050565b6000602082019050818103600083015261410c816140d0565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614149602083612d17565b915061415482614113565b602082019050919050565b600060208201905081810360008301526141788161413c565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b60006141b5601d83612d17565b91506141c08261417f565b602082019050919050565b600060208201905081810360008301526141e4816141a8565b9050919050565b600081905092915050565b50565b60006142066000836141eb565b9150614211826141f6565b600082019050919050565b6000614227826141f9565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b600061428d603a83612d17565b915061429882614231565b604082019050919050565b600060208201905081810360008301526142bc81614280565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006142ea826142c3565b6142f481856142ce565b9350614304818560208601612d28565b61430d81612d52565b840191505092915050565b600060808201905061432d6000830187612e49565b61433a6020830186612e49565b6143476040830185612c13565b818103606083015261435981846142df565b905095945050505050565b60008151905061437381612c7d565b92915050565b60006020828403121561438f5761438e612c47565b5b600061439d84828501614364565b9150509291505056fea26469706673582212203c21b0f51f2a2d947e8b2dfc2bfb54ffdbaf331c7dd18183221701378c3cae1564736f6c63430008110033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string):

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

75144:5074:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75256:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42034:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77796:78;;;;;;;;;;;;;:::i;:::-;;42936:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49427:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48860:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38687:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75489:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53066:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75432:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75564:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77684:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80061:154;;;;;;;;;;;;;:::i;:::-;;55987:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77225:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77983:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76933:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75522:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44329:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75212:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39871:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14088:103;;;;;;;;;;;;;:::i;:::-;;77482:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79364:359;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79729:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77880:95;;;;;;;;;;;;;:::i;:::-;;13440:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77596:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43112:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75601:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76829:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78931:427;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49985:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56778:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78201:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43322:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75657:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76716:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79819:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77122:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50376:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77350:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14346:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77026:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78488:437;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75256:42;;;;:::o;42034:639::-;42119:4;42458:10;42443:25;;:11;:25;;;;:102;;;;42535:10;42520:25;;:11;:25;;;;42443:102;:179;;;;42612:10;42597:25;;:11;:25;;;;42443:179;42423:199;;42034:639;;;:::o;77796:78::-;13326:13;:11;:13::i;:::-;77860:8:::1;;;;;;;;;;;77859:9;77848:8;;:20;;;;;;;;;;;;;;;;;;77796:78::o:0;42936:100::-;42990:13;43023:5;43016:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42936:100;:::o;49427:218::-;49503:7;49528:16;49536:7;49528;:16::i;:::-;49523:64;;49553:34;;;;;;;;;;;;;;49523:64;49607:15;:24;49623:7;49607:24;;;;;;;;;;;:30;;;;;;;;;;;;49600:37;;49427:218;;;:::o;48860:408::-;48949:13;48965:16;48973:7;48965;:16::i;:::-;48949:32;;49021:5;48998:28;;:19;:17;:19::i;:::-;:28;;;48994:175;;49046:44;49063:5;49070:19;:17;:19::i;:::-;49046:16;:44::i;:::-;49041:128;;49118:35;;;;;;;;;;;;;;49041:128;48994:175;49214:2;49181:15;:24;49197:7;49181:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;49252:7;49248:2;49232:28;;49241:5;49232:28;;;;;;;;;;;;48938:330;48860:408;;:::o;38687:323::-;38748:7;38976:15;:13;:15::i;:::-;38961:12;;38945:13;;:28;:46;38938:53;;38687:323;:::o;75489:28::-;;;;;;;;;;;;;:::o;53066:2825::-;53208:27;53238;53257:7;53238:18;:27::i;:::-;53208:57;;53323:4;53282:45;;53298:19;53282:45;;;53278:86;;53336:28;;;;;;;;;;;;;;53278:86;53378:27;53407:23;53434:35;53461:7;53434:26;:35::i;:::-;53377:92;;;;53569:68;53594:15;53611:4;53617:19;:17;:19::i;:::-;53569:24;:68::i;:::-;53564:180;;53657:43;53674:4;53680:19;:17;:19::i;:::-;53657:16;:43::i;:::-;53652:92;;53709:35;;;;;;;;;;;;;;53652:92;53564:180;53775:1;53761:16;;:2;:16;;;53757:52;;53786:23;;;;;;;;;;;;;;53757:52;53822:43;53844:4;53850:2;53854:7;53863:1;53822:21;:43::i;:::-;53958:15;53955:160;;;54098:1;54077:19;54070:30;53955:160;54495:18;:24;54514:4;54495:24;;;;;;;;;;;;;;;;54493:26;;;;;;;;;;;;54564:18;:22;54583:2;54564:22;;;;;;;;;;;;;;;;54562:24;;;;;;;;;;;54886:146;54923:2;54972:45;54987:4;54993:2;54997:19;54972:14;:45::i;:::-;35086:8;54944:73;54886:18;:146::i;:::-;54857:17;:26;54875:7;54857:26;;;;;;;;;;;:175;;;;55203:1;35086:8;55152:19;:47;:52;55148:627;;55225:19;55257:1;55247:7;:11;55225:33;;55414:1;55380:17;:30;55398:11;55380:30;;;;;;;;;;;;:35;55376:384;;55518:13;;55503:11;:28;55499:242;;55698:19;55665:17;:30;55683:11;55665:30;;;;;;;;;;;:52;;;;55499:242;55376:384;55206:569;55148:627;55822:7;55818:2;55803:27;;55812:4;55803:27;;;;;;;;;;;;55841:42;55862:4;55868:2;55872:7;55881:1;55841:20;:42::i;:::-;53197:2694;;;53066:2825;;;:::o;75432:25::-;;;;:::o;75564:32::-;;;;:::o;77684:106::-;13326:13;:11;:13::i;:::-;77771::::1;77756:12;:28;;;;77684:106:::0;:::o;80061:154::-;13326:13;:11;:13::i;:::-;1812:1:::1;2410:7;;:19:::0;2402:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;80119:12:::2;80134:21;80119:36;;80163:44;80189:7;:5;:7::i;:::-;80199;80163:17;:44::i;:::-;80112:103;1768:1:::1;2722:7;:22;;;;80061:154::o:0;55987:193::-;56133:39;56150:4;56156:2;56160:7;56133:39;;;;;;;;;;;;:16;:39::i;:::-;55987:193;;;:::o;77225:119::-;13326:13;:11;:13::i;:::-;77332:6:::1;77298:31;:40;;;;77225:119:::0;:::o;77983:96::-;13326:13;:11;:13::i;:::-;78066:7:::1;78050:13;:23;;;;;;:::i;:::-;;77983:96:::0;:::o;76933:87::-;13326:13;:11;:13::i;:::-;77011:3:::1;76993:15;:21;;;;76933:87:::0;:::o;75522:35::-;;;;;;;;;;;;;:::o;44329:152::-;44401:7;44444:27;44463:7;44444:18;:27::i;:::-;44421:52;;44329:152;;;:::o;75212:39::-;;;;:::o;39871:233::-;39943:7;39984:1;39967:19;;:5;:19;;;39963:60;;39995:28;;;;;;;;;;;;;;39963:60;34030:13;40041:18;:25;40060:5;40041:25;;;;;;;;;;;;;;;;:55;40034:62;;39871:233;;;:::o;14088:103::-;13326:13;:11;:13::i;:::-;14153:30:::1;14180:1;14153:18;:30::i;:::-;14088:103::o:0;77482:108::-;13326:13;:11;:13::i;:::-;77571::::1;77558:10;:26;;;;77482:108:::0;:::o;79364:359::-;79468:12;;76154:150;76191:11;;76154:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76221:10;;76277;76260:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;76250:39;;;;;;76154:18;:150::i;:::-;76132:230;;;;;;;;;;;;:::i;:::-;;;;;;;;;79497:6:::1;76457:10;76444:23;;:9;:23;;;76436:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;76552:1;76538:11;:15;:90;;;;;76599:29;;76584:11;76557:24;76570:10;76557:12;:24::i;:::-;:38;;;;:::i;:::-;:71;;76538:90;76522:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;79516:6:::2;75864:21;75888:13;:11;:13::i;:::-;75864:37;;75935:10;;75918:13;:27;;75910:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;76011:10;;75996:11;75980:13;:27;;;;:::i;:::-;:41;;75972:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1:::3;2410:7;;:19:::0;2402:63:::3;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;79551:15:::4;;;;;;;;;;;79543:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;79636:6;79621:12;;:21;;;;:::i;:::-;79607:9;:36;;79599:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;79686:29;79696:10;79708:6;79686:9;:29::i;:::-;1768:1:::3;2722:7;:22;;;;75857:198:::2;76703:1;76371::::1;79364:359:::0;;;;;:::o;79729:84::-;13326:13;:11;:13::i;:::-;79793:14:::1;79799:7;79793:5;:14::i;:::-;79729:84:::0;:::o;77880:95::-;13326:13;:11;:13::i;:::-;77954:15:::1;;;;;;;;;;;77953:16;77935:15;;:34;;;;;;;;;;;;;;;;;;77880:95::o:0;13440:87::-;13486:7;13513:6;;;;;;;;;;;13506:13;;13440:87;:::o;77596:82::-;13326:13;:11;:13::i;:::-;77666:6:::1;77654:9;:18;;;;77596:82:::0;:::o;43112:104::-;43168:13;43201:7;43194:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43112:104;:::o;75601:51::-;;;;:::o;76829:98::-;13326:13;:11;:13::i;:::-;76912:9:::1;76899:10;:22;;;;76829:98:::0;:::o;78931:427::-;78991:6;76457:10;76444:23;;:9;:23;;;76436:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;76552:1;76538:11;:15;:90;;;;;76599:29;;76584:11;76557:24;76570:10;76557:12;:24::i;:::-;:38;;;;:::i;:::-;:71;;76538:90;76522:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;79010:6:::1;75864:21;75888:13;:11;:13::i;:::-;75864:37;;75935:10;;75918:13;:27;;75910:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;76011:10;;75996:11;75980:13;:27;;;;:::i;:::-;:41;;75972:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1:::2;2410:7;;:19:::0;2402:63:::2;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;79057:7:::3;:5;:7::i;:::-;79043:21;;:10;:21;;;79039:94;;79083:8;;;;;;;;;;;79075:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;79039:94;79160:31;;79150:6;:41;;79141:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;79267:6;79255:9;;:18;;;;:::i;:::-;79241:9;:33;;79233:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;79317:29;79327:10;79339:6;79317:9;:29::i;:::-;1768:1:::2;2722:7;:22;;;;75857:198:::1;76703:1;78931:427:::0;;:::o;49985:234::-;50132:8;50080:18;:39;50099:19;:17;:19::i;:::-;50080:39;;;;;;;;;;;;;;;:49;50120:8;50080:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;50192:8;50156:55;;50171:19;:17;:19::i;:::-;50156:55;;;50202:8;50156:55;;;;;;:::i;:::-;;;;;;;;49985:234;;:::o;56778:407::-;56953:31;56966:4;56972:2;56976:7;56953:12;:31::i;:::-;57017:1;56999:2;:14;;;:19;56995:183;;57038:56;57069:4;57075:2;57079:7;57088:5;57038:30;:56::i;:::-;57033:145;;57122:40;;;;;;;;;;;;;;57033:145;56995:183;56778:407;;;;:::o;78201:281::-;13326:13;:11;:13::i;:::-;78278:14:::1;78295:13;:11;:13::i;:::-;78278:30;;78344:10;;78334:6;78325;:15;;;;:::i;:::-;:29;;78317:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;78406:10;;78396:6;:20;;78388:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;78449:27;78459:8;78469:6;78449:9;:27::i;:::-;78271:211;78201:281:::0;;:::o;43322:318::-;43395:13;43426:16;43434:7;43426;:16::i;:::-;43421:59;;43451:29;;;;;;;;;;;;;;43421:59;43493:21;43517:10;:8;:10::i;:::-;43493:34;;43570:1;43551:7;43545:21;:26;:87;;;;;;;;;;;;;;;;;43598:7;43607:18;43617:7;43607:9;:18::i;:::-;43581:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43545:87;43538:94;;;43322:318;;;:::o;75657:49::-;;;;:::o;76716:107::-;76774:7;76797:20;76811:5;76797:13;:20::i;:::-;76790:27;;76716:107;;;:::o;79819:236::-;13326:13;:11;:13::i;:::-;79895:11:::1;79909:8;:15;79895:29;;79940:9;79935:115;79955:3;79951:1;:7;79935:115;;;79980:15;79998:8;80007:1;79998:11;;;;;;;;:::i;:::-;;;;;;;;79980:29;;80024:14;80030:7;80024:5;:14::i;:::-;79965:85;79960:3;;;;;:::i;:::-;;;;79935:115;;;;79884:171;79819:236:::0;:::o;77122:95::-;77174:7;77197:14;;77190:21;;77122:95;:::o;50376:164::-;50473:4;50497:18;:25;50516:5;50497:25;;;;;;;;;;;;;;;:35;50523:8;50497:35;;;;;;;;;;;;;;;;;;;;;;;;;50490:42;;50376:164;;;;:::o;77350:126::-;13326:13;:11;:13::i;:::-;77464:6:::1;77432:29;:38;;;;77350:126:::0;:::o;14346:201::-;13326:13;:11;:13::i;:::-;14455:1:::1;14435:22;;:8;:22;;::::0;14427:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;14511:28;14530:8;14511:18;:28::i;:::-;14346:201:::0;:::o;77026:90::-;13326:13;:11;:13::i;:::-;77107:3:::1;77090:14;:20;;;;77026:90:::0;:::o;78488:437::-;13326:13;:11;:13::i;:::-;78582:14:::1;78599:13;:11;:13::i;:::-;78582:30;;78648:10;;78638:6;78629;:15;;;;:::i;:::-;:29;;78621:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;78710:10;;78700:6;:20;;78692:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;78758:9;78753:167;78777:9;;:16;;78773:1;:20;78753:167;;;78841:1;78817:26;;:9;;78827:1;78817:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;:26;;::::0;78809:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;78881:31;78891:9;;78901:1;78891:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;78905:6;78881:9;:31::i;:::-;78795:3;;;;;:::i;:::-;;;;78753:167;;;;78575:350;78488:437:::0;;;:::o;13605:132::-;13680:12;:10;:12::i;:::-;13669:23;;:7;:5;:7::i;:::-;:23;;;13661:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13605:132::o;50798:282::-;50863:4;50919:7;50900:15;:13;:15::i;:::-;:26;;:66;;;;;50953:13;;50943:7;:23;50900:66;:153;;;;;51052:1;34806:8;51004:17;:26;51022:7;51004:26;;;;;;;;;;;;:44;:49;50900:153;50880:173;;50798:282;;;:::o;73106:105::-;73166:7;73193:10;73186:17;;73106:105;:::o;38203:92::-;38259:7;38203:92;:::o;45484:1275::-;45551:7;45571:12;45586:7;45571:22;;45654:4;45635:15;:13;:15::i;:::-;:23;45631:1061;;45688:13;;45681:4;:20;45677:1015;;;45726:14;45743:17;:23;45761:4;45743:23;;;;;;;;;;;;45726:40;;45860:1;34806:8;45832:6;:24;:29;45828:845;;46497:113;46514:1;46504:6;:11;46497:113;;46557:17;:25;46575:6;;;;;;;46557:25;;;;;;;;;;;;46548:34;;46497:113;;;46643:6;46636:13;;;;;;45828:845;45703:989;45677:1015;45631:1061;46720:31;;;;;;;;;;;;;;45484:1275;;;;:::o;51961:485::-;52063:27;52092:23;52133:38;52174:15;:24;52190:7;52174:24;;;;;;;;;;;52133:65;;52351:18;52328:41;;52408:19;52402:26;52383:45;;52313:126;51961:485;;;:::o;51189:659::-;51338:11;51503:16;51496:5;51492:28;51483:37;;51663:16;51652:9;51648:32;51635:45;;51813:15;51802:9;51799:30;51791:5;51780:9;51777:20;51774:56;51764:66;;51189:659;;;;;:::o;57847:159::-;;;;;:::o;72415:311::-;72550:7;72570:16;35210:3;72596:19;:41;;72570:68;;35210:3;72664:31;72675:4;72681:2;72685:9;72664:10;:31::i;:::-;72656:40;;:62;;72649:69;;;72415:311;;;;;:::o;47307:450::-;47387:14;47555:16;47548:5;47544:28;47535:37;;47732:5;47718:11;47693:23;47689:41;47686:52;47679:5;47676:63;47666:73;;47307:450;;;;:::o;58671:158::-;;;;;:::o;5253:317::-;5368:6;5343:21;:31;;5335:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5422:12;5440:9;:14;;5462:6;5440:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5421:52;;;5492:7;5484:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;5324:246;5253:317;;:::o;14707:191::-;14781:16;14800:6;;;;;;;;;;;14781:25;;14826:8;14817:6;;:17;;;;;;;;;;;;;;;;;;14881:8;14850:40;;14871:8;14850:40;;;;;;;;;;;;14770:128;14707:191;:::o;16124:190::-;16249:4;16302;16273:25;16286:5;16293:4;16273:12;:25::i;:::-;:33;16266:40;;16124:190;;;;;:::o;66938:112::-;67015:27;67025:2;67029:8;67015:27;;;;;;;;;;;;:9;:27::i;:::-;66938:112;;:::o;67317:89::-;67377:21;67383:7;67392:5;67377;:21::i;:::-;67317:89;:::o;59269:716::-;59432:4;59478:2;59453:45;;;59499:19;:17;:19::i;:::-;59520:4;59526:7;59535:5;59453:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;59449:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59753:1;59736:6;:13;:18;59732:235;;59782:40;;;;;;;;;;;;;;59732:235;59925:6;59919:13;59910:6;59906:2;59902:15;59895:38;59449:529;59622:54;;;59612:64;;;:6;:64;;;;59605:71;;;59269:716;;;;;;:::o;78087:108::-;78147:13;78176;78169:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78087:108;:::o;73313:1745::-;73378:17;73812:4;73805;73799:11;73795:22;73904:1;73898:4;73891:15;73979:4;73976:1;73972:12;73965:19;;74061:1;74056:3;74049:14;74165:3;74404:5;74386:428;74412:1;74386:428;;;74452:1;74447:3;74443:11;74436:18;;74623:2;74617:4;74613:13;74609:2;74605:22;74600:3;74592:36;74717:2;74711:4;74707:13;74699:21;;74784:4;74386:428;74774:25;74386:428;74390:21;74853:3;74848;74844:13;74968:4;74963:3;74959:14;74952:21;;75033:6;75028:3;75021:19;73417:1634;;;73313:1745;;;:::o;40186:178::-;40247:7;34030:13;34168:2;40275:18;:25;40294:5;40275:25;;;;;;;;;;;;;;;;:50;;40274:82;40267:89;;40186:178;;;:::o;11991:98::-;12044:7;12071:10;12064:17;;11991:98;:::o;72116:147::-;72253:6;72116:147;;;;;:::o;16991:296::-;17074:7;17094:20;17117:4;17094:27;;17137:9;17132:118;17156:5;:12;17152:1;:16;17132:118;;;17205:33;17215:12;17229:5;17235:1;17229:8;;;;;;;;:::i;:::-;;;;;;;;17205:9;:33::i;:::-;17190:48;;17170:3;;;;;:::i;:::-;;;;17132:118;;;;17267:12;17260:19;;;16991:296;;;;:::o;66165:689::-;66296:19;66302:2;66306:8;66296:5;:19::i;:::-;66375:1;66357:2;:14;;;:19;66353:483;;66397:11;66411:13;;66397:27;;66443:13;66465:8;66459:3;:14;66443:30;;66492:233;66523:62;66562:1;66566:2;66570:7;;;;;;66579:5;66523:30;:62::i;:::-;66518:167;;66621:40;;;;;;;;;;;;;;66518:167;66720:3;66712:5;:11;66492:233;;66807:3;66790:13;;:20;66786:34;;66812:8;;;66786:34;66378:458;;66353:483;66165:689;;;:::o;67635:3081::-;67715:27;67745;67764:7;67745:18;:27::i;:::-;67715:57;;67785:12;67816:19;67785:52;;67851:27;67880:23;67907:35;67934:7;67907:26;:35::i;:::-;67850:92;;;;67959:13;67955:316;;;68080:68;68105:15;68122:4;68128:19;:17;:19::i;:::-;68080:24;:68::i;:::-;68075:184;;68172:43;68189:4;68195:19;:17;:19::i;:::-;68172:16;:43::i;:::-;68167:92;;68224:35;;;;;;;;;;;;;;68167:92;68075:184;67955:316;68283:51;68305:4;68319:1;68323:7;68332:1;68283:21;:51::i;:::-;68427:15;68424:160;;;68567:1;68546:19;68539:30;68424:160;69245:1;34295:3;69215:1;:26;;69214:32;69186:18;:24;69205:4;69186:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;69513:176;69550:4;69621:53;69636:4;69650:1;69654:19;69621:14;:53::i;:::-;35086:8;34806;69574:43;69573:101;69513:18;:176::i;:::-;69484:17;:26;69502:7;69484:26;;;;;;;;;;;:205;;;;69860:1;35086:8;69809:19;:47;:52;69805:627;;69882:19;69914:1;69904:7;:11;69882:33;;70071:1;70037:17;:30;70055:11;70037:30;;;;;;;;;;;;:35;70033:384;;70175:13;;70160:11;:28;70156:242;;70355:19;70322:17;:30;70340:11;70322:30;;;;;;;;;;;:52;;;;70156:242;70033:384;69863:569;69805:627;70487:7;70483:1;70460:35;;70469:4;70460:35;;;;;;;;;;;;70506:50;70527:4;70541:1;70545:7;70554:1;70506:20;:50::i;:::-;70683:12;;:14;;;;;;;;;;;;;67704:3012;;;;67635:3081;;:::o;23198:149::-;23261:7;23292:1;23288;:5;:51;;23319:20;23334:1;23337;23319:14;:20::i;:::-;23288:51;;;23296:20;23311:1;23314;23296:14;:20::i;:::-;23288:51;23281:58;;23198:149;;;;:::o;60447:2966::-;60520:20;60543:13;;60520:36;;60583:1;60571:8;:13;60567:44;;60593:18;;;;;;;;;;;;;;60567:44;60624:61;60654:1;60658:2;60662:12;60676:8;60624:21;:61::i;:::-;61168:1;34168:2;61138:1;:26;;61137:32;61125:8;:45;61099:18;:22;61118:2;61099:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;61447:139;61484:2;61538:33;61561:1;61565:2;61569:1;61538:14;:33::i;:::-;61505:30;61526:8;61505:20;:30::i;:::-;:66;61447:18;:139::i;:::-;61413:17;:31;61431:12;61413:31;;;;;;;;;;;:173;;;;61603:16;61634:11;61663:8;61648:12;:23;61634:37;;62184:16;62180:2;62176:25;62164:37;;62556:12;62516:8;62475:1;62413:25;62354:1;62293;62266:335;62927:1;62913:12;62909:20;62867:346;62968:3;62959:7;62956:16;62867:346;;63186:7;63176:8;63173:1;63146:25;63143:1;63140;63135:59;63021:1;63012:7;63008:15;62997:26;;62867:346;;;62871:77;63258:1;63246:8;:13;63242:45;;63268:19;;;;;;;;;;;;;;63242:45;63320:3;63304:13;:19;;;;60873:2462;;63345:60;63374:1;63378:2;63382:12;63396:8;63345:20;:60::i;:::-;60509:2904;60447:2966;;:::o;23355:268::-;23423:13;23530:1;23524:4;23517:15;23559:1;23553:4;23546:15;23600:4;23594;23584:21;23575:30;;23355:268;;;;:::o;47859:324::-;47929:14;48162:1;48152:8;48149:15;48123:24;48119:46;48109:56;;47859:324;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:75::-;475:6;508:2;502:9;492:19;;442:75;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:149;805:7;845:66;838:5;834:78;823:89;;769:149;;;:::o;924:120::-;996:23;1013:5;996:23;:::i;:::-;989:5;986:34;976:62;;1034:1;1031;1024:12;976:62;924:120;:::o;1050:137::-;1095:5;1133:6;1120:20;1111:29;;1149:32;1175:5;1149:32;:::i;:::-;1050:137;;;;:::o;1193:327::-;1251:6;1300:2;1288:9;1279:7;1275:23;1271:32;1268:119;;;1306:79;;:::i;:::-;1268:119;1426:1;1451:52;1495:7;1486:6;1475:9;1471:22;1451:52;:::i;:::-;1441:62;;1397:116;1193:327;;;;:::o;1526:90::-;1560:7;1603:5;1596:13;1589:21;1578:32;;1526:90;;;:::o;1622:109::-;1703:21;1718:5;1703:21;:::i;:::-;1698:3;1691:34;1622:109;;:::o;1737:210::-;1824:4;1862:2;1851:9;1847:18;1839:26;;1875:65;1937:1;1926:9;1922:17;1913:6;1875:65;:::i;:::-;1737:210;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:246::-;2314:1;2324:113;2338:6;2335:1;2332:13;2324:113;;;2423:1;2418:3;2414:11;2408:18;2404:1;2399:3;2395:11;2388:39;2360:2;2357:1;2353:10;2348:15;;2324:113;;;2471:1;2462:6;2457:3;2453:16;2446:27;2295:184;2233:246;;;:::o;2485:102::-;2526:6;2577:2;2573:7;2568:2;2561:5;2557:14;2553:28;2543:38;;2485:102;;;:::o;2593:377::-;2681:3;2709:39;2742:5;2709:39;:::i;:::-;2764:71;2828:6;2823:3;2764:71;:::i;:::-;2757:78;;2844:65;2902:6;2897:3;2890:4;2883:5;2879:16;2844:65;:::i;:::-;2934:29;2956:6;2934:29;:::i;:::-;2929:3;2925:39;2918:46;;2685:285;2593:377;;;;:::o;2976:313::-;3089:4;3127:2;3116:9;3112:18;3104:26;;3176:9;3170:4;3166:20;3162:1;3151:9;3147:17;3140:47;3204:78;3277:4;3268:6;3204:78;:::i;:::-;3196:86;;2976:313;;;;:::o;3295:122::-;3368:24;3386:5;3368:24;:::i;:::-;3361:5;3358:35;3348:63;;3407:1;3404;3397:12;3348:63;3295:122;:::o;3423:139::-;3469:5;3507:6;3494:20;3485:29;;3523:33;3550:5;3523:33;:::i;:::-;3423:139;;;;:::o;3568:329::-;3627:6;3676:2;3664:9;3655:7;3651:23;3647:32;3644:119;;;3682:79;;:::i;:::-;3644:119;3802:1;3827:53;3872:7;3863:6;3852:9;3848:22;3827:53;:::i;:::-;3817:63;;3773:117;3568:329;;;;:::o;3903:126::-;3940:7;3980:42;3973:5;3969:54;3958:65;;3903:126;;;:::o;4035:96::-;4072:7;4101:24;4119:5;4101:24;:::i;:::-;4090:35;;4035:96;;;:::o;4137:118::-;4224:24;4242:5;4224:24;:::i;:::-;4219:3;4212:37;4137:118;;:::o;4261:222::-;4354:4;4392:2;4381:9;4377:18;4369:26;;4405:71;4473:1;4462:9;4458:17;4449:6;4405:71;:::i;:::-;4261:222;;;;:::o;4489:122::-;4562:24;4580:5;4562:24;:::i;:::-;4555:5;4552:35;4542:63;;4601:1;4598;4591:12;4542:63;4489:122;:::o;4617:139::-;4663:5;4701:6;4688:20;4679:29;;4717:33;4744:5;4717:33;:::i;:::-;4617:139;;;;:::o;4762:474::-;4830:6;4838;4887:2;4875:9;4866:7;4862:23;4858:32;4855:119;;;4893:79;;:::i;:::-;4855:119;5013:1;5038:53;5083:7;5074:6;5063:9;5059:22;5038:53;:::i;:::-;5028:63;;4984:117;5140:2;5166:53;5211:7;5202:6;5191:9;5187:22;5166:53;:::i;:::-;5156:63;;5111:118;4762:474;;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:77::-;5904:7;5933:5;5922:16;;5867:77;;;:::o;5950:118::-;6037:24;6055:5;6037:24;:::i;:::-;6032:3;6025:37;5950:118;;:::o;6074:222::-;6167:4;6205:2;6194:9;6190:18;6182:26;;6218:71;6286:1;6275:9;6271:17;6262:6;6218:71;:::i;:::-;6074:222;;;;:::o;6302:117::-;6411:1;6408;6401:12;6425:117;6534:1;6531;6524:12;6548:180;6596:77;6593:1;6586:88;6693:4;6690:1;6683:15;6717:4;6714:1;6707:15;6734:281;6817:27;6839:4;6817:27;:::i;:::-;6809:6;6805:40;6947:6;6935:10;6932:22;6911:18;6899:10;6896:34;6893:62;6890:88;;;6958:18;;:::i;:::-;6890:88;6998:10;6994:2;6987:22;6777:238;6734:281;;:::o;7021:129::-;7055:6;7082:20;;:::i;:::-;7072:30;;7111:33;7139:4;7131:6;7111:33;:::i;:::-;7021:129;;;:::o;7156:308::-;7218:4;7308:18;7300:6;7297:30;7294:56;;;7330:18;;:::i;:::-;7294:56;7368:29;7390:6;7368:29;:::i;:::-;7360:37;;7452:4;7446;7442:15;7434:23;;7156:308;;;:::o;7470:146::-;7567:6;7562:3;7557;7544:30;7608:1;7599:6;7594:3;7590:16;7583:27;7470:146;;;:::o;7622:425::-;7700:5;7725:66;7741:49;7783:6;7741:49;:::i;:::-;7725:66;:::i;:::-;7716:75;;7814:6;7807:5;7800:21;7852:4;7845:5;7841:16;7890:3;7881:6;7876:3;7872:16;7869:25;7866:112;;;7897:79;;:::i;:::-;7866:112;7987:54;8034:6;8029:3;8024;7987:54;:::i;:::-;7706:341;7622:425;;;;;:::o;8067:340::-;8123:5;8172:3;8165:4;8157:6;8153:17;8149:27;8139:122;;8180:79;;:::i;:::-;8139:122;8297:6;8284:20;8322:79;8397:3;8389:6;8382:4;8374:6;8370:17;8322:79;:::i;:::-;8313:88;;8129:278;8067:340;;;;:::o;8413:509::-;8482:6;8531:2;8519:9;8510:7;8506:23;8502:32;8499:119;;;8537:79;;:::i;:::-;8499:119;8685:1;8674:9;8670:17;8657:31;8715:18;8707:6;8704:30;8701:117;;;8737:79;;:::i;:::-;8701:117;8842:63;8897:7;8888:6;8877:9;8873:22;8842:63;:::i;:::-;8832:73;;8628:287;8413:509;;;;:::o;8928:329::-;8987:6;9036:2;9024:9;9015:7;9011:23;9007:32;9004:119;;;9042:79;;:::i;:::-;9004:119;9162:1;9187:53;9232:7;9223:6;9212:9;9208:22;9187:53;:::i;:::-;9177:63;;9133:117;8928:329;;;;:::o;9263:117::-;9372:1;9369;9362:12;9386:117;9495:1;9492;9485:12;9526:568;9599:8;9609:6;9659:3;9652:4;9644:6;9640:17;9636:27;9626:122;;9667:79;;:::i;:::-;9626:122;9780:6;9767:20;9757:30;;9810:18;9802:6;9799:30;9796:117;;;9832:79;;:::i;:::-;9796:117;9946:4;9938:6;9934:17;9922:29;;10000:3;9992:4;9984:6;9980:17;9970:8;9966:32;9963:41;9960:128;;;10007:79;;:::i;:::-;9960:128;9526:568;;;;;:::o;10100:704::-;10195:6;10203;10211;10260:2;10248:9;10239:7;10235:23;10231:32;10228:119;;;10266:79;;:::i;:::-;10228:119;10414:1;10403:9;10399:17;10386:31;10444:18;10436:6;10433:30;10430:117;;;10466:79;;:::i;:::-;10430:117;10579:80;10651:7;10642:6;10631:9;10627:22;10579:80;:::i;:::-;10561:98;;;;10357:312;10708:2;10734:53;10779:7;10770:6;10759:9;10755:22;10734:53;:::i;:::-;10724:63;;10679:118;10100:704;;;;;:::o;10810:122::-;10883:24;10901:5;10883:24;:::i;:::-;10876:5;10873:35;10863:63;;10922:1;10919;10912:12;10863:63;10810:122;:::o;10938:139::-;10984:5;11022:6;11009:20;11000:29;;11038:33;11065:5;11038:33;:::i;:::-;10938:139;;;;:::o;11083:329::-;11142:6;11191:2;11179:9;11170:7;11166:23;11162:32;11159:119;;;11197:79;;:::i;:::-;11159:119;11317:1;11342:53;11387:7;11378:6;11367:9;11363:22;11342:53;:::i;:::-;11332:63;;11288:117;11083:329;;;;:::o;11418:116::-;11488:21;11503:5;11488:21;:::i;:::-;11481:5;11478:32;11468:60;;11524:1;11521;11514:12;11468:60;11418:116;:::o;11540:133::-;11583:5;11621:6;11608:20;11599:29;;11637:30;11661:5;11637:30;:::i;:::-;11540:133;;;;:::o;11679:468::-;11744:6;11752;11801:2;11789:9;11780:7;11776:23;11772:32;11769:119;;;11807:79;;:::i;:::-;11769:119;11927:1;11952:53;11997:7;11988:6;11977:9;11973:22;11952:53;:::i;:::-;11942:63;;11898:117;12054:2;12080:50;12122:7;12113:6;12102:9;12098:22;12080:50;:::i;:::-;12070:60;;12025:115;11679:468;;;;;:::o;12153:307::-;12214:4;12304:18;12296:6;12293:30;12290:56;;;12326:18;;:::i;:::-;12290:56;12364:29;12386:6;12364:29;:::i;:::-;12356:37;;12448:4;12442;12438:15;12430:23;;12153:307;;;:::o;12466:423::-;12543:5;12568:65;12584:48;12625:6;12584:48;:::i;:::-;12568:65;:::i;:::-;12559:74;;12656:6;12649:5;12642:21;12694:4;12687:5;12683:16;12732:3;12723:6;12718:3;12714:16;12711:25;12708:112;;;12739:79;;:::i;:::-;12708:112;12829:54;12876:6;12871:3;12866;12829:54;:::i;:::-;12549:340;12466:423;;;;;:::o;12908:338::-;12963:5;13012:3;13005:4;12997:6;12993:17;12989:27;12979:122;;13020:79;;:::i;:::-;12979:122;13137:6;13124:20;13162:78;13236:3;13228:6;13221:4;13213:6;13209:17;13162:78;:::i;:::-;13153:87;;12969:277;12908:338;;;;:::o;13252:943::-;13347:6;13355;13363;13371;13420:3;13408:9;13399:7;13395:23;13391:33;13388:120;;;13427:79;;:::i;:::-;13388:120;13547:1;13572:53;13617:7;13608:6;13597:9;13593:22;13572:53;:::i;:::-;13562:63;;13518:117;13674:2;13700:53;13745:7;13736:6;13725:9;13721:22;13700:53;:::i;:::-;13690:63;;13645:118;13802:2;13828:53;13873:7;13864:6;13853:9;13849:22;13828:53;:::i;:::-;13818:63;;13773:118;13958:2;13947:9;13943:18;13930:32;13989:18;13981:6;13978:30;13975:117;;;14011:79;;:::i;:::-;13975:117;14116:62;14170:7;14161:6;14150:9;14146:22;14116:62;:::i;:::-;14106:72;;13901:287;13252:943;;;;;;;:::o;14201:474::-;14269:6;14277;14326:2;14314:9;14305:7;14301:23;14297:32;14294:119;;;14332:79;;:::i;:::-;14294:119;14452:1;14477:53;14522:7;14513:6;14502:9;14498:22;14477:53;:::i;:::-;14467:63;;14423:117;14579:2;14605:53;14650:7;14641:6;14630:9;14626:22;14605:53;:::i;:::-;14595:63;;14550:118;14201:474;;;;;:::o;14681:311::-;14758:4;14848:18;14840:6;14837:30;14834:56;;;14870:18;;:::i;:::-;14834:56;14920:4;14912:6;14908:17;14900:25;;14980:4;14974;14970:15;14962:23;;14681:311;;;:::o;15015:710::-;15111:5;15136:81;15152:64;15209:6;15152:64;:::i;:::-;15136:81;:::i;:::-;15127:90;;15237:5;15266:6;15259:5;15252:21;15300:4;15293:5;15289:16;15282:23;;15353:4;15345:6;15341:17;15333:6;15329:30;15382:3;15374:6;15371:15;15368:122;;;15401:79;;:::i;:::-;15368:122;15516:6;15499:220;15533:6;15528:3;15525:15;15499:220;;;15608:3;15637:37;15670:3;15658:10;15637:37;:::i;:::-;15632:3;15625:50;15704:4;15699:3;15695:14;15688:21;;15575:144;15559:4;15554:3;15550:14;15543:21;;15499:220;;;15503:21;15117:608;;15015:710;;;;;:::o;15748:370::-;15819:5;15868:3;15861:4;15853:6;15849:17;15845:27;15835:122;;15876:79;;:::i;:::-;15835:122;15993:6;15980:20;16018:94;16108:3;16100:6;16093:4;16085:6;16081:17;16018:94;:::i;:::-;16009:103;;15825:293;15748:370;;;;:::o;16124:539::-;16208:6;16257:2;16245:9;16236:7;16232:23;16228:32;16225:119;;;16263:79;;:::i;:::-;16225:119;16411:1;16400:9;16396:17;16383:31;16441:18;16433:6;16430:30;16427:117;;;16463:79;;:::i;:::-;16427:117;16568:78;16638:7;16629:6;16618:9;16614:22;16568:78;:::i;:::-;16558:88;;16354:302;16124:539;;;;:::o;16669:474::-;16737:6;16745;16794:2;16782:9;16773:7;16769:23;16765:32;16762:119;;;16800:79;;:::i;:::-;16762:119;16920:1;16945:53;16990:7;16981:6;16970:9;16966:22;16945:53;:::i;:::-;16935:63;;16891:117;17047:2;17073:53;17118:7;17109:6;17098:9;17094:22;17073:53;:::i;:::-;17063:63;;17018:118;16669:474;;;;;:::o;17166:568::-;17239:8;17249:6;17299:3;17292:4;17284:6;17280:17;17276:27;17266:122;;17307:79;;:::i;:::-;17266:122;17420:6;17407:20;17397:30;;17450:18;17442:6;17439:30;17436:117;;;17472:79;;:::i;:::-;17436:117;17586:4;17578:6;17574:17;17562:29;;17640:3;17632:4;17624:6;17620:17;17610:8;17606:32;17603:41;17600:128;;;17647:79;;:::i;:::-;17600:128;17166:568;;;;;:::o;17740:704::-;17835:6;17843;17851;17900:2;17888:9;17879:7;17875:23;17871:32;17868:119;;;17906:79;;:::i;:::-;17868:119;18026:1;18051:53;18096:7;18087:6;18076:9;18072:22;18051:53;:::i;:::-;18041:63;;17997:117;18181:2;18170:9;18166:18;18153:32;18212:18;18204:6;18201:30;18198:117;;;18234:79;;:::i;:::-;18198:117;18347:80;18419:7;18410:6;18399:9;18395:22;18347:80;:::i;:::-;18329:98;;;;18124:313;17740:704;;;;;:::o;18450:180::-;18498:77;18495:1;18488:88;18595:4;18592:1;18585:15;18619:4;18616:1;18609:15;18636:320;18680:6;18717:1;18711:4;18707:12;18697:22;;18764:1;18758:4;18754:12;18785:18;18775:81;;18841:4;18833:6;18829:17;18819:27;;18775:81;18903:2;18895:6;18892:14;18872:18;18869:38;18866:84;;18922:18;;:::i;:::-;18866:84;18687:269;18636:320;;;:::o;18962:181::-;19102:33;19098:1;19090:6;19086:14;19079:57;18962:181;:::o;19149:366::-;19291:3;19312:67;19376:2;19371:3;19312:67;:::i;:::-;19305:74;;19388:93;19477:3;19388:93;:::i;:::-;19506:2;19501:3;19497:12;19490:19;;19149:366;;;:::o;19521:419::-;19687:4;19725:2;19714:9;19710:18;19702:26;;19774:9;19768:4;19764:20;19760:1;19749:9;19745:17;19738:47;19802:131;19928:4;19802:131;:::i;:::-;19794:139;;19521:419;;;:::o;19946:141::-;19995:4;20018:3;20010:11;;20041:3;20038:1;20031:14;20075:4;20072:1;20062:18;20054:26;;19946:141;;;:::o;20093:93::-;20130:6;20177:2;20172;20165:5;20161:14;20157:23;20147:33;;20093:93;;;:::o;20192:107::-;20236:8;20286:5;20280:4;20276:16;20255:37;;20192:107;;;;:::o;20305:393::-;20374:6;20424:1;20412:10;20408:18;20447:97;20477:66;20466:9;20447:97;:::i;:::-;20565:39;20595:8;20584:9;20565:39;:::i;:::-;20553:51;;20637:4;20633:9;20626:5;20622:21;20613:30;;20686:4;20676:8;20672:19;20665:5;20662:30;20652:40;;20381:317;;20305:393;;;;;:::o;20704:60::-;20732:3;20753:5;20746:12;;20704:60;;;:::o;20770:142::-;20820:9;20853:53;20871:34;20880:24;20898:5;20880:24;:::i;:::-;20871:34;:::i;:::-;20853:53;:::i;:::-;20840:66;;20770:142;;;:::o;20918:75::-;20961:3;20982:5;20975:12;;20918:75;;;:::o;20999:269::-;21109:39;21140:7;21109:39;:::i;:::-;21170:91;21219:41;21243:16;21219:41;:::i;:::-;21211:6;21204:4;21198:11;21170:91;:::i;:::-;21164:4;21157:105;21075:193;20999:269;;;:::o;21274:73::-;21319:3;21274:73;:::o;21353:189::-;21430:32;;:::i;:::-;21471:65;21529:6;21521;21515:4;21471:65;:::i;:::-;21406:136;21353:189;;:::o;21548:186::-;21608:120;21625:3;21618:5;21615:14;21608:120;;;21679:39;21716:1;21709:5;21679:39;:::i;:::-;21652:1;21645:5;21641:13;21632:22;;21608:120;;;21548:186;;:::o;21740:543::-;21841:2;21836:3;21833:11;21830:446;;;21875:38;21907:5;21875:38;:::i;:::-;21959:29;21977:10;21959:29;:::i;:::-;21949:8;21945:44;22142:2;22130:10;22127:18;22124:49;;;22163:8;22148:23;;22124:49;22186:80;22242:22;22260:3;22242:22;:::i;:::-;22232:8;22228:37;22215:11;22186:80;:::i;:::-;21845:431;;21830:446;21740:543;;;:::o;22289:117::-;22343:8;22393:5;22387:4;22383:16;22362:37;;22289:117;;;;:::o;22412:169::-;22456:6;22489:51;22537:1;22533:6;22525:5;22522:1;22518:13;22489:51;:::i;:::-;22485:56;22570:4;22564;22560:15;22550:25;;22463:118;22412:169;;;;:::o;22586:295::-;22662:4;22808:29;22833:3;22827:4;22808:29;:::i;:::-;22800:37;;22870:3;22867:1;22863:11;22857:4;22854:21;22846:29;;22586:295;;;;:::o;22886:1395::-;23003:37;23036:3;23003:37;:::i;:::-;23105:18;23097:6;23094:30;23091:56;;;23127:18;;:::i;:::-;23091:56;23171:38;23203:4;23197:11;23171:38;:::i;:::-;23256:67;23316:6;23308;23302:4;23256:67;:::i;:::-;23350:1;23374:4;23361:17;;23406:2;23398:6;23395:14;23423:1;23418:618;;;;24080:1;24097:6;24094:77;;;24146:9;24141:3;24137:19;24131:26;24122:35;;24094:77;24197:67;24257:6;24250:5;24197:67;:::i;:::-;24191:4;24184:81;24053:222;23388:887;;23418:618;23470:4;23466:9;23458:6;23454:22;23504:37;23536:4;23504:37;:::i;:::-;23563:1;23577:208;23591:7;23588:1;23585:14;23577:208;;;23670:9;23665:3;23661:19;23655:26;23647:6;23640:42;23721:1;23713:6;23709:14;23699:24;;23768:2;23757:9;23753:18;23740:31;;23614:4;23611:1;23607:12;23602:17;;23577:208;;;23813:6;23804:7;23801:19;23798:179;;;23871:9;23866:3;23862:19;23856:26;23914:48;23956:4;23948:6;23944:17;23933:9;23914:48;:::i;:::-;23906:6;23899:64;23821:156;23798:179;24023:1;24019;24011:6;24007:14;24003:22;23997:4;23990:36;23425:611;;;23388:887;;22978:1303;;;22886:1395;;:::o;24287:94::-;24320:8;24368:5;24364:2;24360:14;24339:35;;24287:94;;;:::o;24387:::-;24426:7;24455:20;24469:5;24455:20;:::i;:::-;24444:31;;24387:94;;;:::o;24487:100::-;24526:7;24555:26;24575:5;24555:26;:::i;:::-;24544:37;;24487:100;;;:::o;24593:157::-;24698:45;24718:24;24736:5;24718:24;:::i;:::-;24698:45;:::i;:::-;24693:3;24686:58;24593:157;;:::o;24756:256::-;24868:3;24883:75;24954:3;24945:6;24883:75;:::i;:::-;24983:2;24978:3;24974:12;24967:19;;25003:3;24996:10;;24756:256;;;;:::o;25018:180::-;25158:32;25154:1;25146:6;25142:14;25135:56;25018:180;:::o;25204:366::-;25346:3;25367:67;25431:2;25426:3;25367:67;:::i;:::-;25360:74;;25443:93;25532:3;25443:93;:::i;:::-;25561:2;25556:3;25552:12;25545:19;;25204:366;;;:::o;25576:419::-;25742:4;25780:2;25769:9;25765:18;25757:26;;25829:9;25823:4;25819:20;25815:1;25804:9;25800:17;25793:47;25857:131;25983:4;25857:131;:::i;:::-;25849:139;;25576:419;;;:::o;26001:230::-;26141:34;26137:1;26129:6;26125:14;26118:58;26210:13;26205:2;26197:6;26193:15;26186:38;26001:230;:::o;26237:366::-;26379:3;26400:67;26464:2;26459:3;26400:67;:::i;:::-;26393:74;;26476:93;26565:3;26476:93;:::i;:::-;26594:2;26589:3;26585:12;26578:19;;26237:366;;;:::o;26609:419::-;26775:4;26813:2;26802:9;26798:18;26790:26;;26862:9;26856:4;26852:20;26848:1;26837:9;26833:17;26826:47;26890:131;27016:4;26890:131;:::i;:::-;26882:139;;26609:419;;;:::o;27034:180::-;27082:77;27079:1;27072:88;27179:4;27176:1;27169:15;27203:4;27200:1;27193:15;27220:191;27260:3;27279:20;27297:1;27279:20;:::i;:::-;27274:25;;27313:20;27331:1;27313:20;:::i;:::-;27308:25;;27356:1;27353;27349:9;27342:16;;27377:3;27374:1;27371:10;27368:36;;;27384:18;;:::i;:::-;27368:36;27220:191;;;;:::o;27417:236::-;27557:34;27553:1;27545:6;27541:14;27534:58;27626:19;27621:2;27613:6;27609:15;27602:44;27417:236;:::o;27659:366::-;27801:3;27822:67;27886:2;27881:3;27822:67;:::i;:::-;27815:74;;27898:93;27987:3;27898:93;:::i;:::-;28016:2;28011:3;28007:12;28000:19;;27659:366;;;:::o;28031:419::-;28197:4;28235:2;28224:9;28220:18;28212:26;;28284:9;28278:4;28274:20;28270:1;28259:9;28255:17;28248:47;28312:131;28438:4;28312:131;:::i;:::-;28304:139;;28031:419;;;:::o;28456:165::-;28596:17;28592:1;28584:6;28580:14;28573:41;28456:165;:::o;28627:366::-;28769:3;28790:67;28854:2;28849:3;28790:67;:::i;:::-;28783:74;;28866:93;28955:3;28866:93;:::i;:::-;28984:2;28979:3;28975:12;28968:19;;28627:366;;;:::o;28999:419::-;29165:4;29203:2;29192:9;29188:18;29180:26;;29252:9;29246:4;29242:20;29238:1;29227:9;29223:17;29216:47;29280:131;29406:4;29280:131;:::i;:::-;29272:139;;28999:419;;;:::o;29424:165::-;29564:17;29560:1;29552:6;29548:14;29541:41;29424:165;:::o;29595:366::-;29737:3;29758:67;29822:2;29817:3;29758:67;:::i;:::-;29751:74;;29834:93;29923:3;29834:93;:::i;:::-;29952:2;29947:3;29943:12;29936:19;;29595:366;;;:::o;29967:419::-;30133:4;30171:2;30160:9;30156:18;30148:26;;30220:9;30214:4;30210:20;30206:1;30195:9;30191:17;30184:47;30248:131;30374:4;30248:131;:::i;:::-;30240:139;;29967:419;;;:::o;30392:171::-;30532:23;30528:1;30520:6;30516:14;30509:47;30392:171;:::o;30569:366::-;30711:3;30732:67;30796:2;30791:3;30732:67;:::i;:::-;30725:74;;30808:93;30897:3;30808:93;:::i;:::-;30926:2;30921:3;30917:12;30910:19;;30569:366;;;:::o;30941:419::-;31107:4;31145:2;31134:9;31130:18;31122:26;;31194:9;31188:4;31184:20;31180:1;31169:9;31165:17;31158:47;31222:131;31348:4;31222:131;:::i;:::-;31214:139;;30941:419;;;:::o;31366:410::-;31406:7;31429:20;31447:1;31429:20;:::i;:::-;31424:25;;31463:20;31481:1;31463:20;:::i;:::-;31458:25;;31518:1;31515;31511:9;31540:30;31558:11;31540:30;:::i;:::-;31529:41;;31719:1;31710:7;31706:15;31703:1;31700:22;31680:1;31673:9;31653:83;31630:139;;31749:18;;:::i;:::-;31630:139;31414:362;31366:410;;;;:::o;31782:179::-;31922:31;31918:1;31910:6;31906:14;31899:55;31782:179;:::o;31967:366::-;32109:3;32130:67;32194:2;32189:3;32130:67;:::i;:::-;32123:74;;32206:93;32295:3;32206:93;:::i;:::-;32324:2;32319:3;32315:12;32308:19;;31967:366;;;:::o;32339:419::-;32505:4;32543:2;32532:9;32528:18;32520:26;;32592:9;32586:4;32582:20;32578:1;32567:9;32563:17;32556:47;32620:131;32746:4;32620:131;:::i;:::-;32612:139;;32339:419;;;:::o;32764:179::-;32904:31;32900:1;32892:6;32888:14;32881:55;32764:179;:::o;32949:366::-;33091:3;33112:67;33176:2;33171:3;33112:67;:::i;:::-;33105:74;;33188:93;33277:3;33188:93;:::i;:::-;33306:2;33301:3;33297:12;33290:19;;32949:366;;;:::o;33321:419::-;33487:4;33525:2;33514:9;33510:18;33502:26;;33574:9;33568:4;33564:20;33560:1;33549:9;33545:17;33538:47;33602:131;33728:4;33602:131;:::i;:::-;33594:139;;33321:419;;;:::o;33746:180::-;33886:32;33882:1;33874:6;33870:14;33863:56;33746:180;:::o;33932:366::-;34074:3;34095:67;34159:2;34154:3;34095:67;:::i;:::-;34088:74;;34171:93;34260:3;34171:93;:::i;:::-;34289:2;34284:3;34280:12;34273:19;;33932:366;;;:::o;34304:419::-;34470:4;34508:2;34497:9;34493:18;34485:26;;34557:9;34551:4;34547:20;34543:1;34532:9;34528:17;34521:47;34585:131;34711:4;34585:131;:::i;:::-;34577:139;;34304:419;;;:::o;34729:172::-;34869:24;34865:1;34857:6;34853:14;34846:48;34729:172;:::o;34907:366::-;35049:3;35070:67;35134:2;35129:3;35070:67;:::i;:::-;35063:74;;35146:93;35235:3;35146:93;:::i;:::-;35264:2;35259:3;35255:12;35248:19;;34907:366;;;:::o;35279:419::-;35445:4;35483:2;35472:9;35468:18;35460:26;;35532:9;35526:4;35522:20;35518:1;35507:9;35503:17;35496:47;35560:131;35686:4;35560:131;:::i;:::-;35552:139;;35279:419;;;:::o;35704:169::-;35844:21;35840:1;35832:6;35828:14;35821:45;35704:169;:::o;35879:366::-;36021:3;36042:67;36106:2;36101:3;36042:67;:::i;:::-;36035:74;;36118:93;36207:3;36118:93;:::i;:::-;36236:2;36231:3;36227:12;36220:19;;35879:366;;;:::o;36251:419::-;36417:4;36455:2;36444:9;36440:18;36432:26;;36504:9;36498:4;36494:20;36490:1;36479:9;36475:17;36468:47;36532:131;36658:4;36532:131;:::i;:::-;36524:139;;36251:419;;;:::o;36676:148::-;36778:11;36815:3;36800:18;;36676:148;;;;:::o;36830:390::-;36936:3;36964:39;36997:5;36964:39;:::i;:::-;37019:89;37101:6;37096:3;37019:89;:::i;:::-;37012:96;;37117:65;37175:6;37170:3;37163:4;37156:5;37152:16;37117:65;:::i;:::-;37207:6;37202:3;37198:16;37191:23;;36940:280;36830:390;;;;:::o;37226:435::-;37406:3;37428:95;37519:3;37510:6;37428:95;:::i;:::-;37421:102;;37540:95;37631:3;37622:6;37540:95;:::i;:::-;37533:102;;37652:3;37645:10;;37226:435;;;;;:::o;37667:180::-;37715:77;37712:1;37705:88;37812:4;37809:1;37802:15;37836:4;37833:1;37826:15;37853:233;37892:3;37915:24;37933:5;37915:24;:::i;:::-;37906:33;;37961:66;37954:5;37951:77;37948:103;;38031:18;;:::i;:::-;37948:103;38078:1;38071:5;38067:13;38060:20;;37853:233;;;:::o;38092:225::-;38232:34;38228:1;38220:6;38216:14;38209:58;38301:8;38296:2;38288:6;38284:15;38277:33;38092:225;:::o;38323:366::-;38465:3;38486:67;38550:2;38545:3;38486:67;:::i;:::-;38479:74;;38562:93;38651:3;38562:93;:::i;:::-;38680:2;38675:3;38671:12;38664:19;;38323:366;;;:::o;38695:419::-;38861:4;38899:2;38888:9;38884:18;38876:26;;38948:9;38942:4;38938:20;38934:1;38923:9;38919:17;38912:47;38976:131;39102:4;38976:131;:::i;:::-;38968:139;;38695:419;;;:::o;39120:174::-;39260:26;39256:1;39248:6;39244:14;39237:50;39120:174;:::o;39300:366::-;39442:3;39463:67;39527:2;39522:3;39463:67;:::i;:::-;39456:74;;39539:93;39628:3;39539:93;:::i;:::-;39657:2;39652:3;39648:12;39641:19;;39300:366;;;:::o;39672:419::-;39838:4;39876:2;39865:9;39861:18;39853:26;;39925:9;39919:4;39915:20;39911:1;39900:9;39896:17;39889:47;39953:131;40079:4;39953:131;:::i;:::-;39945:139;;39672:419;;;:::o;40097:182::-;40237:34;40233:1;40225:6;40221:14;40214:58;40097:182;:::o;40285:366::-;40427:3;40448:67;40512:2;40507:3;40448:67;:::i;:::-;40441:74;;40524:93;40613:3;40524:93;:::i;:::-;40642:2;40637:3;40633:12;40626:19;;40285:366;;;:::o;40657:419::-;40823:4;40861:2;40850:9;40846:18;40838:26;;40910:9;40904:4;40900:20;40896:1;40885:9;40881:17;40874:47;40938:131;41064:4;40938:131;:::i;:::-;40930:139;;40657:419;;;:::o;41082:179::-;41222:31;41218:1;41210:6;41206:14;41199:55;41082:179;:::o;41267:366::-;41409:3;41430:67;41494:2;41489:3;41430:67;:::i;:::-;41423:74;;41506:93;41595:3;41506:93;:::i;:::-;41624:2;41619:3;41615:12;41608:19;;41267:366;;;:::o;41639:419::-;41805:4;41843:2;41832:9;41828:18;41820:26;;41892:9;41886:4;41882:20;41878:1;41867:9;41863:17;41856:47;41920:131;42046:4;41920:131;:::i;:::-;41912:139;;41639:419;;;:::o;42064:147::-;42165:11;42202:3;42187:18;;42064:147;;;;:::o;42217:114::-;;:::o;42337:398::-;42496:3;42517:83;42598:1;42593:3;42517:83;:::i;:::-;42510:90;;42609:93;42698:3;42609:93;:::i;:::-;42727:1;42722:3;42718:11;42711:18;;42337:398;;;:::o;42741:379::-;42925:3;42947:147;43090:3;42947:147;:::i;:::-;42940:154;;43111:3;43104:10;;42741:379;;;:::o;43126:245::-;43266:34;43262:1;43254:6;43250:14;43243:58;43335:28;43330:2;43322:6;43318:15;43311:53;43126:245;:::o;43377:366::-;43519:3;43540:67;43604:2;43599:3;43540:67;:::i;:::-;43533:74;;43616:93;43705:3;43616:93;:::i;:::-;43734:2;43729:3;43725:12;43718:19;;43377:366;;;:::o;43749:419::-;43915:4;43953:2;43942:9;43938:18;43930:26;;44002:9;43996:4;43992:20;43988:1;43977:9;43973:17;43966:47;44030:131;44156:4;44030:131;:::i;:::-;44022:139;;43749:419;;;:::o;44174:98::-;44225:6;44259:5;44253:12;44243:22;;44174:98;;;:::o;44278:168::-;44361:11;44395:6;44390:3;44383:19;44435:4;44430:3;44426:14;44411:29;;44278:168;;;;:::o;44452:373::-;44538:3;44566:38;44598:5;44566:38;:::i;:::-;44620:70;44683:6;44678:3;44620:70;:::i;:::-;44613:77;;44699:65;44757:6;44752:3;44745:4;44738:5;44734:16;44699:65;:::i;:::-;44789:29;44811:6;44789:29;:::i;:::-;44784:3;44780:39;44773:46;;44542:283;44452:373;;;;:::o;44831:640::-;45026:4;45064:3;45053:9;45049:19;45041:27;;45078:71;45146:1;45135:9;45131:17;45122:6;45078:71;:::i;:::-;45159:72;45227:2;45216:9;45212:18;45203:6;45159:72;:::i;:::-;45241;45309:2;45298:9;45294:18;45285:6;45241:72;:::i;:::-;45360:9;45354:4;45350:20;45345:2;45334:9;45330:18;45323:48;45388:76;45459:4;45450:6;45388:76;:::i;:::-;45380:84;;44831:640;;;;;;;:::o;45477:141::-;45533:5;45564:6;45558:13;45549:22;;45580:32;45606:5;45580:32;:::i;:::-;45477:141;;;;:::o;45624:349::-;45693:6;45742:2;45730:9;45721:7;45717:23;45713:32;45710:119;;;45748:79;;:::i;:::-;45710:119;45868:1;45893:63;45948:7;45939:6;45928:9;45924:22;45893:63;:::i;:::-;45883:73;;45839:127;45624:349;;;;:::o

Swarm Source

ipfs://3c21b0f51f2a2d947e8b2dfc2bfb54ffdbaf331c7dd18183221701378c3cae15
Loading...
Loading
Loading...
Loading
[ 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.