ETH Price: $2,852.50 (-10.29%)
Gas: 14 Gwei

Token

Operatives (AICO)
 

Overview

Max Total Supply

1,590 AICO

Holders

752

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
clabey.eth
Balance
2 AICO
0x9047a330300f756214e5035937c847dd34b82e0f
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
AIC_Operatives

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-08-04
*/

// SPDX-License-Identifier: MIT
/*
    _   ___ ___    ___                     _   _            
   /_\ |_ _/ __|  / _ \ _ __  ___ _ _ __ _| |_(_)_ _____ ___
  / _ \ | | (__  | (_) | '_ \/ -_) '_/ _` |  _| \ V / -_|_-<
 /_/ \_\___\___|  \___/| .__/\___|_| \__,_|\__|_|\_/\___/__/
                       |_|                                  
                  By Devko.dev#7286
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

// File: erc721a/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

/**
 * @dev Interface of ERC721A.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the
     * ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

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

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

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

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

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

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

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

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

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

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

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

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

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

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

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

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

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

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

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: erc721a/contracts/ERC721A.sol


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

pragma solidity ^0.8.4;


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

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

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

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

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

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

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

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

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

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

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

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

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

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

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

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

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

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

    // The next token ID to be minted.
    uint256 private _currentIndex;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

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

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

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

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

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

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

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

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

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

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

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

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

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

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

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

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

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

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

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

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

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

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

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

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

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

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

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

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

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

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

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

    /**
     * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns whether the call correctly returned the expected magic value.
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

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

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

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

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

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }

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

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

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

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

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

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

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

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

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

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

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

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

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

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

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

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

// File: contract.sol

pragma solidity ^0.8.7;

contract AIC_Operatives is ERC721A, Ownable {
    using Strings for uint256;
    using ECDSA for bytes32;

    string private baseURI = "https://gateway.pinata.cloud/ipfs/QmTp8nte7JnvQmxbESdLk3qhcCL5NViqZijKDXigdrxrvd/";
    string public privateSigWord = "AIC_GEN2_PRIVATE";
    uint256 public maxSaleSupply = 5486;
    uint256 public maxTeamSupply = 514;
    uint256 public privatePrice = 0.09 ether;
    uint256 public publicPrice = 0.11 ether;
    uint256 public maxMintsPerTx = 5;
    uint256 public mintedCounter;
    uint256 public teamMintedCounter;
    address public privateSigner = 0x89E331970dba855A8E5d86371C4c47bCf60aa4F5;
    bool public publicLive;
    bool public privateLive;

    mapping(address => uint256) public privateMinters;

    constructor() ERC721A("Operatives", "AICO") {}

    function _startTokenId() internal view virtual override(ERC721A) returns (uint256) {
        return 1;
    }

    modifier notContract() {
        require(
            (!_isContract(msg.sender)) && (msg.sender == tx.origin),
            "contract not allowed"
        );
        _;
    }

    function _isContract(address addr) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(addr)
        }
        return size > 0;
    }

    function matchAddresSigner(bytes memory signature, uint256 maxMints) private view returns (bool) {
        bytes32 hash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", keccak256(abi.encodePacked(msg.sender, privateSigWord, maxMints))));
        return privateSigner == hash.recover(signature);
    }

    function mint(uint256 tokenQuantity) external payable notContract {
        require(publicLive, "MINT_CLOSED");
        require(mintedCounter + tokenQuantity <= maxSaleSupply, "EXCEED_SALE_SUPPLY");
        require(tokenQuantity <= maxMintsPerTx, "EXCEED_PER_TX");
        require(publicPrice * tokenQuantity <= msg.value, "INSUFFICIENT_ETH");

        mintedCounter +=tokenQuantity;
        _mint(msg.sender, tokenQuantity);
    }

    function privateMint(uint256 tokenQuantity, bytes memory signature, uint256 maxMints) external payable notContract {
        require(privateLive, "MINT_CLOSED");
        require(mintedCounter + tokenQuantity <= maxSaleSupply, "EXCEED_SALE_SUPPLY");
        require(matchAddresSigner(signature, maxMints), "INVALID_SIGNATURE");
        require(privateMinters[msg.sender] + tokenQuantity <= maxMints, "EXCEED_PER_WALLET");
        require(privatePrice * tokenQuantity <= msg.value, "INSUFFICIENT_ETH");

        mintedCounter +=tokenQuantity;
        privateMinters[msg.sender] = privateMinters[msg.sender] + tokenQuantity;
        _mint(msg.sender, tokenQuantity);
    }

    function tokenURI(uint256 tokenId) public view override(ERC721A) returns (string memory) {
        require(_exists(tokenId), "Cannot query non-existent token");
        return string(abi.encodePacked(baseURI, tokenId.toString()));
    }

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

    function gift(address[] calldata receivers) external onlyOwner {
        require(teamMintedCounter + receivers.length <= maxTeamSupply, "EXCEED_TEAM_SUPPLY");
        
        teamMintedCounter += receivers.length;
        for (uint256 i = 0; i < receivers.length; i++) {
            _mint(receivers[i], 1);
        }
    }

    function founderMint(uint256 tokenQuantity) external onlyOwner {
        require(teamMintedCounter + tokenQuantity <= maxTeamSupply, "EXCEED_TEAM_SUPPLY");

        teamMintedCounter += tokenQuantity;
        _mint(msg.sender, tokenQuantity);
    }

    function togglePublicStatus() external onlyOwner {
        publicLive = !publicLive;
    }

    function togglePrivateStatus() external onlyOwner {
        privateLive = !privateLive;
    }

    function setPublicPrice(uint256 newPrice) external onlyOwner {
        publicPrice = newPrice;
    }

    function setPrivatePrice(uint256 newPrice) external onlyOwner {
        privatePrice = newPrice;
    }

    function setMax(uint256 newCount) external onlyOwner {
        maxSaleSupply = newCount;
    }

    function setTeamMax(uint256 newCount) external onlyOwner {
        maxTeamSupply = newCount;
    }

    function setMaxPerTx(uint256 newCount) external onlyOwner {
        maxMintsPerTx = newCount;
    }

    function setSigner(address newAddress) external onlyOwner {
        privateSigner = newAddress;
    }

    function setBaseURI(string calldata newBaseURI) external onlyOwner {
        baseURI = newBaseURI;
    }

    function withdraw() external onlyOwner {
        uint256 currentBalance = address(this).balance;
        Address.sendValue(payable(0x00000040f69B8E3382734491cBAA241B6a863AB3), (currentBalance * 10) / 100);
        Address.sendValue(payable(0x773DAaCda9E4d7C7955BCef1fbF807D318501F44), (currentBalance * 10) / 100);
        Address.sendValue(payable(0x4c35286d99b5879c45538Da5f59588A601359e34), (currentBalance * 10) / 100);
        Address.sendValue(payable(0x3A7D619d3ED6Fb04799642f88BD3dFab63af0a83), (currentBalance * 10) / 100);
        Address.sendValue(payable(0xbF6c44be5AC250B30726E9405d4fD80Bd16A1ae2), (currentBalance * 8) / 100);
        Address.sendValue(payable(0x4D214C5Ea3ddE7E416e128E71a6A547E645e5d9b), (currentBalance * 6) / 100);
        Address.sendValue(payable(0xa642830cCe2e2741BB654B479DC1Dc33E910ae55), (currentBalance * 85) / 1000);
        Address.sendValue(payable(0xCa7987Dc570540F6045759e4207eDad2D4f04F82), (currentBalance * 85) / 1000);
        Address.sendValue(payable(0x3FD45f7fc6da24A360E75aFF9DE577ab5fbdcfE7), address(this).balance);    
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"founderMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","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":"maxMintsPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSaleSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTeamSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintedCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenQuantity","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"maxMints","type":"uint256"}],"name":"privateMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"privateMinters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privatePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateSigWord","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCount","type":"uint256"}],"name":"setMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCount","type":"uint256"}],"name":"setMaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrivatePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCount","type":"uint256"}],"name":"setTeamMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamMintedCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePrivateStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

61010060405260516080818152906200285860a03980516200002a9160099160209091019062000191565b506040805180820190915260108082526f4149435f47454e325f5052495641544560801b60209092019182526200006491600a9162000191565b5061156e600b55610202600c5567013fbe85edc90000600d55670186cc6acd4b0000600e556005600f55601280546001600160a01b0319167389e331970dba855a8e5d86371c4c47bcf60aa4f5179055348015620000c157600080fd5b50604080518082018252600a8152694f70657261746976657360b01b6020808301918252835180850190945260048452634149434f60e01b908401528151919291620001109160029162000191565b5080516200012690600390602084019062000191565b505060016000555062000139336200013f565b62000274565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200019f9062000237565b90600052602060002090601f016020900481019282620001c357600085556200020e565b82601f10620001de57805160ff19168380011785556200020e565b828001600101855582156200020e579182015b828111156200020e578251825591602001919060010190620001f1565b506200021c92915062000220565b5090565b5b808211156200021c576000815560010162000221565b600181811c908216806200024c57607f821691505b602082108114156200026e57634e487b7160e01b600052602260045260246000fd5b50919050565b6125d480620002846000396000f3fe6080604052600436106102605760003560e01c8063898f717211610144578063b88d4fde116100b6578063cbe116441161007a578063cbe11644146106b9578063d97d28d2146106d9578063dc30158b146106f9578063e985e9c51461070f578063f2fde38b14610758578063f42202e81461077857600080fd5b8063b88d4fde14610624578063c46eb68514610644578063c627525514610659578063c6f6f21614610679578063c87b56dd1461069957600080fd5b8063a0712d6811610108578063a0712d6814610584578063a10f151e14610597578063a22cb465146105b7578063a945bf80146105d7578063b29418d5146105ed578063b7f751d81461060357600080fd5b8063898f7172146104ee5780638da5cb5b1461050357806390edd6971461052157806395d89b411461054e57806397283d2f1461056357600080fd5b80633ccfd60b116101dd5780636352211e116101a15780636352211e1461044d5780636c19e7831461046d57806370a082311461048d578063715018a6146104ad57806379aee341146104c257806387c0568b146104d857600080fd5b80633ccfd60b146103cf57806342842e0e146103e457806343fbdefd146104045780634b2596c71461041757806355f804b31461042d57600080fd5b806318160ddd1161022457806318160ddd1461033d5780631ead3877146103645780631fe9eabc1461037a57806323b872dd1461039a57806333098c01146103ba57600080fd5b806301ffc9a71461026c57806306fdde03146102a1578063081812fc146102c3578063095ea7b3146102fb578063163e1e611461031d57600080fd5b3661026757005b600080fd5b34801561027857600080fd5b5061028c6102873660046121b2565b610798565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b506102b66107ea565b604051610298919061240f565b3480156102cf57600080fd5b506102e36102de36600461224c565b61087c565b6040516001600160a01b039091168152602001610298565b34801561030757600080fd5b5061031b610316366004612113565b6108c0565b005b34801561032957600080fd5b5061031b61033836600461213d565b610960565b34801561034957600080fd5b5060015460005403600019015b604051908152602001610298565b34801561037057600080fd5b5061035660115481565b34801561038657600080fd5b5061031b61039536600461224c565b610a2f565b3480156103a657600080fd5b5061031b6103b5366004612033565b610a3c565b3480156103c657600080fd5b5061031b610bcd565b3480156103db57600080fd5b5061031b610bf6565b3480156103f057600080fd5b5061031b6103ff366004612033565b610d56565b61031b610412366004612265565b610d71565b34801561042357600080fd5b50610356600c5481565b34801561043957600080fd5b5061031b6104483660046121ec565b610fa5565b34801561045957600080fd5b506102e361046836600461224c565b610fb9565b34801561047957600080fd5b5061031b610488366004611fe5565b610fc4565b34801561049957600080fd5b506103566104a8366004611fe5565b610fee565b3480156104b957600080fd5b5061031b61103d565b3480156104ce57600080fd5b5061035660105481565b3480156104e457600080fd5b50610356600d5481565b3480156104fa57600080fd5b506102b6611051565b34801561050f57600080fd5b506008546001600160a01b03166102e3565b34801561052d57600080fd5b5061035661053c366004611fe5565b60136020526000908152604090205481565b34801561055a57600080fd5b506102b66110df565b34801561056f57600080fd5b5060125461028c90600160a81b900460ff1681565b61031b61059236600461224c565b6110ee565b3480156105a357600080fd5b5061031b6105b236600461224c565b61128e565b3480156105c357600080fd5b5061031b6105d23660046120d7565b61129b565b3480156105e357600080fd5b50610356600e5481565b3480156105f957600080fd5b50610356600b5481565b34801561060f57600080fd5b5060125461028c90600160a01b900460ff1681565b34801561063057600080fd5b5061031b61063f36600461206f565b611331565b34801561065057600080fd5b5061031b61137b565b34801561066557600080fd5b5061031b61067436600461224c565b6113a4565b34801561068557600080fd5b5061031b61069436600461224c565b6113b1565b3480156106a557600080fd5b506102b66106b436600461224c565b6113be565b3480156106c557600080fd5b5061031b6106d436600461224c565b611447565b3480156106e557600080fd5b506012546102e3906001600160a01b031681565b34801561070557600080fd5b50610356600f5481565b34801561071b57600080fd5b5061028c61072a366004612000565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561076457600080fd5b5061031b610773366004611fe5565b611454565b34801561078457600080fd5b5061031b61079336600461224c565b6114ca565b60006301ffc9a760e01b6001600160e01b0319831614806107c957506380ac58cd60e01b6001600160e01b03198316145b806107e45750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546107f9906124b0565b80601f0160208091040260200160405190810160405280929190818152602001828054610825906124b0565b80156108725780601f1061084757610100808354040283529160200191610872565b820191906000526020600020905b81548152906001019060200180831161085557829003601f168201915b5050505050905090565b600061088782611538565b6108a4576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006108cb82610fb9565b9050336001600160a01b03821614610904576108e7813361072a565b610904576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b61096861156d565b600c54601154610979908390612422565b11156109c15760405162461bcd60e51b81526020600482015260126024820152714558434545445f5445414d5f535550504c5960701b60448201526064015b60405180910390fd5b81819050601160008282546109d69190612422565b90915550600090505b81811015610a2a57610a188383838181106109fc576109fc61255c565b9050602002016020810190610a119190611fe5565b60016115c7565b80610a22816124eb565b9150506109df565b505050565b610a3761156d565b600b55565b6000610a47826116be565b9050836001600160a01b0316816001600160a01b031614610a7a5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610ac757610aaa863361072a565b610ac757604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610aee57604051633a954ecd60e21b815260040160405180910390fd5b8015610af957600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040902055600160e11b8316610b845760018401600081815260046020526040902054610b82576000548114610b825760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b610bd561156d565b6012805460ff60a01b198116600160a01b9182900460ff1615909102179055565b610bfe61156d565b47610c307040f69b8e3382734491cbaa241b6a863ab36064610c2184600a61244e565b610c2b919061243a565b61172e565b610c5573773daacda9e4d7c7955bcef1fbf807d318501f446064610c2184600a61244e565b610c7a734c35286d99b5879c45538da5f59588a601359e346064610c2184600a61244e565b610c9f733a7d619d3ed6fb04799642f88bd3dfab63af0a836064610c2184600a61244e565b610cc473bf6c44be5ac250b30726e9405d4fd80bd16a1ae26064610c2184600861244e565b610ce9734d214c5ea3dde7e416e128e71a6a547e645e5d9b6064610c2184600661244e565b610d0f73a642830cce2e2741bb654b479dc1dc33e910ae556103e8610c2184605561244e565b610d3573ca7987dc570540f6045759e4207edad2d4f04f826103e8610c2184605561244e565b610d53733fd45f7fc6da24a360e75aff9de577ab5fbdcfe74761172e565b50565b610a2a83838360405180602001604052806000815250611331565b333b158015610d7f57503332145b610dc25760405162461bcd60e51b815260206004820152601460248201527318dbdb9d1c9858dd081b9bdd08185b1b1bddd95960621b60448201526064016109b8565b601254600160a81b900460ff16610e095760405162461bcd60e51b815260206004820152600b60248201526a1352539517d0d313d4d15160aa1b60448201526064016109b8565b600b5483601054610e1a9190612422565b1115610e5d5760405162461bcd60e51b81526020600482015260126024820152714558434545445f53414c455f535550504c5960701b60448201526064016109b8565b610e678282611847565b610ea75760405162461bcd60e51b8152602060048201526011602482015270494e56414c49445f5349474e415455524560781b60448201526064016109b8565b336000908152601360205260409020548190610ec4908590612422565b1115610f065760405162461bcd60e51b8152602060048201526011602482015270115610d1515117d4115497d5d053131155607a1b60448201526064016109b8565b3483600d54610f15919061244e565b1115610f565760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b60448201526064016109b8565b8260106000828254610f689190612422565b909155505033600090815260136020526040902054610f88908490612422565b33600081815260136020526040902091909155610a2a90846115c7565b610fad61156d565b610a2a60098383611ea3565b60006107e4826116be565b610fcc61156d565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b038216611017576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b61104561156d565b61104f60006118e6565b565b600a805461105e906124b0565b80601f016020809104026020016040519081016040528092919081815260200182805461108a906124b0565b80156110d75780601f106110ac576101008083540402835291602001916110d7565b820191906000526020600020905b8154815290600101906020018083116110ba57829003601f168201915b505050505081565b6060600380546107f9906124b0565b333b1580156110fc57503332145b61113f5760405162461bcd60e51b815260206004820152601460248201527318dbdb9d1c9858dd081b9bdd08185b1b1bddd95960621b60448201526064016109b8565b601254600160a01b900460ff166111865760405162461bcd60e51b815260206004820152600b60248201526a1352539517d0d313d4d15160aa1b60448201526064016109b8565b600b54816010546111979190612422565b11156111da5760405162461bcd60e51b81526020600482015260126024820152714558434545445f53414c455f535550504c5960701b60448201526064016109b8565b600f5481111561121c5760405162461bcd60e51b815260206004820152600d60248201526c08ab0868a8a88bea08aa4bea8b609b1b60448201526064016109b8565b3481600e5461122b919061244e565b111561126c5760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b60448201526064016109b8565b806010600082825461127e9190612422565b90915550610d53905033826115c7565b61129661156d565b600d55565b6001600160a01b0382163314156112c55760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61133c848484610a3c565b6001600160a01b0383163b156113755761135884848484611938565b611375576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b61138361156d565b6012805460ff60a81b198116600160a81b9182900460ff1615909102179055565b6113ac61156d565b600e55565b6113b961156d565b600f55565b60606113c982611538565b6114155760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e0060448201526064016109b8565b600961142083611a30565b6040516020016114319291906123ad565b6040516020818303038152906040529050919050565b61144f61156d565b600c55565b61145c61156d565b6001600160a01b0381166114c15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109b8565b610d53816118e6565b6114d261156d565b600c54816011546114e39190612422565b11156115265760405162461bcd60e51b81526020600482015260126024820152714558434545445f5445414d5f535550504c5960701b60448201526064016109b8565b806011600082825461127e9190612422565b60008160011115801561154c575060005482105b80156107e4575050600090815260046020526040902054600160e01b161590565b6008546001600160a01b0316331461104f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109b8565b600054816115e85760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461169757808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460010161165f565b50816116b557604051622e076360e81b815260040160405180910390fd5b60005550505050565b600081806001116117155760005481101561171557600081815260046020526040902054600160e01b8116611713575b8061170c5750600019016000818152600460205260409020546116ee565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b8047101561177e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109b8565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146117cb576040519150601f19603f3d011682016040523d82523d6000602084013e6117d0565b606091505b5050905080610a2a5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109b8565b60008033600a846040516020016118609392919061237b565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c0160408051601f19818403018152919052805160209091012090506118cd8185611b2e565b6012546001600160a01b03918216911614949350505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061196d9033908990889088906004016123d2565b602060405180830381600087803b15801561198757600080fd5b505af19250505080156119b7575060408051601f3d908101601f191682019092526119b4918101906121cf565b60015b611a12573d8080156119e5576040519150601f19603f3d011682016040523d82523d6000602084013e6119ea565b606091505b508051611a0a576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606081611a545750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611a7e5780611a68816124eb565b9150611a779050600a8361243a565b9150611a58565b60008167ffffffffffffffff811115611a9957611a99612572565b6040519080825280601f01601f191660200182016040528015611ac3576020820181803683370190505b5090505b8415611a2857611ad860018361246d565b9150611ae5600a86612506565b611af0906030612422565b60f81b818381518110611b0557611b0561255c565b60200101906001600160f81b031916908160001a905350611b27600a8661243a565b9450611ac7565b6000806000611b3d8585611b52565b91509150611b4a81611bc2565b509392505050565b600080825160411415611b895760208301516040840151606085015160001a611b7d87828585611d7d565b94509450505050611bbb565b825160401415611bb35760208301516040840151611ba8868383611e6a565b935093505050611bbb565b506000905060025b9250929050565b6000816004811115611bd657611bd6612546565b1415611bdf5750565b6001816004811115611bf357611bf3612546565b1415611c415760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016109b8565b6002816004811115611c5557611c55612546565b1415611ca35760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016109b8565b6003816004811115611cb757611cb7612546565b1415611d105760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016109b8565b6004816004811115611d2457611d24612546565b1415610d535760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016109b8565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611db45750600090506003611e61565b8460ff16601b14158015611dcc57508460ff16601c14155b15611ddd5750600090506004611e61565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611e31573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611e5a57600060019250925050611e61565b9150600090505b94509492505050565b6000806001600160ff1b03831681611e8760ff86901c601b612422565b9050611e9587828885611d7d565b935093505050935093915050565b828054611eaf906124b0565b90600052602060002090601f016020900481019282611ed15760008555611f17565b82601f10611eea5782800160ff19823516178555611f17565b82800160010185558215611f17579182015b82811115611f17578235825591602001919060010190611efc565b50611f23929150611f27565b5090565b5b80821115611f235760008155600101611f28565b80356001600160a01b0381168114611f5357600080fd5b919050565b600082601f830112611f6957600080fd5b813567ffffffffffffffff80821115611f8457611f84612572565b604051601f8301601f19908116603f01168101908282118183101715611fac57611fac612572565b81604052838152866020858801011115611fc557600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215611ff757600080fd5b61170c82611f3c565b6000806040838503121561201357600080fd5b61201c83611f3c565b915061202a60208401611f3c565b90509250929050565b60008060006060848603121561204857600080fd5b61205184611f3c565b925061205f60208501611f3c565b9150604084013590509250925092565b6000806000806080858703121561208557600080fd5b61208e85611f3c565b935061209c60208601611f3c565b925060408501359150606085013567ffffffffffffffff8111156120bf57600080fd5b6120cb87828801611f58565b91505092959194509250565b600080604083850312156120ea57600080fd5b6120f383611f3c565b91506020830135801515811461210857600080fd5b809150509250929050565b6000806040838503121561212657600080fd5b61212f83611f3c565b946020939093013593505050565b6000806020838503121561215057600080fd5b823567ffffffffffffffff8082111561216857600080fd5b818501915085601f83011261217c57600080fd5b81358181111561218b57600080fd5b8660208260051b85010111156121a057600080fd5b60209290920196919550909350505050565b6000602082840312156121c457600080fd5b813561170c81612588565b6000602082840312156121e157600080fd5b815161170c81612588565b600080602083850312156121ff57600080fd5b823567ffffffffffffffff8082111561221757600080fd5b818501915085601f83011261222b57600080fd5b81358181111561223a57600080fd5b8660208285010111156121a057600080fd5b60006020828403121561225e57600080fd5b5035919050565b60008060006060848603121561227a57600080fd5b83359250602084013567ffffffffffffffff81111561229857600080fd5b6122a486828701611f58565b925050604084013590509250925092565b600081518084526122cd816020860160208601612484565b601f01601f19169290920160200192915050565b8054600090600181811c90808316806122fb57607f831692505b602080841082141561231d57634e487b7160e01b600052602260045260246000fd5b81801561233157600181146123425761236f565b60ff1986168952848901965061236f565b60008881526020902060005b868110156123675781548b82015290850190830161234e565b505084890196505b50505050505092915050565b6bffffffffffffffffffffffff198460601b168152600061239f60148301856122e1565b928352505060200192915050565b60006123b982856122e1565b83516123c9818360208801612484565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612405908301846122b5565b9695505050505050565b60208152600061170c60208301846122b5565b600082198211156124355761243561251a565b500190565b60008261244957612449612530565b500490565b60008160001904831182151516156124685761246861251a565b500290565b60008282101561247f5761247f61251a565b500390565b60005b8381101561249f578181015183820152602001612487565b838111156113755750506000910152565b600181811c908216806124c457607f821691505b602082108114156124e557634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156124ff576124ff61251a565b5060010190565b60008261251557612515612530565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610d5357600080fdfea2646970667358221220197e314334074c58b1753e518c7ee09de90709efdbb90ecdafd93dcc0fe1119a64736f6c6343000807003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d5470386e7465374a6e76516d78624553644c6b33716863434c354e5669715a696a4b445869676472787276642f

Deployed Bytecode

0x6080604052600436106102605760003560e01c8063898f717211610144578063b88d4fde116100b6578063cbe116441161007a578063cbe11644146106b9578063d97d28d2146106d9578063dc30158b146106f9578063e985e9c51461070f578063f2fde38b14610758578063f42202e81461077857600080fd5b8063b88d4fde14610624578063c46eb68514610644578063c627525514610659578063c6f6f21614610679578063c87b56dd1461069957600080fd5b8063a0712d6811610108578063a0712d6814610584578063a10f151e14610597578063a22cb465146105b7578063a945bf80146105d7578063b29418d5146105ed578063b7f751d81461060357600080fd5b8063898f7172146104ee5780638da5cb5b1461050357806390edd6971461052157806395d89b411461054e57806397283d2f1461056357600080fd5b80633ccfd60b116101dd5780636352211e116101a15780636352211e1461044d5780636c19e7831461046d57806370a082311461048d578063715018a6146104ad57806379aee341146104c257806387c0568b146104d857600080fd5b80633ccfd60b146103cf57806342842e0e146103e457806343fbdefd146104045780634b2596c71461041757806355f804b31461042d57600080fd5b806318160ddd1161022457806318160ddd1461033d5780631ead3877146103645780631fe9eabc1461037a57806323b872dd1461039a57806333098c01146103ba57600080fd5b806301ffc9a71461026c57806306fdde03146102a1578063081812fc146102c3578063095ea7b3146102fb578063163e1e611461031d57600080fd5b3661026757005b600080fd5b34801561027857600080fd5b5061028c6102873660046121b2565b610798565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b506102b66107ea565b604051610298919061240f565b3480156102cf57600080fd5b506102e36102de36600461224c565b61087c565b6040516001600160a01b039091168152602001610298565b34801561030757600080fd5b5061031b610316366004612113565b6108c0565b005b34801561032957600080fd5b5061031b61033836600461213d565b610960565b34801561034957600080fd5b5060015460005403600019015b604051908152602001610298565b34801561037057600080fd5b5061035660115481565b34801561038657600080fd5b5061031b61039536600461224c565b610a2f565b3480156103a657600080fd5b5061031b6103b5366004612033565b610a3c565b3480156103c657600080fd5b5061031b610bcd565b3480156103db57600080fd5b5061031b610bf6565b3480156103f057600080fd5b5061031b6103ff366004612033565b610d56565b61031b610412366004612265565b610d71565b34801561042357600080fd5b50610356600c5481565b34801561043957600080fd5b5061031b6104483660046121ec565b610fa5565b34801561045957600080fd5b506102e361046836600461224c565b610fb9565b34801561047957600080fd5b5061031b610488366004611fe5565b610fc4565b34801561049957600080fd5b506103566104a8366004611fe5565b610fee565b3480156104b957600080fd5b5061031b61103d565b3480156104ce57600080fd5b5061035660105481565b3480156104e457600080fd5b50610356600d5481565b3480156104fa57600080fd5b506102b6611051565b34801561050f57600080fd5b506008546001600160a01b03166102e3565b34801561052d57600080fd5b5061035661053c366004611fe5565b60136020526000908152604090205481565b34801561055a57600080fd5b506102b66110df565b34801561056f57600080fd5b5060125461028c90600160a81b900460ff1681565b61031b61059236600461224c565b6110ee565b3480156105a357600080fd5b5061031b6105b236600461224c565b61128e565b3480156105c357600080fd5b5061031b6105d23660046120d7565b61129b565b3480156105e357600080fd5b50610356600e5481565b3480156105f957600080fd5b50610356600b5481565b34801561060f57600080fd5b5060125461028c90600160a01b900460ff1681565b34801561063057600080fd5b5061031b61063f36600461206f565b611331565b34801561065057600080fd5b5061031b61137b565b34801561066557600080fd5b5061031b61067436600461224c565b6113a4565b34801561068557600080fd5b5061031b61069436600461224c565b6113b1565b3480156106a557600080fd5b506102b66106b436600461224c565b6113be565b3480156106c557600080fd5b5061031b6106d436600461224c565b611447565b3480156106e557600080fd5b506012546102e3906001600160a01b031681565b34801561070557600080fd5b50610356600f5481565b34801561071b57600080fd5b5061028c61072a366004612000565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561076457600080fd5b5061031b610773366004611fe5565b611454565b34801561078457600080fd5b5061031b61079336600461224c565b6114ca565b60006301ffc9a760e01b6001600160e01b0319831614806107c957506380ac58cd60e01b6001600160e01b03198316145b806107e45750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546107f9906124b0565b80601f0160208091040260200160405190810160405280929190818152602001828054610825906124b0565b80156108725780601f1061084757610100808354040283529160200191610872565b820191906000526020600020905b81548152906001019060200180831161085557829003601f168201915b5050505050905090565b600061088782611538565b6108a4576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006108cb82610fb9565b9050336001600160a01b03821614610904576108e7813361072a565b610904576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b61096861156d565b600c54601154610979908390612422565b11156109c15760405162461bcd60e51b81526020600482015260126024820152714558434545445f5445414d5f535550504c5960701b60448201526064015b60405180910390fd5b81819050601160008282546109d69190612422565b90915550600090505b81811015610a2a57610a188383838181106109fc576109fc61255c565b9050602002016020810190610a119190611fe5565b60016115c7565b80610a22816124eb565b9150506109df565b505050565b610a3761156d565b600b55565b6000610a47826116be565b9050836001600160a01b0316816001600160a01b031614610a7a5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610ac757610aaa863361072a565b610ac757604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610aee57604051633a954ecd60e21b815260040160405180910390fd5b8015610af957600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040902055600160e11b8316610b845760018401600081815260046020526040902054610b82576000548114610b825760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b610bd561156d565b6012805460ff60a01b198116600160a01b9182900460ff1615909102179055565b610bfe61156d565b47610c307040f69b8e3382734491cbaa241b6a863ab36064610c2184600a61244e565b610c2b919061243a565b61172e565b610c5573773daacda9e4d7c7955bcef1fbf807d318501f446064610c2184600a61244e565b610c7a734c35286d99b5879c45538da5f59588a601359e346064610c2184600a61244e565b610c9f733a7d619d3ed6fb04799642f88bd3dfab63af0a836064610c2184600a61244e565b610cc473bf6c44be5ac250b30726e9405d4fd80bd16a1ae26064610c2184600861244e565b610ce9734d214c5ea3dde7e416e128e71a6a547e645e5d9b6064610c2184600661244e565b610d0f73a642830cce2e2741bb654b479dc1dc33e910ae556103e8610c2184605561244e565b610d3573ca7987dc570540f6045759e4207edad2d4f04f826103e8610c2184605561244e565b610d53733fd45f7fc6da24a360e75aff9de577ab5fbdcfe74761172e565b50565b610a2a83838360405180602001604052806000815250611331565b333b158015610d7f57503332145b610dc25760405162461bcd60e51b815260206004820152601460248201527318dbdb9d1c9858dd081b9bdd08185b1b1bddd95960621b60448201526064016109b8565b601254600160a81b900460ff16610e095760405162461bcd60e51b815260206004820152600b60248201526a1352539517d0d313d4d15160aa1b60448201526064016109b8565b600b5483601054610e1a9190612422565b1115610e5d5760405162461bcd60e51b81526020600482015260126024820152714558434545445f53414c455f535550504c5960701b60448201526064016109b8565b610e678282611847565b610ea75760405162461bcd60e51b8152602060048201526011602482015270494e56414c49445f5349474e415455524560781b60448201526064016109b8565b336000908152601360205260409020548190610ec4908590612422565b1115610f065760405162461bcd60e51b8152602060048201526011602482015270115610d1515117d4115497d5d053131155607a1b60448201526064016109b8565b3483600d54610f15919061244e565b1115610f565760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b60448201526064016109b8565b8260106000828254610f689190612422565b909155505033600090815260136020526040902054610f88908490612422565b33600081815260136020526040902091909155610a2a90846115c7565b610fad61156d565b610a2a60098383611ea3565b60006107e4826116be565b610fcc61156d565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b038216611017576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b61104561156d565b61104f60006118e6565b565b600a805461105e906124b0565b80601f016020809104026020016040519081016040528092919081815260200182805461108a906124b0565b80156110d75780601f106110ac576101008083540402835291602001916110d7565b820191906000526020600020905b8154815290600101906020018083116110ba57829003601f168201915b505050505081565b6060600380546107f9906124b0565b333b1580156110fc57503332145b61113f5760405162461bcd60e51b815260206004820152601460248201527318dbdb9d1c9858dd081b9bdd08185b1b1bddd95960621b60448201526064016109b8565b601254600160a01b900460ff166111865760405162461bcd60e51b815260206004820152600b60248201526a1352539517d0d313d4d15160aa1b60448201526064016109b8565b600b54816010546111979190612422565b11156111da5760405162461bcd60e51b81526020600482015260126024820152714558434545445f53414c455f535550504c5960701b60448201526064016109b8565b600f5481111561121c5760405162461bcd60e51b815260206004820152600d60248201526c08ab0868a8a88bea08aa4bea8b609b1b60448201526064016109b8565b3481600e5461122b919061244e565b111561126c5760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b60448201526064016109b8565b806010600082825461127e9190612422565b90915550610d53905033826115c7565b61129661156d565b600d55565b6001600160a01b0382163314156112c55760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61133c848484610a3c565b6001600160a01b0383163b156113755761135884848484611938565b611375576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b61138361156d565b6012805460ff60a81b198116600160a81b9182900460ff1615909102179055565b6113ac61156d565b600e55565b6113b961156d565b600f55565b60606113c982611538565b6114155760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e0060448201526064016109b8565b600961142083611a30565b6040516020016114319291906123ad565b6040516020818303038152906040529050919050565b61144f61156d565b600c55565b61145c61156d565b6001600160a01b0381166114c15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109b8565b610d53816118e6565b6114d261156d565b600c54816011546114e39190612422565b11156115265760405162461bcd60e51b81526020600482015260126024820152714558434545445f5445414d5f535550504c5960701b60448201526064016109b8565b806011600082825461127e9190612422565b60008160011115801561154c575060005482105b80156107e4575050600090815260046020526040902054600160e01b161590565b6008546001600160a01b0316331461104f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109b8565b600054816115e85760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461169757808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460010161165f565b50816116b557604051622e076360e81b815260040160405180910390fd5b60005550505050565b600081806001116117155760005481101561171557600081815260046020526040902054600160e01b8116611713575b8061170c5750600019016000818152600460205260409020546116ee565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b8047101561177e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109b8565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146117cb576040519150601f19603f3d011682016040523d82523d6000602084013e6117d0565b606091505b5050905080610a2a5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109b8565b60008033600a846040516020016118609392919061237b565b60408051601f198184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c0160408051601f19818403018152919052805160209091012090506118cd8185611b2e565b6012546001600160a01b03918216911614949350505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061196d9033908990889088906004016123d2565b602060405180830381600087803b15801561198757600080fd5b505af19250505080156119b7575060408051601f3d908101601f191682019092526119b4918101906121cf565b60015b611a12573d8080156119e5576040519150601f19603f3d011682016040523d82523d6000602084013e6119ea565b606091505b508051611a0a576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606081611a545750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611a7e5780611a68816124eb565b9150611a779050600a8361243a565b9150611a58565b60008167ffffffffffffffff811115611a9957611a99612572565b6040519080825280601f01601f191660200182016040528015611ac3576020820181803683370190505b5090505b8415611a2857611ad860018361246d565b9150611ae5600a86612506565b611af0906030612422565b60f81b818381518110611b0557611b0561255c565b60200101906001600160f81b031916908160001a905350611b27600a8661243a565b9450611ac7565b6000806000611b3d8585611b52565b91509150611b4a81611bc2565b509392505050565b600080825160411415611b895760208301516040840151606085015160001a611b7d87828585611d7d565b94509450505050611bbb565b825160401415611bb35760208301516040840151611ba8868383611e6a565b935093505050611bbb565b506000905060025b9250929050565b6000816004811115611bd657611bd6612546565b1415611bdf5750565b6001816004811115611bf357611bf3612546565b1415611c415760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016109b8565b6002816004811115611c5557611c55612546565b1415611ca35760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016109b8565b6003816004811115611cb757611cb7612546565b1415611d105760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016109b8565b6004816004811115611d2457611d24612546565b1415610d535760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016109b8565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611db45750600090506003611e61565b8460ff16601b14158015611dcc57508460ff16601c14155b15611ddd5750600090506004611e61565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611e31573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611e5a57600060019250925050611e61565b9150600090505b94509492505050565b6000806001600160ff1b03831681611e8760ff86901c601b612422565b9050611e9587828885611d7d565b935093505050935093915050565b828054611eaf906124b0565b90600052602060002090601f016020900481019282611ed15760008555611f17565b82601f10611eea5782800160ff19823516178555611f17565b82800160010185558215611f17579182015b82811115611f17578235825591602001919060010190611efc565b50611f23929150611f27565b5090565b5b80821115611f235760008155600101611f28565b80356001600160a01b0381168114611f5357600080fd5b919050565b600082601f830112611f6957600080fd5b813567ffffffffffffffff80821115611f8457611f84612572565b604051601f8301601f19908116603f01168101908282118183101715611fac57611fac612572565b81604052838152866020858801011115611fc557600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215611ff757600080fd5b61170c82611f3c565b6000806040838503121561201357600080fd5b61201c83611f3c565b915061202a60208401611f3c565b90509250929050565b60008060006060848603121561204857600080fd5b61205184611f3c565b925061205f60208501611f3c565b9150604084013590509250925092565b6000806000806080858703121561208557600080fd5b61208e85611f3c565b935061209c60208601611f3c565b925060408501359150606085013567ffffffffffffffff8111156120bf57600080fd5b6120cb87828801611f58565b91505092959194509250565b600080604083850312156120ea57600080fd5b6120f383611f3c565b91506020830135801515811461210857600080fd5b809150509250929050565b6000806040838503121561212657600080fd5b61212f83611f3c565b946020939093013593505050565b6000806020838503121561215057600080fd5b823567ffffffffffffffff8082111561216857600080fd5b818501915085601f83011261217c57600080fd5b81358181111561218b57600080fd5b8660208260051b85010111156121a057600080fd5b60209290920196919550909350505050565b6000602082840312156121c457600080fd5b813561170c81612588565b6000602082840312156121e157600080fd5b815161170c81612588565b600080602083850312156121ff57600080fd5b823567ffffffffffffffff8082111561221757600080fd5b818501915085601f83011261222b57600080fd5b81358181111561223a57600080fd5b8660208285010111156121a057600080fd5b60006020828403121561225e57600080fd5b5035919050565b60008060006060848603121561227a57600080fd5b83359250602084013567ffffffffffffffff81111561229857600080fd5b6122a486828701611f58565b925050604084013590509250925092565b600081518084526122cd816020860160208601612484565b601f01601f19169290920160200192915050565b8054600090600181811c90808316806122fb57607f831692505b602080841082141561231d57634e487b7160e01b600052602260045260246000fd5b81801561233157600181146123425761236f565b60ff1986168952848901965061236f565b60008881526020902060005b868110156123675781548b82015290850190830161234e565b505084890196505b50505050505092915050565b6bffffffffffffffffffffffff198460601b168152600061239f60148301856122e1565b928352505060200192915050565b60006123b982856122e1565b83516123c9818360208801612484565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612405908301846122b5565b9695505050505050565b60208152600061170c60208301846122b5565b600082198211156124355761243561251a565b500190565b60008261244957612449612530565b500490565b60008160001904831182151516156124685761246861251a565b500290565b60008282101561247f5761247f61251a565b500390565b60005b8381101561249f578181015183820152602001612487565b838111156113755750506000910152565b600181811c908216806124c457607f821691505b602082108114156124e557634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156124ff576124ff61251a565b5060010190565b60008261251557612515612530565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610d5357600080fdfea2646970667358221220197e314334074c58b1753e518c7ee09de90709efdbb90ecdafd93dcc0fe1119a64736f6c63430008070033

Deployed Bytecode Sourcemap

75962:5858:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43098:639;;;;;;;;;;-1:-1:-1;43098:639:0;;;;;:::i;:::-;;:::i;:::-;;;8714:14:1;;8707:22;8689:41;;8677:2;8662:18;43098:639:0;;;;;;;;44000:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;50483:218::-;;;;;;;;;;-1:-1:-1;50483:218:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8012:32:1;;;7994:51;;7982:2;7967:18;50483:218:0;7848:203:1;49924:400:0;;;;;;;;;;-1:-1:-1;49924:400:0;;;;;:::i;:::-;;:::i;:::-;;79118:330;;;;;;;;;;-1:-1:-1;79118:330:0;;;;;:::i;:::-;;:::i;39751:323::-;;;;;;;;;;-1:-1:-1;76891:1:0;40025:12;39812:7;40009:13;:28;-1:-1:-1;;40009:46:0;39751:323;;;15708:25:1;;;15696:2;15681:18;39751:323:0;15562:177:1;76498:32:0;;;;;;;;;;;;;;;;80142:96;;;;;;;;;;-1:-1:-1;80142:96:0;;;;;:::i;:::-;;:::i;54190:2817::-;;;;;;;;;;-1:-1:-1;54190:2817:0;;;;;:::i;:::-;;:::i;79717:92::-;;;;;;;;;;;;;:::i;80688:1092::-;;;;;;;;;;;;;:::i;57103:185::-;;;;;;;;;;-1:-1:-1;57103:185:0;;;;;:::i;:::-;;:::i;78068:679::-;;;;;;:::i;:::-;;:::i;76290:34::-;;;;;;;;;;;;;;;;80574:106;;;;;;;;;;-1:-1:-1;80574:106:0;;;;;:::i;:::-;;:::i;45393:152::-;;;;;;;;;;-1:-1:-1;45393:152:0;;;;;:::i;:::-;;:::i;80463:103::-;;;;;;;;;;-1:-1:-1;80463:103:0;;;;;:::i;:::-;;:::i;40935:233::-;;;;;;;;;;-1:-1:-1;40935:233:0;;;;;:::i;:::-;;:::i;23846:103::-;;;;;;;;;;;;;:::i;76463:28::-;;;;;;;;;;;;;;;;76331:40;;;;;;;;;;;;;;;;76192:49;;;;;;;;;;;;;:::i;23198:87::-;;;;;;;;;;-1:-1:-1;23271:6:0;;-1:-1:-1;;;;;23271:6:0;23198:87;;76678:49;;;;;;;;;;-1:-1:-1;76678:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;44176:104;;;;;;;;;;;;;:::i;76646:23::-;;;;;;;;;;-1:-1:-1;76646:23:0;;;;-1:-1:-1;;;76646:23:0;;;;;;77621:439;;;;;;:::i;:::-;;:::i;80030:104::-;;;;;;;;;;-1:-1:-1;80030:104:0;;;;;:::i;:::-;;:::i;51041:308::-;;;;;;;;;;-1:-1:-1;51041:308:0;;;;;:::i;:::-;;:::i;76378:39::-;;;;;;;;;;;;;;;;76248:35;;;;;;;;;;;;;;;;76617:22;;;;;;;;;;-1:-1:-1;76617:22:0;;;;-1:-1:-1;;;76617:22:0;;;;;;57886:399;;;;;;;;;;-1:-1:-1;57886:399:0;;;;;:::i;:::-;;:::i;79817:95::-;;;;;;;;;;;;;:::i;79920:102::-;;;;;;;;;;-1:-1:-1;79920:102:0;;;;;:::i;:::-;;:::i;80354:101::-;;;;;;;;;;-1:-1:-1;80354:101:0;;;;;:::i;:::-;;:::i;78755:239::-;;;;;;;;;;-1:-1:-1;78755:239:0;;;;;:::i;:::-;;:::i;80246:100::-;;;;;;;;;;-1:-1:-1;80246:100:0;;;;;:::i;:::-;;:::i;76537:73::-;;;;;;;;;;-1:-1:-1;76537:73:0;;;;-1:-1:-1;;;;;76537:73:0;;;76424:32;;;;;;;;;;;;;;;;51506:164;;;;;;;;;;-1:-1:-1;51506:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;51627:25:0;;;51603:4;51627:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;51506:164;24104:201;;;;;;;;;;-1:-1:-1;24104:201:0;;;;;:::i;:::-;;:::i;79456:253::-;;;;;;;;;;-1:-1:-1;79456:253:0;;;;;:::i;:::-;;:::i;43098:639::-;43183:4;-1:-1:-1;;;;;;;;;43507:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;43584:25:0;;;43507:102;:179;;;-1:-1:-1;;;;;;;;;;43661:25:0;;;43507:179;43487:199;43098:639;-1:-1:-1;;43098:639:0:o;44000:100::-;44054:13;44087:5;44080:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44000:100;:::o;50483:218::-;50559:7;50584:16;50592:7;50584;:16::i;:::-;50579:64;;50609:34;;-1:-1:-1;;;50609:34:0;;;;;;;;;;;50579:64;-1:-1:-1;50663:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;50663:30:0;;50483:218::o;49924:400::-;50005:13;50021:16;50029:7;50021;:16::i;:::-;50005:32;-1:-1:-1;73781:10:0;-1:-1:-1;;;;;50054:28:0;;;50050:175;;50102:44;50119:5;73781:10;51506:164;:::i;50102:44::-;50097:128;;50174:35;;-1:-1:-1;;;50174:35:0;;;;;;;;;;;50097:128;50237:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;50237:35:0;-1:-1:-1;;;;;50237:35:0;;;;;;;;;50288:28;;50237:24;;50288:28;;;;;;;49994:330;49924:400;;:::o;79118:330::-;23084:13;:11;:13::i;:::-;79240::::1;::::0;79200:17:::1;::::0;:36:::1;::::0;79220:9;;79200:36:::1;:::i;:::-;:53;;79192:84;;;::::0;-1:-1:-1;;;79192:84:0;;13314:2:1;79192:84:0::1;::::0;::::1;13296:21:1::0;13353:2;13333:18;;;13326:30;-1:-1:-1;;;13372:18:1;;;13365:48;13430:18;;79192:84:0::1;;;;;;;;;79318:9;;:16;;79297:17;;:37;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;79350:9:0::1;::::0;-1:-1:-1;79345:96:0::1;79365:20:::0;;::::1;79345:96;;;79407:22;79413:9;;79423:1;79413:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;79427:1;79407:5;:22::i;:::-;79387:3:::0;::::1;::::0;::::1;:::i;:::-;;;;79345:96;;;;79118:330:::0;;:::o;80142:96::-;23084:13;:11;:13::i;:::-;80206::::1;:24:::0;80142:96::o;54190:2817::-;54324:27;54354;54373:7;54354:18;:27::i;:::-;54324:57;;54439:4;-1:-1:-1;;;;;54398:45:0;54414:19;-1:-1:-1;;;;;54398:45:0;;54394:86;;54452:28;;-1:-1:-1;;;54452:28:0;;;;;;;;;;;54394:86;54494:27;53304:24;;;:15;:24;;;;;53526:26;;73781:10;52929:30;;;-1:-1:-1;;;;;52622:28:0;;52907:20;;;52904:56;54680:180;;54773:43;54790:4;73781:10;51506:164;:::i;54773:43::-;54768:92;;54825:35;;-1:-1:-1;;;54825:35:0;;;;;;;;;;;54768:92;-1:-1:-1;;;;;54877:16:0;;54873:52;;54902:23;;-1:-1:-1;;;54902:23:0;;;;;;;;;;;54873:52;55074:15;55071:160;;;55214:1;55193:19;55186:30;55071:160;-1:-1:-1;;;;;55611:24:0;;;;;;;:18;:24;;;;;;55609:26;;-1:-1:-1;;55609:26:0;;;55680:22;;;;;;;;;55678:24;;-1:-1:-1;55678:24:0;;;48782:11;48757:23;48753:41;48740:63;-1:-1:-1;;;48740:63:0;55973:26;;;;:17;:26;;;;;:175;-1:-1:-1;;;56268:47:0;;56264:627;;56373:1;56363:11;;56341:19;56496:30;;;:17;:30;;;;;;56492:384;;56634:13;;56619:11;:28;56615:242;;56781:30;;;;:17;:30;;;;;:52;;;56615:242;56322:569;56264:627;56938:7;56934:2;-1:-1:-1;;;;;56919:27:0;56928:4;-1:-1:-1;;;;;56919:27:0;;;;;;;;;;;54313:2694;;;54190:2817;;;:::o;79717:92::-;23084:13;:11;:13::i;:::-;79791:10:::1;::::0;;-1:-1:-1;;;;79777:24:0;::::1;-1:-1:-1::0;;;79791:10:0;;;::::1;;;79790:11;79777:24:::0;;::::1;;::::0;;79717:92::o;80688:1092::-;23084:13;:11;:13::i;:::-;80763:21:::1;80795:99;80821:42;80890:3;80867:19;80763:21:::0;80884:2:::1;80867:19;:::i;:::-;80866:27;;;;:::i;:::-;80795:17;:99::i;:::-;80905;80931:42;81000:3;80977:19;:14:::0;80994:2:::1;80977:19;:::i;80905:99::-;81015;81041:42;81110:3;81087:19;:14:::0;81104:2:::1;81087:19;:::i;81015:99::-;81125;81151:42;81220:3;81197:19;:14:::0;81214:2:::1;81197:19;:::i;81125:99::-;81235:98;81261:42;81329:3;81307:18;:14:::0;81324:1:::1;81307:18;:::i;81235:98::-;81344;81370:42;81438:3;81416:18;:14:::0;81433:1:::1;81416:18;:::i;81344:98::-;81453:100;81479:42;81548:4;81525:19;:14:::0;81542:2:::1;81525:19;:::i;81453:100::-;81564;81590:42;81659:4;81636:19;:14:::0;81653:2:::1;81636:19;:::i;81564:100::-;81675:93;81701:42;81746:21;81675:17;:93::i;:::-;80727:1053;80688:1092::o:0;57103:185::-;57241:39;57258:4;57264:2;57268:7;57241:39;;;;;;;;;;;;:16;:39::i;78068:679::-;76978:10;77225:17;77270:8;;;76964:55;;-1:-1:-1;76995:10:0;77009:9;76995:23;76964:55;76942:125;;;;-1:-1:-1;;;76942:125:0;;14022:2:1;76942:125:0;;;14004:21:1;14061:2;14041:18;;;14034:30;-1:-1:-1;;;14080:18:1;;;14073:50;14140:18;;76942:125:0;13820:344:1;76942:125:0;78202:11:::1;::::0;-1:-1:-1;;;78202:11:0;::::1;;;78194:35;;;::::0;-1:-1:-1;;;78194:35:0;;10690:2:1;78194:35:0::1;::::0;::::1;10672:21:1::0;10729:2;10709:18;;;10702:30;-1:-1:-1;;;10748:18:1;;;10741:41;10799:18;;78194:35:0::1;10488:335:1::0;78194:35:0::1;78281:13;;78264;78248;;:29;;;;:::i;:::-;:46;;78240:77;;;::::0;-1:-1:-1;;;78240:77:0;;12564:2:1;78240:77:0::1;::::0;::::1;12546:21:1::0;12603:2;12583:18;;;12576:30;-1:-1:-1;;;12622:18:1;;;12615:48;12680:18;;78240:77:0::1;12362:342:1::0;78240:77:0::1;78336:38;78354:9;78365:8;78336:17;:38::i;:::-;78328:68;;;::::0;-1:-1:-1;;;78328:68:0;;12218:2:1;78328:68:0::1;::::0;::::1;12200:21:1::0;12257:2;12237:18;;;12230:30;-1:-1:-1;;;12276:18:1;;;12269:47;12333:18;;78328:68:0::1;12016:341:1::0;78328:68:0::1;78430:10;78415:26;::::0;;;:14:::1;:26;::::0;;;;;78461:8;;78415:42:::1;::::0;78444:13;;78415:42:::1;:::i;:::-;:54;;78407:84;;;::::0;-1:-1:-1;;;78407:84:0;;14371:2:1;78407:84:0::1;::::0;::::1;14353:21:1::0;14410:2;14390:18;;;14383:30;-1:-1:-1;;;14429:18:1;;;14422:47;14486:18;;78407:84:0::1;14169:341:1::0;78407:84:0::1;78542:9;78525:13;78510:12;;:28;;;;:::i;:::-;:41;;78502:70;;;::::0;-1:-1:-1;;;78502:70:0;;15419:2:1;78502:70:0::1;::::0;::::1;15401:21:1::0;15458:2;15438:18;;;15431:30;-1:-1:-1;;;15477:18:1;;;15470:46;15533:18;;78502:70:0::1;15217:340:1::0;78502:70:0::1;78601:13;78585;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;78669:10:0::1;78654:26;::::0;;;:14:::1;:26;::::0;;;;;:42:::1;::::0;78683:13;;78654:42:::1;:::i;:::-;78640:10;78625:26;::::0;;;:14:::1;:26;::::0;;;;:71;;;;78707:32:::1;::::0;78725:13;78707:5:::1;:32::i;80574:106::-:0;23084:13;:11;:13::i;:::-;80652:20:::1;:7;80662:10:::0;;80652:20:::1;:::i;45393:152::-:0;45465:7;45508:27;45527:7;45508:18;:27::i;80463:103::-;23084:13;:11;:13::i;:::-;80532::::1;:26:::0;;-1:-1:-1;;;;;;80532:26:0::1;-1:-1:-1::0;;;;;80532:26:0;;;::::1;::::0;;;::::1;::::0;;80463:103::o;40935:233::-;41007:7;-1:-1:-1;;;;;41031:19:0;;41027:60;;41059:28;;-1:-1:-1;;;41059:28:0;;;;;;;;;;;41027:60;-1:-1:-1;;;;;;41105:25:0;;;;;:18;:25;;;;;;35094:13;41105:55;;40935:233::o;23846:103::-;23084:13;:11;:13::i;:::-;23911:30:::1;23938:1;23911:18;:30::i;:::-;23846:103::o:0;76192:49::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44176:104::-;44232:13;44265:7;44258:14;;;;;:::i;77621:439::-;76978:10;77225:17;77270:8;;;76964:55;;-1:-1:-1;76995:10:0;77009:9;76995:23;76964:55;76942:125;;;;-1:-1:-1;;;76942:125:0;;14022:2:1;76942:125:0;;;14004:21:1;14061:2;14041:18;;;14034:30;-1:-1:-1;;;14080:18:1;;;14073:50;14140:18;;76942:125:0;13820:344:1;76942:125:0;77706:10:::1;::::0;-1:-1:-1;;;77706:10:0;::::1;;;77698:34;;;::::0;-1:-1:-1;;;77698:34:0;;10690:2:1;77698:34:0::1;::::0;::::1;10672:21:1::0;10729:2;10709:18;;;10702:30;-1:-1:-1;;;10748:18:1;;;10741:41;10799:18;;77698:34:0::1;10488:335:1::0;77698:34:0::1;77784:13;;77767;77751;;:29;;;;:::i;:::-;:46;;77743:77;;;::::0;-1:-1:-1;;;77743:77:0;;12564:2:1;77743:77:0::1;::::0;::::1;12546:21:1::0;12603:2;12583:18;;;12576:30;-1:-1:-1;;;12622:18:1;;;12615:48;12680:18;;77743:77:0::1;12362:342:1::0;77743:77:0::1;77856:13;;77839;:30;;77831:56;;;::::0;-1:-1:-1;;;77831:56:0;;15077:2:1;77831:56:0::1;::::0;::::1;15059:21:1::0;15116:2;15096:18;;;15089:30;-1:-1:-1;;;15135:18:1;;;15128:43;15188:18;;77831:56:0::1;14875:337:1::0;77831:56:0::1;77937:9;77920:13;77906:11;;:27;;;;:::i;:::-;:40;;77898:69;;;::::0;-1:-1:-1;;;77898:69:0;;15419:2:1;77898:69:0::1;::::0;::::1;15401:21:1::0;15458:2;15438:18;;;15431:30;-1:-1:-1;;;15477:18:1;;;15470:46;15533:18;;77898:69:0::1;15217:340:1::0;77898:69:0::1;77996:13;77980;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;78020:32:0::1;::::0;-1:-1:-1;78026:10:0::1;78038:13:::0;78020:5:::1;:32::i;80030:104::-:0;23084:13;:11;:13::i;:::-;80103:12:::1;:23:::0;80030:104::o;51041:308::-;-1:-1:-1;;;;;51140:31:0;;73781:10;51140:31;51136:61;;;51180:17;;-1:-1:-1;;;51180:17:0;;;;;;;;;;;51136:61;73781:10;51210:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;51210:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;51210:60:0;;;;;;;;;;51286:55;;8689:41:1;;;51210:49:0;;73781:10;51286:55;;8662:18:1;51286:55:0;;;;;;;51041:308;;:::o;57886:399::-;58053:31;58066:4;58072:2;58076:7;58053:12;:31::i;:::-;-1:-1:-1;;;;;58099:14:0;;;:19;58095:183;;58138:56;58169:4;58175:2;58179:7;58188:5;58138:30;:56::i;:::-;58133:145;;58222:40;;-1:-1:-1;;;58222:40:0;;;;;;;;;;;58133:145;57886:399;;;;:::o;79817:95::-;23084:13;:11;:13::i;:::-;79893:11:::1;::::0;;-1:-1:-1;;;;79878:26:0;::::1;-1:-1:-1::0;;;79893:11:0;;;::::1;;;79892:12;79878:26:::0;;::::1;;::::0;;79817:95::o;79920:102::-;23084:13;:11;:13::i;:::-;79992:11:::1;:22:::0;79920:102::o;80354:101::-;23084:13;:11;:13::i;:::-;80423::::1;:24:::0;80354:101::o;78755:239::-;78829:13;78863:16;78871:7;78863;:16::i;:::-;78855:60;;;;-1:-1:-1;;;78855:60:0;;14717:2:1;78855:60:0;;;14699:21:1;14756:2;14736:18;;;14729:30;14795:33;14775:18;;;14768:61;14846:18;;78855:60:0;14515:355:1;78855:60:0;78957:7;78966:18;:7;:16;:18::i;:::-;78940:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;78926:60;;78755:239;;;:::o;80246:100::-;23084:13;:11;:13::i;:::-;80314::::1;:24:::0;80246:100::o;24104:201::-;23084:13;:11;:13::i;:::-;-1:-1:-1;;;;;24193:22:0;::::1;24185:73;;;::::0;-1:-1:-1;;;24185:73:0;;10283:2:1;24185:73:0::1;::::0;::::1;10265:21:1::0;10322:2;10302:18;;;10295:30;10361:34;10341:18;;;10334:62;-1:-1:-1;;;10412:18:1;;;10405:36;10458:19;;24185:73:0::1;10081:402:1::0;24185:73:0::1;24269:28;24288:8;24269:18;:28::i;79456:253::-:0;23084:13;:11;:13::i;:::-;79575::::1;;79558;79538:17;;:33;;;;:::i;:::-;:50;;79530:81;;;::::0;-1:-1:-1;;;79530:81:0;;13314:2:1;79530:81:0::1;::::0;::::1;13296:21:1::0;13353:2;13333:18;;;13326:30;-1:-1:-1;;;13372:18:1;;;13365:48;13430:18;;79530:81:0::1;13112:342:1::0;79530:81:0::1;79645:13;79624:17;;:34;;;;;;;:::i;51928:282::-:0;51993:4;52049:7;76891:1;52030:26;;:66;;;;;52083:13;;52073:7;:23;52030:66;:153;;;;-1:-1:-1;;52134:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;52134:44:0;:49;;51928:282::o;23363:132::-;23271:6;;-1:-1:-1;;;;;23271:6:0;73781:10;23427:23;23419:68;;;;-1:-1:-1;;;23419:68:0;;13661:2:1;23419:68:0;;;13643:21:1;;;13680:18;;;13673:30;13739:34;13719:18;;;13712:62;13791:18;;23419:68:0;13459:356:1;61547:2454:0;61620:20;61643:13;61671;61667:44;;61693:18;;-1:-1:-1;;;61693:18:0;;;;;;;;;;;61667:44;-1:-1:-1;;;;;62199:22:0;;;;;;:18;:22;;;;35232:2;62199:22;;;:71;;62237:32;62225:45;;62199:71;;;62513:31;;;:17;:31;;;;;-1:-1:-1;49213:15:0;;49187:24;49183:46;48782:11;48757:23;48753:41;48750:52;48740:63;;62513:173;;62748:23;;;;62513:31;;62199:22;;63247:25;62199:22;;63100:335;63515:1;63501:12;63497:20;63455:346;63556:3;63547:7;63544:16;63455:346;;63774:7;63764:8;63761:1;63734:25;63731:1;63728;63723:59;63609:1;63596:15;63455:346;;;-1:-1:-1;63834:13:0;63830:45;;63856:19;;-1:-1:-1;;;63856:19:0;;;;;;;;;;;63830:45;63892:13;:19;-1:-1:-1;79345:96:0::1;79118:330:::0;;:::o;46548:1275::-;46615:7;46650;;76891:1;46699:23;46695:1061;;46752:13;;46745:4;:20;46741:1015;;;46790:14;46807:23;;;:17;:23;;;;;;-1:-1:-1;;;46896:24:0;;46892:845;;47561:113;47568:11;47561:113;;-1:-1:-1;;;47639:6:0;47621:25;;;;:17;:25;;;;;;47561:113;;;47707:6;46548:1275;-1:-1:-1;;;46548:1275:0:o;46892:845::-;46767:989;46741:1015;47784:31;;-1:-1:-1;;;47784:31:0;;;;;;;;;;;15011:317;15126:6;15101:21;:31;;15093:73;;;;-1:-1:-1;;;15093:73:0;;11860:2:1;15093:73:0;;;11842:21:1;11899:2;11879:18;;;11872:30;11938:31;11918:18;;;11911:59;11987:18;;15093:73:0;11658:353:1;15093:73:0;15180:12;15198:9;-1:-1:-1;;;;;15198:14:0;15220:6;15198:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15179:52;;;15250:7;15242:78;;;;-1:-1:-1;;;15242:78:0;;11030:2:1;15242:78:0;;;11012:21:1;11069:2;11049:18;;;11042:30;11108:34;11088:18;;;11081:62;11179:28;11159:18;;;11152:56;11225:19;;15242:78:0;10828:422:1;77294:319:0;77385:4;77402:12;77507:10;77519:14;77535:8;77490:54;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;77490:54:0;;;;;;;;;;77480:65;;77490:54;77480:65;;;;7495:66:1;77427:119:0;;;7483:79:1;;;;7578:12;;;7571:28;7615:12;;77427:119:0;;;-1:-1:-1;;77427:119:0;;;;;;;;;77417:130;;77427:119;77417:130;;;;;-1:-1:-1;77582:23:0;77417:130;77595:9;77582:12;:23::i;:::-;77565:13;;-1:-1:-1;;;;;77565:40:0;;;:13;;:40;;77294:319;-1:-1:-1;;;;77294:319:0:o;24465:191::-;24558:6;;;-1:-1:-1;;;;;24575:17:0;;;-1:-1:-1;;;;;;24575:17:0;;;;;;;24608:40;;24558:6;;;24575:17;24558:6;;24608:40;;24539:16;;24608:40;24528:128;24465:191;:::o;60369:716::-;60553:88;;-1:-1:-1;;;60553:88:0;;60532:4;;-1:-1:-1;;;;;60553:45:0;;;;;:88;;73781:10;;60620:4;;60626:7;;60635:5;;60553:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60553:88:0;;;;;;;;-1:-1:-1;;60553:88:0;;;;;;;;;;;;:::i;:::-;;;60549:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60836:13:0;;60832:235;;60882:40;;-1:-1:-1;;;60882:40:0;;;;;;;;;;;60832:235;61025:6;61019:13;61010:6;61006:2;61002:15;60995:38;60549:529;-1:-1:-1;;;;;;60712:64:0;-1:-1:-1;;;60712:64:0;;-1:-1:-1;60549:529:0;60369:716;;;;;;:::o;820:723::-;876:13;1097:10;1093:53;;-1:-1:-1;;1124:10:0;;;;;;;;;;;;-1:-1:-1;;;1124:10:0;;;;;820:723::o;1093:53::-;1171:5;1156:12;1212:78;1219:9;;1212:78;;1245:8;;;;:::i;:::-;;-1:-1:-1;1268:10:0;;-1:-1:-1;1276:2:0;1268:10;;:::i;:::-;;;1212:78;;;1300:19;1332:6;1322:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1322:17:0;;1300:39;;1350:154;1357:10;;1350:154;;1384:11;1394:1;1384:11;;:::i;:::-;;-1:-1:-1;1453:10:0;1461:2;1453:5;:10;:::i;:::-;1440:24;;:2;:24;:::i;:::-;1427:39;;1410:6;1417;1410:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;1410:56:0;;;;;;;;-1:-1:-1;1481:11:0;1490:2;1481:11;;:::i;:::-;;;1350:154;;7400:231;7478:7;7499:17;7518:18;7540:27;7551:4;7557:9;7540:10;:27::i;:::-;7498:69;;;;7578:18;7590:5;7578:11;:18::i;:::-;-1:-1:-1;7614:9:0;7400:231;-1:-1:-1;;;7400:231:0:o;5194:1404::-;5275:7;5284:12;5509:9;:16;5529:2;5509:22;5505:1086;;;5853:4;5838:20;;5832:27;5903:4;5888:20;;5882:27;5961:4;5946:20;;5940:27;5548:9;5932:36;6004:25;6015:4;5932:36;5832:27;5882;6004:10;:25::i;:::-;5997:32;;;;;;;;;5505:1086;6051:9;:16;6071:2;6051:22;6047:544;;;6374:4;6359:20;;6353:27;6425:4;6410:20;;6404:27;6467:23;6478:4;6353:27;6404;6467:10;:23::i;:::-;6460:30;;;;;;;;6047:544;-1:-1:-1;6539:1:0;;-1:-1:-1;6543:35:0;6047:544;5194:1404;;;;;:::o;3465:643::-;3543:20;3534:5;:29;;;;;;;;:::i;:::-;;3530:571;;;3465:643;:::o;3530:571::-;3641:29;3632:5;:38;;;;;;;;:::i;:::-;;3628:473;;;3687:34;;-1:-1:-1;;;3687:34:0;;9570:2:1;3687:34:0;;;9552:21:1;9609:2;9589:18;;;9582:30;9648:26;9628:18;;;9621:54;9692:18;;3687:34:0;9368:348:1;3628:473:0;3752:35;3743:5;:44;;;;;;;;:::i;:::-;;3739:362;;;3804:41;;-1:-1:-1;;;3804:41:0;;9923:2:1;3804:41:0;;;9905:21:1;9962:2;9942:18;;;9935:30;10001:33;9981:18;;;9974:61;10052:18;;3804:41:0;9721:355:1;3739:362:0;3876:30;3867:5;:39;;;;;;;;:::i;:::-;;3863:238;;;3923:44;;-1:-1:-1;;;3923:44:0;;11457:2:1;3923:44:0;;;11439:21:1;11496:2;11476:18;;;11469:30;11535:34;11515:18;;;11508:62;-1:-1:-1;;;11586:18:1;;;11579:32;11628:19;;3923:44:0;11255:398:1;3863:238:0;3998:30;3989:5;:39;;;;;;;;:::i;:::-;;3985:116;;;4045:44;;-1:-1:-1;;;4045:44:0;;12911:2:1;4045:44:0;;;12893:21:1;12950:2;12930:18;;;12923:30;12989:34;12969:18;;;12962:62;-1:-1:-1;;;13040:18:1;;;13033:32;13082:19;;4045:44:0;12709:398:1;8852:1632:0;8983:7;;9917:66;9904:79;;9900:163;;;-1:-1:-1;10016:1:0;;-1:-1:-1;10020:30:0;10000:51;;9900:163;10077:1;:7;;10082:2;10077:7;;:18;;;;;10088:1;:7;;10093:2;10088:7;;10077:18;10073:102;;;-1:-1:-1;10128:1:0;;-1:-1:-1;10132:30:0;10112:51;;10073:102;10289:24;;;10272:14;10289:24;;;;;;;;;8968:25:1;;;9041:4;9029:17;;9009:18;;;9002:45;;;;9063:18;;;9056:34;;;9106:18;;;9099:34;;;10289:24:0;;8940:19:1;;10289:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10289:24:0;;-1:-1:-1;;10289:24:0;;;-1:-1:-1;;;;;;;10328:20:0;;10324:103;;10381:1;10385:29;10365:50;;;;;;;10324:103;10447:6;-1:-1:-1;10455:20:0;;-1:-1:-1;8852:1632:0;;;;;;;;:::o;7894:344::-;8008:7;;-1:-1:-1;;;;;8054:80:0;;8008:7;8161:25;8177:3;8162:18;;;8184:2;8161:25;:::i;:::-;8145:42;;8205:25;8216:4;8222:1;8225;8228;8205:10;:25::i;:::-;8198:32;;;;;;7894:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:718::-;234:5;287:3;280:4;272:6;268:17;264:27;254:55;;305:1;302;295:12;254:55;341:6;328:20;367:18;404:2;400;397:10;394:36;;;410:18;;:::i;:::-;485:2;479:9;453:2;539:13;;-1:-1:-1;;535:22:1;;;559:2;531:31;527:40;515:53;;;583:18;;;603:22;;;580:46;577:72;;;629:18;;:::i;:::-;669:10;665:2;658:22;704:2;696:6;689:18;750:3;743:4;738:2;730:6;726:15;722:26;719:35;716:55;;;767:1;764;757:12;716:55;831:2;824:4;816:6;812:17;805:4;797:6;793:17;780:54;878:1;871:4;866:2;858:6;854:15;850:26;843:37;898:6;889:15;;;;;;192:718;;;;:::o;915:186::-;974:6;1027:2;1015:9;1006:7;1002:23;998:32;995:52;;;1043:1;1040;1033:12;995:52;1066:29;1085:9;1066:29;:::i;1106:260::-;1174:6;1182;1235:2;1223:9;1214:7;1210:23;1206:32;1203:52;;;1251:1;1248;1241:12;1203:52;1274:29;1293:9;1274:29;:::i;:::-;1264:39;;1322:38;1356:2;1345:9;1341:18;1322:38;:::i;:::-;1312:48;;1106:260;;;;;:::o;1371:328::-;1448:6;1456;1464;1517:2;1505:9;1496:7;1492:23;1488:32;1485:52;;;1533:1;1530;1523:12;1485:52;1556:29;1575:9;1556:29;:::i;:::-;1546:39;;1604:38;1638:2;1627:9;1623:18;1604:38;:::i;:::-;1594:48;;1689:2;1678:9;1674:18;1661:32;1651:42;;1371:328;;;;;:::o;1704:537::-;1799:6;1807;1815;1823;1876:3;1864:9;1855:7;1851:23;1847:33;1844:53;;;1893:1;1890;1883:12;1844:53;1916:29;1935:9;1916:29;:::i;:::-;1906:39;;1964:38;1998:2;1987:9;1983:18;1964:38;:::i;:::-;1954:48;;2049:2;2038:9;2034:18;2021:32;2011:42;;2104:2;2093:9;2089:18;2076:32;2131:18;2123:6;2120:30;2117:50;;;2163:1;2160;2153:12;2117:50;2186:49;2227:7;2218:6;2207:9;2203:22;2186:49;:::i;:::-;2176:59;;;1704:537;;;;;;;:::o;2246:347::-;2311:6;2319;2372:2;2360:9;2351:7;2347:23;2343:32;2340:52;;;2388:1;2385;2378:12;2340:52;2411:29;2430:9;2411:29;:::i;:::-;2401:39;;2490:2;2479:9;2475:18;2462:32;2537:5;2530:13;2523:21;2516:5;2513:32;2503:60;;2559:1;2556;2549:12;2503:60;2582:5;2572:15;;;2246:347;;;;;:::o;2598:254::-;2666:6;2674;2727:2;2715:9;2706:7;2702:23;2698:32;2695:52;;;2743:1;2740;2733:12;2695:52;2766:29;2785:9;2766:29;:::i;:::-;2756:39;2842:2;2827:18;;;;2814:32;;-1:-1:-1;;;2598:254:1:o;2857:615::-;2943:6;2951;3004:2;2992:9;2983:7;2979:23;2975:32;2972:52;;;3020:1;3017;3010:12;2972:52;3060:9;3047:23;3089:18;3130:2;3122:6;3119:14;3116:34;;;3146:1;3143;3136:12;3116:34;3184:6;3173:9;3169:22;3159:32;;3229:7;3222:4;3218:2;3214:13;3210:27;3200:55;;3251:1;3248;3241:12;3200:55;3291:2;3278:16;3317:2;3309:6;3306:14;3303:34;;;3333:1;3330;3323:12;3303:34;3386:7;3381:2;3371:6;3368:1;3364:14;3360:2;3356:23;3352:32;3349:45;3346:65;;;3407:1;3404;3397:12;3346:65;3438:2;3430:11;;;;;3460:6;;-1:-1:-1;2857:615:1;;-1:-1:-1;;;;2857:615:1:o;3477:245::-;3535:6;3588:2;3576:9;3567:7;3563:23;3559:32;3556:52;;;3604:1;3601;3594:12;3556:52;3643:9;3630:23;3662:30;3686:5;3662:30;:::i;3727:249::-;3796:6;3849:2;3837:9;3828:7;3824:23;3820:32;3817:52;;;3865:1;3862;3855:12;3817:52;3897:9;3891:16;3916:30;3940:5;3916:30;:::i;3981:592::-;4052:6;4060;4113:2;4101:9;4092:7;4088:23;4084:32;4081:52;;;4129:1;4126;4119:12;4081:52;4169:9;4156:23;4198:18;4239:2;4231:6;4228:14;4225:34;;;4255:1;4252;4245:12;4225:34;4293:6;4282:9;4278:22;4268:32;;4338:7;4331:4;4327:2;4323:13;4319:27;4309:55;;4360:1;4357;4350:12;4309:55;4400:2;4387:16;4426:2;4418:6;4415:14;4412:34;;;4442:1;4439;4432:12;4412:34;4487:7;4482:2;4473:6;4469:2;4465:15;4461:24;4458:37;4455:57;;;4508:1;4505;4498:12;4578:180;4637:6;4690:2;4678:9;4669:7;4665:23;4661:32;4658:52;;;4706:1;4703;4696:12;4658:52;-1:-1:-1;4729:23:1;;4578:180;-1:-1:-1;4578:180:1:o;4763:456::-;4849:6;4857;4865;4918:2;4906:9;4897:7;4893:23;4889:32;4886:52;;;4934:1;4931;4924:12;4886:52;4970:9;4957:23;4947:33;;5031:2;5020:9;5016:18;5003:32;5058:18;5050:6;5047:30;5044:50;;;5090:1;5087;5080:12;5044:50;5113:49;5154:7;5145:6;5134:9;5130:22;5113:49;:::i;:::-;5103:59;;;5209:2;5198:9;5194:18;5181:32;5171:42;;4763:456;;;;;:::o;5224:257::-;5265:3;5303:5;5297:12;5330:6;5325:3;5318:19;5346:63;5402:6;5395:4;5390:3;5386:14;5379:4;5372:5;5368:16;5346:63;:::i;:::-;5463:2;5442:15;-1:-1:-1;;5438:29:1;5429:39;;;;5470:4;5425:50;;5224:257;-1:-1:-1;;5224:257:1:o;5486:973::-;5571:12;;5536:3;;5626:1;5646:18;;;;5699;;;;5726:61;;5780:4;5772:6;5768:17;5758:27;;5726:61;5806:2;5854;5846:6;5843:14;5823:18;5820:38;5817:161;;;5900:10;5895:3;5891:20;5888:1;5881:31;5935:4;5932:1;5925:15;5963:4;5960:1;5953:15;5817:161;5994:18;6021:104;;;;6139:1;6134:319;;;;5987:466;;6021:104;-1:-1:-1;;6054:24:1;;6042:37;;6099:16;;;;-1:-1:-1;6021:104:1;;6134:319;15817:1;15810:14;;;15854:4;15841:18;;6228:1;6242:165;6256:6;6253:1;6250:13;6242:165;;;6334:14;;6321:11;;;6314:35;6377:16;;;;6271:10;;6242:165;;;6246:3;;6436:6;6431:3;6427:16;6420:23;;5987:466;;;;;;;5486:973;;;;:::o;6464:403::-;6703:26;6699:31;6690:6;6686:2;6682:15;6678:53;6673:3;6666:66;6648:3;6754:47;6797:2;6792:3;6788:12;6780:6;6754:47;:::i;:::-;6810:21;;;-1:-1:-1;;6858:2:1;6847:14;;6464:403;-1:-1:-1;;6464:403:1:o;6872:376::-;7048:3;7076:38;7110:3;7102:6;7076:38;:::i;:::-;7143:6;7137:13;7159:52;7204:6;7200:2;7193:4;7185:6;7181:17;7159:52;:::i;:::-;7227:15;;6872:376;-1:-1:-1;;;;6872:376:1:o;8056:488::-;-1:-1:-1;;;;;8325:15:1;;;8307:34;;8377:15;;8372:2;8357:18;;8350:43;8424:2;8409:18;;8402:34;;;8472:3;8467:2;8452:18;;8445:31;;;8250:4;;8493:45;;8518:19;;8510:6;8493:45;:::i;:::-;8485:53;8056:488;-1:-1:-1;;;;;;8056:488:1:o;9144:219::-;9293:2;9282:9;9275:21;9256:4;9313:44;9353:2;9342:9;9338:18;9330:6;9313:44;:::i;15870:128::-;15910:3;15941:1;15937:6;15934:1;15931:13;15928:39;;;15947:18;;:::i;:::-;-1:-1:-1;15983:9:1;;15870:128::o;16003:120::-;16043:1;16069;16059:35;;16074:18;;:::i;:::-;-1:-1:-1;16108:9:1;;16003:120::o;16128:168::-;16168:7;16234:1;16230;16226:6;16222:14;16219:1;16216:21;16211:1;16204:9;16197:17;16193:45;16190:71;;;16241:18;;:::i;:::-;-1:-1:-1;16281:9:1;;16128:168::o;16301:125::-;16341:4;16369:1;16366;16363:8;16360:34;;;16374:18;;:::i;:::-;-1:-1:-1;16411:9:1;;16301:125::o;16431:258::-;16503:1;16513:113;16527:6;16524:1;16521:13;16513:113;;;16603:11;;;16597:18;16584:11;;;16577:39;16549:2;16542:10;16513:113;;;16644:6;16641:1;16638:13;16635:48;;;-1:-1:-1;;16679:1:1;16661:16;;16654:27;16431:258::o;16694:380::-;16773:1;16769:12;;;;16816;;;16837:61;;16891:4;16883:6;16879:17;16869:27;;16837:61;16944:2;16936:6;16933:14;16913:18;16910:38;16907:161;;;16990:10;16985:3;16981:20;16978:1;16971:31;17025:4;17022:1;17015:15;17053:4;17050:1;17043:15;16907:161;;16694:380;;;:::o;17079:135::-;17118:3;-1:-1:-1;;17139:17:1;;17136:43;;;17159:18;;:::i;:::-;-1:-1:-1;17206:1:1;17195:13;;17079:135::o;17219:112::-;17251:1;17277;17267:35;;17282:18;;:::i;:::-;-1:-1:-1;17316:9:1;;17219:112::o;17336:127::-;17397:10;17392:3;17388:20;17385:1;17378:31;17428:4;17425:1;17418:15;17452:4;17449:1;17442:15;17468:127;17529:10;17524:3;17520:20;17517:1;17510:31;17560:4;17557:1;17550:15;17584:4;17581:1;17574:15;17600:127;17661:10;17656:3;17652:20;17649:1;17642:31;17692:4;17689:1;17682:15;17716:4;17713:1;17706:15;17732:127;17793:10;17788:3;17784:20;17781:1;17774:31;17824:4;17821:1;17814:15;17848:4;17845:1;17838:15;17864:127;17925:10;17920:3;17916:20;17913:1;17906:31;17956:4;17953:1;17946:15;17980:4;17977:1;17970:15;17996:131;-1:-1:-1;;;;;;18070:32:1;;18060:43;;18050:71;;18117:1;18114;18107:12

Swarm Source

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