ETH Price: $3,257.14 (+2.57%)
Gas: 2 Gwei

Token

Bullish Bosses (Boss)
 

Overview

Max Total Supply

3,000 Boss

Holders

216

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 Boss
0xded95b2a7231881652850ea3e4cee4e43cef6567
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:
BullishBosses

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-05-28
*/

// SPDX-License-Identifier: MIT

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/MerkleProof.sol


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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


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

pragma solidity ^0.8.0;


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

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

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

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



// Creator: Chiru Labs



pragma solidity ^0.8.4;










error ApprovalCallerNotOwnerNorApproved();

error ApprovalQueryForNonexistentToken();

error ApproveToCaller();

error ApprovalToCurrentOwner();

error BalanceQueryForZeroAddress();

error MintToZeroAddress();

error MintZeroQuantity();

error OwnerQueryForNonexistentToken();

error TransferCallerNotOwnerNorApproved();

error TransferFromIncorrectOwner();

error TransferToNonERC721ReceiverImplementer();

error TransferToZeroAddress();

error URIQueryForNonexistentToken();



/**

 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including

 * the Metadata extension. Built to optimize for lower gas during batch mints.

 *

 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).

 *

 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.

 *

 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).

 */

contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {

    using Address for address;

    using Strings for uint256;



    // Compiler will pack this into a single 256bit word.

    struct TokenOwnership {

        // The address of the owner.

        address addr;

        // Keeps track of the start time of ownership with minimal overhead for tokenomics.

        uint64 startTimestamp;

        // Whether the token has been burned.

        bool burned;

    }



    // Compiler will pack this into a single 256bit word.

    struct AddressData {

        // Realistically, 2**64-1 is more than enough.

        uint64 balance;

        // Keeps track of mint count with minimal overhead for tokenomics.

        uint64 numberMinted;

        // Keeps track of burn count with minimal overhead for tokenomics.

        uint64 numberBurned;

        // For miscellaneous variable(s) pertaining to the address

        // (e.g. number of whitelist mint slots used).

        // If there are multiple variables, please pack them into a uint64.

        uint64 aux;

    }



    // The tokenId of the next token to be minted.

    uint256 internal _currentIndex;



    // The number of tokens burned.

    uint256 internal _burnCounter;



    // Token name

    string private _name;



    // Token symbol

    string private _symbol;



    // Mapping from token ID to ownership details

    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.

    mapping(uint256 => TokenOwnership) internal _ownerships;



    // Mapping owner address to address data

    mapping(address => AddressData) private _addressData;



    // Mapping from token ID to approved address

    mapping(uint256 => address) private _tokenApprovals;



    // Mapping from owner to operator approvals

    mapping(address => mapping(address => bool)) private _operatorApprovals;



    constructor(string memory name_, string memory symbol_) {

        _name = name_;

        _symbol = symbol_;

        _currentIndex = _startTokenId();

    }



    /**

     * To change the starting tokenId, please override this function.

     */

    function _startTokenId() internal view virtual returns (uint256) {

        return 1;

    }



    /**

     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.

     */

    function totalSupply() public view returns (uint256) {

        // Counter underflow is impossible as _burnCounter cannot be incremented

        // more than _currentIndex - _startTokenId() times

        unchecked {

            return _currentIndex - _burnCounter - _startTokenId();

        }

    }



    /**

     * Returns the total amount of tokens minted in the contract.

     */

    function _totalMinted() internal view returns (uint256) {

        // Counter underflow is impossible as _currentIndex does not decrement,

        // and it is initialized to _startTokenId()

        unchecked {

            return _currentIndex - _startTokenId();

        }

    }



    /**

     * @dev See {IERC165-supportsInterface}.

     */

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {

        return

            interfaceId == type(IERC721).interfaceId ||

            interfaceId == type(IERC721Metadata).interfaceId ||

            super.supportsInterface(interfaceId);

    }



    /**

     * @dev See {IERC721-balanceOf}.

     */

    function balanceOf(address owner) public view override returns (uint256) {

        if (owner == address(0)) revert BalanceQueryForZeroAddress();

        return uint256(_addressData[owner].balance);

    }



    /**

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

     */

    function _numberMinted(address owner) internal view returns (uint256) {

        return uint256(_addressData[owner].numberMinted);

    }



    /**

     * Returns the number of tokens burned by or on behalf of `owner`.

     */

    function _numberBurned(address owner) internal view returns (uint256) {

        return uint256(_addressData[owner].numberBurned);

    }



    /**

     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).

     */

    function _getAux(address owner) internal view returns (uint64) {

        return _addressData[owner].aux;

    }



    /**

     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).

     * If there are multiple variables, please pack them into a uint64.

     */

    function _setAux(address owner, uint64 aux) internal {

        _addressData[owner].aux = aux;

    }



    /**

     * Gas spent here starts off proportional to the maximum mint batch size.

     * It gradually moves to O(1) as tokens get transferred around in the collection over time.

     */

    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {

        uint256 curr = tokenId;



        unchecked {

            if (_startTokenId() <= curr && curr < _currentIndex) {

                TokenOwnership memory ownership = _ownerships[curr];

                if (!ownership.burned) {

                    if (ownership.addr != address(0)) {

                        return ownership;

                    }

                    // Invariant:

                    // There will always be an ownership that has an address and is not burned

                    // before an ownership that does not have an address and is not burned.

                    // Hence, curr will not underflow.

                    while (true) {

                        curr--;

                        ownership = _ownerships[curr];

                        if (ownership.addr != address(0)) {

                            return ownership;

                        }

                    }

                }

            }

        }

        revert OwnerQueryForNonexistentToken();

    }



    /**

     * @dev See {IERC721-ownerOf}.

     */

    function ownerOf(uint256 tokenId) public view override returns (address) {

        return _ownershipOf(tokenId).addr;

    }



    /**

     * @dev See {IERC721Metadata-name}.

     */

    function name() public view virtual override returns (string memory) {

        return _name;

    }



    /**

     * @dev See {IERC721Metadata-symbol}.

     */

    function symbol() public view virtual override returns (string memory) {

        return _symbol;

    }



    /**

     * @dev See {IERC721Metadata-tokenURI}.

     */

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {

        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();



        string memory baseURI = _baseURI();

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

    }



    /**

     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each

     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty

     * by default, can be overriden in child contracts.

     */

    function _baseURI() internal view virtual returns (string memory) {

        return '';

    }



    /**

     * @dev See {IERC721-approve}.

     */

    function approve(address to, uint256 tokenId) public override {

        address owner = ERC721A.ownerOf(tokenId);

        if (to == owner) revert ApprovalToCurrentOwner();



        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {

            revert ApprovalCallerNotOwnerNorApproved();

        }



        _approve(to, tokenId, owner);

    }



    /**

     * @dev See {IERC721-getApproved}.

     */

    function getApproved(uint256 tokenId) public view override returns (address) {

        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();



        return _tokenApprovals[tokenId];

    }



    /**

     * @dev See {IERC721-setApprovalForAll}.

     */

    function setApprovalForAll(address operator, bool approved) public virtual override {

        if (operator == _msgSender()) revert ApproveToCaller();



        _operatorApprovals[_msgSender()][operator] = approved;

        emit ApprovalForAll(_msgSender(), operator, approved);

    }



    /**

     * @dev See {IERC721-isApprovedForAll}.

     */

    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {

        return _operatorApprovals[owner][operator];

    }



    /**

     * @dev See {IERC721-transferFrom}.

     */

    function transferFrom(

        address from,

        address to,

        uint256 tokenId

    ) public virtual override {

        _transfer(from, to, tokenId);

    }



    /**

     * @dev See {IERC721-safeTransferFrom}.

     */

    function safeTransferFrom(

        address from,

        address to,

        uint256 tokenId

    ) public virtual override {

        safeTransferFrom(from, to, tokenId, '');

    }



    /**

     * @dev See {IERC721-safeTransferFrom}.

     */

    function safeTransferFrom(

        address from,

        address to,

        uint256 tokenId,

        bytes memory _data

    ) public virtual override {

        _transfer(from, to, tokenId);

        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {

            revert TransferToNonERC721ReceiverImplementer();

        }

    }



    /**

     * @dev Returns whether `tokenId` exists.

     *

     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.

     *

     * Tokens start existing when they are minted (`_mint`),

     */

    function _exists(uint256 tokenId) internal view returns (bool) {

        return _startTokenId() <= tokenId && tokenId < _currentIndex &&

            !_ownerships[tokenId].burned;

    }



    function _safeMint(address to, uint256 quantity) internal {

        _safeMint(to, quantity, '');

    }



    /**

     * @dev Safely mints `quantity` tokens and transfers them to `to`.

     *

     * Requirements:

     *

     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.

     * - `quantity` must be greater than 0.

     *

     * Emits a {Transfer} event.

     */

    function _safeMint(

        address to,

        uint256 quantity,

        bytes memory _data

    ) internal {

        _mint(to, quantity, _data, true);

    }



    /**

     * @dev Mints `quantity` tokens and transfers them to `to`.

     *

     * Requirements:

     *

     * - `to` cannot be the zero address.

     * - `quantity` must be greater than 0.

     *

     * Emits a {Transfer} event.

     */

    function _mint(

        address to,

        uint256 quantity,

        bytes memory _data,

        bool safe

    ) internal {

        uint256 startTokenId = _currentIndex;

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

        if (quantity == 0) revert MintZeroQuantity();



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



        // Overflows are incredibly unrealistic.

        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1

        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1

        unchecked {

            _addressData[to].balance += uint64(quantity);

            _addressData[to].numberMinted += uint64(quantity);



            _ownerships[startTokenId].addr = to;

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



            uint256 updatedIndex = startTokenId;

            uint256 end = updatedIndex + quantity;



            if (safe && to.isContract()) {

                do {

                    emit Transfer(address(0), to, updatedIndex);

                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {

                        revert TransferToNonERC721ReceiverImplementer();

                    }

                } while (updatedIndex != end);

                // Reentrancy protection

                if (_currentIndex != startTokenId) revert();

            } else {

                do {

                    emit Transfer(address(0), to, updatedIndex++);

                } while (updatedIndex != end);

            }

            _currentIndex = updatedIndex;

        }

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

    }



    /**

     * @dev Transfers `tokenId` from `from` to `to`.

     *

     * Requirements:

     *

     * - `to` cannot be the zero address.

     * - `tokenId` token must be owned by `from`.

     *

     * Emits a {Transfer} event.

     */

    function _transfer(

        address from,

        address to,

        uint256 tokenId

    ) private {

        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);



        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();



        bool isApprovedOrOwner = (_msgSender() == from ||

            isApprovedForAll(from, _msgSender()) ||

            getApproved(tokenId) == _msgSender());



        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();

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



        _beforeTokenTransfers(from, to, tokenId, 1);



        // Clear approvals from the previous owner

        _approve(address(0), tokenId, from);



        // Underflow of the sender's balance is impossible because we check for

        // ownership above and the recipient's balance can't realistically overflow.

        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.

        unchecked {

            _addressData[from].balance -= 1;

            _addressData[to].balance += 1;



            TokenOwnership storage currSlot = _ownerships[tokenId];

            currSlot.addr = to;

            currSlot.startTimestamp = uint64(block.timestamp);



            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.

            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.

            uint256 nextTokenId = tokenId + 1;

            TokenOwnership storage nextSlot = _ownerships[nextTokenId];

            if (nextSlot.addr == address(0)) {

                // This will suffice for checking _exists(nextTokenId),

                // as a burned slot cannot contain the zero address.

                if (nextTokenId != _currentIndex) {

                    nextSlot.addr = from;

                    nextSlot.startTimestamp = prevOwnership.startTimestamp;

                }

            }

        }



        emit Transfer(from, to, tokenId);

        _afterTokenTransfers(from, to, tokenId, 1);

    }



    /**

     * @dev This is 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 {

        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);



        address from = prevOwnership.addr;



        if (approvalCheck) {

            bool isApprovedOrOwner = (_msgSender() == from ||

                isApprovedForAll(from, _msgSender()) ||

                getApproved(tokenId) == _msgSender());



            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();

        }



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



        // Clear approvals from the previous owner

        _approve(address(0), tokenId, from);



        // Underflow of the sender's balance is impossible because we check for

        // ownership above and the recipient's balance can't realistically overflow.

        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.

        unchecked {

            AddressData storage addressData = _addressData[from];

            addressData.balance -= 1;

            addressData.numberBurned += 1;



            // Keep track of who burned the token, and the timestamp of burning.

            TokenOwnership storage currSlot = _ownerships[tokenId];

            currSlot.addr = from;

            currSlot.startTimestamp = uint64(block.timestamp);

            currSlot.burned = true;



            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.

            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.

            uint256 nextTokenId = tokenId + 1;

            TokenOwnership storage nextSlot = _ownerships[nextTokenId];

            if (nextSlot.addr == address(0)) {

                // This will suffice for checking _exists(nextTokenId),

                // as a burned slot cannot contain the zero address.

                if (nextTokenId != _currentIndex) {

                    nextSlot.addr = from;

                    nextSlot.startTimestamp = prevOwnership.startTimestamp;

                }

            }

        }



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

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



        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.

        unchecked {

            _burnCounter++;

        }

    }



    /**

     * @dev Approve `to` to operate on `tokenId`

     *

     * Emits a {Approval} event.

     */

    function _approve(

        address to,

        uint256 tokenId,

        address owner

    ) private {

        _tokenApprovals[tokenId] = to;

        emit Approval(owner, to, tokenId);

    }



    /**

     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.

     *

     * @param from address representing the previous owner of the given token ID

     * @param to target address that will receive the tokens

     * @param tokenId uint256 ID of the token to be transferred

     * @param _data bytes optional data to send along with the call

     * @return bool whether the call correctly returned the expected magic value

     */

    function _checkContractOnERC721Received(

        address from,

        address to,

        uint256 tokenId,

        bytes memory _data

    ) private returns (bool) {

        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {

            return retval == IERC721Receiver(to).onERC721Received.selector;

        } catch (bytes memory reason) {

            if (reason.length == 0) {

                revert TransferToNonERC721ReceiverImplementer();

            } else {

                assembly {

                    revert(add(32, reason), mload(reason))

                }

            }

        }

    }



    /**

     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.

     * And also called before burning one token.

     *

     * startTokenId - the first token id to be transferred

     * quantity - the amount to be transferred

     *

     * Calling conditions:

     *

     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be

     * transferred to `to`.

     * - When `from` is zero, `tokenId` will be minted for `to`.

     * - When `to` is zero, `tokenId` will be burned by `from`.

     * - `from` and `to` are never both zero.

     */

    function _beforeTokenTransfers(

        address from,

        address to,

        uint256 startTokenId,

        uint256 quantity

    ) internal virtual {}



    /**

     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes

     * minting.

     * And also called after one token has been burned.

     *

     * startTokenId - the first token id to be transferred

     * quantity - the amount to be transferred

     *

     * Calling conditions:

     *

     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been

     * transferred to `to`.

     * - When `from` is zero, `tokenId` has been minted for `to`.

     * - When `to` is zero, `tokenId` has been burned by `from`.

     * - `from` and `to` are never both zero.

     */

    function _afterTokenTransfers(

        address from,

        address to,

        uint256 startTokenId,

        uint256 quantity

    ) internal virtual {}

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: contracts/contract.sol


pragma solidity ^0.8.4;


contract BullishBosses is Ownable, ERC721A  {

    using Strings for uint256;

    string private _baseTokenURI;

    uint256 public presaleCost = 0.04 ether;
    uint256 public publicSaleCost = 0.06 ether;
    uint256 public maxSupply = 3000;
    uint256 public maxMintPerTransaction = 20;
    uint256 public maxMintAmountPerPresaleAccount = 5;
    uint256 public maxFreeMintPerWallet=1;
    uint256 public freeMintSlotsRemaining=200;
    bool public paused = true;
    bool public presaleActive = true;


    constructor() ERC721A("Bullish Bosses", "Boss") {}

    modifier mintCompliance(uint256 _mintAmount) {
        require(_mintAmount > 0 , "Invalid mint amount!");
        require(totalMinted() + _mintAmount <= maxSupply, "Max supply exceeded!");
        _;
    }


    function mint( uint64 _mintAmount,bool redeem) public payable mintCompliance(_mintAmount) {
        require(!paused, "The contract is paused!");
        if(presaleActive==true){
            if(redeem==true){
                uint64 freeAmountMinted = getFreeAmountMinted(msg.sender);
                require(freeAmountMinted + _mintAmount <= maxFreeMintPerWallet, "Mint limit exceeded." );
                require(freeMintSlotsRemaining > 0, "Free mint slots exceeded." );

                //if conditions are met, minter gets one free 
                require(msg.value >= presaleCost * (_mintAmount-1), "Insufficient funds!");
                setFreeAmountMinted(msg.sender,freeAmountMinted + _mintAmount);
                require(numberMinted(msg.sender) + _mintAmount <= maxMintAmountPerPresaleAccount+1, "Mint limit exceeded." );

            }
            else{
                require(msg.value >= presaleCost * _mintAmount, "Insufficient funds!");
                require(numberMinted(msg.sender) + _mintAmount <= maxMintAmountPerPresaleAccount, "Mint limit exceeded." );
            }
         
        }
        else{
            require(msg.value >= publicSaleCost * _mintAmount, "Insufficient funds!");
            require(_mintAmount <= maxMintPerTransaction, "Mint limit exceeded." );
        }
        _safeMint(msg.sender, _mintAmount);
    }

    function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner {
        _safeMint(_receiver, _mintAmount);
    }

    function getFreeAmountMinted(address owner) public view returns (uint64) {
        return _getAux(owner);
    }

    function setFreeAmountMinted(address owner, uint64 aux) public {
        _setAux(owner, aux);
    }

    function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
        uint256 currentTokenId = 1;
        uint256 ownedTokenIndex = 0;

        while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
        address currentTokenOwner = ownerOf(currentTokenId);

        if (currentTokenOwner == _owner) {
            ownedTokenIds[ownedTokenIndex] = currentTokenId;
            ownedTokenIndex++;
        }

        currentTokenId++;
        }

        return ownedTokenIds;
    }

    function tokenURI(uint256 _tokenId)

        public
        view
        virtual
        override
        returns (string memory)

    {

        require(
        _exists(_tokenId),
        "ERC721Metadata: URI query for nonexistent token"
        );

        string memory currentBaseURI = _baseURI();

        return bytes(currentBaseURI).length > 0

            ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), ".json"))

            : "";
    }

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

    function totalMinted() public view returns (uint256) {
        return _totalMinted();
    }

    function exists(uint256 tokenId) public view returns (bool) {
        return _exists(tokenId);
    }

    function burn(uint256 tokenId, bool approvalCheck) public {
        _burn(tokenId, approvalCheck);
    }

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

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

    function setPaused(bool _state) public onlyOwner {
        paused = _state;
    }

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

    function setPresaleCost(uint256 _presaleCost) public onlyOwner {
        presaleCost = _presaleCost;
    }

    function setMaxMintPerPresaleAccount(uint256 _maxMintPerPresaleAccount) public onlyOwner {
        maxMintAmountPerPresaleAccount = _maxMintPerPresaleAccount;
    }

    function setMaxFreeMintPerWallet(uint256 _maxFreeMintPerWallet) public onlyOwner {
        maxFreeMintPerWallet = _maxFreeMintPerWallet;
    }

    function setMaxMintPerTransaction(uint256 _maxMintPerTransaction) public onlyOwner {
        maxMintPerTransaction = _maxMintPerTransaction;
    }
    
    function setPresale(bool _state) public onlyOwner {
        presaleActive = _state;
    }

    function withdraw() public onlyOwner {
        (bool os, ) = payable(owner()).call{value: address(this).balance}("");
        require(os);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"approvalCheck","type":"bool"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMintSlotsRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getFreeAmountMinted","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeMintPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerPresaleAccount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"_mintAmount","type":"uint64"},{"internalType":"bool","name":"redeem","type":"bool"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint64","name":"aux","type":"uint64"}],"name":"setFreeAmountMinted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxFreeMintPerWallet","type":"uint256"}],"name":"setMaxFreeMintPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintPerPresaleAccount","type":"uint256"}],"name":"setMaxMintPerPresaleAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintPerTransaction","type":"uint256"}],"name":"setMaxMintPerTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_presaleCost","type":"uint256"}],"name":"setPresaleCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicSaleCost","type":"uint256"}],"name":"setPublicSaleCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052668e1bc9bf040000600a5566d529ae9e860000600b55610bb8600c556014600d556005600e556001600f5560c86010556011805461ffff19166101011790553480156200005057600080fd5b506040518060400160405280600e81526020016d42756c6c69736820426f7373657360901b81525060405180604001604052806004815260200163426f737360e01b815250620000af620000a9620000e760201b60201c565b620000eb565b8151620000c49060039060208501906200013b565b508051620000da9060049060208401906200013b565b505060018055506200021e565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200014990620001e1565b90600052602060002090601f0160209004810192826200016d5760008555620001b8565b82601f106200018857805160ff1916838001178555620001b8565b82800160010185558215620001b8579182015b82811115620001b85782518255916020019190600101906200019b565b50620001c6929150620001ca565b5090565b5b80821115620001c65760008155600101620001cb565b600181811c90821680620001f657607f821691505b602082108114156200021857634e487b7160e01b600052602260045260246000fd5b50919050565b6125aa806200022e6000396000f3fe6080604052600436106102675760003560e01c80637175cfab11610144578063b88d4fde116100b6578063dc33e6811161007a578063dc33e68114610744578063e985e9c514610764578063efbd73f4146107ad578063f2f4e824146107cd578063f2fde38b146107e3578063f77b1edd1461080357600080fd5b8063b88d4fde146106b8578063be99e3f3146106d8578063c54e73e3146106ee578063c87b56dd1461070e578063d5abeb011461072e57600080fd5b80638dbb7c06116101085780638dbb7c061461060e5780638fdcf9421461062e57806395d89b411461064e5780639fac68cb14610663578063a22cb46514610683578063a2309ff8146106a357600080fd5b80637175cfab1461056f5780637693aa93146105825780637d0a7529146105ba578063845bb3bb146105da5780638da5cb5b146105f057600080fd5b80633ccfd60b116101dd57806353135ca0116101a157806353135ca0146104c157806355f804b3146104e05780635c975abb146105005780636352211e1461051a57806370a082311461053a578063715018a61461055a57600080fd5b80633ccfd60b1461042957806342842e0e1461043e578063438b63001461045e578063453afb0f1461048b5780634f558e79146104a157600080fd5b8063095ea7b31161022f578063095ea7b31461037657806316c38b3c1461039657806318160ddd146103b657806323b872dd146103d35780632a23d07d146103f35780632e6cebe51461040957600080fd5b806301f569971461026c57806301ffc9a71461029557806302c175ad146102c557806306fdde031461031c578063081812fc1461033e575b600080fd5b34801561027857600080fd5b50610282600d5481565b6040519081526020015b60405180910390f35b3480156102a157600080fd5b506102b56102b03660046120e6565b610823565b604051901515815260200161028c565b3480156102d157600080fd5b5061031a6102e03660046120a1565b6001600160a01b038216600090815260066020526040902080546001600160c01b0316600160c01b6001600160401b038416021790555050565b005b34801561032857600080fd5b50610331610879565b60405161028c91906122f8565b34801561034a57600080fd5b5061035e610359366004612191565b61090b565b6040516001600160a01b03909116815260200161028c565b34801561038257600080fd5b5061031a610391366004612077565b61094f565b3480156103a257600080fd5b5061031a6103b13660046120cb565b6109dd565b3480156103c257600080fd5b506002546001540360001901610282565b3480156103df57600080fd5b5061031a6103ee366004611f36565b610a23565b3480156103ff57600080fd5b50610282600a5481565b34801561041557600080fd5b5061031a610424366004612191565b610a2e565b34801561043557600080fd5b5061031a610a5d565b34801561044a57600080fd5b5061031a610459366004611f36565b610aea565b34801561046a57600080fd5b5061047e610479366004611ee8565b610b05565b60405161028c91906122b4565b34801561049757600080fd5b50610282600b5481565b3480156104ad57600080fd5b506102b56104bc366004612191565b610be5565b3480156104cd57600080fd5b506011546102b590610100900460ff1681565b3480156104ec57600080fd5b5061031a6104fb366004612120565b610bf0565b34801561050c57600080fd5b506011546102b59060ff1681565b34801561052657600080fd5b5061035e610535366004612191565b610c26565b34801561054657600080fd5b50610282610555366004611ee8565b610c38565b34801561056657600080fd5b5061031a610c86565b61031a61057d3660046121f0565b610cbc565b34801561058e57600080fd5b506105a261059d366004611ee8565b610ffa565b6040516001600160401b03909116815260200161028c565b3480156105c657600080fd5b5061031a6105d5366004612191565b611028565b3480156105e657600080fd5b50610282600f5481565b3480156105fc57600080fd5b506000546001600160a01b031661035e565b34801561061a57600080fd5b5061031a610629366004612191565b611057565b34801561063a57600080fd5b5061031a610649366004612191565b611086565b34801561065a57600080fd5b506103316110b5565b34801561066f57600080fd5b5061031a61067e3660046121cd565b6110c4565b34801561068f57600080fd5b5061031a61069e36600461204d565b6110ce565b3480156106af57600080fd5b50610282611164565b3480156106c457600080fd5b5061031a6106d3366004611f72565b611178565b3480156106e457600080fd5b5061028260105481565b3480156106fa57600080fd5b5061031a6107093660046120cb565b6111c9565b34801561071a57600080fd5b50610331610729366004612191565b61120d565b34801561073a57600080fd5b50610282600c5481565b34801561075057600080fd5b5061028261075f366004611ee8565b6112d8565b34801561077057600080fd5b506102b561077f366004611f03565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b3480156107b957600080fd5b5061031a6107c83660046121aa565b611306565b3480156107d957600080fd5b50610282600e5481565b3480156107ef57600080fd5b5061031a6107fe366004611ee8565b6113dd565b34801561080f57600080fd5b5061031a61081e366004612191565b611475565b60006001600160e01b031982166380ac58cd60e01b148061085457506001600160e01b03198216635b5e139f60e01b145b8061086f57506301ffc9a760e01b6001600160e01b03198316145b92915050565b5050565b6060600380546108889061247c565b80601f01602080910402602001604051908101604052809291908181526020018280546108b49061247c565b80156109015780601f106108d657610100808354040283529160200191610901565b820191906000526020600020905b8154815290600101906020018083116108e457829003601f168201915b5050505050905090565b6000610916826114a4565b610933576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b600061095a82610c26565b9050806001600160a01b0316836001600160a01b0316141561098f5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906109af57506109ad813361077f565b155b156109cd576040516367d9dca160e11b815260040160405180910390fd5b6109d88383836114dd565b505050565b6000546001600160a01b03163314610a105760405162461bcd60e51b8152600401610a0790612339565b60405180910390fd5b6011805460ff1916911515919091179055565b6109d8838383611539565b6000546001600160a01b03163314610a585760405162461bcd60e51b8152600401610a0790612339565b600d55565b6000546001600160a01b03163314610a875760405162461bcd60e51b8152600401610a0790612339565b600080546040516001600160a01b039091169047908381818185875af1925050503d8060008114610ad4576040519150601f19603f3d011682016040523d82523d6000602084013e610ad9565b606091505b5050905080610ae757600080fd5b50565b6109d883838360405180602001604052806000815250611178565b60606000610b1283610c38565b90506000816001600160401b03811115610b2e57610b2e612528565b604051908082528060200260200182016040528015610b57578160200160208202803683370190505b509050600160005b8381108015610b705750600c548211155b15610bdb576000610b8083610c26565b9050866001600160a01b0316816001600160a01b03161415610bc85782848381518110610baf57610baf612512565b602090810291909101015281610bc4816124b7565b9250505b82610bd2816124b7565b93505050610b5f565b5090949350505050565b600061086f826114a4565b6000546001600160a01b03163314610c1a5760405162461bcd60e51b8152600401610a0790612339565b6109d860098383611e0c565b6000610c3182611715565b5192915050565b60006001600160a01b038216610c61576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b6000546001600160a01b03163314610cb05760405162461bcd60e51b8152600401610a0790612339565b610cba600061183c565b565b816001600160401b031660008111610d0d5760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206d696e7420616d6f756e742160601b6044820152606401610a07565b600c5481610d19611164565b610d23919061239b565b1115610d685760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b6044820152606401610a07565b60115460ff1615610dbb5760405162461bcd60e51b815260206004820152601760248201527f54686520636f6e747261637420697320706175736564210000000000000000006044820152606401610a07565b60115460ff61010090910416151560011415610f865760018215151415610f0d576000610de733610ffa565b600f54909150610df785836123b3565b6001600160401b03161115610e1e5760405162461bcd60e51b8152600401610a079061230b565b600060105411610e705760405162461bcd60e51b815260206004820152601960248201527f46726565206d696e7420736c6f74732065786365656465642e000000000000006044820152606401610a07565b610e7b600185612428565b6001600160401b0316600a54610e9191906123f2565b341015610eb05760405162461bcd60e51b8152600401610a079061236e565b610ebe336102e086846123b3565b600e54610ecc90600161239b565b846001600160401b0316610edf336112d8565b610ee9919061239b565b1115610f075760405162461bcd60e51b8152600401610a079061230b565b50610fe7565b826001600160401b0316600a54610f2491906123f2565b341015610f435760405162461bcd60e51b8152600401610a079061236e565b600e54836001600160401b0316610f59336112d8565b610f63919061239b565b1115610f815760405162461bcd60e51b8152600401610a079061230b565b610fe7565b826001600160401b0316600b54610f9d91906123f2565b341015610fbc5760405162461bcd60e51b8152600401610a079061236e565b600d54836001600160401b03161115610fe75760405162461bcd60e51b8152600401610a079061230b565b6109d833846001600160401b031661188c565b6001600160a01b038116600090815260066020526040812054600160c01b90046001600160401b031661086f565b6000546001600160a01b031633146110525760405162461bcd60e51b8152600401610a0790612339565b600e55565b6000546001600160a01b031633146110815760405162461bcd60e51b8152600401610a0790612339565b600b55565b6000546001600160a01b031633146110b05760405162461bcd60e51b8152600401610a0790612339565b600a55565b6060600480546108889061247c565b61087582826118a6565b6001600160a01b0382163314156110f85760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60006111736001546000190190565b905090565b611183848484611539565b6001600160a01b0383163b151580156111a557506111a384848484611a5a565b155b156111c3576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6000546001600160a01b031633146111f35760405162461bcd60e51b8152600401610a0790612339565b601180549115156101000261ff0019909216919091179055565b6060611218826114a4565b61127c5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a07565b6000611286611b52565b905060008151116112a657604051806020016040528060008152506112d1565b806112b084611b61565b6040516020016112c1929190612238565b6040516020818303038152906040525b9392505050565b6001600160a01b038116600090815260066020526040812054600160401b90046001600160401b031661086f565b816000811161134e5760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206d696e7420616d6f756e742160601b6044820152606401610a07565b600c548161135a611164565b611364919061239b565b11156113a95760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b6044820152606401610a07565b6000546001600160a01b031633146113d35760405162461bcd60e51b8152600401610a0790612339565b6109d8828461188c565b6000546001600160a01b031633146114075760405162461bcd60e51b8152600401610a0790612339565b6001600160a01b03811661146c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a07565b610ae78161183c565b6000546001600160a01b0316331461149f5760405162461bcd60e51b8152600401610a0790612339565b600f55565b6000816001111580156114b8575060015482105b801561086f575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061154482611715565b9050836001600160a01b031681600001516001600160a01b03161461157b5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b03861614806115995750611599853361077f565b806115b45750336115a98461090b565b6001600160a01b0316145b9050806115d457604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0384166115fb57604051633a954ecd60e21b815260040160405180910390fd5b611607600084876114dd565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b429092169190910217835587018084529220805491939091166116db5760015482146116db57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b031660008051602061255583398151915260405160405180910390a45b5050505050565b60408051606081018252600080825260208201819052918101919091528180600111158015611745575060015481105b1561182357600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906118215780516001600160a01b0316156117b8579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff161515928101929092521561181c579392505050565b6117b8565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610875828260405180602001604052806000815250611c5e565b60006118b183611715565b80519091508215611917576000336001600160a01b03831614806118da57506118da823361077f565b806118f55750336118ea8661090b565b6001600160a01b0316145b90508061191557604051632ce44b5f60e11b815260040160405180910390fd5b505b611923600085836114dd565b6001600160a01b0380821660008181526006602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526005909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b178555918901808452922080549194909116611a21576001548214611a2157805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b03841690600080516020612555833981519152908390a450506002805460010190555050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611a8f903390899088908890600401612277565b602060405180830381600087803b158015611aa957600080fd5b505af1925050508015611ad9575060408051601f3d908101601f19168201909252611ad691810190612103565b60015b611b34573d808015611b07576040519150601f19603f3d011682016040523d82523d6000602084013e611b0c565b606091505b508051611b2c576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600980546108889061247c565b606081611b855750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611baf5780611b99816124b7565b9150611ba89050600a836123de565b9150611b89565b6000816001600160401b03811115611bc957611bc9612528565b6040519080825280601f01601f191660200182016040528015611bf3576020820181803683370190505b5090505b8415611b4a57611c08600183612411565b9150611c15600a866124d2565b611c2090603061239b565b60f81b818381518110611c3557611c35612512565b60200101906001600160f81b031916908160001a905350611c57600a866123de565b9450611bf7565b6109d8838383600180546001600160a01b038516611c8e57604051622e076360e81b815260040160405180910390fd5b83611cac5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600590925290912080546001600160e01b031916909217600160a01b429092169190910217905580808501838015611d5857506001600160a01b0387163b15155b15611dcf575b60405182906001600160a01b03891690600090600080516020612555833981519152908290a4611d976000888480600101955088611a5a565b611db4576040516368d2bf6b60e11b815260040160405180910390fd5b80821415611d5e578260015414611dca57600080fd5b611e03565b5b6040516001830192906001600160a01b03891690600090600080516020612555833981519152908290a480821415611dd0575b5060015561170e565b828054611e189061247c565b90600052602060002090601f016020900481019282611e3a5760008555611e80565b82601f10611e535782800160ff19823516178555611e80565b82800160010185558215611e80579182015b82811115611e80578235825591602001919060010190611e65565b50611e8c929150611e90565b5090565b5b80821115611e8c5760008155600101611e91565b80356001600160a01b0381168114611ebc57600080fd5b919050565b80358015158114611ebc57600080fd5b80356001600160401b0381168114611ebc57600080fd5b600060208284031215611efa57600080fd5b6112d182611ea5565b60008060408385031215611f1657600080fd5b611f1f83611ea5565b9150611f2d60208401611ea5565b90509250929050565b600080600060608486031215611f4b57600080fd5b611f5484611ea5565b9250611f6260208501611ea5565b9150604084013590509250925092565b60008060008060808587031215611f8857600080fd5b611f9185611ea5565b9350611f9f60208601611ea5565b92506040850135915060608501356001600160401b0380821115611fc257600080fd5b818701915087601f830112611fd657600080fd5b813581811115611fe857611fe8612528565b604051601f8201601f19908116603f0116810190838211818310171561201057612010612528565b816040528281528a602084870101111561202957600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561206057600080fd5b61206983611ea5565b9150611f2d60208401611ec1565b6000806040838503121561208a57600080fd5b61209383611ea5565b946020939093013593505050565b600080604083850312156120b457600080fd5b6120bd83611ea5565b9150611f2d60208401611ed1565b6000602082840312156120dd57600080fd5b6112d182611ec1565b6000602082840312156120f857600080fd5b81356112d18161253e565b60006020828403121561211557600080fd5b81516112d18161253e565b6000806020838503121561213357600080fd5b82356001600160401b038082111561214a57600080fd5b818501915085601f83011261215e57600080fd5b81358181111561216d57600080fd5b86602082850101111561217f57600080fd5b60209290920196919550909350505050565b6000602082840312156121a357600080fd5b5035919050565b600080604083850312156121bd57600080fd5b82359150611f2d60208401611ea5565b600080604083850312156121e057600080fd5b82359150611f2d60208401611ec1565b6000806040838503121561220357600080fd5b61206983611ed1565b60008151808452612224816020860160208601612450565b601f01601f19169290920160200192915050565b6000835161224a818460208801612450565b83519083019061225e818360208801612450565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906122aa9083018461220c565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156122ec578351835292840192918401916001016122d0565b50909695505050505050565b6020815260006112d1602083018461220c565b60208082526014908201527326b4b73a103634b6b4ba1032bc31b2b2b232b21760611b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825260139082015272496e73756666696369656e742066756e64732160681b604082015260600190565b600082198211156123ae576123ae6124e6565b500190565b60006001600160401b038083168185168083038211156123d5576123d56124e6565b01949350505050565b6000826123ed576123ed6124fc565b500490565b600081600019048311821515161561240c5761240c6124e6565b500290565b600082821015612423576124236124e6565b500390565b60006001600160401b0383811690831681811015612448576124486124e6565b039392505050565b60005b8381101561246b578181015183820152602001612453565b838111156111c35750506000910152565b600181811c9082168061249057607f821691505b602082108114156124b157634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156124cb576124cb6124e6565b5060010190565b6000826124e1576124e16124fc565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610ae757600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220964e9ec3ac385ba9b42de3f7cad140fdc23afbba86589cdb436e36a9b5e2fd5a64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102675760003560e01c80637175cfab11610144578063b88d4fde116100b6578063dc33e6811161007a578063dc33e68114610744578063e985e9c514610764578063efbd73f4146107ad578063f2f4e824146107cd578063f2fde38b146107e3578063f77b1edd1461080357600080fd5b8063b88d4fde146106b8578063be99e3f3146106d8578063c54e73e3146106ee578063c87b56dd1461070e578063d5abeb011461072e57600080fd5b80638dbb7c06116101085780638dbb7c061461060e5780638fdcf9421461062e57806395d89b411461064e5780639fac68cb14610663578063a22cb46514610683578063a2309ff8146106a357600080fd5b80637175cfab1461056f5780637693aa93146105825780637d0a7529146105ba578063845bb3bb146105da5780638da5cb5b146105f057600080fd5b80633ccfd60b116101dd57806353135ca0116101a157806353135ca0146104c157806355f804b3146104e05780635c975abb146105005780636352211e1461051a57806370a082311461053a578063715018a61461055a57600080fd5b80633ccfd60b1461042957806342842e0e1461043e578063438b63001461045e578063453afb0f1461048b5780634f558e79146104a157600080fd5b8063095ea7b31161022f578063095ea7b31461037657806316c38b3c1461039657806318160ddd146103b657806323b872dd146103d35780632a23d07d146103f35780632e6cebe51461040957600080fd5b806301f569971461026c57806301ffc9a71461029557806302c175ad146102c557806306fdde031461031c578063081812fc1461033e575b600080fd5b34801561027857600080fd5b50610282600d5481565b6040519081526020015b60405180910390f35b3480156102a157600080fd5b506102b56102b03660046120e6565b610823565b604051901515815260200161028c565b3480156102d157600080fd5b5061031a6102e03660046120a1565b6001600160a01b038216600090815260066020526040902080546001600160c01b0316600160c01b6001600160401b038416021790555050565b005b34801561032857600080fd5b50610331610879565b60405161028c91906122f8565b34801561034a57600080fd5b5061035e610359366004612191565b61090b565b6040516001600160a01b03909116815260200161028c565b34801561038257600080fd5b5061031a610391366004612077565b61094f565b3480156103a257600080fd5b5061031a6103b13660046120cb565b6109dd565b3480156103c257600080fd5b506002546001540360001901610282565b3480156103df57600080fd5b5061031a6103ee366004611f36565b610a23565b3480156103ff57600080fd5b50610282600a5481565b34801561041557600080fd5b5061031a610424366004612191565b610a2e565b34801561043557600080fd5b5061031a610a5d565b34801561044a57600080fd5b5061031a610459366004611f36565b610aea565b34801561046a57600080fd5b5061047e610479366004611ee8565b610b05565b60405161028c91906122b4565b34801561049757600080fd5b50610282600b5481565b3480156104ad57600080fd5b506102b56104bc366004612191565b610be5565b3480156104cd57600080fd5b506011546102b590610100900460ff1681565b3480156104ec57600080fd5b5061031a6104fb366004612120565b610bf0565b34801561050c57600080fd5b506011546102b59060ff1681565b34801561052657600080fd5b5061035e610535366004612191565b610c26565b34801561054657600080fd5b50610282610555366004611ee8565b610c38565b34801561056657600080fd5b5061031a610c86565b61031a61057d3660046121f0565b610cbc565b34801561058e57600080fd5b506105a261059d366004611ee8565b610ffa565b6040516001600160401b03909116815260200161028c565b3480156105c657600080fd5b5061031a6105d5366004612191565b611028565b3480156105e657600080fd5b50610282600f5481565b3480156105fc57600080fd5b506000546001600160a01b031661035e565b34801561061a57600080fd5b5061031a610629366004612191565b611057565b34801561063a57600080fd5b5061031a610649366004612191565b611086565b34801561065a57600080fd5b506103316110b5565b34801561066f57600080fd5b5061031a61067e3660046121cd565b6110c4565b34801561068f57600080fd5b5061031a61069e36600461204d565b6110ce565b3480156106af57600080fd5b50610282611164565b3480156106c457600080fd5b5061031a6106d3366004611f72565b611178565b3480156106e457600080fd5b5061028260105481565b3480156106fa57600080fd5b5061031a6107093660046120cb565b6111c9565b34801561071a57600080fd5b50610331610729366004612191565b61120d565b34801561073a57600080fd5b50610282600c5481565b34801561075057600080fd5b5061028261075f366004611ee8565b6112d8565b34801561077057600080fd5b506102b561077f366004611f03565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b3480156107b957600080fd5b5061031a6107c83660046121aa565b611306565b3480156107d957600080fd5b50610282600e5481565b3480156107ef57600080fd5b5061031a6107fe366004611ee8565b6113dd565b34801561080f57600080fd5b5061031a61081e366004612191565b611475565b60006001600160e01b031982166380ac58cd60e01b148061085457506001600160e01b03198216635b5e139f60e01b145b8061086f57506301ffc9a760e01b6001600160e01b03198316145b92915050565b5050565b6060600380546108889061247c565b80601f01602080910402602001604051908101604052809291908181526020018280546108b49061247c565b80156109015780601f106108d657610100808354040283529160200191610901565b820191906000526020600020905b8154815290600101906020018083116108e457829003601f168201915b5050505050905090565b6000610916826114a4565b610933576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b600061095a82610c26565b9050806001600160a01b0316836001600160a01b0316141561098f5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906109af57506109ad813361077f565b155b156109cd576040516367d9dca160e11b815260040160405180910390fd5b6109d88383836114dd565b505050565b6000546001600160a01b03163314610a105760405162461bcd60e51b8152600401610a0790612339565b60405180910390fd5b6011805460ff1916911515919091179055565b6109d8838383611539565b6000546001600160a01b03163314610a585760405162461bcd60e51b8152600401610a0790612339565b600d55565b6000546001600160a01b03163314610a875760405162461bcd60e51b8152600401610a0790612339565b600080546040516001600160a01b039091169047908381818185875af1925050503d8060008114610ad4576040519150601f19603f3d011682016040523d82523d6000602084013e610ad9565b606091505b5050905080610ae757600080fd5b50565b6109d883838360405180602001604052806000815250611178565b60606000610b1283610c38565b90506000816001600160401b03811115610b2e57610b2e612528565b604051908082528060200260200182016040528015610b57578160200160208202803683370190505b509050600160005b8381108015610b705750600c548211155b15610bdb576000610b8083610c26565b9050866001600160a01b0316816001600160a01b03161415610bc85782848381518110610baf57610baf612512565b602090810291909101015281610bc4816124b7565b9250505b82610bd2816124b7565b93505050610b5f565b5090949350505050565b600061086f826114a4565b6000546001600160a01b03163314610c1a5760405162461bcd60e51b8152600401610a0790612339565b6109d860098383611e0c565b6000610c3182611715565b5192915050565b60006001600160a01b038216610c61576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b6000546001600160a01b03163314610cb05760405162461bcd60e51b8152600401610a0790612339565b610cba600061183c565b565b816001600160401b031660008111610d0d5760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206d696e7420616d6f756e742160601b6044820152606401610a07565b600c5481610d19611164565b610d23919061239b565b1115610d685760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b6044820152606401610a07565b60115460ff1615610dbb5760405162461bcd60e51b815260206004820152601760248201527f54686520636f6e747261637420697320706175736564210000000000000000006044820152606401610a07565b60115460ff61010090910416151560011415610f865760018215151415610f0d576000610de733610ffa565b600f54909150610df785836123b3565b6001600160401b03161115610e1e5760405162461bcd60e51b8152600401610a079061230b565b600060105411610e705760405162461bcd60e51b815260206004820152601960248201527f46726565206d696e7420736c6f74732065786365656465642e000000000000006044820152606401610a07565b610e7b600185612428565b6001600160401b0316600a54610e9191906123f2565b341015610eb05760405162461bcd60e51b8152600401610a079061236e565b610ebe336102e086846123b3565b600e54610ecc90600161239b565b846001600160401b0316610edf336112d8565b610ee9919061239b565b1115610f075760405162461bcd60e51b8152600401610a079061230b565b50610fe7565b826001600160401b0316600a54610f2491906123f2565b341015610f435760405162461bcd60e51b8152600401610a079061236e565b600e54836001600160401b0316610f59336112d8565b610f63919061239b565b1115610f815760405162461bcd60e51b8152600401610a079061230b565b610fe7565b826001600160401b0316600b54610f9d91906123f2565b341015610fbc5760405162461bcd60e51b8152600401610a079061236e565b600d54836001600160401b03161115610fe75760405162461bcd60e51b8152600401610a079061230b565b6109d833846001600160401b031661188c565b6001600160a01b038116600090815260066020526040812054600160c01b90046001600160401b031661086f565b6000546001600160a01b031633146110525760405162461bcd60e51b8152600401610a0790612339565b600e55565b6000546001600160a01b031633146110815760405162461bcd60e51b8152600401610a0790612339565b600b55565b6000546001600160a01b031633146110b05760405162461bcd60e51b8152600401610a0790612339565b600a55565b6060600480546108889061247c565b61087582826118a6565b6001600160a01b0382163314156110f85760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60006111736001546000190190565b905090565b611183848484611539565b6001600160a01b0383163b151580156111a557506111a384848484611a5a565b155b156111c3576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6000546001600160a01b031633146111f35760405162461bcd60e51b8152600401610a0790612339565b601180549115156101000261ff0019909216919091179055565b6060611218826114a4565b61127c5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a07565b6000611286611b52565b905060008151116112a657604051806020016040528060008152506112d1565b806112b084611b61565b6040516020016112c1929190612238565b6040516020818303038152906040525b9392505050565b6001600160a01b038116600090815260066020526040812054600160401b90046001600160401b031661086f565b816000811161134e5760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206d696e7420616d6f756e742160601b6044820152606401610a07565b600c548161135a611164565b611364919061239b565b11156113a95760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b6044820152606401610a07565b6000546001600160a01b031633146113d35760405162461bcd60e51b8152600401610a0790612339565b6109d8828461188c565b6000546001600160a01b031633146114075760405162461bcd60e51b8152600401610a0790612339565b6001600160a01b03811661146c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a07565b610ae78161183c565b6000546001600160a01b0316331461149f5760405162461bcd60e51b8152600401610a0790612339565b600f55565b6000816001111580156114b8575060015482105b801561086f575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061154482611715565b9050836001600160a01b031681600001516001600160a01b03161461157b5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b03861614806115995750611599853361077f565b806115b45750336115a98461090b565b6001600160a01b0316145b9050806115d457604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0384166115fb57604051633a954ecd60e21b815260040160405180910390fd5b611607600084876114dd565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b429092169190910217835587018084529220805491939091166116db5760015482146116db57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b031660008051602061255583398151915260405160405180910390a45b5050505050565b60408051606081018252600080825260208201819052918101919091528180600111158015611745575060015481105b1561182357600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906118215780516001600160a01b0316156117b8579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff161515928101929092521561181c579392505050565b6117b8565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610875828260405180602001604052806000815250611c5e565b60006118b183611715565b80519091508215611917576000336001600160a01b03831614806118da57506118da823361077f565b806118f55750336118ea8661090b565b6001600160a01b0316145b90508061191557604051632ce44b5f60e11b815260040160405180910390fd5b505b611923600085836114dd565b6001600160a01b0380821660008181526006602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526005909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b178555918901808452922080549194909116611a21576001548214611a2157805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b03841690600080516020612555833981519152908390a450506002805460010190555050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611a8f903390899088908890600401612277565b602060405180830381600087803b158015611aa957600080fd5b505af1925050508015611ad9575060408051601f3d908101601f19168201909252611ad691810190612103565b60015b611b34573d808015611b07576040519150601f19603f3d011682016040523d82523d6000602084013e611b0c565b606091505b508051611b2c576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600980546108889061247c565b606081611b855750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611baf5780611b99816124b7565b9150611ba89050600a836123de565b9150611b89565b6000816001600160401b03811115611bc957611bc9612528565b6040519080825280601f01601f191660200182016040528015611bf3576020820181803683370190505b5090505b8415611b4a57611c08600183612411565b9150611c15600a866124d2565b611c2090603061239b565b60f81b818381518110611c3557611c35612512565b60200101906001600160f81b031916908160001a905350611c57600a866123de565b9450611bf7565b6109d8838383600180546001600160a01b038516611c8e57604051622e076360e81b815260040160405180910390fd5b83611cac5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600590925290912080546001600160e01b031916909217600160a01b429092169190910217905580808501838015611d5857506001600160a01b0387163b15155b15611dcf575b60405182906001600160a01b03891690600090600080516020612555833981519152908290a4611d976000888480600101955088611a5a565b611db4576040516368d2bf6b60e11b815260040160405180910390fd5b80821415611d5e578260015414611dca57600080fd5b611e03565b5b6040516001830192906001600160a01b03891690600090600080516020612555833981519152908290a480821415611dd0575b5060015561170e565b828054611e189061247c565b90600052602060002090601f016020900481019282611e3a5760008555611e80565b82601f10611e535782800160ff19823516178555611e80565b82800160010185558215611e80579182015b82811115611e80578235825591602001919060010190611e65565b50611e8c929150611e90565b5090565b5b80821115611e8c5760008155600101611e91565b80356001600160a01b0381168114611ebc57600080fd5b919050565b80358015158114611ebc57600080fd5b80356001600160401b0381168114611ebc57600080fd5b600060208284031215611efa57600080fd5b6112d182611ea5565b60008060408385031215611f1657600080fd5b611f1f83611ea5565b9150611f2d60208401611ea5565b90509250929050565b600080600060608486031215611f4b57600080fd5b611f5484611ea5565b9250611f6260208501611ea5565b9150604084013590509250925092565b60008060008060808587031215611f8857600080fd5b611f9185611ea5565b9350611f9f60208601611ea5565b92506040850135915060608501356001600160401b0380821115611fc257600080fd5b818701915087601f830112611fd657600080fd5b813581811115611fe857611fe8612528565b604051601f8201601f19908116603f0116810190838211818310171561201057612010612528565b816040528281528a602084870101111561202957600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561206057600080fd5b61206983611ea5565b9150611f2d60208401611ec1565b6000806040838503121561208a57600080fd5b61209383611ea5565b946020939093013593505050565b600080604083850312156120b457600080fd5b6120bd83611ea5565b9150611f2d60208401611ed1565b6000602082840312156120dd57600080fd5b6112d182611ec1565b6000602082840312156120f857600080fd5b81356112d18161253e565b60006020828403121561211557600080fd5b81516112d18161253e565b6000806020838503121561213357600080fd5b82356001600160401b038082111561214a57600080fd5b818501915085601f83011261215e57600080fd5b81358181111561216d57600080fd5b86602082850101111561217f57600080fd5b60209290920196919550909350505050565b6000602082840312156121a357600080fd5b5035919050565b600080604083850312156121bd57600080fd5b82359150611f2d60208401611ea5565b600080604083850312156121e057600080fd5b82359150611f2d60208401611ec1565b6000806040838503121561220357600080fd5b61206983611ed1565b60008151808452612224816020860160208601612450565b601f01601f19169290920160200192915050565b6000835161224a818460208801612450565b83519083019061225e818360208801612450565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906122aa9083018461220c565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156122ec578351835292840192918401916001016122d0565b50909695505050505050565b6020815260006112d1602083018461220c565b60208082526014908201527326b4b73a103634b6b4ba1032bc31b2b2b232b21760611b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825260139082015272496e73756666696369656e742066756e64732160681b604082015260600190565b600082198211156123ae576123ae6124e6565b500190565b60006001600160401b038083168185168083038211156123d5576123d56124e6565b01949350505050565b6000826123ed576123ed6124fc565b500490565b600081600019048311821515161561240c5761240c6124e6565b500290565b600082821015612423576124236124e6565b500390565b60006001600160401b0383811690831681811015612448576124486124e6565b039392505050565b60005b8381101561246b578181015183820152602001612453565b838111156111c35750506000910152565b600181811c9082168061249057607f821691505b602082108114156124b157634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156124cb576124cb6124e6565b5060010190565b6000826124e1576124e16124fc565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610ae757600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220964e9ec3ac385ba9b42de3f7cad140fdc23afbba86589cdb436e36a9b5e2fd5a64736f6c63430008070033

Deployed Bytecode Sourcemap

48795:5541:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49052:41;;;;;;;;;;;;;;;;;;;11785:25:1;;;11773:2;11758:18;49052:41:0;;;;;;;;27447:315;;;;;;;;;;-1:-1:-1;27447:315:0;;;;;:::i;:::-;;:::i;:::-;;;8103:14:1;;8096:22;8078:41;;8066:2;8051:18;27447:315:0;7938:187:1;51280:101:0;;;;;;;;;;-1:-1:-1;51280:101:0;;;;;:::i;:::-;-1:-1:-1;;;;;29040:19:0;;;;;;:12;:19;;;;;:29;;-1:-1:-1;;;;;29040:29:0;-1:-1:-1;;;;;;;;29040:29:0;;;;;;51280:101;;;;;30730:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;32327:212::-;;;;;;;;;;-1:-1:-1;32327:212:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6764:32:1;;;6746:51;;6734:2;6719:18;32327:212:0;6600:203:1;31862:389:0;;;;;;;;;;-1:-1:-1;31862:389:0;;;;;:::i;:::-;;:::i;53264:83::-;;;;;;;;;;-1:-1:-1;53264:83:0;;;;;:::i;:::-;;:::i;26652:315::-;;;;;;;;;;-1:-1:-1;26914:12:0;;26497:1;26898:13;:28;-1:-1:-1;;26898:46:0;26652:315;;33244:182;;;;;;;;;;-1:-1:-1;33244:182:0;;;;;:::i;:::-;;:::i;48919:39::-;;;;;;;;;;;;;;;;53925:148;;;;;;;;;;-1:-1:-1;53925:148:0;;;;;:::i;:::-;;:::i;54184:147::-;;;;;;;;;;;;;:::i;33507:197::-;;;;;;;;;;-1:-1:-1;33507:197:0;;;;;:::i;:::-;;:::i;51389:693::-;;;;;;;;;;-1:-1:-1;51389:693:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;48965:42::-;;;;;;;;;;;;;;;;52804:102;;;;;;;;;;-1:-1:-1;52804:102:0;;;;;:::i;:::-;;:::i;49280:32::-;;;;;;;;;;-1:-1:-1;49280:32:0;;;;;;;;;;;53150:106;;;;;;;;;;-1:-1:-1;53150:106:0;;;;;:::i;:::-;;:::i;49248:25::-;;;;;;;;;;-1:-1:-1;49248:25:0;;;;;;;;30524:129;;;;;;;;;;-1:-1:-1;30524:129:0;;;;;:::i;:::-;;:::i;27836:212::-;;;;;;;;;;-1:-1:-1;27836:212:0;;;;;:::i;:::-;;:::i;47912:103::-;;;;;;;;;;;;;:::i;49600:1382::-;;;;;;:::i;:::-;;:::i;51159:113::-;;;;;;;;;;-1:-1:-1;51159:113:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;11983:31:1;;;11965:50;;11953:2;11938:18;51159:113:0;11821:200:1;53599:166:0;;;;;;;;;;-1:-1:-1;53599:166:0;;;;;:::i;:::-;;:::i;49156:37::-;;;;;;;;;;;;;;;;47261:87;;;;;;;;;;-1:-1:-1;47307:7:0;47334:6;-1:-1:-1;;;;;47334:6:0;47261:87;;53355:120;;;;;;;;;;-1:-1:-1;53355:120:0;;;;;:::i;:::-;;:::i;53483:108::-;;;;;;;;;;-1:-1:-1;53483:108:0;;;;;:::i;:::-;;:::i;30913:::-;;;;;;;;;;;;;:::i;52914:106::-;;;;;;;;;;-1:-1:-1;52914:106:0;;;;;:::i;:::-;;:::i;32621:297::-;;;;;;;;;;-1:-1:-1;32621:297:0;;;;;:::i;:::-;;:::i;52703:93::-;;;;;;;;;;;;;:::i;33785:389::-;;;;;;;;;;-1:-1:-1;33785:389:0;;;;;:::i;:::-;;:::i;49200:41::-;;;;;;;;;;;;;;;;54085:91;;;;;;;;;;-1:-1:-1;54085:91:0;;;;;:::i;:::-;;:::i;52090:484::-;;;;;;;;;;-1:-1:-1;52090:484:0;;;;;:::i;:::-;;:::i;49014:31::-;;;;;;;;;;;;;;;;52582:113;;;;;;;;;;-1:-1:-1;52582:113:0;;;;;:::i;:::-;;:::i;32999:168::-;;;;;;;;;;-1:-1:-1;32999:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;33122:25:0;;;33096:4;33122:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;32999:168;50990:161;;;;;;;;;;-1:-1:-1;50990:161:0;;;;;:::i;:::-;;:::i;49100:49::-;;;;;;;;;;;;;;;;48170:201;;;;;;;;;;-1:-1:-1;48170:201:0;;;;;:::i;:::-;;:::i;53773:144::-;;;;;;;;;;-1:-1:-1;53773:144:0;;;;;:::i;:::-;;:::i;27447:315::-;27549:4;-1:-1:-1;;;;;;27590:40:0;;-1:-1:-1;;;27590:40:0;;:107;;-1:-1:-1;;;;;;;27649:48:0;;-1:-1:-1;;;27649:48:0;27590:107;:162;;;-1:-1:-1;;;;;;;;;;16322:40:0;;;27716:36;27568:184;27447:315;-1:-1:-1;;27447:315:0:o;51354:19::-;51280:101;;:::o;30730:104::-;30784:13;30819:5;30812:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30730:104;:::o;32327:212::-;32395:7;32422:16;32430:7;32422;:16::i;:::-;32417:64;;32447:34;;-1:-1:-1;;;32447:34:0;;;;;;;;;;;32417:64;-1:-1:-1;32505:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;32505:24:0;;32327:212::o;31862:389::-;31937:13;31953:24;31969:7;31953:15;:24::i;:::-;31937:40;;32000:5;-1:-1:-1;;;;;31994:11:0;:2;-1:-1:-1;;;;;31994:11:0;;31990:48;;;32014:24;;-1:-1:-1;;;32014:24:0;;;;;;;;;;;31990:48;22811:10;-1:-1:-1;;;;;32059:21:0;;;;;;:63;;-1:-1:-1;32085:37:0;32102:5;22811:10;32999:168;:::i;32085:37::-;32084:38;32059:63;32055:142;;;32148:35;;-1:-1:-1;;;32148:35:0;;;;;;;;;;;32055:142;32213:28;32222:2;32226:7;32235:5;32213:8;:28::i;:::-;31924:327;31862:389;;:::o;53264:83::-;47307:7;47334:6;-1:-1:-1;;;;;47334:6:0;22811:10;47481:23;47473:68;;;;-1:-1:-1;;;47473:68:0;;;;;;;:::i;:::-;;;;;;;;;53324:6:::1;:15:::0;;-1:-1:-1;;53324:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;53264:83::o;33244:182::-;33388:28;33398:4;33404:2;33408:7;33388:9;:28::i;53925:148::-;47307:7;47334:6;-1:-1:-1;;;;;47334:6:0;22811:10;47481:23;47473:68;;;;-1:-1:-1;;;47473:68:0;;;;;;;:::i;:::-;54019:21:::1;:46:::0;53925:148::o;54184:147::-;47307:7;47334:6;-1:-1:-1;;;;;47334:6:0;22811:10;47481:23;47473:68;;;;-1:-1:-1;;;47473:68:0;;;;;;;:::i;:::-;54233:7:::1;47334:6:::0;;54246:55:::1;::::0;-1:-1:-1;;;;;47334:6:0;;;;54275:21:::1;::::0;54233:7;54246:55;54233:7;54246:55;54275:21;47334:6;54246:55:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54232:69;;;54320:2;54312:11;;;::::0;::::1;;54221:110;54184:147::o:0;33507:197::-;33655:39;33672:4;33678:2;33682:7;33655:39;;;;;;;;;;;;:16;:39::i;51389:693::-;51476:16;51510:23;51536:17;51546:6;51536:9;:17::i;:::-;51510:43;;51564:30;51611:15;-1:-1:-1;;;;;51597:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51597:30:0;-1:-1:-1;51564:63:0;-1:-1:-1;51663:1:0;51638:22;51715:327;51740:15;51722;:33;:64;;;;;51777:9;;51759:14;:27;;51722:64;51715:327;;;51799:25;51827:23;51835:14;51827:7;:23::i;:::-;51799:51;;51888:6;-1:-1:-1;;;;;51867:27:0;:17;-1:-1:-1;;;;;51867:27:0;;51863:139;;;51944:14;51911:13;51925:15;51911:30;;;;;;;;:::i;:::-;;;;;;;;;;:47;51973:17;;;;:::i;:::-;;;;51863:139;52014:16;;;;:::i;:::-;;;;51788:254;51715:327;;;-1:-1:-1;52061:13:0;;51389:693;-1:-1:-1;;;;51389:693:0:o;52804:102::-;52858:4;52882:16;52890:7;52882;:16::i;53150:106::-;47307:7;47334:6;-1:-1:-1;;;;;47334:6:0;22811:10;47481:23;47473:68;;;;-1:-1:-1;;;47473:68:0;;;;;;;:::i;:::-;53225:23:::1;:13;53241:7:::0;;53225:23:::1;:::i;30524:129::-:0;30588:7;30617:21;30630:7;30617:12;:21::i;:::-;:26;;30524:129;-1:-1:-1;;30524:129:0:o;27836:212::-;27900:7;-1:-1:-1;;;;;27926:19:0;;27922:60;;27954:28;;-1:-1:-1;;;27954:28:0;;;;;;;;;;;27922:60;-1:-1:-1;;;;;;28010:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;28010:27:0;;27836:212::o;47912:103::-;47307:7;47334:6;-1:-1:-1;;;;;47334:6:0;22811:10;47481:23;47473:68;;;;-1:-1:-1;;;47473:68:0;;;;;;;:::i;:::-;47977:30:::1;48004:1;47977:18;:30::i;:::-;47912:103::o:0;49600:1382::-;49677:11;-1:-1:-1;;;;;49381:209:0;49459:1;49445:11;:15;49437:49;;;;-1:-1:-1;;;49437:49:0;;9312:2:1;49437:49:0;;;9294:21:1;9351:2;9331:18;;;9324:30;-1:-1:-1;;;9370:18:1;;;9363:50;9430:18;;49437:49:0;9110:344:1;49437:49:0;49536:9;;49521:11;49505:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;49497:73;;;;-1:-1:-1;;;49497:73:0;;10790:2:1;49497:73:0;;;10772:21:1;10829:2;10809:18;;;10802:30;-1:-1:-1;;;10848:18:1;;;10841:50;10908:18;;49497:73:0;10588:344:1;49497:73:0;49710:6:::1;::::0;::::1;;49709:7;49701:43;;;::::0;-1:-1:-1;;;49701:43:0;;10022:2:1;49701:43:0::1;::::0;::::1;10004:21:1::0;10061:2;10041:18;;;10034:30;10100:25;10080:18;;;10073:53;10143:18;;49701:43:0::1;9820:347:1::0;49701:43:0::1;49758:13;::::0;::::1;;::::0;;::::1;;:19;;:13;:19;49755:1175;;;49804:4;49796:12:::0;::::1;;;49793:916;;;49828:23;49854:31;49874:10;49854:19;:31::i;:::-;49946:20;::::0;49828:57;;-1:-1:-1;49912:30:0::1;49931:11:::0;49828:57;49912:30:::1;:::i;:::-;-1:-1:-1::0;;;;;49912:54:0::1;;;49904:88;;;;-1:-1:-1::0;;;49904:88:0::1;;;;;;;:::i;:::-;50044:1;50019:22;;:26;50011:65;;;::::0;-1:-1:-1;;;50011:65:0;;11139:2:1;50011:65:0::1;::::0;::::1;11121:21:1::0;11178:2;11158:18;;;11151:30;11217:27;11197:18;;;11190:55;11262:18;;50011:65:0::1;10937:349:1::0;50011:65:0::1;50197:13;50209:1;50197:11:::0;:13:::1;:::i;:::-;-1:-1:-1::0;;;;;50182:29:0::1;:11;;:29;;;;:::i;:::-;50169:9;:42;;50161:74;;;;-1:-1:-1::0;;;50161:74:0::1;;;;;;;:::i;:::-;50254:62;50274:10;50285:30;50304:11:::0;50285:16;:30:::1;:::i;50254:62::-;50385:30;::::0;:32:::1;::::0;50416:1:::1;50385:32;:::i;:::-;50370:11;-1:-1:-1::0;;;;;50343:38:0::1;:24;50356:10;50343:12;:24::i;:::-;:38;;;;:::i;:::-;:74;;50335:108;;;;-1:-1:-1::0;;;50335:108:0::1;;;;;;;:::i;:::-;49809:652;49755:1175;;49793:916;50533:11;-1:-1:-1::0;;;;;50519:25:0::1;:11;;:25;;;;:::i;:::-;50506:9;:38;;50498:70;;;;-1:-1:-1::0;;;50498:70:0::1;;;;;;;:::i;:::-;50637:30;;50622:11;-1:-1:-1::0;;;;;50595:38:0::1;:24;50608:10;50595:12;:24::i;:::-;:38;;;;:::i;:::-;:72;;50587:106;;;;-1:-1:-1::0;;;50587:106:0::1;;;;;;;:::i;:::-;49755:1175;;;50798:11;-1:-1:-1::0;;;;;50781:28:0::1;:14;;:28;;;;:::i;:::-;50768:9;:41;;50760:73;;;;-1:-1:-1::0;;;50760:73:0::1;;;;;;;:::i;:::-;50871:21;;50856:11;-1:-1:-1::0;;;;;50856:36:0::1;;;50848:70;;;;-1:-1:-1::0;;;50848:70:0::1;;;;;;;:::i;:::-;50940:34;50950:10;50962:11;-1:-1:-1::0;;;;;50940:34:0::1;:9;:34::i;51159:113::-:0;-1:-1:-1;;;;;28741:19:0;;51224:6;28741:19;;;:12;:19;;;;;:23;-1:-1:-1;;;28741:23:0;;-1:-1:-1;;;;;28741:23:0;51250:14;28658:116;53599:166;47307:7;47334:6;-1:-1:-1;;;;;47334:6:0;22811:10;47481:23;47473:68;;;;-1:-1:-1;;;47473:68:0;;;;;;;:::i;:::-;53699:30:::1;:58:::0;53599:166::o;53355:120::-;47307:7;47334:6;-1:-1:-1;;;;;47334:6:0;22811:10;47481:23;47473:68;;;;-1:-1:-1;;;47473:68:0;;;;;;;:::i;:::-;53435:14:::1;:32:::0;53355:120::o;53483:108::-;47307:7;47334:6;-1:-1:-1;;;;;47334:6:0;22811:10;47481:23;47473:68;;;;-1:-1:-1;;;47473:68:0;;;;;;;:::i;:::-;53557:11:::1;:26:::0;53483:108::o;30913:::-;30969:13;31004:7;30997:14;;;;;:::i;52914:106::-;52983:29;52989:7;52998:13;52983:5;:29::i;32621:297::-;-1:-1:-1;;;;;32722:24:0;;22811:10;32722:24;32718:54;;;32755:17;;-1:-1:-1;;;32755:17:0;;;;;;;;;;;32718:54;22811:10;32789:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;32789:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;32789:53:0;;;;;;;;;;32860:48;;8078:41:1;;;32789:42:0;;22811:10;32860:48;;8051:18:1;32860:48:0;;;;;;;32621:297;;:::o;52703:93::-;52747:7;52774:14;26497:1;27311:13;-1:-1:-1;;27311:31:0;;27070:295;52774:14;52767:21;;52703:93;:::o;33785:389::-;33964:28;33974:4;33980:2;33984:7;33964:9;:28::i;:::-;-1:-1:-1;;;;;34009:13:0;;6425:19;:23;;34009:76;;;;;34029:56;34060:4;34066:2;34070:7;34079:5;34029:30;:56::i;:::-;34028:57;34009:76;34005:160;;;34111:40;;-1:-1:-1;;;34111:40:0;;;;;;;;;;;34005:160;33785:389;;;;:::o;54085:91::-;47307:7;47334:6;-1:-1:-1;;;;;47334:6:0;22811:10;47481:23;47473:68;;;;-1:-1:-1;;;47473:68:0;;;;;;;:::i;:::-;54146:13:::1;:22:::0;;;::::1;;;;-1:-1:-1::0;;54146:22:0;;::::1;::::0;;;::::1;::::0;;54085:91::o;52090:484::-;52211:13;52264:17;52272:8;52264:7;:17::i;:::-;52246:106;;;;-1:-1:-1;;;52246:106:0;;10374:2:1;52246:106:0;;;10356:21:1;10413:2;10393:18;;;10386:30;10452:34;10432:18;;;10425:62;-1:-1:-1;;;10503:18:1;;;10496:45;10558:19;;52246:106:0;10172:411:1;52246:106:0;52365:28;52396:10;:8;:10::i;:::-;52365:41;;52457:1;52432:14;52426:28;:32;:140;;;;;;;;;;;;;;;;;52500:14;52516:19;:8;:17;:19::i;:::-;52483:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52426:140;52419:147;52090:484;-1:-1:-1;;;52090:484:0:o;52582:113::-;-1:-1:-1;;;;;28238:19:0;;52640:7;28238:19;;;:12;:19;;;;;:32;-1:-1:-1;;;28238:32:0;;-1:-1:-1;;;;;28238:32:0;52667:20;28140:141;50990:161;51076:11;49459:1;49445:11;:15;49437:49;;;;-1:-1:-1;;;49437:49:0;;9312:2:1;49437:49:0;;;9294:21:1;9351:2;9331:18;;;9324:30;-1:-1:-1;;;9370:18:1;;;9363:50;9430:18;;49437:49:0;9110:344:1;49437:49:0;49536:9;;49521:11;49505:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;49497:73;;;;-1:-1:-1;;;49497:73:0;;10790:2:1;49497:73:0;;;10772:21:1;10829:2;10809:18;;;10802:30;-1:-1:-1;;;10848:18:1;;;10841:50;10908:18;;49497:73:0;10588:344:1;49497:73:0;47307:7;47334:6;-1:-1:-1;;;;;47334:6:0;22811:10;47481:23:::1;47473:68;;;;-1:-1:-1::0;;;47473:68:0::1;;;;;;;:::i;:::-;51110:33:::2;51120:9;51131:11;51110:9;:33::i;48170:201::-:0;47307:7;47334:6;-1:-1:-1;;;;;47334:6:0;22811:10;47481:23;47473:68;;;;-1:-1:-1;;;47473:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48259:22:0;::::1;48251:73;;;::::0;-1:-1:-1;;;48251:73:0;;8905:2:1;48251:73:0::1;::::0;::::1;8887:21:1::0;8944:2;8924:18;;;8917:30;8983:34;8963:18;;;8956:62;-1:-1:-1;;;9034:18:1;;;9027:36;9080:19;;48251:73:0::1;8703:402:1::0;48251:73:0::1;48335:28;48354:8;48335:18;:28::i;53773:144::-:0;47307:7;47334:6;-1:-1:-1;;;;;47334:6:0;22811:10;47481:23;47473:68;;;;-1:-1:-1;;;47473:68:0;;;;;;;:::i;:::-;53865:20:::1;:44:::0;53773:144::o;34447:193::-;34504:4;34549:7;26497:1;34530:26;;:53;;;;;34570:13;;34560:7;:23;34530:53;:100;;;;-1:-1:-1;;34603:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;34603:27:0;;;;34602:28;;34447:193::o;43053:210::-;43178:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;43178:29:0;-1:-1:-1;;;;;43178:29:0;;;;;;;;;43225:28;;43178:24;;43225:28;;;;;;;43053:210;;;:::o;37742:2226::-;37867:35;37905:21;37918:7;37905:12;:21::i;:::-;37867:59;;37969:4;-1:-1:-1;;;;;37947:26:0;:13;:18;;;-1:-1:-1;;;;;37947:26:0;;37943:67;;37982:28;;-1:-1:-1;;;37982:28:0;;;;;;;;;;;37943:67;38027:22;22811:10;-1:-1:-1;;;;;38053:20:0;;;;:75;;-1:-1:-1;38092:36:0;38109:4;22811:10;32999:168;:::i;38092:36::-;38053:130;;;-1:-1:-1;22811:10:0;38147:20;38159:7;38147:11;:20::i;:::-;-1:-1:-1;;;;;38147:36:0;;38053:130;38027:157;;38206:17;38201:66;;38232:35;;-1:-1:-1;;;38232:35:0;;;;;;;;;;;38201:66;-1:-1:-1;;;;;38284:16:0;;38280:52;;38309:23;;-1:-1:-1;;;38309:23:0;;;;;;;;;;;38280:52;38463:35;38480:1;38484:7;38493:4;38463:8;:35::i;:::-;-1:-1:-1;;;;;38806:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;38806:31:0;;;-1:-1:-1;;;;;38806:31:0;;;-1:-1:-1;;38806:31:0;;;;;;;38854:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;38854:29:0;;;;;;;;;;;38938:20;;;:11;:20;;;;;;38975:18;;-1:-1:-1;;;;;;39010:49:0;;;;-1:-1:-1;;;39043:15:0;39010:49;;;;;;;;;;39341:11;;39403:24;;;;;39448:13;;38938:20;;39403:24;;39448:13;39444:398;;39664:13;;39649:11;:28;39645:180;;39704:20;;39775:28;;;;-1:-1:-1;;;;;39749:54:0;-1:-1:-1;;;39749:54:0;-1:-1:-1;;;;;;39749:54:0;;;-1:-1:-1;;;;;39704:20:0;;39749:54;;;;39645:180;38779:1076;;;39895:7;39891:2;-1:-1:-1;;;;;39876:27:0;39885:4;-1:-1:-1;;;;;39876:27:0;-1:-1:-1;;;;;;;;;;;39876:27:0;;;;;;;;;39916:42;37854:2114;;37742:2226;;;:::o;29293:1159::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;29406:7:0;;26497:1;29461:23;;:47;;;;;29495:13;;29488:4;:20;29461:47;29457:922;;;29531:31;29565:17;;;:11;:17;;;;;;;;;29531:51;;;;;;;;;-1:-1:-1;;;;;29531:51:0;;;;-1:-1:-1;;;29531:51:0;;-1:-1:-1;;;;;29531:51:0;;;;;;;;-1:-1:-1;;;29531:51:0;;;;;;;;;;;;;;29603:759;;29655:14;;-1:-1:-1;;;;;29655:28:0;;29651:105;;29721:9;29293:1159;-1:-1:-1;;;29293:1159:0:o;29651:105::-;-1:-1:-1;;;30110:6:0;30157:17;;;;:11;:17;;;;;;;;;30145:29;;;;;;;;;-1:-1:-1;;;;;30145:29:0;;;;;-1:-1:-1;;;30145:29:0;;-1:-1:-1;;;;;30145:29:0;;;;;;;;-1:-1:-1;;;30145:29:0;;;;;;;;;;;;;30207:28;30203:113;;30277:9;29293:1159;-1:-1:-1;;;29293:1159:0:o;30203:113::-;30068:273;;;29510:869;29457:922;30411:31;;-1:-1:-1;;;30411:31:0;;;;;;;;;;;48531:191;48605:16;48624:6;;-1:-1:-1;;;;;48641:17:0;;;-1:-1:-1;;;;;;48641:17:0;;;;;;48674:40;;48624:6;;;;;;;48674:40;;48605:16;48674:40;48594:128;48531:191;:::o;34652:108::-;34723:27;34733:2;34737:8;34723:27;;;;;;;;;;;;:9;:27::i;40407:2514::-;40489:35;40527:21;40540:7;40527:12;:21::i;:::-;40580:18;;40489:59;;-1:-1:-1;40615:302:0;;;;40651:22;22811:10;-1:-1:-1;;;;;40677:20:0;;;;:79;;-1:-1:-1;40720:36:0;40737:4;22811:10;32999:168;:::i;40720:36::-;40677:138;;;-1:-1:-1;22811:10:0;40779:20;40791:7;40779:11;:20::i;:::-;-1:-1:-1;;;;;40779:36:0;;40677:138;40651:165;;40842:17;40837:66;;40868:35;;-1:-1:-1;;;40868:35:0;;;;;;;;;;;40837:66;40634:283;40615:302;41055:35;41072:1;41076:7;41085:4;41055:8;:35::i;:::-;-1:-1:-1;;;;;41432:18:0;;;41398:31;41432:18;;;:12;:18;;;;;;;;41467:24;;-1:-1:-1;;;;;;;;;;41467:24:0;;;;;;;;;-1:-1:-1;;41467:24:0;;;;41508:29;;;;;41490:1;41508:29;;;;;;;;-1:-1:-1;;41508:29:0;;;;;;;;;;41676:20;;;:11;:20;;;;;;41713;;-1:-1:-1;;;;41783:15:0;41750:49;;;-1:-1:-1;;;41750:49:0;-1:-1:-1;;;;;;41750:49:0;;;;;;;;;;41816:22;-1:-1:-1;;;41816:22:0;;;42116:11;;;42178:24;;;;;42223:13;;41432:18;;42178:24;;42223:13;42219:398;;42439:13;;42424:11;:28;42420:180;;42479:20;;42550:28;;;;-1:-1:-1;;;;;42524:54:0;-1:-1:-1;;;42524:54:0;-1:-1:-1;;;;;;42524:54:0;;;-1:-1:-1;;;;;42479:20:0;;42524:54;;;;42420:180;-1:-1:-1;;42651:35:0;;42678:7;;-1:-1:-1;42674:1:0;;-1:-1:-1;;;;;;42651:35:0;;;-1:-1:-1;;;;;;;;;;;42651:35:0;42674:1;;42651:35;-1:-1:-1;;42884:12:0;:14;;;;;;-1:-1:-1;;40407:2514:0:o;43777:701::-;43973:72;;-1:-1:-1;;;43973:72:0;;43950:4;;-1:-1:-1;;;;;43973:36:0;;;;;:72;;22811:10;;44024:4;;44030:7;;44039:5;;43973:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43973:72:0;;;;;;;;-1:-1:-1;;43973:72:0;;;;;;;;;;;;:::i;:::-;;;43969:500;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44213:13:0;;44209:247;;44261:40;;-1:-1:-1;;;44261:40:0;;;;;;;;;;;44209:247;44410:6;44404:13;44395:6;44391:2;44387:15;44380:38;43969:500;-1:-1:-1;;;;;;44094:55:0;-1:-1:-1;;;44094:55:0;;-1:-1:-1;43969:500:0;43777:701;;;;;;:::o;53028:114::-;53088:13;53121;53114:20;;;;;:::i;3138:723::-;3194:13;3415:10;3411:53;;-1:-1:-1;;3442:10:0;;;;;;;;;;;;-1:-1:-1;;;3442:10:0;;;;;3138:723::o;3411:53::-;3489:5;3474:12;3530:78;3537:9;;3530:78;;3563:8;;;;:::i;:::-;;-1:-1:-1;3586:10:0;;-1:-1:-1;3594:2:0;3586:10;;:::i;:::-;;;3530:78;;;3618:19;3650:6;-1:-1:-1;;;;;3640:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3640:17:0;;3618:39;;3668:154;3675:10;;3668:154;;3702:11;3712:1;3702:11;;:::i;:::-;;-1:-1:-1;3771:10:0;3779:2;3771:5;:10;:::i;:::-;3758:24;;:2;:24;:::i;:::-;3745:39;;3728:6;3735;3728:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;3728:56:0;;;;;;;;-1:-1:-1;3799:11:0;3808:2;3799:11;;:::i;:::-;;;3668:154;;35147:175;35280:32;35286:2;35290:8;35300:5;35307:4;35779:13;;-1:-1:-1;;;;;35809:16:0;;35805:48;;35834:19;;-1:-1:-1;;;35834:19:0;;;;;;;;;;;35805:48;35870:13;35866:44;;35892:18;;-1:-1:-1;;;35892:18:0;;;;;;;;;;;35866:44;-1:-1:-1;;;;;36277:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;36338:49:0;;-1:-1:-1;;;;;36277:44:0;;;;;;;36338:49;;;-1:-1:-1;;;;;36277:44:0;;;;;;36338:49;;;;;;;;;;;;;;;;36408:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;36460:66:0;;;;-1:-1:-1;;;36510:15:0;36460:66;;;;;;;;;;36408:25;36613:23;;;36661:4;:23;;;;-1:-1:-1;;;;;;36669:13:0;;6425:19;:23;;36669:15;36657:667;;;36707:324;36740:38;;36765:12;;-1:-1:-1;;;;;36740:38:0;;;36757:1;;-1:-1:-1;;;;;;;;;;;36740:38:0;36757:1;;36740:38;36808:69;36847:1;36851:2;36855:14;;;;;;36871:5;36808:30;:69::i;:::-;36803:178;;36915:40;;-1:-1:-1;;;36915:40:0;;;;;;;;;;;36803:178;37026:3;37010:12;:19;;36707:324;;37116:12;37099:13;;:29;37095:43;;37130:8;;;37095:43;36657:667;;;37183:124;37216:40;;37241:14;;;;;-1:-1:-1;;;;;37216:40:0;;;37233:1;;-1:-1:-1;;;;;;;;;;;37216:40:0;37233:1;;37216:40;37302:3;37286:12;:19;;37183:124;;36657:667;-1:-1:-1;37340:13:0;:28;37394:60;33785:389;-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:160::-;257:20;;313:13;;306:21;296:32;;286:60;;342:1;339;332:12;357:171;424:20;;-1:-1:-1;;;;;473:30:1;;463:41;;453:69;;518:1;515;508:12;533:186;592:6;645:2;633:9;624:7;620:23;616:32;613:52;;;661:1;658;651:12;613:52;684:29;703:9;684:29;:::i;724:260::-;792:6;800;853:2;841:9;832:7;828:23;824:32;821:52;;;869:1;866;859:12;821:52;892:29;911:9;892:29;:::i;:::-;882:39;;940:38;974:2;963:9;959:18;940:38;:::i;:::-;930:48;;724:260;;;;;:::o;989:328::-;1066:6;1074;1082;1135:2;1123:9;1114:7;1110:23;1106:32;1103:52;;;1151:1;1148;1141:12;1103:52;1174:29;1193:9;1174:29;:::i;:::-;1164:39;;1222:38;1256:2;1245:9;1241:18;1222:38;:::i;:::-;1212:48;;1307:2;1296:9;1292:18;1279:32;1269:42;;989:328;;;;;:::o;1322:1138::-;1417:6;1425;1433;1441;1494:3;1482:9;1473:7;1469:23;1465:33;1462:53;;;1511:1;1508;1501:12;1462:53;1534:29;1553:9;1534:29;:::i;:::-;1524:39;;1582:38;1616:2;1605:9;1601:18;1582:38;:::i;:::-;1572:48;;1667:2;1656:9;1652:18;1639:32;1629:42;;1722:2;1711:9;1707:18;1694:32;-1:-1:-1;;;;;1786:2:1;1778:6;1775:14;1772:34;;;1802:1;1799;1792:12;1772:34;1840:6;1829:9;1825:22;1815:32;;1885:7;1878:4;1874:2;1870:13;1866:27;1856:55;;1907:1;1904;1897:12;1856:55;1943:2;1930:16;1965:2;1961;1958:10;1955:36;;;1971:18;;:::i;:::-;2046:2;2040:9;2014:2;2100:13;;-1:-1:-1;;2096:22:1;;;2120:2;2092:31;2088:40;2076:53;;;2144:18;;;2164:22;;;2141:46;2138:72;;;2190:18;;:::i;:::-;2230:10;2226:2;2219:22;2265:2;2257:6;2250:18;2305:7;2300:2;2295;2291;2287:11;2283:20;2280:33;2277:53;;;2326:1;2323;2316:12;2277:53;2382:2;2377;2373;2369:11;2364:2;2356:6;2352:15;2339:46;2427:1;2422:2;2417;2409:6;2405:15;2401:24;2394:35;2448:6;2438:16;;;;;;;1322:1138;;;;;;;:::o;2465:254::-;2530:6;2538;2591:2;2579:9;2570:7;2566:23;2562:32;2559:52;;;2607:1;2604;2597:12;2559:52;2630:29;2649:9;2630:29;:::i;:::-;2620:39;;2678:35;2709:2;2698:9;2694:18;2678:35;:::i;2724:254::-;2792:6;2800;2853:2;2841:9;2832:7;2828:23;2824:32;2821:52;;;2869:1;2866;2859:12;2821:52;2892:29;2911:9;2892:29;:::i;:::-;2882:39;2968:2;2953:18;;;;2940:32;;-1:-1:-1;;;2724:254:1:o;2983:258::-;3050:6;3058;3111:2;3099:9;3090:7;3086:23;3082:32;3079:52;;;3127:1;3124;3117:12;3079:52;3150:29;3169:9;3150:29;:::i;:::-;3140:39;;3198:37;3231:2;3220:9;3216:18;3198:37;:::i;3246:180::-;3302:6;3355:2;3343:9;3334:7;3330:23;3326:32;3323:52;;;3371:1;3368;3361:12;3323:52;3394:26;3410:9;3394:26;:::i;3431:245::-;3489:6;3542:2;3530:9;3521:7;3517:23;3513:32;3510:52;;;3558:1;3555;3548:12;3510:52;3597:9;3584:23;3616:30;3640:5;3616:30;:::i;3681:249::-;3750:6;3803:2;3791:9;3782:7;3778:23;3774:32;3771:52;;;3819:1;3816;3809:12;3771:52;3851:9;3845:16;3870:30;3894:5;3870:30;:::i;3935:592::-;4006:6;4014;4067:2;4055:9;4046:7;4042:23;4038:32;4035:52;;;4083:1;4080;4073:12;4035:52;4123:9;4110:23;-1:-1:-1;;;;;4193:2:1;4185:6;4182:14;4179:34;;;4209:1;4206;4199:12;4179:34;4247:6;4236:9;4232:22;4222:32;;4292:7;4285:4;4281:2;4277:13;4273:27;4263:55;;4314:1;4311;4304:12;4263:55;4354:2;4341:16;4380:2;4372:6;4369:14;4366:34;;;4396:1;4393;4386:12;4366:34;4441:7;4436:2;4427:6;4423:2;4419:15;4415:24;4412:37;4409:57;;;4462:1;4459;4452:12;4409:57;4493:2;4485:11;;;;;4515:6;;-1:-1:-1;3935:592:1;;-1:-1:-1;;;;3935:592:1:o;4532:180::-;4591:6;4644:2;4632:9;4623:7;4619:23;4615:32;4612:52;;;4660:1;4657;4650:12;4612:52;-1:-1:-1;4683:23:1;;4532:180;-1:-1:-1;4532:180:1:o;4717:254::-;4785:6;4793;4846:2;4834:9;4825:7;4821:23;4817:32;4814:52;;;4862:1;4859;4852:12;4814:52;4898:9;4885:23;4875:33;;4927:38;4961:2;4950:9;4946:18;4927:38;:::i;4976:248::-;5041:6;5049;5102:2;5090:9;5081:7;5077:23;5073:32;5070:52;;;5118:1;5115;5108:12;5070:52;5154:9;5141:23;5131:33;;5183:35;5214:2;5203:9;5199:18;5183:35;:::i;5229:252::-;5293:6;5301;5354:2;5342:9;5333:7;5329:23;5325:32;5322:52;;;5370:1;5367;5360:12;5322:52;5393:28;5411:9;5393:28;:::i;5486:257::-;5527:3;5565:5;5559:12;5592:6;5587:3;5580:19;5608:63;5664:6;5657:4;5652:3;5648:14;5641:4;5634:5;5630:16;5608:63;:::i;:::-;5725:2;5704:15;-1:-1:-1;;5700:29:1;5691:39;;;;5732:4;5687:50;;5486:257;-1:-1:-1;;5486:257:1:o;5748:637::-;6028:3;6066:6;6060:13;6082:53;6128:6;6123:3;6116:4;6108:6;6104:17;6082:53;:::i;:::-;6198:13;;6157:16;;;;6220:57;6198:13;6157:16;6254:4;6242:17;;6220:57;:::i;:::-;-1:-1:-1;;;6299:20:1;;6328:22;;;6377:1;6366:13;;5748:637;-1:-1:-1;;;;5748:637:1:o;6808:488::-;-1:-1:-1;;;;;7077:15:1;;;7059:34;;7129:15;;7124:2;7109:18;;7102:43;7176:2;7161:18;;7154:34;;;7224:3;7219:2;7204:18;;7197:31;;;7002:4;;7245:45;;7270:19;;7262:6;7245:45;:::i;:::-;7237:53;6808:488;-1:-1:-1;;;;;;6808:488:1:o;7301:632::-;7472:2;7524:21;;;7594:13;;7497:18;;;7616:22;;;7443:4;;7472:2;7695:15;;;;7669:2;7654:18;;;7443:4;7738:169;7752:6;7749:1;7746:13;7738:169;;;7813:13;;7801:26;;7882:15;;;;7847:12;;;;7774:1;7767:9;7738:169;;;-1:-1:-1;7924:3:1;;7301:632;-1:-1:-1;;;;;;7301:632:1:o;8130:219::-;8279:2;8268:9;8261:21;8242:4;8299:44;8339:2;8328:9;8324:18;8316:6;8299:44;:::i;8354:344::-;8556:2;8538:21;;;8595:2;8575:18;;;8568:30;-1:-1:-1;;;8629:2:1;8614:18;;8607:50;8689:2;8674:18;;8354:344::o;9459:356::-;9661:2;9643:21;;;9680:18;;;9673:30;9739:34;9734:2;9719:18;;9712:62;9806:2;9791:18;;9459:356::o;11291:343::-;11493:2;11475:21;;;11532:2;11512:18;;;11505:30;-1:-1:-1;;;11566:2:1;11551:18;;11544:49;11625:2;11610:18;;11291:343::o;12026:128::-;12066:3;12097:1;12093:6;12090:1;12087:13;12084:39;;;12103:18;;:::i;:::-;-1:-1:-1;12139:9:1;;12026:128::o;12159:236::-;12198:3;-1:-1:-1;;;;;12271:2:1;12268:1;12264:10;12301:2;12298:1;12294:10;12332:3;12328:2;12324:12;12319:3;12316:21;12313:47;;;12340:18;;:::i;:::-;12376:13;;12159:236;-1:-1:-1;;;;12159:236:1:o;12400:120::-;12440:1;12466;12456:35;;12471:18;;:::i;:::-;-1:-1:-1;12505:9:1;;12400:120::o;12525:168::-;12565:7;12631:1;12627;12623:6;12619:14;12616:1;12613:21;12608:1;12601:9;12594:17;12590:45;12587:71;;;12638:18;;:::i;:::-;-1:-1:-1;12678:9:1;;12525:168::o;12698:125::-;12738:4;12766:1;12763;12760:8;12757:34;;;12771:18;;:::i;:::-;-1:-1:-1;12808:9:1;;12698:125::o;12828:229::-;12867:4;-1:-1:-1;;;;;12964:10:1;;;;12934;;12986:12;;;12983:38;;;13001:18;;:::i;:::-;13038:13;;12828:229;-1:-1:-1;;;12828:229:1:o;13062:258::-;13134:1;13144:113;13158:6;13155:1;13152:13;13144:113;;;13234:11;;;13228:18;13215:11;;;13208:39;13180:2;13173:10;13144:113;;;13275:6;13272:1;13269:13;13266:48;;;-1:-1:-1;;13310:1:1;13292:16;;13285:27;13062:258::o;13325:380::-;13404:1;13400:12;;;;13447;;;13468:61;;13522:4;13514:6;13510:17;13500:27;;13468:61;13575:2;13567:6;13564:14;13544:18;13541:38;13538:161;;;13621:10;13616:3;13612:20;13609:1;13602:31;13656:4;13653:1;13646:15;13684:4;13681:1;13674:15;13538:161;;13325:380;;;:::o;13710:135::-;13749:3;-1:-1:-1;;13770:17:1;;13767:43;;;13790:18;;:::i;:::-;-1:-1:-1;13837:1:1;13826:13;;13710:135::o;13850:112::-;13882:1;13908;13898:35;;13913:18;;:::i;:::-;-1:-1:-1;13947:9:1;;13850:112::o;13967:127::-;14028:10;14023:3;14019:20;14016:1;14009:31;14059:4;14056:1;14049:15;14083:4;14080:1;14073:15;14099:127;14160:10;14155:3;14151:20;14148:1;14141:31;14191:4;14188:1;14181:15;14215:4;14212:1;14205:15;14231:127;14292:10;14287:3;14283:20;14280:1;14273:31;14323:4;14320:1;14313:15;14347:4;14344:1;14337:15;14363:127;14424:10;14419:3;14415:20;14412:1;14405:31;14455:4;14452:1;14445:15;14479:4;14476:1;14469:15;14495:131;-1:-1:-1;;;;;;14569:32:1;;14559:43;;14549:71;;14616:1;14613;14606:12

Swarm Source

ipfs://964e9ec3ac385ba9b42de3f7cad140fdc23afbba86589cdb436e36a9b5e2fd5a
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.