ETH Price: $2,505.82 (-0.08%)

Token

Rekted Diamond Hands Academy (RDHA)
 

Overview

Max Total Supply

1,111 RDHA

Holders

672

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 RDHA
0xb46eae7dee1a7ea1569594b37f522e03c38f1149
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:
RDHA

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

// SPDX-License-Identifier: MIT

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: 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: 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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File: Address.sol



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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


// File: IERC721Receiver.sol



pragma solidity ^0.8.0;

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


// File: IERC165.sol



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: 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: IERC721.sol



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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



// File: 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);
}


// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @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 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**128 - 1 (max value of uint128) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToNonERC721ReceiverImplementerFunction();
error MintToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, ReentrancyGuard {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

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

    uint256 internal _currentIndex = 1;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

    /**
     * @dev Returns _currentIndex.
     */
    function totalSupply() public view returns (uint256) {
        return (_currentIndex-1);
    }

    /**
     * @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) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * 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 ( (1 <= curr && curr < _currentIndex) ) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }
                // think about it... won't underflow ;)
                while (true) {
                    curr--;
                    ownership = _ownerships[curr];
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                }
            }
        } // unchecked
        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(), ".json")) : "";
    }

    /**
     * @dev Base URI for {tokenURI}. 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) if(!isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

    /**
     * @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
    ) internal {
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

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

            uint256 updatedIndex = _currentIndex;

            for (uint256 i = 0; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (!_checkOnERC721Received(address(0), to, updatedIndex, '')) {
                    revert MintToNonERC721ReceiverImplementer();
                }
                updatedIndex++;

            }

            _currentIndex = updatedIndex;
        } // unchecked
    }

    /**
     * @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 nonReentrant {
        if (to == address(0)) revert TransferToZeroAddress();

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

        // 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.
        //      Me: meh, I'm not convinced the underflow is safe from re-entrancy attacks 
        // (comes down to a race condition); to still save gas I modified this 
        // to be nonReentrant to be safe
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                if (_exists(nextTokenId)) {
                    _ownerships[nextTokenId] = TokenOwnership(
                        prevOwnership.addr,
                        prevOwnership.startTimestamp
                    );
                }
            }
        } // unchecked

        emit Transfer(from, to, tokenId);
    }

    /**
     * @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 _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert TransferToNonERC721ReceiverImplementerFunction();
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }
}

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

pragma solidity ^0.8.0;

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

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

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

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

pragma solidity >=0.8.4 <0.9.0;

error MintFromContract();
error MerkleProofInvalid();
error PreSaleInactive();
error PublicSaleInactive();
error WithdrawFailed();
error ExceedsMaxSupply();
error ExceedsTeamMintLimit();
error ExceedsOGMintLimit();
error ExceedsRektMintLimit();
error ExceedsPublicMintLimit();

contract RDHA is ERC721A, Ownable {  
    using Strings for uint256;

    uint256 public max_supply = 2222;

    bool public pre_sale    = false;
    bool public public_sale = false;
    bool public revealed    = false;

    uint256 public mint_limit_team   = 10; // per wallet
    uint256 public mint_limit_og     = 2;  // per wallet
    uint256 public mint_limit_rekt   = 1;  // per wallet
    uint256 public mint_limit_public = 1;  // per wallet

    bytes32 public merkle_root_team;
    bytes32 public merkle_root_og;
    bytes32 public merkle_root_rekt;

    string private _myBaseURI;
    string private _myHiddenURI;

	constructor() ERC721A("Rekted Diamond Hands Academy", "RDHA") {}

    function setMaxSupply(uint256 _maxSupply) external onlyOwner {
         max_supply = _maxSupply;
    }

    function setPreSale(bool _preSale) external onlyOwner {
        pre_sale = _preSale;
    }
    function setPublicSale(bool _publicSale) external onlyOwner {
        public_sale = _publicSale;
    }

    function setRevealed(bool _revealed) external onlyOwner {
        revealed = _revealed;
    }

    function setMintLimitTeam(uint256 _mintLimit) external onlyOwner {
        mint_limit_team = _mintLimit;
    }
    function setMintLimitOG(uint256 _mintLimit) external onlyOwner {
        mint_limit_og = _mintLimit;
    }
    function setMintLimitRekt(uint256 _mintLimit) external onlyOwner {
        mint_limit_rekt = _mintLimit;
    }
    function setMintLimitPublic(uint256 _mintLimit) external onlyOwner {
        mint_limit_public = _mintLimit;
    }

    function setMerkleRootTeam(bytes32 _merkleRoot) external onlyOwner {
        merkle_root_team = _merkleRoot;
    }
    function setMerkleRootOG(bytes32 _merkleRoot) external onlyOwner {
        merkle_root_og = _merkleRoot;
    }
    function setMerkleRootRekt(bytes32 _merkleRoot) external onlyOwner {
        merkle_root_rekt = _merkleRoot;
    }

    function setMyBaseURI(string memory _myNewBaseURI) external onlyOwner {
        _myBaseURI = _myNewBaseURI;
    }
    function setMyHiddenURI(string memory _myNewHiddenURI) external onlyOwner {
        _myHiddenURI = _myNewHiddenURI;
    }

    function tokenURI(uint256 _tokenId) public view virtual override(ERC721A) returns (string memory) {
        if (!_exists(_tokenId)) revert URIQueryForNonexistentToken();
       
        if (revealed) {
            return bytes(_myBaseURI).length != 0 ? string(abi.encodePacked(_myBaseURI, _tokenId.toString(), ".json")) : "";
        } else {
            return bytes(_myHiddenURI).length != 0 ? _myHiddenURI : "";
        }
    }

    // note v0.8.0 checks safe math by default :)
    function mint(uint256 _mintAmount, bytes32[] calldata _merkleProof) external nonReentrant {
        if (!pre_sale) revert PreSaleInactive();
        if (tx.origin != _msgSender()) revert MintFromContract();
        if (totalSupply() + _mintAmount > max_supply) revert ExceedsMaxSupply();

        if (MerkleProof.verify(_merkleProof, merkle_root_team, keccak256(abi.encodePacked(_msgSender())))) {
            if (_numberMinted(_msgSender()) + _mintAmount > mint_limit_team) revert ExceedsTeamMintLimit();
        } 
        else if (MerkleProof.verify(_merkleProof, merkle_root_og, keccak256(abi.encodePacked(_msgSender())))) {
            if (_numberMinted(_msgSender()) + _mintAmount > mint_limit_og) revert ExceedsOGMintLimit();
        } 
        else if (MerkleProof.verify(_merkleProof, merkle_root_rekt, keccak256(abi.encodePacked(_msgSender())))) {
            if (_numberMinted(_msgSender()) + _mintAmount > mint_limit_rekt) revert ExceedsRektMintLimit();
        } 
        else {
            revert MerkleProofInvalid();
        }
        _safeMint(_msgSender(), _mintAmount);
    }

    function publicMint(uint256 _mintAmount) external nonReentrant {
        if (!public_sale) revert PublicSaleInactive();
        if (tx.origin != _msgSender()) revert MintFromContract();
        if (totalSupply() + _mintAmount > max_supply) revert ExceedsMaxSupply();
        if (_numberMinted(_msgSender()) + _mintAmount > mint_limit_public) revert ExceedsPublicMintLimit();

        _safeMint(_msgSender(), _mintAmount);
    }

    function ownerMint(uint256 _mintAmount) external onlyOwner {
        if (totalSupply() + _mintAmount > max_supply) revert ExceedsMaxSupply();
        _safeMint(_msgSender(), _mintAmount);
    }

    event DonationReceived(address sender, uint256 amount);
    receive() external payable {
        emit DonationReceived(msg.sender, msg.value);
    }

    function withdraw() external payable nonReentrant {

        (bool success, ) = payable(owner()).call{value: address(this).balance}("");
        if (!success) revert WithdrawFailed();
    }
}

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":"ExceedsMaxSupply","type":"error"},{"inputs":[],"name":"ExceedsOGMintLimit","type":"error"},{"inputs":[],"name":"ExceedsPublicMintLimit","type":"error"},{"inputs":[],"name":"ExceedsRektMintLimit","type":"error"},{"inputs":[],"name":"ExceedsTeamMintLimit","type":"error"},{"inputs":[],"name":"MerkleProofInvalid","type":"error"},{"inputs":[],"name":"MintFromContract","type":"error"},{"inputs":[],"name":"MintToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"MintedQueryForZeroAddress","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"PreSaleInactive","type":"error"},{"inputs":[],"name":"PublicSaleInactive","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementerFunction","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"WithdrawFailed","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":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DonationReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"max_supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkle_root_og","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkle_root_rekt","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkle_root_team","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mint_limit_og","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint_limit_public","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint_limit_rekt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint_limit_team","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pre_sale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"public_sale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRootOG","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRootRekt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRootTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintLimit","type":"uint256"}],"name":"setMintLimitOG","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintLimit","type":"uint256"}],"name":"setMintLimitPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintLimit","type":"uint256"}],"name":"setMintLimitRekt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintLimit","type":"uint256"}],"name":"setMintLimitTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_myNewBaseURI","type":"string"}],"name":"setMyBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_myNewHiddenURI","type":"string"}],"name":"setMyHiddenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_preSale","type":"bool"}],"name":"setPreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_publicSale","type":"bool"}],"name":"setPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_revealed","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260018080556108ae600955600a805462ffffff19168155600b556002600c55600d819055600e553480156200003857600080fd5b50604080518082018252601c81527f52656b746564204469616d6f6e642048616e64732041636164656d7900000000602080830191909152825180840190935260048352635244484160e01b9083015260016000559060026200009c8382620001c9565b506003620000ab8282620001c9565b505050620000c8620000c2620000ce60201b60201c565b620000d2565b62000295565b3390565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200014f57607f821691505b6020821081036200017057634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001c457600081815260208120601f850160051c810160208610156200019f5750805b601f850160051c820191505b81811015620001c057828155600101620001ab565b5050505b505050565b81516001600160401b03811115620001e557620001e562000124565b620001fd81620001f684546200013a565b8462000176565b602080601f8311600181146200023557600084156200021c5750858301515b600019600386901b1c1916600185901b178555620001c0565b600085815260208120601f198616915b82811015620002665788860151825594840194600190910190840162000245565b5085821015620002855787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61244080620002a56000396000f3fe6080604052600436106102765760003560e01c806370a082311161014f578063a8027a5d116100c1578063e0a808531161007a578063e0a8085314610757578063e6fe6ed714610777578063e985e9c51461078d578063f12e4100146107ad578063f19e75d4146107c7578063f2fde38b146107e757600080fd5b8063a8027a5d14610697578063a8297ffd146106b7578063b88d4fde146106d7578063ba41b0c6146106f7578063c87b56dd14610717578063e010b1831461073757600080fd5b806394e86b201161011357806394e86b20146105f657806395d89b411461060c5780639a78851314610621578063a22cb46514610641578063a58fdc1114610661578063a5ed2d3c1461068157600080fd5b806370a082311461056e578063715018a61461058e5780638a333b50146105a35780638da5cb5b146105b957806391ed094d146105d757600080fd5b80632db11544116101e857806351830227116101ac57806351830227146104b85780635aca1bb6146104d85780635dcce234146104f85780636352211e14610518578063641ce904146105385780636f8b44b01461054e57600080fd5b80632db115441461043a5780633ba0ea2f1461045a5780633ccfd60b146104705780633d490eca1461047857806342842e0e1461049857600080fd5b80630d95ccc91161023a5780630d95ccc91461038f57806310f61905146103af57806318160ddd146103c557806323b872dd146103da5780632920bbb2146103fa5780632b18f2ea1461041a57600080fd5b8063016005da146102ba57806301ffc9a7146102e357806306fdde0314610313578063081812fc14610335578063095ea7b31461036d57600080fd5b366102b557604080513381523460208201527f264f630d9efa0d07053a31163641d9fcc0adafc9d9e76f1c37c2ce3a558d2c52910160405180910390a1005b600080fd5b3480156102c657600080fd5b506102d0600f5481565b6040519081526020015b60405180910390f35b3480156102ef57600080fd5b506103036102fe366004611d33565b610807565b60405190151581526020016102da565b34801561031f57600080fd5b50610328610859565b6040516102da9190611da0565b34801561034157600080fd5b50610355610350366004611db3565b6108eb565b6040516001600160a01b0390911681526020016102da565b34801561037957600080fd5b5061038d610388366004611de3565b610931565b005b34801561039b57600080fd5b5061038d6103aa366004611e1d565b6109b7565b3480156103bb57600080fd5b506102d0600c5481565b3480156103d157600080fd5b506102d06109fd565b3480156103e657600080fd5b5061038d6103f5366004611e38565b610a12565b34801561040657600080fd5b5061038d610415366004611db3565b610a1d565b34801561042657600080fd5b5061038d610435366004611f00565b610a4c565b34801561044657600080fd5b5061038d610455366004611db3565b610a86565b34801561046657600080fd5b506102d060105481565b61038d610b73565b34801561048457600080fd5b5061038d610493366004611db3565b610c0f565b3480156104a457600080fd5b5061038d6104b3366004611e38565b610c3e565b3480156104c457600080fd5b50600a546103039062010000900460ff1681565b3480156104e457600080fd5b5061038d6104f3366004611e1d565b610c59565b34801561050457600080fd5b5061038d610513366004611f00565b610c9d565b34801561052457600080fd5b50610355610533366004611db3565b610cd3565b34801561054457600080fd5b506102d0600d5481565b34801561055a57600080fd5b5061038d610569366004611db3565b610ce5565b34801561057a57600080fd5b506102d0610589366004611f49565b610d14565b34801561059a57600080fd5b5061038d610d62565b3480156105af57600080fd5b506102d060095481565b3480156105c557600080fd5b506008546001600160a01b0316610355565b3480156105e357600080fd5b50600a5461030390610100900460ff1681565b34801561060257600080fd5b506102d0600e5481565b34801561061857600080fd5b50610328610d98565b34801561062d57600080fd5b5061038d61063c366004611db3565b610da7565b34801561064d57600080fd5b5061038d61065c366004611f64565b610dd6565b34801561066d57600080fd5b5061038d61067c366004611db3565b610e6b565b34801561068d57600080fd5b506102d0600b5481565b3480156106a357600080fd5b5061038d6106b2366004611db3565b610e9a565b3480156106c357600080fd5b5061038d6106d2366004611db3565b610ec9565b3480156106e357600080fd5b5061038d6106f2366004611f97565b610ef8565b34801561070357600080fd5b5061038d610712366004612013565b610f32565b34801561072357600080fd5b50610328610732366004611db3565b6111b6565b34801561074357600080fd5b5061038d610752366004611db3565b61130e565b34801561076357600080fd5b5061038d610772366004611e1d565b61133d565b34801561078357600080fd5b506102d060115481565b34801561079957600080fd5b506103036107a8366004612092565b611383565b3480156107b957600080fd5b50600a546103039060ff1681565b3480156107d357600080fd5b5061038d6107e2366004611db3565b6113b1565b3480156107f357600080fd5b5061038d610802366004611f49565b61141c565b60006001600160e01b031982166380ac58cd60e01b148061083857506001600160e01b03198216635b5e139f60e01b145b8061085357506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060028054610868906120bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610894906120bc565b80156108e15780601f106108b6576101008083540402835291602001916108e1565b820191906000526020600020905b8154815290600101906020018083116108c457829003601f168201915b5050505050905090565b60006108f8826001541190565b610915576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061093c82610cd3565b9050806001600160a01b0316836001600160a01b0316036109705760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216146109a75761098a8133611383565b6109a7576040516367d9dca160e11b815260040160405180910390fd5b6109b28383836114b4565b505050565b6008546001600160a01b031633146109ea5760405162461bcd60e51b81526004016109e1906120f6565b60405180910390fd5b600a805460ff1916911515919091179055565b600060018054610a0d9190612141565b905090565b6109b2838383611510565b6008546001600160a01b03163314610a475760405162461bcd60e51b81526004016109e1906120f6565b600f55565b6008546001600160a01b03163314610a765760405162461bcd60e51b81526004016109e1906120f6565b6013610a8282826121a2565b5050565b600260005403610aa85760405162461bcd60e51b81526004016109e190612262565b6002600055600a54610100900460ff16610ad557604051633167946760e21b815260040160405180910390fd5b323314610af5576040516358e7052560e11b815260040160405180910390fd5b60095481610b016109fd565b610b0b9190612299565b1115610b2a5760405163c30436e960e01b815260040160405180910390fd5b600e5481610b3733611784565b610b419190612299565b1115610b60576040516303962a7b60e01b815260040160405180910390fd5b610b6b335b826117d9565b506001600055565b600260005403610b955760405162461bcd60e51b81526004016109e190612262565b600260009081556008546040516001600160a01b039091169047908381818185875af1925050503d8060008114610be8576040519150601f19603f3d011682016040523d82523d6000602084013e610bed565b606091505b5050905080610b6b57604051631d42c86760e21b815260040160405180910390fd5b6008546001600160a01b03163314610c395760405162461bcd60e51b81526004016109e1906120f6565b601155565b6109b283838360405180602001604052806000815250610ef8565b6008546001600160a01b03163314610c835760405162461bcd60e51b81526004016109e1906120f6565b600a80549115156101000261ff0019909216919091179055565b6008546001600160a01b03163314610cc75760405162461bcd60e51b81526004016109e1906120f6565b6012610a8282826121a2565b6000610cde82611949565b5192915050565b6008546001600160a01b03163314610d0f5760405162461bcd60e51b81526004016109e1906120f6565b600955565b60006001600160a01b038216610d3d576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160801b031690565b6008546001600160a01b03163314610d8c5760405162461bcd60e51b81526004016109e1906120f6565b610d966000611a32565b565b606060038054610868906120bc565b6008546001600160a01b03163314610dd15760405162461bcd60e51b81526004016109e1906120f6565b600b55565b336001600160a01b03831603610dff5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b03163314610e955760405162461bcd60e51b81526004016109e1906120f6565b601055565b6008546001600160a01b03163314610ec45760405162461bcd60e51b81526004016109e1906120f6565b600e55565b6008546001600160a01b03163314610ef35760405162461bcd60e51b81526004016109e1906120f6565b600c55565b610f03848484611510565b610f0f84848484611a84565b610f2c576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b600260005403610f545760405162461bcd60e51b81526004016109e190612262565b6002600055600a5460ff16610f7c5760405163fc7d083760e01b815260040160405180910390fd5b323314610f9c576040516358e7052560e11b815260040160405180910390fd5b60095483610fa86109fd565b610fb29190612299565b1115610fd15760405163c30436e960e01b815260040160405180910390fd5b61105182828080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600f5491503390505b604051602001611036919060609190911b6bffffffffffffffffffffffff1916815260140190565b60405160208183030381529060405280519060200120611b87565b1561109157600b548361106333611784565b61106d9190612299565b111561108c5760405163a148acd560e01b815260040160405180910390fd5b6111a2565b6110d282828080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601054915033905061100e565b1561110d57600c54836110e433611784565b6110ee9190612299565b111561108c57604051631ba9131f60e31b815260040160405180910390fd5b61114e82828080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601154915033905061100e565b1561118957600d548361116033611784565b61116a9190612299565b111561108c57604051636ca4cee760e11b815260040160405180910390fd5b60405163c8ac23c360e01b815260040160405180910390fd5b6111ac33846117d9565b5050600160005550565b60606111c3826001541190565b6111e057604051630a14c4b560e41b815260040160405180910390fd5b600a5462010000900460ff161561124d57601280546111fe906120bc565b905060000361121c5760405180602001604052806000815250610853565b601261122783611b9d565b6040516020016112389291906122ac565b60405160208183030381529060405292915050565b6013805461125a906120bc565b90506000036112785760405180602001604052806000815250610853565b60138054611285906120bc565b80601f01602080910402602001604051908101604052809291908181526020018280546112b1906120bc565b80156112fe5780601f106112d3576101008083540402835291602001916112fe565b820191906000526020600020905b8154815290600101906020018083116112e157829003601f168201915b505050505092915050565b919050565b6008546001600160a01b031633146113385760405162461bcd60e51b81526004016109e1906120f6565b600d55565b6008546001600160a01b031633146113675760405162461bcd60e51b81526004016109e1906120f6565b600a8054911515620100000262ff000019909216919091179055565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6008546001600160a01b031633146113db5760405162461bcd60e51b81526004016109e1906120f6565b600954816113e76109fd565b6113f19190612299565b11156114105760405163c30436e960e01b815260040160405180910390fd5b61141933610b65565b50565b6008546001600160a01b031633146114465760405162461bcd60e51b81526004016109e1906120f6565b6001600160a01b0381166114ab5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109e1565b61141981611a32565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6002600054036115325760405162461bcd60e51b81526004016109e190612262565b60026000556001600160a01b03821661155e57604051633a954ecd60e21b815260040160405180910390fd5b600061156982611949565b9050836001600160a01b031681600001516001600160a01b0316146115a05760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b03861614806115be57506115be8533611383565b806115d95750336115ce846108eb565b6001600160a01b0316145b9050806115f957604051632ce44b5f60e11b815260040160405180910390fd5b611605600084876114b4565b6001600160a01b03808616600090815260056020908152604080832080546000196001600160801b038083169190910181166001600160801b031992831617909255898616808652838620805480851660019081019095169316929092179091558251808401845290815267ffffffffffffffff4281168286019081528a87526004909552838620915182549551909116600160a01b026001600160e01b03199095169087161793909317909255908601808352912054909116611736576116ce816001541190565b156117365760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600490935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450506001600055505050565b60006001600160a01b0382166117ad576040516335ebb31960e01b815260040160405180910390fd5b506001600160a01b0316600090815260056020526040902054600160801b90046001600160801b031690565b6001600160a01b0382166117ff57604051622e076360e81b815260040160405180910390fd5b806000036118205760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03821660008181526005602090815260408083208054600160801b6001600160801b03808316890181166001600160801b03199093168317829004811689011602179055600180548452600490925280832080546001600160a01b03191690941790935580548252918120805467ffffffffffffffff4216600160a01b0267ffffffffffffffff60a01b199091161790559054905b828110156119415760405182906001600160a01b038616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46119186000858460405180602001604052806000815250611a84565b6119355760405163d099061d60e01b815260040160405180910390fd5b600191820191016118bc565b506001555050565b60408051808201909152600080825260208201528160018110801590611970575060015481105b15611a19576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff1691830191909152156119c2579392505050565b50600019016000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611a14579392505050565b6119c2565b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b15611b7b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ac8903390899088908890600401612343565b6020604051808303816000875af1925050508015611b03575060408051601f3d908101601f19168201909252611b0091810190612380565b60015b611b61573d808015611b31576040519150601f19603f3d011682016040523d82523d6000602084013e611b36565b606091505b508051600003611b5957604051638f11c40160e01b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b7f565b5060015b949350505050565b600082611b948584611c9e565b14949350505050565b606081600003611bc45750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611bee5780611bd88161239d565b9150611be79050600a836123cc565b9150611bc8565b60008167ffffffffffffffff811115611c0957611c09611e74565b6040519080825280601f01601f191660200182016040528015611c33576020820181803683370190505b5090505b8415611b7f57611c48600183612141565b9150611c55600a866123e0565b611c60906030612299565b60f81b818381518110611c7557611c756123f4565b60200101906001600160f81b031916908160001a905350611c97600a866123cc565b9450611c37565b600081815b8451811015611ce357611ccf82868381518110611cc257611cc26123f4565b6020026020010151611ceb565b915080611cdb8161239d565b915050611ca3565b509392505050565b6000818310611d07576000828152602084905260409020611d16565b60008381526020839052604090205b9392505050565b6001600160e01b03198116811461141957600080fd5b600060208284031215611d4557600080fd5b8135611d1681611d1d565b60005b83811015611d6b578181015183820152602001611d53565b50506000910152565b60008151808452611d8c816020860160208601611d50565b601f01601f19169290920160200192915050565b602081526000611d166020830184611d74565b600060208284031215611dc557600080fd5b5035919050565b80356001600160a01b038116811461130957600080fd5b60008060408385031215611df657600080fd5b611dff83611dcc565b946020939093013593505050565b8035801515811461130957600080fd5b600060208284031215611e2f57600080fd5b611d1682611e0d565b600080600060608486031215611e4d57600080fd5b611e5684611dcc565b9250611e6460208501611dcc565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611ea557611ea5611e74565b604051601f8501601f19908116603f01168101908282118183101715611ecd57611ecd611e74565b81604052809350858152868686011115611ee657600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611f1257600080fd5b813567ffffffffffffffff811115611f2957600080fd5b8201601f81018413611f3a57600080fd5b611b7f84823560208401611e8a565b600060208284031215611f5b57600080fd5b611d1682611dcc565b60008060408385031215611f7757600080fd5b611f8083611dcc565b9150611f8e60208401611e0d565b90509250929050565b60008060008060808587031215611fad57600080fd5b611fb685611dcc565b9350611fc460208601611dcc565b925060408501359150606085013567ffffffffffffffff811115611fe757600080fd5b8501601f81018713611ff857600080fd5b61200787823560208401611e8a565b91505092959194509250565b60008060006040848603121561202857600080fd5b83359250602084013567ffffffffffffffff8082111561204757600080fd5b818601915086601f83011261205b57600080fd5b81358181111561206a57600080fd5b8760208260051b850101111561207f57600080fd5b6020830194508093505050509250925092565b600080604083850312156120a557600080fd5b6120ae83611dcc565b9150611f8e60208401611dcc565b600181811c908216806120d057607f821691505b6020821081036120f057634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b818103818111156108535761085361212b565b601f8211156109b257600081815260208120601f850160051c8101602086101561217b5750805b601f850160051c820191505b8181101561219a57828155600101612187565b505050505050565b815167ffffffffffffffff8111156121bc576121bc611e74565b6121d0816121ca84546120bc565b84612154565b602080601f83116001811461220557600084156121ed5750858301515b600019600386901b1c1916600185901b17855561219a565b600085815260208120601f198616915b8281101561223457888601518255948401946001909101908401612215565b50858210156122525787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b808201808211156108535761085361212b565b60008084546122ba816120bc565b600182811680156122d257600181146122e757612316565b60ff1984168752821515830287019450612316565b8860005260208060002060005b8581101561230d5781548a8201529084019082016122f4565b50505082870194505b50505050835161232a818360208801611d50565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061237690830184611d74565b9695505050505050565b60006020828403121561239257600080fd5b8151611d1681611d1d565b6000600182016123af576123af61212b565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826123db576123db6123b6565b500490565b6000826123ef576123ef6123b6565b500690565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220bf807ed974c2744ff32d490e9a19ca47bce1ce04b61d0416cc08752f413314d464736f6c63430008110033

Deployed Bytecode

0x6080604052600436106102765760003560e01c806370a082311161014f578063a8027a5d116100c1578063e0a808531161007a578063e0a8085314610757578063e6fe6ed714610777578063e985e9c51461078d578063f12e4100146107ad578063f19e75d4146107c7578063f2fde38b146107e757600080fd5b8063a8027a5d14610697578063a8297ffd146106b7578063b88d4fde146106d7578063ba41b0c6146106f7578063c87b56dd14610717578063e010b1831461073757600080fd5b806394e86b201161011357806394e86b20146105f657806395d89b411461060c5780639a78851314610621578063a22cb46514610641578063a58fdc1114610661578063a5ed2d3c1461068157600080fd5b806370a082311461056e578063715018a61461058e5780638a333b50146105a35780638da5cb5b146105b957806391ed094d146105d757600080fd5b80632db11544116101e857806351830227116101ac57806351830227146104b85780635aca1bb6146104d85780635dcce234146104f85780636352211e14610518578063641ce904146105385780636f8b44b01461054e57600080fd5b80632db115441461043a5780633ba0ea2f1461045a5780633ccfd60b146104705780633d490eca1461047857806342842e0e1461049857600080fd5b80630d95ccc91161023a5780630d95ccc91461038f57806310f61905146103af57806318160ddd146103c557806323b872dd146103da5780632920bbb2146103fa5780632b18f2ea1461041a57600080fd5b8063016005da146102ba57806301ffc9a7146102e357806306fdde0314610313578063081812fc14610335578063095ea7b31461036d57600080fd5b366102b557604080513381523460208201527f264f630d9efa0d07053a31163641d9fcc0adafc9d9e76f1c37c2ce3a558d2c52910160405180910390a1005b600080fd5b3480156102c657600080fd5b506102d0600f5481565b6040519081526020015b60405180910390f35b3480156102ef57600080fd5b506103036102fe366004611d33565b610807565b60405190151581526020016102da565b34801561031f57600080fd5b50610328610859565b6040516102da9190611da0565b34801561034157600080fd5b50610355610350366004611db3565b6108eb565b6040516001600160a01b0390911681526020016102da565b34801561037957600080fd5b5061038d610388366004611de3565b610931565b005b34801561039b57600080fd5b5061038d6103aa366004611e1d565b6109b7565b3480156103bb57600080fd5b506102d0600c5481565b3480156103d157600080fd5b506102d06109fd565b3480156103e657600080fd5b5061038d6103f5366004611e38565b610a12565b34801561040657600080fd5b5061038d610415366004611db3565b610a1d565b34801561042657600080fd5b5061038d610435366004611f00565b610a4c565b34801561044657600080fd5b5061038d610455366004611db3565b610a86565b34801561046657600080fd5b506102d060105481565b61038d610b73565b34801561048457600080fd5b5061038d610493366004611db3565b610c0f565b3480156104a457600080fd5b5061038d6104b3366004611e38565b610c3e565b3480156104c457600080fd5b50600a546103039062010000900460ff1681565b3480156104e457600080fd5b5061038d6104f3366004611e1d565b610c59565b34801561050457600080fd5b5061038d610513366004611f00565b610c9d565b34801561052457600080fd5b50610355610533366004611db3565b610cd3565b34801561054457600080fd5b506102d0600d5481565b34801561055a57600080fd5b5061038d610569366004611db3565b610ce5565b34801561057a57600080fd5b506102d0610589366004611f49565b610d14565b34801561059a57600080fd5b5061038d610d62565b3480156105af57600080fd5b506102d060095481565b3480156105c557600080fd5b506008546001600160a01b0316610355565b3480156105e357600080fd5b50600a5461030390610100900460ff1681565b34801561060257600080fd5b506102d0600e5481565b34801561061857600080fd5b50610328610d98565b34801561062d57600080fd5b5061038d61063c366004611db3565b610da7565b34801561064d57600080fd5b5061038d61065c366004611f64565b610dd6565b34801561066d57600080fd5b5061038d61067c366004611db3565b610e6b565b34801561068d57600080fd5b506102d0600b5481565b3480156106a357600080fd5b5061038d6106b2366004611db3565b610e9a565b3480156106c357600080fd5b5061038d6106d2366004611db3565b610ec9565b3480156106e357600080fd5b5061038d6106f2366004611f97565b610ef8565b34801561070357600080fd5b5061038d610712366004612013565b610f32565b34801561072357600080fd5b50610328610732366004611db3565b6111b6565b34801561074357600080fd5b5061038d610752366004611db3565b61130e565b34801561076357600080fd5b5061038d610772366004611e1d565b61133d565b34801561078357600080fd5b506102d060115481565b34801561079957600080fd5b506103036107a8366004612092565b611383565b3480156107b957600080fd5b50600a546103039060ff1681565b3480156107d357600080fd5b5061038d6107e2366004611db3565b6113b1565b3480156107f357600080fd5b5061038d610802366004611f49565b61141c565b60006001600160e01b031982166380ac58cd60e01b148061083857506001600160e01b03198216635b5e139f60e01b145b8061085357506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060028054610868906120bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610894906120bc565b80156108e15780601f106108b6576101008083540402835291602001916108e1565b820191906000526020600020905b8154815290600101906020018083116108c457829003601f168201915b5050505050905090565b60006108f8826001541190565b610915576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061093c82610cd3565b9050806001600160a01b0316836001600160a01b0316036109705760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216146109a75761098a8133611383565b6109a7576040516367d9dca160e11b815260040160405180910390fd5b6109b28383836114b4565b505050565b6008546001600160a01b031633146109ea5760405162461bcd60e51b81526004016109e1906120f6565b60405180910390fd5b600a805460ff1916911515919091179055565b600060018054610a0d9190612141565b905090565b6109b2838383611510565b6008546001600160a01b03163314610a475760405162461bcd60e51b81526004016109e1906120f6565b600f55565b6008546001600160a01b03163314610a765760405162461bcd60e51b81526004016109e1906120f6565b6013610a8282826121a2565b5050565b600260005403610aa85760405162461bcd60e51b81526004016109e190612262565b6002600055600a54610100900460ff16610ad557604051633167946760e21b815260040160405180910390fd5b323314610af5576040516358e7052560e11b815260040160405180910390fd5b60095481610b016109fd565b610b0b9190612299565b1115610b2a5760405163c30436e960e01b815260040160405180910390fd5b600e5481610b3733611784565b610b419190612299565b1115610b60576040516303962a7b60e01b815260040160405180910390fd5b610b6b335b826117d9565b506001600055565b600260005403610b955760405162461bcd60e51b81526004016109e190612262565b600260009081556008546040516001600160a01b039091169047908381818185875af1925050503d8060008114610be8576040519150601f19603f3d011682016040523d82523d6000602084013e610bed565b606091505b5050905080610b6b57604051631d42c86760e21b815260040160405180910390fd5b6008546001600160a01b03163314610c395760405162461bcd60e51b81526004016109e1906120f6565b601155565b6109b283838360405180602001604052806000815250610ef8565b6008546001600160a01b03163314610c835760405162461bcd60e51b81526004016109e1906120f6565b600a80549115156101000261ff0019909216919091179055565b6008546001600160a01b03163314610cc75760405162461bcd60e51b81526004016109e1906120f6565b6012610a8282826121a2565b6000610cde82611949565b5192915050565b6008546001600160a01b03163314610d0f5760405162461bcd60e51b81526004016109e1906120f6565b600955565b60006001600160a01b038216610d3d576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160801b031690565b6008546001600160a01b03163314610d8c5760405162461bcd60e51b81526004016109e1906120f6565b610d966000611a32565b565b606060038054610868906120bc565b6008546001600160a01b03163314610dd15760405162461bcd60e51b81526004016109e1906120f6565b600b55565b336001600160a01b03831603610dff5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b03163314610e955760405162461bcd60e51b81526004016109e1906120f6565b601055565b6008546001600160a01b03163314610ec45760405162461bcd60e51b81526004016109e1906120f6565b600e55565b6008546001600160a01b03163314610ef35760405162461bcd60e51b81526004016109e1906120f6565b600c55565b610f03848484611510565b610f0f84848484611a84565b610f2c576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b600260005403610f545760405162461bcd60e51b81526004016109e190612262565b6002600055600a5460ff16610f7c5760405163fc7d083760e01b815260040160405180910390fd5b323314610f9c576040516358e7052560e11b815260040160405180910390fd5b60095483610fa86109fd565b610fb29190612299565b1115610fd15760405163c30436e960e01b815260040160405180910390fd5b61105182828080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600f5491503390505b604051602001611036919060609190911b6bffffffffffffffffffffffff1916815260140190565b60405160208183030381529060405280519060200120611b87565b1561109157600b548361106333611784565b61106d9190612299565b111561108c5760405163a148acd560e01b815260040160405180910390fd5b6111a2565b6110d282828080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601054915033905061100e565b1561110d57600c54836110e433611784565b6110ee9190612299565b111561108c57604051631ba9131f60e31b815260040160405180910390fd5b61114e82828080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601154915033905061100e565b1561118957600d548361116033611784565b61116a9190612299565b111561108c57604051636ca4cee760e11b815260040160405180910390fd5b60405163c8ac23c360e01b815260040160405180910390fd5b6111ac33846117d9565b5050600160005550565b60606111c3826001541190565b6111e057604051630a14c4b560e41b815260040160405180910390fd5b600a5462010000900460ff161561124d57601280546111fe906120bc565b905060000361121c5760405180602001604052806000815250610853565b601261122783611b9d565b6040516020016112389291906122ac565b60405160208183030381529060405292915050565b6013805461125a906120bc565b90506000036112785760405180602001604052806000815250610853565b60138054611285906120bc565b80601f01602080910402602001604051908101604052809291908181526020018280546112b1906120bc565b80156112fe5780601f106112d3576101008083540402835291602001916112fe565b820191906000526020600020905b8154815290600101906020018083116112e157829003601f168201915b505050505092915050565b919050565b6008546001600160a01b031633146113385760405162461bcd60e51b81526004016109e1906120f6565b600d55565b6008546001600160a01b031633146113675760405162461bcd60e51b81526004016109e1906120f6565b600a8054911515620100000262ff000019909216919091179055565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6008546001600160a01b031633146113db5760405162461bcd60e51b81526004016109e1906120f6565b600954816113e76109fd565b6113f19190612299565b11156114105760405163c30436e960e01b815260040160405180910390fd5b61141933610b65565b50565b6008546001600160a01b031633146114465760405162461bcd60e51b81526004016109e1906120f6565b6001600160a01b0381166114ab5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109e1565b61141981611a32565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6002600054036115325760405162461bcd60e51b81526004016109e190612262565b60026000556001600160a01b03821661155e57604051633a954ecd60e21b815260040160405180910390fd5b600061156982611949565b9050836001600160a01b031681600001516001600160a01b0316146115a05760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b03861614806115be57506115be8533611383565b806115d95750336115ce846108eb565b6001600160a01b0316145b9050806115f957604051632ce44b5f60e11b815260040160405180910390fd5b611605600084876114b4565b6001600160a01b03808616600090815260056020908152604080832080546000196001600160801b038083169190910181166001600160801b031992831617909255898616808652838620805480851660019081019095169316929092179091558251808401845290815267ffffffffffffffff4281168286019081528a87526004909552838620915182549551909116600160a01b026001600160e01b03199095169087161793909317909255908601808352912054909116611736576116ce816001541190565b156117365760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600490935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450506001600055505050565b60006001600160a01b0382166117ad576040516335ebb31960e01b815260040160405180910390fd5b506001600160a01b0316600090815260056020526040902054600160801b90046001600160801b031690565b6001600160a01b0382166117ff57604051622e076360e81b815260040160405180910390fd5b806000036118205760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03821660008181526005602090815260408083208054600160801b6001600160801b03808316890181166001600160801b03199093168317829004811689011602179055600180548452600490925280832080546001600160a01b03191690941790935580548252918120805467ffffffffffffffff4216600160a01b0267ffffffffffffffff60a01b199091161790559054905b828110156119415760405182906001600160a01b038616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46119186000858460405180602001604052806000815250611a84565b6119355760405163d099061d60e01b815260040160405180910390fd5b600191820191016118bc565b506001555050565b60408051808201909152600080825260208201528160018110801590611970575060015481105b15611a19576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff1691830191909152156119c2579392505050565b50600019016000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611a14579392505050565b6119c2565b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b15611b7b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ac8903390899088908890600401612343565b6020604051808303816000875af1925050508015611b03575060408051601f3d908101601f19168201909252611b0091810190612380565b60015b611b61573d808015611b31576040519150601f19603f3d011682016040523d82523d6000602084013e611b36565b606091505b508051600003611b5957604051638f11c40160e01b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b7f565b5060015b949350505050565b600082611b948584611c9e565b14949350505050565b606081600003611bc45750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611bee5780611bd88161239d565b9150611be79050600a836123cc565b9150611bc8565b60008167ffffffffffffffff811115611c0957611c09611e74565b6040519080825280601f01601f191660200182016040528015611c33576020820181803683370190505b5090505b8415611b7f57611c48600183612141565b9150611c55600a866123e0565b611c60906030612299565b60f81b818381518110611c7557611c756123f4565b60200101906001600160f81b031916908160001a905350611c97600a866123cc565b9450611c37565b600081815b8451811015611ce357611ccf82868381518110611cc257611cc26123f4565b6020026020010151611ceb565b915080611cdb8161239d565b915050611ca3565b509392505050565b6000818310611d07576000828152602084905260409020611d16565b60008381526020839052604090205b9392505050565b6001600160e01b03198116811461141957600080fd5b600060208284031215611d4557600080fd5b8135611d1681611d1d565b60005b83811015611d6b578181015183820152602001611d53565b50506000910152565b60008151808452611d8c816020860160208601611d50565b601f01601f19169290920160200192915050565b602081526000611d166020830184611d74565b600060208284031215611dc557600080fd5b5035919050565b80356001600160a01b038116811461130957600080fd5b60008060408385031215611df657600080fd5b611dff83611dcc565b946020939093013593505050565b8035801515811461130957600080fd5b600060208284031215611e2f57600080fd5b611d1682611e0d565b600080600060608486031215611e4d57600080fd5b611e5684611dcc565b9250611e6460208501611dcc565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611ea557611ea5611e74565b604051601f8501601f19908116603f01168101908282118183101715611ecd57611ecd611e74565b81604052809350858152868686011115611ee657600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611f1257600080fd5b813567ffffffffffffffff811115611f2957600080fd5b8201601f81018413611f3a57600080fd5b611b7f84823560208401611e8a565b600060208284031215611f5b57600080fd5b611d1682611dcc565b60008060408385031215611f7757600080fd5b611f8083611dcc565b9150611f8e60208401611e0d565b90509250929050565b60008060008060808587031215611fad57600080fd5b611fb685611dcc565b9350611fc460208601611dcc565b925060408501359150606085013567ffffffffffffffff811115611fe757600080fd5b8501601f81018713611ff857600080fd5b61200787823560208401611e8a565b91505092959194509250565b60008060006040848603121561202857600080fd5b83359250602084013567ffffffffffffffff8082111561204757600080fd5b818601915086601f83011261205b57600080fd5b81358181111561206a57600080fd5b8760208260051b850101111561207f57600080fd5b6020830194508093505050509250925092565b600080604083850312156120a557600080fd5b6120ae83611dcc565b9150611f8e60208401611dcc565b600181811c908216806120d057607f821691505b6020821081036120f057634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b818103818111156108535761085361212b565b601f8211156109b257600081815260208120601f850160051c8101602086101561217b5750805b601f850160051c820191505b8181101561219a57828155600101612187565b505050505050565b815167ffffffffffffffff8111156121bc576121bc611e74565b6121d0816121ca84546120bc565b84612154565b602080601f83116001811461220557600084156121ed5750858301515b600019600386901b1c1916600185901b17855561219a565b600085815260208120601f198616915b8281101561223457888601518255948401946001909101908401612215565b50858210156122525787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b808201808211156108535761085361212b565b60008084546122ba816120bc565b600182811680156122d257600181146122e757612316565b60ff1984168752821515830287019450612316565b8860005260208060002060005b8581101561230d5781548a8201529084019082016122f4565b50505082870194505b50505050835161232a818360208801611d50565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061237690830184611d74565b9695505050505050565b60006020828403121561239257600080fd5b8151611d1681611d1d565b6000600182016123af576123af61212b565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826123db576123db6123b6565b500490565b6000826123ef576123ef6123b6565b500690565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220bf807ed974c2744ff32d490e9a19ca47bce1ce04b61d0416cc08752f413314d464736f6c63430008110033

Deployed Bytecode Sourcemap

46578:4852:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51179:39;;;51196:10;188:51:1;;51208:9:0;270:2:1;255:18;;248:34;51179:39:0;;161:18:1;51179:39:0;;;;;;;46578:4852;;;;;47046:31;;;;;;;;;;;;;;;;;;;439:25:1;;;427:2;412:18;47046:31:0;;;;;;;;26612:305;;;;;;;;;;-1:-1:-1;26612:305:0;;;;;:::i;:::-;;:::i;:::-;;;1026:14:1;;1019:22;1001:41;;989:2;974:18;26612:305:0;861:187:1;28720:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30112:204::-;;;;;;;;;;-1:-1:-1;30112:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2158:32:1;;;2140:51;;2128:2;2113:18;30112:204:0;1994:203:1;29674:372:0;;;;;;;;;;-1:-1:-1;29674:372:0;;;;;:::i;:::-;;:::i;:::-;;47409:92;;;;;;;;;;-1:-1:-1;47409:92:0;;;;;:::i;:::-;;:::i;46870:36::-;;;;;;;;;;;;;;;;26444:96;;;;;;;;;;;;;:::i;30969:162::-;;;;;;;;;;-1:-1:-1;30969:162:0;;;;;:::i;:::-;;:::i;48196:116::-;;;;;;;;;;-1:-1:-1;48196:116:0;;;;;:::i;:::-;;:::i;48681:123::-;;;;;;;;;;-1:-1:-1;48681:123:0;;;;;:::i;:::-;;:::i;50429:434::-;;;;;;;;;;-1:-1:-1;50429:434:0;;;;;:::i;:::-;;:::i;47084:29::-;;;;;;;;;;;;;;;;51234:193;;;:::i;48436:116::-;;;;;;;;;;-1:-1:-1;48436:116:0;;;;;:::i;:::-;;:::i;31202:177::-;;;;;;;;;;-1:-1:-1;31202:177:0;;;;;:::i;:::-;;:::i;46772:31::-;;;;;;;;;;-1:-1:-1;46772:31:0;;;;;;;;;;;47507:104;;;;;;;;;;-1:-1:-1;47507:104:0;;;;;:::i;:::-;;:::i;48560:115::-;;;;;;;;;;-1:-1:-1;48560:115:0;;;;;:::i;:::-;;:::i;28528:125::-;;;;;;;;;;-1:-1:-1;28528:125:0;;;;;:::i;:::-;;:::i;46928:36::-;;;;;;;;;;;;;;;;47297:104;;;;;;;;;;-1:-1:-1;47297:104:0;;;;;:::i;:::-;;:::i;26981:206::-;;;;;;;;;;-1:-1:-1;26981:206:0;;;;;:::i;:::-;;:::i;4549:94::-;;;;;;;;;;;;;:::i;46655:32::-;;;;;;;;;;;;;;;;3898:87;;;;;;;;;;-1:-1:-1;3971:6:0;;-1:-1:-1;;;;;3971:6:0;3898:87;;46734:31;;;;;;;;;;-1:-1:-1;46734:31:0;;;;;;;;;;;46986:36;;;;;;;;;;;;;;;;28889:104;;;;;;;;;;;;;:::i;47722:112::-;;;;;;;;;;-1:-1:-1;47722:112:0;;;;;:::i;:::-;;:::i;30388:279::-;;;;;;;;;;-1:-1:-1;30388:279:0;;;;;:::i;:::-;;:::i;48318:112::-;;;;;;;;;;-1:-1:-1;48318:112:0;;;;;:::i;:::-;;:::i;46812:37::-;;;;;;;;;;;;;;;;48072:116;;;;;;;;;;-1:-1:-1;48072:116:0;;;;;:::i;:::-;;:::i;47840:108::-;;;;;;;;;;-1:-1:-1;47840:108:0;;;;;:::i;:::-;;:::i;31450:334::-;;;;;;;;;;-1:-1:-1;31450:334:0;;;;;:::i;:::-;;:::i;49309:1112::-;;;;;;;;;;-1:-1:-1;49309:1112:0;;;;;:::i;:::-;;:::i;48812:438::-;;;;;;;;;;-1:-1:-1;48812:438:0;;;;;:::i;:::-;;:::i;47954:112::-;;;;;;;;;;-1:-1:-1;47954:112:0;;;;;:::i;:::-;;:::i;47619:95::-;;;;;;;;;;-1:-1:-1;47619:95:0;;;;;:::i;:::-;;:::i;47120:31::-;;;;;;;;;;;;;;;;30738:164;;;;;;;;;;-1:-1:-1;30738:164:0;;;;;:::i;:::-;;:::i;46696:31::-;;;;;;;;;;-1:-1:-1;46696:31:0;;;;;;;;50871:196;;;;;;;;;;-1:-1:-1;50871:196:0;;;;;:::i;:::-;;:::i;4798:192::-;;;;;;;;;;-1:-1:-1;4798:192:0;;;;;:::i;:::-;;:::i;26612:305::-;26714:4;-1:-1:-1;;;;;;26751:40:0;;-1:-1:-1;;;26751:40:0;;:105;;-1:-1:-1;;;;;;;26808:48:0;;-1:-1:-1;;;26808:48:0;26751:105;:158;;;-1:-1:-1;;;;;;;;;;18321:40:0;;;26873:36;26731:178;26612:305;-1:-1:-1;;26612:305:0:o;28720:100::-;28774:13;28807:5;28800:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28720:100;:::o;30112:204::-;30180:7;30205:16;30213:7;32130:13;;-1:-1:-1;32120:23:0;32039:112;30205:16;30200:64;;30230:34;;-1:-1:-1;;;30230:34:0;;;;;;;;;;;30200:64;-1:-1:-1;30284:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;30284:24:0;;30112:204::o;29674:372::-;29747:13;29763:24;29779:7;29763:15;:24::i;:::-;29747:40;;29808:5;-1:-1:-1;;;;;29802:11:0;:2;-1:-1:-1;;;;;29802:11:0;;29798:48;;29822:24;;-1:-1:-1;;;29822:24:0;;;;;;;;;;;29798:48;2795:10;-1:-1:-1;;;;;29863:21:0;;;29859:139;;29890:37;29907:5;2795:10;30738:164;:::i;29890:37::-;29886:112;;29951:35;;-1:-1:-1;;;29951:35:0;;;;;;;;;;;29886:112;30010:28;30019:2;30023:7;30032:5;30010:8;:28::i;:::-;29736:310;29674:372;;:::o;47409:92::-;3971:6;;-1:-1:-1;;;;;3971:6:0;2795:10;4118:23;4110:68;;;;-1:-1:-1;;;4110:68:0;;;;;;;:::i;:::-;;;;;;;;;47474:8:::1;:19:::0;;-1:-1:-1;;47474:19:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47409:92::o;26444:96::-;26488:7;26530:1;26516:13;;:15;;;;:::i;:::-;26508:24;;26444:96;:::o;30969:162::-;31095:28;31105:4;31111:2;31115:7;31095:9;:28::i;48196:116::-;3971:6;;-1:-1:-1;;;;;3971:6:0;2795:10;4118:23;4110:68;;;;-1:-1:-1;;;4110:68:0;;;;;;;:::i;:::-;48274:16:::1;:30:::0;48196:116::o;48681:123::-;3971:6;;-1:-1:-1;;;;;3971:6:0;2795:10;4118:23;4110:68;;;;-1:-1:-1;;;4110:68:0;;;;;;;:::i;:::-;48766:12:::1;:30;48781:15:::0;48766:12;:30:::1;:::i;:::-;;48681:123:::0;:::o;50429:434::-;14775:1;15373:7;;:19;15365:63;;;;-1:-1:-1;;;15365:63:0;;;;;;;:::i;:::-;14775:1;15506:7;:18;50508:11:::1;::::0;::::1;::::0;::::1;;;50503:45;;50528:20;;-1:-1:-1::0;;;50528:20:0::1;;;;;;;;;;;50503:45;50563:9;2795:10:::0;50563:25:::1;50559:56;;50597:18;;-1:-1:-1::0;;;50597:18:0::1;;;;;;;;;;;50559:56;50660:10;;50646:11;50630:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;50626:71;;;50679:18;;-1:-1:-1::0;;;50679:18:0::1;;;;;;;;;;;50626:71;50756:17;::::0;50742:11;50712:27:::1;2795:10:::0;50712:13:::1;:27::i;:::-;:41;;;;:::i;:::-;:61;50708:98;;;50782:24;;-1:-1:-1::0;;;50782:24:0::1;;;;;;;;;;;50708:98;50819:36;2795:10:::0;50829:12:::1;50843:11;50819:9;:36::i;:::-;-1:-1:-1::0;14731:1:0;15685:7;:22;50429:434::o;51234:193::-;14775:1;15373:7;;:19;15365:63;;;;-1:-1:-1;;;15365:63:0;;;;;;;:::i;:::-;14775:1;15506:7;:18;;;3971:6;;51316:55:::1;::::0;-1:-1:-1;;;;;3971:6:0;;;;51345:21:::1;::::0;15506:7;51316:55;15506:7;51316:55;51345:21;3971:6;51316:55:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51297:74;;;51387:7;51382:37;;51403:16;;-1:-1:-1::0;;;51403:16:0::1;;;;;;;;;;;48436:116:::0;3971:6;;-1:-1:-1;;;;;3971:6:0;2795:10;4118:23;4110:68;;;;-1:-1:-1;;;4110:68:0;;;;;;;:::i;:::-;48514:16:::1;:30:::0;48436:116::o;31202:177::-;31332:39;31349:4;31355:2;31359:7;31332:39;;;;;;;;;;;;:16;:39::i;47507:104::-;3971:6;;-1:-1:-1;;;;;3971:6:0;2795:10;4118:23;4110:68;;;;-1:-1:-1;;;4110:68:0;;;;;;;:::i;:::-;47578:11:::1;:25:::0;;;::::1;;;;-1:-1:-1::0;;47578:25:0;;::::1;::::0;;;::::1;::::0;;47507:104::o;48560:115::-;3971:6;;-1:-1:-1;;;;;3971:6:0;2795:10;4118:23;4110:68;;;;-1:-1:-1;;;4110:68:0;;;;;;;:::i;:::-;48641:10:::1;:26;48654:13:::0;48641:10;:26:::1;:::i;28528:125::-:0;28592:7;28619:21;28632:7;28619:12;:21::i;:::-;:26;;28528:125;-1:-1:-1;;28528:125:0:o;47297:104::-;3971:6;;-1:-1:-1;;;;;3971:6:0;2795:10;4118:23;4110:68;;;;-1:-1:-1;;;4110:68:0;;;;;;;:::i;:::-;47370:10:::1;:23:::0;47297:104::o;26981:206::-;27045:7;-1:-1:-1;;;;;27069:19:0;;27065:60;;27097:28;;-1:-1:-1;;;27097:28:0;;;;;;;;;;;27065:60;-1:-1:-1;;;;;;27151:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;27151:27:0;;26981:206::o;4549:94::-;3971:6;;-1:-1:-1;;;;;3971:6:0;2795:10;4118:23;4110:68;;;;-1:-1:-1;;;4110:68:0;;;;;;;:::i;:::-;4614:21:::1;4632:1;4614:9;:21::i;:::-;4549:94::o:0;28889:104::-;28945:13;28978:7;28971:14;;;;;:::i;47722:112::-;3971:6;;-1:-1:-1;;;;;3971:6:0;2795:10;4118:23;4110:68;;;;-1:-1:-1;;;4110:68:0;;;;;;;:::i;:::-;47798:15:::1;:28:::0;47722:112::o;30388:279::-;2795:10;-1:-1:-1;;;;;30479:24:0;;;30475:54;;30512:17;;-1:-1:-1;;;30512:17:0;;;;;;;;;;;30475:54;2795:10;30542:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;30542:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;30542:53:0;;;;;;;;;;30611:48;;1001:41:1;;;30542:42:0;;2795:10;30611:48;;974:18:1;30611:48:0;;;;;;;30388:279;;:::o;48318:112::-;3971:6;;-1:-1:-1;;;;;3971:6:0;2795:10;4118:23;4110:68;;;;-1:-1:-1;;;4110:68:0;;;;;;;:::i;:::-;48394:14:::1;:28:::0;48318:112::o;48072:116::-;3971:6;;-1:-1:-1;;;;;3971:6:0;2795:10;4118:23;4110:68;;;;-1:-1:-1;;;4110:68:0;;;;;;;:::i;:::-;48150:17:::1;:30:::0;48072:116::o;47840:108::-;3971:6;;-1:-1:-1;;;;;3971:6:0;2795:10;4118:23;4110:68;;;;-1:-1:-1;;;4110:68:0;;;;;;;:::i;:::-;47914:13:::1;:26:::0;47840:108::o;31450:334::-;31609:28;31619:4;31625:2;31629:7;31609:9;:28::i;:::-;31653:48;31676:4;31682:2;31686:7;31695:5;31653:22;:48::i;:::-;31648:129;;31725:40;;-1:-1:-1;;;31725:40:0;;;;;;;;;;;31648:129;31450:334;;;;:::o;49309:1112::-;14775:1;15373:7;;:19;15365:63;;;;-1:-1:-1;;;15365:63:0;;;;;;;:::i;:::-;14775:1;15506:7;:18;49415:8:::1;::::0;::::1;;49410:39;;49432:17;;-1:-1:-1::0;;;49432:17:0::1;;;;;;;;;;;49410:39;49464:9;2795:10:::0;49464:25:::1;49460:56;;49498:18;;-1:-1:-1::0;;;49498:18:0::1;;;;;;;;;;;49460:56;49561:10;;49547:11;49531:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;49527:71;;;49580:18;;-1:-1:-1::0;;;49580:18:0::1;;;;;;;;;;;49527:71;49615:93;49634:12;;49615:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;49648:16:0::1;::::0;;-1:-1:-1;2795:10:0;;-1:-1:-1;49693:12:0::1;49676:30;;;;;;;11053:2:1::0;11049:15;;;;-1:-1:-1;;11045:53:1;11033:66;;11124:2;11115:12;;10904:229;49676:30:0::1;;;;;;;;;;;;;49666:41;;;;;;49615:18;:93::i;:::-;49611:756;;;49773:15;::::0;49759:11;49729:27:::1;2795:10:::0;50712:13:::1;:27::i;49729:::-;:41;;;;:::i;:::-;:59;49725:94;;;49797:22;;-1:-1:-1::0;;;49797:22:0::1;;;;;;;;;;;49725:94;49611:756;;;49851:91;49870:12;;49851:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;49884:14:0::1;::::0;;-1:-1:-1;2795:10:0;;-1:-1:-1;49927:12:0::1;2715:98:::0;49851:91:::1;49847:520;;;50007:13;::::0;49993:11;49963:27:::1;2795:10:::0;50712:13:::1;:27::i;49963:::-;:41;;;;:::i;:::-;:57;49959:90;;;50029:20;;-1:-1:-1::0;;;50029:20:0::1;;;;;;;;;;;49847:520;50081:93;50100:12;;50081:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;50114:16:0::1;::::0;;-1:-1:-1;2795:10:0;;-1:-1:-1;50159:12:0::1;2715:98:::0;50081:93:::1;50077:290;;;50239:15;::::0;50225:11;50195:27:::1;2795:10:::0;50712:13:::1;:27::i;50195:::-;:41;;;;:::i;:::-;:59;50191:94;;;50263:22;;-1:-1:-1::0;;;50263:22:0::1;;;;;;;;;;;50077:290;50335:20;;-1:-1:-1::0;;;50335:20:0::1;;;;;;;;;;;50077:290;50377:36;2795:10:::0;50401:11:::1;50377:9;:36::i;:::-;-1:-1:-1::0;;14731:1:0;15685:7;:22;-1:-1:-1;49309:1112:0:o;48812:438::-;48895:13;48926:17;48934:8;32130:13;;-1:-1:-1;32120:23:0;32039:112;48926:17;48921:60;;48952:29;;-1:-1:-1;;;48952:29:0;;;;;;;;;;;48921:60;49005:8;;;;;;;49001:242;;;49043:10;49037:24;;;;;:::i;:::-;;;49065:1;49037:29;:103;;;;;;;;;;;;;;;;;49093:10;49105:19;:8;:17;:19::i;:::-;49076:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49030:110;48812:438;-1:-1:-1;;48812:438:0:o;49001:242::-;49186:12;49180:26;;;;;:::i;:::-;;;49210:1;49180:31;:51;;;;;;;;;;;;;;;;;49214:12;49180:51;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49173:58;48812:438;-1:-1:-1;;48812:438:0:o;49001:242::-;48812:438;;;:::o;47954:112::-;3971:6;;-1:-1:-1;;;;;3971:6:0;2795:10;4118:23;4110:68;;;;-1:-1:-1;;;4110:68:0;;;;;;;:::i;:::-;48030:15:::1;:28:::0;47954:112::o;47619:95::-;3971:6;;-1:-1:-1;;;;;3971:6:0;2795:10;4118:23;4110:68;;;;-1:-1:-1;;;4110:68:0;;;;;;;:::i;:::-;47686:8:::1;:20:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;47686:20:0;;::::1;::::0;;;::::1;::::0;;47619:95::o;30738:164::-;-1:-1:-1;;;;;30859:25:0;;;30835:4;30859:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30738:164::o;50871:196::-;3971:6;;-1:-1:-1;;;;;3971:6:0;2795:10;4118:23;4110:68;;;;-1:-1:-1;;;4110:68:0;;;;;;;:::i;:::-;50975:10:::1;;50961:11;50945:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;50941:71;;;50994:18;;-1:-1:-1::0;;;50994:18:0::1;;;;;;;;;;;50941:71;51023:36;2795:10:::0;51033:12:::1;2715:98:::0;51023:36:::1;50871:196:::0;:::o;4798:192::-;3971:6;;-1:-1:-1;;;;;3971:6:0;2795:10;4118:23;4110:68;;;;-1:-1:-1;;;4110:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4887:22:0;::::1;4879:73;;;::::0;-1:-1:-1;;;4879:73:0;;12532:2:1;4879:73:0::1;::::0;::::1;12514:21:1::0;12571:2;12551:18;;;12544:30;12610:34;12590:18;;;12583:62;-1:-1:-1;;;12661:18:1;;;12654:36;12707:19;;4879:73:0::1;12330:402:1::0;4879:73:0::1;4963:19;4973:8;4963:9;:19::i;36109:196::-:0;36224:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;36224:29:0;-1:-1:-1;;;;;36224:29:0;;;;;;;;;36269:28;;36224:24;;36269:28;;;;;;;36109:196;;;:::o;33955:2036::-;14775:1;15373:7;;:19;15365:63;;;;-1:-1:-1;;;15365:63:0;;;;;;;:::i;:::-;14775:1;15506:7;:18;-1:-1:-1;;;;;34087:16:0;::::1;34083:52;;34112:23;;-1:-1:-1::0;;;34112:23:0::1;;;;;;;;;;;34083:52;34148:35;34186:21;34199:7;34186:12;:21::i;:::-;34148:59;;34244:4;-1:-1:-1::0;;;;;34222:26:0::1;:13;:18;;;-1:-1:-1::0;;;;;34222:26:0::1;;34218:67;;34257:28;;-1:-1:-1::0;;;34257:28:0::1;;;;;;;;;;;34218:67;34298:22;2795:10:::0;-1:-1:-1;;;;;34324:20:0;::::1;;::::0;:73:::1;;-1:-1:-1::0;34361:36:0::1;34378:4:::0;2795:10;30738:164;:::i;34361:36::-:1;34324:126;;;-1:-1:-1::0;2795:10:0;34414:20:::1;34426:7:::0;34414:11:::1;:20::i;:::-;-1:-1:-1::0;;;;;34414:36:0::1;;34324:126;34298:153;;34469:17;34464:66;;34495:35;;-1:-1:-1::0;;;34495:35:0::1;;;;;;;;;;;34464:66;34595:35;34612:1;34616:7;34625:4;34595:8;:35::i;:::-;-1:-1:-1::0;;;;;35141:18:0;;::::1;;::::0;;;:12:::1;:18;::::0;;;;;;;:31;;-1:-1:-1;;;;;;;35141:31:0;;::::1;::::0;;;;;::::1;-1:-1:-1::0;;;;;;35141:31:0;;::::1;;::::0;;;35187:16;;::::1;::::0;;;;;;:29;;;;::::1;35171:1;35187:29:::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;35256:43;;;;::::1;::::0;;;;;::::1;35282:15;35256:43:::0;::::1;::::0;;::::1;::::0;;;35233:20;;;:11:::1;:20:::0;;;;;;:66;;;;;;;;::::1;-1:-1:-1::0;;;35233:66:0::1;-1:-1:-1::0;;;;;;35233:66:0;;;;;::::1;::::0;;;;::::1;::::0;;;35573:11;;::::1;35603:24:::0;;;;;:29;35573:11;;35603:29:::1;35599:316;;35671:20;35679:11;32130:13:::0;;-1:-1:-1;32120:23:0;32039:112;35671:20:::1;35667:233;;;35743:137;::::0;;;;::::1;::::0;;35784:18;;-1:-1:-1;;;;;35743:137:0;;::::1;::::0;;::::1;35829:28:::0;;::::1;::::0;35743:137:::1;::::0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;35716:24:0;;;:11:::1;:24:::0;;;;;;;:164;;;;;;;;::::1;-1:-1:-1::0;;;35716:164:0::1;-1:-1:-1::0;;;;;;35716:164:0;;;;::::1;::::0;;;;::::1;::::0;;35667:233:::1;35116:810;35975:7;35971:2;-1:-1:-1::0;;;;;35956:27:0::1;35965:4;-1:-1:-1::0;;;;;35956:27:0::1;;;;;;;;;;;-1:-1:-1::0;;14731:1:0;15685:7;:22;-1:-1:-1;;;33955:2036:0:o;27269:207::-;27330:7;-1:-1:-1;;;;;27354:19:0;;27350:59;;27382:27;;-1:-1:-1;;;27382:27:0;;;;;;;;;;;27350:59;-1:-1:-1;;;;;;27435:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;27435:32:0;;-1:-1:-1;;;;;27435:32:0;;27269:207::o;32524:1177::-;-1:-1:-1;;;;;32622:16:0;;32618:48;;32647:19;;-1:-1:-1;;;32647:19:0;;;;;;;;;;;32618:48;32681:8;32693:1;32681:13;32677:44;;32703:18;;-1:-1:-1;;;32703:18:0;;;;;;;;;;;32677:44;-1:-1:-1;;;;;32991:16:0;;;;;;:12;:16;;;;;;;;:45;;-1:-1:-1;;;;;;;;32991:45:0;;;;;;;-1:-1:-1;;;;;;32991:45:0;;;;;33051:50;;;;;;;;;;;;32991:45;33130:13;;33118:26;;:11;:26;;;;;;:36;;-1:-1:-1;;;;;;33118:36:0;;;;;;;33181:13;;33169:26;;;;;:67;;;33220:15;33169:67;-1:-1:-1;;;33169:67:0;-1:-1:-1;;;;33169:67:0;;;;;;33276:13;;;33306:319;33330:8;33326:1;:12;33306:319;;;33369:38;;33394:12;;-1:-1:-1;;;;;33369:38:0;;;33386:1;;33369:38;;33386:1;;33369:38;33431:56;33462:1;33466:2;33470:12;33431:56;;;;;;;;;;;;:22;:56::i;:::-;33426:149;;33519:36;;-1:-1:-1;;;33519:36:0;;;;;;;;;;;33426:149;33593:14;;;;;33340:3;33306:319;;;-1:-1:-1;33641:13:0;:28;-1:-1:-1;;32524:1177:0:o;27678:788::-;-1:-1:-1;;;;;;;;;;;;;;;;;27789:7:0;27840:1;:9;-1:-1:-1;27840:9:0;;;:33;;;27860:13;;27853:4;:20;27840:33;27834:552;;;27896:31;27930:17;;;:11;:17;;;;;;;;;27896:51;;;;;;;;;-1:-1:-1;;;;;27896:51:0;;;;;-1:-1:-1;;;27896:51:0;;;;;;;;;;;;27970:28;27966:93;;28030:9;27678:788;-1:-1:-1;;;27678:788:0:o;27966:93::-;-1:-1:-1;;;28170:6:0;28211:17;;;;:11;:17;;;;;;;;;28199:29;;;;;;;;;-1:-1:-1;;;;;28199:29:0;;;;;-1:-1:-1;;;28199:29:0;;;;;;;;;;;;28255:28;28251:101;;28319:9;27678:788;-1:-1:-1;;;27678:788:0:o;28251:101::-;28134:237;;27834:552;28427:31;;-1:-1:-1;;;28427:31:0;;;;;;;;;;;4998:173;5073:6;;;-1:-1:-1;;;;;5090:17:0;;;-1:-1:-1;;;;;;5090:17:0;;;;;;;5123:40;;5073:6;;;5090:17;5073:6;;5123:40;;5054:16;;5123:40;5043:128;4998:173;:::o;36797:798::-;36952:4;-1:-1:-1;;;;;36973:13:0;;6239:20;6287:8;36969:619;;37009:72;;-1:-1:-1;;;37009:72:0;;-1:-1:-1;;;;;37009:36:0;;;;;:72;;2795:10;;37060:4;;37066:7;;37075:5;;37009:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37009:72:0;;;;;;;;-1:-1:-1;;37009:72:0;;;;;;;;;;;;:::i;:::-;;;37005:528;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37255:6;:13;37272:1;37255:18;37251:267;;37305:48;;-1:-1:-1;;;37305:48:0;;;;;;;;;;;37251:267;37468:6;37462:13;37453:6;37449:2;37445:15;37438:38;37005:528;-1:-1:-1;;;;;;37132:55:0;-1:-1:-1;;;37132:55:0;;-1:-1:-1;37125:62:0;;36969:619;-1:-1:-1;37572:4:0;36969:619;36797:798;;;;;;:::o;38748:190::-;38873:4;38926;38897:25;38910:5;38917:4;38897:12;:25::i;:::-;:33;;38748:190;-1:-1:-1;;;;38748:190:0:o;359:723::-;415:13;636:5;645:1;636:10;632:53;;-1:-1:-1;;663:10:0;;;;;;;;;;;;-1:-1:-1;;;663:10:0;;;;;359:723::o;632:53::-;710:5;695:12;751:78;758:9;;751:78;;784:8;;;;:::i;:::-;;-1:-1:-1;807:10:0;;-1:-1:-1;815:2:0;807:10;;:::i;:::-;;;751:78;;;839:19;871:6;861:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;861:17:0;;839:39;;889:154;896:10;;889:154;;923:11;933:1;923:11;;:::i;:::-;;-1:-1:-1;992:10:0;1000:2;992:5;:10;:::i;:::-;979:24;;:2;:24;:::i;:::-;966:39;;949:6;956;949:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;949:56:0;;;;;;;;-1:-1:-1;1020:11:0;1029:2;1020:11;;:::i;:::-;;;889:154;;39615:296;39698:7;39741:4;39698:7;39756:118;39780:5;:12;39776:1;:16;39756:118;;;39829:33;39839:12;39853:5;39859:1;39853:8;;;;;;;;:::i;:::-;;;;;;;39829:9;:33::i;:::-;39814:48;-1:-1:-1;39794:3:0;;;;:::i;:::-;;;;39756:118;;;-1:-1:-1;39891:12:0;39615:296;-1:-1:-1;;;39615:296:0:o;45822:149::-;45885:7;45916:1;45912;:5;:51;;46047:13;46141:15;;;46177:4;46170:15;;;46224:4;46208:21;;45912:51;;;46047:13;46141:15;;;46177:4;46170:15;;;46224:4;46208:21;;45920:20;45905:58;45822:149;-1:-1:-1;;;45822:149:0:o;475:131:1:-;-1:-1:-1;;;;;;549:32:1;;539:43;;529:71;;596:1;593;586:12;611:245;669:6;722:2;710:9;701:7;697:23;693:32;690:52;;;738:1;735;728:12;690:52;777:9;764:23;796:30;820:5;796:30;:::i;1053:250::-;1138:1;1148:113;1162:6;1159:1;1156:13;1148:113;;;1238:11;;;1232:18;1219:11;;;1212:39;1184:2;1177:10;1148:113;;;-1:-1:-1;;1295:1:1;1277:16;;1270:27;1053:250::o;1308:271::-;1350:3;1388:5;1382:12;1415:6;1410:3;1403:19;1431:76;1500:6;1493:4;1488:3;1484:14;1477:4;1470:5;1466:16;1431:76;:::i;:::-;1561:2;1540:15;-1:-1:-1;;1536:29:1;1527:39;;;;1568:4;1523:50;;1308:271;-1:-1:-1;;1308:271:1:o;1584:220::-;1733:2;1722:9;1715:21;1696:4;1753:45;1794:2;1783:9;1779:18;1771:6;1753:45;:::i;1809:180::-;1868:6;1921:2;1909:9;1900:7;1896:23;1892:32;1889:52;;;1937:1;1934;1927:12;1889:52;-1:-1:-1;1960:23:1;;1809:180;-1:-1:-1;1809:180:1:o;2202:173::-;2270:20;;-1:-1:-1;;;;;2319:31:1;;2309:42;;2299:70;;2365:1;2362;2355:12;2380:254;2448:6;2456;2509:2;2497:9;2488:7;2484:23;2480:32;2477:52;;;2525:1;2522;2515:12;2477:52;2548:29;2567:9;2548:29;:::i;:::-;2538:39;2624:2;2609:18;;;;2596:32;;-1:-1:-1;;;2380:254:1:o;2639:160::-;2704:20;;2760:13;;2753:21;2743:32;;2733:60;;2789:1;2786;2779:12;2804:180;2860:6;2913:2;2901:9;2892:7;2888:23;2884:32;2881:52;;;2929:1;2926;2919:12;2881:52;2952:26;2968:9;2952:26;:::i;3171:328::-;3248:6;3256;3264;3317:2;3305:9;3296:7;3292:23;3288:32;3285:52;;;3333:1;3330;3323:12;3285:52;3356:29;3375:9;3356:29;:::i;:::-;3346:39;;3404:38;3438:2;3427:9;3423:18;3404:38;:::i;:::-;3394:48;;3489:2;3478:9;3474:18;3461:32;3451:42;;3171:328;;;;;:::o;3689:127::-;3750:10;3745:3;3741:20;3738:1;3731:31;3781:4;3778:1;3771:15;3805:4;3802:1;3795:15;3821:632;3886:5;3916:18;3957:2;3949:6;3946:14;3943:40;;;3963:18;;:::i;:::-;4038:2;4032:9;4006:2;4092:15;;-1:-1:-1;;4088:24:1;;;4114:2;4084:33;4080:42;4068:55;;;4138:18;;;4158:22;;;4135:46;4132:72;;;4184:18;;:::i;:::-;4224:10;4220:2;4213:22;4253:6;4244:15;;4283:6;4275;4268:22;4323:3;4314:6;4309:3;4305:16;4302:25;4299:45;;;4340:1;4337;4330:12;4299:45;4390:6;4385:3;4378:4;4370:6;4366:17;4353:44;4445:1;4438:4;4429:6;4421;4417:19;4413:30;4406:41;;;;3821:632;;;;;:::o;4458:451::-;4527:6;4580:2;4568:9;4559:7;4555:23;4551:32;4548:52;;;4596:1;4593;4586:12;4548:52;4636:9;4623:23;4669:18;4661:6;4658:30;4655:50;;;4701:1;4698;4691:12;4655:50;4724:22;;4777:4;4769:13;;4765:27;-1:-1:-1;4755:55:1;;4806:1;4803;4796:12;4755:55;4829:74;4895:7;4890:2;4877:16;4872:2;4868;4864:11;4829:74;:::i;4914:186::-;4973:6;5026:2;5014:9;5005:7;5001:23;4997:32;4994:52;;;5042:1;5039;5032:12;4994:52;5065:29;5084:9;5065:29;:::i;5105:254::-;5170:6;5178;5231:2;5219:9;5210:7;5206:23;5202:32;5199:52;;;5247:1;5244;5237:12;5199:52;5270:29;5289:9;5270:29;:::i;:::-;5260:39;;5318:35;5349:2;5338:9;5334:18;5318:35;:::i;:::-;5308:45;;5105:254;;;;;:::o;5364:667::-;5459:6;5467;5475;5483;5536:3;5524:9;5515:7;5511:23;5507:33;5504:53;;;5553:1;5550;5543:12;5504:53;5576:29;5595:9;5576:29;:::i;:::-;5566:39;;5624:38;5658:2;5647:9;5643:18;5624:38;:::i;:::-;5614:48;;5709:2;5698:9;5694:18;5681:32;5671:42;;5764:2;5753:9;5749:18;5736:32;5791:18;5783:6;5780:30;5777:50;;;5823:1;5820;5813:12;5777:50;5846:22;;5899:4;5891:13;;5887:27;-1:-1:-1;5877:55:1;;5928:1;5925;5918:12;5877:55;5951:74;6017:7;6012:2;5999:16;5994:2;5990;5986:11;5951:74;:::i;:::-;5941:84;;;5364:667;;;;;;;:::o;6036:683::-;6131:6;6139;6147;6200:2;6188:9;6179:7;6175:23;6171:32;6168:52;;;6216:1;6213;6206:12;6168:52;6252:9;6239:23;6229:33;;6313:2;6302:9;6298:18;6285:32;6336:18;6377:2;6369:6;6366:14;6363:34;;;6393:1;6390;6383:12;6363:34;6431:6;6420:9;6416:22;6406:32;;6476:7;6469:4;6465:2;6461:13;6457:27;6447:55;;6498:1;6495;6488:12;6447:55;6538:2;6525:16;6564:2;6556:6;6553:14;6550:34;;;6580:1;6577;6570:12;6550:34;6633:7;6628:2;6618:6;6615:1;6611:14;6607:2;6603:23;6599:32;6596:45;6593:65;;;6654:1;6651;6644:12;6593:65;6685:2;6681;6677:11;6667:21;;6707:6;6697:16;;;;;6036:683;;;;;:::o;6724:260::-;6792:6;6800;6853:2;6841:9;6832:7;6828:23;6824:32;6821:52;;;6869:1;6866;6859:12;6821:52;6892:29;6911:9;6892:29;:::i;:::-;6882:39;;6940:38;6974:2;6963:9;6959:18;6940:38;:::i;6989:380::-;7068:1;7064:12;;;;7111;;;7132:61;;7186:4;7178:6;7174:17;7164:27;;7132:61;7239:2;7231:6;7228:14;7208:18;7205:38;7202:161;;7285:10;7280:3;7276:20;7273:1;7266:31;7320:4;7317:1;7310:15;7348:4;7345:1;7338:15;7202:161;;6989:380;;;:::o;7374:356::-;7576:2;7558:21;;;7595:18;;;7588:30;7654:34;7649:2;7634:18;;7627:62;7721:2;7706:18;;7374:356::o;7735:127::-;7796:10;7791:3;7787:20;7784:1;7777:31;7827:4;7824:1;7817:15;7851:4;7848:1;7841:15;7867:128;7934:9;;;7955:11;;;7952:37;;;7969:18;;:::i;8126:545::-;8228:2;8223:3;8220:11;8217:448;;;8264:1;8289:5;8285:2;8278:17;8334:4;8330:2;8320:19;8404:2;8392:10;8388:19;8385:1;8381:27;8375:4;8371:38;8440:4;8428:10;8425:20;8422:47;;;-1:-1:-1;8463:4:1;8422:47;8518:2;8513:3;8509:12;8506:1;8502:20;8496:4;8492:31;8482:41;;8573:82;8591:2;8584:5;8581:13;8573:82;;;8636:17;;;8617:1;8606:13;8573:82;;;8577:3;;;8126:545;;;:::o;8847:1352::-;8973:3;8967:10;9000:18;8992:6;8989:30;8986:56;;;9022:18;;:::i;:::-;9051:97;9141:6;9101:38;9133:4;9127:11;9101:38;:::i;:::-;9095:4;9051:97;:::i;:::-;9203:4;;9267:2;9256:14;;9284:1;9279:663;;;;9986:1;10003:6;10000:89;;;-1:-1:-1;10055:19:1;;;10049:26;10000:89;-1:-1:-1;;8804:1:1;8800:11;;;8796:24;8792:29;8782:40;8828:1;8824:11;;;8779:57;10102:81;;9249:944;;9279:663;8073:1;8066:14;;;8110:4;8097:18;;-1:-1:-1;;9315:20:1;;;9433:236;9447:7;9444:1;9441:14;9433:236;;;9536:19;;;9530:26;9515:42;;9628:27;;;;9596:1;9584:14;;;;9463:19;;9433:236;;;9437:3;9697:6;9688:7;9685:19;9682:201;;;9758:19;;;9752:26;-1:-1:-1;;9841:1:1;9837:14;;;9853:3;9833:24;9829:37;9825:42;9810:58;9795:74;;9682:201;-1:-1:-1;;;;;9929:1:1;9913:14;;;9909:22;9896:36;;-1:-1:-1;8847:1352:1:o;10204:355::-;10406:2;10388:21;;;10445:2;10425:18;;;10418:30;10484:33;10479:2;10464:18;;10457:61;10550:2;10535:18;;10204:355::o;10564:125::-;10629:9;;;10650:10;;;10647:36;;;10663:18;;:::i;11138:1187::-;11415:3;11444:1;11477:6;11471:13;11507:36;11533:9;11507:36;:::i;:::-;11562:1;11579:18;;;11606:133;;;;11753:1;11748:356;;;;11572:532;;11606:133;-1:-1:-1;;11639:24:1;;11627:37;;11712:14;;11705:22;11693:35;;11684:45;;;-1:-1:-1;11606:133:1;;11748:356;11779:6;11776:1;11769:17;11809:4;11854:2;11851:1;11841:16;11879:1;11893:165;11907:6;11904:1;11901:13;11893:165;;;11985:14;;11972:11;;;11965:35;12028:16;;;;11922:10;;11893:165;;;11897:3;;;12087:6;12082:3;12078:16;12071:23;;11572:532;;;;;12135:6;12129:13;12151:68;12210:8;12205:3;12198:4;12190:6;12186:17;12151:68;:::i;:::-;-1:-1:-1;;;12241:18:1;;12268:22;;;12317:1;12306:13;;11138:1187;-1:-1:-1;;;;11138:1187:1:o;12737:489::-;-1:-1:-1;;;;;13006:15:1;;;12988:34;;13058:15;;13053:2;13038:18;;13031:43;13105:2;13090:18;;13083:34;;;13153:3;13148:2;13133:18;;13126:31;;;12931:4;;13174:46;;13200:19;;13192:6;13174:46;:::i;:::-;13166:54;12737:489;-1:-1:-1;;;;;;12737:489:1:o;13231:249::-;13300:6;13353:2;13341:9;13332:7;13328:23;13324:32;13321:52;;;13369:1;13366;13359:12;13321:52;13401:9;13395:16;13420:30;13444:5;13420:30;:::i;13485:135::-;13524:3;13545:17;;;13542:43;;13565:18;;:::i;:::-;-1:-1:-1;13612:1:1;13601:13;;13485:135::o;13625:127::-;13686:10;13681:3;13677:20;13674:1;13667:31;13717:4;13714:1;13707:15;13741:4;13738:1;13731:15;13757:120;13797:1;13823;13813:35;;13828:18;;:::i;:::-;-1:-1:-1;13862:9:1;;13757:120::o;13882:112::-;13914:1;13940;13930:35;;13945:18;;:::i;:::-;-1:-1:-1;13979:9:1;;13882:112::o;13999:127::-;14060:10;14055:3;14051:20;14048:1;14041:31;14091:4;14088:1;14081:15;14115:4;14112:1;14105:15

Swarm Source

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