ETH Price: $2,976.16 (-2.46%)
Gas: 4 Gwei

Token

Do You Think Im Crazy by LSD (LSD)
 

Overview

Max Total Supply

757 LSD

Holders

209

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
13 LSD
0x0525fa029ab0be79e4dc798b8e6f0e8fb209d8b7
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:
DoYouThinkImCrazybyLSD

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// File: IOperatorFilterRegistry.sol


pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

// File: OperatorFilterer.sol


pragma solidity ^0.8.13;


/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}

// File: DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;


/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

// File: MerkleProof.sol

// contracts/MerkleProofVerify.sol

// based upon https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.0.1/contracts/mocks/MerkleProofWrapper.sol

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle trees (hash trees),
 */
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[] calldata proof, bytes32 leaf, bytes32 root) internal pure returns (bool) {
        bytes32 computedHash = leaf;

        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];

            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }
}


/*

pragma solidity ^0.8.0;



contract MerkleProofVerify {
    function verify(bytes32[] calldata proof, bytes32 root)
        public
        view
        returns (bool)
    {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));

        return MerkleProof.verify(proof, root, leaf);
    }
}
*/
// File: Strings.sol



pragma solidity ^0.8.0;

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

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

// File: 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 GSN 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 memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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



pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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.3._
     */
    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.3._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: IERC721Receiver.sol



pragma solidity ^0.8.0;

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

// File: IERC165.sol


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

pragma solidity ^0.8.0;

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


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

pragma solidity ^0.8.0;


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


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

pragma solidity ^0.8.0;


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


// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;



/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}
// File: IERC721.sol



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

// File: IERC721Enumerable.sol


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

pragma solidity ^0.8.0;


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

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

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



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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

// File: ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;









error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

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

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

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
    }

    // Compiler will pack the following 
    // _currentIndex and _burnCounter into a single 256bit word.
    
    // The tokenId of the next token to be minted.
    uint128 internal _currentIndex;

    // The number of tokens burned.
    uint128 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex times
        unchecked {
            return _currentIndex - _burnCounter;    
        }
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (!ownership.burned) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }
        revert TokenIndexOutOfBounds();
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds();
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        // Execution should never reach this point.
        revert();
    }

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

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

    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
                updatedIndex++;
            }

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

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

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

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // 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**128.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

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

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

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

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

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

        // 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**128.
        unchecked {
            _addressData[prevOwnership.addr].balance -= 1;
            _addressData[prevOwnership.addr].numberBurned += 1;

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

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

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

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

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * 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 {}
}
// File: DYTIC.sol


pragma solidity ^0.8.4;







contract DoYouThinkImCrazybyLSD is ERC721A, Ownable, ERC2981, DefaultOperatorFilterer {
    using Strings for uint256;

    IERC721 public nft;
    IERC721 public nft2;

    string public baseURI;
    string public notRevealedUri;
    string public contractURI;

    bool public public_mint_status = true;
    bool public wl_mint_status = true;   
    bool public special_mint_status = true;   
    bool public paused = false;

    uint256 MAX_SUPPLY = 1818;    
    
    bool public revealed = true;

    uint256 public whitelistCost = 0 ether;
    uint256 public publicSaleCost = 0.02 ether;
    uint256 public specialNFTHoldersCost = 0 ether;
    uint256 public max_per_wallet = 5;

    uint256 public total_PS_count;
    uint256 public total_wl_count;
    uint256 public total_special_count;

    uint256 public total_PS_limit = 1000;
    uint256 public total_wl_limit = 0;
    uint256 public total_special_limit = 733;
    
    bytes32 public whitelistSigner;

    mapping(address => uint256) public mintedFree; 
    mapping(address => uint256) public publicMinted; 
    mapping(address => uint256) public wlMinted; 
    mapping(address => uint256) public eligibleFreeMints; 
    mapping(address => uint256) public eligibleFreeMintsA; 
    mapping(address => uint256) public eligibleFreeMintsB; 

    // Contract Addresses
    address _nft_Contract = 0x9fb5D56adDa8B3625A7eCcc181D028a211e30D09;
    address _nft_Contract2 = 0x5aF696307963dCEa7cd56F504C8C609BCd9E4502;

    constructor(string memory _initBaseURI, string memory _initNotRevealedUri, string memory _contractURI) ERC721A("Do You Think Im Crazy by LSD", "LSD") {
     
    setBaseURI(_initBaseURI);
    setNotRevealedURI(_initNotRevealedUri);   
    setRoyaltyInfo(owner(),500);
    contractURI = _contractURI;  
    nft = IERC721(_nft_Contract);
    nft2 = IERC721(_nft_Contract2);
    mint(85);
    }

    function airdrop(address[] calldata receiver, uint256[] calldata quantity) public payable onlyOwner {
  
        require(receiver.length == quantity.length, "Airdrop data does not match");

        for(uint256 x = 0; x < receiver.length; x++){
        _safeMint(receiver[x], quantity[x]);
        }
    }

    function mint(uint256 quantity) public payable  {
        require(totalSupply() + quantity <= MAX_SUPPLY,"No More NFTs to Mint");

        if (msg.sender != owner()) {

            require(!paused, "The contract is paused");
            require(public_mint_status, "Public mint status is off");           
          
            require(total_PS_count + quantity <= total_PS_limit, "Public Sale Limit Reached");
            require(publicMinted[msg.sender] + wlMinted[msg.sender] + quantity <= max_per_wallet, "Per Wallet Limit Reached");
            
            require(msg.value >= (publicSaleCost * quantity), "Not Enough ETH Sent");  
            total_PS_count = total_PS_count + quantity;        
            publicMinted[msg.sender] = publicMinted[msg.sender] + quantity;

                       
        }

        _safeMint(msg.sender, quantity);


        
        }

    // special minting

    function specialMint(uint256 quantity) public payable  {

        require(totalSupply() + quantity <= MAX_SUPPLY,"No More NFTs to Mint");
        require(!paused, "The contract is paused");
        require(special_mint_status, "Special mint status is off");
        
            require(nft.balanceOf(msg.sender) > 0 || nft2.balanceOf(msg.sender) > 0, "Do not have special NFTs");

                eligibleFreeMintsA[msg.sender] = nft.balanceOf(msg.sender);
                eligibleFreeMintsB[msg.sender] = nft2.balanceOf(msg.sender);
                eligibleFreeMints[msg.sender] = eligibleFreeMintsA[msg.sender] + eligibleFreeMintsB[msg.sender];

                require(mintedFree[msg.sender] + quantity <= eligibleFreeMints[msg.sender]);
                require(msg.value >= (specialNFTHoldersCost * quantity), "Not Enough ETH Sent");  

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

    }

   
    // whitelist minting 

   function whitelistMint(bytes32[] calldata _proof, uint256 quantity) payable public{

        require(totalSupply() + quantity <= MAX_SUPPLY, "Not enough tokens left");
        require(!paused, "The contract is paused");
        require(wl_mint_status, "whitelist mint is off");
        require(total_wl_count + quantity <= total_wl_limit, "Whitelist Limit Reached");
        require(publicMinted[msg.sender] + wlMinted[msg.sender] + quantity <= max_per_wallet, "Per Wallet Limit Reached");

        require(msg.value >= whitelistCost * quantity, "insufficient funds");

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(_proof,leaf,whitelistSigner),"Invalid Proof");

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


    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        if(revealed == false) {
        return notRevealedUri;
        }
      
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString(),".json")) : '';
    }

    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) {
        super.approve(operator, tokenId);
    }

    function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }

     function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721A, ERC2981)
        returns (bool)
    {
        // Supports the following `interfaceId`s:
        // - IERC165: 0x01ffc9a7
        // - IERC721: 0x80ac58cd
        // - IERC721Metadata: 0x5b5e139f
        // - IERC2981: 0x2a55205a
        return
            ERC721A.supportsInterface(interfaceId) ||
            ERC2981.supportsInterface(interfaceId);
    }

      function setRoyaltyInfo(address _receiver, uint96 _royaltyFeesInBips) private onlyOwner {
        _setDefaultRoyalty(_receiver, _royaltyFeesInBips);
    }
   

    //only owner      
    
    function toggleReveal() public onlyOwner {
        
        if(revealed==false){
            revealed = true;
        }else{
            revealed = false;
        }
    }   

    function toggle_paused() public onlyOwner {
        
        if(paused==false){
            paused = true;
        }else{
            paused = false;
        }
    } 
        
    function toggle_public_mint_status() public onlyOwner {
        
        if(public_mint_status==false){
            public_mint_status = true;
        }else{
            public_mint_status = false;
        }
    }  

    function toggle_wl_mint_status() public onlyOwner {
        
        if(wl_mint_status==false){
            wl_mint_status = true;
        }else{
            wl_mint_status = false;
        }
    } 

    function toggle_special_mint_status() public onlyOwner {
        
        if(special_mint_status==false){
           special_mint_status = true;
        }else{
            special_mint_status = false;
        }
    } 

    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }
    

    function setContractURI(string memory _contractURI) public onlyOwner {
        contractURI = _contractURI;
    }
  
    function setWhitelistSigner(bytes32 newWhitelistSigner) external onlyOwner {
        whitelistSigner = newWhitelistSigner;
    }
   
    function withdraw() public payable onlyOwner {
  
    (bool main, ) = payable(owner()).call{value: address(this).balance}("");
    require(main);
    }

    function setWhitelistCost(uint256 _whitelistCost) public onlyOwner {
        whitelistCost = _whitelistCost;
    }
    
    function setPublicSaleCost(uint256 _publicSaleCost) public onlyOwner {
        publicSaleCost = _publicSaleCost;
    }

    function setspecialNFTHoldersCost(uint256 _specialNFTHoldersCost) public onlyOwner {
        specialNFTHoldersCost = _specialNFTHoldersCost;
    }

    function set_total_PS_limit(uint256 _total_PS_limit) public onlyOwner {
        total_PS_limit = _total_PS_limit;
    }

    function set_total_wl_limit(uint256 _total_wl_limit) public onlyOwner {
        total_wl_limit = _total_wl_limit;
    }

    function set_total_special_limit(uint256 _total_special_limit) public onlyOwner {
        total_special_limit = _total_special_limit;
    }

    function setMax_per_wallet(uint256 _max_per_wallet) public onlyOwner {
        max_per_wallet = _max_per_wallet;
    }

    function setMAX_SUPPLY(uint256 _MAX_SUPPLY) public onlyOwner {
        MAX_SUPPLY = _MAX_SUPPLY;
    }

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

    function setNFTContract(address _nftContract) public onlyOwner{
    nft = IERC721(_nftContract);
    }

    function setNFTContract2(address _nftContract2) public onlyOwner{
    nft2 = IERC721(_nftContract2);
    }
       
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"},{"internalType":"string","name":"_contractURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receiver","type":"address[]"},{"internalType":"uint256[]","name":"quantity","type":"uint256[]"}],"name":"airdrop","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"eligibleFreeMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"eligibleFreeMintsA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"eligibleFreeMintsB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"max_per_wallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft2","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"public_mint_status","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_MAX_SUPPLY","type":"uint256"}],"name":"setMAX_SUPPLY","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max_per_wallet","type":"uint256"}],"name":"setMax_per_wallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nftContract","type":"address"}],"name":"setNFTContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nftContract2","type":"address"}],"name":"setNFTContract2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicSaleCost","type":"uint256"}],"name":"setPublicSaleCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelistCost","type":"uint256"}],"name":"setWhitelistCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newWhitelistSigner","type":"bytes32"}],"name":"setWhitelistSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_total_PS_limit","type":"uint256"}],"name":"set_total_PS_limit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_total_special_limit","type":"uint256"}],"name":"set_total_special_limit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_total_wl_limit","type":"uint256"}],"name":"set_total_wl_limit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_specialNFTHoldersCost","type":"uint256"}],"name":"setspecialNFTHoldersCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"specialMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"specialNFTHoldersCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"special_mint_status","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggle_paused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggle_public_mint_status","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggle_special_mint_status","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggle_wl_mint_status","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total_PS_count","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total_PS_limit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total_special_count","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total_special_limit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total_wl_count","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total_wl_limit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistSigner","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"wlMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wl_mint_status","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

6080604052600f805463ffffffff19166201010117905561071a6010556011805460ff191660011790556000601281905566470de4df820000601355601481905560056015556103e8601955601a556102dd601b55602380546001600160a01b0319908116739fb5d56adda8b3625a7eccc181d028a211e30d091790915560248054909116735af696307963dcea7cd56f504c8c609bcd9e4502179055348015620000a957600080fd5b506040516200423038038062004230833981016040819052620000cc9162000bf2565b733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280601c81526020017f446f20596f75205468696e6b20496d204372617a79206279204c534400000000815250604051806040016040528060038152602001621314d160ea1b815250816001908162000146919062000d11565b50600262000155828262000d11565b505050620001726200016c6200034660201b60201c565b6200034a565b6daaeb6d7670e522a718067333cd4e3b15620002b75780156200020557604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b158015620001e657600080fd5b505af1158015620001fb573d6000803e3d6000fd5b50505050620002b7565b6001600160a01b03821615620002565760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401620001cb565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200029d57600080fd5b505af1158015620002b2573d6000803e3d6000fd5b505050505b50620002c59050836200039c565b620002d082620003b8565b620002f0620002e76007546001600160a01b031690565b6101f4620003d0565b600e620002fe828262000d11565b50602354600a80546001600160a01b039283166001600160a01b031991821617909155602454600b80549190931691161790556200033d6055620003e6565b50505062000eb2565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620003a6620006cc565b600c620003b4828262000d11565b5050565b620003c2620006cc565b600d620003b4828262000d11565b620003da620006cc565b620003b482826200072a565b601054816200040d6000546001600160801b03600160801b82048116918116919091031690565b62000419919062000df3565b11156200046d5760405162461bcd60e51b815260206004820152601460248201527f4e6f204d6f7265204e46547320746f204d696e7400000000000000000000000060448201526064015b60405180910390fd5b6007546001600160a01b03163314620006bd57600f546301000000900460ff1615620004dc5760405162461bcd60e51b815260206004820152601660248201527f54686520636f6e74726163742069732070617573656400000000000000000000604482015260640162000464565b600f5460ff16620005305760405162461bcd60e51b815260206004820152601960248201527f5075626c6963206d696e7420737461747573206973206f666600000000000000604482015260640162000464565b6019548160165462000543919062000df3565b1115620005935760405162461bcd60e51b815260206004820152601960248201527f5075626c69632053616c65204c696d6974205265616368656400000000000000604482015260640162000464565b601554336000908152601f6020908152604080832054601e909252909120548391620005bf9162000df3565b620005cb919062000df3565b11156200061b5760405162461bcd60e51b815260206004820152601860248201527f5065722057616c6c6574204c696d697420526561636865640000000000000000604482015260640162000464565b806013546200062b919062000e0f565b3410156200067c5760405162461bcd60e51b815260206004820152601360248201527f4e6f7420456e6f756768204554482053656e7400000000000000000000000000604482015260640162000464565b806016546200068c919062000df3565b601655336000908152601e6020526040902054620006ac90829062000df3565b336000908152601e60205260409020555b620006c933826200082b565b50565b6007546001600160a01b03163314620007285760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000464565b565b6127106001600160601b03821611156200079a5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b606482015260840162000464565b6001600160a01b038216620007f25760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640162000464565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600855565b620003b48282604051806020016040528060008152506200084d60201b60201c565b6200085c838383600162000861565b505050565b6000546001600160801b03166001600160a01b0385166200089457604051622e076360e81b815260040160405180910390fd5b83600003620008b65760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260046020908152604080832080546001600160801b031981166001600160401b038083168c018116918217680100000000000000006001600160401b031990941690921783900481168c018116909202179091558584526003909252822080546001600160e01b031916909317600160a01b42909216919091021790915581905b85811015620009cd5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4838015620009a157506200099f6000888488620009fd565b155b15620009c0576040516368d2bf6b60e11b815260040160405180910390fd5b6001918201910162000946565b50600080546001600160801b0319166001600160801b0392909216919091178155620009f69050565b5050505050565b600062000a1e846001600160a01b031662000b1f60201b62001ff71760201c565b1562000b1357604051630a85bd0160e11b81526001600160a01b0385169063150b7a029062000a5890339089908890889060040162000e29565b6020604051808303816000875af192505050801562000a96575060408051601f3d908101601f1916820190925262000a939181019062000e7f565b60015b62000af8573d80801562000ac7576040519150601f19603f3d011682016040523d82523d6000602084013e62000acc565b606091505b50805160000362000af0576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905062000b17565b5060015b949350505050565b3b151590565b634e487b7160e01b600052604160045260246000fd5b60005b8381101562000b5857818101518382015260200162000b3e565b50506000910152565b600082601f83011262000b7357600080fd5b81516001600160401b038082111562000b905762000b9062000b25565b604051601f8301601f19908116603f0116810190828211818310171562000bbb5762000bbb62000b25565b8160405283815286602085880101111562000bd557600080fd5b62000be884602083016020890162000b3b565b9695505050505050565b60008060006060848603121562000c0857600080fd5b83516001600160401b038082111562000c2057600080fd5b62000c2e8783880162000b61565b9450602086015191508082111562000c4557600080fd5b62000c538783880162000b61565b9350604086015191508082111562000c6a57600080fd5b5062000c798682870162000b61565b9150509250925092565b600181811c9082168062000c9857607f821691505b60208210810362000cb957634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200085c57600081815260208120601f850160051c8101602086101562000ce85750805b601f850160051c820191505b8181101562000d095782815560010162000cf4565b505050505050565b81516001600160401b0381111562000d2d5762000d2d62000b25565b62000d458162000d3e845462000c83565b8462000cbf565b602080601f83116001811462000d7d576000841562000d645750858301515b600019600386901b1c1916600185901b17855562000d09565b600085815260208120601f198616915b8281101562000dae5788860151825594840194600190910190840162000d8d565b508582101562000dcd5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b8082018082111562000e095762000e0962000ddd565b92915050565b808202811582820484141762000e095762000e0962000ddd565b600060018060a01b03808716835280861660208401525083604083015260806060830152825180608084015262000e688160a085016020870162000b3b565b601f01601f19169190910160a00195945050505050565b60006020828403121562000e9257600080fd5b81516001600160e01b03198116811462000eab57600080fd5b9392505050565b61336e8062000ec26000396000f3fe60806040526004361061041b5760003560e01c80636c0360eb1161021e578063a22cb46511610123578063d49479eb116100ab578063e985e9c51161007a578063e985e9c514610bf6578063ec9496ba14610c3f578063ef81b4d414610c5f578063f2c4ce1e14610c75578063f2fde38b14610c9557600080fd5b8063d49479eb14610b96578063dcc7eb3514610bb6578063e7b99ec714610bcb578063e8a3d48514610be157600080fd5b8063b13ca86b116100f2578063b13ca86b14610b0b578063b88d4fde14610b2b578063c87b56dd14610b4b578063cbbb93d714610b6b578063d00a82c514610b8057600080fd5b8063a22cb46514610a9f578063a7ccabdf14610abf578063ab53fcaa14610adf578063ae981f5114610af557600080fd5b80638429925c116101a65780638e228fb6116101755780638e228fb614610a2c578063938e3d7b14610a4257806395d89b4114610a625780639942b66914610a77578063a0712d6814610a8c57600080fd5b80638429925c146109b957806386bb9bfd146109cf5780638da5cb5b146109ee5780638dbb7c0614610a0c57600080fd5b806375c2dd90116101ed57806375c2dd901461091257806378a92380146109325780637a615afa1461095f57806381c4cede1461097f578063835d997e1461099957600080fd5b80636c0360eb146108b35780636cdfb419146108c857806370a08231146108dd578063715018a6146108fd57600080fd5b80633147fdaf116103245780634f6ccce7116102ac578063575104921161027b57806357510492146108375780635b8ad4291461084a5780635c975abb1461085f5780636352211e1461088057806367243482146108a057600080fd5b80634f6ccce7146107c757806351830227146107e757806355f804b31461080157806356aae60e1461082157600080fd5b806341ff5a9b116102f357806341ff5a9b1461072457806342842e0e14610744578063453afb0f1461076457806346e345c11461077a57806347ccca02146107a757600080fd5b80633147fdaf146106ae5780633ccfd60b146106da5780633de4daca146106e257806341f434341461070257600080fd5b80631015805b116103a757806323b872dd1161037657806323b872dd146105fc578063253894211461061c5780632904e6d91461063c5780632a55205a1461064f5780632f745c591461068e57600080fd5b80631015805b1461057757806318160ddd146105a45780631ba075bb146105b957806320984801146105cf57600080fd5b8063081c8c44116103ee578063081c8c44146104d1578063085e947c146104e6578063095ea7b31461052157806309c3219a146105415780630e58e5701461055757600080fd5b806301ffc9a71461042057806305973de61461045557806306fdde0314610477578063081812fc14610499575b600080fd5b34801561042c57600080fd5b5061044061043b366004612bb7565b610cb5565b60405190151581526020015b60405180910390f35b34801561046157600080fd5b50610475610470366004612bdb565b610cd5565b005b34801561048357600080fd5b5061048c610ce2565b60405161044c9190612c44565b3480156104a557600080fd5b506104b96104b4366004612bdb565b610d74565b6040516001600160a01b03909116815260200161044c565b3480156104dd57600080fd5b5061048c610db8565b3480156104f257600080fd5b50610513610501366004612c73565b60226020526000908152604090205481565b60405190815260200161044c565b34801561052d57600080fd5b5061047561053c366004612c8e565b610e46565b34801561054d57600080fd5b50610513601a5481565b34801561056357600080fd5b50610475610572366004612c73565b610e5f565b34801561058357600080fd5b50610513610592366004612c73565b601e6020526000908152604090205481565b3480156105b057600080fd5b50610513610e89565b3480156105c557600080fd5b5061051360195481565b3480156105db57600080fd5b506105136105ea366004612c73565b601d6020526000908152604090205481565b34801561060857600080fd5b50610475610617366004612cb8565b610ea8565b34801561062857600080fd5b50610475610637366004612bdb565b610ed3565b61047561064a366004612d38565b610ee0565b34801561065b57600080fd5b5061066f61066a366004612d83565b6111b8565b604080516001600160a01b03909316835260208301919091520161044c565b34801561069a57600080fd5b506105136106a9366004612c8e565b611266565b3480156106ba57600080fd5b506105136106c9366004612c73565b602080526000908152604090205481565b61047561135a565b3480156106ee57600080fd5b506104756106fd366004612bdb565b6113d6565b34801561070e57600080fd5b506104b96daaeb6d7670e522a718067333cd4e81565b34801561073057600080fd5b5061047561073f366004612bdb565b6113e3565b34801561075057600080fd5b5061047561075f366004612cb8565b6113f0565b34801561077057600080fd5b5061051360135481565b34801561078657600080fd5b50610513610795366004612c73565b60216020526000908152604090205481565b3480156107b357600080fd5b50600a546104b9906001600160a01b031681565b3480156107d357600080fd5b506105136107e2366004612bdb565b611415565b3480156107f357600080fd5b506011546104409060ff1681565b34801561080d57600080fd5b5061047561081c366004612e30565b6114be565b34801561082d57600080fd5b5061051360185481565b610475610845366004612bdb565b6114d6565b34801561085657600080fd5b506104756118b3565b34801561086b57600080fd5b50600f54610440906301000000900460ff1681565b34801561088c57600080fd5b506104b961089b366004612bdb565b6118e6565b6104756108ae366004612e78565b6118f8565b3480156108bf57600080fd5b5061048c6119bb565b3480156108d457600080fd5b506104756119c8565b3480156108e957600080fd5b506105136108f8366004612c73565b611a06565b34801561090957600080fd5b50610475611a54565b34801561091e57600080fd5b50600f546104409062010000900460ff1681565b34801561093e57600080fd5b5061051361094d366004612c73565b601f6020526000908152604090205481565b34801561096b57600080fd5b5061047561097a366004612bdb565b611a66565b34801561098b57600080fd5b50600f546104409060ff1681565b3480156109a557600080fd5b506104756109b4366004612bdb565b611a73565b3480156109c557600080fd5b5061051360175481565b3480156109db57600080fd5b50600f5461044090610100900460ff1681565b3480156109fa57600080fd5b506007546001600160a01b03166104b9565b348015610a1857600080fd5b50610475610a27366004612bdb565b611a80565b348015610a3857600080fd5b5061051360145481565b348015610a4e57600080fd5b50610475610a5d366004612e30565b611a8d565b348015610a6e57600080fd5b5061048c611aa1565b348015610a8357600080fd5b50610475611ab0565b610475610a9a366004612bdb565b611aea565b348015610aab57600080fd5b50610475610aba366004612ef1565b611d49565b348015610acb57600080fd5b50610475610ada366004612c73565b611d5d565b348015610aeb57600080fd5b5061051360155481565b348015610b0157600080fd5b5061051360165481565b348015610b1757600080fd5b50600b546104b9906001600160a01b031681565b348015610b3757600080fd5b50610475610b46366004612f28565b611d87565b348015610b5757600080fd5b5061048c610b66366004612bdb565b611dad565b348015610b7757600080fd5b50610475611ed2565b348015610b8c57600080fd5b50610513601b5481565b348015610ba257600080fd5b50610475610bb1366004612bdb565b611f14565b348015610bc257600080fd5b50610475611f21565b348015610bd757600080fd5b5061051360125481565b348015610bed57600080fd5b5061048c611f53565b348015610c0257600080fd5b50610440610c11366004612fa3565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610c4b57600080fd5b50610475610c5a366004612bdb565b611f60565b348015610c6b57600080fd5b50610513601c5481565b348015610c8157600080fd5b50610475610c90366004612e30565b611f6d565b348015610ca157600080fd5b50610475610cb0366004612c73565b611f81565b6000610cc082611ffd565b80610ccf5750610ccf82612068565b92915050565b610cdd61208d565b601455565b606060018054610cf190612fd6565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1d90612fd6565b8015610d6a5780601f10610d3f57610100808354040283529160200191610d6a565b820191906000526020600020905b815481529060010190602001808311610d4d57829003601f168201915b5050505050905090565b6000610d7f826120e7565b610d9c576040516333d1c03960e21b815260040160405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600d8054610dc590612fd6565b80601f0160208091040260200160405190810160405280929190818152602001828054610df190612fd6565b8015610e3e5780601f10610e1357610100808354040283529160200191610e3e565b820191906000526020600020905b815481529060010190602001808311610e2157829003601f168201915b505050505081565b81610e508161211b565b610e5a83836121d4565b505050565b610e6761208d565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160801b03600160801b82048116918116919091031690565b826001600160a01b0381163314610ec257610ec23361211b565b610ecd84848461225c565b50505050565b610edb61208d565b601c55565b60105481610eec610e89565b610ef69190613026565b1115610f425760405162461bcd60e51b8152602060048201526016602482015275139bdd08195b9bdd59da081d1bdad95b9cc81b19599d60521b60448201526064015b60405180910390fd5b600f546301000000900460ff1615610f6c5760405162461bcd60e51b8152600401610f3990613039565b600f54610100900460ff16610fbb5760405162461bcd60e51b81526020600482015260156024820152743bb434ba32b634b9ba1036b4b73a1034b99037b33360591b6044820152606401610f39565b601a5481601754610fcc9190613026565b111561101a5760405162461bcd60e51b815260206004820152601760248201527f57686974656c697374204c696d697420526561636865640000000000000000006044820152606401610f39565b601554336000908152601f6020908152604080832054601e90925290912054839161104491613026565b61104e9190613026565b11156110975760405162461bcd60e51b815260206004820152601860248201527714195c8815d85b1b195d08131a5b5a5d0814995858da195960421b6044820152606401610f39565b806012546110a59190613069565b3410156110e95760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610f39565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050611130848483601c54612267565b61116c5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210283937b7b360991b6044820152606401610f39565b6111763383612317565b816017546111849190613026565b601755336000908152601f60205260409020546111a2908390613026565b336000908152601f602052604090205550505050565b60008281526009602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b031692820192909252829161122d5750604080518082019091526008546001600160a01b0381168252600160a01b90046001600160601b031660208201525b60208101516000906127109061124c906001600160601b031687613069565b6112569190613096565b91519350909150505b9250929050565b600061127183611a06565b8210611290576040516306ed618760e11b815260040160405180910390fd5b600080546001600160801b03169080805b8381101561041b57600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615801592820192909252906113085750611352565b80516001600160a01b03161561131d57805192505b876001600160a01b0316836001600160a01b0316036113505786840361134957509350610ccf92505050565b6001909301925b505b6001016112a1565b61136261208d565b60006113766007546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d80600081146113c0576040519150601f19603f3d011682016040523d82523d6000602084013e6113c5565b606091505b50509050806113d357600080fd5b50565b6113de61208d565b601a55565b6113eb61208d565b601955565b826001600160a01b038116331461140a5761140a3361211b565b610ecd848484612331565b600080546001600160801b031681805b828110156114a457600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615159181018290529061149b578583036114945750949350505050565b6001909201915b50600101611425565b506040516329c8c00760e21b815260040160405180910390fd5b6114c661208d565b600c6114d282826130f8565b5050565b601054816114e2610e89565b6114ec9190613026565b11156115315760405162461bcd60e51b8152602060048201526014602482015273139bc8135bdc99481391951cc81d1bc8135a5b9d60621b6044820152606401610f39565b600f546301000000900460ff161561155b5760405162461bcd60e51b8152600401610f3990613039565b600f5462010000900460ff166115b35760405162461bcd60e51b815260206004820152601a60248201527f5370656369616c206d696e7420737461747573206973206f66660000000000006044820152606401610f39565b600a546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156115fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162091906131b7565b11806116965750600b546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611670573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169491906131b7565b115b6116e25760405162461bcd60e51b815260206004820152601860248201527f446f206e6f742068617665207370656369616c204e46547300000000000000006044820152606401610f39565b600a546040516370a0823160e01b81523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa15801561172a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174e91906131b7565b336000818152602160205260409081902092909255600b5491516370a0823160e01b815260048101919091526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156117ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d091906131b7565b33600090815260226020908152604080832084905560219091529020546117f79190613026565b33600090815260208080526040808320849055601d90915290205461181d908390613026565b111561182857600080fd5b806014546118369190613069565b34101561187b5760405162461bcd60e51b8152602060048201526013602482015272139bdd08115b9bdd59da081155120814d95b9d606a1b6044820152606401610f39565b6118853382612317565b336000908152601d60205260409020546118a0908290613026565b336000908152601d602052604090205550565b6118bb61208d565b60115460ff1615156000036118d9576011805460ff19166001179055565b6011805460ff191690555b565b60006118f18261234c565b5192915050565b61190061208d565b82811461194f5760405162461bcd60e51b815260206004820152601b60248201527f41697264726f70206461746120646f6573206e6f74206d6174636800000000006044820152606401610f39565b60005b838110156119b4576119a285858381811061196f5761196f6131d0565b90506020020160208101906119849190612c73565b848484818110611996576119966131d0565b90506020020135612317565b806119ac816131e6565b915050611952565b5050505050565b600c8054610dc590612fd6565b6119d061208d565b600f5462010000900460ff1615156000036119f857600f805462ff0000191662010000179055565b600f805462ff000019169055565b60006001600160a01b038216611a2f576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600460205260409020546001600160401b031690565b611a5c61208d565b6118e4600061246e565b611a6e61208d565b601b55565b611a7b61208d565b601555565b611a8861208d565b601355565b611a9561208d565b600e6114d282826130f8565b606060028054610cf190612fd6565b611ab861208d565b600f54610100900460ff161515600003611add57600f805461ff001916610100179055565b600f805461ff0019169055565b60105481611af6610e89565b611b009190613026565b1115611b455760405162461bcd60e51b8152602060048201526014602482015273139bc8135bdc99481391951cc81d1bc8135a5b9d60621b6044820152606401610f39565b6007546001600160a01b03163314611d3f57600f546301000000900460ff1615611b815760405162461bcd60e51b8152600401610f3990613039565b600f5460ff16611bd35760405162461bcd60e51b815260206004820152601960248201527f5075626c6963206d696e7420737461747573206973206f6666000000000000006044820152606401610f39565b60195481601654611be49190613026565b1115611c325760405162461bcd60e51b815260206004820152601960248201527f5075626c69632053616c65204c696d69742052656163686564000000000000006044820152606401610f39565b601554336000908152601f6020908152604080832054601e909252909120548391611c5c91613026565b611c669190613026565b1115611caf5760405162461bcd60e51b815260206004820152601860248201527714195c8815d85b1b195d08131a5b5a5d0814995858da195960421b6044820152606401610f39565b80601354611cbd9190613069565b341015611d025760405162461bcd60e51b8152602060048201526013602482015272139bdd08115b9bdd59da081155120814d95b9d606a1b6044820152606401610f39565b80601654611d109190613026565b601655336000908152601e6020526040902054611d2e908290613026565b336000908152601e60205260409020555b6113d33382612317565b81611d538161211b565b610e5a83836124c0565b611d6561208d565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b836001600160a01b0381163314611da157611da13361211b565b6119b485858585612555565b6060611db8826120e7565b611dd557604051630a14c4b560e41b815260040160405180910390fd5b60115460ff161515600003611e7657600d8054611df190612fd6565b80601f0160208091040260200160405190810160405280929190818152602001828054611e1d90612fd6565b8015611e6a5780601f10611e3f57610100808354040283529160200191611e6a565b820191906000526020600020905b815481529060010190602001808311611e4d57829003601f168201915b50505050509050919050565b600c8054611e8390612fd6565b9050600003611ea15760405180602001604052806000815250610ccf565b600c611eac83612589565b604051602001611ebd9291906131ff565b60405160208183030381529060405292915050565b611eda61208d565b600f546301000000900460ff161515600003611f0557600f805463ff00000019166301000000179055565b600f805463ff00000019169055565b611f1c61208d565b601255565b611f2961208d565b600f5460ff161515600003611f4757600f805460ff19166001179055565b600f805460ff19169055565b600e8054610dc590612fd6565b611f6861208d565b601055565b611f7561208d565b600d6114d282826130f8565b611f8961208d565b6001600160a01b038116611fee5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f39565b6113d38161246e565b3b151590565b60006001600160e01b031982166380ac58cd60e01b148061202e57506001600160e01b03198216635b5e139f60e01b145b8061204957506001600160e01b0319821663780e9d6360e01b145b80610ccf57506301ffc9a760e01b6001600160e01b0319831614610ccf565b60006001600160e01b0319821663152a902d60e11b1480610ccf5750610ccf82611ffd565b6007546001600160a01b031633146118e45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610f39565b600080546001600160801b031682108015610ccf575050600090815260036020526040902054600160e01b900460ff161590565b6daaeb6d7670e522a718067333cd4e3b156113d357604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015612188573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ac9190613296565b6113d357604051633b79c77360e21b81526001600160a01b0382166004820152602401610f39565b60006121df826118e6565b9050806001600160a01b0316836001600160a01b0316036122135760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061223357506122318133610c11565b155b15612251576040516367d9dca160e11b815260040160405180910390fd5b610e5a838383612694565b610e5a8383836126f0565b600082815b85811015612309576000878783818110612288576122886131d0565b9050602002013590508083116122c95760408051602081018590529081018290526060016040516020818303038152906040528051906020012092506122f6565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612301816131e6565b91505061226c565b50821490505b949350505050565b6114d282826040518060200160405280600081525061290a565b610e5a83838360405180602001604052806000815250611d87565b60408051606081018252600080825260208201819052918101829052905482906001600160801b031681101561245557600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906124535780516001600160a01b0316156123ea579392505050565b5060001901600081815260036020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff161515928101929092521561244e579392505050565b6123ea565b505b604051636f96cda160e11b815260040160405180910390fd5b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b336001600160a01b038316036124e95760405163b06307db60e01b815260040160405180910390fd5b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6125608484846126f0565b61256c84848484612917565b610ecd576040516368d2bf6b60e11b815260040160405180910390fd5b6060816000036125b05750506040805180820190915260018152600360fc1b602082015290565b8160005b81156125da57806125c4816131e6565b91506125d39050600a83613096565b91506125b4565b6000816001600160401b038111156125f4576125f4612da5565b6040519080825280601f01601f19166020018201604052801561261e576020820181803683370190505b508593509050815b831561268b57612637600a856132b3565b612642906030613026565b60f81b8261264f836132c7565b92508281518110612662576126626131d0565b60200101906001600160f81b031916908160001a905350612684600a85613096565b9350612626565b50949350505050565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006126fb8261234c565b80519091506000906001600160a01b0316336001600160a01b03161480612729575081516127299033610c11565b8061274457503361273984610d74565b6001600160a01b0316145b90508061276457604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146127995760405162a1148160e81b815260040160405180910390fd5b6001600160a01b0384166127c057604051633a954ecd60e21b815260040160405180910390fd5b6127d06000848460000151612694565b6001600160a01b038581166000908152600460209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600390945282852080546001600160e01b031916909417600160a01b4290921691909102179092559086018083529120549091166128c3576000546001600160801b03168110156128c357825160008281526003602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119b4565b610e5a8383836001612a16565b60006001600160a01b0384163b15612a0e57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061295b9033908990889088906004016132de565b6020604051808303816000875af1925050508015612996575060408051601f3d908101601f191682019092526129939181019061331b565b60015b6129f4573d8080156129c4576040519150601f19603f3d011682016040523d82523d6000602084013e6129c9565b606091505b5080516000036129ec576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061230f565b50600161230f565b6000546001600160801b03166001600160a01b038516612a4857604051622e076360e81b815260040160405180910390fd5b83600003612a695760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260046020908152604080832080546001600160801b031981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c018116909202179091558584526003909252822080546001600160e01b031916909317600160a01b42909216919091021790915581905b85811015612b7b5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4838015612b515750612b4f6000888488612917565b155b15612b6f576040516368d2bf6b60e11b815260040160405180910390fd5b60019182019101612afa565b50600080546001600160801b0319166001600160801b03929092169190911790556119b4565b6001600160e01b0319811681146113d357600080fd5b600060208284031215612bc957600080fd5b8135612bd481612ba1565b9392505050565b600060208284031215612bed57600080fd5b5035919050565b60005b83811015612c0f578181015183820152602001612bf7565b50506000910152565b60008151808452612c30816020860160208601612bf4565b601f01601f19169290920160200192915050565b602081526000612bd46020830184612c18565b80356001600160a01b0381168114612c6e57600080fd5b919050565b600060208284031215612c8557600080fd5b612bd482612c57565b60008060408385031215612ca157600080fd5b612caa83612c57565b946020939093013593505050565b600080600060608486031215612ccd57600080fd5b612cd684612c57565b9250612ce460208501612c57565b9150604084013590509250925092565b60008083601f840112612d0657600080fd5b5081356001600160401b03811115612d1d57600080fd5b6020830191508360208260051b850101111561125f57600080fd5b600080600060408486031215612d4d57600080fd5b83356001600160401b03811115612d6357600080fd5b612d6f86828701612cf4565b909790965060209590950135949350505050565b60008060408385031215612d9657600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b0380841115612dd557612dd5612da5565b604051601f8501601f19908116603f01168101908282118183101715612dfd57612dfd612da5565b81604052809350858152868686011115612e1657600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612e4257600080fd5b81356001600160401b03811115612e5857600080fd5b8201601f81018413612e6957600080fd5b61230f84823560208401612dbb565b60008060008060408587031215612e8e57600080fd5b84356001600160401b0380821115612ea557600080fd5b612eb188838901612cf4565b90965094506020870135915080821115612eca57600080fd5b50612ed787828801612cf4565b95989497509550505050565b80151581146113d357600080fd5b60008060408385031215612f0457600080fd5b612f0d83612c57565b91506020830135612f1d81612ee3565b809150509250929050565b60008060008060808587031215612f3e57600080fd5b612f4785612c57565b9350612f5560208601612c57565b92506040850135915060608501356001600160401b03811115612f7757600080fd5b8501601f81018713612f8857600080fd5b612f9787823560208401612dbb565b91505092959194509250565b60008060408385031215612fb657600080fd5b612fbf83612c57565b9150612fcd60208401612c57565b90509250929050565b600181811c90821680612fea57607f821691505b60208210810361300a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610ccf57610ccf613010565b602080825260169082015275151a194818dbdb9d1c9858dd081a5cc81c185d5cd95960521b604082015260600190565b8082028115828204841417610ccf57610ccf613010565b634e487b7160e01b600052601260045260246000fd5b6000826130a5576130a5613080565b500490565b601f821115610e5a57600081815260208120601f850160051c810160208610156130d15750805b601f850160051c820191505b818110156130f0578281556001016130dd565b505050505050565b81516001600160401b0381111561311157613111612da5565b6131258161311f8454612fd6565b846130aa565b602080601f83116001811461315a57600084156131425750858301515b600019600386901b1c1916600185901b1785556130f0565b600085815260208120601f198616915b828110156131895788860151825594840194600190910190840161316a565b50858210156131a75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156131c957600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b6000600182016131f8576131f8613010565b5060010190565b600080845461320d81612fd6565b60018281168015613225576001811461323a57613269565b60ff1984168752821515830287019450613269565b8860005260208060002060005b858110156132605781548a820152908401908201613247565b50505082870194505b50505050835161327d818360208801612bf4565b64173539b7b760d91b9101908152600501949350505050565b6000602082840312156132a857600080fd5b8151612bd481612ee3565b6000826132c2576132c2613080565b500690565b6000816132d6576132d6613010565b506000190190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061331190830184612c18565b9695505050505050565b60006020828403121561332d57600080fd5b8151612bd481612ba156fea26469706673582212201fb7eab9456f901b08bddcb3681ff6ab9c8b68ecb1f16db01601a9b50d00fc4e64736f6c634300081100330000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061041b5760003560e01c80636c0360eb1161021e578063a22cb46511610123578063d49479eb116100ab578063e985e9c51161007a578063e985e9c514610bf6578063ec9496ba14610c3f578063ef81b4d414610c5f578063f2c4ce1e14610c75578063f2fde38b14610c9557600080fd5b8063d49479eb14610b96578063dcc7eb3514610bb6578063e7b99ec714610bcb578063e8a3d48514610be157600080fd5b8063b13ca86b116100f2578063b13ca86b14610b0b578063b88d4fde14610b2b578063c87b56dd14610b4b578063cbbb93d714610b6b578063d00a82c514610b8057600080fd5b8063a22cb46514610a9f578063a7ccabdf14610abf578063ab53fcaa14610adf578063ae981f5114610af557600080fd5b80638429925c116101a65780638e228fb6116101755780638e228fb614610a2c578063938e3d7b14610a4257806395d89b4114610a625780639942b66914610a77578063a0712d6814610a8c57600080fd5b80638429925c146109b957806386bb9bfd146109cf5780638da5cb5b146109ee5780638dbb7c0614610a0c57600080fd5b806375c2dd90116101ed57806375c2dd901461091257806378a92380146109325780637a615afa1461095f57806381c4cede1461097f578063835d997e1461099957600080fd5b80636c0360eb146108b35780636cdfb419146108c857806370a08231146108dd578063715018a6146108fd57600080fd5b80633147fdaf116103245780634f6ccce7116102ac578063575104921161027b57806357510492146108375780635b8ad4291461084a5780635c975abb1461085f5780636352211e1461088057806367243482146108a057600080fd5b80634f6ccce7146107c757806351830227146107e757806355f804b31461080157806356aae60e1461082157600080fd5b806341ff5a9b116102f357806341ff5a9b1461072457806342842e0e14610744578063453afb0f1461076457806346e345c11461077a57806347ccca02146107a757600080fd5b80633147fdaf146106ae5780633ccfd60b146106da5780633de4daca146106e257806341f434341461070257600080fd5b80631015805b116103a757806323b872dd1161037657806323b872dd146105fc578063253894211461061c5780632904e6d91461063c5780632a55205a1461064f5780632f745c591461068e57600080fd5b80631015805b1461057757806318160ddd146105a45780631ba075bb146105b957806320984801146105cf57600080fd5b8063081c8c44116103ee578063081c8c44146104d1578063085e947c146104e6578063095ea7b31461052157806309c3219a146105415780630e58e5701461055757600080fd5b806301ffc9a71461042057806305973de61461045557806306fdde0314610477578063081812fc14610499575b600080fd5b34801561042c57600080fd5b5061044061043b366004612bb7565b610cb5565b60405190151581526020015b60405180910390f35b34801561046157600080fd5b50610475610470366004612bdb565b610cd5565b005b34801561048357600080fd5b5061048c610ce2565b60405161044c9190612c44565b3480156104a557600080fd5b506104b96104b4366004612bdb565b610d74565b6040516001600160a01b03909116815260200161044c565b3480156104dd57600080fd5b5061048c610db8565b3480156104f257600080fd5b50610513610501366004612c73565b60226020526000908152604090205481565b60405190815260200161044c565b34801561052d57600080fd5b5061047561053c366004612c8e565b610e46565b34801561054d57600080fd5b50610513601a5481565b34801561056357600080fd5b50610475610572366004612c73565b610e5f565b34801561058357600080fd5b50610513610592366004612c73565b601e6020526000908152604090205481565b3480156105b057600080fd5b50610513610e89565b3480156105c557600080fd5b5061051360195481565b3480156105db57600080fd5b506105136105ea366004612c73565b601d6020526000908152604090205481565b34801561060857600080fd5b50610475610617366004612cb8565b610ea8565b34801561062857600080fd5b50610475610637366004612bdb565b610ed3565b61047561064a366004612d38565b610ee0565b34801561065b57600080fd5b5061066f61066a366004612d83565b6111b8565b604080516001600160a01b03909316835260208301919091520161044c565b34801561069a57600080fd5b506105136106a9366004612c8e565b611266565b3480156106ba57600080fd5b506105136106c9366004612c73565b602080526000908152604090205481565b61047561135a565b3480156106ee57600080fd5b506104756106fd366004612bdb565b6113d6565b34801561070e57600080fd5b506104b96daaeb6d7670e522a718067333cd4e81565b34801561073057600080fd5b5061047561073f366004612bdb565b6113e3565b34801561075057600080fd5b5061047561075f366004612cb8565b6113f0565b34801561077057600080fd5b5061051360135481565b34801561078657600080fd5b50610513610795366004612c73565b60216020526000908152604090205481565b3480156107b357600080fd5b50600a546104b9906001600160a01b031681565b3480156107d357600080fd5b506105136107e2366004612bdb565b611415565b3480156107f357600080fd5b506011546104409060ff1681565b34801561080d57600080fd5b5061047561081c366004612e30565b6114be565b34801561082d57600080fd5b5061051360185481565b610475610845366004612bdb565b6114d6565b34801561085657600080fd5b506104756118b3565b34801561086b57600080fd5b50600f54610440906301000000900460ff1681565b34801561088c57600080fd5b506104b961089b366004612bdb565b6118e6565b6104756108ae366004612e78565b6118f8565b3480156108bf57600080fd5b5061048c6119bb565b3480156108d457600080fd5b506104756119c8565b3480156108e957600080fd5b506105136108f8366004612c73565b611a06565b34801561090957600080fd5b50610475611a54565b34801561091e57600080fd5b50600f546104409062010000900460ff1681565b34801561093e57600080fd5b5061051361094d366004612c73565b601f6020526000908152604090205481565b34801561096b57600080fd5b5061047561097a366004612bdb565b611a66565b34801561098b57600080fd5b50600f546104409060ff1681565b3480156109a557600080fd5b506104756109b4366004612bdb565b611a73565b3480156109c557600080fd5b5061051360175481565b3480156109db57600080fd5b50600f5461044090610100900460ff1681565b3480156109fa57600080fd5b506007546001600160a01b03166104b9565b348015610a1857600080fd5b50610475610a27366004612bdb565b611a80565b348015610a3857600080fd5b5061051360145481565b348015610a4e57600080fd5b50610475610a5d366004612e30565b611a8d565b348015610a6e57600080fd5b5061048c611aa1565b348015610a8357600080fd5b50610475611ab0565b610475610a9a366004612bdb565b611aea565b348015610aab57600080fd5b50610475610aba366004612ef1565b611d49565b348015610acb57600080fd5b50610475610ada366004612c73565b611d5d565b348015610aeb57600080fd5b5061051360155481565b348015610b0157600080fd5b5061051360165481565b348015610b1757600080fd5b50600b546104b9906001600160a01b031681565b348015610b3757600080fd5b50610475610b46366004612f28565b611d87565b348015610b5757600080fd5b5061048c610b66366004612bdb565b611dad565b348015610b7757600080fd5b50610475611ed2565b348015610b8c57600080fd5b50610513601b5481565b348015610ba257600080fd5b50610475610bb1366004612bdb565b611f14565b348015610bc257600080fd5b50610475611f21565b348015610bd757600080fd5b5061051360125481565b348015610bed57600080fd5b5061048c611f53565b348015610c0257600080fd5b50610440610c11366004612fa3565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610c4b57600080fd5b50610475610c5a366004612bdb565b611f60565b348015610c6b57600080fd5b50610513601c5481565b348015610c8157600080fd5b50610475610c90366004612e30565b611f6d565b348015610ca157600080fd5b50610475610cb0366004612c73565b611f81565b6000610cc082611ffd565b80610ccf5750610ccf82612068565b92915050565b610cdd61208d565b601455565b606060018054610cf190612fd6565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1d90612fd6565b8015610d6a5780601f10610d3f57610100808354040283529160200191610d6a565b820191906000526020600020905b815481529060010190602001808311610d4d57829003601f168201915b5050505050905090565b6000610d7f826120e7565b610d9c576040516333d1c03960e21b815260040160405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600d8054610dc590612fd6565b80601f0160208091040260200160405190810160405280929190818152602001828054610df190612fd6565b8015610e3e5780601f10610e1357610100808354040283529160200191610e3e565b820191906000526020600020905b815481529060010190602001808311610e2157829003601f168201915b505050505081565b81610e508161211b565b610e5a83836121d4565b505050565b610e6761208d565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160801b03600160801b82048116918116919091031690565b826001600160a01b0381163314610ec257610ec23361211b565b610ecd84848461225c565b50505050565b610edb61208d565b601c55565b60105481610eec610e89565b610ef69190613026565b1115610f425760405162461bcd60e51b8152602060048201526016602482015275139bdd08195b9bdd59da081d1bdad95b9cc81b19599d60521b60448201526064015b60405180910390fd5b600f546301000000900460ff1615610f6c5760405162461bcd60e51b8152600401610f3990613039565b600f54610100900460ff16610fbb5760405162461bcd60e51b81526020600482015260156024820152743bb434ba32b634b9ba1036b4b73a1034b99037b33360591b6044820152606401610f39565b601a5481601754610fcc9190613026565b111561101a5760405162461bcd60e51b815260206004820152601760248201527f57686974656c697374204c696d697420526561636865640000000000000000006044820152606401610f39565b601554336000908152601f6020908152604080832054601e90925290912054839161104491613026565b61104e9190613026565b11156110975760405162461bcd60e51b815260206004820152601860248201527714195c8815d85b1b195d08131a5b5a5d0814995858da195960421b6044820152606401610f39565b806012546110a59190613069565b3410156110e95760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610f39565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050611130848483601c54612267565b61116c5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210283937b7b360991b6044820152606401610f39565b6111763383612317565b816017546111849190613026565b601755336000908152601f60205260409020546111a2908390613026565b336000908152601f602052604090205550505050565b60008281526009602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b031692820192909252829161122d5750604080518082019091526008546001600160a01b0381168252600160a01b90046001600160601b031660208201525b60208101516000906127109061124c906001600160601b031687613069565b6112569190613096565b91519350909150505b9250929050565b600061127183611a06565b8210611290576040516306ed618760e11b815260040160405180910390fd5b600080546001600160801b03169080805b8381101561041b57600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615801592820192909252906113085750611352565b80516001600160a01b03161561131d57805192505b876001600160a01b0316836001600160a01b0316036113505786840361134957509350610ccf92505050565b6001909301925b505b6001016112a1565b61136261208d565b60006113766007546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d80600081146113c0576040519150601f19603f3d011682016040523d82523d6000602084013e6113c5565b606091505b50509050806113d357600080fd5b50565b6113de61208d565b601a55565b6113eb61208d565b601955565b826001600160a01b038116331461140a5761140a3361211b565b610ecd848484612331565b600080546001600160801b031681805b828110156114a457600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff1615159181018290529061149b578583036114945750949350505050565b6001909201915b50600101611425565b506040516329c8c00760e21b815260040160405180910390fd5b6114c661208d565b600c6114d282826130f8565b5050565b601054816114e2610e89565b6114ec9190613026565b11156115315760405162461bcd60e51b8152602060048201526014602482015273139bc8135bdc99481391951cc81d1bc8135a5b9d60621b6044820152606401610f39565b600f546301000000900460ff161561155b5760405162461bcd60e51b8152600401610f3990613039565b600f5462010000900460ff166115b35760405162461bcd60e51b815260206004820152601a60248201527f5370656369616c206d696e7420737461747573206973206f66660000000000006044820152606401610f39565b600a546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156115fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162091906131b7565b11806116965750600b546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611670573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169491906131b7565b115b6116e25760405162461bcd60e51b815260206004820152601860248201527f446f206e6f742068617665207370656369616c204e46547300000000000000006044820152606401610f39565b600a546040516370a0823160e01b81523360048201526001600160a01b03909116906370a0823190602401602060405180830381865afa15801561172a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174e91906131b7565b336000818152602160205260409081902092909255600b5491516370a0823160e01b815260048101919091526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156117ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d091906131b7565b33600090815260226020908152604080832084905560219091529020546117f79190613026565b33600090815260208080526040808320849055601d90915290205461181d908390613026565b111561182857600080fd5b806014546118369190613069565b34101561187b5760405162461bcd60e51b8152602060048201526013602482015272139bdd08115b9bdd59da081155120814d95b9d606a1b6044820152606401610f39565b6118853382612317565b336000908152601d60205260409020546118a0908290613026565b336000908152601d602052604090205550565b6118bb61208d565b60115460ff1615156000036118d9576011805460ff19166001179055565b6011805460ff191690555b565b60006118f18261234c565b5192915050565b61190061208d565b82811461194f5760405162461bcd60e51b815260206004820152601b60248201527f41697264726f70206461746120646f6573206e6f74206d6174636800000000006044820152606401610f39565b60005b838110156119b4576119a285858381811061196f5761196f6131d0565b90506020020160208101906119849190612c73565b848484818110611996576119966131d0565b90506020020135612317565b806119ac816131e6565b915050611952565b5050505050565b600c8054610dc590612fd6565b6119d061208d565b600f5462010000900460ff1615156000036119f857600f805462ff0000191662010000179055565b600f805462ff000019169055565b60006001600160a01b038216611a2f576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600460205260409020546001600160401b031690565b611a5c61208d565b6118e4600061246e565b611a6e61208d565b601b55565b611a7b61208d565b601555565b611a8861208d565b601355565b611a9561208d565b600e6114d282826130f8565b606060028054610cf190612fd6565b611ab861208d565b600f54610100900460ff161515600003611add57600f805461ff001916610100179055565b600f805461ff0019169055565b60105481611af6610e89565b611b009190613026565b1115611b455760405162461bcd60e51b8152602060048201526014602482015273139bc8135bdc99481391951cc81d1bc8135a5b9d60621b6044820152606401610f39565b6007546001600160a01b03163314611d3f57600f546301000000900460ff1615611b815760405162461bcd60e51b8152600401610f3990613039565b600f5460ff16611bd35760405162461bcd60e51b815260206004820152601960248201527f5075626c6963206d696e7420737461747573206973206f6666000000000000006044820152606401610f39565b60195481601654611be49190613026565b1115611c325760405162461bcd60e51b815260206004820152601960248201527f5075626c69632053616c65204c696d69742052656163686564000000000000006044820152606401610f39565b601554336000908152601f6020908152604080832054601e909252909120548391611c5c91613026565b611c669190613026565b1115611caf5760405162461bcd60e51b815260206004820152601860248201527714195c8815d85b1b195d08131a5b5a5d0814995858da195960421b6044820152606401610f39565b80601354611cbd9190613069565b341015611d025760405162461bcd60e51b8152602060048201526013602482015272139bdd08115b9bdd59da081155120814d95b9d606a1b6044820152606401610f39565b80601654611d109190613026565b601655336000908152601e6020526040902054611d2e908290613026565b336000908152601e60205260409020555b6113d33382612317565b81611d538161211b565b610e5a83836124c0565b611d6561208d565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b836001600160a01b0381163314611da157611da13361211b565b6119b485858585612555565b6060611db8826120e7565b611dd557604051630a14c4b560e41b815260040160405180910390fd5b60115460ff161515600003611e7657600d8054611df190612fd6565b80601f0160208091040260200160405190810160405280929190818152602001828054611e1d90612fd6565b8015611e6a5780601f10611e3f57610100808354040283529160200191611e6a565b820191906000526020600020905b815481529060010190602001808311611e4d57829003601f168201915b50505050509050919050565b600c8054611e8390612fd6565b9050600003611ea15760405180602001604052806000815250610ccf565b600c611eac83612589565b604051602001611ebd9291906131ff565b60405160208183030381529060405292915050565b611eda61208d565b600f546301000000900460ff161515600003611f0557600f805463ff00000019166301000000179055565b600f805463ff00000019169055565b611f1c61208d565b601255565b611f2961208d565b600f5460ff161515600003611f4757600f805460ff19166001179055565b600f805460ff19169055565b600e8054610dc590612fd6565b611f6861208d565b601055565b611f7561208d565b600d6114d282826130f8565b611f8961208d565b6001600160a01b038116611fee5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f39565b6113d38161246e565b3b151590565b60006001600160e01b031982166380ac58cd60e01b148061202e57506001600160e01b03198216635b5e139f60e01b145b8061204957506001600160e01b0319821663780e9d6360e01b145b80610ccf57506301ffc9a760e01b6001600160e01b0319831614610ccf565b60006001600160e01b0319821663152a902d60e11b1480610ccf5750610ccf82611ffd565b6007546001600160a01b031633146118e45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610f39565b600080546001600160801b031682108015610ccf575050600090815260036020526040902054600160e01b900460ff161590565b6daaeb6d7670e522a718067333cd4e3b156113d357604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015612188573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ac9190613296565b6113d357604051633b79c77360e21b81526001600160a01b0382166004820152602401610f39565b60006121df826118e6565b9050806001600160a01b0316836001600160a01b0316036122135760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061223357506122318133610c11565b155b15612251576040516367d9dca160e11b815260040160405180910390fd5b610e5a838383612694565b610e5a8383836126f0565b600082815b85811015612309576000878783818110612288576122886131d0565b9050602002013590508083116122c95760408051602081018590529081018290526060016040516020818303038152906040528051906020012092506122f6565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612301816131e6565b91505061226c565b50821490505b949350505050565b6114d282826040518060200160405280600081525061290a565b610e5a83838360405180602001604052806000815250611d87565b60408051606081018252600080825260208201819052918101829052905482906001600160801b031681101561245557600081815260036020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906124535780516001600160a01b0316156123ea579392505050565b5060001901600081815260036020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff161515928101929092521561244e579392505050565b6123ea565b505b604051636f96cda160e11b815260040160405180910390fd5b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b336001600160a01b038316036124e95760405163b06307db60e01b815260040160405180910390fd5b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6125608484846126f0565b61256c84848484612917565b610ecd576040516368d2bf6b60e11b815260040160405180910390fd5b6060816000036125b05750506040805180820190915260018152600360fc1b602082015290565b8160005b81156125da57806125c4816131e6565b91506125d39050600a83613096565b91506125b4565b6000816001600160401b038111156125f4576125f4612da5565b6040519080825280601f01601f19166020018201604052801561261e576020820181803683370190505b508593509050815b831561268b57612637600a856132b3565b612642906030613026565b60f81b8261264f836132c7565b92508281518110612662576126626131d0565b60200101906001600160f81b031916908160001a905350612684600a85613096565b9350612626565b50949350505050565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006126fb8261234c565b80519091506000906001600160a01b0316336001600160a01b03161480612729575081516127299033610c11565b8061274457503361273984610d74565b6001600160a01b0316145b90508061276457604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146127995760405162a1148160e81b815260040160405180910390fd5b6001600160a01b0384166127c057604051633a954ecd60e21b815260040160405180910390fd5b6127d06000848460000151612694565b6001600160a01b038581166000908152600460209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600390945282852080546001600160e01b031916909417600160a01b4290921691909102179092559086018083529120549091166128c3576000546001600160801b03168110156128c357825160008281526003602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119b4565b610e5a8383836001612a16565b60006001600160a01b0384163b15612a0e57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061295b9033908990889088906004016132de565b6020604051808303816000875af1925050508015612996575060408051601f3d908101601f191682019092526129939181019061331b565b60015b6129f4573d8080156129c4576040519150601f19603f3d011682016040523d82523d6000602084013e6129c9565b606091505b5080516000036129ec576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061230f565b50600161230f565b6000546001600160801b03166001600160a01b038516612a4857604051622e076360e81b815260040160405180910390fd5b83600003612a695760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260046020908152604080832080546001600160801b031981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c018116909202179091558584526003909252822080546001600160e01b031916909317600160a01b42909216919091021790915581905b85811015612b7b5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4838015612b515750612b4f6000888488612917565b155b15612b6f576040516368d2bf6b60e11b815260040160405180910390fd5b60019182019101612afa565b50600080546001600160801b0319166001600160801b03929092169190911790556119b4565b6001600160e01b0319811681146113d357600080fd5b600060208284031215612bc957600080fd5b8135612bd481612ba1565b9392505050565b600060208284031215612bed57600080fd5b5035919050565b60005b83811015612c0f578181015183820152602001612bf7565b50506000910152565b60008151808452612c30816020860160208601612bf4565b601f01601f19169290920160200192915050565b602081526000612bd46020830184612c18565b80356001600160a01b0381168114612c6e57600080fd5b919050565b600060208284031215612c8557600080fd5b612bd482612c57565b60008060408385031215612ca157600080fd5b612caa83612c57565b946020939093013593505050565b600080600060608486031215612ccd57600080fd5b612cd684612c57565b9250612ce460208501612c57565b9150604084013590509250925092565b60008083601f840112612d0657600080fd5b5081356001600160401b03811115612d1d57600080fd5b6020830191508360208260051b850101111561125f57600080fd5b600080600060408486031215612d4d57600080fd5b83356001600160401b03811115612d6357600080fd5b612d6f86828701612cf4565b909790965060209590950135949350505050565b60008060408385031215612d9657600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b0380841115612dd557612dd5612da5565b604051601f8501601f19908116603f01168101908282118183101715612dfd57612dfd612da5565b81604052809350858152868686011115612e1657600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612e4257600080fd5b81356001600160401b03811115612e5857600080fd5b8201601f81018413612e6957600080fd5b61230f84823560208401612dbb565b60008060008060408587031215612e8e57600080fd5b84356001600160401b0380821115612ea557600080fd5b612eb188838901612cf4565b90965094506020870135915080821115612eca57600080fd5b50612ed787828801612cf4565b95989497509550505050565b80151581146113d357600080fd5b60008060408385031215612f0457600080fd5b612f0d83612c57565b91506020830135612f1d81612ee3565b809150509250929050565b60008060008060808587031215612f3e57600080fd5b612f4785612c57565b9350612f5560208601612c57565b92506040850135915060608501356001600160401b03811115612f7757600080fd5b8501601f81018713612f8857600080fd5b612f9787823560208401612dbb565b91505092959194509250565b60008060408385031215612fb657600080fd5b612fbf83612c57565b9150612fcd60208401612c57565b90509250929050565b600181811c90821680612fea57607f821691505b60208210810361300a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610ccf57610ccf613010565b602080825260169082015275151a194818dbdb9d1c9858dd081a5cc81c185d5cd95960521b604082015260600190565b8082028115828204841417610ccf57610ccf613010565b634e487b7160e01b600052601260045260246000fd5b6000826130a5576130a5613080565b500490565b601f821115610e5a57600081815260208120601f850160051c810160208610156130d15750805b601f850160051c820191505b818110156130f0578281556001016130dd565b505050505050565b81516001600160401b0381111561311157613111612da5565b6131258161311f8454612fd6565b846130aa565b602080601f83116001811461315a57600084156131425750858301515b600019600386901b1c1916600185901b1785556130f0565b600085815260208120601f198616915b828110156131895788860151825594840194600190910190840161316a565b50858210156131a75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156131c957600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b6000600182016131f8576131f8613010565b5060010190565b600080845461320d81612fd6565b60018281168015613225576001811461323a57613269565b60ff1984168752821515830287019450613269565b8860005260208060002060005b858110156132605781548a820152908401908201613247565b50505082870194505b50505050835161327d818360208801612bf4565b64173539b7b760d91b9101908152600501949350505050565b6000602082840312156132a857600080fd5b8151612bd481612ee3565b6000826132c2576132c2613080565b500690565b6000816132d6576132d6613010565b506000190190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061331190830184612c18565b9695505050505050565b60006020828403121561332d57600080fd5b8151612bd481612ba156fea26469706673582212201fb7eab9456f901b08bddcb3681ff6ab9c8b68ecb1f16db01601a9b50d00fc4e64736f6c63430008110033

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

0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string):
Arg [1] : _initNotRevealedUri (string):
Arg [2] : _contractURI (string):

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

56377:10190:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62849:487;;;;;;;;;;-1:-1:-1;62849:487:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;62849:487:0;;;;;;;;65421:148;;;;;;;;;;-1:-1:-1;65421:148:0;;;;;:::i;:::-;;:::i;:::-;;42448:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;43959:204::-;;;;;;;;;;-1:-1:-1;43959:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;43959:204:0;1533:203:1;56585:28:0;;;;;;;;;;;;;:::i;57661:53::-;;;;;;;;;;-1:-1:-1;57661:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2256:25:1;;;2244:2;2229:18;57661:53:0;2110:177:1;62097:157:0;;;;;;;;;;-1:-1:-1;62097:157:0;;;;;:::i;:::-;;:::i;57249:33::-;;;;;;;;;;;;;;;;66447:108;;;;;;;;;;-1:-1:-1;66447:108:0;;;;;:::i;:::-;;:::i;57434:47::-;;;;;;;;;;-1:-1:-1;57434:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;37075:280;;;;;;;;;;;;;:::i;57206:36::-;;;;;;;;;;;;;;;;57381:45;;;;;;;;;;-1:-1:-1;57381:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;62262:163;;;;;;;;;;-1:-1:-1;62262:163:0;;;;;:::i;:::-;;:::i;64861:130::-;;;;;;;;;;-1:-1:-1;64861:130:0;;;;;:::i;:::-;;:::i;60630:900::-;;;;;;:::i;:::-;;:::i;24954:442::-;;;;;;;;;;-1:-1:-1;24954:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4396:32:1;;;4378:51;;4460:2;4445:18;;4438:34;;;;4351:18;24954:442:0;4204:274:1;38661:1105:0;;;;;;;;;;-1:-1:-1;38661:1105:0;;;;;:::i;:::-;;:::i;57540:52::-;;;;;;;;;;-1:-1:-1;57540:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;65002:155;;;:::i;65706:121::-;;;;;;;;;;-1:-1:-1;65706:121:0;;;;;:::i;:::-;;:::i;2902:143::-;;;;;;;;;;;;3002:42;2902:143;;65577:121;;;;;;;;;;-1:-1:-1;65577:121:0;;;;;:::i;:::-;;:::i;62433:171::-;;;;;;;;;;-1:-1:-1;62433:171:0;;;;;:::i;:::-;;:::i;56947:42::-;;;;;;;;;;;;;;;;57600:53;;;;;;;;;;-1:-1:-1;57600:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;56504:18;;;;;;;;;;-1:-1:-1;56504:18:0;;;;-1:-1:-1;;;;;56504:18:0;;;37648:713;;;;;;;;;;-1:-1:-1;37648:713:0;;;;;:::i;:::-;;:::i;56866:27::-;;;;;;;;;;-1:-1:-1;56866:27:0;;;;;;;;66224:103;;;;;;;;;;-1:-1:-1;66224:103:0;;;;;:::i;:::-;;:::i;57163:34::-;;;;;;;;;;;;;;;;59560:1029;;;;;;:::i;:::-;;:::i;63545:177::-;;;;;;;;;;;;;:::i;56789:26::-;;;;;;;;;;-1:-1:-1;56789:26:0;;;;;;;;;;;42257:124;;;;;;;;;;-1:-1:-1;42257:124:0;;;;;:::i;:::-;;:::i;58308:311::-;;;;;;:::i;:::-;;:::i;56557:21::-;;;;;;;;;;;;;:::i;64365:223::-;;;;;;;;;;;;;:::i;40274:206::-;;;;;;;;;;-1:-1:-1;40274:206:0;;;;;:::i;:::-;;:::i;10928:103::-;;;;;;;;;;;;;:::i;56741:38::-;;;;;;;;;;-1:-1:-1;56741:38:0;;;;;;;;;;;57489:43;;;;;;;;;;-1:-1:-1;57489:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;65835:141;;;;;;;;;;-1:-1:-1;65835:141:0;;;;;:::i;:::-;;:::i;56654:37::-;;;;;;;;;;-1:-1:-1;56654:37:0;;;;;;;;65984:120;;;;;;;;;;-1:-1:-1;65984:120:0;;;;;:::i;:::-;;:::i;57127:29::-;;;;;;;;;;;;;;;;56698:33;;;;;;;;;;-1:-1:-1;56698:33:0;;;;;;;;;;;10280:87;;;;;;;;;;-1:-1:-1;10353:6:0;;-1:-1:-1;;;;;10353:6:0;10280:87;;65293:120;;;;;;;;;;-1:-1:-1;65293:120:0;;;;;:::i;:::-;;:::i;56996:46::-;;;;;;;;;;;;;;;;64737:114;;;;;;;;;;-1:-1:-1;64737:114:0;;;;;:::i;:::-;;:::i;42617:104::-;;;;;;;;;;;;;:::i;64152:204::-;;;;;;;;;;;;;:::i;58627:899::-;;;;;;:::i;:::-;;:::i;61913:176::-;;;;;;;;;;-1:-1:-1;61913:176:0;;;;;:::i;:::-;;:::i;66335:104::-;;;;;;;;;;-1:-1:-1;66335:104:0;;;;;:::i;:::-;;:::i;57049:33::-;;;;;;;;;;;;;;;;57091:29;;;;;;;;;;;;;;;;56529:19;;;;;;;;;;-1:-1:-1;56529:19:0;;;;-1:-1:-1;;;;;56529:19:0;;;62612:228;;;;;;;;;;-1:-1:-1;62612:228:0;;;;;:::i;:::-;;:::i;61540:365::-;;;;;;;;;;-1:-1:-1;61540:365:0;;;;;:::i;:::-;;:::i;63733:172::-;;;;;;;;;;;;;:::i;57289:40::-;;;;;;;;;;;;;;;;65165:116;;;;;;;;;;-1:-1:-1;65165:116:0;;;;;:::i;:::-;;:::i;63922:220::-;;;;;;;;;;;;;:::i;56902:38::-;;;;;;;;;;;;;;;;56620:25;;;;;;;;;;;;;:::i;44593:164::-;;;;;;;;;;-1:-1:-1;44593:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;44714:25:0;;;44690:4;44714:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;44593:164;66112:104;;;;;;;;;;-1:-1:-1;66112:104:0;;;;;:::i;:::-;;:::i;57342:30::-;;;;;;;;;;;;;;;;64597:126;;;;;;;;;;-1:-1:-1;64597:126:0;;;;;:::i;:::-;;:::i;11186:201::-;;;;;;;;;;-1:-1:-1;11186:201:0;;;;;:::i;:::-;;:::i;62849:487::-;62997:4;63235:38;63261:11;63235:25;:38::i;:::-;:93;;;;63290:38;63316:11;63290:25;:38::i;:::-;63215:113;62849:487;-1:-1:-1;;62849:487:0:o;65421:148::-;10166:13;:11;:13::i;:::-;65515:21:::1;:46:::0;65421:148::o;42448:100::-;42502:13;42535:5;42528:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42448:100;:::o;43959:204::-;44027:7;44052:16;44060:7;44052;:16::i;:::-;44047:64;;44077:34;;-1:-1:-1;;;44077:34:0;;;;;;;;;;;44047:64;-1:-1:-1;44131:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;44131:24:0;;43959:204::o;56585:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;62097:157::-;62193:8;4423:30;4444:8;4423:20;:30::i;:::-;62214:32:::1;62228:8;62238:7;62214:13;:32::i;:::-;62097:157:::0;;;:::o;66447:108::-;10166:13;:11;:13::i;:::-;66518:4:::1;:29:::0;;-1:-1:-1;;;;;;66518:29:0::1;-1:-1:-1::0;;;;;66518:29:0;;;::::1;::::0;;;::::1;::::0;;66447:108::o;37075:280::-;37128:7;37320:12;-1:-1:-1;;;;;;;;37320:12:0;;;;37304:13;;;:28;;;;37297:35;;37075:280::o;62262:163::-;62363:4;-1:-1:-1;;;;;4243:18:0;;4251:10;4243:18;4239:83;;4278:32;4299:10;4278:20;:32::i;:::-;62380:37:::1;62399:4;62405:2;62409:7;62380:18;:37::i;:::-;62262:163:::0;;;;:::o;64861:130::-;10166:13;:11;:13::i;:::-;64947:15:::1;:36:::0;64861:130::o;60630:900::-;60761:10;;60749:8;60733:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;60725:73;;;;-1:-1:-1;;;60725:73:0;;9360:2:1;60725:73:0;;;9342:21:1;9399:2;9379:18;;;9372:30;-1:-1:-1;;;9418:18:1;;;9411:52;9480:18;;60725:73:0;;;;;;;;;60818:6;;;;;;;60817:7;60809:42;;;;-1:-1:-1;;;60809:42:0;;;;;;;:::i;:::-;60870:14;;;;;;;60862:48;;;;-1:-1:-1;;;60862:48:0;;10062:2:1;60862:48:0;;;10044:21:1;10101:2;10081:18;;;10074:30;-1:-1:-1;;;10120:18:1;;;10113:51;10181:18;;60862:48:0;9860:345:1;60862:48:0;60958:14;;60946:8;60929:14;;:25;;;;:::i;:::-;:43;;60921:79;;;;-1:-1:-1;;;60921:79:0;;10412:2:1;60921:79:0;;;10394:21:1;10451:2;10431:18;;;10424:30;10490:25;10470:18;;;10463:53;10533:18;;60921:79:0;10210:347:1;60921:79:0;61081:14;;61055:10;61046:20;;;;:8;:20;;;;;;;;;61019:12;:24;;;;;;;61069:8;;61019:47;;;:::i;:::-;:58;;;;:::i;:::-;:76;;61011:113;;;;-1:-1:-1;;;61011:113:0;;10764:2:1;61011:113:0;;;10746:21:1;10803:2;10783:18;;;10776:30;-1:-1:-1;;;10822:18:1;;;10815:54;10886:18;;61011:113:0;10562:348:1;61011:113:0;61174:8;61158:13;;:24;;;;:::i;:::-;61145:9;:37;;61137:68;;;;-1:-1:-1;;;61137:68:0;;11290:2:1;61137:68:0;;;11272:21:1;11329:2;11309:18;;;11302:30;-1:-1:-1;;;11348:18:1;;;11341:48;11406:18;;61137:68:0;11088:342:1;61137:68:0;61243:28;;-1:-1:-1;;61260:10:0;11584:2:1;11580:15;11576:53;61243:28:0;;;11564:66:1;61218:12:0;;11646::1;;61243:28:0;;;;;;;;;;;;61233:39;;;;;;61218:54;;61291:47;61310:6;;61317:4;61322:15;;61291:18;:47::i;:::-;61283:72;;;;-1:-1:-1;;;61283:72:0;;11871:2:1;61283:72:0;;;11853:21:1;11910:2;11890:18;;;11883:30;-1:-1:-1;;;11929:18:1;;;11922:43;11982:18;;61283:72:0;11669:337:1;61283:72:0;61368:31;61378:10;61390:8;61368:9;:31::i;:::-;61444:8;61427:14;;:25;;;;:::i;:::-;61410:14;:42;61496:10;61487:20;;;;:8;:20;;;;;;:31;;61510:8;;61487:31;:::i;:::-;61473:10;61464:20;;;;:8;:20;;;;;:54;-1:-1:-1;;;;60630:900:0:o;24954:442::-;25051:7;25109:27;;;:17;:27;;;;;;;;25080:56;;;;;;;;;-1:-1:-1;;;;;25080:56:0;;;;;-1:-1:-1;;;25080:56:0;;;-1:-1:-1;;;;;25080:56:0;;;;;;;;25051:7;;25149:92;;-1:-1:-1;25200:29:0;;;;;;;;;25210:19;25200:29;-1:-1:-1;;;;;25200:29:0;;;;-1:-1:-1;;;25200:29:0;;-1:-1:-1;;;;;25200:29:0;;;;;25149:92;25291:23;;;;25253:21;;25762:5;;25278:36;;-1:-1:-1;;;;;25278:36:0;:10;:36;:::i;:::-;25277:58;;;;:::i;:::-;25356:16;;;-1:-1:-1;25253:82:0;;-1:-1:-1;;24954:442:0;;;;;;:::o;38661:1105::-;38750:7;38783:16;38793:5;38783:9;:16::i;:::-;38774:5;:25;38770:61;;38808:23;;-1:-1:-1;;;38808:23:0;;;;;;;;;;;38770:61;38842:22;38867:13;;-1:-1:-1;;;;;38867:13:0;;38842:22;;39117:557;39137:14;39133:1;:18;39117:557;;;39177:31;39211:14;;;:11;:14;;;;;;;;;39177:48;;;;;;;;;-1:-1:-1;;;;;39177:48:0;;;;-1:-1:-1;;;39177:48:0;;-1:-1:-1;;;;;39177:48:0;;;;;;;;-1:-1:-1;;;39177:48:0;;;;;;;;;;;;;;;;39244:73;;39289:8;;;39244:73;39339:14;;-1:-1:-1;;;;;39339:28:0;;39335:111;;39412:14;;;-1:-1:-1;39335:111:0;39489:5;-1:-1:-1;;;;;39468:26:0;:17;-1:-1:-1;;;;;39468:26:0;;39464:195;;39538:5;39523:11;:20;39519:85;;-1:-1:-1;39579:1:0;-1:-1:-1;39572:8:0;;-1:-1:-1;;;39572:8:0;39519:85;39626:13;;;;;39464:195;39158:516;39117:557;39153:3;;39117:557;;65002:155;10166:13;:11;:13::i;:::-;65059:9:::1;65082:7;10353:6:::0;;-1:-1:-1;;;;;10353:6:0;;10280:87;65082:7:::1;-1:-1:-1::0;;;;;65074:21:0::1;65103;65074:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65058:71;;;65144:4;65136:13;;;::::0;::::1;;65047:110;65002:155::o:0;65706:121::-;10166:13;:11;:13::i;:::-;65787:14:::1;:32:::0;65706:121::o;65577:::-;10166:13;:11;:13::i;:::-;65658:14:::1;:32:::0;65577:121::o;62433:171::-;62538:4;-1:-1:-1;;;;;4243:18:0;;4251:10;4243:18;4239:83;;4278:32;4299:10;4278:20;:32::i;:::-;62555:41:::1;62578:4;62584:2;62588:7;62555:22;:41::i;37648:713::-:0;37715:7;37760:13;;-1:-1:-1;;;;;37760:13:0;37715:7;;37974:328;37994:14;37990:1;:18;37974:328;;;38034:31;38068:14;;;:11;:14;;;;;;;;;38034:48;;;;;;;;;-1:-1:-1;;;;;38034:48:0;;;;-1:-1:-1;;;38034:48:0;;-1:-1:-1;;;;;38034:48:0;;;;;;;;-1:-1:-1;;;38034:48:0;;;;;;;;;;;;;;38101:186;;38166:5;38151:11;:20;38147:85;;-1:-1:-1;38207:1:0;37648:713;-1:-1:-1;;;;37648:713:0:o;38147:85::-;38254:13;;;;;38101:186;-1:-1:-1;38010:3:0;;37974:328;;;;38330:23;;-1:-1:-1;;;38330:23:0;;;;;;;;;;;66224:103;10166:13;:11;:13::i;:::-;66299:7:::1;:21;66309:11:::0;66299:7;:21:::1;:::i;:::-;;66224:103:::0;:::o;59560:1029::-;59664:10;;59652:8;59636:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;59628:70;;;;-1:-1:-1;;;59628:70:0;;14884:2:1;59628:70:0;;;14866:21:1;14923:2;14903:18;;;14896:30;-1:-1:-1;;;14942:18:1;;;14935:50;15002:18;;59628:70:0;14682:344:1;59628:70:0;59718:6;;;;;;;59717:7;59709:42;;;;-1:-1:-1;;;59709:42:0;;;;;;;:::i;:::-;59770:19;;;;;;;59762:58;;;;-1:-1:-1;;;59762:58:0;;15233:2:1;59762:58:0;;;15215:21:1;15272:2;15252:18;;;15245:30;15311:28;15291:18;;;15284:56;15357:18;;59762:58:0;15031:350:1;59762:58:0;59853:3;;:25;;-1:-1:-1;;;59853:25:0;;59867:10;59853:25;;;1679:51:1;59881:1:0;;-1:-1:-1;;;;;59853:3:0;;:13;;1652:18:1;;59853:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:29;:63;;;-1:-1:-1;59886:4:0;;:26;;-1:-1:-1;;;59886:26:0;;59901:10;59886:26;;;1679:51:1;59915:1:0;;-1:-1:-1;;;;;59886:4:0;;:14;;1652:18:1;;59886:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:30;59853:63;59845:100;;;;-1:-1:-1;;;59845:100:0;;15777:2:1;59845:100:0;;;15759:21:1;15816:2;15796:18;;;15789:30;15855:26;15835:18;;;15828:54;15899:18;;59845:100:0;15575:348:1;59845:100:0;59999:3;;:25;;-1:-1:-1;;;59999:25:0;;60013:10;59999:25;;;1679:51:1;-1:-1:-1;;;;;59999:3:0;;;;:13;;1652:18:1;;59999:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59985:10;59966:30;;;;:18;:30;;;;;;;:58;;;;60076:4;;:26;;-1:-1:-1;;;60076:26:0;;;;;1679:51:1;;;;-1:-1:-1;;;;;60076:4:0;;;;:14;;1652:18:1;;60076:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60062:10;60043:30;;;;:18;:30;;;;;;;;:59;;;60153:18;:30;;;;;;:63;;60043:59;60153:63;:::i;:::-;60139:10;60121:29;;;;:17;:29;;;;;;;:95;;;60245:10;:22;;;;;;:33;;60270:8;;60245:33;:::i;:::-;:66;;60237:75;;;;;;60377:8;60353:21;;:32;;;;:::i;:::-;60339:9;:47;;60331:79;;;;-1:-1:-1;;;60331:79:0;;16130:2:1;60331:79:0;;;16112:21:1;16169:2;16149:18;;;16142:30;-1:-1:-1;;;16188:18:1;;;16181:49;16247:18;;60331:79:0;15928:343:1;60331:79:0;60433:31;60443:10;60455:8;60433:9;:31::i;:::-;60519:10;60508:22;;;;:10;:22;;;;;;:33;;60533:8;;60508:33;:::i;:::-;60494:10;60483:22;;;;:10;:22;;;;;:58;-1:-1:-1;59560:1029:0:o;63545:177::-;10166:13;:11;:13::i;:::-;63610:8:::1;::::0;::::1;;:15;;:8;:15:::0;63607:108:::1;;63641:8;:15:::0;;-1:-1:-1;;63641:15:0::1;63652:4;63641:15;::::0;;63545:177::o;63607:108::-:1;63687:8;:16:::0;;-1:-1:-1;;63687:16:0::1;::::0;;63607:108:::1;63545:177::o:0;42257:124::-;42321:7;42348:20;42360:7;42348:11;:20::i;:::-;:25;;42257:124;-1:-1:-1;;42257:124:0:o;58308:311::-;10166:13;:11;:13::i;:::-;58431:34;;::::1;58423:74;;;::::0;-1:-1:-1;;;58423:74:0;;16478:2:1;58423:74:0::1;::::0;::::1;16460:21:1::0;16517:2;16497:18;;;16490:30;16556:29;16536:18;;;16529:57;16603:18;;58423:74:0::1;16276:351:1::0;58423:74:0::1;58514:9;58510:102;58529:19:::0;;::::1;58510:102;;;58565:35;58575:8;;58584:1;58575:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;58588:8;;58597:1;58588:11;;;;;;;:::i;:::-;;;;;;;58565:9;:35::i;:::-;58550:3:::0;::::1;::::0;::::1;:::i;:::-;;;;58510:102;;;;58308:311:::0;;;;:::o;56557:21::-;;;;;;;:::i;64365:223::-;10166:13;:11;:13::i;:::-;64444:19:::1;::::0;;;::::1;;;:26;;64465:5;64444:26:::0;64441:140:::1;;64485:19;:26:::0;;-1:-1:-1;;64485:26:0::1;::::0;::::1;::::0;;63545:177::o;64441:140::-:1;64542:19;:27:::0;;-1:-1:-1;;64542:27:0::1;::::0;;64365:223::o;40274:206::-;40338:7;-1:-1:-1;;;;;40362:19:0;;40358:60;;40390:28;;-1:-1:-1;;;40390:28:0;;;;;;;;;;;40358:60;-1:-1:-1;;;;;;40444:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;40444:27:0;;40274:206::o;10928:103::-;10166:13;:11;:13::i;:::-;10993:30:::1;11020:1;10993:18;:30::i;65835:141::-:0;10166:13;:11;:13::i;:::-;65926:19:::1;:42:::0;65835:141::o;65984:120::-;10166:13;:11;:13::i;:::-;66064:14:::1;:32:::0;65984:120::o;65293:::-;10166:13;:11;:13::i;:::-;65373:14:::1;:32:::0;65293:120::o;64737:114::-;10166:13;:11;:13::i;:::-;64817:11:::1;:26;64831:12:::0;64817:11;:26:::1;:::i;42617:104::-:0;42673:13;42706:7;42699:14;;;;;:::i;64152:204::-;10166:13;:11;:13::i;:::-;64226:14:::1;::::0;::::1;::::0;::::1;;;:21;;64242:5;64226:21:::0;64223:126:::1;;64263:14;:21:::0;;-1:-1:-1;;64263:21:0::1;;;::::0;;63545:177::o;64223:126::-:1;64315:14;:22:::0;;-1:-1:-1;;64315:22:0::1;::::0;;64152:204::o;58627:899::-;58722:10;;58710:8;58694:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;58686:70;;;;-1:-1:-1;;;58686:70:0;;14884:2:1;58686:70:0;;;14866:21:1;14923:2;14903:18;;;14896:30;-1:-1:-1;;;14942:18:1;;;14935:50;15002:18;;58686:70:0;14682:344:1;58686:70:0;10353:6;;-1:-1:-1;;;;;10353:6:0;58773:10;:21;58769:688;;58822:6;;;;;;;58821:7;58813:42;;;;-1:-1:-1;;;58813:42:0;;;;;;;:::i;:::-;58878:18;;;;58870:56;;;;-1:-1:-1;;;58870:56:0;;17106:2:1;58870:56:0;;;17088:21:1;17145:2;17125:18;;;17118:30;17184:27;17164:18;;;17157:55;17229:18;;58870:56:0;16904:349:1;58870:56:0;59001:14;;58989:8;58972:14;;:25;;;;:::i;:::-;:43;;58964:81;;;;-1:-1:-1;;;58964:81:0;;17460:2:1;58964:81:0;;;17442:21:1;17499:2;17479:18;;;17472:30;17538:27;17518:18;;;17511:55;17583:18;;58964:81:0;17258:349:1;58964:81:0;59130:14;;59104:10;59095:20;;;;:8;:20;;;;;;;;;59068:12;:24;;;;;;;59118:8;;59068:47;;;:::i;:::-;:58;;;;:::i;:::-;:76;;59060:113;;;;-1:-1:-1;;;59060:113:0;;10764:2:1;59060:113:0;;;10746:21:1;10803:2;10783:18;;;10776:30;-1:-1:-1;;;10822:18:1;;;10815:54;10886:18;;59060:113:0;10562:348:1;59060:113:0;59241:8;59224:14;;:25;;;;:::i;:::-;59210:9;:40;;59202:72;;;;-1:-1:-1;;;59202:72:0;;16130:2:1;59202:72:0;;;16112:21:1;16169:2;16149:18;;;16142:30;-1:-1:-1;;;16188:18:1;;;16181:49;16247:18;;59202:72:0;15928:343:1;59202:72:0;59325:8;59308:14;;:25;;;;:::i;:::-;59291:14;:42;59396:10;59383:24;;;;:12;:24;;;;;;:35;;59410:8;;59383:35;:::i;:::-;59369:10;59356:24;;;;:12;:24;;;;;:62;58769:688;59469:31;59479:10;59491:8;59469:9;:31::i;61913:176::-;62017:8;4423:30;4444:8;4423:20;:30::i;:::-;62038:43:::1;62062:8;62072;62038:23;:43::i;66335:104::-:0;10166:13;:11;:13::i;:::-;66404:3:::1;:27:::0;;-1:-1:-1;;;;;;66404:27:0::1;-1:-1:-1::0;;;;;66404:27:0;;;::::1;::::0;;;::::1;::::0;;66335:104::o;62612:228::-;62763:4;-1:-1:-1;;;;;4243:18:0;;4251:10;4243:18;4239:83;;4278:32;4299:10;4278:20;:32::i;:::-;62785:47:::1;62808:4;62814:2;62818:7;62827:4;62785:22;:47::i;61540:365::-:0;61613:13;61644:16;61652:7;61644;:16::i;:::-;61639:59;;61669:29;;-1:-1:-1;;;61669:29:0;;;;;;;;;;;61639:59;61714:8;;;;:17;;:8;:17;61711:66;;61751:14;61744:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61540:365;;;:::o;61711:66::-;61808:7;61802:21;;;;;:::i;:::-;;;61827:1;61802:26;:95;;;;;;;;;;;;;;;;;61855:7;61864:18;:7;:16;:18::i;:::-;61838:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61795:102;61540:365;-1:-1:-1;;61540:365:0:o;63733:172::-;10166:13;:11;:13::i;:::-;63799:6:::1;::::0;;;::::1;;;:13;;63807:5;63799:13:::0;63796:102:::1;;63828:6;:13:::0;;-1:-1:-1;;63828:13:0::1;::::0;::::1;::::0;;63545:177::o;63796:102::-:1;63872:6;:14:::0;;-1:-1:-1;;63872:14:0::1;::::0;;63733:172::o;65165:116::-;10166:13;:11;:13::i;:::-;65243::::1;:30:::0;65165:116::o;63922:220::-;10166:13;:11;:13::i;:::-;64000:18:::1;::::0;::::1;;:25;;:18;:25:::0;63997:138:::1;;64041:18;:25:::0;;-1:-1:-1;;64041:25:0::1;64062:4;64041:25;::::0;;63545:177::o;63997:138::-:1;64097:18;:26:::0;;-1:-1:-1;;64097:26:0::1;::::0;;63922:220::o;56620:25::-;;;;;;;:::i;66112:104::-;10166:13;:11;:13::i;:::-;66184:10:::1;:24:::0;66112:104::o;64597:126::-;10166:13;:11;:13::i;:::-;64683:14:::1;:32;64700:15:::0;64683:14;:32:::1;:::i;11186:201::-:0;10166:13;:11;:13::i;:::-;-1:-1:-1;;;;;11275:22:0;::::1;11267:73;;;::::0;-1:-1:-1;;;11267:73:0;;19006:2:1;11267:73:0::1;::::0;::::1;18988:21:1::0;19045:2;19025:18;;;19018:30;19084:34;19064:18;;;19057:62;-1:-1:-1;;;19135:18:1;;;19128:36;19181:19;;11267:73:0::1;18804:402:1::0;11267:73:0::1;11351:28;11370:8;11351:18;:28::i;12479:422::-:0;12846:20;12885:8;;;12479:422::o;39838:372::-;39940:4;-1:-1:-1;;;;;;39977:40:0;;-1:-1:-1;;;39977:40:0;;:105;;-1:-1:-1;;;;;;;40034:48:0;;-1:-1:-1;;;40034:48:0;39977:105;:172;;;-1:-1:-1;;;;;;;40099:50:0;;-1:-1:-1;;;40099:50:0;39977:172;:225;;;-1:-1:-1;;;;;;;;;;23282:40:0;;;40166:36;23173:157;24684:215;24786:4;-1:-1:-1;;;;;;24810:41:0;;-1:-1:-1;;;24810:41:0;;:81;;;24855:36;24879:11;24855:23;:36::i;10445:132::-;10353:6;;-1:-1:-1;;;;;10353:6:0;8810:10;10509:23;10501:68;;;;-1:-1:-1;;;10501:68:0;;19413:2:1;10501:68:0;;;19395:21:1;;;19432:18;;;19425:30;19491:34;19471:18;;;19464:62;19543:18;;10501:68:0;19211:356:1;45918:144:0;45975:4;46009:13;;-1:-1:-1;;;;;46009:13:0;45999:23;;:55;;;;-1:-1:-1;;46027:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;46027:27:0;;;;46026:28;;45918:144::o;4481:419::-;3002:42;4672:45;:49;4668:225;;4743:67;;-1:-1:-1;;;4743:67:0;;4794:4;4743:67;;;19784:34:1;-1:-1:-1;;;;;19854:15:1;;19834:18;;;19827:43;3002:42:0;;4743;;19719:18:1;;4743:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4738:144;;4838:28;;-1:-1:-1;;;4838:28:0;;-1:-1:-1;;;;;1697:32:1;;4838:28:0;;;1679:51:1;1652:18;;4838:28:0;1533:203:1;43514:379:0;43595:13;43611:24;43627:7;43611:15;:24::i;:::-;43595:40;;43656:5;-1:-1:-1;;;;;43650:11:0;:2;-1:-1:-1;;;;;43650:11:0;;43646:48;;43670:24;;-1:-1:-1;;;43670:24:0;;;;;;;;;;;43646:48;8810:10;-1:-1:-1;;;;;43711:21:0;;;;;;:63;;-1:-1:-1;43737:37:0;43754:5;8810:10;44593:164;:::i;43737:37::-;43736:38;43711:63;43707:138;;;43798:35;;-1:-1:-1;;;43798:35:0;;;;;;;;;;;43707:138;43857:28;43866:2;43870:7;43879:5;43857:8;:28::i;44824:170::-;44958:28;44968:4;44974:2;44978:7;44958:9;:28::i;6036:798::-;6129:4;6169;6129;6186:525;6206:16;;;6186:525;;;6244:20;6267:5;;6273:1;6267:8;;;;;;;:::i;:::-;;;;;;;6244:31;;6312:12;6296;:28;6292:408;;6449:44;;;;;;20288:19:1;;;20323:12;;;20316:28;;;20360:12;;6449:44:0;;;;;;;;;;;;6439:55;;;;;;6424:70;;6292:408;;;6639:44;;;;;;20288:19:1;;;20323:12;;;20316:28;;;20360:12;;6639:44:0;;;;;;;;;;;;6629:55;;;;;;6614:70;;6292:408;-1:-1:-1;6224:3:0;;;;:::i;:::-;;;;6186:525;;;-1:-1:-1;6806:20:0;;;-1:-1:-1;6036:798:0;;;;;;;:::o;46070:104::-;46139:27;46149:2;46153:8;46139:27;;;;;;;;;;;;:9;:27::i;45065:185::-;45203:39;45220:4;45226:2;45230:7;45203:39;;;;;;;;;;;;:16;:39::i;41112:1083::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;41278:13:0;;41222:7;;-1:-1:-1;;;;;41278:13:0;41271:20;;41267:861;;;41312:31;41346:17;;;:11;:17;;;;;;;;;41312:51;;;;;;;;;-1:-1:-1;;;;;41312:51:0;;;;-1:-1:-1;;;41312:51:0;;-1:-1:-1;;;;;41312:51:0;;;;;;;;-1:-1:-1;;;41312:51:0;;;;;;;;;;;;;;41382:731;;41432:14;;-1:-1:-1;;;;;41432:28:0;;41428:101;;41496:9;41112:1083;-1:-1:-1;;;41112:1083:0:o;41428:101::-;-1:-1:-1;;;41873:6:0;41918:17;;;;:11;:17;;;;;;;;;41906:29;;;;;;;;;-1:-1:-1;;;;;41906:29:0;;;;;-1:-1:-1;;;41906:29:0;;-1:-1:-1;;;;;41906:29:0;;;;;;;;-1:-1:-1;;;41906:29:0;;;;;;;;;;;;;41966:28;41962:109;;42034:9;41112:1083;-1:-1:-1;;;41112:1083:0:o;41962:109::-;41833:261;;;41293:835;41267:861;42156:31;;-1:-1:-1;;;42156:31:0;;;;;;;;;;;11547:191;11640:6;;;-1:-1:-1;;;;;11657:17:0;;;-1:-1:-1;;;;;;11657:17:0;;;;;;;11690:40;;11640:6;;;11657:17;11640:6;;11690:40;;11621:16;;11690:40;11610:128;11547:191;:::o;44235:287::-;8810:10;-1:-1:-1;;;;;44334:24:0;;;44330:54;;44367:17;;-1:-1:-1;;;44367:17:0;;;;;;;;;;;44330:54;8810:10;44397:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;44397:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;44397:53:0;;;;;;;;;;44466:48;;540:41:1;;;44397:42:0;;8810:10;44466:48;;513:18:1;44466:48:0;;;;;;;44235:287;;:::o;45321:342::-;45488:28;45498:4;45504:2;45508:7;45488:9;:28::i;:::-;45532:48;45555:4;45561:2;45565:7;45574:5;45532:22;:48::i;:::-;45527:129;;45604:40;;-1:-1:-1;;;45604:40:0;;;;;;;;;;;7374:751;7430:13;7651:5;7660:1;7651:10;7647:53;;-1:-1:-1;;7678:10:0;;;;;;;;;;;;-1:-1:-1;;;7678:10:0;;;;;7374:751::o;7647:53::-;7725:5;7710:12;7766:78;7773:9;;7766:78;;7799:8;;;;:::i;:::-;;-1:-1:-1;7822:10:0;;-1:-1:-1;7830:2:0;7822:10;;:::i;:::-;;;7766:78;;;7854:19;7886:6;-1:-1:-1;;;;;7876:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7876:17:0;-1:-1:-1;7944:5:0;;-1:-1:-1;7854:39:0;-1:-1:-1;7920:6:0;7960:126;7967:9;;7960:126;;8037:9;8044:2;8037:4;:9;:::i;:::-;8024:23;;:2;:23;:::i;:::-;8011:38;;7993:6;8000:7;;;:::i;:::-;;;;7993:15;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;7993:56:0;;;;;;;;-1:-1:-1;8064:10:0;8072:2;8064:10;;:::i;:::-;;;7960:126;;;-1:-1:-1;8110:6:0;7374:751;-1:-1:-1;;;;7374:751:0:o;53134:196::-;53249:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;53249:29:0;-1:-1:-1;;;;;53249:29:0;;;;;;;;;53294:28;;53249:24;;53294:28;;;;;;;53134:196;;;:::o;48635:2112::-;48750:35;48788:20;48800:7;48788:11;:20::i;:::-;48863:18;;48750:58;;-1:-1:-1;48821:22:0;;-1:-1:-1;;;;;48847:34:0;8810:10;-1:-1:-1;;;;;48847:34:0;;:101;;;-1:-1:-1;48915:18:0;;48898:50;;8810:10;44593:164;:::i;48898:50::-;48847:154;;;-1:-1:-1;8810:10:0;48965:20;48977:7;48965:11;:20::i;:::-;-1:-1:-1;;;;;48965:36:0;;48847:154;48821:181;;49020:17;49015:66;;49046:35;;-1:-1:-1;;;49046:35:0;;;;;;;;;;;49015:66;49118:4;-1:-1:-1;;;;;49096:26:0;:13;:18;;;-1:-1:-1;;;;;49096:26:0;;49092:67;;49131:28;;-1:-1:-1;;;49131:28:0;;;;;;;;;;;49092:67;-1:-1:-1;;;;;49174:16:0;;49170:52;;49199:23;;-1:-1:-1;;;49199:23:0;;;;;;;;;;;49170:52;49343:49;49360:1;49364:7;49373:13;:18;;;49343:8;:49::i;:::-;-1:-1:-1;;;;;49688:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;49688:31:0;;;-1:-1:-1;;;;;49688:31:0;;;-1:-1:-1;;49688:31:0;;;;;;;49734:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;49734:29:0;;;;;;;;;;;49780:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;49825:61:0;;;;-1:-1:-1;;;49870:15:0;49825:61;;;;;;;;;;;50160:11;;;50190:24;;;;;:29;50160:11;;50190:29;50186:445;;50415:13;;-1:-1:-1;;;;;50415:13:0;50401:27;;50397:219;;;50485:18;;;50453:24;;;:11;:24;;;;;;;;:50;;50568:28;;;;-1:-1:-1;;;;;50526:70:0;-1:-1:-1;;;50526:70:0;-1:-1:-1;;;;;;50526:70:0;;;-1:-1:-1;;;;;50453:50:0;;;50526:70;;;;;;;50397:219;49663:979;50678:7;50674:2;-1:-1:-1;;;;;50659:27:0;50668:4;-1:-1:-1;;;;;50659:27:0;;;;;;;;;;;50697:42;62262:163;46537;46660:32;46666:2;46670:8;46680:5;46687:4;46660:5;:32::i;53895:790::-;54050:4;-1:-1:-1;;;;;54071:13:0;;12846:20;12885:8;54067:611;;54107:72;;-1:-1:-1;;;54107:72:0;;-1:-1:-1;;;;;54107:36:0;;;;;:72;;8810:10;;54158:4;;54164:7;;54173:5;;54107:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54107:72:0;;;;;;;;-1:-1:-1;;54107:72:0;;;;;;;;;;;;:::i;:::-;;;54103:520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54353:6;:13;54370:1;54353:18;54349:259;;54403:40;;-1:-1:-1;;;54403:40:0;;;;;;;;;;;54349:259;54558:6;54552:13;54543:6;54539:2;54535:15;54528:38;54103:520;-1:-1:-1;;;;;;54230:55:0;-1:-1:-1;;;54230:55:0;;-1:-1:-1;54223:62:0;;54067:611;-1:-1:-1;54662:4:0;54655:11;;46959:1422;47098:20;47121:13;-1:-1:-1;;;;;47121:13:0;-1:-1:-1;;;;;47149:16:0;;47145:48;;47174:19;;-1:-1:-1;;;47174:19:0;;;;;;;;;;;47145:48;47208:8;47220:1;47208:13;47204:44;;47230:18;;-1:-1:-1;;;47230:18:0;;;;;;;;;;;47204:44;-1:-1:-1;;;;;47600:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;;;;;47659:49:0;;-1:-1:-1;;;;;47600:44:0;;;;;;;47659:49;;;;-1:-1:-1;;47600:44:0;;;;;;47659:49;;;;;;;;;;;;;;;;47725:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;47775:66:0;;;;-1:-1:-1;;;47825:15:0;47775:66;;;;;;;;;;;47725:25;;47910:328;47930:8;47926:1;:12;47910:328;;;47969:38;;47994:12;;-1:-1:-1;;;;;47969:38:0;;;47986:1;;47969:38;;47986:1;;47969:38;48030:4;:68;;;;;48039:59;48070:1;48074:2;48078:12;48092:5;48039:22;:59::i;:::-;48038:60;48030:68;48026:164;;;48130:40;;-1:-1:-1;;;48130:40:0;;;;;;;;;;;48026:164;48208:14;;;;;47940:3;47910:328;;;-1:-1:-1;48254:13:0;:37;;-1:-1:-1;;;;;;48254:37:0;-1:-1:-1;;;;;48254:37:0;;;;;;;;;;48313:60;62262:163;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:180::-;651:6;704:2;692:9;683:7;679:23;675:32;672:52;;;720:1;717;710:12;672:52;-1:-1:-1;743:23:1;;592:180;-1:-1:-1;592:180:1:o;777:250::-;862:1;872:113;886:6;883:1;880:13;872:113;;;962:11;;;956:18;943:11;;;936:39;908:2;901:10;872:113;;;-1:-1:-1;;1019:1:1;1001:16;;994:27;777:250::o;1032:271::-;1074:3;1112:5;1106:12;1139:6;1134:3;1127:19;1155:76;1224:6;1217:4;1212:3;1208:14;1201:4;1194:5;1190:16;1155:76;:::i;:::-;1285:2;1264:15;-1:-1:-1;;1260:29:1;1251:39;;;;1292:4;1247:50;;1032:271;-1:-1:-1;;1032:271:1:o;1308:220::-;1457:2;1446:9;1439:21;1420:4;1477:45;1518:2;1507:9;1503:18;1495:6;1477:45;:::i;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:186::-;1978:6;2031:2;2019:9;2010:7;2006:23;2002:32;1999:52;;;2047:1;2044;2037:12;1999:52;2070:29;2089:9;2070:29;:::i;2292:254::-;2360:6;2368;2421:2;2409:9;2400:7;2396:23;2392:32;2389:52;;;2437:1;2434;2427:12;2389:52;2460:29;2479:9;2460:29;:::i;:::-;2450:39;2536:2;2521:18;;;;2508:32;;-1:-1:-1;;;2292:254:1:o;2551:328::-;2628:6;2636;2644;2697:2;2685:9;2676:7;2672:23;2668:32;2665:52;;;2713:1;2710;2703:12;2665:52;2736:29;2755:9;2736:29;:::i;:::-;2726:39;;2784:38;2818:2;2807:9;2803:18;2784:38;:::i;:::-;2774:48;;2869:2;2858:9;2854:18;2841:32;2831:42;;2551:328;;;;;:::o;3069:367::-;3132:8;3142:6;3196:3;3189:4;3181:6;3177:17;3173:27;3163:55;;3214:1;3211;3204:12;3163:55;-1:-1:-1;3237:20:1;;-1:-1:-1;;;;;3269:30:1;;3266:50;;;3312:1;3309;3302:12;3266:50;3349:4;3341:6;3337:17;3325:29;;3409:3;3402:4;3392:6;3389:1;3385:14;3377:6;3373:27;3369:38;3366:47;3363:67;;;3426:1;3423;3416:12;3441:505;3536:6;3544;3552;3605:2;3593:9;3584:7;3580:23;3576:32;3573:52;;;3621:1;3618;3611:12;3573:52;3661:9;3648:23;-1:-1:-1;;;;;3686:6:1;3683:30;3680:50;;;3726:1;3723;3716:12;3680:50;3765:70;3827:7;3818:6;3807:9;3803:22;3765:70;:::i;:::-;3854:8;;3739:96;;-1:-1:-1;3936:2:1;3921:18;;;;3908:32;;3441:505;-1:-1:-1;;;;3441:505:1:o;3951:248::-;4019:6;4027;4080:2;4068:9;4059:7;4055:23;4051:32;4048:52;;;4096:1;4093;4086:12;4048:52;-1:-1:-1;;4119:23:1;;;4189:2;4174:18;;;4161:32;;-1:-1:-1;3951:248:1:o;4946:127::-;5007:10;5002:3;4998:20;4995:1;4988:31;5038:4;5035:1;5028:15;5062:4;5059:1;5052:15;5078:632;5143:5;-1:-1:-1;;;;;5214:2:1;5206:6;5203:14;5200:40;;;5220:18;;:::i;:::-;5295:2;5289:9;5263:2;5349:15;;-1:-1:-1;;5345:24:1;;;5371:2;5341:33;5337:42;5325:55;;;5395:18;;;5415:22;;;5392:46;5389:72;;;5441:18;;:::i;:::-;5481:10;5477:2;5470:22;5510:6;5501:15;;5540:6;5532;5525:22;5580:3;5571:6;5566:3;5562:16;5559:25;5556:45;;;5597:1;5594;5587:12;5556:45;5647:6;5642:3;5635:4;5627:6;5623:17;5610:44;5702:1;5695:4;5686:6;5678;5674:19;5670:30;5663:41;;;;5078:632;;;;;:::o;5715:451::-;5784:6;5837:2;5825:9;5816:7;5812:23;5808:32;5805:52;;;5853:1;5850;5843:12;5805:52;5893:9;5880:23;-1:-1:-1;;;;;5918:6:1;5915:30;5912:50;;;5958:1;5955;5948:12;5912:50;5981:22;;6034:4;6026:13;;6022:27;-1:-1:-1;6012:55:1;;6063:1;6060;6053:12;6012:55;6086:74;6152:7;6147:2;6134:16;6129:2;6125;6121:11;6086:74;:::i;6171:773::-;6293:6;6301;6309;6317;6370:2;6358:9;6349:7;6345:23;6341:32;6338:52;;;6386:1;6383;6376:12;6338:52;6426:9;6413:23;-1:-1:-1;;;;;6496:2:1;6488:6;6485:14;6482:34;;;6512:1;6509;6502:12;6482:34;6551:70;6613:7;6604:6;6593:9;6589:22;6551:70;:::i;:::-;6640:8;;-1:-1:-1;6525:96:1;-1:-1:-1;6728:2:1;6713:18;;6700:32;;-1:-1:-1;6744:16:1;;;6741:36;;;6773:1;6770;6763:12;6741:36;;6812:72;6876:7;6865:8;6854:9;6850:24;6812:72;:::i;:::-;6171:773;;;;-1:-1:-1;6903:8:1;-1:-1:-1;;;;6171:773:1:o;6949:118::-;7035:5;7028:13;7021:21;7014:5;7011:32;7001:60;;7057:1;7054;7047:12;7072:315;7137:6;7145;7198:2;7186:9;7177:7;7173:23;7169:32;7166:52;;;7214:1;7211;7204:12;7166:52;7237:29;7256:9;7237:29;:::i;:::-;7227:39;;7316:2;7305:9;7301:18;7288:32;7329:28;7351:5;7329:28;:::i;:::-;7376:5;7366:15;;;7072:315;;;;;:::o;7392:667::-;7487:6;7495;7503;7511;7564:3;7552:9;7543:7;7539:23;7535:33;7532:53;;;7581:1;7578;7571:12;7532:53;7604:29;7623:9;7604:29;:::i;:::-;7594:39;;7652:38;7686:2;7675:9;7671:18;7652:38;:::i;:::-;7642:48;;7737:2;7726:9;7722:18;7709:32;7699:42;;7792:2;7781:9;7777:18;7764:32;-1:-1:-1;;;;;7811:6:1;7808:30;7805:50;;;7851:1;7848;7841:12;7805:50;7874:22;;7927:4;7919:13;;7915:27;-1:-1:-1;7905:55:1;;7956:1;7953;7946:12;7905:55;7979:74;8045:7;8040:2;8027:16;8022:2;8018;8014:11;7979:74;:::i;:::-;7969:84;;;7392:667;;;;;;;:::o;8064:260::-;8132:6;8140;8193:2;8181:9;8172:7;8168:23;8164:32;8161:52;;;8209:1;8206;8199:12;8161:52;8232:29;8251:9;8232:29;:::i;:::-;8222:39;;8280:38;8314:2;8303:9;8299:18;8280:38;:::i;:::-;8270:48;;8064:260;;;;;:::o;8511:380::-;8590:1;8586:12;;;;8633;;;8654:61;;8708:4;8700:6;8696:17;8686:27;;8654:61;8761:2;8753:6;8750:14;8730:18;8727:38;8724:161;;8807:10;8802:3;8798:20;8795:1;8788:31;8842:4;8839:1;8832:15;8870:4;8867:1;8860:15;8724:161;;8511:380;;;:::o;8896:127::-;8957:10;8952:3;8948:20;8945:1;8938:31;8988:4;8985:1;8978:15;9012:4;9009:1;9002:15;9028:125;9093:9;;;9114:10;;;9111:36;;;9127:18;;:::i;9509:346::-;9711:2;9693:21;;;9750:2;9730:18;;;9723:30;-1:-1:-1;;;9784:2:1;9769:18;;9762:52;9846:2;9831:18;;9509:346::o;10915:168::-;10988:9;;;11019;;11036:15;;;11030:22;;11016:37;11006:71;;11057:18;;:::i;12011:127::-;12072:10;12067:3;12063:20;12060:1;12053:31;12103:4;12100:1;12093:15;12127:4;12124:1;12117:15;12143:120;12183:1;12209;12199:35;;12214:18;;:::i;:::-;-1:-1:-1;12248:9:1;;12143:120::o;12604:545::-;12706:2;12701:3;12698:11;12695:448;;;12742:1;12767:5;12763:2;12756:17;12812:4;12808:2;12798:19;12882:2;12870:10;12866:19;12863:1;12859:27;12853:4;12849:38;12918:4;12906:10;12903:20;12900:47;;;-1:-1:-1;12941:4:1;12900:47;12996:2;12991:3;12987:12;12984:1;12980:20;12974:4;12970:31;12960:41;;13051:82;13069:2;13062:5;13059:13;13051:82;;;13114:17;;;13095:1;13084:13;13051:82;;;13055:3;;;12604:545;;;:::o;13325:1352::-;13451:3;13445:10;-1:-1:-1;;;;;13470:6:1;13467:30;13464:56;;;13500:18;;:::i;:::-;13529:97;13619:6;13579:38;13611:4;13605:11;13579:38;:::i;:::-;13573:4;13529:97;:::i;:::-;13681:4;;13745:2;13734:14;;13762:1;13757:663;;;;14464:1;14481:6;14478:89;;;-1:-1:-1;14533:19:1;;;14527:26;14478:89;-1:-1:-1;;13282:1:1;13278:11;;;13274:24;13270:29;13260:40;13306:1;13302:11;;;13257:57;14580:81;;13727:944;;13757:663;12551:1;12544:14;;;12588:4;12575:18;;-1:-1:-1;;13793:20:1;;;13911:236;13925:7;13922:1;13919:14;13911:236;;;14014:19;;;14008:26;13993:42;;14106:27;;;;14074:1;14062:14;;;;13941:19;;13911:236;;;13915:3;14175:6;14166:7;14163:19;14160:201;;;14236:19;;;14230:26;-1:-1:-1;;14319:1:1;14315:14;;;14331:3;14311:24;14307:37;14303:42;14288:58;14273:74;;14160:201;-1:-1:-1;;;;;14407:1:1;14391:14;;;14387:22;14374:36;;-1:-1:-1;13325:1352:1:o;15386:184::-;15456:6;15509:2;15497:9;15488:7;15484:23;15480:32;15477:52;;;15525:1;15522;15515:12;15477:52;-1:-1:-1;15548:16:1;;15386:184;-1:-1:-1;15386:184:1:o;16632:127::-;16693:10;16688:3;16684:20;16681:1;16674:31;16724:4;16721:1;16714:15;16748:4;16745:1;16738:15;16764:135;16803:3;16824:17;;;16821:43;;16844:18;;:::i;:::-;-1:-1:-1;16891:1:1;16880:13;;16764:135::o;17612:1187::-;17889:3;17918:1;17951:6;17945:13;17981:36;18007:9;17981:36;:::i;:::-;18036:1;18053:18;;;18080:133;;;;18227:1;18222:356;;;;18046:532;;18080:133;-1:-1:-1;;18113:24:1;;18101:37;;18186:14;;18179:22;18167:35;;18158:45;;;-1:-1:-1;18080:133:1;;18222:356;18253:6;18250:1;18243:17;18283:4;18328:2;18325:1;18315:16;18353:1;18367:165;18381:6;18378:1;18375:13;18367:165;;;18459:14;;18446:11;;;18439:35;18502:16;;;;18396:10;;18367:165;;;18371:3;;;18561:6;18556:3;18552:16;18545:23;;18046:532;;;;;18609:6;18603:13;18625:68;18684:8;18679:3;18672:4;18664:6;18660:17;18625:68;:::i;:::-;-1:-1:-1;;;18715:18:1;;18742:22;;;18791:1;18780:13;;17612:1187;-1:-1:-1;;;;17612:1187:1:o;19881:245::-;19948:6;20001:2;19989:9;19980:7;19976:23;19972:32;19969:52;;;20017:1;20014;20007:12;19969:52;20049:9;20043:16;20068:28;20090:5;20068:28;:::i;20383:112::-;20415:1;20441;20431:35;;20446:18;;:::i;:::-;-1:-1:-1;20480:9:1;;20383:112::o;20500:136::-;20539:3;20567:5;20557:39;;20576:18;;:::i;:::-;-1:-1:-1;;;20612:18:1;;20500:136::o;20641:489::-;-1:-1:-1;;;;;20910:15:1;;;20892:34;;20962:15;;20957:2;20942:18;;20935:43;21009:2;20994:18;;20987:34;;;21057:3;21052:2;21037:18;;21030:31;;;20835:4;;21078:46;;21104:19;;21096:6;21078:46;:::i;:::-;21070:54;20641:489;-1:-1:-1;;;;;;20641:489:1:o;21135:249::-;21204:6;21257:2;21245:9;21236:7;21232:23;21228:32;21225:52;;;21273:1;21270;21263:12;21225:52;21305:9;21299:16;21324:30;21348:5;21324:30;:::i

Swarm Source

ipfs://1fb7eab9456f901b08bddcb3681ff6ab9c8b68ecb1f16db01601a9b50d00fc4e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.