ETH Price: $3,712.12 (-5.69%)

Token

HarryBolz (HarryBolz)
 

Overview

Max Total Supply

1,286 HarryBolz

Holders

745

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 HarryBolz
0xe944D9F9226E9fa08326339f70637C47A3950C01
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:
HarryBolz

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 2023-04-12
*/

// SPDX-License-Identifier: MIT

//   _   _                         ____        _     
//  | | | | __ _ _ __ _ __ _   _  | __ )  ___ | |____
//  | |_| |/ _` | '__| '__| | | | |  _ \ / _ \| |_  /
//  |  _  | (_| | |  | |  | |_| | | |_) | (_) | |/ / 
//  |_| |_|\__,_|_|  |_|   \__, | |____/ \___/|_/___|
//                         |___/                                                                                                                                                      
                                                                                        
// Twitter: @nftharrybolz

// 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 (last updated v4.6.0) (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 `IERC721Receiver.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 (last updated v4.6.0) (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`.
     *
     * 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;

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

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

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

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


// Creator: Chiru Labs

pragma solidity ^0.8.7;

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 0;
    }

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

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    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 {
        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 (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 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) 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;

            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 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);
    }
}


pragma solidity ^0.8.7;


// File @openzeppelin/contracts/interfaces/[email protected]


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

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/common/[email protected]


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

        return (royalty.receiver, royaltyAmount);
    }

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

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

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

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

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

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

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


contract HarryBolz is ERC721A, ERC2981, Ownable {

    string public baseURI = "ipfs://QmVkzhycW9KH9jjHqDdjm8VQKD1hrbUbzB2BnvGE7dgP7U/";
    uint256 public constant MAX_SUPPLY = 5555;
    uint256 public MINT_PRICE = 0.0035 ether;
    uint256   public MAX_PER_TX = 8;
    uint256   public MAX_PER_TX_FREE = 1;
    uint96   public _rAm = 500;
    bool public isPublicSale = false;
    mapping(address => uint256) public _mintedFreeAmount;
    mapping(address => uint256) public _totalMintedAmount;
    uint   public totalFreeMinted = 0;

    constructor() ERC721A("HarryBolz", "HarryBolz") {
        _setDefaultRoyalty(0xbA16237200B200e571e60AE391085feCE1783744, _rAm);
    }

  function tokenURI(uint256 _tokenId) public view override returns (string memory) {
        require(_exists(_tokenId), "Token does not exist.");
        return string(abi.encodePacked(baseURI, Strings.toString(_tokenId), ".json"));
    }

    function setBaseURI(string memory _baseURI) external onlyOwner {
        baseURI = _baseURI;
    }

    function setFreeSupply(uint256 _freeSupply) public onlyOwner {
        MAX_PER_TX_FREE = _freeSupply;
    }

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

    function setMintPrice(uint256 _price) external onlyOwner {
        MINT_PRICE = _price;
    }

    function togglePublicSale(bool _isPublicSale) external onlyOwner {
        isPublicSale = _isPublicSale;
    }

     function setRoyaltyInfo(address receiver, uint96 feeBasisPoints)
        external
        onlyOwner
    {
        _setDefaultRoyalty(receiver, feeBasisPoints);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721A, ERC2981)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

    function mint(uint256 count) external payable {
        require(isPublicSale, "Mint is not live yet");
        require(totalSupply() + count <= MAX_SUPPLY, "No more");
        require(count <= MAX_PER_TX, "Max per txn reached.");
            if(count >= (MAX_PER_TX_FREE - _mintedFreeAmount[msg.sender]))
            {
             require(msg.value >= (count * MINT_PRICE) - ((MAX_PER_TX_FREE - _mintedFreeAmount[msg.sender]) * MINT_PRICE), "You've already minted max free allocation or incorrect ETH sent");
             _mintedFreeAmount[msg.sender] = MAX_PER_TX_FREE;
             totalFreeMinted += MAX_PER_TX_FREE;
            }
            else if(count < (MAX_PER_TX_FREE - _mintedFreeAmount[msg.sender]))
            {
             require(msg.value >= 0, "Please send the exact ETH amount");
             _mintedFreeAmount[msg.sender] += count;
             totalFreeMinted += count;
            }
        else{
        require(isPublicSale, "Mint is not live yet");
        require(msg.value >= count * MINT_PRICE, "Please send the exact ETH amount");
        require(totalSupply() + count <= MAX_SUPPLY, "No more");
        require(count <= MAX_PER_TX, "Max per txn reached.");
        }
        _totalMintedAmount[msg.sender] += count;
        _safeMint(msg.sender, count);
    }

    function devMint(uint256 count) external onlyOwner {
        _safeMint(_msgSender(), count);
    }

    function withdrawMoney() external onlyOwner {
        (bool success, ) = _msgSender().call{value: address(this).balance}("");
        require(success, "Transfer failed.");
    }
}

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":[],"name":"MAX_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_TX_FREE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_mintedFreeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_rAm","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_totalMintedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_freeSupply","type":"uint256"}],"name":"setFreeSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeBasisPoints","type":"uint96"}],"name":"setRoyaltyInfo","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":"bool","name":"_isPublicSale","type":"bool"}],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFreeMinted","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":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e06040526036608081815290620025a760a03980516200002991600b916020909101906200025d565b50660c6f3b40b6c000600c556008600d556001600e55600f80546001600160681b0319166101f417905560006012553480156200006557600080fd5b506040805180820182526009808252682430b9393ca137b63d60b91b602080840182815285518087019096529285528401528151919291620000aa916002916200025d565b508051620000c09060039060208401906200025d565b5050600160005550620000d33362000106565b600f54620001009073ba16237200b200e571e60ae391085fece1783744906001600160601b031662000158565b62000340565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6127106001600160601b0382161115620001cc5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084015b60405180910390fd5b6001600160a01b038216620002245760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401620001c3565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600855565b8280546200026b9062000303565b90600052602060002090601f0160209004810192826200028f5760008555620002da565b82601f10620002aa57805160ff1916838001178555620002da565b82800160010185558215620002da579182015b82811115620002da578251825591602001919060010190620002bd565b50620002e8929150620002ec565b5090565b5b80821115620002e85760008155600101620002ed565b600181811c908216806200031857607f821691505b602082108114156200033a57634e487b7160e01b600052602260045260246000fd5b50919050565b61225780620003506000396000f3fe60806040526004361061020f5760003560e01c8063715018a611610118578063c002d23d116100a0578063f2fde38b1161006f578063f2fde38b1461063b578063f43a22dc1461065b578063f4a0a52814610671578063f4db2acb14610691578063f676308a146106be57600080fd5b8063c002d23d146105a6578063c87b56dd146105bc578063dad7b5c9146105dc578063e985e9c5146105f257600080fd5b8063a0712d68116100e7578063a0712d681461051d578063a22cb46514610530578063a5a865dc14610550578063ac44600214610571578063b88d4fde1461058657600080fd5b8063715018a6146104b55780638c3cefa3146104ca5780638da5cb5b146104ea57806395d89b411461050857600080fd5b806332cb6b0c1161019b57806355f804b31161016a57806355f804b31461040857806358c87f72146104285780636352211e146104605780636c0360eb1461048057806370a082311461049557600080fd5b806332cb6b0c1461039c578063375a069a146103b257806342842e0e146103d2578063463fff79146103f257600080fd5b8063095ea7b3116101e2578063095ea7b3146102c557806311b01a32146102e557806318160ddd1461032057806323b872dd1461033d5780632a55205a1461035d57600080fd5b806301ffc9a71461021457806302fa7c471461024957806306fdde031461026b578063081812fc1461028d575b600080fd5b34801561022057600080fd5b5061023461022f366004611e75565b6106de565b60405190151581526020015b60405180910390f35b34801561025557600080fd5b50610269610264366004611e17565b6106ef565b005b34801561027757600080fd5b50610280610730565b6040516102409190612073565b34801561029957600080fd5b506102ad6102a8366004611ef8565b6107c2565b6040516001600160a01b039091168152602001610240565b3480156102d157600080fd5b506102696102e0366004611ded565b610806565b3480156102f157600080fd5b50610312610300366004611cb6565b60116020526000908152604090205481565b604051908152602001610240565b34801561032c57600080fd5b506001546000540360001901610312565b34801561034957600080fd5b50610269610358366004611d0b565b610894565b34801561036957600080fd5b5061037d610378366004611f11565b61089f565b604080516001600160a01b039093168352602083019190915201610240565b3480156103a857600080fd5b506103126115b381565b3480156103be57600080fd5b506102696103cd366004611ef8565b61094b565b3480156103de57600080fd5b506102696103ed366004611d0b565b610982565b3480156103fe57600080fd5b50610312600e5481565b34801561041457600080fd5b50610269610423366004611eaf565b61099d565b34801561043457600080fd5b50600f54610448906001600160601b031681565b6040516001600160601b039091168152602001610240565b34801561046c57600080fd5b506102ad61047b366004611ef8565b6109da565b34801561048c57600080fd5b506102806109ec565b3480156104a157600080fd5b506103126104b0366004611cb6565b610a7a565b3480156104c157600080fd5b50610269610ac9565b3480156104d657600080fd5b506102696104e5366004611e5a565b610aff565b3480156104f657600080fd5b50600a546001600160a01b03166102ad565b34801561051457600080fd5b50610280610b47565b61026961052b366004611ef8565b610b56565b34801561053c57600080fd5b5061026961054b366004611dc3565b610f20565b34801561055c57600080fd5b50600f5461023490600160601b900460ff1681565b34801561057d57600080fd5b50610269610fb6565b34801561059257600080fd5b506102696105a1366004611d47565b61106b565b3480156105b257600080fd5b50610312600c5481565b3480156105c857600080fd5b506102806105d7366004611ef8565b6110bc565b3480156105e857600080fd5b5061031260125481565b3480156105fe57600080fd5b5061023461060d366004611cd8565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561064757600080fd5b50610269610656366004611cb6565b61113d565b34801561066757600080fd5b50610312600d5481565b34801561067d57600080fd5b5061026961068c366004611ef8565b6111d5565b34801561069d57600080fd5b506103126106ac366004611cb6565b60106020526000908152604090205481565b3480156106ca57600080fd5b506102696106d9366004611ef8565b611204565b60006106e982611233565b92915050565b600a546001600160a01b031633146107225760405162461bcd60e51b815260040161071990612086565b60405180910390fd5b61072c8282611258565b5050565b60606002805461073f90612149565b80601f016020809104026020016040519081016040528092919081815260200182805461076b90612149565b80156107b85780601f1061078d576101008083540402835291602001916107b8565b820191906000526020600020905b81548152906001019060200180831161079b57829003601f168201915b5050505050905090565b60006107cd82611355565b6107ea576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610811826109da565b9050806001600160a01b0316836001600160a01b031614156108465760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906108665750610864813361060d565b155b15610884576040516367d9dca160e11b815260040160405180910390fd5b61088f83838361138e565b505050565b61088f8383836113ea565b60008281526009602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916109145750604080518082019091526008546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610933906001600160601b0316876120e7565b61093d91906120d3565b915196919550909350505050565b600a546001600160a01b031633146109755760405162461bcd60e51b815260040161071990612086565b61097f33826115d9565b50565b61088f8383836040518060200160405280600081525061106b565b600a546001600160a01b031633146109c75760405162461bcd60e51b815260040161071990612086565b805161072c90600b906020840190611b7b565b60006109e5826115f3565b5192915050565b600b80546109f990612149565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2590612149565b8015610a725780601f10610a4757610100808354040283529160200191610a72565b820191906000526020600020905b815481529060010190602001808311610a5557829003601f168201915b505050505081565b60006001600160a01b038216610aa3576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b600a546001600160a01b03163314610af35760405162461bcd60e51b815260040161071990612086565b610afd600061171c565b565b600a546001600160a01b03163314610b295760405162461bcd60e51b815260040161071990612086565b600f8054911515600160601b0260ff60601b19909216919091179055565b60606003805461073f90612149565b600f54600160601b900460ff16610ba65760405162461bcd60e51b8152602060048201526014602482015273135a5b9d081a5cc81b9bdd081b1a5d99481e595d60621b6044820152606401610719565b6001546000546115b39183910360001901610bc191906120bb565b1115610bf95760405162461bcd60e51b81526020600482015260076024820152664e6f206d6f726560c81b6044820152606401610719565b600d54811115610c425760405162461bcd60e51b815260206004820152601460248201527326b0bc103832b9103a3c37103932b0b1b432b21760611b6044820152606401610719565b33600090815260106020526040902054600e54610c5f9190612106565b8110610d4d57600c5433600090815260106020526040902054600e54610c859190612106565b610c8f91906120e7565b600c54610c9c90836120e7565b610ca69190612106565b341015610d1b5760405162461bcd60e51b815260206004820152603f60248201527f596f7527766520616c7265616479206d696e746564206d61782066726565206160448201527f6c6c6f636174696f6e206f7220696e636f7272656374204554482073656e74006064820152608401610719565b600e5433600090815260106020526040812082905560128054909190610d429084906120bb565b90915550610ef19050565b33600090815260106020526040902054600e54610d6a9190612106565b811015610da9573360009081526010602052604081208054839290610d909084906120bb565b925050819055508060126000828254610d4291906120bb565b600f54600160601b900460ff16610df95760405162461bcd60e51b8152602060048201526014602482015273135a5b9d081a5cc81b9bdd081b1a5d99481e595d60621b6044820152606401610719565b600c54610e0690826120e7565b341015610e555760405162461bcd60e51b815260206004820181905260248201527f506c656173652073656e64207468652065786163742045544820616d6f756e746044820152606401610719565b6001546000546115b39183910360001901610e7091906120bb565b1115610ea85760405162461bcd60e51b81526020600482015260076024820152664e6f206d6f726560c81b6044820152606401610719565b600d54811115610ef15760405162461bcd60e51b815260206004820152601460248201527326b0bc103832b9103a3c37103932b0b1b432b21760611b6044820152606401610719565b3360009081526011602052604081208054839290610f109084906120bb565b9091555061097f905033826115d9565b6001600160a01b038216331415610f4a5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b03163314610fe05760405162461bcd60e51b815260040161071990612086565b604051600090339047908381818185875af1925050503d8060008114611022576040519150601f19603f3d011682016040523d82523d6000602084013e611027565b606091505b505090508061097f5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610719565b6110768484846113ea565b6001600160a01b0383163b1515801561109857506110968484848461176e565b155b156110b6576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60606110c782611355565b61110b5760405162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b6044820152606401610719565b600b61111683611866565b604051602001611127929190611f7b565b6040516020818303038152906040529050919050565b600a546001600160a01b031633146111675760405162461bcd60e51b815260040161071990612086565b6001600160a01b0381166111cc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610719565b61097f8161171c565b600a546001600160a01b031633146111ff5760405162461bcd60e51b815260040161071990612086565b600c55565b600a546001600160a01b0316331461122e5760405162461bcd60e51b815260040161071990612086565b600e55565b60006001600160e01b0319821663152a902d60e11b14806106e957506106e982611964565b6127106001600160601b03821611156112c65760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610719565b6001600160a01b03821661131c5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610719565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600855565b600081600111158015611369575060005482105b80156106e9575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006113f5826115f3565b9050836001600160a01b031681600001516001600160a01b03161461142c5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061144a575061144a853361060d565b8061146557503361145a846107c2565b6001600160a01b0316145b90508061148557604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0384166114ac57604051633a954ecd60e21b815260040160405180910390fd5b6114b86000848761138e565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661158e57600054821461158e578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b61072c8282604051806020016040528060008152506119b4565b60408051606081018252600080825260208201819052918101919091528180600111158015611623575060005481105b1561170357600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff161515918101829052906117015780516001600160a01b031615611697579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff16151592810192909252156116fc579392505050565b611697565b505b604051636f96cda160e11b815260040160405180910390fd5b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906117a3903390899088908890600401612036565b602060405180830381600087803b1580156117bd57600080fd5b505af19250505080156117ed575060408051601f3d908101601f191682019092526117ea91810190611e92565b60015b611848573d80801561181b576040519150601f19603f3d011682016040523d82523d6000602084013e611820565b606091505b508051611840576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60608161188a5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156118b4578061189e81612184565b91506118ad9050600a836120d3565b915061188e565b60008167ffffffffffffffff8111156118cf576118cf6121f5565b6040519080825280601f01601f1916602001820160405280156118f9576020820181803683370190505b5090505b841561185e5761190e600183612106565b915061191b600a8661219f565b6119269060306120bb565b60f81b81838151811061193b5761193b6121df565b60200101906001600160f81b031916908160001a90535061195d600a866120d3565b94506118fd565b60006001600160e01b031982166380ac58cd60e01b148061199557506001600160e01b03198216635b5e139f60e01b145b806106e957506301ffc9a760e01b6001600160e01b03198316146106e9565b6000546001600160a01b0384166119dd57604051622e076360e81b815260040160405180910390fd5b826119fb5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600490925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15611b25575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611aed600087848060010195508761176e565b611b0a576040516368d2bf6b60e11b815260040160405180910390fd5b80821415611aa2578260005414611b2057600080fd5b611b6b565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415611b26575b5060009081556110b69085838684565b828054611b8790612149565b90600052602060002090601f016020900481019282611ba95760008555611bef565b82601f10611bc257805160ff1916838001178555611bef565b82800160010185558215611bef579182015b82811115611bef578251825591602001919060010190611bd4565b50611bfb929150611bff565b5090565b5b80821115611bfb5760008155600101611c00565b600067ffffffffffffffff80841115611c2f57611c2f6121f5565b604051601f8501601f19908116603f01168101908282118183101715611c5757611c576121f5565b81604052809350858152868686011115611c7057600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114611ca157600080fd5b919050565b80358015158114611ca157600080fd5b600060208284031215611cc857600080fd5b611cd182611c8a565b9392505050565b60008060408385031215611ceb57600080fd5b611cf483611c8a565b9150611d0260208401611c8a565b90509250929050565b600080600060608486031215611d2057600080fd5b611d2984611c8a565b9250611d3760208501611c8a565b9150604084013590509250925092565b60008060008060808587031215611d5d57600080fd5b611d6685611c8a565b9350611d7460208601611c8a565b925060408501359150606085013567ffffffffffffffff811115611d9757600080fd5b8501601f81018713611da857600080fd5b611db787823560208401611c14565b91505092959194509250565b60008060408385031215611dd657600080fd5b611ddf83611c8a565b9150611d0260208401611ca6565b60008060408385031215611e0057600080fd5b611e0983611c8a565b946020939093013593505050565b60008060408385031215611e2a57600080fd5b611e3383611c8a565b915060208301356001600160601b0381168114611e4f57600080fd5b809150509250929050565b600060208284031215611e6c57600080fd5b611cd182611ca6565b600060208284031215611e8757600080fd5b8135611cd18161220b565b600060208284031215611ea457600080fd5b8151611cd18161220b565b600060208284031215611ec157600080fd5b813567ffffffffffffffff811115611ed857600080fd5b8201601f81018413611ee957600080fd5b61185e84823560208401611c14565b600060208284031215611f0a57600080fd5b5035919050565b60008060408385031215611f2457600080fd5b50508035926020909101359150565b60008151808452611f4b81602086016020860161211d565b601f01601f19169290920160200192915050565b60008151611f7181856020860161211d565b9290920192915050565b600080845481600182811c915080831680611f9757607f831692505b6020808410821415611fb757634e487b7160e01b86526022600452602486fd5b818015611fcb5760018114611fdc57612009565b60ff19861689528489019650612009565b60008b81526020902060005b868110156120015781548b820152908501908301611fe8565b505084890196505b50505050505061202d61201c8286611f5f565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061206990830184611f33565b9695505050505050565b602081526000611cd16020830184611f33565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156120ce576120ce6121b3565b500190565b6000826120e2576120e26121c9565b500490565b6000816000190483118215151615612101576121016121b3565b500290565b600082821015612118576121186121b3565b500390565b60005b83811015612138578181015183820152602001612120565b838111156110b65750506000910152565b600181811c9082168061215d57607f821691505b6020821081141561217e57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612198576121986121b3565b5060010190565b6000826121ae576121ae6121c9565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461097f57600080fdfea2646970667358221220c52b6274e0236825e3535fd59f32956ea2dc0ad29e355ba4b8fc56b2bb90906464736f6c63430008070033697066733a2f2f516d566b7a68796357394b48396a6a487144646a6d3856514b443168726255627a4232426e7647453764675037552f

Deployed Bytecode

0x60806040526004361061020f5760003560e01c8063715018a611610118578063c002d23d116100a0578063f2fde38b1161006f578063f2fde38b1461063b578063f43a22dc1461065b578063f4a0a52814610671578063f4db2acb14610691578063f676308a146106be57600080fd5b8063c002d23d146105a6578063c87b56dd146105bc578063dad7b5c9146105dc578063e985e9c5146105f257600080fd5b8063a0712d68116100e7578063a0712d681461051d578063a22cb46514610530578063a5a865dc14610550578063ac44600214610571578063b88d4fde1461058657600080fd5b8063715018a6146104b55780638c3cefa3146104ca5780638da5cb5b146104ea57806395d89b411461050857600080fd5b806332cb6b0c1161019b57806355f804b31161016a57806355f804b31461040857806358c87f72146104285780636352211e146104605780636c0360eb1461048057806370a082311461049557600080fd5b806332cb6b0c1461039c578063375a069a146103b257806342842e0e146103d2578063463fff79146103f257600080fd5b8063095ea7b3116101e2578063095ea7b3146102c557806311b01a32146102e557806318160ddd1461032057806323b872dd1461033d5780632a55205a1461035d57600080fd5b806301ffc9a71461021457806302fa7c471461024957806306fdde031461026b578063081812fc1461028d575b600080fd5b34801561022057600080fd5b5061023461022f366004611e75565b6106de565b60405190151581526020015b60405180910390f35b34801561025557600080fd5b50610269610264366004611e17565b6106ef565b005b34801561027757600080fd5b50610280610730565b6040516102409190612073565b34801561029957600080fd5b506102ad6102a8366004611ef8565b6107c2565b6040516001600160a01b039091168152602001610240565b3480156102d157600080fd5b506102696102e0366004611ded565b610806565b3480156102f157600080fd5b50610312610300366004611cb6565b60116020526000908152604090205481565b604051908152602001610240565b34801561032c57600080fd5b506001546000540360001901610312565b34801561034957600080fd5b50610269610358366004611d0b565b610894565b34801561036957600080fd5b5061037d610378366004611f11565b61089f565b604080516001600160a01b039093168352602083019190915201610240565b3480156103a857600080fd5b506103126115b381565b3480156103be57600080fd5b506102696103cd366004611ef8565b61094b565b3480156103de57600080fd5b506102696103ed366004611d0b565b610982565b3480156103fe57600080fd5b50610312600e5481565b34801561041457600080fd5b50610269610423366004611eaf565b61099d565b34801561043457600080fd5b50600f54610448906001600160601b031681565b6040516001600160601b039091168152602001610240565b34801561046c57600080fd5b506102ad61047b366004611ef8565b6109da565b34801561048c57600080fd5b506102806109ec565b3480156104a157600080fd5b506103126104b0366004611cb6565b610a7a565b3480156104c157600080fd5b50610269610ac9565b3480156104d657600080fd5b506102696104e5366004611e5a565b610aff565b3480156104f657600080fd5b50600a546001600160a01b03166102ad565b34801561051457600080fd5b50610280610b47565b61026961052b366004611ef8565b610b56565b34801561053c57600080fd5b5061026961054b366004611dc3565b610f20565b34801561055c57600080fd5b50600f5461023490600160601b900460ff1681565b34801561057d57600080fd5b50610269610fb6565b34801561059257600080fd5b506102696105a1366004611d47565b61106b565b3480156105b257600080fd5b50610312600c5481565b3480156105c857600080fd5b506102806105d7366004611ef8565b6110bc565b3480156105e857600080fd5b5061031260125481565b3480156105fe57600080fd5b5061023461060d366004611cd8565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561064757600080fd5b50610269610656366004611cb6565b61113d565b34801561066757600080fd5b50610312600d5481565b34801561067d57600080fd5b5061026961068c366004611ef8565b6111d5565b34801561069d57600080fd5b506103126106ac366004611cb6565b60106020526000908152604090205481565b3480156106ca57600080fd5b506102696106d9366004611ef8565b611204565b60006106e982611233565b92915050565b600a546001600160a01b031633146107225760405162461bcd60e51b815260040161071990612086565b60405180910390fd5b61072c8282611258565b5050565b60606002805461073f90612149565b80601f016020809104026020016040519081016040528092919081815260200182805461076b90612149565b80156107b85780601f1061078d576101008083540402835291602001916107b8565b820191906000526020600020905b81548152906001019060200180831161079b57829003601f168201915b5050505050905090565b60006107cd82611355565b6107ea576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610811826109da565b9050806001600160a01b0316836001600160a01b031614156108465760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906108665750610864813361060d565b155b15610884576040516367d9dca160e11b815260040160405180910390fd5b61088f83838361138e565b505050565b61088f8383836113ea565b60008281526009602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916109145750604080518082019091526008546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610933906001600160601b0316876120e7565b61093d91906120d3565b915196919550909350505050565b600a546001600160a01b031633146109755760405162461bcd60e51b815260040161071990612086565b61097f33826115d9565b50565b61088f8383836040518060200160405280600081525061106b565b600a546001600160a01b031633146109c75760405162461bcd60e51b815260040161071990612086565b805161072c90600b906020840190611b7b565b60006109e5826115f3565b5192915050565b600b80546109f990612149565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2590612149565b8015610a725780601f10610a4757610100808354040283529160200191610a72565b820191906000526020600020905b815481529060010190602001808311610a5557829003601f168201915b505050505081565b60006001600160a01b038216610aa3576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b600a546001600160a01b03163314610af35760405162461bcd60e51b815260040161071990612086565b610afd600061171c565b565b600a546001600160a01b03163314610b295760405162461bcd60e51b815260040161071990612086565b600f8054911515600160601b0260ff60601b19909216919091179055565b60606003805461073f90612149565b600f54600160601b900460ff16610ba65760405162461bcd60e51b8152602060048201526014602482015273135a5b9d081a5cc81b9bdd081b1a5d99481e595d60621b6044820152606401610719565b6001546000546115b39183910360001901610bc191906120bb565b1115610bf95760405162461bcd60e51b81526020600482015260076024820152664e6f206d6f726560c81b6044820152606401610719565b600d54811115610c425760405162461bcd60e51b815260206004820152601460248201527326b0bc103832b9103a3c37103932b0b1b432b21760611b6044820152606401610719565b33600090815260106020526040902054600e54610c5f9190612106565b8110610d4d57600c5433600090815260106020526040902054600e54610c859190612106565b610c8f91906120e7565b600c54610c9c90836120e7565b610ca69190612106565b341015610d1b5760405162461bcd60e51b815260206004820152603f60248201527f596f7527766520616c7265616479206d696e746564206d61782066726565206160448201527f6c6c6f636174696f6e206f7220696e636f7272656374204554482073656e74006064820152608401610719565b600e5433600090815260106020526040812082905560128054909190610d429084906120bb565b90915550610ef19050565b33600090815260106020526040902054600e54610d6a9190612106565b811015610da9573360009081526010602052604081208054839290610d909084906120bb565b925050819055508060126000828254610d4291906120bb565b600f54600160601b900460ff16610df95760405162461bcd60e51b8152602060048201526014602482015273135a5b9d081a5cc81b9bdd081b1a5d99481e595d60621b6044820152606401610719565b600c54610e0690826120e7565b341015610e555760405162461bcd60e51b815260206004820181905260248201527f506c656173652073656e64207468652065786163742045544820616d6f756e746044820152606401610719565b6001546000546115b39183910360001901610e7091906120bb565b1115610ea85760405162461bcd60e51b81526020600482015260076024820152664e6f206d6f726560c81b6044820152606401610719565b600d54811115610ef15760405162461bcd60e51b815260206004820152601460248201527326b0bc103832b9103a3c37103932b0b1b432b21760611b6044820152606401610719565b3360009081526011602052604081208054839290610f109084906120bb565b9091555061097f905033826115d9565b6001600160a01b038216331415610f4a5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b03163314610fe05760405162461bcd60e51b815260040161071990612086565b604051600090339047908381818185875af1925050503d8060008114611022576040519150601f19603f3d011682016040523d82523d6000602084013e611027565b606091505b505090508061097f5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610719565b6110768484846113ea565b6001600160a01b0383163b1515801561109857506110968484848461176e565b155b156110b6576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60606110c782611355565b61110b5760405162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b6044820152606401610719565b600b61111683611866565b604051602001611127929190611f7b565b6040516020818303038152906040529050919050565b600a546001600160a01b031633146111675760405162461bcd60e51b815260040161071990612086565b6001600160a01b0381166111cc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610719565b61097f8161171c565b600a546001600160a01b031633146111ff5760405162461bcd60e51b815260040161071990612086565b600c55565b600a546001600160a01b0316331461122e5760405162461bcd60e51b815260040161071990612086565b600e55565b60006001600160e01b0319821663152a902d60e11b14806106e957506106e982611964565b6127106001600160601b03821611156112c65760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610719565b6001600160a01b03821661131c5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610719565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600855565b600081600111158015611369575060005482105b80156106e9575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006113f5826115f3565b9050836001600160a01b031681600001516001600160a01b03161461142c5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061144a575061144a853361060d565b8061146557503361145a846107c2565b6001600160a01b0316145b90508061148557604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0384166114ac57604051633a954ecd60e21b815260040160405180910390fd5b6114b86000848761138e565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661158e57600054821461158e578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b61072c8282604051806020016040528060008152506119b4565b60408051606081018252600080825260208201819052918101919091528180600111158015611623575060005481105b1561170357600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff161515918101829052906117015780516001600160a01b031615611697579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff16151592810192909252156116fc579392505050565b611697565b505b604051636f96cda160e11b815260040160405180910390fd5b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906117a3903390899088908890600401612036565b602060405180830381600087803b1580156117bd57600080fd5b505af19250505080156117ed575060408051601f3d908101601f191682019092526117ea91810190611e92565b60015b611848573d80801561181b576040519150601f19603f3d011682016040523d82523d6000602084013e611820565b606091505b508051611840576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60608161188a5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156118b4578061189e81612184565b91506118ad9050600a836120d3565b915061188e565b60008167ffffffffffffffff8111156118cf576118cf6121f5565b6040519080825280601f01601f1916602001820160405280156118f9576020820181803683370190505b5090505b841561185e5761190e600183612106565b915061191b600a8661219f565b6119269060306120bb565b60f81b81838151811061193b5761193b6121df565b60200101906001600160f81b031916908160001a90535061195d600a866120d3565b94506118fd565b60006001600160e01b031982166380ac58cd60e01b148061199557506001600160e01b03198216635b5e139f60e01b145b806106e957506301ffc9a760e01b6001600160e01b03198316146106e9565b6000546001600160a01b0384166119dd57604051622e076360e81b815260040160405180910390fd5b826119fb5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600490925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15611b25575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611aed600087848060010195508761176e565b611b0a576040516368d2bf6b60e11b815260040160405180910390fd5b80821415611aa2578260005414611b2057600080fd5b611b6b565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415611b26575b5060009081556110b69085838684565b828054611b8790612149565b90600052602060002090601f016020900481019282611ba95760008555611bef565b82601f10611bc257805160ff1916838001178555611bef565b82800160010185558215611bef579182015b82811115611bef578251825591602001919060010190611bd4565b50611bfb929150611bff565b5090565b5b80821115611bfb5760008155600101611c00565b600067ffffffffffffffff80841115611c2f57611c2f6121f5565b604051601f8501601f19908116603f01168101908282118183101715611c5757611c576121f5565b81604052809350858152868686011115611c7057600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114611ca157600080fd5b919050565b80358015158114611ca157600080fd5b600060208284031215611cc857600080fd5b611cd182611c8a565b9392505050565b60008060408385031215611ceb57600080fd5b611cf483611c8a565b9150611d0260208401611c8a565b90509250929050565b600080600060608486031215611d2057600080fd5b611d2984611c8a565b9250611d3760208501611c8a565b9150604084013590509250925092565b60008060008060808587031215611d5d57600080fd5b611d6685611c8a565b9350611d7460208601611c8a565b925060408501359150606085013567ffffffffffffffff811115611d9757600080fd5b8501601f81018713611da857600080fd5b611db787823560208401611c14565b91505092959194509250565b60008060408385031215611dd657600080fd5b611ddf83611c8a565b9150611d0260208401611ca6565b60008060408385031215611e0057600080fd5b611e0983611c8a565b946020939093013593505050565b60008060408385031215611e2a57600080fd5b611e3383611c8a565b915060208301356001600160601b0381168114611e4f57600080fd5b809150509250929050565b600060208284031215611e6c57600080fd5b611cd182611ca6565b600060208284031215611e8757600080fd5b8135611cd18161220b565b600060208284031215611ea457600080fd5b8151611cd18161220b565b600060208284031215611ec157600080fd5b813567ffffffffffffffff811115611ed857600080fd5b8201601f81018413611ee957600080fd5b61185e84823560208401611c14565b600060208284031215611f0a57600080fd5b5035919050565b60008060408385031215611f2457600080fd5b50508035926020909101359150565b60008151808452611f4b81602086016020860161211d565b601f01601f19169290920160200192915050565b60008151611f7181856020860161211d565b9290920192915050565b600080845481600182811c915080831680611f9757607f831692505b6020808410821415611fb757634e487b7160e01b86526022600452602486fd5b818015611fcb5760018114611fdc57612009565b60ff19861689528489019650612009565b60008b81526020902060005b868110156120015781548b820152908501908301611fe8565b505084890196505b50505050505061202d61201c8286611f5f565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061206990830184611f33565b9695505050505050565b602081526000611cd16020830184611f33565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156120ce576120ce6121b3565b500190565b6000826120e2576120e26121c9565b500490565b6000816000190483118215151615612101576121016121b3565b500290565b600082821015612118576121186121b3565b500390565b60005b83811015612138578181015183820152602001612120565b838111156110b65750506000910152565b600181811c9082168061215d57607f821691505b6020821081141561217e57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612198576121986121b3565b5060010190565b6000826121ae576121ae6121c9565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461097f57600080fdfea2646970667358221220c52b6274e0236825e3535fd59f32956ea2dc0ad29e355ba4b8fc56b2bb90906464736f6c63430008070033

Deployed Bytecode Sourcemap

51441:3504:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53118:204;;;;;;;;;;-1:-1:-1;53118:204:0;;;;;:::i;:::-;;:::i;:::-;;;8155:14:1;;8148:22;8130:41;;8118:2;8103:18;53118:204:0;;;;;;;;52940:170;;;;;;;;;;-1:-1:-1;52940:170:0;;;;;:::i;:::-;;:::i;:::-;;28118:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29621:204::-;;;;;;;;;;-1:-1:-1;29621:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7174:32:1;;;7156:51;;7144:2;7129:18;29621:204:0;7010:203:1;29184:371:0;;;;;;;;;;-1:-1:-1;29184:371:0;;;;;:::i;:::-;;:::i;51892:53::-;;;;;;;;;;-1:-1:-1;51892:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;12606:25:1;;;12594:2;12579:18;51892:53:0;12460:177:1;24254:303:0;;;;;;;;;;-1:-1:-1;52699:1:0;24508:12;24298:7;24492:13;:28;-1:-1:-1;;24492:46:0;24254:303;;30486:170;;;;;;;;;;-1:-1:-1;30486:170:0;;;;;:::i;:::-;;:::i;48942:442::-;;;;;;;;;;-1:-1:-1;48942:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;7903:32:1;;;7885:51;;7967:2;7952:18;;7945:34;;;;7858:18;48942:442:0;7711:274:1;51585:41:0;;;;;;;;;;;;51622:4;51585:41;;54654:100;;;;;;;;;;-1:-1:-1;54654:100:0;;;;;:::i;:::-;;:::i;30727:185::-;;;;;;;;;;-1:-1:-1;30727:185:0;;;;;:::i;:::-;;:::i;51718:36::-;;;;;;;;;;;;;;;;52382:100;;;;;;;;;;-1:-1:-1;52382:100:0;;;;;:::i;:::-;;:::i;51761:26::-;;;;;;;;;;-1:-1:-1;51761:26:0;;;;-1:-1:-1;;;;;51761:26:0;;;;;;-1:-1:-1;;;;;12804:39:1;;;12786:58;;12774:2;12759:18;51761:26:0;12642:208:1;27926:125:0;;;;;;;;;;-1:-1:-1;27926:125:0;;;;;:::i;:::-;;:::i;51498:80::-;;;;;;;;;;;;;:::i;25374:206::-;;;;;;;;;;-1:-1:-1;25374:206:0;;;;;:::i;:::-;;:::i;45530:103::-;;;;;;;;;;;;;:::i;52819:112::-;;;;;;;;;;-1:-1:-1;52819:112:0;;;;;:::i;:::-;;:::i;44879:87::-;;;;;;;;;;-1:-1:-1;44952:6:0;;-1:-1:-1;;;;;44952:6:0;44879:87;;28287:104;;;;;;;;;;;;;:::i;53330:1316::-;;;;;;:::i;:::-;;:::i;29897:287::-;;;;;;;;;;-1:-1:-1;29897:287:0;;;;;:::i;:::-;;:::i;51794:32::-;;;;;;;;;;-1:-1:-1;51794:32:0;;;;-1:-1:-1;;;51794:32:0;;;;;;54762:180;;;;;;;;;;;;;:::i;30983:369::-;;;;;;;;;;-1:-1:-1;30983:369:0;;;;;:::i;:::-;;:::i;51633:40::-;;;;;;;;;;;;;;;;52135:239;;;;;;;;;;-1:-1:-1;52135:239:0;;;;;:::i;:::-;;:::i;51952:33::-;;;;;;;;;;;;;;;;30255:164;;;;;;;;;;-1:-1:-1;30255:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;30376:25:0;;;30352:4;30376:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30255:164;45788:201;;;;;;;;;;-1:-1:-1;45788:201:0;;;;;:::i;:::-;;:::i;51680:31::-;;;;;;;;;;;;;;;;52716:95;;;;;;;;;;-1:-1:-1;52716:95:0;;;;;:::i;:::-;;:::i;51833:52::-;;;;;;;;;;-1:-1:-1;51833:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;52490:109;;;;;;;;;;-1:-1:-1;52490:109:0;;;;;:::i;:::-;;:::i;53118:204::-;53249:4;53278:36;53302:11;53278:23;:36::i;:::-;53271:43;53118:204;-1:-1:-1;;53118:204:0:o;52940:170::-;44952:6;;-1:-1:-1;;;;;44952:6:0;20633:10;45099:23;45091:68;;;;-1:-1:-1;;;45091:68:0;;;;;;;:::i;:::-;;;;;;;;;53058:44:::1;53077:8;53087:14;53058:18;:44::i;:::-;52940:170:::0;;:::o;28118:100::-;28172:13;28205:5;28198:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28118:100;:::o;29621:204::-;29689:7;29714:16;29722:7;29714;:16::i;:::-;29709:64;;29739:34;;-1:-1:-1;;;29739:34:0;;;;;;;;;;;29709:64;-1:-1:-1;29793:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;29793:24:0;;29621:204::o;29184:371::-;29257:13;29273:24;29289:7;29273:15;:24::i;:::-;29257:40;;29318:5;-1:-1:-1;;;;;29312:11:0;:2;-1:-1:-1;;;;;29312:11:0;;29308:48;;;29332:24;;-1:-1:-1;;;29332:24:0;;;;;;;;;;;29308:48;20633:10;-1:-1:-1;;;;;29373:21:0;;;;;;:63;;-1:-1:-1;29399:37:0;29416:5;20633:10;30255:164;:::i;29399:37::-;29398:38;29373:63;29369:138;;;29460:35;;-1:-1:-1;;;29460:35:0;;;;;;;;;;;29369:138;29519:28;29528:2;29532:7;29541:5;29519:8;:28::i;:::-;29246:309;29184:371;;:::o;30486:170::-;30620:28;30630:4;30636:2;30640:7;30620:9;:28::i;48942:442::-;49039:7;49097:27;;;:17;:27;;;;;;;;49068:56;;;;;;;;;-1:-1:-1;;;;;49068:56:0;;;;;-1:-1:-1;;;49068:56:0;;;-1:-1:-1;;;;;49068:56:0;;;;;;;;49039:7;;49137:92;;-1:-1:-1;49188:29:0;;;;;;;;;49198:19;49188:29;-1:-1:-1;;;;;49188:29:0;;;;-1:-1:-1;;;49188:29:0;;-1:-1:-1;;;;;49188:29:0;;;;;49137:92;49279:23;;;;49241:21;;49750:5;;49266:36;;-1:-1:-1;;;;;49266:36:0;:10;:36;:::i;:::-;49265:58;;;;:::i;:::-;49344:16;;;;;-1:-1:-1;48942:442:0;;-1:-1:-1;;;;48942:442:0:o;54654:100::-;44952:6;;-1:-1:-1;;;;;44952:6:0;20633:10;45099:23;45091:68;;;;-1:-1:-1;;;45091:68:0;;;;;;;:::i;:::-;54716:30:::1;20633:10:::0;54740:5:::1;54716:9;:30::i;:::-;54654:100:::0;:::o;30727:185::-;30865:39;30882:4;30888:2;30892:7;30865:39;;;;;;;;;;;;:16;:39::i;52382:100::-;44952:6;;-1:-1:-1;;;;;44952:6:0;20633:10;45099:23;45091:68;;;;-1:-1:-1;;;45091:68:0;;;;;;;:::i;:::-;52456:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;27926:125::-:0;27990:7;28017:21;28030:7;28017:12;:21::i;:::-;:26;;27926:125;-1:-1:-1;;27926:125:0:o;51498:80::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25374:206::-;25438:7;-1:-1:-1;;;;;25462:19:0;;25458:60;;25490:28;;-1:-1:-1;;;25490:28:0;;;;;;;;;;;25458:60;-1:-1:-1;;;;;;25544:19:0;;;;;:12;:19;;;;;:27;;;;25374:206::o;45530:103::-;44952:6;;-1:-1:-1;;;;;44952:6:0;20633:10;45099:23;45091:68;;;;-1:-1:-1;;;45091:68:0;;;;;;;:::i;:::-;45595:30:::1;45622:1;45595:18;:30::i;:::-;45530:103::o:0;52819:112::-;44952:6;;-1:-1:-1;;;;;44952:6:0;20633:10;45099:23;45091:68;;;;-1:-1:-1;;;45091:68:0;;;;;;;:::i;:::-;52895:12:::1;:28:::0;;;::::1;;-1:-1:-1::0;;;52895:28:0::1;-1:-1:-1::0;;;;52895:28:0;;::::1;::::0;;;::::1;::::0;;52819:112::o;28287:104::-;28343:13;28376:7;28369:14;;;;;:::i;53330:1316::-;53395:12;;-1:-1:-1;;;53395:12:0;;;;53387:45;;;;-1:-1:-1;;;53387:45:0;;8957:2:1;53387:45:0;;;8939:21:1;8996:2;8976:18;;;8969:30;-1:-1:-1;;;9015:18:1;;;9008:50;9075:18;;53387:45:0;8755:344:1;53387:45:0;52699:1;24508:12;24298:7;24492:13;51622:4;;53467:5;;24492:28;-1:-1:-1;;24492:46:0;53451:21;;;;:::i;:::-;:35;;53443:55;;;;-1:-1:-1;;;53443:55:0;;9306:2:1;53443:55:0;;;9288:21:1;9345:1;9325:18;;;9318:29;-1:-1:-1;;;9363:18:1;;;9356:37;9410:18;;53443:55:0;9104:330:1;53443:55:0;53526:10;;53517:5;:19;;53509:52;;;;-1:-1:-1;;;53509:52:0;;8608:2:1;53509:52:0;;;8590:21:1;8647:2;8627:18;;;8620:30;-1:-1:-1;;;8666:18:1;;;8659:50;8726:18;;53509:52:0;8406:344:1;53509:52:0;53625:10;53607:29;;;;:17;:29;;;;;;53589:15;;:47;;53607:29;53589:47;:::i;:::-;53579:5;:58;53576:974;;53765:10;;53750;53732:29;;;;:17;:29;;;;;;53714:15;;:47;;53732:29;53714:47;:::i;:::-;53713:62;;;;:::i;:::-;53698:10;;53690:18;;:5;:18;:::i;:::-;53689:87;;;;:::i;:::-;53676:9;:100;;53668:176;;;;-1:-1:-1;;;53668:176:0;;10048:2:1;53668:176:0;;;10030:21:1;10087:2;10067:18;;;10060:30;10126:34;10106:18;;;10099:62;10197:33;10177:18;;;10170:61;10248:19;;53668:176:0;9846:427:1;53668:176:0;53892:15;;53878:10;53860:29;;;;:17;:29;;;;;:47;;;53923:15;:34;;:15;;53860:29;53923:34;;53892:15;;53923:34;:::i;:::-;;;;-1:-1:-1;53576:974:0;;-1:-1:-1;53576:974:0;;54040:10;54022:29;;;;:17;:29;;;;;;54004:15;;:47;;54022:29;54004:47;:::i;:::-;53995:5;:57;53992:558;;;54176:10;54158:29;;;;:17;:29;;;;;:38;;54191:5;;54158:29;:38;;54191:5;;54158:38;:::i;:::-;;;;;;;;54231:5;54212:15;;:24;;;;;;;:::i;53992:558::-;54285:12;;-1:-1:-1;;;54285:12:0;;;;54277:45;;;;-1:-1:-1;;;54277:45:0;;8957:2:1;54277:45:0;;;8939:21:1;8996:2;8976:18;;;8969:30;-1:-1:-1;;;9015:18:1;;;9008:50;9075:18;;54277:45:0;8755:344:1;54277:45:0;54362:10;;54354:18;;:5;:18;:::i;:::-;54341:9;:31;;54333:76;;;;-1:-1:-1;;;54333:76:0;;10830:2:1;54333:76:0;;;10812:21:1;;;10849:18;;;10842:30;10908:34;10888:18;;;10881:62;10960:18;;54333:76:0;10628:356:1;54333:76:0;52699:1;24508:12;24298:7;24492:13;51622:4;;54444:5;;24492:28;-1:-1:-1;;24492:46:0;54428:21;;;;:::i;:::-;:35;;54420:55;;;;-1:-1:-1;;;54420:55:0;;9306:2:1;54420:55:0;;;9288:21:1;9345:1;9325:18;;;9318:29;-1:-1:-1;;;9363:18:1;;;9356:37;9410:18;;54420:55:0;9104:330:1;54420:55:0;54503:10;;54494:5;:19;;54486:52;;;;-1:-1:-1;;;54486:52:0;;8608:2:1;54486:52:0;;;8590:21:1;8647:2;8627:18;;;8620:30;-1:-1:-1;;;8666:18:1;;;8659:50;8726:18;;54486:52:0;8406:344:1;54486:52:0;54579:10;54560:30;;;;:18;:30;;;;;:39;;54594:5;;54560:30;:39;;54594:5;;54560:39;:::i;:::-;;;;-1:-1:-1;54610:28:0;;-1:-1:-1;54620:10:0;54632:5;54610:9;:28::i;29897:287::-;-1:-1:-1;;;;;29996:24:0;;20633:10;29996:24;29992:54;;;30029:17;;-1:-1:-1;;;30029:17:0;;;;;;;;;;;29992:54;20633:10;30059:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;30059:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;30059:53:0;;;;;;;;;;30128:48;;8130:41:1;;;30059:42:0;;20633:10;30128:48;;8103:18:1;30128:48:0;;;;;;;29897:287;;:::o;54762:180::-;44952:6;;-1:-1:-1;;;;;44952:6:0;20633:10;45099:23;45091:68;;;;-1:-1:-1;;;45091:68:0;;;;;;;:::i;:::-;54836:51:::1;::::0;54818:12:::1;::::0;20633:10;;54861:21:::1;::::0;54818:12;54836:51;54818:12;54836:51;54861:21;20633:10;54836:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54817:70;;;54906:7;54898:36;;;::::0;-1:-1:-1;;;54898:36:0;;11552:2:1;54898:36:0::1;::::0;::::1;11534:21:1::0;11591:2;11571:18;;;11564:30;-1:-1:-1;;;11610:18:1;;;11603:46;11666:18;;54898:36:0::1;11350:340:1::0;30983:369:0;31150:28;31160:4;31166:2;31170:7;31150:9;:28::i;:::-;-1:-1:-1;;;;;31193:13:0;;4209:19;:23;;31193:76;;;;;31213:56;31244:4;31250:2;31254:7;31263:5;31213:30;:56::i;:::-;31212:57;31193:76;31189:156;;;31293:40;;-1:-1:-1;;;31293:40:0;;;;;;;;;;;31189:156;30983:369;;;;:::o;52135:239::-;52201:13;52235:17;52243:8;52235:7;:17::i;:::-;52227:51;;;;-1:-1:-1;;;52227:51:0;;10480:2:1;52227:51:0;;;10462:21:1;10519:2;10499:18;;;10492:30;-1:-1:-1;;;10538:18:1;;;10531:51;10599:18;;52227:51:0;10278:345:1;52227:51:0;52320:7;52329:26;52346:8;52329:16;:26::i;:::-;52303:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52289:77;;52135:239;;;:::o;45788:201::-;44952:6;;-1:-1:-1;;;;;44952:6:0;20633:10;45099:23;45091:68;;;;-1:-1:-1;;;45091:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45877:22:0;::::1;45869:73;;;::::0;-1:-1:-1;;;45869:73:0;;9641:2:1;45869:73:0::1;::::0;::::1;9623:21:1::0;9680:2;9660:18;;;9653:30;9719:34;9699:18;;;9692:62;-1:-1:-1;;;9770:18:1;;;9763:36;9816:19;;45869:73:0::1;9439:402:1::0;45869:73:0::1;45953:28;45972:8;45953:18;:28::i;52716:95::-:0;44952:6;;-1:-1:-1;;;;;44952:6:0;20633:10;45099:23;45091:68;;;;-1:-1:-1;;;45091:68:0;;;;;;;:::i;:::-;52784:10:::1;:19:::0;52716:95::o;52490:109::-;44952:6;;-1:-1:-1;;;;;44952:6:0;20633:10;45099:23;45091:68;;;;-1:-1:-1;;;45091:68:0;;;;;;;:::i;:::-;52562:15:::1;:29:::0;52490:109::o;48672:215::-;48774:4;-1:-1:-1;;;;;;48798:41:0;;-1:-1:-1;;;48798:41:0;;:81;;;48843:36;48867:11;48843:23;:36::i;50034:332::-;49750:5;-1:-1:-1;;;;;50137:33:0;;;;50129:88;;;;-1:-1:-1;;;50129:88:0;;11897:2:1;50129:88:0;;;11879:21:1;11936:2;11916:18;;;11909:30;11975:34;11955:18;;;11948:62;-1:-1:-1;;;12026:18:1;;;12019:40;12076:19;;50129:88:0;11695:406:1;50129:88:0;-1:-1:-1;;;;;50236:22:0;;50228:60;;;;-1:-1:-1;;;50228:60:0;;12308:2:1;50228:60:0;;;12290:21:1;12347:2;12327:18;;;12320:30;12386:27;12366:18;;;12359:55;12431:18;;50228:60:0;12106:349:1;50228:60:0;50323:35;;;;;;;;;-1:-1:-1;;;;;50323:35:0;;;;;;-1:-1:-1;;;;;50323:35:0;;;;;;;;;;-1:-1:-1;;;50301:57:0;;;;:19;:57;50034:332::o;31607:174::-;31664:4;31707:7;52699:1;31688:26;;:53;;;;;31728:13;;31718:7;:23;31688:53;:85;;;;-1:-1:-1;;31746:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;31746:27:0;;;;31745:28;;31607:174::o;40833:196::-;40948:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;40948:29:0;-1:-1:-1;;;;;40948:29:0;;;;;;;;;40993:28;;40948:24;;40993:28;;;;;;;40833:196;;;:::o;35781:2130::-;35896:35;35934:21;35947:7;35934:12;:21::i;:::-;35896:59;;35994:4;-1:-1:-1;;;;;35972:26:0;:13;:18;;;-1:-1:-1;;;;;35972:26:0;;35968:67;;36007:28;;-1:-1:-1;;;36007:28:0;;;;;;;;;;;35968:67;36048:22;20633:10;-1:-1:-1;;;;;36074:20:0;;;;:73;;-1:-1:-1;36111:36:0;36128:4;20633:10;30255:164;:::i;36111:36::-;36074:126;;;-1:-1:-1;20633:10:0;36164:20;36176:7;36164:11;:20::i;:::-;-1:-1:-1;;;;;36164:36:0;;36074:126;36048:153;;36219:17;36214:66;;36245:35;;-1:-1:-1;;;36245:35:0;;;;;;;;;;;36214:66;-1:-1:-1;;;;;36295:16:0;;36291:52;;36320:23;;-1:-1:-1;;;36320:23:0;;;;;;;;;;;36291:52;36464:35;36481:1;36485:7;36494:4;36464:8;:35::i;:::-;-1:-1:-1;;;;;36795:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;36795:31:0;;;;;;;-1:-1:-1;;36795:31:0;;;;;;;36841:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;36841:29:0;;;;;;;;;;;36921:20;;;:11;:20;;;;;;36956:18;;-1:-1:-1;;;;;;36989:49:0;;;;-1:-1:-1;;;37022:15:0;36989:49;;;;;;;;;;37312:11;;37372:24;;;;;37415:13;;36921:20;;37372:24;;37415:13;37411:384;;37625:13;;37610:11;:28;37606:174;;37663:20;;37732:28;;;;37706:54;;-1:-1:-1;;;37706:54:0;-1:-1:-1;;;;;;37706:54:0;;;-1:-1:-1;;;;;37663:20:0;;37706:54;;;;37606:174;36770:1036;;;37842:7;37838:2;-1:-1:-1;;;;;37823:27:0;37832:4;-1:-1:-1;;;;;37823:27:0;;;;;;;;;;;35885:2026;;35781:2130;;;:::o;31865:104::-;31934:27;31944:2;31948:8;31934:27;;;;;;;;;;;;:9;:27::i;26755:1109::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;26866:7:0;;52699:1;26915:23;;:47;;;;;26949:13;;26942:4;:20;26915:47;26911:886;;;26983:31;27017:17;;;:11;:17;;;;;;;;;26983:51;;;;;;;;;-1:-1:-1;;;;;26983:51:0;;;;-1:-1:-1;;;26983:51:0;;;;;;;;;;;-1:-1:-1;;;26983:51:0;;;;;;;;;;;;;;27053:729;;27103:14;;-1:-1:-1;;;;;27103:28:0;;27099:101;;27167:9;26755:1109;-1:-1:-1;;;26755:1109:0:o;27099:101::-;-1:-1:-1;;;27542:6:0;27587:17;;;;:11;:17;;;;;;;;;27575:29;;;;;;;;;-1:-1:-1;;;;;27575:29:0;;;;;-1:-1:-1;;;27575:29:0;;;;;;;;;;;-1:-1:-1;;;27575:29:0;;;;;;;;;;;;;27635:28;27631:109;;27703:9;26755:1109;-1:-1:-1;;;26755:1109:0:o;27631:109::-;27502:261;;;26964:833;26911:886;27825:31;;-1:-1:-1;;;27825:31:0;;;;;;;;;;;46149:191;46242:6;;;-1:-1:-1;;;;;46259:17:0;;;-1:-1:-1;;;;;;46259:17:0;;;;;;;46292:40;;46242:6;;;46259:17;46242:6;;46292:40;;46223:16;;46292:40;46212:128;46149:191;:::o;41521:667::-;41705:72;;-1:-1:-1;;;41705:72:0;;41684:4;;-1:-1:-1;;;;;41705:36:0;;;;;:72;;20633:10;;41756:4;;41762:7;;41771:5;;41705:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41705:72:0;;;;;;;;-1:-1:-1;;41705:72:0;;;;;;;;;;;;:::i;:::-;;;41701:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41939:13:0;;41935:235;;41985:40;;-1:-1:-1;;;41985:40:0;;;;;;;;;;;41935:235;42128:6;42122:13;42113:6;42109:2;42105:15;42098:38;41701:480;-1:-1:-1;;;;;;41824:55:0;-1:-1:-1;;;41824:55:0;;-1:-1:-1;41701:480:0;41521:667;;;;;;:::o;922:723::-;978:13;1199:10;1195:53;;-1:-1:-1;;1226:10:0;;;;;;;;;;;;-1:-1:-1;;;1226:10:0;;;;;922:723::o;1195:53::-;1273:5;1258:12;1314:78;1321:9;;1314:78;;1347:8;;;;:::i;:::-;;-1:-1:-1;1370:10:0;;-1:-1:-1;1378:2:0;1370:10;;:::i;:::-;;;1314:78;;;1402:19;1434:6;1424:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1424:17:0;;1402:39;;1452:154;1459:10;;1452:154;;1486:11;1496:1;1486:11;;:::i;:::-;;-1:-1:-1;1555:10:0;1563:2;1555:5;:10;:::i;:::-;1542:24;;:2;:24;:::i;:::-;1529:39;;1512:6;1519;1512:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;1512:56:0;;;;;;;;-1:-1:-1;1583:11:0;1592:2;1583:11;;:::i;:::-;;;1452:154;;25005:305;25107:4;-1:-1:-1;;;;;;25144:40:0;;-1:-1:-1;;;25144:40:0;;:105;;-1:-1:-1;;;;;;;25201:48:0;;-1:-1:-1;;;25201:48:0;25144:105;:158;;;-1:-1:-1;;;;;;;;;;14129:40:0;;;25266:36;14020:157;32343:1751;32466:20;32489:13;-1:-1:-1;;;;;32517:16:0;;32513:48;;32542:19;;-1:-1:-1;;;32542:19:0;;;;;;;;;;;32513:48;32576:13;32572:44;;32598:18;;-1:-1:-1;;;32598:18:0;;;;;;;;;;;32572:44;-1:-1:-1;;;;;32967:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;33026:49:0;;32967:44;;;;;;;;33026:49;;;;-1:-1:-1;;32967:44:0;;;;;;33026:49;;;;;;;;;;;;;;;;33092:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;33142:66:0;;;-1:-1:-1;;;33192:15:0;33142:66;;;;;;;;;;;;;33092:25;;33289:23;;;;4209:19;:23;33329:633;;33369:314;33400:38;;33425:12;;-1:-1:-1;;;;;33400:38:0;;;33417:1;;33400:38;;33417:1;;33400:38;33466:69;33505:1;33509:2;33513:14;;;;;;33529:5;33466:30;:69::i;:::-;33461:174;;33571:40;;-1:-1:-1;;;33571:40:0;;;;;;;;;;;33461:174;33678:3;33662:12;:19;;33369:314;;33764:12;33747:13;;:29;33743:43;;33778:8;;;33743:43;33329:633;;;33827:120;33858:40;;33883:14;;;;;-1:-1:-1;;;;;33858:40:0;;;33875:1;;33858:40;;33875:1;;33858:40;33942:3;33926:12;:19;;33827:120;;33329:633;-1:-1:-1;33976:13:0;:28;;;34026:60;;34059:2;34063:12;34077:8;34026:60;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:160::-;893:20;;949:13;;942:21;932:32;;922:60;;978:1;975;968:12;993:186;1052:6;1105:2;1093:9;1084:7;1080:23;1076:32;1073:52;;;1121:1;1118;1111:12;1073:52;1144:29;1163:9;1144:29;:::i;:::-;1134:39;993:186;-1:-1:-1;;;993:186:1:o;1184:260::-;1252:6;1260;1313:2;1301:9;1292:7;1288:23;1284:32;1281:52;;;1329:1;1326;1319:12;1281:52;1352:29;1371:9;1352:29;:::i;:::-;1342:39;;1400:38;1434:2;1423:9;1419:18;1400:38;:::i;:::-;1390:48;;1184:260;;;;;:::o;1449:328::-;1526:6;1534;1542;1595:2;1583:9;1574:7;1570:23;1566:32;1563:52;;;1611:1;1608;1601:12;1563:52;1634:29;1653:9;1634:29;:::i;:::-;1624:39;;1682:38;1716:2;1705:9;1701:18;1682:38;:::i;:::-;1672:48;;1767:2;1756:9;1752:18;1739:32;1729:42;;1449:328;;;;;:::o;1782:666::-;1877:6;1885;1893;1901;1954:3;1942:9;1933:7;1929:23;1925:33;1922:53;;;1971:1;1968;1961:12;1922:53;1994:29;2013:9;1994:29;:::i;:::-;1984:39;;2042:38;2076:2;2065:9;2061:18;2042:38;:::i;:::-;2032:48;;2127:2;2116:9;2112:18;2099:32;2089:42;;2182:2;2171:9;2167:18;2154:32;2209:18;2201:6;2198:30;2195:50;;;2241:1;2238;2231:12;2195:50;2264:22;;2317:4;2309:13;;2305:27;-1:-1:-1;2295:55:1;;2346:1;2343;2336:12;2295:55;2369:73;2434:7;2429:2;2416:16;2411:2;2407;2403:11;2369:73;:::i;:::-;2359:83;;;1782:666;;;;;;;:::o;2453:254::-;2518:6;2526;2579:2;2567:9;2558:7;2554:23;2550:32;2547:52;;;2595:1;2592;2585:12;2547:52;2618:29;2637:9;2618:29;:::i;:::-;2608:39;;2666:35;2697:2;2686:9;2682:18;2666:35;:::i;2712:254::-;2780:6;2788;2841:2;2829:9;2820:7;2816:23;2812:32;2809:52;;;2857:1;2854;2847:12;2809:52;2880:29;2899:9;2880:29;:::i;:::-;2870:39;2956:2;2941:18;;;;2928:32;;-1:-1:-1;;;2712:254:1:o;2971:366::-;3038:6;3046;3099:2;3087:9;3078:7;3074:23;3070:32;3067:52;;;3115:1;3112;3105:12;3067:52;3138:29;3157:9;3138:29;:::i;:::-;3128:39;;3217:2;3206:9;3202:18;3189:32;-1:-1:-1;;;;;3254:5:1;3250:38;3243:5;3240:49;3230:77;;3303:1;3300;3293:12;3230:77;3326:5;3316:15;;;2971:366;;;;;:::o;3342:180::-;3398:6;3451:2;3439:9;3430:7;3426:23;3422:32;3419:52;;;3467:1;3464;3457:12;3419:52;3490:26;3506:9;3490:26;:::i;3527:245::-;3585:6;3638:2;3626:9;3617:7;3613:23;3609:32;3606:52;;;3654:1;3651;3644:12;3606:52;3693:9;3680:23;3712:30;3736:5;3712:30;:::i;3777:249::-;3846:6;3899:2;3887:9;3878:7;3874:23;3870:32;3867:52;;;3915:1;3912;3905:12;3867:52;3947:9;3941:16;3966:30;3990:5;3966:30;:::i;4031:450::-;4100:6;4153:2;4141:9;4132:7;4128:23;4124:32;4121:52;;;4169:1;4166;4159:12;4121:52;4209:9;4196:23;4242:18;4234:6;4231:30;4228:50;;;4274:1;4271;4264:12;4228:50;4297:22;;4350:4;4342:13;;4338:27;-1:-1:-1;4328:55:1;;4379:1;4376;4369:12;4328:55;4402:73;4467:7;4462:2;4449:16;4444:2;4440;4436:11;4402:73;:::i;4486:180::-;4545:6;4598:2;4586:9;4577:7;4573:23;4569:32;4566:52;;;4614:1;4611;4604:12;4566:52;-1:-1:-1;4637:23:1;;4486:180;-1:-1:-1;4486:180:1:o;4671:248::-;4739:6;4747;4800:2;4788:9;4779:7;4775:23;4771:32;4768:52;;;4816:1;4813;4806:12;4768:52;-1:-1:-1;;4839:23:1;;;4909:2;4894:18;;;4881:32;;-1:-1:-1;4671:248:1:o;4924:257::-;4965:3;5003:5;4997:12;5030:6;5025:3;5018:19;5046:63;5102:6;5095:4;5090:3;5086:14;5079:4;5072:5;5068:16;5046:63;:::i;:::-;5163:2;5142:15;-1:-1:-1;;5138:29:1;5129:39;;;;5170:4;5125:50;;4924:257;-1:-1:-1;;4924:257:1:o;5186:185::-;5228:3;5266:5;5260:12;5281:52;5326:6;5321:3;5314:4;5307:5;5303:16;5281:52;:::i;:::-;5349:16;;;;;5186:185;-1:-1:-1;;5186:185:1:o;5494:1301::-;5771:3;5800:1;5833:6;5827:13;5863:3;5885:1;5913:9;5909:2;5905:18;5895:28;;5973:2;5962:9;5958:18;5995;5985:61;;6039:4;6031:6;6027:17;6017:27;;5985:61;6065:2;6113;6105:6;6102:14;6082:18;6079:38;6076:165;;;-1:-1:-1;;;6140:33:1;;6196:4;6193:1;6186:15;6226:4;6147:3;6214:17;6076:165;6257:18;6284:104;;;;6402:1;6397:320;;;;6250:467;;6284:104;-1:-1:-1;;6317:24:1;;6305:37;;6362:16;;;;-1:-1:-1;6284:104:1;;6397:320;12928:1;12921:14;;;12965:4;12952:18;;6492:1;6506:165;6520:6;6517:1;6514:13;6506:165;;;6598:14;;6585:11;;;6578:35;6641:16;;;;6535:10;;6506:165;;;6510:3;;6700:6;6695:3;6691:16;6684:23;;6250:467;;;;;;;6733:56;6758:30;6784:3;6776:6;6758:30;:::i;:::-;-1:-1:-1;;;5436:20:1;;5481:1;5472:11;;5376:113;6733:56;6726:63;5494:1301;-1:-1:-1;;;;;5494:1301:1:o;7218:488::-;-1:-1:-1;;;;;7487:15:1;;;7469:34;;7539:15;;7534:2;7519:18;;7512:43;7586:2;7571:18;;7564:34;;;7634:3;7629:2;7614:18;;7607:31;;;7412:4;;7655:45;;7680:19;;7672:6;7655:45;:::i;:::-;7647:53;7218:488;-1:-1:-1;;;;;;7218:488:1:o;8182:219::-;8331:2;8320:9;8313:21;8294:4;8351:44;8391:2;8380:9;8376:18;8368:6;8351:44;:::i;10989:356::-;11191:2;11173:21;;;11210:18;;;11203:30;11269:34;11264:2;11249:18;;11242:62;11336:2;11321:18;;10989:356::o;12981:128::-;13021:3;13052:1;13048:6;13045:1;13042:13;13039:39;;;13058:18;;:::i;:::-;-1:-1:-1;13094:9:1;;12981:128::o;13114:120::-;13154:1;13180;13170:35;;13185:18;;:::i;:::-;-1:-1:-1;13219:9:1;;13114:120::o;13239:168::-;13279:7;13345:1;13341;13337:6;13333:14;13330:1;13327:21;13322:1;13315:9;13308:17;13304:45;13301:71;;;13352:18;;:::i;:::-;-1:-1:-1;13392:9:1;;13239:168::o;13412:125::-;13452:4;13480:1;13477;13474:8;13471:34;;;13485:18;;:::i;:::-;-1:-1:-1;13522:9:1;;13412:125::o;13542:258::-;13614:1;13624:113;13638:6;13635:1;13632:13;13624:113;;;13714:11;;;13708:18;13695:11;;;13688:39;13660:2;13653:10;13624:113;;;13755:6;13752:1;13749:13;13746:48;;;-1:-1:-1;;13790:1:1;13772:16;;13765:27;13542:258::o;13805:380::-;13884:1;13880:12;;;;13927;;;13948:61;;14002:4;13994:6;13990:17;13980:27;;13948:61;14055:2;14047:6;14044:14;14024:18;14021:38;14018:161;;;14101:10;14096:3;14092:20;14089:1;14082:31;14136:4;14133:1;14126:15;14164:4;14161:1;14154:15;14018:161;;13805:380;;;:::o;14190:135::-;14229:3;-1:-1:-1;;14250:17:1;;14247:43;;;14270:18;;:::i;:::-;-1:-1:-1;14317:1:1;14306:13;;14190:135::o;14330:112::-;14362:1;14388;14378:35;;14393:18;;:::i;:::-;-1:-1:-1;14427:9:1;;14330:112::o;14447:127::-;14508:10;14503:3;14499:20;14496:1;14489:31;14539:4;14536:1;14529:15;14563:4;14560:1;14553:15;14579:127;14640:10;14635:3;14631:20;14628:1;14621:31;14671:4;14668:1;14661:15;14695:4;14692:1;14685:15;14711:127;14772:10;14767:3;14763:20;14760:1;14753:31;14803:4;14800:1;14793:15;14827:4;14824:1;14817:15;14843:127;14904:10;14899:3;14895:20;14892:1;14885:31;14935:4;14932:1;14925:15;14959:4;14956:1;14949:15;14975:131;-1:-1:-1;;;;;;15049:32:1;;15039:43;;15029:71;;15096:1;15093;15086:12

Swarm Source

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