ETH Price: $3,442.71 (-1.01%)
Gas: 3 Gwei

Token

Akyllers (Akyller)
 

Overview

Max Total Supply

4,444 Akyller

Holders

1,109

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
lazthe01.eth
Balance
1 Akyller
0x09846c9ed5d569b3c2429b03997ca9f7bc76393a
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

On the outskirts of Troy, on a dark night... Created by YC, 500 Founders, & renowned Painter, graffiti, and Digital Artist POPSITE. Welcome to the Den

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Akyllers

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
//AE THER 

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**t
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

    // File: @openzeppelin/contracts/security/ReentrancyGuard.sol


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

    pragma solidity ^0.8.0;

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

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

        uint256 private _status;

        constructor() {
            _status = _NOT_ENTERED;
        }

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

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

            _;

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

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


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

    pragma solidity ^0.8.0;

    /**
    * @dev These functions deal with verification of Merkle Trees proofs.
    *
    * The proofs can be generated using the JavaScript library
    * https://github.com/miguelmota/merkletreejs[merkletreejs].
    * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
    *
    * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
    */
    library MerkleProof {
        /**
        * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
        * defined by `root`. For this, a `proof` must be provided, containing
        * sibling hashes on the branch from the leaf to the root of the tree. Each
        * pair of leaves and each pair of pre-images are assumed to be sorted.
        */
        function verify(
            bytes32[] memory proof,
            bytes32 root,
            bytes32 leaf
        ) internal pure returns (bool) {
            return processProof(proof, leaf) == root;
        }

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

        function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
            assembly {
                mstore(0x00, a)
                mstore(0x20, b)
                value := keccak256(0x00, 0x40)
            }
        }
    }

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


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

    pragma solidity ^0.8.0;

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

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

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

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

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

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


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

    pragma solidity ^0.8.0;

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

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

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


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

    pragma solidity ^0.8.0;


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

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

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

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

        /**
        * @dev Throws if called by any account other than the owner.
        */
        modifier onlyOwner() {
            require(owner() == _msgSender(), "Ownable: caller is not the owner");
            _;
        }

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

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

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

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


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

    pragma solidity ^0.8.1;

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

            return account.code.length > 0;
        }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol


    // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

    // File: @openzeppelin/contracts/finance/PaymentSplitter.sol


    // OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol)


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


    // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

    pragma solidity ^0.8.0;

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

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


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

    pragma solidity ^0.8.0;

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

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


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

    pragma solidity ^0.8.0;


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

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


    // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

    pragma solidity ^0.8.0;


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

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

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

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

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

        /**
        * @dev Safely transfers `tokenId` token from `from` to `to`, 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: @openzeppelin/contracts/token/ERC721/extensions/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: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


    // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

    pragma solidity ^0.8.0;


    /**
    * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
    * @dev See https://eips.ethereum.org/EIPS/eip-721
    */
    interface IERC721Metadata is IERC721 {
        /**
        * @dev Returns the token collection name.
        */
        function name() external view returns (string memory);

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

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

    // File: erc721a/contracts/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 AuxQueryForZeroAddress();
    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 extension. Built to optimize for lower gas during batch mints.
    *
    * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
    *
    * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
    *
    * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
    */
    contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
        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;
            // For miscellaneous variable(s) pertaining to the address
            // (e.g. number of whitelist mint slots used).
            // If there are multiple variables, please pack them into a uint64.
            uint64 mintedInWhitelist;
        }

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

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

        // Token name
        string private _name;

        // Token symbol
        string private _symbol;

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

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

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

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

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

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

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

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

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

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

        /**
        * Returns the number of tokens minted by `owner`.
        */

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

        /**
        * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
        */
        function _getNumberMintedInWhitelist(address owner) public view returns (uint64) {
            if (owner == address(0)) revert AuxQueryForZeroAddress();
            return _addressData[owner].mintedInWhitelist;
        }

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

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

            unchecked {
                if (_startTokenId() <= curr && 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 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 override {
            if (operator == _msgSender()) revert ApproveToCaller();

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

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

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

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

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

        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.
        *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 > 1.8e19 (2**64) - 1
            // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
            unchecked {
                _addressData[to].balance += uint64(quantity);
                _addressData[to].numberMinted += uint64(quantity);

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

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

                if (safe && to.isContract()) {
                    do {
                        emit Transfer(address(0), to, updatedIndex);
                        if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                            revert TransferToNonERC721ReceiverImplementer();
                        }
                    } while (updatedIndex != end);
                    // Reentrancy protection
                    if (_currentIndex != startTokenId) revert();
                } else {
                    do {
                        emit Transfer(address(0), to, updatedIndex++);
                    } while (updatedIndex != end);
                }
                _currentIndex = updatedIndex;
            }
            _afterTokenTransfers(address(0), to, startTokenId, quantity);
        }
    
        /**
        * @dev 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**256.
            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**256.
            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 contract.
        *
        * @param from address representing the previous owner of the given token ID
        * @param to target address that will receive the tokens
        * @param tokenId uint256 ID of the token to be transferred
        * @param _data bytes optional data to send along with the call
        * @return bool whether the call correctly returned the expected magic value
        */
        function _checkContractOnERC721Received(
            address from,
            address to,
            uint256 tokenId,
            bytes memory _data
        ) private returns (bool) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert TransferToNonERC721ReceiverImplementer();
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        }

        /**
        * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
        * And also called before burning one token.
        *
        * startTokenId - the first token id to be transferred
        * quantity - the amount to be transferred
        *
        * Calling conditions:
        *
        * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
        * transferred to `to`.
        * - When `from` is zero, `tokenId` will be minted for `to`.
        * - When `to` is zero, `tokenId` will be burned by `from`.
        * - `from` and `to` are never both zero.
        */
        function _beforeTokenTransfers(
            address from,
            address to,
            uint256 startTokenId,
            uint256 quantity
        ) internal virtual {}

        /**
        * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
        * minting.
        * And also called after one token has been burned.
        *
        * startTokenId - the first token id to be transferred
        * quantity - the amount to be transferred
        *
        * Calling conditions:
        *
        * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
        * transferred to `to`.
        * - When `from` is zero, `tokenId` has been minted for `to`.
        * - When `to` is zero, `tokenId` has been burned by `from`.
        * - `from` and `to` are never both zero.
        */
        function _afterTokenTransfers(
            address from,
            address to,
            uint256 startTokenId,
            uint256 quantity
        ) internal virtual {}
    }

    // File: erc721a/contracts/extensions/ERC721ABurnable.sol


    // Creator: Chiru Labs

    pragma solidity ^0.8.4;



    /**
    * @title ERC721A Burnable Token
    * @dev ERC721A Token that can be irreversibly burned (destroyed).
    */
    abstract contract ERC721ABurnable is Context, ERC721A {

        /**
        * @dev Burns `tokenId`. See {ERC721A-_burn}.
        *
        * Requirements:
        *
        * - The caller must own `tokenId` or be an approved operator.
        */
        function burn(uint256 tokenId) public virtual {
            TokenOwnership memory prevOwnership = ownershipOf(tokenId);

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();

            _burn(tokenId);
        }
    }
    // File: contracts/MDMA.sol


    pragma solidity ^0.8.4;




    //AE THER   

    contract Akyllers is ERC721A, Ownable, ReentrancyGuard , ERC721ABurnable {

    using Strings for uint256;
    uint256 public constant  maxSupply = 4444; 
    bytes32 public merkleRoot;
    string public  baseUri; 
    string public  obscurumuri;

    string public extension;  
    uint256 public cost;  

    uint256 public maxperaddress; 
    uint256 public supplyLimit; 
    bool public paused = true;
    bool public whitelistMintEnabled = true;
    bool public revealed = false;
    string public constant provenance = "d05ad6c8d7fb2569b8fe8e4942e6d3591eb6cf5bc75bcbc691613b4143587526";
    uint256 public startingIndex;
    //mapping ID=>address => number of minted nfts  
    mapping(address => uint256) public addresstxs;
    uint256 phaseTag=0;
    
    constructor(
        string memory _Name,
        string memory _Symbol,
        uint256 _cost,
        uint256 _maxperaddress,
        uint256 _supplyLimit,
        bytes32 _merkleRoot,
        string memory _obscurumUri, 
        string memory _extension
    
    ) ERC721A(_Name, _Symbol) {
        // deploy the contract with the PWL parameters
        cost= _cost;
        maxperaddress = _maxperaddress;
        obscurumuri = _obscurumUri;
        extension = _extension;  
        merkleRoot = _merkleRoot;
        require(supplyLimit<=maxSupply);
        supplyLimit = _supplyLimit;
    }

    //resets the amount of nft bought from whitelisted suer if the phase changes
    function _startTokenId() internal pure override returns (uint256){
        return 1;
    }

    function validateGreaterThanZero(uint256 _value) public pure {
        require(_value>0, "amount cannot be zero");
    }

    function validateAmount(uint256 _mintAmount, uint256 maxAmount) public view{
        validateGreaterThanZero(_mintAmount);
        require(_totalMinted() + _mintAmount <= maxAmount, 'Max supply in this phase exceeded');  
    }


    function validatePrice(uint256 value, uint256 _mintAmount) public view{
        validateGreaterThanZero(_mintAmount); //va;idates mint amount 
        if(cost > 0) {require(value == cost * _mintAmount, 'Incorrect amount ');}
    }
    function validateNotPaused() public view{
        require(!paused, "Still In phase"); 
    }    
    function validateWhitelistState(bool state) public view {
        require(whitelistMintEnabled==state);
    }

    function validateMintPerAddress(address sender, uint256 _mintAmount, uint256 addressT, uint256 whitelistT) public {
        //Address tag is the the phase tag that address is in
        uint256 value = addressT;
        /*
            addresstxs[sender]  tracks both amount and phase tag 
            addresstxs[sender] =  1        0
                                amount   phaseTag
            amount = addresstxs[sender]/10
            phaseTag = addresstxs[sender]%10
        */
        //checks if the address tag is the same as phase tag 
        if( (value%10) !=whitelistT ) {
            //checks if the amount entered is greater than max per address then updates 
            require(_mintAmount<=maxperaddress,"wallet limit exceeded");
            addresstxs[sender]=(_mintAmount*10)+whitelistT;
        } else {
            require((value/10) + _mintAmount <= maxperaddress, 'wallet limit exceeded ');
            addresstxs[sender] += (_mintAmount*10);
        }
    }

    function Presalemint(uint256 _mintAmount, bytes32[] calldata _merkleProof) public payable nonReentrant {
        //verify that the supply is not exceeded by address in specifc whitelist phase
        validateAmount(_mintAmount, supplyLimit);
        validatePrice(msg.value, _mintAmount);
        // Verify whitelist requirements dont allow mints when public sale starts
        require(MerkleProof.verify(_merkleProof, merkleRoot, keccak256(abi.encodePacked(msg.sender))), 'Invalid proof!');
        //verify that minting is not paused
        validateNotPaused();
        //verify that the smart contract in the whitelist phase
        validateWhitelistState(true);
        //change the phase 
        validateMintPerAddress(msg.sender,_mintAmount, addresstxs[msg.sender], phaseTag);
        //minting 
        _safeMint(msg.sender, _mintAmount);
        
    }
    //Normal minting allows minting on public sale satisfyign the necessary conditions

    
    
    function Airdrop(uint256[] memory  _mintAmount, address[] memory   _receivers) public nonReentrant  onlyOwner {
        require(_mintAmount.length == _receivers.length, "Arrays need to be equal and respective");
        for(uint i = 0; i < _mintAmount.length;) {
            validateAmount(_mintAmount[i], maxSupply);
            _safeMint(_receivers[i], _mintAmount[i]);
            unchecked{i++;}
        }
    }

    //Normal minting allows minting on public sale satisfyign the necessary conditions
    function mint(uint256 _mintAmount) public payable  nonReentrant {
        //verifies that the amount minted is within address limits and within max supply
        validateAmount(_mintAmount, maxSupply);
        //verifies price compliance
        validatePrice(msg.value,_mintAmount);
        //verifies that smart contract is in Public state
        validateWhitelistState(false);
        //verifiesthat Public Minting is not paused
        validateNotPaused();
        //validate amount minted per address in public sale
        validateMintPerAddress(msg.sender,_mintAmount, addresstxs[msg.sender], phaseTag);
        //minting
        _safeMint(msg.sender, _mintAmount);
    } 

    // get multiple ids that a owner owns  excluding burned tokens  this function is for future off or on chain data gathering 
    function walletOfOwner(address _owner) public view returns (uint256[] memory) {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
        uint256 currentTokenId = _startTokenId();
        uint256 ownedTokenIndex = 0;
        address latestOwnerAddress;
        while (ownedTokenIndex < ownerTokenCount && currentTokenId <= _totalMinted() ) {
        TokenOwnership memory ownership = _ownerships[currentTokenId]; 
        if (!ownership.burned && ownership.addr != address(0)) {
            latestOwnerAddress = ownership.addr; 
        }
        if (latestOwnerAddress == _owner &&  !ownership.burned )  {
            ownedTokenIds[ownedTokenIndex] = currentTokenId;
            ownedTokenIndex++;
        }
        currentTokenId++;
        }
        return ownedTokenIds;
    }

    function tokenURI(uint256 _tokenId) public view override returns (string memory) {
        require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token');
        if (revealed == false) {return obscurumuri;}
        return bytes(baseUri).length > 0 ? string(abi.encodePacked(baseUri, _tokenId.toString(), extension)) : '';
    }

    // SETTERS DONE BY OWNER ONLY

    function setWhitelistPhase(bytes32 _merkleRoot, uint256 _maxperaddress, uint256 _supplyLimit, uint256 _price) external onlyOwner {
        require(_supplyLimit<=maxSupply);
        setMerkleRoot(_merkleRoot);           
        setMaxPerAddress(_maxperaddress);
        setPaused(true);
        setCost(_price);
        phaseTag +=1; // set a new phase on every call
        supplyLimit +=_supplyLimit; // set the total supply limit on the whitelist phase
    }

    
    function setPublicSalePhase(uint256 _maxperaddress, uint256 _price) external onlyOwner {
        setMaxPerAddress(_maxperaddress);
        setPaused(true);
        setCost(_price);
        phaseTag+=1;
        whitelistMintEnabled= false; 
    }
    function setSupplyLimit(uint256 _supplyLimit) public onlyOwner nonReentrant{
        supplyLimit = _supplyLimit;
    }
    function setCost(uint256 _cost) public onlyOwner nonReentrant {
        cost = _cost;
    } 

    function setMaxPerAddress(uint256 _maxperaddress) public onlyOwner nonReentrant {
        maxperaddress = _maxperaddress;
    }
    
    function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner nonReentrant {
        obscurumuri = _hiddenMetadataUri;
    }

    function setUri(string memory _uri) public onlyOwner nonReentrant {
        baseUri = _uri;
    }

    // should be set before any minting starts 
    function setPaused(bool choice) public onlyOwner nonReentrant { 
        paused = choice;
    }
    
    function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner nonReentrant {
        merkleRoot = _merkleRoot;
    }

    function reveal(bool state ) public onlyOwner nonReentrant{
        revealed=state;
    }

    function setStartingIndex() public  nonReentrant onlyOwner {
            require(startingIndex == 0, "Starting index is already set");
            startingIndex = uint256(keccak256(abi.encodePacked(
                block.timestamp + block.difficulty + block.gaslimit + block.number +
                uint256(keccak256(abi.encodePacked(block.coinbase))) / block.timestamp
            ))) % maxSupply;
    }
        // release address based on shares.
    function withdrawEth() external onlyOwner nonReentrant {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Transfer failed.");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_Name","type":"string"},{"internalType":"string","name":"_Symbol","type":"string"},{"internalType":"uint256","name":"_cost","type":"uint256"},{"internalType":"uint256","name":"_maxperaddress","type":"uint256"},{"internalType":"uint256","name":"_supplyLimit","type":"uint256"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"string","name":"_obscurumUri","type":"string"},{"internalType":"string","name":"_extension","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":"AuxQueryForZeroAddress","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"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":[{"internalType":"uint256[]","name":"_mintAmount","type":"uint256[]"},{"internalType":"address[]","name":"_receivers","type":"address[]"}],"name":"Airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"Presalemint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"_getNumberMintedInWhitelist","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addresstxs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"extension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxperaddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"obscurumuri","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":[],"name":"provenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxperaddress","type":"uint256"}],"name":"setMaxPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"choice","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxperaddress","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPublicSalePhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supplyLimit","type":"uint256"}],"name":"setSupplyLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"_maxperaddress","type":"uint256"},{"internalType":"uint256","name":"_supplyLimit","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setWhitelistPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supplyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"uint256","name":"maxAmount","type":"uint256"}],"name":"validateAmount","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"validateGreaterThanZero","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"uint256","name":"addressT","type":"uint256"},{"internalType":"uint256","name":"whitelistT","type":"uint256"}],"name":"validateMintPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"validateNotPaused","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"validatePrice","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"validateWhitelistState","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawEth","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526011805462ffffff191661010117905560006014553480156200002657600080fd5b506040516200359e3803806200359e83398101604081905262000049916200029d565b8751889088906200006290600290602085019062000140565b5080516200007890600390602084019062000140565b50506001600055506200008b33620000ee565b6001600955600e869055600f8590558151620000af90600c90602085019062000140565b508051620000c590600d90602084019062000140565b50600a83905560105461115c1015620000dd57600080fd5b50505060105550620003d092505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200014e906200037d565b90600052602060002090601f016020900481019282620001725760008555620001bd565b82601f106200018d57805160ff1916838001178555620001bd565b82800160010185558215620001bd579182015b82811115620001bd578251825591602001919060010190620001a0565b50620001cb929150620001cf565b5090565b5b80821115620001cb5760008155600101620001d0565b600082601f830112620001f857600080fd5b81516001600160401b0380821115620002155762000215620003ba565b604051601f8301601f19908116603f01168101908282118183101715620002405762000240620003ba565b816040528381526020925086838588010111156200025d57600080fd5b600091505b8382101562000281578582018301518183018401529082019062000262565b83821115620002935760008385830101525b9695505050505050565b600080600080600080600080610100898b031215620002bb57600080fd5b88516001600160401b0380821115620002d357600080fd5b620002e18c838d01620001e6565b995060208b0151915080821115620002f857600080fd5b620003068c838d01620001e6565b985060408b0151975060608b0151965060808b0151955060a08b0151945060c08b01519150808211156200033957600080fd5b620003478c838d01620001e6565b935060e08b01519150808211156200035e57600080fd5b506200036d8b828c01620001e6565b9150509295985092959890939650565b600181811c908216806200039257607f821691505b60208210811415620003b457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6131be80620003e06000396000f3fe6080604052600436106103505760003560e01c80636a2d6819116101c6578063a0712d68116100f7578063d5abeb0111610095578063e985e9c51161006f578063e985e9c51461095f578063e9866550146109a8578063f2fde38b146109bd578063fbc40186146109dd57600080fd5b8063d5abeb0114610914578063e93487f11461092a578063e97868a51461094a57600080fd5b8063a3b9f9ec116100d1578063a3b9f9ec1461089e578063b88d4fde146108be578063c87b56dd146108de578063cb774d47146108fe57600080fd5b8063a0712d6814610856578063a0ef91df14610869578063a22cb4651461087e57600080fd5b80638399d67d11610164578063940cd05b1161013e578063940cd05b146107ec57806395d89b411461080c5780639abc8320146108215780639b642de11461083657600080fd5b80638399d67d1461078e578063855dcb0c146107ae5780638da5cb5b146107ce57600080fd5b8063715018a6116101a0578063715018a6146107195780637bddd65b1461072e5780637cb647591461074e5780637dc776d11461076e57600080fd5b80636a2d6819146106a25780636caede3d146106da57806370a08231146106f957600080fd5b80632eb4a7ab116102a05780634fdd43cb1161023e5780635c975abb116102185780635c975abb146106335780635dbb3bac1461064d5780636352211e1461066d57806368e21ef91461068d57600080fd5b80634fdd43cb146105e0578063509ee7e414610600578063518302271461061357600080fd5b806342966c681161027a57806342966c6814610553578063438b63001461057357806344a0d68a146105a05780634def1dbf146105c057600080fd5b80632eb4a7ab146104fd578063361fab251461051357806342842e0e1461053357600080fd5b806316c38b3c1161030d5780631cea9746116102e75780631cea97461461049257806323b872dd146104b257806329c1de11146104d25780632d5537b0146104e857600080fd5b806316c38b3c1461043f57806318160ddd1461045f57806319d1997a1461047c57600080fd5b806301ffc9a71461035557806306fdde031461038a578063081812fc146103ac578063095ea7b3146103e45780630f7309e81461040657806313faede61461041b575b600080fd5b34801561036157600080fd5b50610375610370366004612c54565b610a0a565b60405190151581526020015b60405180910390f35b34801561039657600080fd5b5061039f610a5c565b6040516103819190612ef0565b3480156103b857600080fd5b506103cc6103c7366004612c09565b610aee565b6040516001600160a01b039091168152602001610381565b3480156103f057600080fd5b506104046103ff366004612acc565b610b32565b005b34801561041257600080fd5b5061039f610bc0565b34801561042757600080fd5b50610431600e5481565b604051908152602001610381565b34801561044b57600080fd5b5061040461045a366004612bee565b610bdc565b34801561046b57600080fd5b506001546000540360001901610431565b34801561048857600080fd5b5061043160105481565b34801561049e57600080fd5b506104046104ad366004612af6565b610c4a565b3480156104be57600080fd5b506104046104cd3660046129eb565b610d7a565b3480156104de57600080fd5b50610431600f5481565b3480156104f457600080fd5b5061039f610d85565b34801561050957600080fd5b50610431600a5481565b34801561051f57600080fd5b5061040461052e366004612c09565b610e13565b34801561053f57600080fd5b5061040461054e3660046129eb565b610e6a565b34801561055f57600080fd5b5061040461056e366004612c09565b610e85565b34801561057f57600080fd5b5061059361058e366004612996565b610f02565b6040516103819190612eac565b3480156105ac57600080fd5b506104046105bb366004612c09565b61105b565b3480156105cc57600080fd5b506104046105db366004612d54565b6110b2565b3480156105ec57600080fd5b506104046105fb366004612c8e565b61111f565b61040461060e366004612cd6565b61118d565b34801561061f57600080fd5b506011546103759062010000900460ff1681565b34801561063f57600080fd5b506011546103759060ff1681565b34801561065957600080fd5b50610404610668366004612d54565b6112c4565b34801561067957600080fd5b506103cc610688366004612c09565b611329565b34801561069957600080fd5b5061039f61133b565b3480156106ae57600080fd5b506106c26106bd366004612996565b611348565b6040516001600160401b039091168152602001610381565b3480156106e657600080fd5b5060115461037590610100900460ff1681565b34801561070557600080fd5b50610431610714366004612996565b61139d565b34801561072557600080fd5b506104046113eb565b34801561073a57600080fd5b50610404610749366004612c09565b611421565b34801561075a57600080fd5b50610404610769366004612c09565b611478565b34801561077a57600080fd5b50610404610789366004612bee565b6114cf565b34801561079a57600080fd5b506104046107a9366004612c09565b6114ed565b3480156107ba57600080fd5b506104046107c9366004612d54565b611535565b3480156107da57600080fd5b506008546001600160a01b03166103cc565b3480156107f857600080fd5b50610404610807366004612bee565b6115af565b34801561081857600080fd5b5061039f61161d565b34801561082d57600080fd5b5061039f61162c565b34801561084257600080fd5b50610404610851366004612c8e565b611639565b610404610864366004612c09565b61169e565b34801561087557600080fd5b5061040461171f565b34801561088a57600080fd5b50610404610899366004612aa2565b6117fc565b3480156108aa57600080fd5b506104046108b9366004612c22565b611892565b3480156108ca57600080fd5b506104046108d9366004612a27565b611927565b3480156108ea57600080fd5b5061039f6108f9366004612c09565b611978565b34801561090a57600080fd5b5061043160125481565b34801561092057600080fd5b5061043161115c81565b34801561093657600080fd5b50610404610945366004612b2f565b611ae8565b34801561095657600080fd5b50610404611c0f565b34801561096b57600080fd5b5061037561097a3660046129b8565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156109b457600080fd5b50610404611c53565b3480156109c957600080fd5b506104046109d8366004612996565b611da5565b3480156109e957600080fd5b506104316109f8366004612996565b60136020526000908152604090205481565b60006001600160e01b031982166380ac58cd60e01b1480610a3b57506001600160e01b03198216635b5e139f60e01b145b80610a5657506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060028054610a6b90613050565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9790613050565b8015610ae45780601f10610ab957610100808354040283529160200191610ae4565b820191906000526020600020905b815481529060010190602001808311610ac757829003601f168201915b5050505050905090565b6000610af982611e3d565b610b16576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610b3d82611329565b9050806001600160a01b0316836001600160a01b03161415610b725760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610b925750610b90813361097a565b155b15610bb0576040516367d9dca160e11b815260040160405180910390fd5b610bbb838383611e76565b505050565b6040518060600160405280604081526020016131296040913981565b6008546001600160a01b03163314610c0f5760405162461bcd60e51b8152600401610c0690612f03565b60405180910390fd5b60026009541415610c325760405162461bcd60e51b8152600401610c0690612f38565b6011805460ff19169115159190911790556001600955565b8181610c57600a836130a6565b14610cda57600f54841115610ca65760405162461bcd60e51b81526020600482015260156024820152741dd85b1b195d081b1a5b5a5d08195e18d959591959605a1b6044820152606401610c06565b81610cb285600a612fee565b610cbc9190612fc2565b6001600160a01b038616600090815260136020526040902055610d73565b600f5484610ce9600a84612fda565b610cf39190612fc2565b1115610d3a5760405162461bcd60e51b815260206004820152601660248201527503bb0b63632ba103634b6b4ba1032bc31b2b2b232b2160551b6044820152606401610c06565b610d4584600a612fee565b6001600160a01b03861660009081526013602052604081208054909190610d6d908490612fc2565b90915550505b5050505050565b610bbb838383611ed2565b600d8054610d9290613050565b80601f0160208091040260200160405190810160405280929190818152602001828054610dbe90613050565b8015610e0b5780601f10610de057610100808354040283529160200191610e0b565b820191906000526020600020905b815481529060010190602001808311610dee57829003601f168201915b505050505081565b6008546001600160a01b03163314610e3d5760405162461bcd60e51b8152600401610c0690612f03565b60026009541415610e605760405162461bcd60e51b8152600401610c0690612f38565b6010556001600955565b610bbb83838360405180602001604052806000815250611927565b6000610e90826120d1565b80519091506000906001600160a01b0316336001600160a01b03161480610ebe57508151610ebe903361097a565b80610ed9575033610ece84610aee565b6001600160a01b0316145b905080610ef957604051632ce44b5f60e11b815260040160405180910390fd5b610bbb836121f8565b60606000610f0f8361139d565b90506000816001600160401b03811115610f2b57610f2b6130fc565b604051908082528060200260200182016040528015610f54578160200160208202803683370190505b50905060016000805b8482108015610f725750600054600019018311155b1561105057600083815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161580159282018390529091610fdf575080516001600160a01b031615155b15610fe957805191505b876001600160a01b0316826001600160a01b031614801561100c57508060400151155b1561103d5783858481518110611024576110246130e6565b6020908102919091010152826110398161308b565b9350505b836110478161308b565b94505050610f5d565b509195945050505050565b6008546001600160a01b031633146110855760405162461bcd60e51b8152600401610c0690612f03565b600260095414156110a85760405162461bcd60e51b8152600401610c0690612f38565b600e556001600955565b6008546001600160a01b031633146110dc5760405162461bcd60e51b8152600401610c0690612f03565b6110e582611421565b6110ef6001610bdc565b6110f88161105b565b60016014600082825461110b9190612fc2565b90915550506011805461ff00191690555050565b6008546001600160a01b031633146111495760405162461bcd60e51b8152600401610c0690612f03565b6002600954141561116c5760405162461bcd60e51b8152600401610c0690612f38565b6002600955805161118490600c906020840190612801565b50506001600955565b600260095414156111b05760405162461bcd60e51b8152600401610c0690612f38565b60026009556010546111c3908490611535565b6111cd34846112c4565b61124282828080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600a546040516bffffffffffffffffffffffff193360601b166020820152909250603401905060405160208183030381529060405280519060200120612362565b61127f5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b6044820152606401610c06565b611287611c0f565b61129160016114cf565b336000818152601360205260409020546014546112b092918691610c4a565b6112ba3384612378565b5050600160095550565b6112cd816114ed565b600e54156113255780600e546112e39190612fee565b82146113255760405162461bcd60e51b8152602060048201526011602482015270024b731b7b93932b1ba1030b6b7bab73a1607d1b6044820152606401610c06565b5050565b6000611334826120d1565b5192915050565b600c8054610d9290613050565b60006001600160a01b0382166113715760405163561b93dd60e11b815260040160405180910390fd5b506001600160a01b0316600090815260056020526040902054600160c01b90046001600160401b031690565b60006001600160a01b0382166113c6576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146114155760405162461bcd60e51b8152600401610c0690612f03565b61141f6000612392565b565b6008546001600160a01b0316331461144b5760405162461bcd60e51b8152600401610c0690612f03565b6002600954141561146e5760405162461bcd60e51b8152600401610c0690612f38565b600f556001600955565b6008546001600160a01b031633146114a25760405162461bcd60e51b8152600401610c0690612f03565b600260095414156114c55760405162461bcd60e51b8152600401610c0690612f38565b600a556001600955565b60115460ff610100909104161515811515146114ea57600080fd5b50565b600081116114ea5760405162461bcd60e51b8152602060048201526015602482015274616d6f756e742063616e6e6f74206265207a65726f60581b6044820152606401610c06565b61153e826114ed565b808261154d6000546000190190565b6115579190612fc2565b11156113255760405162461bcd60e51b815260206004820152602160248201527f4d617820737570706c7920696e207468697320706861736520657863656564656044820152601960fa1b6064820152608401610c06565b6008546001600160a01b031633146115d95760405162461bcd60e51b8152600401610c0690612f03565b600260095414156115fc5760405162461bcd60e51b8152600401610c0690612f38565b60118054911515620100000262ff0000199092169190911790556001600955565b606060038054610a6b90613050565b600b8054610d9290613050565b6008546001600160a01b031633146116635760405162461bcd60e51b8152600401610c0690612f03565b600260095414156116865760405162461bcd60e51b8152600401610c0690612f38565b6002600955805161118490600b906020840190612801565b600260095414156116c15760405162461bcd60e51b8152600401610c0690612f38565b60026009556116d28161115c611535565b6116dc34826112c4565b6116e660006114cf565b6116ee611c0f565b3360008181526013602052604090205460145461170d92918491610c4a565b6117173382612378565b506001600955565b6008546001600160a01b031633146117495760405162461bcd60e51b8152600401610c0690612f03565b6002600954141561176c5760405162461bcd60e51b8152600401610c0690612f38565b6002600955604051600090339047908381818185875af1925050503d80600081146117b3576040519150601f19603f3d011682016040523d82523d6000602084013e6117b8565b606091505b50509050806117175760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610c06565b6001600160a01b0382163314156118265760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b031633146118bc5760405162461bcd60e51b8152600401610c0690612f03565b61115c8211156118cb57600080fd5b6118d484611478565b6118dd83611421565b6118e76001610bdc565b6118f08161105b565b6001601460008282546119039190612fc2565b92505081905550816010600082825461191c9190612fc2565b909155505050505050565b611932848484611ed2565b6001600160a01b0383163b151580156119545750611952848484846123e4565b155b15611972576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b606061198382611e3d565b6119e75760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610c06565b60115462010000900460ff16611a8957600c8054611a0490613050565b80601f0160208091040260200160405190810160405280929190818152602001828054611a3090613050565b8015611a7d5780601f10611a5257610100808354040283529160200191611a7d565b820191906000526020600020905b815481529060010190602001808311611a6057829003601f168201915b50505050509050919050565b6000600b8054611a9890613050565b905011611ab45760405180602001604052806000815250610a56565b600b611abf836124dc565b600d604051602001611ad393929190612e3c565b60405160208183030381529060405292915050565b60026009541415611b0b5760405162461bcd60e51b8152600401610c0690612f38565b60026009556008546001600160a01b03163314611b3a5760405162461bcd60e51b8152600401610c0690612f03565b8051825114611b9a5760405162461bcd60e51b815260206004820152602660248201527f417272617973206e65656420746f20626520657175616c20616e64207265737060448201526565637469766560d01b6064820152608401610c06565b60005b82518110156112ba57611bcb838281518110611bbb57611bbb6130e6565b602002602001015161115c611535565b611c07828281518110611be057611be06130e6565b6020026020010151848381518110611bfa57611bfa6130e6565b6020026020010151612378565b600101611b9d565b60115460ff161561141f5760405162461bcd60e51b815260206004820152600e60248201526d5374696c6c20496e20706861736560901b6044820152606401610c06565b60026009541415611c765760405162461bcd60e51b8152600401610c0690612f38565b60026009556008546001600160a01b03163314611ca55760405162461bcd60e51b8152600401610c0690612f03565b60125415611cf55760405162461bcd60e51b815260206004820152601d60248201527f5374617274696e6720696e64657820697320616c7265616479207365740000006044820152606401610c06565b6040516bffffffffffffffffffffffff194160601b16602082015261115c9042906034016040516020818303038152906040528051906020012060001c611d3c9190612fda565b4345611d484442612fc2565b611d529190612fc2565b611d5c9190612fc2565b611d669190612fc2565b604051602001611d7891815260200190565b6040516020818303038152906040528051906020012060001c611d9b91906130a6565b6012556001600955565b6008546001600160a01b03163314611dcf5760405162461bcd60e51b8152600401610c0690612f03565b6001600160a01b038116611e345760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c06565b6114ea81612392565b600081600111158015611e51575060005482105b8015610a56575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611edd826120d1565b80519091506000906001600160a01b0316336001600160a01b03161480611f0b57508151611f0b903361097a565b80611f26575033611f1b84610aee565b6001600160a01b0316145b905080611f4657604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b031614611f7b5760405162a1148160e81b815260040160405180910390fd5b6001600160a01b038416611fa257604051633a954ecd60e21b815260040160405180910390fd5b611fb26000848460000151611e76565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021790925590860180835291205490911661209c5760005481101561209c57825160008281526004602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b031660008051602061316983398151915260405160405180910390a4610d73565b60408051606081018252600080825260208201819052918101919091528180600111158015612101575060005481105b156121df57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906121dd5780516001600160a01b031615612174579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156121d8579392505050565b612174565b505b604051636f96cda160e11b815260040160405180910390fd5b6000612203826120d1565b90506122156000838360000151611e76565b80516001600160a01b039081166000908152600560209081526040808320805467ffffffffffffffff1981166001600160401b0391821660001901821617909155855185168452818420805467ffffffffffffffff60801b198116600160801b9182900484166001908101851690920217909155865188865260049094528285208054600160e01b9588166001600160e01b031990911617600160a01b42909416939093029290921760ff60e01b191693909317905590850180835291205490911661232c5760005481101561232c57815160008281526004602090815260409091208054918501516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b50805160405183916000916001600160a01b0390911690600080516020613169833981519152908390a450506001805481019055565b60008261236f85846125d9565b14949350505050565b61132582826040518060200160405280600081525061264d565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612419903390899088908890600401612e6f565b602060405180830381600087803b15801561243357600080fd5b505af1925050508015612463575060408051601f3d908101601f1916820190925261246091810190612c71565b60015b6124be573d808015612491576040519150601f19603f3d011682016040523d82523d6000602084013e612496565b606091505b5080516124b6576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816125005750506040805180820190915260018152600360fc1b602082015290565b8160005b811561252a57806125148161308b565b91506125239050600a83612fda565b9150612504565b6000816001600160401b03811115612544576125446130fc565b6040519080825280601f01601f19166020018201604052801561256e576020820181803683370190505b5090505b84156124d45761258360018361300d565b9150612590600a866130a6565b61259b906030612fc2565b60f81b8183815181106125b0576125b06130e6565b60200101906001600160f81b031916908160001a9053506125d2600a86612fda565b9450612572565b600081815b84518110156126455760008582815181106125fb576125fb6130e6565b602002602001015190508083116126215760008381526020829052604090209250612632565b600081815260208490526040902092505b508061263d8161308b565b9150506125de565b509392505050565b610bbb83838360016000546001600160a01b03851661267e57604051622e076360e81b815260040160405180910390fd5b8361269c5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561274d57506001600160a01b0387163b15155b156127c4575b60405182906001600160a01b03891690600090600080516020613169833981519152908290a461278c60008884806001019550886123e4565b6127a9576040516368d2bf6b60e11b815260040160405180910390fd5b808214156127535782600054146127bf57600080fd5b6127f8565b5b6040516001830192906001600160a01b03891690600090600080516020613169833981519152908290a4808214156127c5575b50600055610d73565b82805461280d90613050565b90600052602060002090601f01602090048101928261282f5760008555612875565b82601f1061284857805160ff1916838001178555612875565b82800160010185558215612875579182015b8281111561287557825182559160200191906001019061285a565b50612881929150612885565b5090565b5b808211156128815760008155600101612886565b60006001600160401b038311156128b3576128b36130fc565b6128c6601f8401601f1916602001612f6f565b90508281528383830111156128da57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461290857600080fd5b919050565b600082601f83011261291e57600080fd5b8135602061293361292e83612f9f565b612f6f565b80838252828201915082860187848660051b890101111561295357600080fd5b60005b8581101561297957612967826128f1565b84529284019290840190600101612956565b5090979650505050505050565b8035801515811461290857600080fd5b6000602082840312156129a857600080fd5b6129b1826128f1565b9392505050565b600080604083850312156129cb57600080fd5b6129d4836128f1565b91506129e2602084016128f1565b90509250929050565b600080600060608486031215612a0057600080fd5b612a09846128f1565b9250612a17602085016128f1565b9150604084013590509250925092565b60008060008060808587031215612a3d57600080fd5b612a46856128f1565b9350612a54602086016128f1565b92506040850135915060608501356001600160401b03811115612a7657600080fd5b8501601f81018713612a8757600080fd5b612a968782356020840161289a565b91505092959194509250565b60008060408385031215612ab557600080fd5b612abe836128f1565b91506129e260208401612986565b60008060408385031215612adf57600080fd5b612ae8836128f1565b946020939093013593505050565b60008060008060808587031215612b0c57600080fd5b612b15856128f1565b966020860135965060408601359560600135945092505050565b60008060408385031215612b4257600080fd5b82356001600160401b0380821115612b5957600080fd5b818501915085601f830112612b6d57600080fd5b81356020612b7d61292e83612f9f565b8083825282820191508286018a848660051b8901011115612b9d57600080fd5b600096505b84871015612bc0578035835260019690960195918301918301612ba2565b5096505086013592505080821115612bd757600080fd5b50612be48582860161290d565b9150509250929050565b600060208284031215612c0057600080fd5b6129b182612986565b600060208284031215612c1b57600080fd5b5035919050565b60008060008060808587031215612c3857600080fd5b5050823594602084013594506040840135936060013592509050565b600060208284031215612c6657600080fd5b81356129b181613112565b600060208284031215612c8357600080fd5b81516129b181613112565b600060208284031215612ca057600080fd5b81356001600160401b03811115612cb657600080fd5b8201601f81018413612cc757600080fd5b6124d48482356020840161289a565b600080600060408486031215612ceb57600080fd5b8335925060208401356001600160401b0380821115612d0957600080fd5b818601915086601f830112612d1d57600080fd5b813581811115612d2c57600080fd5b8760208260051b8501011115612d4157600080fd5b6020830194508093505050509250925092565b60008060408385031215612d6757600080fd5b50508035926020909101359150565b60008151808452612d8e816020860160208601613024565b601f01601f19169290920160200192915050565b8054600090600181811c9080831680612dbc57607f831692505b6020808410821415612dde57634e487b7160e01b600052602260045260246000fd5b818015612df25760018114612e0357612e30565b60ff19861689528489019650612e30565b60008881526020902060005b86811015612e285781548b820152908501908301612e0f565b505084890196505b50505050505092915050565b6000612e488286612da2565b8451612e58818360208901613024565b612e6481830186612da2565b979650505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612ea290830184612d76565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612ee457835183529284019291840191600101612ec8565b50909695505050505050565b6020815260006129b16020830184612d76565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b604051601f8201601f191681016001600160401b0381118282101715612f9757612f976130fc565b604052919050565b60006001600160401b03821115612fb857612fb86130fc565b5060051b60200190565b60008219821115612fd557612fd56130ba565b500190565b600082612fe957612fe96130d0565b500490565b6000816000190483118215151615613008576130086130ba565b500290565b60008282101561301f5761301f6130ba565b500390565b60005b8381101561303f578181015183820152602001613027565b838111156119725750506000910152565b600181811c9082168061306457607f821691505b6020821081141561308557634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561309f5761309f6130ba565b5060010190565b6000826130b5576130b56130d0565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146114ea57600080fdfe64303561643663386437666232353639623866653865343934326536643335393165623663663562633735626362633639313631336234313433353837353236ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212202a0922f73027f316a7a8426c0856aecdf7c7a7681d127bb8890ca34b232dd0ab64736f6c634300080700330000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000b1a2bc2ec500000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000012c1eb40863d2b4d5a5fbb97595919cfbfd75d4d0621d64ab493518e46c3fd1db17000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000008416b796c6c6572730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007416b796c6c6572000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d5257426772625552343533486b746d3177507a37566e6a42724844746642764e6454503978616541583641712f68696464656e2e6a736f6e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052e6a736f6e000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103505760003560e01c80636a2d6819116101c6578063a0712d68116100f7578063d5abeb0111610095578063e985e9c51161006f578063e985e9c51461095f578063e9866550146109a8578063f2fde38b146109bd578063fbc40186146109dd57600080fd5b8063d5abeb0114610914578063e93487f11461092a578063e97868a51461094a57600080fd5b8063a3b9f9ec116100d1578063a3b9f9ec1461089e578063b88d4fde146108be578063c87b56dd146108de578063cb774d47146108fe57600080fd5b8063a0712d6814610856578063a0ef91df14610869578063a22cb4651461087e57600080fd5b80638399d67d11610164578063940cd05b1161013e578063940cd05b146107ec57806395d89b411461080c5780639abc8320146108215780639b642de11461083657600080fd5b80638399d67d1461078e578063855dcb0c146107ae5780638da5cb5b146107ce57600080fd5b8063715018a6116101a0578063715018a6146107195780637bddd65b1461072e5780637cb647591461074e5780637dc776d11461076e57600080fd5b80636a2d6819146106a25780636caede3d146106da57806370a08231146106f957600080fd5b80632eb4a7ab116102a05780634fdd43cb1161023e5780635c975abb116102185780635c975abb146106335780635dbb3bac1461064d5780636352211e1461066d57806368e21ef91461068d57600080fd5b80634fdd43cb146105e0578063509ee7e414610600578063518302271461061357600080fd5b806342966c681161027a57806342966c6814610553578063438b63001461057357806344a0d68a146105a05780634def1dbf146105c057600080fd5b80632eb4a7ab146104fd578063361fab251461051357806342842e0e1461053357600080fd5b806316c38b3c1161030d5780631cea9746116102e75780631cea97461461049257806323b872dd146104b257806329c1de11146104d25780632d5537b0146104e857600080fd5b806316c38b3c1461043f57806318160ddd1461045f57806319d1997a1461047c57600080fd5b806301ffc9a71461035557806306fdde031461038a578063081812fc146103ac578063095ea7b3146103e45780630f7309e81461040657806313faede61461041b575b600080fd5b34801561036157600080fd5b50610375610370366004612c54565b610a0a565b60405190151581526020015b60405180910390f35b34801561039657600080fd5b5061039f610a5c565b6040516103819190612ef0565b3480156103b857600080fd5b506103cc6103c7366004612c09565b610aee565b6040516001600160a01b039091168152602001610381565b3480156103f057600080fd5b506104046103ff366004612acc565b610b32565b005b34801561041257600080fd5b5061039f610bc0565b34801561042757600080fd5b50610431600e5481565b604051908152602001610381565b34801561044b57600080fd5b5061040461045a366004612bee565b610bdc565b34801561046b57600080fd5b506001546000540360001901610431565b34801561048857600080fd5b5061043160105481565b34801561049e57600080fd5b506104046104ad366004612af6565b610c4a565b3480156104be57600080fd5b506104046104cd3660046129eb565b610d7a565b3480156104de57600080fd5b50610431600f5481565b3480156104f457600080fd5b5061039f610d85565b34801561050957600080fd5b50610431600a5481565b34801561051f57600080fd5b5061040461052e366004612c09565b610e13565b34801561053f57600080fd5b5061040461054e3660046129eb565b610e6a565b34801561055f57600080fd5b5061040461056e366004612c09565b610e85565b34801561057f57600080fd5b5061059361058e366004612996565b610f02565b6040516103819190612eac565b3480156105ac57600080fd5b506104046105bb366004612c09565b61105b565b3480156105cc57600080fd5b506104046105db366004612d54565b6110b2565b3480156105ec57600080fd5b506104046105fb366004612c8e565b61111f565b61040461060e366004612cd6565b61118d565b34801561061f57600080fd5b506011546103759062010000900460ff1681565b34801561063f57600080fd5b506011546103759060ff1681565b34801561065957600080fd5b50610404610668366004612d54565b6112c4565b34801561067957600080fd5b506103cc610688366004612c09565b611329565b34801561069957600080fd5b5061039f61133b565b3480156106ae57600080fd5b506106c26106bd366004612996565b611348565b6040516001600160401b039091168152602001610381565b3480156106e657600080fd5b5060115461037590610100900460ff1681565b34801561070557600080fd5b50610431610714366004612996565b61139d565b34801561072557600080fd5b506104046113eb565b34801561073a57600080fd5b50610404610749366004612c09565b611421565b34801561075a57600080fd5b50610404610769366004612c09565b611478565b34801561077a57600080fd5b50610404610789366004612bee565b6114cf565b34801561079a57600080fd5b506104046107a9366004612c09565b6114ed565b3480156107ba57600080fd5b506104046107c9366004612d54565b611535565b3480156107da57600080fd5b506008546001600160a01b03166103cc565b3480156107f857600080fd5b50610404610807366004612bee565b6115af565b34801561081857600080fd5b5061039f61161d565b34801561082d57600080fd5b5061039f61162c565b34801561084257600080fd5b50610404610851366004612c8e565b611639565b610404610864366004612c09565b61169e565b34801561087557600080fd5b5061040461171f565b34801561088a57600080fd5b50610404610899366004612aa2565b6117fc565b3480156108aa57600080fd5b506104046108b9366004612c22565b611892565b3480156108ca57600080fd5b506104046108d9366004612a27565b611927565b3480156108ea57600080fd5b5061039f6108f9366004612c09565b611978565b34801561090a57600080fd5b5061043160125481565b34801561092057600080fd5b5061043161115c81565b34801561093657600080fd5b50610404610945366004612b2f565b611ae8565b34801561095657600080fd5b50610404611c0f565b34801561096b57600080fd5b5061037561097a3660046129b8565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156109b457600080fd5b50610404611c53565b3480156109c957600080fd5b506104046109d8366004612996565b611da5565b3480156109e957600080fd5b506104316109f8366004612996565b60136020526000908152604090205481565b60006001600160e01b031982166380ac58cd60e01b1480610a3b57506001600160e01b03198216635b5e139f60e01b145b80610a5657506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060028054610a6b90613050565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9790613050565b8015610ae45780601f10610ab957610100808354040283529160200191610ae4565b820191906000526020600020905b815481529060010190602001808311610ac757829003601f168201915b5050505050905090565b6000610af982611e3d565b610b16576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610b3d82611329565b9050806001600160a01b0316836001600160a01b03161415610b725760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610b925750610b90813361097a565b155b15610bb0576040516367d9dca160e11b815260040160405180910390fd5b610bbb838383611e76565b505050565b6040518060600160405280604081526020016131296040913981565b6008546001600160a01b03163314610c0f5760405162461bcd60e51b8152600401610c0690612f03565b60405180910390fd5b60026009541415610c325760405162461bcd60e51b8152600401610c0690612f38565b6011805460ff19169115159190911790556001600955565b8181610c57600a836130a6565b14610cda57600f54841115610ca65760405162461bcd60e51b81526020600482015260156024820152741dd85b1b195d081b1a5b5a5d08195e18d959591959605a1b6044820152606401610c06565b81610cb285600a612fee565b610cbc9190612fc2565b6001600160a01b038616600090815260136020526040902055610d73565b600f5484610ce9600a84612fda565b610cf39190612fc2565b1115610d3a5760405162461bcd60e51b815260206004820152601660248201527503bb0b63632ba103634b6b4ba1032bc31b2b2b232b2160551b6044820152606401610c06565b610d4584600a612fee565b6001600160a01b03861660009081526013602052604081208054909190610d6d908490612fc2565b90915550505b5050505050565b610bbb838383611ed2565b600d8054610d9290613050565b80601f0160208091040260200160405190810160405280929190818152602001828054610dbe90613050565b8015610e0b5780601f10610de057610100808354040283529160200191610e0b565b820191906000526020600020905b815481529060010190602001808311610dee57829003601f168201915b505050505081565b6008546001600160a01b03163314610e3d5760405162461bcd60e51b8152600401610c0690612f03565b60026009541415610e605760405162461bcd60e51b8152600401610c0690612f38565b6010556001600955565b610bbb83838360405180602001604052806000815250611927565b6000610e90826120d1565b80519091506000906001600160a01b0316336001600160a01b03161480610ebe57508151610ebe903361097a565b80610ed9575033610ece84610aee565b6001600160a01b0316145b905080610ef957604051632ce44b5f60e11b815260040160405180910390fd5b610bbb836121f8565b60606000610f0f8361139d565b90506000816001600160401b03811115610f2b57610f2b6130fc565b604051908082528060200260200182016040528015610f54578160200160208202803683370190505b50905060016000805b8482108015610f725750600054600019018311155b1561105057600083815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161580159282018390529091610fdf575080516001600160a01b031615155b15610fe957805191505b876001600160a01b0316826001600160a01b031614801561100c57508060400151155b1561103d5783858481518110611024576110246130e6565b6020908102919091010152826110398161308b565b9350505b836110478161308b565b94505050610f5d565b509195945050505050565b6008546001600160a01b031633146110855760405162461bcd60e51b8152600401610c0690612f03565b600260095414156110a85760405162461bcd60e51b8152600401610c0690612f38565b600e556001600955565b6008546001600160a01b031633146110dc5760405162461bcd60e51b8152600401610c0690612f03565b6110e582611421565b6110ef6001610bdc565b6110f88161105b565b60016014600082825461110b9190612fc2565b90915550506011805461ff00191690555050565b6008546001600160a01b031633146111495760405162461bcd60e51b8152600401610c0690612f03565b6002600954141561116c5760405162461bcd60e51b8152600401610c0690612f38565b6002600955805161118490600c906020840190612801565b50506001600955565b600260095414156111b05760405162461bcd60e51b8152600401610c0690612f38565b60026009556010546111c3908490611535565b6111cd34846112c4565b61124282828080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600a546040516bffffffffffffffffffffffff193360601b166020820152909250603401905060405160208183030381529060405280519060200120612362565b61127f5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b6044820152606401610c06565b611287611c0f565b61129160016114cf565b336000818152601360205260409020546014546112b092918691610c4a565b6112ba3384612378565b5050600160095550565b6112cd816114ed565b600e54156113255780600e546112e39190612fee565b82146113255760405162461bcd60e51b8152602060048201526011602482015270024b731b7b93932b1ba1030b6b7bab73a1607d1b6044820152606401610c06565b5050565b6000611334826120d1565b5192915050565b600c8054610d9290613050565b60006001600160a01b0382166113715760405163561b93dd60e11b815260040160405180910390fd5b506001600160a01b0316600090815260056020526040902054600160c01b90046001600160401b031690565b60006001600160a01b0382166113c6576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b031633146114155760405162461bcd60e51b8152600401610c0690612f03565b61141f6000612392565b565b6008546001600160a01b0316331461144b5760405162461bcd60e51b8152600401610c0690612f03565b6002600954141561146e5760405162461bcd60e51b8152600401610c0690612f38565b600f556001600955565b6008546001600160a01b031633146114a25760405162461bcd60e51b8152600401610c0690612f03565b600260095414156114c55760405162461bcd60e51b8152600401610c0690612f38565b600a556001600955565b60115460ff610100909104161515811515146114ea57600080fd5b50565b600081116114ea5760405162461bcd60e51b8152602060048201526015602482015274616d6f756e742063616e6e6f74206265207a65726f60581b6044820152606401610c06565b61153e826114ed565b808261154d6000546000190190565b6115579190612fc2565b11156113255760405162461bcd60e51b815260206004820152602160248201527f4d617820737570706c7920696e207468697320706861736520657863656564656044820152601960fa1b6064820152608401610c06565b6008546001600160a01b031633146115d95760405162461bcd60e51b8152600401610c0690612f03565b600260095414156115fc5760405162461bcd60e51b8152600401610c0690612f38565b60118054911515620100000262ff0000199092169190911790556001600955565b606060038054610a6b90613050565b600b8054610d9290613050565b6008546001600160a01b031633146116635760405162461bcd60e51b8152600401610c0690612f03565b600260095414156116865760405162461bcd60e51b8152600401610c0690612f38565b6002600955805161118490600b906020840190612801565b600260095414156116c15760405162461bcd60e51b8152600401610c0690612f38565b60026009556116d28161115c611535565b6116dc34826112c4565b6116e660006114cf565b6116ee611c0f565b3360008181526013602052604090205460145461170d92918491610c4a565b6117173382612378565b506001600955565b6008546001600160a01b031633146117495760405162461bcd60e51b8152600401610c0690612f03565b6002600954141561176c5760405162461bcd60e51b8152600401610c0690612f38565b6002600955604051600090339047908381818185875af1925050503d80600081146117b3576040519150601f19603f3d011682016040523d82523d6000602084013e6117b8565b606091505b50509050806117175760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610c06565b6001600160a01b0382163314156118265760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b031633146118bc5760405162461bcd60e51b8152600401610c0690612f03565b61115c8211156118cb57600080fd5b6118d484611478565b6118dd83611421565b6118e76001610bdc565b6118f08161105b565b6001601460008282546119039190612fc2565b92505081905550816010600082825461191c9190612fc2565b909155505050505050565b611932848484611ed2565b6001600160a01b0383163b151580156119545750611952848484846123e4565b155b15611972576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b606061198382611e3d565b6119e75760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610c06565b60115462010000900460ff16611a8957600c8054611a0490613050565b80601f0160208091040260200160405190810160405280929190818152602001828054611a3090613050565b8015611a7d5780601f10611a5257610100808354040283529160200191611a7d565b820191906000526020600020905b815481529060010190602001808311611a6057829003601f168201915b50505050509050919050565b6000600b8054611a9890613050565b905011611ab45760405180602001604052806000815250610a56565b600b611abf836124dc565b600d604051602001611ad393929190612e3c565b60405160208183030381529060405292915050565b60026009541415611b0b5760405162461bcd60e51b8152600401610c0690612f38565b60026009556008546001600160a01b03163314611b3a5760405162461bcd60e51b8152600401610c0690612f03565b8051825114611b9a5760405162461bcd60e51b815260206004820152602660248201527f417272617973206e65656420746f20626520657175616c20616e64207265737060448201526565637469766560d01b6064820152608401610c06565b60005b82518110156112ba57611bcb838281518110611bbb57611bbb6130e6565b602002602001015161115c611535565b611c07828281518110611be057611be06130e6565b6020026020010151848381518110611bfa57611bfa6130e6565b6020026020010151612378565b600101611b9d565b60115460ff161561141f5760405162461bcd60e51b815260206004820152600e60248201526d5374696c6c20496e20706861736560901b6044820152606401610c06565b60026009541415611c765760405162461bcd60e51b8152600401610c0690612f38565b60026009556008546001600160a01b03163314611ca55760405162461bcd60e51b8152600401610c0690612f03565b60125415611cf55760405162461bcd60e51b815260206004820152601d60248201527f5374617274696e6720696e64657820697320616c7265616479207365740000006044820152606401610c06565b6040516bffffffffffffffffffffffff194160601b16602082015261115c9042906034016040516020818303038152906040528051906020012060001c611d3c9190612fda565b4345611d484442612fc2565b611d529190612fc2565b611d5c9190612fc2565b611d669190612fc2565b604051602001611d7891815260200190565b6040516020818303038152906040528051906020012060001c611d9b91906130a6565b6012556001600955565b6008546001600160a01b03163314611dcf5760405162461bcd60e51b8152600401610c0690612f03565b6001600160a01b038116611e345760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c06565b6114ea81612392565b600081600111158015611e51575060005482105b8015610a56575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611edd826120d1565b80519091506000906001600160a01b0316336001600160a01b03161480611f0b57508151611f0b903361097a565b80611f26575033611f1b84610aee565b6001600160a01b0316145b905080611f4657604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b031614611f7b5760405162a1148160e81b815260040160405180910390fd5b6001600160a01b038416611fa257604051633a954ecd60e21b815260040160405180910390fd5b611fb26000848460000151611e76565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021790925590860180835291205490911661209c5760005481101561209c57825160008281526004602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b031660008051602061316983398151915260405160405180910390a4610d73565b60408051606081018252600080825260208201819052918101919091528180600111158015612101575060005481105b156121df57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906121dd5780516001600160a01b031615612174579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156121d8579392505050565b612174565b505b604051636f96cda160e11b815260040160405180910390fd5b6000612203826120d1565b90506122156000838360000151611e76565b80516001600160a01b039081166000908152600560209081526040808320805467ffffffffffffffff1981166001600160401b0391821660001901821617909155855185168452818420805467ffffffffffffffff60801b198116600160801b9182900484166001908101851690920217909155865188865260049094528285208054600160e01b9588166001600160e01b031990911617600160a01b42909416939093029290921760ff60e01b191693909317905590850180835291205490911661232c5760005481101561232c57815160008281526004602090815260409091208054918501516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b50805160405183916000916001600160a01b0390911690600080516020613169833981519152908390a450506001805481019055565b60008261236f85846125d9565b14949350505050565b61132582826040518060200160405280600081525061264d565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612419903390899088908890600401612e6f565b602060405180830381600087803b15801561243357600080fd5b505af1925050508015612463575060408051601f3d908101601f1916820190925261246091810190612c71565b60015b6124be573d808015612491576040519150601f19603f3d011682016040523d82523d6000602084013e612496565b606091505b5080516124b6576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816125005750506040805180820190915260018152600360fc1b602082015290565b8160005b811561252a57806125148161308b565b91506125239050600a83612fda565b9150612504565b6000816001600160401b03811115612544576125446130fc565b6040519080825280601f01601f19166020018201604052801561256e576020820181803683370190505b5090505b84156124d45761258360018361300d565b9150612590600a866130a6565b61259b906030612fc2565b60f81b8183815181106125b0576125b06130e6565b60200101906001600160f81b031916908160001a9053506125d2600a86612fda565b9450612572565b600081815b84518110156126455760008582815181106125fb576125fb6130e6565b602002602001015190508083116126215760008381526020829052604090209250612632565b600081815260208490526040902092505b508061263d8161308b565b9150506125de565b509392505050565b610bbb83838360016000546001600160a01b03851661267e57604051622e076360e81b815260040160405180910390fd5b8361269c5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561274d57506001600160a01b0387163b15155b156127c4575b60405182906001600160a01b03891690600090600080516020613169833981519152908290a461278c60008884806001019550886123e4565b6127a9576040516368d2bf6b60e11b815260040160405180910390fd5b808214156127535782600054146127bf57600080fd5b6127f8565b5b6040516001830192906001600160a01b03891690600090600080516020613169833981519152908290a4808214156127c5575b50600055610d73565b82805461280d90613050565b90600052602060002090601f01602090048101928261282f5760008555612875565b82601f1061284857805160ff1916838001178555612875565b82800160010185558215612875579182015b8281111561287557825182559160200191906001019061285a565b50612881929150612885565b5090565b5b808211156128815760008155600101612886565b60006001600160401b038311156128b3576128b36130fc565b6128c6601f8401601f1916602001612f6f565b90508281528383830111156128da57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461290857600080fd5b919050565b600082601f83011261291e57600080fd5b8135602061293361292e83612f9f565b612f6f565b80838252828201915082860187848660051b890101111561295357600080fd5b60005b8581101561297957612967826128f1565b84529284019290840190600101612956565b5090979650505050505050565b8035801515811461290857600080fd5b6000602082840312156129a857600080fd5b6129b1826128f1565b9392505050565b600080604083850312156129cb57600080fd5b6129d4836128f1565b91506129e2602084016128f1565b90509250929050565b600080600060608486031215612a0057600080fd5b612a09846128f1565b9250612a17602085016128f1565b9150604084013590509250925092565b60008060008060808587031215612a3d57600080fd5b612a46856128f1565b9350612a54602086016128f1565b92506040850135915060608501356001600160401b03811115612a7657600080fd5b8501601f81018713612a8757600080fd5b612a968782356020840161289a565b91505092959194509250565b60008060408385031215612ab557600080fd5b612abe836128f1565b91506129e260208401612986565b60008060408385031215612adf57600080fd5b612ae8836128f1565b946020939093013593505050565b60008060008060808587031215612b0c57600080fd5b612b15856128f1565b966020860135965060408601359560600135945092505050565b60008060408385031215612b4257600080fd5b82356001600160401b0380821115612b5957600080fd5b818501915085601f830112612b6d57600080fd5b81356020612b7d61292e83612f9f565b8083825282820191508286018a848660051b8901011115612b9d57600080fd5b600096505b84871015612bc0578035835260019690960195918301918301612ba2565b5096505086013592505080821115612bd757600080fd5b50612be48582860161290d565b9150509250929050565b600060208284031215612c0057600080fd5b6129b182612986565b600060208284031215612c1b57600080fd5b5035919050565b60008060008060808587031215612c3857600080fd5b5050823594602084013594506040840135936060013592509050565b600060208284031215612c6657600080fd5b81356129b181613112565b600060208284031215612c8357600080fd5b81516129b181613112565b600060208284031215612ca057600080fd5b81356001600160401b03811115612cb657600080fd5b8201601f81018413612cc757600080fd5b6124d48482356020840161289a565b600080600060408486031215612ceb57600080fd5b8335925060208401356001600160401b0380821115612d0957600080fd5b818601915086601f830112612d1d57600080fd5b813581811115612d2c57600080fd5b8760208260051b8501011115612d4157600080fd5b6020830194508093505050509250925092565b60008060408385031215612d6757600080fd5b50508035926020909101359150565b60008151808452612d8e816020860160208601613024565b601f01601f19169290920160200192915050565b8054600090600181811c9080831680612dbc57607f831692505b6020808410821415612dde57634e487b7160e01b600052602260045260246000fd5b818015612df25760018114612e0357612e30565b60ff19861689528489019650612e30565b60008881526020902060005b86811015612e285781548b820152908501908301612e0f565b505084890196505b50505050505092915050565b6000612e488286612da2565b8451612e58818360208901613024565b612e6481830186612da2565b979650505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612ea290830184612d76565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612ee457835183529284019291840191600101612ec8565b50909695505050505050565b6020815260006129b16020830184612d76565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b604051601f8201601f191681016001600160401b0381118282101715612f9757612f976130fc565b604052919050565b60006001600160401b03821115612fb857612fb86130fc565b5060051b60200190565b60008219821115612fd557612fd56130ba565b500190565b600082612fe957612fe96130d0565b500490565b6000816000190483118215151615613008576130086130ba565b500290565b60008282101561301f5761301f6130ba565b500390565b60005b8381101561303f578181015183820152602001613027565b838111156119725750506000910152565b600181811c9082168061306457607f821691505b6020821081141561308557634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561309f5761309f6130ba565b5060010190565b6000826130b5576130b56130d0565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146114ea57600080fdfe64303561643663386437666232353639623866653865343934326536643335393165623663663562633735626362633639313631336234313433353837353236ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212202a0922f73027f316a7a8426c0856aecdf7c7a7681d127bb8890ca34b232dd0ab64736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000b1a2bc2ec500000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000012c1eb40863d2b4d5a5fbb97595919cfbfd75d4d0621d64ab493518e46c3fd1db17000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000008416b796c6c6572730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007416b796c6c6572000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d5257426772625552343533486b746d3177507a37566e6a42724844746642764e6454503978616541583641712f68696464656e2e6a736f6e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052e6a736f6e000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _Name (string): Akyllers
Arg [1] : _Symbol (string): Akyller
Arg [2] : _cost (uint256): 50000000000000000
Arg [3] : _maxperaddress (uint256): 3
Arg [4] : _supplyLimit (uint256): 300
Arg [5] : _merkleRoot (bytes32): 0x1eb40863d2b4d5a5fbb97595919cfbfd75d4d0621d64ab493518e46c3fd1db17
Arg [6] : _obscurumUri (string): ipfs://QmRWBgrbUR453Hktm1wPz7VnjBrHDtfBvNdTP9xaeAX6Aq/hidden.json
Arg [7] : _extension (string): .json

-----Encoded View---------------
18 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [2] : 00000000000000000000000000000000000000000000000000b1a2bc2ec50000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [4] : 000000000000000000000000000000000000000000000000000000000000012c
Arg [5] : 1eb40863d2b4d5a5fbb97595919cfbfd75d4d0621d64ab493518e46c3fd1db17
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000200
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [9] : 416b796c6c657273000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [11] : 416b796c6c657200000000000000000000000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000041
Arg [13] : 697066733a2f2f516d5257426772625552343533486b746d3177507a37566e6a
Arg [14] : 42724844746642764e6454503978616541583641712f68696464656e2e6a736f
Arg [15] : 6e00000000000000000000000000000000000000000000000000000000000000
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [17] : 2e6a736f6e000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

63355:9445:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43376:325;;;;;;;;;;-1:-1:-1;43376:325:0;;;;;:::i;:::-;;:::i;:::-;;;11912:14:1;;11905:22;11887:41;;11875:2;11860:18;43376:325:0;;;;;;;;46906:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;48553:216::-;;;;;;;;;;-1:-1:-1;48553:216:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;10573:32:1;;;10555:51;;10543:2;10528:18;48553:216:0;10409:203:1;48074:399:0;;;;;;;;;;-1:-1:-1;48074:399:0;;;;;:::i;:::-;;:::i;:::-;;63860:102;;;;;;;;;;;;;:::i;63647:19::-;;;;;;;;;;;;;;;;;;;12085:25:1;;;12073:2;12058:18;63647:19:0;11939:177:1;71813:97:0;;;;;;;;;;-1:-1:-1;71813:97:0;;;;;:::i;:::-;;:::i;42549:327::-;;;;;;;;;;-1:-1:-1;64929:1:0;42819:12;42593:7;42803:13;:28;-1:-1:-1;;42803:46:0;42549:327;;63713:26;;;;;;;;;;;;;;;;65778:1000;;;;;;;;;;-1:-1:-1;65778:1000:0;;;;;:::i;:::-;;:::i;49488:194::-;;;;;;;;;;-1:-1:-1;49488:194:0;;;;;:::i;:::-;;:::i;63677:28::-;;;;;;;;;;;;;;;;63615:23;;;;;;;;;;;;;:::i;63518:25::-;;;;;;;;;;;;;;;;71135:120;;;;;;;;;;-1:-1:-1;71135:120:0;;;;;:::i;:::-;;:::i;49767:209::-;;;;;;;;;;-1:-1:-1;49767:209:0;;;;;:::i;:::-;;:::i;62797:451::-;;;;;;;;;;-1:-1:-1;62797:451:0;;;;;:::i;:::-;;:::i;69121:874::-;;;;;;;;;;-1:-1:-1;69121:874:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;71261:93::-;;;;;;;;;;-1:-1:-1;71261:93:0;;;;;:::i;:::-;;:::i;70878:251::-;;;;;;;;;;-1:-1:-1;70878:251:0;;;;;:::i;:::-;;:::i;71504:145::-;;;;;;;;;;-1:-1:-1;71504:145:0;;;;;:::i;:::-;;:::i;66786:878::-;;;;;;:::i;:::-;;:::i;63825:28::-;;;;;;;;;;-1:-1:-1;63825:28:0;;;;;;;;;;;63747:25;;;;;;;;;;-1:-1:-1;63747:25:0;;;;;;;;65316:233;;;;;;;;;;-1:-1:-1;65316:233:0;;;;;:::i;:::-;;:::i;46693:132::-;;;;;;;;;;-1:-1:-1;46693:132:0;;;;;:::i;:::-;;:::i;63580:26::-;;;;;;;;;;;;;:::i;44546:223::-;;;;;;;;;;-1:-1:-1;44546:223:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;17828:31:1;;;17810:50;;17798:2;17783:18;44546:223:0;17666:200:1;63779:39:0;;;;;;;;;;-1:-1:-1;63779:39:0;;;;;;;;;;;43779:218;;;;;;;;;;-1:-1:-1;43779:218:0;;;;;:::i;:::-;;:::i;17492:111::-;;;;;;;;;;;;;:::i;71363:129::-;;;;;;;;;;-1:-1:-1;71363:129:0;;;;;:::i;:::-;;:::i;71922:117::-;;;;;;;;;;-1:-1:-1;71922:117:0;;;;;:::i;:::-;;:::i;65659:111::-;;;;;;;;;;-1:-1:-1;65659:111:0;;;;;:::i;:::-;;:::i;64946:122::-;;;;;;;;;;-1:-1:-1;64946:122:0;;;;;:::i;:::-;;:::i;65076:230::-;;;;;;;;;;-1:-1:-1;65076:230:0;;;;;:::i;:::-;;:::i;16781:95::-;;;;;;;;;;-1:-1:-1;16858:6:0;;-1:-1:-1;;;;;16858:6:0;16781:95;;72047:91;;;;;;;;;;-1:-1:-1;72047:91:0;;;;;:::i;:::-;;:::i;47097:112::-;;;;;;;;;;;;;:::i;63550:22::-;;;;;;;;;;;;;:::i;71657:99::-;;;;;;;;;;-1:-1:-1;71657:99:0;;;;;:::i;:::-;;:::i;68290:693::-;;;;;;:::i;:::-;;:::i;72608:189::-;;;;;;;;;;;;;:::i;48855:295::-;;;;;;;;;;-1:-1:-1;48855:295:0;;;;;:::i;:::-;;:::i;70395:469::-;;;;;;;;;;-1:-1:-1;70395:469:0;;;;;:::i;:::-;;:::i;50069:409::-;;;;;;;;;;-1:-1:-1;50069:409:0;;;;;:::i;:::-;;:::i;70003:347::-;;;;;;;;;;-1:-1:-1;70003:347:0;;;;;:::i;:::-;;:::i;63969:28::-;;;;;;;;;;;;;;;;63469:41;;;;;;;;;;;;63506:4;63469:41;;67772:422;;;;;;;;;;-1:-1:-1;67772:422:0;;;;;:::i;:::-;;:::i;65555:94::-;;;;;;;;;;;;;:::i;49235:172::-;;;;;;;;;;-1:-1:-1;49235:172:0;;;;;:::i;:::-;-1:-1:-1;;;;;49360:25:0;;;49332:4;49360:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;49235:172;72146:411;;;;;;;;;;;;;:::i;17775:213::-;;;;;;;;;;-1:-1:-1;17775:213:0;;;;;:::i;:::-;;:::i;64058:45::-;;;;;;;;;;-1:-1:-1;64058:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;43376:325;43478:4;-1:-1:-1;;;;;;43523:40:0;;-1:-1:-1;;;43523:40:0;;:109;;-1:-1:-1;;;;;;;43584:48:0;;-1:-1:-1;;;43584:48:0;43523:109;:166;;;-1:-1:-1;;;;;;;;;;31053:40:0;;;43653:36;43499:190;43376:325;-1:-1:-1;;43376:325:0:o;46906:108::-;46960:13;46997:5;46990:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46906:108;:::o;48553:216::-;48621:7;48650:16;48658:7;48650;:16::i;:::-;48645:64;;48675:34;;-1:-1:-1;;;48675:34:0;;;;;;;;;;;48645:64;-1:-1:-1;48733:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;48733:24:0;;48553:216::o;48074:399::-;48151:13;48167:24;48183:7;48167:15;:24::i;:::-;48151:40;;48216:5;-1:-1:-1;;;;;48210:11:0;:2;-1:-1:-1;;;;;48210:11:0;;48206:48;;;48230:24;;-1:-1:-1;;;48230:24:0;;;;;;;;;;;48206:48;15468:10;-1:-1:-1;;;;;48275:21:0;;;;;;:63;;-1:-1:-1;48301:37:0;48318:5;15468:10;49235:172;:::i;48301:37::-;48300:38;48275:63;48271:146;;;48366:35;;-1:-1:-1;;;48366:35:0;;;;;;;;;;;48271:146;48433:28;48442:2;48446:7;48455:5;48433:8;:28::i;:::-;48136:337;48074:399;;:::o;63860:102::-;;;;;;;;;;;;;;;;;;;:::o;71813:97::-;16858:6;;-1:-1:-1;;;;;16858:6:0;15468:10;17027:23;17019:68;;;;-1:-1:-1;;;17019:68:0;;;;;;;:::i;:::-;;;;;;;;;8672:1:::1;9320:7;;:19;;9312:63;;;;-1:-1:-1::0;;;9312:63:0::1;;;;;;;:::i;:::-;71887:6:::2;:15:::0;;-1:-1:-1;;71887:15:0::2;::::0;::::2;;::::0;;;::::2;::::0;;-1:-1:-1;9461:7:0::1;9656:22:::0;71813:97::o;65778:1000::-;65982:8;66359:10;66347:8;66353:2;65982:8;66347;:::i;:::-;66346:23;66342:429;;66498:13;;66485:11;:26;;66477:59;;;;-1:-1:-1;;;66477:59:0;;13297:2:1;66477:59:0;;;13279:21:1;13336:2;13316:18;;;13309:30;-1:-1:-1;;;13355:18:1;;;13348:51;13416:18;;66477:59:0;13095:345:1;66477:59:0;66587:10;66571:14;:11;66583:2;66571:14;:::i;:::-;66570:27;;;;:::i;:::-;-1:-1:-1;;;;;66551:18:0;;;;;;:10;:18;;;;;:46;66342:429;;;66666:13;;66651:11;66639:8;66645:2;66639:5;:8;:::i;:::-;66638:24;;;;:::i;:::-;:41;;66630:76;;;;-1:-1:-1;;;66630:76:0;;17335:2:1;66630:76:0;;;17317:21:1;17374:2;17354:18;;;17347:30;-1:-1:-1;;;17393:18:1;;;17386:52;17455:18;;66630:76:0;17133:346:1;66630:76:0;66744:14;:11;66756:2;66744:14;:::i;:::-;-1:-1:-1;;;;;66721:18:0;;;;;;:10;:18;;;;;:38;;:18;;;:38;;;;;:::i;:::-;;;;-1:-1:-1;;66342:429:0;65892:886;65778:1000;;;;:::o;49488:194::-;49642:28;49652:4;49658:2;49662:7;49642:9;:28::i;63615:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;71135:120::-;16858:6;;-1:-1:-1;;;;;16858:6:0;15468:10;17027:23;17019:68;;;;-1:-1:-1;;;17019:68:0;;;;;;;:::i;:::-;8672:1:::1;9320:7;;:19;;9312:63;;;;-1:-1:-1::0;;;9312:63:0::1;;;;;;;:::i;:::-;71221:11:::2;:26:::0;8624:1:::1;9461:7;9656:22:::0;71135:120::o;49767:209::-;49925:39;49942:4;49948:2;49952:7;49925:39;;;;;;;;;;;;:16;:39::i;62797:451::-;62858:35;62896:20;62908:7;62896:11;:20::i;:::-;62975:18;;62858:58;;-1:-1:-1;62933:22:0;;-1:-1:-1;;;;;62959:34:0;15468:10;-1:-1:-1;;;;;62959:34:0;;:105;;;-1:-1:-1;63031:18:0;;63014:50;;15468:10;49235:172;:::i;63014:50::-;62959:162;;;-1:-1:-1;15468:10:0;63085:20;63097:7;63085:11;:20::i;:::-;-1:-1:-1;;;;;63085:36:0;;62959:162;62933:189;;63144:17;63139:66;;63170:35;;-1:-1:-1;;;63170:35:0;;;;;;;;;;;63139:66;63222:14;63228:7;63222:5;:14::i;69121:874::-;69181:16;69210:23;69236:17;69246:6;69236:9;:17::i;:::-;69210:43;;69264:30;69311:15;-1:-1:-1;;;;;69297:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;69297:30:0;-1:-1:-1;69264:63:0;-1:-1:-1;64929:1:0;69338:22;;69464:493;69489:15;69471;:33;:69;;;;-1:-1:-1;43030:7:0;43232:13;-1:-1:-1;;43232:31:0;69508:14;:32;;69471:69;69464:493;;;69554:31;69588:27;;;:11;:27;;;;;;;;;69554:61;;;;;;;;;-1:-1:-1;;;;;69554:61:0;;;;-1:-1:-1;;;69554:61:0;;-1:-1:-1;;;;;69554:61:0;;;;;;;;-1:-1:-1;;;69554:61:0;;;;;;;;;;;;;;;;69631:49;;-1:-1:-1;69652:14:0;;-1:-1:-1;;;;;69652:28:0;;;69631:49;69627:118;;;69718:14;;;-1:-1:-1;69627:118:0;69781:6;-1:-1:-1;;;;;69759:28:0;:18;-1:-1:-1;;;;;69759:28:0;;:50;;;;;69793:9;:16;;;69792:17;69759:50;69755:164;;;69861:14;69828:13;69842:15;69828:30;;;;;;;;:::i;:::-;;;;;;;;;;:47;69890:17;;;;:::i;:::-;;;;69755:164;69929:16;;;;:::i;:::-;;;;69543:414;69464:493;;;-1:-1:-1;69974:13:0;;69121:874;-1:-1:-1;;;;;69121:874:0:o;71261:93::-;16858:6;;-1:-1:-1;;;;;16858:6:0;15468:10;17027:23;17019:68;;;;-1:-1:-1;;;17019:68:0;;;;;;;:::i;:::-;8672:1:::1;9320:7;;:19;;9312:63;;;;-1:-1:-1::0;;;9312:63:0::1;;;;;;;:::i;:::-;71334:4:::2;:12:::0;8624:1:::1;9461:7;9656:22:::0;71261:93::o;70878:251::-;16858:6;;-1:-1:-1;;;;;16858:6:0;15468:10;17027:23;17019:68;;;;-1:-1:-1;;;17019:68:0;;;;;;;:::i;:::-;70976:32:::1;70993:14;70976:16;:32::i;:::-;71019:15;71029:4;71019:9;:15::i;:::-;71045;71053:6;71045:7;:15::i;:::-;71081:1;71071:8;;:11;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;71093:20:0::1;:27:::0;;-1:-1:-1;;71093:27:0::1;::::0;;-1:-1:-1;;70878:251:0:o;71504:145::-;16858:6;;-1:-1:-1;;;;;16858:6:0;15468:10;17027:23;17019:68;;;;-1:-1:-1;;;17019:68:0;;;;;;;:::i;:::-;8672:1:::1;9320:7;;:19;;9312:63;;;;-1:-1:-1::0;;;9312:63:0::1;;;;;;;:::i;:::-;8672:1;9461:7;:18:::0;71609:32;;::::2;::::0;:11:::2;::::0;:32:::2;::::0;::::2;::::0;::::2;:::i;:::-;-1:-1:-1::0;;8624:1:0::1;9656:7;:22:::0;71504:145::o;66786:878::-;8672:1;9320:7;;:19;;9312:63;;;;-1:-1:-1;;;9312:63:0;;;;;;;:::i;:::-;8672:1;9461:7;:18;67016:11:::1;::::0;66988:40:::1;::::0;67003:11;;66988:14:::1;:40::i;:::-;67039:37;67053:9;67064:11;67039:13;:37::i;:::-;67178:85;67197:12;;67178:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;67211:10:0::1;::::0;67233:28:::1;::::0;-1:-1:-1;;67250:10:0::1;9216:2:1::0;9212:15;9208:53;67233:28:0::1;::::0;::::1;9196:66:1::0;67211:10:0;;-1:-1:-1;9278:12:1;;;-1:-1:-1;67233:28:0::1;;;;;;;;;;;;67223:39;;;;;;67178:18;:85::i;:::-;67170:112;;;::::0;-1:-1:-1;;;67170:112:0;;12547:2:1;67170:112:0::1;::::0;::::1;12529:21:1::0;12586:2;12566:18;;;12559:30;-1:-1:-1;;;12605:18:1;;;12598:44;12659:18;;67170:112:0::1;12345:338:1::0;67170:112:0::1;67338:19;:17;:19::i;:::-;67433:28;67456:4;67433:22;:28::i;:::-;67524:10;67548:22;::::0;;;:10:::1;:22;::::0;;;;;67572:8:::1;::::0;67501:80:::1;::::0;67524:10;67535:11;;67501:22:::1;:80::i;:::-;67612:34;67622:10;67634:11;67612:9;:34::i;:::-;-1:-1:-1::0;;8624:1:0;9656:7;:22;-1:-1:-1;66786:878:0:o;65316:233::-;65397:36;65421:11;65397:23;:36::i;:::-;65472:4;;:8;65469:73;;65507:11;65500:4;;:18;;;;:::i;:::-;65491:5;:27;65483:57;;;;-1:-1:-1;;;65483:57:0;;14348:2:1;65483:57:0;;;14330:21:1;14387:2;14367:18;;;14360:30;-1:-1:-1;;;14406:18:1;;;14399:47;14463:18;;65483:57:0;14146:341:1;65483:57:0;65316:233;;:::o;46693:132::-;46757:7;46788:20;46800:7;46788:11;:20::i;:::-;:25;;46693:132;-1:-1:-1;;46693:132:0:o;63580:26::-;;;;;;;:::i;44546:223::-;44619:6;-1:-1:-1;;;;;44646:19:0;;44642:56;;44674:24;;-1:-1:-1;;;44674:24:0;;;;;;;;;;;44642:56;-1:-1:-1;;;;;;44720:19:0;;;;;:12;:19;;;;;:37;-1:-1:-1;;;44720:37:0;;-1:-1:-1;;;;;44720:37:0;;44546:223::o;43779:218::-;43843:7;-1:-1:-1;;;;;43871:19:0;;43867:60;;43899:28;;-1:-1:-1;;;43899:28:0;;;;;;;;;;;43867:60;-1:-1:-1;;;;;;43957:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;43957:27:0;;43779:218::o;17492:111::-;16858:6;;-1:-1:-1;;;;;16858:6:0;15468:10;17027:23;17019:68;;;;-1:-1:-1;;;17019:68:0;;;;;;;:::i;:::-;17561:30:::1;17588:1;17561:18;:30::i;:::-;17492:111::o:0;71363:129::-;16858:6;;-1:-1:-1;;;;;16858:6:0;15468:10;17027:23;17019:68;;;;-1:-1:-1;;;17019:68:0;;;;;;;:::i;:::-;8672:1:::1;9320:7;;:19;;9312:63;;;;-1:-1:-1::0;;;9312:63:0::1;;;;;;;:::i;:::-;71454:13:::2;:30:::0;8624:1:::1;9461:7;9656:22:::0;71363:129::o;71922:117::-;16858:6;;-1:-1:-1;;;;;16858:6:0;15468:10;17027:23;17019:68;;;;-1:-1:-1;;;17019:68:0;;;;;;;:::i;:::-;8672:1:::1;9320:7;;:19;;9312:63;;;;-1:-1:-1::0;;;9312:63:0::1;;;;;;;:::i;:::-;72007:10:::2;:24:::0;8624:1:::1;9461:7;9656:22:::0;71922:117::o;65659:111::-;65734:20;;;;;;;;:27;;;;;;65726:36;;;;;;65659:111;:::o;64946:122::-;65033:1;65026:6;:8;65018:42;;;;-1:-1:-1;;;65018:42:0;;16280:2:1;65018:42:0;;;16262:21:1;16319:2;16299:18;;;16292:30;-1:-1:-1;;;16338:18:1;;;16331:51;16399:18;;65018:42:0;16078:345:1;65076:230:0;65162:36;65186:11;65162:23;:36::i;:::-;65249:9;65234:11;65217:14;43030:7;43232:13;-1:-1:-1;;43232:31:0;;42983:307;65217:14;:28;;;;:::i;:::-;:41;;65209:87;;;;-1:-1:-1;;;65209:87:0;;15101:2:1;65209:87:0;;;15083:21:1;15140:2;15120:18;;;15113:30;15179:34;15159:18;;;15152:62;-1:-1:-1;;;15230:18:1;;;15223:31;15271:19;;65209:87:0;14899:397:1;72047:91:0;16858:6;;-1:-1:-1;;;;;16858:6:0;15468:10;17027:23;17019:68;;;;-1:-1:-1;;;17019:68:0;;;;;;;:::i;:::-;8672:1:::1;9320:7;;:19;;9312:63;;;;-1:-1:-1::0;;;9312:63:0::1;;;;;;;:::i;:::-;72116:8:::2;:14:::0;;;::::2;;::::0;::::2;-1:-1:-1::0;;72116:14:0;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;9461:7:0::1;9656:22:::0;72047:91::o;47097:112::-;47153:13;47190:7;47183:14;;;;;:::i;63550:22::-;;;;;;;:::i;71657:99::-;16858:6;;-1:-1:-1;;;;;16858:6:0;15468:10;17027:23;17019:68;;;;-1:-1:-1;;;17019:68:0;;;;;;;:::i;:::-;8672:1:::1;9320:7;;:19;;9312:63;;;;-1:-1:-1::0;;;9312:63:0::1;;;;;;;:::i;:::-;8672:1;9461:7;:18:::0;71734:14;;::::2;::::0;:7:::2;::::0;:14:::2;::::0;::::2;::::0;::::2;:::i;68290:693::-:0;8672:1;9320:7;;:19;;9312:63;;;;-1:-1:-1;;;9312:63:0;;;;;;;:::i;:::-;8672:1;9461:7;:18;68455:38:::1;68470:11:::0;63506:4:::1;68455:14;:38::i;:::-;68541:36;68555:9;68565:11;68541:13;:36::i;:::-;68647:29;68670:5;68647:22;:29::i;:::-;68740:19;:17;:19::i;:::-;68854:10;68878:22;::::0;;;:10:::1;:22;::::0;;;;;68902:8:::1;::::0;68831:80:::1;::::0;68854:10;68865:11;;68831:22:::1;:80::i;:::-;68941:34;68951:10;68963:11;68941:9;:34::i;:::-;-1:-1:-1::0;8624:1:0;9656:7;:22;68290:693::o;72608:189::-;16858:6;;-1:-1:-1;;;;;16858:6:0;15468:10;17027:23;17019:68;;;;-1:-1:-1;;;17019:68:0;;;;;;;:::i;:::-;8672:1:::1;9320:7;;:19;;9312:63;;;;-1:-1:-1::0;;;9312:63:0::1;;;;;;;:::i;:::-;8672:1;9461:7;:18:::0;72693:49:::2;::::0;72675:12:::2;::::0;72693:10:::2;::::0;72716:21:::2;::::0;72675:12;72693:49;72675:12;72693:49;72716:21;72693:10;:49:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72674:68;;;72761:7;72753:36;;;::::0;-1:-1:-1;;;72753:36:0;;16630:2:1;72753:36:0::2;::::0;::::2;16612:21:1::0;16669:2;16649:18;;;16642:30;-1:-1:-1;;;16688:18:1;;;16681:46;16744:18;;72753:36:0::2;16428:340:1::0;48855:295:0;-1:-1:-1;;;;;48950:24:0;;15468:10;48950:24;48946:54;;;48983:17;;-1:-1:-1;;;48983:17:0;;;;;;;;;;;48946:54;15468:10;49017:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;49017:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;49017:53:0;;;;;;;;;;49090:48;;11887:41:1;;;49017:42:0;;15468:10;49090:48;;11860:18:1;49090:48:0;;;;;;;48855:295;;:::o;70395:469::-;16858:6;;-1:-1:-1;;;;;16858:6:0;15468:10;17027:23;17019:68;;;;-1:-1:-1;;;17019:68:0;;;;;;;:::i;:::-;63506:4:::1;70543:12;:23;;70535:32;;;::::0;::::1;;70578:26;70592:11;70578:13;:26::i;:::-;70626:32;70643:14;70626:16;:32::i;:::-;70669:15;70679:4;70669:9;:15::i;:::-;70695;70703:6;70695:7;:15::i;:::-;70732:1;70721:8;;:12;;;;;;;:::i;:::-;;;;;;;;70791;70777:11;;:26;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;70395:469:0:o;50069:409::-;50260:28;50270:4;50276:2;50280:7;50260:9;:28::i;:::-;-1:-1:-1;;;;;50307:13:0;;20037:19;:23;;50307:76;;;;;50327:56;50358:4;50364:2;50368:7;50377:5;50327:30;:56::i;:::-;50326:57;50307:76;50303:164;;;50411:40;;-1:-1:-1;;;50411:40:0;;;;;;;;;;;50303:164;50069:409;;;;:::o;70003:347::-;70069:13;70103:17;70111:8;70103:7;:17::i;:::-;70095:77;;;;-1:-1:-1;;;70095:77:0;;15864:2:1;70095:77:0;;;15846:21:1;15903:2;15883:18;;;15876:30;15942:34;15922:18;;;15915:62;-1:-1:-1;;;15993:18:1;;;15986:45;16048:19;;70095:77:0;15662:411:1;70095:77:0;70187:8;;;;;;;70183:44;;70214:11;70207:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70003:347;;;:::o;70183:44::-;70268:1;70250:7;70244:21;;;;;:::i;:::-;;;:25;:98;;;;;;;;;;;;;;;;;70296:7;70305:19;:8;:17;:19::i;:::-;70326:9;70279:57;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70237:105;70003:347;-1:-1:-1;;70003:347:0:o;67772:422::-;8672:1;9320:7;;:19;;9312:63;;;;-1:-1:-1;;;9312:63:0;;;;;;;:::i;:::-;8672:1;9461:7;:18;16858:6;;-1:-1:-1;;;;;16858:6:0;15468:10;17027:23:::1;17019:68;;;;-1:-1:-1::0;;;17019:68:0::1;;;;;;;:::i;:::-;67923:10:::2;:17;67901:11;:18;:39;67893:90;;;::::0;-1:-1:-1;;;67893:90:0;;14694:2:1;67893:90:0::2;::::0;::::2;14676:21:1::0;14733:2;14713:18;;;14706:30;14772:34;14752:18;;;14745:62;-1:-1:-1;;;14823:18:1;;;14816:36;14869:19;;67893:90:0::2;14492:402:1::0;67893:90:0::2;67998:6;67994:193;68014:11;:18;68010:1;:22;67994:193;;;68050:41;68065:11;68077:1;68065:14;;;;;;;;:::i;:::-;;;;;;;63506:4;68050:14;:41::i;:::-;68106:40;68116:10;68127:1;68116:13;;;;;;;;:::i;:::-;;;;;;;68131:11;68143:1;68131:14;;;;;;;;:::i;:::-;;;;;;;68106:9;:40::i;:::-;68171:3;;67994:193;;65555:94:::0;65615:6;;;;65614:7;65606:34;;;;-1:-1:-1;;;65606:34:0;;13647:2:1;65606:34:0;;;13629:21:1;13686:2;13666:18;;;13659:30;-1:-1:-1;;;13705:18:1;;;13698:44;13759:18;;65606:34:0;13445:338:1;72146:411:0;8672:1;9320:7;;:19;;9312:63;;;;-1:-1:-1;;;9312:63:0;;;;;;;:::i;:::-;8672:1;9461:7;:18;16858:6;;-1:-1:-1;;;;;16858:6:0;15468:10;17027:23:::1;17019:68;;;;-1:-1:-1::0;;;17019:68:0::1;;;;;;;:::i;:::-;72228:13:::2;::::0;:18;72220:60:::2;;;::::0;-1:-1:-1;;;72220:60:0;;13990:2:1;72220:60:0::2;::::0;::::2;13972:21:1::0;14029:2;14009:18;;;14002:30;14068:31;14048:18;;;14041:59;14117:18;;72220:60:0::2;13788:353:1::0;72220:60:0::2;72468:32;::::0;-1:-1:-1;;72485:14:0::2;9216:2:1::0;9212:15;9208:53;72468:32:0::2;::::0;::::2;9196:66:1::0;63506:4:0::2;::::0;72505:15:::2;::::0;9278:12:1;;72468:32:0::2;;;;;;;;;;;;72458:43;;;;;;72450:52;;:70;;;;:::i;:::-;72418:12;72401:14;72364:34;72382:16;72364:15;:34;:::i;:::-;:51;;;;:::i;:::-;:66;;;;:::i;:::-;:156;;;;:::i;:::-;72329:206;;;;;;10351:19:1::0;;10395:2;10386:12;;10222:182;72329:206:0::2;;;;;;;;;;;;;72319:217;;;;;;72311:226;;:238;;;;:::i;:::-;72295:13;:254:::0;8624:1;9656:7;:22;72146:411::o;17775:213::-;16858:6;;-1:-1:-1;;;;;16858:6:0;15468:10;17027:23;17019:68;;;;-1:-1:-1;;;17019:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17868:22:0;::::1;17860:73;;;::::0;-1:-1:-1;;;17860:73:0;;12890:2:1;17860:73:0::1;::::0;::::1;12872:21:1::0;12929:2;12909:18;;;12902:30;12968:34;12948:18;;;12941:62;-1:-1:-1;;;13019:18:1;;;13012:36;13065:19;;17860:73:0::1;12688:402:1::0;17860:73:0::1;17948:28;17967:8;17948:18;:28::i;50759:199::-:0;50816:4;50863:7;64929:1;50844:26;;:53;;;;;50884:13;;50874:7;:23;50844:53;:102;;;;-1:-1:-1;;50919:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;50919:27:0;;;;50918:28;;50759:199::o;59011:224::-;59146:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;59146:29:0;-1:-1:-1;;;;;59146:29:0;;;;;;;;;59195:28;;59146:24;;59195:28;;;;;;;59011:224;;;:::o;54178:2260::-;54313:35;54351:20;54363:7;54351:11;:20::i;:::-;54430:18;;54313:58;;-1:-1:-1;54388:22:0;;-1:-1:-1;;;;;54414:34:0;15468:10;-1:-1:-1;;;;;54414:34:0;;:105;;;-1:-1:-1;54486:18:0;;54469:50;;15468:10;49235:172;:::i;54469:50::-;54414:162;;;-1:-1:-1;15468:10:0;54540:20;54552:7;54540:11;:20::i;:::-;-1:-1:-1;;;;;54540:36:0;;54414:162;54388:189;;54599:17;54594:66;;54625:35;;-1:-1:-1;;;54625:35:0;;;;;;;;;;;54594:66;54701:4;-1:-1:-1;;;;;54679:26:0;:13;:18;;;-1:-1:-1;;;;;54679:26:0;;54675:67;;54714:28;;-1:-1:-1;;;54714:28:0;;;;;;;;;;;54675:67;-1:-1:-1;;;;;54761:16:0;;54757:52;;54786:23;;-1:-1:-1;;;54786:23:0;;;;;;;;;;;54757:52;54942:49;54959:1;54963:7;54972:13;:18;;;54942:8;:49::i;:::-;-1:-1:-1;;;;;55307:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;55307:31:0;;;-1:-1:-1;;;;;55307:31:0;;;-1:-1:-1;;55307:31:0;;;;;;;55357:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;55357:29:0;;;;;;;;;;;55407:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;55456:61:0;;;;-1:-1:-1;;;55501:15:0;55456:61;;;;;;;;;;;55803:11;;;55837:24;;;;;:29;55803:11;;55837:29;55833:473;;56074:13;;56060:11;:27;56056:231;;;56148:18;;;56116:24;;;:11;:24;;;;;;;;:50;;56235:28;;;;-1:-1:-1;;;;;56193:70:0;-1:-1:-1;;;56193:70:0;-1:-1:-1;;;;;;56193:70:0;;;-1:-1:-1;;;;;56116:50:0;;;56193:70;;;;;;;56056:231;55278:1043;56361:7;56357:2;-1:-1:-1;;;;;56342:27:0;56351:4;-1:-1:-1;;;;;56342:27:0;-1:-1:-1;;;;;;;;;;;56342:27:0;;;;;;;;;56384:42;50069:409;45413:1204;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;45527:7:0;;64929:1;45584:23;;:47;;;;;45618:13;;45611:4;:20;45584:47;45580:958;;;45656:31;45690:17;;;:11;:17;;;;;;;;;45656:51;;;;;;;;;-1:-1:-1;;;;;45656:51:0;;;;-1:-1:-1;;;45656:51:0;;-1:-1:-1;;;;;45656:51:0;;;;;;;;-1:-1:-1;;;45656:51:0;;;;;;;;;;;;;;45730:789;;45784:14;;-1:-1:-1;;;;;45784:28:0;;45780:109;;45852:9;45413:1204;-1:-1:-1;;;45413:1204:0:o;45780:109::-;-1:-1:-1;;;46255:6:0;46304:17;;;;:11;:17;;;;;;;;;46292:29;;;;;;;;;-1:-1:-1;;;;;46292:29:0;;;;;-1:-1:-1;;;46292:29:0;;-1:-1:-1;;;;;46292:29:0;;;;;;;;-1:-1:-1;;;46292:29:0;;;;;;;;;;;;;46356:28;46352:117;;46428:9;45413:1204;-1:-1:-1;;;45413:1204:0:o;46352:117::-;46211:285;;;45633:905;45580:958;46574:31;;-1:-1:-1;;;46574:31:0;;;;;;;;;;;56702:2171;56766:35;56804:20;56816:7;56804:11;:20::i;:::-;56766:58;-1:-1:-1;56979:49:0;56996:1;57000:7;57009:13;:18;;;56979:8;:49::i;:::-;57357:18;;-1:-1:-1;;;;;57344:32:0;;;;;;;:12;:32;;;;;;;;:45;;-1:-1:-1;;57344:45:0;;-1:-1:-1;;;;;57344:45:0;;;-1:-1:-1;;57344:45:0;;;;;;;57421:18;;57408:32;;;;;;;:50;;-1:-1:-1;;;;57408:50:0;;-1:-1:-1;;;57408:50:0;;;;;;-1:-1:-1;57408:50:0;;;;;;;;;;;;57593:18;;57565:20;;;:11;:20;;;;;;:46;;-1:-1:-1;;;57565:46:0;;;-1:-1:-1;;;;;;57630:61:0;;;;-1:-1:-1;;;57675:15:0;57630:61;;;;;;;;;;;-1:-1:-1;;;;57710:34:0;;;;;;;58026:11;;;58060:24;;;;;:29;58026:11;;58060:29;58056:473;;58297:13;;58283:11;:27;58279:231;;;58371:18;;;58339:24;;;:11;:24;;;;;;;;:50;;58458:28;;;;-1:-1:-1;;;;;58416:70:0;-1:-1:-1;;;58416:70:0;-1:-1:-1;;;;;;58416:70:0;;;-1:-1:-1;;;;;58339:50:0;;;58416:70;;;;;;;58279:231;-1:-1:-1;58574:18:0;;58565:49;;58606:7;;58602:1;;-1:-1:-1;;;;;58565:49:0;;;;-1:-1:-1;;;;;;;;;;;58565:49:0;58602:1;;58565:49;-1:-1:-1;;58832:12:0;:14;;;;;;56702:2171::o;10691:214::-;10832:4;10889;10860:25;10873:5;10880:4;10860:12;:25::i;:::-;:33;;10691:214;-1:-1:-1;;;;10691:214:0:o;50970:112::-;51043:27;51053:2;51057:8;51043:27;;;;;;;;;;;;:9;:27::i;18165:207::-;18262:6;;;-1:-1:-1;;;;;18283:17:0;;;-1:-1:-1;;;;;;18283:17:0;;;;;;;18320:40;;18262:6;;;18283:17;18262:6;;18320:40;;18243:16;;18320:40;18228:144;18165:207;:::o;59759:735::-;59967:72;;-1:-1:-1;;;59967:72:0;;59942:4;;-1:-1:-1;;;;;59967:36:0;;;;;:72;;15468:10;;60018:4;;60024:7;;60033:5;;59967:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59967:72:0;;;;;;;;-1:-1:-1;;59967:72:0;;;;;;;;;;;;:::i;:::-;;;59963:520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60213:13:0;;60209:259;;60263:40;;-1:-1:-1;;;60263:40:0;;;;;;;;;;;60209:259;60418:6;60412:13;60403:6;60399:2;60395:15;60388:38;59963:520;-1:-1:-1;;;;;;60090:55:0;-1:-1:-1;;;60090:55:0;;-1:-1:-1;59963:520:0;59759:735;;;;;;:::o;12703:799::-;12759:13;12992:10;12988:61;;-1:-1:-1;;13023:10:0;;;;;;;;;;;;-1:-1:-1;;;13023:10:0;;;;;12703:799::o;12988:61::-;13078:5;13063:12;13127:90;13134:9;;13127:90;;13164:8;;;;:::i;:::-;;-1:-1:-1;13191:10:0;;-1:-1:-1;13199:2:0;13191:10;;:::i;:::-;;;13127:90;;;13231:19;13263:6;-1:-1:-1;;;;;13253:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13253:17:0;;13231:39;;13285:170;13292:10;;13285:170;;13323:11;13333:1;13323:11;;:::i;:::-;;-1:-1:-1;13396:10:0;13404:2;13396:5;:10;:::i;:::-;13383:24;;:2;:24;:::i;:::-;13370:39;;13353:6;13360;13353:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;13353:56:0;;;;;;;;-1:-1:-1;13428:11:0;13437:2;13428:11;;:::i;:::-;;;13285:170;;11296:727;11379:7;11426:4;11379:7;11445:533;11469:5;:12;11465:1;:16;11445:533;;;11507:20;11530:5;11536:1;11530:8;;;;;;;;:::i;:::-;;;;;;;11507:31;;11577:12;11561;:28;11557:406;;12103:13;12161:15;;;12201:4;12194:15;;;12252:4;12236:21;;11697:57;;11557:406;;;12103:13;12161:15;;;12201:4;12194:15;;;12252:4;12236:21;;11886:57;;11557:406;-1:-1:-1;11483:3:0;;;;:::i;:::-;;;;11445:533;;;-1:-1:-1;11999:12:0;11296:727;-1:-1:-1;;;11296:727:0:o;51480:187::-;51623:32;51629:2;51633:8;51643:5;51650:4;52125:20;52148:13;-1:-1:-1;;;;;52180:16:0;;52176:48;;52205:19;;-1:-1:-1;;;52205:19:0;;;;;;;;;;;52176:48;52243:13;52239:44;;52265:18;;-1:-1:-1;;;52265:18:0;;;;;;;;;;;52239:44;-1:-1:-1;;;;;52658:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;52721:49:0;;-1:-1:-1;;;;;52658:44:0;;;;;;;52721:49;;;;-1:-1:-1;;52658:44:0;;;;;;52721:49;;;;;;;;;;;;;;;;52791:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;52845:66:0;;;;-1:-1:-1;;;52895:15:0;52845:66;;;;;;;;;;52791:25;53000:23;;;53048:4;:23;;;;-1:-1:-1;;;;;;53056:13:0;;20037:19;:23;;53056:15;53044:693;;;53096:334;53131:38;;53156:12;;-1:-1:-1;;;;;53131:38:0;;;53148:1;;-1:-1:-1;;;;;;;;;;;53131:38:0;53148:1;;53131:38;53201:69;53240:1;53244:2;53248:14;;;;;;53264:5;53201:30;:69::i;:::-;53196:182;;53310:40;;-1:-1:-1;;;53310:40:0;;;;;;;;;;;53196:182;53425:3;53409:12;:19;;53096:334;;53519:12;53502:13;;:29;53498:43;;53533:8;;;53498:43;53044:693;;;53590:128;53625:40;;53650:14;;;;;-1:-1:-1;;;;;53625:40:0;;;53642:1;;-1:-1:-1;;;;;;;;;;;53625:40:0;53642:1;;53625:40;53713:3;53697:12;:19;;53590:128;;53044:693;-1:-1:-1;53755:13:0;:28;53813:60;50069:409;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;-1:-1:-1;;;;;104:6:1;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:679::-;657:5;710:3;703:4;695:6;691:17;687:27;677:55;;728:1;725;718:12;677:55;764:6;751:20;790:4;814:60;830:43;870:2;830:43;:::i;:::-;814:60;:::i;:::-;896:3;920:2;915:3;908:15;948:2;943:3;939:12;932:19;;983:2;975:6;971:15;1035:3;1030:2;1024;1021:1;1017:10;1009:6;1005:23;1001:32;998:41;995:61;;;1052:1;1049;1042:12;995:61;1074:1;1084:169;1098:2;1095:1;1092:9;1084:169;;;1155:23;1174:3;1155:23;:::i;:::-;1143:36;;1199:12;;;;1231;;;;1116:1;1109:9;1084:169;;;-1:-1:-1;1271:5:1;;603:679;-1:-1:-1;;;;;;;603:679:1:o;1287:160::-;1352:20;;1408:13;;1401:21;1391:32;;1381:60;;1437:1;1434;1427:12;1452:186;1511:6;1564:2;1552:9;1543:7;1539:23;1535:32;1532:52;;;1580:1;1577;1570:12;1532:52;1603:29;1622:9;1603:29;:::i;:::-;1593:39;1452:186;-1:-1:-1;;;1452:186:1:o;1643:260::-;1711:6;1719;1772:2;1760:9;1751:7;1747:23;1743:32;1740:52;;;1788:1;1785;1778:12;1740:52;1811:29;1830:9;1811:29;:::i;:::-;1801:39;;1859:38;1893:2;1882:9;1878:18;1859:38;:::i;:::-;1849:48;;1643:260;;;;;:::o;1908:328::-;1985:6;1993;2001;2054:2;2042:9;2033:7;2029:23;2025:32;2022:52;;;2070:1;2067;2060:12;2022:52;2093:29;2112:9;2093:29;:::i;:::-;2083:39;;2141:38;2175:2;2164:9;2160:18;2141:38;:::i;:::-;2131:48;;2226:2;2215:9;2211:18;2198:32;2188:42;;1908:328;;;;;:::o;2241:666::-;2336:6;2344;2352;2360;2413:3;2401:9;2392:7;2388:23;2384:33;2381:53;;;2430:1;2427;2420:12;2381:53;2453:29;2472:9;2453:29;:::i;:::-;2443:39;;2501:38;2535:2;2524:9;2520:18;2501:38;:::i;:::-;2491:48;;2586:2;2575:9;2571:18;2558:32;2548:42;;2641:2;2630:9;2626:18;2613:32;-1:-1:-1;;;;;2660:6:1;2657:30;2654:50;;;2700:1;2697;2690:12;2654:50;2723:22;;2776:4;2768:13;;2764:27;-1:-1:-1;2754:55:1;;2805:1;2802;2795:12;2754:55;2828:73;2893:7;2888:2;2875:16;2870:2;2866;2862:11;2828:73;:::i;:::-;2818:83;;;2241:666;;;;;;;:::o;2912:254::-;2977:6;2985;3038:2;3026:9;3017:7;3013:23;3009:32;3006:52;;;3054:1;3051;3044:12;3006:52;3077:29;3096:9;3077:29;:::i;:::-;3067:39;;3125:35;3156:2;3145:9;3141:18;3125:35;:::i;3171:254::-;3239:6;3247;3300:2;3288:9;3279:7;3275:23;3271:32;3268:52;;;3316:1;3313;3306:12;3268:52;3339:29;3358:9;3339:29;:::i;:::-;3329:39;3415:2;3400:18;;;;3387:32;;-1:-1:-1;;;3171:254:1:o;3430:391::-;3516:6;3524;3532;3540;3593:3;3581:9;3572:7;3568:23;3564:33;3561:53;;;3610:1;3607;3600:12;3561:53;3633:29;3652:9;3633:29;:::i;:::-;3623:39;3709:2;3694:18;;3681:32;;-1:-1:-1;3760:2:1;3745:18;;3732:32;;3811:2;3796:18;3783:32;;-1:-1:-1;3430:391:1;-1:-1:-1;;;3430:391:1:o;3826:1151::-;3944:6;3952;4005:2;3993:9;3984:7;3980:23;3976:32;3973:52;;;4021:1;4018;4011:12;3973:52;4061:9;4048:23;-1:-1:-1;;;;;4131:2:1;4123:6;4120:14;4117:34;;;4147:1;4144;4137:12;4117:34;4185:6;4174:9;4170:22;4160:32;;4230:7;4223:4;4219:2;4215:13;4211:27;4201:55;;4252:1;4249;4242:12;4201:55;4288:2;4275:16;4310:4;4334:60;4350:43;4390:2;4350:43;:::i;4334:60::-;4416:3;4440:2;4435:3;4428:15;4468:2;4463:3;4459:12;4452:19;;4499:2;4495;4491:11;4547:7;4542:2;4536;4533:1;4529:10;4525:2;4521:19;4517:28;4514:41;4511:61;;;4568:1;4565;4558:12;4511:61;4590:1;4581:10;;4600:163;4614:2;4611:1;4608:9;4600:163;;;4671:17;;4659:30;;4632:1;4625:9;;;;;4709:12;;;;4741;;4600:163;;;-1:-1:-1;4782:5:1;-1:-1:-1;;4825:18:1;;4812:32;;-1:-1:-1;;4856:16:1;;;4853:36;;;4885:1;4882;4875:12;4853:36;;4908:63;4963:7;4952:8;4941:9;4937:24;4908:63;:::i;:::-;4898:73;;;3826:1151;;;;;:::o;4982:180::-;5038:6;5091:2;5079:9;5070:7;5066:23;5062:32;5059:52;;;5107:1;5104;5097:12;5059:52;5130:26;5146:9;5130:26;:::i;5167:180::-;5226:6;5279:2;5267:9;5258:7;5254:23;5250:32;5247:52;;;5295:1;5292;5285:12;5247:52;-1:-1:-1;5318:23:1;;5167:180;-1:-1:-1;5167:180:1:o;5352:385::-;5438:6;5446;5454;5462;5515:3;5503:9;5494:7;5490:23;5486:33;5483:53;;;5532:1;5529;5522:12;5483:53;-1:-1:-1;;5555:23:1;;;5625:2;5610:18;;5597:32;;-1:-1:-1;5676:2:1;5661:18;;5648:32;;5727:2;5712:18;5699:32;;-1:-1:-1;5352:385:1;-1:-1:-1;5352:385:1:o;5742:245::-;5800:6;5853:2;5841:9;5832:7;5828:23;5824:32;5821:52;;;5869:1;5866;5859:12;5821:52;5908:9;5895:23;5927:30;5951:5;5927:30;:::i;5992:249::-;6061:6;6114:2;6102:9;6093:7;6089:23;6085:32;6082:52;;;6130:1;6127;6120:12;6082:52;6162:9;6156:16;6181:30;6205:5;6181:30;:::i;6246:450::-;6315:6;6368:2;6356:9;6347:7;6343:23;6339:32;6336:52;;;6384:1;6381;6374:12;6336:52;6424:9;6411:23;-1:-1:-1;;;;;6449:6:1;6446:30;6443:50;;;6489:1;6486;6479:12;6443:50;6512:22;;6565:4;6557:13;;6553:27;-1:-1:-1;6543:55:1;;6594:1;6591;6584:12;6543:55;6617:73;6682:7;6677:2;6664:16;6659:2;6655;6651:11;6617:73;:::i;6886:683::-;6981:6;6989;6997;7050:2;7038:9;7029:7;7025:23;7021:32;7018:52;;;7066:1;7063;7056:12;7018:52;7102:9;7089:23;7079:33;;7163:2;7152:9;7148:18;7135:32;-1:-1:-1;;;;;7227:2:1;7219:6;7216:14;7213:34;;;7243:1;7240;7233:12;7213:34;7281:6;7270:9;7266:22;7256:32;;7326:7;7319:4;7315:2;7311:13;7307:27;7297:55;;7348:1;7345;7338:12;7297:55;7388:2;7375:16;7414:2;7406:6;7403:14;7400:34;;;7430:1;7427;7420:12;7400:34;7483:7;7478:2;7468:6;7465:1;7461:14;7457:2;7453:23;7449:32;7446:45;7443:65;;;7504:1;7501;7494:12;7443:65;7535:2;7531;7527:11;7517:21;;7557:6;7547:16;;;;;6886:683;;;;;:::o;7574:248::-;7642:6;7650;7703:2;7691:9;7682:7;7678:23;7674:32;7671:52;;;7719:1;7716;7709:12;7671:52;-1:-1:-1;;7742:23:1;;;7812:2;7797:18;;;7784:32;;-1:-1:-1;7574:248:1:o;7827:257::-;7868:3;7906:5;7900:12;7933:6;7928:3;7921:19;7949:63;8005:6;7998:4;7993:3;7989:14;7982:4;7975:5;7971:16;7949:63;:::i;:::-;8066:2;8045:15;-1:-1:-1;;8041:29:1;8032:39;;;;8073:4;8028:50;;7827:257;-1:-1:-1;;7827:257:1:o;8089:973::-;8174:12;;8139:3;;8229:1;8249:18;;;;8302;;;;8329:61;;8383:4;8375:6;8371:17;8361:27;;8329:61;8409:2;8457;8449:6;8446:14;8426:18;8423:38;8420:161;;;8503:10;8498:3;8494:20;8491:1;8484:31;8538:4;8535:1;8528:15;8566:4;8563:1;8556:15;8420:161;8597:18;8624:104;;;;8742:1;8737:319;;;;8590:466;;8624:104;-1:-1:-1;;8657:24:1;;8645:37;;8702:16;;;;-1:-1:-1;8624:104:1;;8737:319;18412:1;18405:14;;;18449:4;18436:18;;8831:1;8845:165;8859:6;8856:1;8853:13;8845:165;;;8937:14;;8924:11;;;8917:35;8980:16;;;;8874:10;;8845:165;;;8849:3;;9039:6;9034:3;9030:16;9023:23;;8590:466;;;;;;;8089:973;;;;:::o;9551:456::-;9772:3;9800:38;9834:3;9826:6;9800:38;:::i;:::-;9867:6;9861:13;9883:52;9928:6;9924:2;9917:4;9909:6;9905:17;9883:52;:::i;:::-;9951:50;9993:6;9989:2;9985:15;9977:6;9951:50;:::i;:::-;9944:57;9551:456;-1:-1:-1;;;;;;;9551:456:1:o;10617:488::-;-1:-1:-1;;;;;10886:15:1;;;10868:34;;10938:15;;10933:2;10918:18;;10911:43;10985:2;10970:18;;10963:34;;;11033:3;11028:2;11013:18;;11006:31;;;10811:4;;11054:45;;11079:19;;11071:6;11054:45;:::i;:::-;11046:53;10617:488;-1:-1:-1;;;;;;10617:488:1:o;11110:632::-;11281:2;11333:21;;;11403:13;;11306:18;;;11425:22;;;11252:4;;11281:2;11504:15;;;;11478:2;11463:18;;;11252:4;11547:169;11561:6;11558:1;11555:13;11547:169;;;11622:13;;11610:26;;11691:15;;;;11656:12;;;;11583:1;11576:9;11547:169;;;-1:-1:-1;11733:3:1;;11110:632;-1:-1:-1;;;;;;11110:632:1:o;12121:219::-;12270:2;12259:9;12252:21;12233:4;12290:44;12330:2;12319:9;12315:18;12307:6;12290:44;:::i;15301:356::-;15503:2;15485:21;;;15522:18;;;15515:30;15581:34;15576:2;15561:18;;15554:62;15648:2;15633:18;;15301:356::o;16773:355::-;16975:2;16957:21;;;17014:2;16994:18;;;16987:30;17053:33;17048:2;17033:18;;17026:61;17119:2;17104:18;;16773:355::o;17871:275::-;17942:2;17936:9;18007:2;17988:13;;-1:-1:-1;;17984:27:1;17972:40;;-1:-1:-1;;;;;18027:34:1;;18063:22;;;18024:62;18021:88;;;18089:18;;:::i;:::-;18125:2;18118:22;17871:275;;-1:-1:-1;17871:275:1:o;18151:183::-;18211:4;-1:-1:-1;;;;;18236:6:1;18233:30;18230:56;;;18266:18;;:::i;:::-;-1:-1:-1;18311:1:1;18307:14;18323:4;18303:25;;18151:183::o;18465:128::-;18505:3;18536:1;18532:6;18529:1;18526:13;18523:39;;;18542:18;;:::i;:::-;-1:-1:-1;18578:9:1;;18465:128::o;18598:120::-;18638:1;18664;18654:35;;18669:18;;:::i;:::-;-1:-1:-1;18703:9:1;;18598:120::o;18723:168::-;18763:7;18829:1;18825;18821:6;18817:14;18814:1;18811:21;18806:1;18799:9;18792:17;18788:45;18785:71;;;18836:18;;:::i;:::-;-1:-1:-1;18876:9:1;;18723:168::o;18896:125::-;18936:4;18964:1;18961;18958:8;18955:34;;;18969:18;;:::i;:::-;-1:-1:-1;19006:9:1;;18896:125::o;19026:258::-;19098:1;19108:113;19122:6;19119:1;19116:13;19108:113;;;19198:11;;;19192:18;19179:11;;;19172:39;19144:2;19137:10;19108:113;;;19239:6;19236:1;19233:13;19230:48;;;-1:-1:-1;;19274:1:1;19256:16;;19249:27;19026:258::o;19289:380::-;19368:1;19364:12;;;;19411;;;19432:61;;19486:4;19478:6;19474:17;19464:27;;19432:61;19539:2;19531:6;19528:14;19508:18;19505:38;19502:161;;;19585:10;19580:3;19576:20;19573:1;19566:31;19620:4;19617:1;19610:15;19648:4;19645:1;19638:15;19502:161;;19289:380;;;:::o;19674:135::-;19713:3;-1:-1:-1;;19734:17:1;;19731:43;;;19754:18;;:::i;:::-;-1:-1:-1;19801:1:1;19790:13;;19674:135::o;19814:112::-;19846:1;19872;19862:35;;19877:18;;:::i;:::-;-1:-1:-1;19911:9:1;;19814:112::o;19931:127::-;19992:10;19987:3;19983:20;19980:1;19973:31;20023:4;20020:1;20013:15;20047:4;20044:1;20037:15;20063:127;20124:10;20119:3;20115:20;20112:1;20105:31;20155:4;20152:1;20145:15;20179:4;20176:1;20169:15;20195:127;20256:10;20251:3;20247:20;20244:1;20237:31;20287:4;20284:1;20277:15;20311:4;20308:1;20301:15;20327:127;20388:10;20383:3;20379:20;20376:1;20369:31;20419:4;20416:1;20409:15;20443:4;20440:1;20433:15;20459:131;-1:-1:-1;;;;;;20533:32:1;;20523:43;;20513:71;;20580:1;20577;20570:12

Swarm Source

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