ETH Price: $2,670.73 (+2.28%)

Token

GIToadz (GITOADZ)
 

Overview

Max Total Supply

6,969 GITOADZ

Holders

2,471

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
badvlad.eth
Balance
1 GITOADZ
0x194CFa23EF3366e41C6D289A5333eEdE19E2D47C
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

G.I. TOADZ: The Return of Colonel Floorbin.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
GIToadz

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 400 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

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


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

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


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

pragma solidity ^0.8.0;


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

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

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

// File: contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;









error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error UnableDetermineTokenOwner();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Does not support burning tokens to address(0).
 *
 * Assumes that an owner cannot have more than the 2**128 - 1 (max value of uint128) of supply
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal _currentIndex;

    // 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 See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        if (index >= totalSupply()) revert TokenIndexOutOfBounds();
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds();
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        // Execution should never reach this point.
        assert(false);
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).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);
    }

    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) {
        if (!_exists(tokenId)) revert OwnerQueryForNonexistentToken();

        unchecked {
            for (uint256 curr = tokenId;; curr--) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }
            }
        }
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) revert ApprovalCallerNotOwnerNorApproved();

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public 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;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

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

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

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

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

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

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }

                updatedIndex++;
            }

            _currentIndex = updatedIndex;
        }

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

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

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, prevOwnership.addr);

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

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

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

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

    /**
     * @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 address.
     * The call is not executed if the target address is not a 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 TransferToNonERC721ReceiverImplementer();
                else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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

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

pragma solidity ^0.8.0;

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

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

    function _efficientHash(bytes32 a, bytes32 b)
        private
        pure
        returns (bytes32 value)
    {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}
/**************************************
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░░░░░░░░░▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄░░░░░░░░░
░░░░░░░░▄▀░░░░░░░░░░░░▄░░░░░░░▀▄░░░░░░░
░░░░░░░░█░░▄░░░░▄░░░░░░░░░░░░░░█░░░░░░░
░░░░░░░░█░░░░░░░░░░░░▄█▄▄░░▄░░░█░▄▄▄░░░
░▄▄▄▄▄░░█░░░░░░▀░░░░▀█░░▀▄░░░░░█▀▀░██░░
░██▄▀██▄█░░░▄░░░░░░░██░░░░▀▀▀▀▀░░░░██░░
░░▀██▄▀██░░░░░░░░▀░██▀░░░░░░░░░░░░░▀██░
░░░░▀████░▀░░░░▄░░░██░░░▄█░░░░▄░▄█░░██░
░░░░░░░▀█░░░░▄░░░░░██░░░░▄░░░▄░░▄░░░██░
░░░░░░░▄█▄░░░░░░░░░░░▀▄░░▀▀▀▀▀▀▀▀░░▄▀░░
░░░░░░█▀▀█████████▀▀▀▀████████████▀░░░░
░░░░░░████▀░░███▀░░░░░░▀███░░▀██▀░░░░░░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
**************************************/

// File: contracts/gitoadz.sol

pragma solidity ^0.8.0;

contract GIToadz is ERC721A, Ownable, ReentrancyGuard {
  using Address for address;
  using Strings for uint;

  uint256 public maxSupply = 6969;
  uint public constant pricePerToken = 0.0869 ether;
  uint256 public maxMintAmountPerWallet = 3;
  uint256 public maxTierOneMintAmount = 3000;
  bool public mintIsActive = false;
  bool public tierOneMintIsActive = false;
  bool public tierTwoMintIsActive = false;
  bool public publicMintIsActive = false;

  bytes32 public merkleRootOne;
  bytes32 public merkleRootTwo;

  mapping(address => uint256) public addressMinted;

  string public _baseTokenURI;

  constructor() ERC721A("GIToadz", "GITOADZ") {}

  function tierOneMint(bytes32[] calldata _merkleProof, uint256 quantity) external payable {
    require(mintIsActive, "Not open for minting.");
    require(tierOneMintIsActive, "Tier One is not open for minting.");
    bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
    require(MerkleProof.verify(_merkleProof, merkleRootOne, leaf), "Invalid proof.");
    require(totalSupply() + quantity <= maxSupply, "Minted Out!");
    require(addressMinted[msg.sender] + quantity <= maxMintAmountPerWallet, "Can only mint 3 per wallet.");
    require(quantity <= maxMintAmountPerWallet, "Can only mint 3 per wallet.");
    require(pricePerToken * quantity <= msg.value, "It is 0.0869 per token.");
    if ((totalSupply() + quantity >= maxTierOneMintAmount) && (!tierTwoMintIsActive)) {
        tierTwoMintIsActive = true;
    }
    addressMinted[msg.sender] += quantity;
    _safeMint(msg.sender, quantity);
  }

  function tierTwoMint(bytes32[] calldata _merkleProof, uint256 quantity) external payable {
    require(mintIsActive, "Not open for minting.");
    require(tierTwoMintIsActive, "Tier Two is not open for minting.");
    bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
    require(MerkleProof.verify(_merkleProof, merkleRootTwo, leaf), "Invalid proof.");
    require(totalSupply() + quantity <= maxSupply, "Minted Out!");
    require(addressMinted[msg.sender] + quantity <= maxMintAmountPerWallet, "Can only mint 3 per wallet.");
    require(quantity <= maxMintAmountPerWallet, "Can only mint 3 per wallet.");
    require(pricePerToken * quantity <= msg.value, "It is 0.0869 per token.");
    addressMinted[msg.sender] += quantity;
    _safeMint(msg.sender, quantity);
  }

  function publicMint(uint256 quantity) external payable {
    require(mintIsActive, "Not open for minting.");
    require(publicMintIsActive, "Not open for public minting.");
    require(totalSupply() + quantity <= maxSupply, "Minted Out!");
    require(addressMinted[msg.sender] + quantity <= maxMintAmountPerWallet, "Can only mint 3 per wallet.");
    require(quantity <= maxMintAmountPerWallet, "Can only mint 3 per wallet.");
    require(pricePerToken * quantity <= msg.value, "It is 0.0869 per token.");
    addressMinted[msg.sender] += quantity;
    _safeMint(msg.sender, quantity);
  }

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

  function withdraw() public onlyOwner nonReentrant {
    uint total = address(this).balance;
    Address.sendValue(payable(0x31C1b03EC94EC958DD6E53351f1760f8FF72946B), total * 2064/10000);
    Address.sendValue(payable(0x7F8173FcfeB72182c500E95aAAdFB03c6bA60d50), total * 2064/10000);
    Address.sendValue(payable(0xEbfa94BDAA4Ee2361Ff8997124d6ff0B3Be9ff0b), total * 2064/10000);
    Address.sendValue(payable(0x661244c796D5B8941414486a728567ef558A38d2), total * 439/10000);
    Address.sendValue(payable(0x7e9656C4B7F56FA280Ba20D1667c8CDd923fe9Bd), total * 695/10000);
    Address.sendValue(payable(0x9D5025B327E6B863E5050141C987d988c07fd8B2), total * 1354/10000);
    Address.sendValue(payable(0xb10D3F89Bd5ff1d7c7Ac18E18D7cCae2a89fA00d), total * 660/10000);
    Address.sendValue(payable(0xB68BAce12F832B72C3169B8DE865E07806C32923), total * 660/10000);
  }

  function setMintState(bool newState) external onlyOwner {
    mintIsActive = newState;
  }

  function setTierOneState(bool newState) external onlyOwner {
    tierOneMintIsActive = newState;
  }

  function setTierTwoState(bool newState) external onlyOwner {
    tierTwoMintIsActive = newState;
  }

  function setPublicState(bool newState) external onlyOwner {
    publicMintIsActive = newState;
  }

  function mintState() public view returns (bool) {
    return mintIsActive;
  }

  function tierOneMintState() public view returns (bool) {
    return tierOneMintIsActive;
  }

  function tierTwoMintState() public view returns (bool) {
    return tierTwoMintIsActive;
  }

  function publicMintState() public view returns (bool) {
    return publicMintIsActive;
  }

  function setMerkleRootOne(bytes32 newMerkleRoot) external onlyOwner {
    merkleRootOne = newMerkleRoot;
  }

  function setMerkleRootTwo(bytes32 newMerkleRoot) external onlyOwner {
    merkleRootTwo = newMerkleRoot;
  }

  function tokenURI(uint _tokenId) public view virtual override returns (string memory) {
    require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
    return string(abi.encodePacked(_baseTokenURI, _tokenId.toString()));
  }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"maxMintAmountPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTierOneMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRootOne","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRootTwo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricePerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicMintIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newMerkleRoot","type":"bytes32"}],"name":"setMerkleRootOne","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newMerkleRoot","type":"bytes32"}],"name":"setMerkleRootTwo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newState","type":"bool"}],"name":"setMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newState","type":"bool"}],"name":"setPublicState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newState","type":"bool"}],"name":"setTierOneState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newState","type":"bool"}],"name":"setTierTwoState","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":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"tierOneMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"tierOneMintIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tierOneMintState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"tierTwoMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"tierTwoMintIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tierTwoMintState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"nonpayable","type":"function"}]

6080604052611b396009556003600a55610bb8600b55600c805463ffffffff191690553480156200002f57600080fd5b506040518060400160405280600781526020016623a4aa37b0b23d60c91b8152506040518060400160405280600781526020016623a4aa27a0a22d60c91b8152508160019080519060200190620000889291906200011c565b5080516200009e9060029060208401906200011c565b505050620000bb620000b5620000c660201b60201c565b620000ca565b6001600855620001ff565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200012a90620001c2565b90600052602060002090601f0160209004810192826200014e576000855562000199565b82601f106200016957805160ff191683800117855562000199565b8280016001018555821562000199579182015b82811115620001995782518255916020019190600101906200017c565b50620001a7929150620001ab565b5090565b5b80821115620001a75760008155600101620001ac565b600181811c90821680620001d757607f821691505b60208210811415620001f957634e487b7160e01b600052602260045260246000fd5b50919050565b612ada806200020f6000396000f3fe6080604052600436106102dd5760003560e01c806370a082311161017f578063bc951b91116100e1578063d1da3e941161008a578063e985e9c511610064578063e985e9c5146107d3578063f2fde38b1461081c578063fa30297e1461083c57600080fd5b8063d1da3e941461078a578063d5abeb011461079d578063e346d7b1146107b357600080fd5b8063c87b56dd116100bb578063c87b56dd14610742578063cd07863514610762578063cfc86f7b1461077557600080fd5b8063bc951b91146106f4578063c051e38a1461070a578063c48156af1461072257600080fd5b80638da5cb5b1161014357806395d89b411161011d57806395d89b411461069f578063a22cb465146106b4578063b88d4fde146106d457600080fd5b80638da5cb5b1461064a57806392cca8141461066857806395527a121461067e57600080fd5b806370a08231146105c3578063715018a6146105e35780637b1b1de6146105f85780638088f473146106145780638b1f2e8e1461062a57600080fd5b806332ffeae8116102435780634c85c7ab116101ec5780636352211e116101c65780636352211e14610565578063640bd9391461058557806366cb5118146105a557600080fd5b80634c85c7ab146105085780634f6ccce71461052557806355f804b31461054557600080fd5b806342842e0e1161021d57806342842e0e146104ae57806343f389aa146104ce578063471a4294146104ee57600080fd5b806332ffeae8146104635780633ccfd60b146104835780633d447c961461049857600080fd5b80632173e284116102a557806326412aca1161027f57806326412aca146104105780632db11544146104305780632f745c591461044357600080fd5b80632173e284146103b257806322ab47a1146103d157806323b872dd146103f057600080fd5b806301ffc9a7146102e257806306fdde0314610317578063081812fc14610339578063095ea7b31461037157806318160ddd14610393575b600080fd5b3480156102ee57600080fd5b506103026102fd366004612727565b610869565b60405190151581526020015b60405180910390f35b34801561032357600080fd5b5061032c6108d6565b60405161030e91906128d5565b34801561034557600080fd5b5061035961035436600461270e565b610968565b6040516001600160a01b03909116815260200161030e565b34801561037d57600080fd5b5061039161038c36600461264e565b6109ae565b005b34801561039f57600080fd5b506000545b60405190815260200161030e565b3480156103be57600080fd5b50600c5461030290610100900460ff1681565b3480156103dd57600080fd5b50600c546301000000900460ff16610302565b3480156103fc57600080fd5b5061039161040b36600461256c565b610a3c565b34801561041c57600080fd5b5061039161042b3660046126f3565b610a47565b61039161043e36600461270e565b610aa7565b34801561044f57600080fd5b506103a461045e36600461264e565b610cc4565b34801561046f57600080fd5b5061039161047e36600461270e565b610d99565b34801561048f57600080fd5b50610391610de6565b3480156104a457600080fd5b506103a4600b5481565b3480156104ba57600080fd5b506103916104c936600461256c565b610fd6565b3480156104da57600080fd5b506103916104e93660046126f3565b610ff1565b3480156104fa57600080fd5b50600c546103029060ff1681565b34801561051457600080fd5b50600c54610100900460ff16610302565b34801561053157600080fd5b506103a461054036600461270e565b611055565b34801561055157600080fd5b50610391610560366004612761565b61107c565b34801561057157600080fd5b5061035961058036600461270e565b6110db565b34801561059157600080fd5b506103916105a03660046126f3565b6110ed565b3480156105b157600080fd5b50600c5462010000900460ff16610302565b3480156105cf57600080fd5b506103a46105de366004612517565b61114f565b3480156105ef57600080fd5b5061039161119d565b34801561060457600080fd5b506103a4670134bb16eefb400081565b34801561062057600080fd5b506103a4600e5481565b34801561063657600080fd5b50600c546103029062010000900460ff1681565b34801561065657600080fd5b506007546001600160a01b0316610359565b34801561067457600080fd5b506103a4600d5481565b34801561068a57600080fd5b50600c54610302906301000000900460ff1681565b3480156106ab57600080fd5b5061032c6111f1565b3480156106c057600080fd5b506103916106cf366004612624565b611200565b3480156106e057600080fd5b506103916106ef3660046125a8565b611296565b34801561070057600080fd5b506103a4600a5481565b34801561071657600080fd5b50600c5460ff16610302565b34801561072e57600080fd5b5061039161073d3660046126f3565b6112d0565b34801561074e57600080fd5b5061032c61075d36600461270e565b611336565b610391610770366004612678565b6113d9565b34801561078157600080fd5b5061032c6116f7565b610391610798366004612678565b611785565b3480156107a957600080fd5b506103a460095481565b3480156107bf57600080fd5b506103916107ce36600461270e565b611a30565b3480156107df57600080fd5b506103026107ee366004612539565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561082857600080fd5b50610391610837366004612517565b611a7d565b34801561084857600080fd5b506103a4610857366004612517565b600f6020526000908152604090205481565b60006001600160e01b031982166380ac58cd60e01b148061089a57506001600160e01b03198216635b5e139f60e01b145b806108b557506001600160e01b0319821663780e9d6360e01b145b806108d057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546108e590612976565b80601f016020809104026020016040519081016040528092919081815260200182805461091190612976565b801561095e5780601f106109335761010080835404028352916020019161095e565b820191906000526020600020905b81548152906001019060200180831161094157829003601f168201915b5050505050905090565b6000610975826000541190565b610992576040516333d1c03960e21b815260040160405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006109b9826110db565b9050806001600160a01b0316836001600160a01b031614156109ee5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610a0e5750610a0c81336107ee565b155b15610a2c576040516367d9dca160e11b815260040160405180910390fd5b610a37838383611b33565b505050565b610a37838383611b8f565b6007546001600160a01b03163314610a945760405162461bcd60e51b81526020600482018190526024820152600080516020612a8583398151915260448201526064015b60405180910390fd5b600c805460ff1916911515919091179055565b600c5460ff16610af15760405162461bcd60e51b81526020600482015260156024820152742737ba1037b832b7103337b91036b4b73a34b7339760591b6044820152606401610a8b565b600c546301000000900460ff16610b4a5760405162461bcd60e51b815260206004820152601c60248201527f4e6f74206f70656e20666f72207075626c6963206d696e74696e672e000000006044820152606401610a8b565b60095481610b5760005490565b610b6191906128e8565b1115610b9d5760405162461bcd60e51b815260206004820152600b60248201526a4d696e746564204f75742160a81b6044820152606401610a8b565b600a54336000908152600f6020526040902054610bbb9083906128e8565b1115610bf75760405162461bcd60e51b815260206004820152601b6024820152600080516020612a658339815191526044820152606401610a8b565b600a54811115610c375760405162461bcd60e51b815260206004820152601b6024820152600080516020612a658339815191526044820152606401610a8b565b34610c4a82670134bb16eefb4000612914565b1115610c925760405162461bcd60e51b815260206004820152601760248201527624ba1034b9901817181c1b1c903832b9103a37b5b2b71760491b6044820152606401610a8b565b336000908152600f602052604081208054839290610cb19084906128e8565b90915550610cc190503382611db7565b50565b6000610ccf8361114f565b8210610cee576040516306ed618760e11b815260040160405180910390fd5b600080549080805b83811015610d87576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610d4957805192505b876001600160a01b0316836001600160a01b03161415610d7e5786841415610d77575093506108d092505050565b6001909301925b50600101610cf6565b50610d906129e0565b50505092915050565b6007546001600160a01b03163314610de15760405162461bcd60e51b81526020600482018190526024820152600080516020612a858339815191526044820152606401610a8b565b600d55565b6007546001600160a01b03163314610e2e5760405162461bcd60e51b81526020600482018190526024820152600080516020612a858339815191526044820152606401610a8b565b60026008541415610e815760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a8b565b600260085547610ebd7331c1b03ec94ec958dd6e53351f1760f8ff72946b612710610eae84610810612914565b610eb89190612900565b611dd1565b610ee4737f8173fcfeb72182c500e95aaadfb03c6ba60d50612710610eae84610810612914565b610f0b73ebfa94bdaa4ee2361ff8997124d6ff0b3be9ff0b612710610eae84610810612914565b610f3273661244c796d5b8941414486a728567ef558a38d2612710610eae846101b7612914565b610f59737e9656c4b7f56fa280ba20d1667c8cdd923fe9bd612710610eae846102b7612914565b610f80739d5025b327e6b863e5050141c987d988c07fd8b2612710610eae8461054a612914565b610fa773b10d3f89bd5ff1d7c7ac18e18d7ccae2a89fa00d612710610eae84610294612914565b610fce73b68bace12f832b72c3169b8de865e07806c32923612710610eae84610294612914565b506001600855565b610a3783838360405180602001604052806000815250611296565b6007546001600160a01b031633146110395760405162461bcd60e51b81526020600482018190526024820152600080516020612a858339815191526044820152606401610a8b565b600c8054911515620100000262ff000019909216919091179055565b600080548210611078576040516329c8c00760e21b815260040160405180910390fd5b5090565b6007546001600160a01b031633146110c45760405162461bcd60e51b81526020600482018190526024820152600080516020612a858339815191526044820152606401610a8b565b80516110d79060109060208401906123e5565b5050565b60006110e682611eea565b5192915050565b6007546001600160a01b031633146111355760405162461bcd60e51b81526020600482018190526024820152600080516020612a858339815191526044820152606401610a8b565b600c80549115156101000261ff0019909216919091179055565b60006001600160a01b038216611178576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6007546001600160a01b031633146111e55760405162461bcd60e51b81526020600482018190526024820152600080516020612a858339815191526044820152606401610a8b565b6111ef6000611f7f565b565b6060600280546108e590612976565b6001600160a01b03821633141561122a5760405163b06307db60e01b815260040160405180910390fd5b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6112a1848484611b8f565b6112ad84848484611fd1565b6112ca576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6007546001600160a01b031633146113185760405162461bcd60e51b81526020600482018190526024820152600080516020612a858339815191526044820152606401610a8b565b600c805491151563010000000263ff00000019909216919091179055565b6060611343826000541190565b6113a75760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a8b565b60106113b2836120e0565b6040516020016113c39291906127f2565b6040516020818303038152906040529050919050565b600c5460ff166114235760405162461bcd60e51b81526020600482015260156024820152742737ba1037b832b7103337b91036b4b73a34b7339760591b6044820152606401610a8b565b600c54610100900460ff166114845760405162461bcd60e51b815260206004820152602160248201527f54696572204f6e65206973206e6f74206f70656e20666f72206d696e74696e676044820152601760f91b6064820152608401610a8b565b6040516bffffffffffffffffffffffff193360601b1660208201526000906034016040516020818303038152906040528051906020012090506114fe84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600d5491508490506121f6565b61153b5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b210383937b7b31760911b6044820152606401610a8b565b6009548261154860005490565b61155291906128e8565b111561158e5760405162461bcd60e51b815260206004820152600b60248201526a4d696e746564204f75742160a81b6044820152606401610a8b565b600a54336000908152600f60205260409020546115ac9084906128e8565b11156115e85760405162461bcd60e51b815260206004820152601b6024820152600080516020612a658339815191526044820152606401610a8b565b600a548211156116285760405162461bcd60e51b815260206004820152601b6024820152600080516020612a658339815191526044820152606401610a8b565b3461163b83670134bb16eefb4000612914565b11156116835760405162461bcd60e51b815260206004820152601760248201527624ba1034b9901817181c1b1c903832b9103a37b5b2b71760491b6044820152606401610a8b565b600b548261169060005490565b61169a91906128e8565b101580156116b15750600c5462010000900460ff16155b156116c857600c805462ff00001916620100001790555b336000908152600f6020526040812080548492906116e79084906128e8565b909155506112ca90503383611db7565b6010805461170490612976565b80601f016020809104026020016040519081016040528092919081815260200182805461173090612976565b801561177d5780601f106117525761010080835404028352916020019161177d565b820191906000526020600020905b81548152906001019060200180831161176057829003601f168201915b505050505081565b600c5460ff166117cf5760405162461bcd60e51b81526020600482015260156024820152742737ba1037b832b7103337b91036b4b73a34b7339760591b6044820152606401610a8b565b600c5462010000900460ff166118315760405162461bcd60e51b815260206004820152602160248201527f546965722054776f206973206e6f74206f70656e20666f72206d696e74696e676044820152601760f91b6064820152608401610a8b565b6040516bffffffffffffffffffffffff193360601b1660208201526000906034016040516020818303038152906040528051906020012090506118ab84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e5491508490506121f6565b6118e85760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b210383937b7b31760911b6044820152606401610a8b565b600954826118f560005490565b6118ff91906128e8565b111561193b5760405162461bcd60e51b815260206004820152600b60248201526a4d696e746564204f75742160a81b6044820152606401610a8b565b600a54336000908152600f60205260409020546119599084906128e8565b11156119955760405162461bcd60e51b815260206004820152601b6024820152600080516020612a658339815191526044820152606401610a8b565b600a548211156119d55760405162461bcd60e51b815260206004820152601b6024820152600080516020612a658339815191526044820152606401610a8b565b346119e883670134bb16eefb4000612914565b11156116c85760405162461bcd60e51b815260206004820152601760248201527624ba1034b9901817181c1b1c903832b9103a37b5b2b71760491b6044820152606401610a8b565b6007546001600160a01b03163314611a785760405162461bcd60e51b81526020600482018190526024820152600080516020612a858339815191526044820152606401610a8b565b600e55565b6007546001600160a01b03163314611ac55760405162461bcd60e51b81526020600482018190526024820152600080516020612a858339815191526044820152606401610a8b565b6001600160a01b038116611b2a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a8b565b610cc181611f7f565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b9a82611eea565b80519091506000906001600160a01b0316336001600160a01b03161480611bc857508151611bc890336107ee565b80611be3575033611bd884610968565b6001600160a01b0316145b905080611c0357604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b031614611c385760405162a1148160e81b815260040160405180910390fd5b6001600160a01b038416611c5f57604051633a954ecd60e21b815260040160405180910390fd5b611c6f6000848460000151611b33565b6001600160a01b03858116600090815260046020908152604080832080546fffffffffffffffffffffffffffffffff198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b4267ffffffffffffffff1602179055908601808352912054909116611d6d57611d20816000541190565b15611d6d578251600082815260036020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b6110d782826040518060200160405280600081525061220c565b80471015611e215760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610a8b565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611e6e576040519150601f19603f3d011682016040523d82523d6000602084013e611e73565b606091505b5050905080610a375760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610a8b565b6040805180820190915260008082526020820152611f09826000541190565b611f2657604051636f96cda160e11b815260040160405180910390fd5b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611f75579392505050565b5060001901611f28565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b156120d457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612015903390899088908890600401612899565b602060405180830381600087803b15801561202f57600080fd5b505af192505050801561205f575060408051601f3d908101601f1916820190925261205c91810190612744565b60015b6120ba573d80801561208d576040519150601f19603f3d011682016040523d82523d6000602084013e612092565b606091505b5080516120b2576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506120d8565b5060015b949350505050565b6060816121045750506040805180820190915260018152600360fc1b602082015290565b8160005b811561212e5780612118816129b1565b91506121279050600a83612900565b9150612108565b60008167ffffffffffffffff81111561214957612149612a38565b6040519080825280601f01601f191660200182016040528015612173576020820181803683370190505b5090505b84156120d857612188600183612933565b9150612195600a866129cc565b6121a09060306128e8565b60f81b8183815181106121b5576121b5612a22565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506121ef600a86612900565b9450612177565b6000826122038584612219565b14949350505050565b610a37838383600161228d565b600081815b845181101561228557600085828151811061223b5761223b612a22565b602002602001015190508083116122615760008381526020829052604090209250612272565b600081815260208490526040902092505b508061227d816129b1565b91505061221e565b509392505050565b6000546001600160a01b0385166122b657604051622e076360e81b815260040160405180910390fd5b836122d45760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03851660008181526004602090815260408083208054600160801b6fffffffffffffffffffffffffffffffff1982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b4267ffffffffffffffff16021790915581905b858110156123dc5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48380156123b257506123b06000888488611fd1565b155b156123d0576040516368d2bf6b60e11b815260040160405180910390fd5b6001918201910161235b565b50600055611db0565b8280546123f190612976565b90600052602060002090601f0160209004810192826124135760008555612459565b82601f1061242c57805160ff1916838001178555612459565b82800160010185558215612459579182015b8281111561245957825182559160200191906001019061243e565b506110789291505b808211156110785760008155600101612461565b600067ffffffffffffffff8084111561249057612490612a38565b604051601f8501601f19908116603f011681019082821181831017156124b8576124b8612a38565b816040528093508581528686860111156124d157600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461250257600080fd5b919050565b8035801515811461250257600080fd5b60006020828403121561252957600080fd5b612532826124eb565b9392505050565b6000806040838503121561254c57600080fd5b612555836124eb565b9150612563602084016124eb565b90509250929050565b60008060006060848603121561258157600080fd5b61258a846124eb565b9250612598602085016124eb565b9150604084013590509250925092565b600080600080608085870312156125be57600080fd5b6125c7856124eb565b93506125d5602086016124eb565b925060408501359150606085013567ffffffffffffffff8111156125f857600080fd5b8501601f8101871361260957600080fd5b61261887823560208401612475565b91505092959194509250565b6000806040838503121561263757600080fd5b612640836124eb565b915061256360208401612507565b6000806040838503121561266157600080fd5b61266a836124eb565b946020939093013593505050565b60008060006040848603121561268d57600080fd5b833567ffffffffffffffff808211156126a557600080fd5b818601915086601f8301126126b957600080fd5b8135818111156126c857600080fd5b8760208260051b85010111156126dd57600080fd5b6020928301989097509590910135949350505050565b60006020828403121561270557600080fd5b61253282612507565b60006020828403121561272057600080fd5b5035919050565b60006020828403121561273957600080fd5b813561253281612a4e565b60006020828403121561275657600080fd5b815161253281612a4e565b60006020828403121561277357600080fd5b813567ffffffffffffffff81111561278a57600080fd5b8201601f8101841361279b57600080fd5b6120d884823560208401612475565b600081518084526127c281602086016020860161294a565b601f01601f19169290920160200192915050565b600081516127e881856020860161294a565b9290920192915050565b600080845481600182811c91508083168061280e57607f831692505b602080841082141561282e57634e487b7160e01b86526022600452602486fd5b818015612842576001811461285357612880565b60ff19861689528489019650612880565b60008b81526020902060005b868110156128785781548b82015290850190830161285f565b505084890196505b50505050505061289081856127d6565b95945050505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526128cb60808301846127aa565b9695505050505050565b60208152600061253260208301846127aa565b600082198211156128fb576128fb6129f6565b500190565b60008261290f5761290f612a0c565b500490565b600081600019048311821515161561292e5761292e6129f6565b500290565b600082821015612945576129456129f6565b500390565b60005b8381101561296557818101518382015260200161294d565b838111156112ca5750506000910152565b600181811c9082168061298a57607f821691505b602082108114156129ab57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156129c5576129c56129f6565b5060010190565b6000826129db576129db612a0c565b500690565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610cc157600080fdfe43616e206f6e6c79206d696e742033207065722077616c6c65742e00000000004f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220c31cdd21ef5d75cdc1f5dfc67d0084441255798e8adefba71599ef7bf662854b64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102dd5760003560e01c806370a082311161017f578063bc951b91116100e1578063d1da3e941161008a578063e985e9c511610064578063e985e9c5146107d3578063f2fde38b1461081c578063fa30297e1461083c57600080fd5b8063d1da3e941461078a578063d5abeb011461079d578063e346d7b1146107b357600080fd5b8063c87b56dd116100bb578063c87b56dd14610742578063cd07863514610762578063cfc86f7b1461077557600080fd5b8063bc951b91146106f4578063c051e38a1461070a578063c48156af1461072257600080fd5b80638da5cb5b1161014357806395d89b411161011d57806395d89b411461069f578063a22cb465146106b4578063b88d4fde146106d457600080fd5b80638da5cb5b1461064a57806392cca8141461066857806395527a121461067e57600080fd5b806370a08231146105c3578063715018a6146105e35780637b1b1de6146105f85780638088f473146106145780638b1f2e8e1461062a57600080fd5b806332ffeae8116102435780634c85c7ab116101ec5780636352211e116101c65780636352211e14610565578063640bd9391461058557806366cb5118146105a557600080fd5b80634c85c7ab146105085780634f6ccce71461052557806355f804b31461054557600080fd5b806342842e0e1161021d57806342842e0e146104ae57806343f389aa146104ce578063471a4294146104ee57600080fd5b806332ffeae8146104635780633ccfd60b146104835780633d447c961461049857600080fd5b80632173e284116102a557806326412aca1161027f57806326412aca146104105780632db11544146104305780632f745c591461044357600080fd5b80632173e284146103b257806322ab47a1146103d157806323b872dd146103f057600080fd5b806301ffc9a7146102e257806306fdde0314610317578063081812fc14610339578063095ea7b31461037157806318160ddd14610393575b600080fd5b3480156102ee57600080fd5b506103026102fd366004612727565b610869565b60405190151581526020015b60405180910390f35b34801561032357600080fd5b5061032c6108d6565b60405161030e91906128d5565b34801561034557600080fd5b5061035961035436600461270e565b610968565b6040516001600160a01b03909116815260200161030e565b34801561037d57600080fd5b5061039161038c36600461264e565b6109ae565b005b34801561039f57600080fd5b506000545b60405190815260200161030e565b3480156103be57600080fd5b50600c5461030290610100900460ff1681565b3480156103dd57600080fd5b50600c546301000000900460ff16610302565b3480156103fc57600080fd5b5061039161040b36600461256c565b610a3c565b34801561041c57600080fd5b5061039161042b3660046126f3565b610a47565b61039161043e36600461270e565b610aa7565b34801561044f57600080fd5b506103a461045e36600461264e565b610cc4565b34801561046f57600080fd5b5061039161047e36600461270e565b610d99565b34801561048f57600080fd5b50610391610de6565b3480156104a457600080fd5b506103a4600b5481565b3480156104ba57600080fd5b506103916104c936600461256c565b610fd6565b3480156104da57600080fd5b506103916104e93660046126f3565b610ff1565b3480156104fa57600080fd5b50600c546103029060ff1681565b34801561051457600080fd5b50600c54610100900460ff16610302565b34801561053157600080fd5b506103a461054036600461270e565b611055565b34801561055157600080fd5b50610391610560366004612761565b61107c565b34801561057157600080fd5b5061035961058036600461270e565b6110db565b34801561059157600080fd5b506103916105a03660046126f3565b6110ed565b3480156105b157600080fd5b50600c5462010000900460ff16610302565b3480156105cf57600080fd5b506103a46105de366004612517565b61114f565b3480156105ef57600080fd5b5061039161119d565b34801561060457600080fd5b506103a4670134bb16eefb400081565b34801561062057600080fd5b506103a4600e5481565b34801561063657600080fd5b50600c546103029062010000900460ff1681565b34801561065657600080fd5b506007546001600160a01b0316610359565b34801561067457600080fd5b506103a4600d5481565b34801561068a57600080fd5b50600c54610302906301000000900460ff1681565b3480156106ab57600080fd5b5061032c6111f1565b3480156106c057600080fd5b506103916106cf366004612624565b611200565b3480156106e057600080fd5b506103916106ef3660046125a8565b611296565b34801561070057600080fd5b506103a4600a5481565b34801561071657600080fd5b50600c5460ff16610302565b34801561072e57600080fd5b5061039161073d3660046126f3565b6112d0565b34801561074e57600080fd5b5061032c61075d36600461270e565b611336565b610391610770366004612678565b6113d9565b34801561078157600080fd5b5061032c6116f7565b610391610798366004612678565b611785565b3480156107a957600080fd5b506103a460095481565b3480156107bf57600080fd5b506103916107ce36600461270e565b611a30565b3480156107df57600080fd5b506103026107ee366004612539565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561082857600080fd5b50610391610837366004612517565b611a7d565b34801561084857600080fd5b506103a4610857366004612517565b600f6020526000908152604090205481565b60006001600160e01b031982166380ac58cd60e01b148061089a57506001600160e01b03198216635b5e139f60e01b145b806108b557506001600160e01b0319821663780e9d6360e01b145b806108d057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546108e590612976565b80601f016020809104026020016040519081016040528092919081815260200182805461091190612976565b801561095e5780601f106109335761010080835404028352916020019161095e565b820191906000526020600020905b81548152906001019060200180831161094157829003601f168201915b5050505050905090565b6000610975826000541190565b610992576040516333d1c03960e21b815260040160405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006109b9826110db565b9050806001600160a01b0316836001600160a01b031614156109ee5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610a0e5750610a0c81336107ee565b155b15610a2c576040516367d9dca160e11b815260040160405180910390fd5b610a37838383611b33565b505050565b610a37838383611b8f565b6007546001600160a01b03163314610a945760405162461bcd60e51b81526020600482018190526024820152600080516020612a8583398151915260448201526064015b60405180910390fd5b600c805460ff1916911515919091179055565b600c5460ff16610af15760405162461bcd60e51b81526020600482015260156024820152742737ba1037b832b7103337b91036b4b73a34b7339760591b6044820152606401610a8b565b600c546301000000900460ff16610b4a5760405162461bcd60e51b815260206004820152601c60248201527f4e6f74206f70656e20666f72207075626c6963206d696e74696e672e000000006044820152606401610a8b565b60095481610b5760005490565b610b6191906128e8565b1115610b9d5760405162461bcd60e51b815260206004820152600b60248201526a4d696e746564204f75742160a81b6044820152606401610a8b565b600a54336000908152600f6020526040902054610bbb9083906128e8565b1115610bf75760405162461bcd60e51b815260206004820152601b6024820152600080516020612a658339815191526044820152606401610a8b565b600a54811115610c375760405162461bcd60e51b815260206004820152601b6024820152600080516020612a658339815191526044820152606401610a8b565b34610c4a82670134bb16eefb4000612914565b1115610c925760405162461bcd60e51b815260206004820152601760248201527624ba1034b9901817181c1b1c903832b9103a37b5b2b71760491b6044820152606401610a8b565b336000908152600f602052604081208054839290610cb19084906128e8565b90915550610cc190503382611db7565b50565b6000610ccf8361114f565b8210610cee576040516306ed618760e11b815260040160405180910390fd5b600080549080805b83811015610d87576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610d4957805192505b876001600160a01b0316836001600160a01b03161415610d7e5786841415610d77575093506108d092505050565b6001909301925b50600101610cf6565b50610d906129e0565b50505092915050565b6007546001600160a01b03163314610de15760405162461bcd60e51b81526020600482018190526024820152600080516020612a858339815191526044820152606401610a8b565b600d55565b6007546001600160a01b03163314610e2e5760405162461bcd60e51b81526020600482018190526024820152600080516020612a858339815191526044820152606401610a8b565b60026008541415610e815760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a8b565b600260085547610ebd7331c1b03ec94ec958dd6e53351f1760f8ff72946b612710610eae84610810612914565b610eb89190612900565b611dd1565b610ee4737f8173fcfeb72182c500e95aaadfb03c6ba60d50612710610eae84610810612914565b610f0b73ebfa94bdaa4ee2361ff8997124d6ff0b3be9ff0b612710610eae84610810612914565b610f3273661244c796d5b8941414486a728567ef558a38d2612710610eae846101b7612914565b610f59737e9656c4b7f56fa280ba20d1667c8cdd923fe9bd612710610eae846102b7612914565b610f80739d5025b327e6b863e5050141c987d988c07fd8b2612710610eae8461054a612914565b610fa773b10d3f89bd5ff1d7c7ac18e18d7ccae2a89fa00d612710610eae84610294612914565b610fce73b68bace12f832b72c3169b8de865e07806c32923612710610eae84610294612914565b506001600855565b610a3783838360405180602001604052806000815250611296565b6007546001600160a01b031633146110395760405162461bcd60e51b81526020600482018190526024820152600080516020612a858339815191526044820152606401610a8b565b600c8054911515620100000262ff000019909216919091179055565b600080548210611078576040516329c8c00760e21b815260040160405180910390fd5b5090565b6007546001600160a01b031633146110c45760405162461bcd60e51b81526020600482018190526024820152600080516020612a858339815191526044820152606401610a8b565b80516110d79060109060208401906123e5565b5050565b60006110e682611eea565b5192915050565b6007546001600160a01b031633146111355760405162461bcd60e51b81526020600482018190526024820152600080516020612a858339815191526044820152606401610a8b565b600c80549115156101000261ff0019909216919091179055565b60006001600160a01b038216611178576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6007546001600160a01b031633146111e55760405162461bcd60e51b81526020600482018190526024820152600080516020612a858339815191526044820152606401610a8b565b6111ef6000611f7f565b565b6060600280546108e590612976565b6001600160a01b03821633141561122a5760405163b06307db60e01b815260040160405180910390fd5b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6112a1848484611b8f565b6112ad84848484611fd1565b6112ca576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6007546001600160a01b031633146113185760405162461bcd60e51b81526020600482018190526024820152600080516020612a858339815191526044820152606401610a8b565b600c805491151563010000000263ff00000019909216919091179055565b6060611343826000541190565b6113a75760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a8b565b60106113b2836120e0565b6040516020016113c39291906127f2565b6040516020818303038152906040529050919050565b600c5460ff166114235760405162461bcd60e51b81526020600482015260156024820152742737ba1037b832b7103337b91036b4b73a34b7339760591b6044820152606401610a8b565b600c54610100900460ff166114845760405162461bcd60e51b815260206004820152602160248201527f54696572204f6e65206973206e6f74206f70656e20666f72206d696e74696e676044820152601760f91b6064820152608401610a8b565b6040516bffffffffffffffffffffffff193360601b1660208201526000906034016040516020818303038152906040528051906020012090506114fe84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600d5491508490506121f6565b61153b5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b210383937b7b31760911b6044820152606401610a8b565b6009548261154860005490565b61155291906128e8565b111561158e5760405162461bcd60e51b815260206004820152600b60248201526a4d696e746564204f75742160a81b6044820152606401610a8b565b600a54336000908152600f60205260409020546115ac9084906128e8565b11156115e85760405162461bcd60e51b815260206004820152601b6024820152600080516020612a658339815191526044820152606401610a8b565b600a548211156116285760405162461bcd60e51b815260206004820152601b6024820152600080516020612a658339815191526044820152606401610a8b565b3461163b83670134bb16eefb4000612914565b11156116835760405162461bcd60e51b815260206004820152601760248201527624ba1034b9901817181c1b1c903832b9103a37b5b2b71760491b6044820152606401610a8b565b600b548261169060005490565b61169a91906128e8565b101580156116b15750600c5462010000900460ff16155b156116c857600c805462ff00001916620100001790555b336000908152600f6020526040812080548492906116e79084906128e8565b909155506112ca90503383611db7565b6010805461170490612976565b80601f016020809104026020016040519081016040528092919081815260200182805461173090612976565b801561177d5780601f106117525761010080835404028352916020019161177d565b820191906000526020600020905b81548152906001019060200180831161176057829003601f168201915b505050505081565b600c5460ff166117cf5760405162461bcd60e51b81526020600482015260156024820152742737ba1037b832b7103337b91036b4b73a34b7339760591b6044820152606401610a8b565b600c5462010000900460ff166118315760405162461bcd60e51b815260206004820152602160248201527f546965722054776f206973206e6f74206f70656e20666f72206d696e74696e676044820152601760f91b6064820152608401610a8b565b6040516bffffffffffffffffffffffff193360601b1660208201526000906034016040516020818303038152906040528051906020012090506118ab84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e5491508490506121f6565b6118e85760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b210383937b7b31760911b6044820152606401610a8b565b600954826118f560005490565b6118ff91906128e8565b111561193b5760405162461bcd60e51b815260206004820152600b60248201526a4d696e746564204f75742160a81b6044820152606401610a8b565b600a54336000908152600f60205260409020546119599084906128e8565b11156119955760405162461bcd60e51b815260206004820152601b6024820152600080516020612a658339815191526044820152606401610a8b565b600a548211156119d55760405162461bcd60e51b815260206004820152601b6024820152600080516020612a658339815191526044820152606401610a8b565b346119e883670134bb16eefb4000612914565b11156116c85760405162461bcd60e51b815260206004820152601760248201527624ba1034b9901817181c1b1c903832b9103a37b5b2b71760491b6044820152606401610a8b565b6007546001600160a01b03163314611a785760405162461bcd60e51b81526020600482018190526024820152600080516020612a858339815191526044820152606401610a8b565b600e55565b6007546001600160a01b03163314611ac55760405162461bcd60e51b81526020600482018190526024820152600080516020612a858339815191526044820152606401610a8b565b6001600160a01b038116611b2a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a8b565b610cc181611f7f565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b9a82611eea565b80519091506000906001600160a01b0316336001600160a01b03161480611bc857508151611bc890336107ee565b80611be3575033611bd884610968565b6001600160a01b0316145b905080611c0357604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b031614611c385760405162a1148160e81b815260040160405180910390fd5b6001600160a01b038416611c5f57604051633a954ecd60e21b815260040160405180910390fd5b611c6f6000848460000151611b33565b6001600160a01b03858116600090815260046020908152604080832080546fffffffffffffffffffffffffffffffff198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b4267ffffffffffffffff1602179055908601808352912054909116611d6d57611d20816000541190565b15611d6d578251600082815260036020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b6110d782826040518060200160405280600081525061220c565b80471015611e215760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610a8b565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611e6e576040519150601f19603f3d011682016040523d82523d6000602084013e611e73565b606091505b5050905080610a375760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610a8b565b6040805180820190915260008082526020820152611f09826000541190565b611f2657604051636f96cda160e11b815260040160405180910390fd5b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611f75579392505050565b5060001901611f28565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b156120d457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612015903390899088908890600401612899565b602060405180830381600087803b15801561202f57600080fd5b505af192505050801561205f575060408051601f3d908101601f1916820190925261205c91810190612744565b60015b6120ba573d80801561208d576040519150601f19603f3d011682016040523d82523d6000602084013e612092565b606091505b5080516120b2576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506120d8565b5060015b949350505050565b6060816121045750506040805180820190915260018152600360fc1b602082015290565b8160005b811561212e5780612118816129b1565b91506121279050600a83612900565b9150612108565b60008167ffffffffffffffff81111561214957612149612a38565b6040519080825280601f01601f191660200182016040528015612173576020820181803683370190505b5090505b84156120d857612188600183612933565b9150612195600a866129cc565b6121a09060306128e8565b60f81b8183815181106121b5576121b5612a22565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506121ef600a86612900565b9450612177565b6000826122038584612219565b14949350505050565b610a37838383600161228d565b600081815b845181101561228557600085828151811061223b5761223b612a22565b602002602001015190508083116122615760008381526020829052604090209250612272565b600081815260208490526040902092505b508061227d816129b1565b91505061221e565b509392505050565b6000546001600160a01b0385166122b657604051622e076360e81b815260040160405180910390fd5b836122d45760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03851660008181526004602090815260408083208054600160801b6fffffffffffffffffffffffffffffffff1982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b4267ffffffffffffffff16021790915581905b858110156123dc5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48380156123b257506123b06000888488611fd1565b155b156123d0576040516368d2bf6b60e11b815260040160405180910390fd5b6001918201910161235b565b50600055611db0565b8280546123f190612976565b90600052602060002090601f0160209004810192826124135760008555612459565b82601f1061242c57805160ff1916838001178555612459565b82800160010185558215612459579182015b8281111561245957825182559160200191906001019061243e565b506110789291505b808211156110785760008155600101612461565b600067ffffffffffffffff8084111561249057612490612a38565b604051601f8501601f19908116603f011681019082821181831017156124b8576124b8612a38565b816040528093508581528686860111156124d157600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461250257600080fd5b919050565b8035801515811461250257600080fd5b60006020828403121561252957600080fd5b612532826124eb565b9392505050565b6000806040838503121561254c57600080fd5b612555836124eb565b9150612563602084016124eb565b90509250929050565b60008060006060848603121561258157600080fd5b61258a846124eb565b9250612598602085016124eb565b9150604084013590509250925092565b600080600080608085870312156125be57600080fd5b6125c7856124eb565b93506125d5602086016124eb565b925060408501359150606085013567ffffffffffffffff8111156125f857600080fd5b8501601f8101871361260957600080fd5b61261887823560208401612475565b91505092959194509250565b6000806040838503121561263757600080fd5b612640836124eb565b915061256360208401612507565b6000806040838503121561266157600080fd5b61266a836124eb565b946020939093013593505050565b60008060006040848603121561268d57600080fd5b833567ffffffffffffffff808211156126a557600080fd5b818601915086601f8301126126b957600080fd5b8135818111156126c857600080fd5b8760208260051b85010111156126dd57600080fd5b6020928301989097509590910135949350505050565b60006020828403121561270557600080fd5b61253282612507565b60006020828403121561272057600080fd5b5035919050565b60006020828403121561273957600080fd5b813561253281612a4e565b60006020828403121561275657600080fd5b815161253281612a4e565b60006020828403121561277357600080fd5b813567ffffffffffffffff81111561278a57600080fd5b8201601f8101841361279b57600080fd5b6120d884823560208401612475565b600081518084526127c281602086016020860161294a565b601f01601f19169290920160200192915050565b600081516127e881856020860161294a565b9290920192915050565b600080845481600182811c91508083168061280e57607f831692505b602080841082141561282e57634e487b7160e01b86526022600452602486fd5b818015612842576001811461285357612880565b60ff19861689528489019650612880565b60008b81526020902060005b868110156128785781548b82015290850190830161285f565b505084890196505b50505050505061289081856127d6565b95945050505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526128cb60808301846127aa565b9695505050505050565b60208152600061253260208301846127aa565b600082198211156128fb576128fb6129f6565b500190565b60008261290f5761290f612a0c565b500490565b600081600019048311821515161561292e5761292e6129f6565b500290565b600082821015612945576129456129f6565b500390565b60005b8381101561296557818101518382015260200161294d565b838111156112ca5750506000910152565b600181811c9082168061298a57607f821691505b602082108114156129ab57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156129c5576129c56129f6565b5060010190565b6000826129db576129db612a0c565b500690565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610cc157600080fdfe43616e206f6e6c79206d696e742033207065722077616c6c65742e00000000004f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220c31cdd21ef5d75cdc1f5dfc67d0084441255798e8adefba71599ef7bf662854b64736f6c63430008070033

Deployed Bytecode Sourcemap

47890:5389:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30739:372;;;;;;;;;;-1:-1:-1;30739:372:0;;;;;:::i;:::-;;:::i;:::-;;;8189:14:1;;8182:22;8164:41;;8152:2;8137:18;30739:372:0;;;;;;;;32498:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33975:204::-;;;;;;;;;;-1:-1:-1;33975:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7441:55:1;;;7423:74;;7411:2;7396:18;33975:204:0;7277:226:1;33564:345:0;;;;;;;;;;-1:-1:-1;33564:345:0;;;;;:::i;:::-;;:::i;:::-;;29006:101;;;;;;;;;;-1:-1:-1;29059:7:0;29086:13;29006:101;;;8362:25:1;;;8350:2;8335:18;29006:101:0;8216:177:1;48228:39:0;;;;;;;;;;-1:-1:-1;48228:39:0;;;;;;;;;;;52582:92;;;;;;;;;;-1:-1:-1;52650:18:0;;;;;;;52582:92;;34832:170;;;;;;;;;;-1:-1:-1;34832:170:0;;;;;:::i;:::-;;:::i;51876:92::-;;;;;;;;;;-1:-1:-1;51876:92:0;;;;;:::i;:::-;;:::i;50291:600::-;;;;;;:::i;:::-;;:::i;29660:1007::-;;;;;;;;;;-1:-1:-1;29660:1007:0;;;;;:::i;:::-;;:::i;52680:110::-;;;;;;;;;;-1:-1:-1;52680:110:0;;;;;:::i;:::-;;:::i;51001:869::-;;;;;;;;;;;;;:::i;48144:42::-;;;;;;;;;;;;;;;;35073:185;;;;;;;;;;-1:-1:-1;35073:185:0;;;;;:::i;:::-;;:::i;52082:102::-;;;;;;;;;;-1:-1:-1;52082:102:0;;;;;:::i;:::-;;:::i;48191:32::-;;;;;;;;;;-1:-1:-1;48191:32:0;;;;;;;;52382:94;;;;;;;;;;-1:-1:-1;52451:19:0;;;;;;;52382:94;;29184:176;;;;;;;;;;-1:-1:-1;29184:176:0;;;;;:::i;:::-;;:::i;50897:98::-;;;;;;;;;;-1:-1:-1;50897:98:0;;;;;:::i;:::-;;:::i;32307:124::-;;;;;;;;;;-1:-1:-1;32307:124:0;;;;;:::i;:::-;;:::i;51974:102::-;;;;;;;;;;-1:-1:-1;51974:102:0;;;;;:::i;:::-;;:::i;52482:94::-;;;;;;;;;;-1:-1:-1;52551:19:0;;;;;;;52482:94;;31175:206;;;;;;;;;;-1:-1:-1;31175:206:0;;;;;:::i;:::-;;:::i;7524:103::-;;;;;;;;;;;;;:::i;48044:49::-;;;;;;;;;;;;48081:12;48044:49;;48394:28;;;;;;;;;;;;;;;;48272:39;;;;;;;;;;-1:-1:-1;48272:39:0;;;;;;;;;;;6873:87;;;;;;;;;;-1:-1:-1;6946:6:0;;-1:-1:-1;;;;;6946:6:0;6873:87;;48361:28;;;;;;;;;;;;;;;;48316:38;;;;;;;;;;-1:-1:-1;48316:38:0;;;;;;;;;;;32667:104;;;;;;;;;;;;;:::i;34251:279::-;;;;;;;;;;-1:-1:-1;34251:279:0;;;;;:::i;:::-;;:::i;35329:308::-;;;;;;;;;;-1:-1:-1;35329:308:0;;;;;:::i;:::-;;:::i;48098:41::-;;;;;;;;;;;;;;;;52296:80;;;;;;;;;;-1:-1:-1;52358:12:0;;;;52296:80;;52190:100;;;;;;;;;;-1:-1:-1;52190:100:0;;;;;:::i;:::-;;:::i;52912:250::-;;;;;;;;;;-1:-1:-1;52912:250:0;;;;;:::i;:::-;;:::i;48570:921::-;;;;;;:::i;:::-;;:::i;48484:27::-;;;;;;;;;;;;;:::i;49497:788::-;;;;;;:::i;:::-;;:::i;48008:31::-;;;;;;;;;;;;;;;;52796:110;;;;;;;;;;-1:-1:-1;52796:110:0;;;;;:::i;:::-;;:::i;34601:164::-;;;;;;;;;;-1:-1:-1;34601:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;34722:25:0;;;34698:4;34722:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34601:164;7782:201;;;;;;;;;;-1:-1:-1;7782:201:0;;;;;:::i;:::-;;:::i;48429:48::-;;;;;;;;;;-1:-1:-1;48429:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;30739:372;30841:4;-1:-1:-1;;;;;;30878:40:0;;-1:-1:-1;;;30878:40:0;;:105;;-1:-1:-1;;;;;;;30935:48:0;;-1:-1:-1;;;30935:48:0;30878:105;:172;;;-1:-1:-1;;;;;;;31000:50:0;;-1:-1:-1;;;31000:50:0;30878:172;:225;;;-1:-1:-1;;;;;;;;;;19766:40:0;;;31067:36;30858:245;30739:372;-1:-1:-1;;30739:372:0:o;32498:100::-;32552:13;32585:5;32578:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32498:100;:::o;33975:204::-;34043:7;34068:16;34076:7;35949:4;35983:13;-1:-1:-1;35973:23:0;35892:112;34068:16;34063:64;;34093:34;;-1:-1:-1;;;34093:34:0;;;;;;;;;;;34063:64;-1:-1:-1;34147:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;34147:24:0;;33975:204::o;33564:345::-;33637:13;33653:24;33669:7;33653:15;:24::i;:::-;33637:40;;33698:5;-1:-1:-1;;;;;33692:11:0;:2;-1:-1:-1;;;;;33692:11:0;;33688:48;;;33712:24;;-1:-1:-1;;;33712:24:0;;;;;;;;;;;33688:48;5677:10;-1:-1:-1;;;;;33753:21:0;;;;;;:63;;-1:-1:-1;33779:37:0;33796:5;5677:10;34601:164;:::i;33779:37::-;33778:38;33753:63;33749:111;;;33825:35;;-1:-1:-1;;;33825:35:0;;;;;;;;;;;33749:111;33873:28;33882:2;33886:7;33895:5;33873:8;:28::i;:::-;33626:283;33564:345;;:::o;34832:170::-;34966:28;34976:4;34982:2;34986:7;34966:9;:28::i;51876:92::-;6946:6;;-1:-1:-1;;;;;6946:6:0;5677:10;7093:23;7085:68;;;;-1:-1:-1;;;7085:68:0;;10724:2:1;7085:68:0;;;10706:21:1;;;10743:18;;;10736:30;-1:-1:-1;;;;;;;;;;;10782:18:1;;;10775:62;10854:18;;7085:68:0;;;;;;;;;51939:12:::1;:23:::0;;-1:-1:-1;;51939:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;51876:92::o;50291:600::-;50361:12;;;;50353:46;;;;-1:-1:-1;;;50353:46:0;;11501:2:1;50353:46:0;;;11483:21:1;11540:2;11520:18;;;11513:30;-1:-1:-1;;;11559:18:1;;;11552:51;11620:18;;50353:46:0;11299:345:1;50353:46:0;50414:18;;;;;;;50406:59;;;;-1:-1:-1;;;50406:59:0;;12593:2:1;50406:59:0;;;12575:21:1;12632:2;12612:18;;;12605:30;12671;12651:18;;;12644:58;12719:18;;50406:59:0;12391:352:1;50406:59:0;50508:9;;50496:8;50480:13;29059:7;29086:13;;29006:101;50480:13;:24;;;;:::i;:::-;:37;;50472:61;;;;-1:-1:-1;;;50472:61:0;;11851:2:1;50472:61:0;;;11833:21:1;11890:2;11870:18;;;11863:30;-1:-1:-1;;;11909:18:1;;;11902:41;11960:18;;50472:61:0;11649:335:1;50472:61:0;50588:22;;50562:10;50548:25;;;;:13;:25;;;;;;:36;;50576:8;;50548:36;:::i;:::-;:62;;50540:102;;;;-1:-1:-1;;;50540:102:0;;10016:2:1;50540:102:0;;;9998:21:1;10055:2;10035:18;;;10028:30;-1:-1:-1;;;;;;;;;;;10074:18:1;;;10067:57;10141:18;;50540:102:0;9814:351:1;50540:102:0;50669:22;;50657:8;:34;;50649:74;;;;-1:-1:-1;;;50649:74:0;;10016:2:1;50649:74:0;;;9998:21:1;10055:2;10035:18;;;10028:30;-1:-1:-1;;;;;;;;;;;10074:18:1;;;10067:57;10141:18;;50649:74:0;9814:351:1;50649:74:0;50766:9;50738:24;50754:8;48081:12;50738:24;:::i;:::-;:37;;50730:73;;;;-1:-1:-1;;;50730:73:0;;10372:2:1;50730:73:0;;;10354:21:1;10411:2;10391:18;;;10384:30;-1:-1:-1;;;10430:18:1;;;10423:53;10493:18;;50730:73:0;10170:347:1;50730:73:0;50824:10;50810:25;;;;:13;:25;;;;;:37;;50839:8;;50810:25;:37;;50839:8;;50810:37;:::i;:::-;;;;-1:-1:-1;50854:31:0;;-1:-1:-1;50864:10:0;50876:8;50854:9;:31::i;:::-;50291:600;:::o;29660:1007::-;29749:7;29782:16;29792:5;29782:9;:16::i;:::-;29773:5;:25;29769:61;;29807:23;;-1:-1:-1;;;29807:23:0;;;;;;;;;;;29769:61;29841:22;29086:13;;;29841:22;;30104:466;30124:14;30120:1;:18;30104:466;;;30164:31;30198:14;;;:11;:14;;;;;;;;;30164:48;;;;;;;;;-1:-1:-1;;;;;30164:48:0;;;;;-1:-1:-1;;;30164:48:0;;;;;;;;;;;;30235:28;30231:111;;30308:14;;;-1:-1:-1;30231:111:0;30385:5;-1:-1:-1;;;;;30364:26:0;:17;-1:-1:-1;;;;;30364:26:0;;30360:195;;;30434:5;30419:11;:20;30415:85;;;-1:-1:-1;30475:1:0;-1:-1:-1;30468:8:0;;-1:-1:-1;;;30468:8:0;30415:85;30522:13;;;;;30360:195;-1:-1:-1;30140:3:0;;30104:466;;;-1:-1:-1;30646:13:0;;:::i;:::-;29758:909;;;29660:1007;;;;:::o;52680:110::-;6946:6;;-1:-1:-1;;;;;6946:6:0;5677:10;7093:23;7085:68;;;;-1:-1:-1;;;7085:68:0;;10724:2:1;7085:68:0;;;10706:21:1;;;10743:18;;;10736:30;-1:-1:-1;;;;;;;;;;;10782:18:1;;;10775:62;10854:18;;7085:68:0;10522:356:1;7085:68:0;52755:13:::1;:29:::0;52680:110::o;51001:869::-;6946:6;;-1:-1:-1;;;;;6946:6:0;5677:10;7093:23;7085:68;;;;-1:-1:-1;;;7085:68:0;;10724:2:1;7085:68:0;;;10706:21:1;;;10743:18;;;10736:30;-1:-1:-1;;;;;;;;;;;10782:18:1;;;10775:62;10854:18;;7085:68:0;10522:356:1;7085:68:0;1847:1:::1;2445:7;;:19;;2437:63;;;::::0;-1:-1:-1;;;2437:63:0;;13293:2:1;2437:63:0::1;::::0;::::1;13275:21:1::0;13332:2;13312:18;;;13305:30;13371:33;13351:18;;;13344:61;13422:18;;2437:63:0::1;13091:355:1::0;2437:63:0::1;1847:1;2578:7;:18:::0;51071:21:::2;51099:90;51125:42;51183:5;51170:12;51071:21:::0;51178:4:::2;51170:12;:::i;:::-;:18;;;;:::i;:::-;51099:17;:90::i;:::-;51196;51222:42;51280:5;51267:12;:5:::0;51275:4:::2;51267:12;:::i;51196:90::-;51293;51319:42;51377:5;51364:12;:5:::0;51372:4:::2;51364:12;:::i;51293:90::-;51390:89;51416:42;51473:5;51461:11;:5:::0;51469:3:::2;51461:11;:::i;51390:89::-;51486;51512:42;51569:5;51557:11;:5:::0;51565:3:::2;51557:11;:::i;51486:89::-;51582:90;51608:42;51666:5;51653:12;:5:::0;51661:4:::2;51653:12;:::i;51582:90::-;51679:89;51705:42;51762:5;51750:11;:5:::0;51758:3:::2;51750:11;:::i;51679:89::-;51775;51801:42;51858:5;51846:11;:5:::0;51854:3:::2;51846:11;:::i;51775:89::-;-1:-1:-1::0;1803:1:0::1;2757:7;:22:::0;51001:869::o;35073:185::-;35211:39;35228:4;35234:2;35238:7;35211:39;;;;;;;;;;;;:16;:39::i;52082:102::-;6946:6;;-1:-1:-1;;;;;6946:6:0;5677:10;7093:23;7085:68;;;;-1:-1:-1;;;7085:68:0;;10724:2:1;7085:68:0;;;10706:21:1;;;10743:18;;;10736:30;-1:-1:-1;;;;;;;;;;;10782:18:1;;;10775:62;10854:18;;7085:68:0;10522:356:1;7085:68:0;52148:19:::1;:30:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;52148:30:0;;::::1;::::0;;;::::1;::::0;;52082:102::o;29184:176::-;29251:7;29086:13;;29275:5;:22;29271:58;;29306:23;;-1:-1:-1;;;29306:23:0;;;;;;;;;;;29271:58;-1:-1:-1;29347:5:0;29184:176::o;50897:98::-;6946:6;;-1:-1:-1;;;;;6946:6:0;5677:10;7093:23;7085:68;;;;-1:-1:-1;;;7085:68:0;;10724:2:1;7085:68:0;;;10706:21:1;;;10743:18;;;10736:30;-1:-1:-1;;;;;;;;;;;10782:18:1;;;10775:62;10854:18;;7085:68:0;10522:356:1;7085:68:0;50966:23;;::::1;::::0;:13:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;:::-;;50897:98:::0;:::o;32307:124::-;32371:7;32398:20;32410:7;32398:11;:20::i;:::-;:25;;32307:124;-1:-1:-1;;32307:124:0:o;51974:102::-;6946:6;;-1:-1:-1;;;;;6946:6:0;5677:10;7093:23;7085:68;;;;-1:-1:-1;;;7085:68:0;;10724:2:1;7085:68:0;;;10706:21:1;;;10743:18;;;10736:30;-1:-1:-1;;;;;;;;;;;10782:18:1;;;10775:62;10854:18;;7085:68:0;10522:356:1;7085:68:0;52040:19:::1;:30:::0;;;::::1;;;;-1:-1:-1::0;;52040:30:0;;::::1;::::0;;;::::1;::::0;;51974:102::o;31175:206::-;31239:7;-1:-1:-1;;;;;31263:19:0;;31259:60;;31291:28;;-1:-1:-1;;;31291:28:0;;;;;;;;;;;31259:60;-1:-1:-1;;;;;;31345:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;31345:27:0;;31175:206::o;7524:103::-;6946:6;;-1:-1:-1;;;;;6946:6:0;5677:10;7093:23;7085:68;;;;-1:-1:-1;;;7085:68:0;;10724:2:1;7085:68:0;;;10706:21:1;;;10743:18;;;10736:30;-1:-1:-1;;;;;;;;;;;10782:18:1;;;10775:62;10854:18;;7085:68:0;10522:356:1;7085:68:0;7589:30:::1;7616:1;7589:18;:30::i;:::-;7524:103::o:0;32667:104::-;32723:13;32756:7;32749:14;;;;;:::i;34251:279::-;-1:-1:-1;;;;;34342:24:0;;5677:10;34342:24;34338:54;;;34375:17;;-1:-1:-1;;;34375:17:0;;;;;;;;;;;34338:54;5677:10;34405:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;34405:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;34405:53:0;;;;;;;;;;34474:48;;8164:41:1;;;34405:42:0;;5677:10;34474:48;;8137:18:1;34474:48:0;;;;;;;34251:279;;:::o;35329:308::-;35488:28;35498:4;35504:2;35508:7;35488:9;:28::i;:::-;35532:48;35555:4;35561:2;35565:7;35574:5;35532:22;:48::i;:::-;35527:102;;35589:40;;-1:-1:-1;;;35589:40:0;;;;;;;;;;;35527:102;35329:308;;;;:::o;52190:100::-;6946:6;;-1:-1:-1;;;;;6946:6:0;5677:10;7093:23;7085:68;;;;-1:-1:-1;;;7085:68:0;;10724:2:1;7085:68:0;;;10706:21:1;;;10743:18;;;10736:30;-1:-1:-1;;;;;;;;;;;10782:18:1;;;10775:62;10854:18;;7085:68:0;10522:356:1;7085:68:0;52255:18:::1;:29:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;52255:29:0;;::::1;::::0;;;::::1;::::0;;52190:100::o;52912:250::-;52983:13;53013:17;53021:8;35949:4;35983:13;-1:-1:-1;35973:23:0;35892:112;53013:17;53005:77;;;;-1:-1:-1;;;53005:77:0;;11085:2:1;53005:77:0;;;11067:21:1;11124:2;11104:18;;;11097:30;11163:34;11143:18;;;11136:62;-1:-1:-1;;;11214:18:1;;;11207:45;11269:19;;53005:77:0;10883:411:1;53005:77:0;53120:13;53135:19;:8;:17;:19::i;:::-;53103:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53089:67;;52912:250;;;:::o;48570:921::-;48674:12;;;;48666:46;;;;-1:-1:-1;;;48666:46:0;;11501:2:1;48666:46:0;;;11483:21:1;11540:2;11520:18;;;11513:30;-1:-1:-1;;;11559:18:1;;;11552:51;11620:18;;48666:46:0;11299:345:1;48666:46:0;48727:19;;;;;;;48719:65;;;;-1:-1:-1;;;48719:65:0;;13653:2:1;48719:65:0;;;13635:21:1;13692:2;13672:18;;;13665:30;13731:34;13711:18;;;13704:62;-1:-1:-1;;;13782:18:1;;;13775:31;13823:19;;48719:65:0;13451:397:1;48719:65:0;48816:28;;-1:-1:-1;;48833:10:0;5803:2:1;5799:15;5795:53;48816:28:0;;;5783:66:1;48791:12:0;;5865::1;;48816:28:0;;;;;;;;;;;;48806:39;;;;;;48791:54;;48860:53;48879:12;;48860:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;48893:13:0;;;-1:-1:-1;48908:4:0;;-1:-1:-1;48860:18:0;:53::i;:::-;48852:80;;;;-1:-1:-1;;;48852:80:0;;12950:2:1;48852:80:0;;;12932:21:1;12989:2;12969:18;;;12962:30;-1:-1:-1;;;13008:18:1;;;13001:44;13062:18;;48852:80:0;12748:338:1;48852:80:0;48975:9;;48963:8;48947:13;29059:7;29086:13;;29006:101;48947:13;:24;;;;:::i;:::-;:37;;48939:61;;;;-1:-1:-1;;;48939:61:0;;11851:2:1;48939:61:0;;;11833:21:1;11890:2;11870:18;;;11863:30;-1:-1:-1;;;11909:18:1;;;11902:41;11960:18;;48939:61:0;11649:335:1;48939:61:0;49055:22;;49029:10;49015:25;;;;:13;:25;;;;;;:36;;49043:8;;49015:36;:::i;:::-;:62;;49007:102;;;;-1:-1:-1;;;49007:102:0;;10016:2:1;49007:102:0;;;9998:21:1;10055:2;10035:18;;;10028:30;-1:-1:-1;;;;;;;;;;;10074:18:1;;;10067:57;10141:18;;49007:102:0;9814:351:1;49007:102:0;49136:22;;49124:8;:34;;49116:74;;;;-1:-1:-1;;;49116:74:0;;10016:2:1;49116:74:0;;;9998:21:1;10055:2;10035:18;;;10028:30;-1:-1:-1;;;;;;;;;;;10074:18:1;;;10067:57;10141:18;;49116:74:0;9814:351:1;49116:74:0;49233:9;49205:24;49221:8;48081:12;49205:24;:::i;:::-;:37;;49197:73;;;;-1:-1:-1;;;49197:73:0;;10372:2:1;49197:73:0;;;10354:21:1;10411:2;10391:18;;;10384:30;-1:-1:-1;;;10430:18:1;;;10423:53;10493:18;;49197:73:0;10170:347:1;49197:73:0;49310:20;;49298:8;49282:13;29059:7;29086:13;;29006:101;49282:13;:24;;;;:::i;:::-;:48;;49281:76;;;;-1:-1:-1;49337:19:0;;;;;;;49336:20;49281:76;49277:127;;;49370:19;:26;;-1:-1:-1;;49370:26:0;;;;;49277:127;49424:10;49410:25;;;;:13;:25;;;;;:37;;49439:8;;49410:25;:37;;49439:8;;49410:37;:::i;:::-;;;;-1:-1:-1;49454:31:0;;-1:-1:-1;49464:10:0;49476:8;49454:9;:31::i;48484:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49497:788::-;49601:12;;;;49593:46;;;;-1:-1:-1;;;49593:46:0;;11501:2:1;49593:46:0;;;11483:21:1;11540:2;11520:18;;;11513:30;-1:-1:-1;;;11559:18:1;;;11552:51;11620:18;;49593:46:0;11299:345:1;49593:46:0;49654:19;;;;;;;49646:65;;;;-1:-1:-1;;;49646:65:0;;12191:2:1;49646:65:0;;;12173:21:1;12230:2;12210:18;;;12203:30;12269:34;12249:18;;;12242:62;-1:-1:-1;;;12320:18:1;;;12313:31;12361:19;;49646:65:0;11989:397:1;49646:65:0;49743:28;;-1:-1:-1;;49760:10:0;5803:2:1;5799:15;5795:53;49743:28:0;;;5783:66:1;49718:12:0;;5865::1;;49743:28:0;;;;;;;;;;;;49733:39;;;;;;49718:54;;49787:53;49806:12;;49787:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49820:13:0;;;-1:-1:-1;49835:4:0;;-1:-1:-1;49787:18:0;:53::i;:::-;49779:80;;;;-1:-1:-1;;;49779:80:0;;12950:2:1;49779:80:0;;;12932:21:1;12989:2;12969:18;;;12962:30;-1:-1:-1;;;13008:18:1;;;13001:44;13062:18;;49779:80:0;12748:338:1;49779:80:0;49902:9;;49890:8;49874:13;29059:7;29086:13;;29006:101;49874:13;:24;;;;:::i;:::-;:37;;49866:61;;;;-1:-1:-1;;;49866:61:0;;11851:2:1;49866:61:0;;;11833:21:1;11890:2;11870:18;;;11863:30;-1:-1:-1;;;11909:18:1;;;11902:41;11960:18;;49866:61:0;11649:335:1;49866:61:0;49982:22;;49956:10;49942:25;;;;:13;:25;;;;;;:36;;49970:8;;49942:36;:::i;:::-;:62;;49934:102;;;;-1:-1:-1;;;49934:102:0;;10016:2:1;49934:102:0;;;9998:21:1;10055:2;10035:18;;;10028:30;-1:-1:-1;;;;;;;;;;;10074:18:1;;;10067:57;10141:18;;49934:102:0;9814:351:1;49934:102:0;50063:22;;50051:8;:34;;50043:74;;;;-1:-1:-1;;;50043:74:0;;10016:2:1;50043:74:0;;;9998:21:1;10055:2;10035:18;;;10028:30;-1:-1:-1;;;;;;;;;;;10074:18:1;;;10067:57;10141:18;;50043:74:0;9814:351:1;50043:74:0;50160:9;50132:24;50148:8;48081:12;50132:24;:::i;:::-;:37;;50124:73;;;;-1:-1:-1;;;50124:73:0;;10372:2:1;50124:73:0;;;10354:21:1;10411:2;10391:18;;;10384:30;-1:-1:-1;;;10430:18:1;;;10423:53;10493:18;;50124:73:0;10170:347:1;52796:110:0;6946:6;;-1:-1:-1;;;;;6946:6:0;5677:10;7093:23;7085:68;;;;-1:-1:-1;;;7085:68:0;;10724:2:1;7085:68:0;;;10706:21:1;;;10743:18;;;10736:30;-1:-1:-1;;;;;;;;;;;10782:18:1;;;10775:62;10854:18;;7085:68:0;10522:356:1;7085:68:0;52871:13:::1;:29:::0;52796:110::o;7782:201::-;6946:6;;-1:-1:-1;;;;;6946:6:0;5677:10;7093:23;7085:68;;;;-1:-1:-1;;;7085:68:0;;10724:2:1;7085:68:0;;;10706:21:1;;;10743:18;;;10736:30;-1:-1:-1;;;;;;;;;;;10782:18:1;;;10775:62;10854:18;;7085:68:0;10522:356:1;7085:68:0;-1:-1:-1;;;;;7871:22:0;::::1;7863:73;;;::::0;-1:-1:-1;;;7863:73:0;;8824:2:1;7863:73:0::1;::::0;::::1;8806:21:1::0;8863:2;8843:18;;;8836:30;8902:34;8882:18;;;8875:62;-1:-1:-1;;;8953:18:1;;;8946:36;8999:19;;7863:73:0::1;8622:402:1::0;7863:73:0::1;7947:28;7966:8;7947:18;:28::i;40655:196::-:0;40770:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;40770:29:0;-1:-1:-1;;;;;40770:29:0;;;;;;;;;40815:28;;40770:24;;40815:28;;;;;;;40655:196;;;:::o;38575:1962::-;38690:35;38728:20;38740:7;38728:11;:20::i;:::-;38803:18;;38690:58;;-1:-1:-1;38761:22:0;;-1:-1:-1;;;;;38787:34:0;5677:10;-1:-1:-1;;;;;38787:34:0;;:101;;;-1:-1:-1;38855:18:0;;38838:50;;5677:10;34601:164;:::i;38838:50::-;38787:154;;;-1:-1:-1;5677:10:0;38905:20;38917:7;38905:11;:20::i;:::-;-1:-1:-1;;;;;38905:36:0;;38787:154;38761:181;;38960:17;38955:66;;38986:35;;-1:-1:-1;;;38986:35:0;;;;;;;;;;;38955:66;39058:4;-1:-1:-1;;;;;39036:26:0;:13;:18;;;-1:-1:-1;;;;;39036:26:0;;39032:67;;39071:28;;-1:-1:-1;;;39071:28:0;;;;;;;;;;;39032:67;-1:-1:-1;;;;;39114:16:0;;39110:52;;39139:23;;-1:-1:-1;;;39139:23:0;;;;;;;;;;;39110:52;39283:49;39300:1;39304:7;39313:13;:18;;;39283:8;:49::i;:::-;-1:-1:-1;;;;;39628:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;39628:31:0;;;-1:-1:-1;;;;;39628:31:0;;;-1:-1:-1;;39628:31:0;;;;;;;39674:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;39674:29:0;;;;;;;;;;;;;39720:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;39765:61:0;;;;-1:-1:-1;;;39810:15:0;39765:61;;;;;;40100:11;;;40130:24;;;;;:29;40100:11;;40130:29;40126:295;;40198:20;40206:11;35949:4;35983:13;-1:-1:-1;35973:23:0;35892:112;40198:20;40194:212;;;40275:18;;;40243:24;;;:11;:24;;;;;;;;:50;;40358:28;;;;40316:70;;-1:-1:-1;;;40316:70:0;-1:-1:-1;;;;;;40316:70:0;;;-1:-1:-1;;;;;40243:50:0;;;40316:70;;;;;;;40194:212;39603:829;40468:7;40464:2;-1:-1:-1;;;;;40449:27:0;40458:4;-1:-1:-1;;;;;40449:27:0;;;;;;;;;;;40487:42;38679:1858;;38575:1962;;;:::o;36012:104::-;36081:27;36091:2;36095:8;36081:27;;;;;;;;;;;;:9;:27::i;10835:317::-;10950:6;10925:21;:31;;10917:73;;;;-1:-1:-1;;;10917:73:0;;9658:2:1;10917:73:0;;;9640:21:1;9697:2;9677:18;;;9670:30;9736:31;9716:18;;;9709:59;9785:18;;10917:73:0;9456:353:1;10917:73:0;11004:12;11022:9;-1:-1:-1;;;;;11022:14:0;11044:6;11022:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11003:52;;;11074:7;11066:78;;;;-1:-1:-1;;;11066:78:0;;9231:2:1;11066:78:0;;;9213:21:1;9270:2;9250:18;;;9243:30;9309:34;9289:18;;;9282:62;9380:28;9360:18;;;9353:56;9426:19;;11066:78:0;9029:422:1;31798:447:0;-1:-1:-1;;;;;;;;;;;;;;;;;31898:16:0;31906:7;35949:4;35983:13;-1:-1:-1;35973:23:0;35892:112;31898:16;31893:61;;31923:31;;-1:-1:-1;;;31923:31:0;;;;;;;;;;;31893:61;32012:7;31992:235;32049:31;32083:17;;;:11;:17;;;;;;;;;32049:51;;;;;;;;;-1:-1:-1;;;;;32049:51:0;;;;;-1:-1:-1;;;32049:51:0;;;;;;;;;;;;32123:28;32119:93;;32183:9;31798:447;-1:-1:-1;;;31798:447:0:o;32119:93::-;-1:-1:-1;;;32022:6:0;31992:235;;8143:191;8236:6;;;-1:-1:-1;;;;;8253:17:0;;;-1:-1:-1;;;;;;8253:17:0;;;;;;;8286:40;;8236:6;;;8253:17;8236:6;;8286:40;;8217:16;;8286:40;8206:128;8143:191;:::o;41416:765::-;41571:4;-1:-1:-1;;;;;41592:13:0;;9869:19;:23;41588:586;;41628:72;;-1:-1:-1;;;41628:72:0;;-1:-1:-1;;;;;41628:36:0;;;;;:72;;5677:10;;41679:4;;41685:7;;41694:5;;41628:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41628:72:0;;;;;;;;-1:-1:-1;;41628:72:0;;;;;;;;;;;;:::i;:::-;;;41624:495;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41874:13:0;;41870:234;;41901:40;;-1:-1:-1;;;41901:40:0;;;;;;;;;;;41870:234;42054:6;42048:13;42039:6;42035:2;42031:15;42024:38;41624:495;-1:-1:-1;;;;;;41751:55:0;-1:-1:-1;;;41751:55:0;;-1:-1:-1;41744:62:0;;41588:586;-1:-1:-1;42158:4:0;41588:586;41416:765;;;;;;:::o;3159:723::-;3215:13;3436:10;3432:53;;-1:-1:-1;;3463:10:0;;;;;;;;;;;;-1:-1:-1;;;3463:10:0;;;;;3159:723::o;3432:53::-;3510:5;3495:12;3551:78;3558:9;;3551:78;;3584:8;;;;:::i;:::-;;-1:-1:-1;3607:10:0;;-1:-1:-1;3615:2:0;3607:10;;:::i;:::-;;;3551:78;;;3639:19;3671:6;3661:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3661:17:0;;3639:39;;3689:154;3696:10;;3689:154;;3723:11;3733:1;3723:11;;:::i;:::-;;-1:-1:-1;3792:10:0;3800:2;3792:5;:10;:::i;:::-;3779:24;;:2;:24;:::i;:::-;3766:39;;3749:6;3756;3749:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;3820:11:0;3829:2;3820:11;;:::i;:::-;;;3689:154;;44552:190;44677:4;44730;44701:25;44714:5;44721:4;44701:12;:25::i;:::-;:33;;44552:190;-1:-1:-1;;;;44552:190:0:o;36479:163::-;36602:32;36608:2;36612:8;36622:5;36629:4;36602:5;:32::i;45103:707::-;45213:7;45261:4;45213:7;45276:497;45300:5;:12;45296:1;:16;45276:497;;;45334:20;45357:5;45363:1;45357:8;;;;;;;;:::i;:::-;;;;;;;45334:31;;45400:12;45384;:28;45380:382;;45913:13;45968:15;;;46004:4;45997:15;;;46051:4;46035:21;;45512:57;;45380:382;;;45913:13;45968:15;;;46004:4;45997:15;;;46051:4;46035:21;;45689:57;;45380:382;-1:-1:-1;45314:3:0;;;;:::i;:::-;;;;45276:497;;;-1:-1:-1;45790:12:0;45103:707;-1:-1:-1;;;45103:707:0:o;36901:1420::-;37040:20;37063:13;-1:-1:-1;;;;;37091:16:0;;37087:48;;37116:19;;-1:-1:-1;;;37116:19:0;;;;;;;;;;;37087:48;37150:13;37146:44;;37172:18;;-1:-1:-1;;;37172:18:0;;;;;;;;;;;37146:44;-1:-1:-1;;;;;37543:16:0;;;;;;:12;:16;;;;;;;;:45;;-1:-1:-1;;;;;37543:45:0;;-1:-1:-1;;;;;37543:45:0;;;;;;;;;;37603:50;;;;;;;;;;;;;;37670:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;37720:66:0;;;;-1:-1:-1;;;37770:15:0;37720:66;;;;;;;37670:25;;37855:330;37875:8;37871:1;:12;37855:330;;;37914:38;;37939:12;;-1:-1:-1;;;;;37914:38:0;;;37931:1;;37914:38;;37931:1;;37914:38;37975:4;:68;;;;;37984:59;38015:1;38019:2;38023:12;38037:5;37984:22;:59::i;:::-;37983:60;37975:68;37971:164;;;38075:40;;-1:-1:-1;;;38075:40:0;;;;;;;;;;;37971:164;38155:14;;;;;37885:3;37855:330;;;-1:-1:-1;38201:13:0;:28;38253:60;35329:308;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:196::-;718:20;;-1:-1:-1;;;;;767:54:1;;757:65;;747:93;;836:1;833;826:12;747:93;650:196;;;:::o;851:160::-;916:20;;972:13;;965:21;955:32;;945:60;;1001:1;998;991:12;1016:186;1075:6;1128:2;1116:9;1107:7;1103:23;1099:32;1096:52;;;1144:1;1141;1134:12;1096:52;1167:29;1186:9;1167:29;:::i;:::-;1157:39;1016:186;-1:-1:-1;;;1016:186:1:o;1207:260::-;1275:6;1283;1336:2;1324:9;1315:7;1311:23;1307:32;1304:52;;;1352:1;1349;1342:12;1304:52;1375:29;1394:9;1375:29;:::i;:::-;1365:39;;1423:38;1457:2;1446:9;1442:18;1423:38;:::i;:::-;1413:48;;1207:260;;;;;:::o;1472:328::-;1549:6;1557;1565;1618:2;1606:9;1597:7;1593:23;1589:32;1586:52;;;1634:1;1631;1624:12;1586:52;1657:29;1676:9;1657:29;:::i;:::-;1647:39;;1705:38;1739:2;1728:9;1724:18;1705:38;:::i;:::-;1695:48;;1790:2;1779:9;1775:18;1762:32;1752:42;;1472:328;;;;;:::o;1805:666::-;1900:6;1908;1916;1924;1977:3;1965:9;1956:7;1952:23;1948:33;1945:53;;;1994:1;1991;1984:12;1945:53;2017:29;2036:9;2017:29;:::i;:::-;2007:39;;2065:38;2099:2;2088:9;2084:18;2065:38;:::i;:::-;2055:48;;2150:2;2139:9;2135:18;2122:32;2112:42;;2205:2;2194:9;2190:18;2177:32;2232:18;2224:6;2221:30;2218:50;;;2264:1;2261;2254:12;2218:50;2287:22;;2340:4;2332:13;;2328:27;-1:-1:-1;2318:55:1;;2369:1;2366;2359:12;2318:55;2392:73;2457:7;2452:2;2439:16;2434:2;2430;2426:11;2392:73;:::i;:::-;2382:83;;;1805:666;;;;;;;:::o;2476:254::-;2541:6;2549;2602:2;2590:9;2581:7;2577:23;2573:32;2570:52;;;2618:1;2615;2608:12;2570:52;2641:29;2660:9;2641:29;:::i;:::-;2631:39;;2689:35;2720:2;2709:9;2705:18;2689:35;:::i;2735:254::-;2803:6;2811;2864:2;2852:9;2843:7;2839:23;2835:32;2832:52;;;2880:1;2877;2870:12;2832:52;2903:29;2922:9;2903:29;:::i;:::-;2893:39;2979:2;2964:18;;;;2951:32;;-1:-1:-1;;;2735:254:1:o;2994:689::-;3089:6;3097;3105;3158:2;3146:9;3137:7;3133:23;3129:32;3126:52;;;3174:1;3171;3164:12;3126:52;3214:9;3201:23;3243:18;3284:2;3276:6;3273:14;3270:34;;;3300:1;3297;3290:12;3270:34;3338:6;3327:9;3323:22;3313:32;;3383:7;3376:4;3372:2;3368:13;3364:27;3354:55;;3405:1;3402;3395:12;3354:55;3445:2;3432:16;3471:2;3463:6;3460:14;3457:34;;;3487:1;3484;3477:12;3457:34;3542:7;3535:4;3525:6;3522:1;3518:14;3514:2;3510:23;3506:34;3503:47;3500:67;;;3563:1;3560;3553:12;3500:67;3594:4;3586:13;;;;3618:6;;-1:-1:-1;3656:20:1;;;;3643:34;;2994:689;-1:-1:-1;;;;2994:689:1:o;3688:180::-;3744:6;3797:2;3785:9;3776:7;3772:23;3768:32;3765:52;;;3813:1;3810;3803:12;3765:52;3836:26;3852:9;3836:26;:::i;3873:180::-;3932:6;3985:2;3973:9;3964:7;3960:23;3956:32;3953:52;;;4001:1;3998;3991:12;3953:52;-1:-1:-1;4024:23:1;;3873:180;-1:-1:-1;3873:180:1:o;4058:245::-;4116:6;4169:2;4157:9;4148:7;4144:23;4140:32;4137:52;;;4185:1;4182;4175:12;4137:52;4224:9;4211:23;4243:30;4267:5;4243:30;:::i;4308:249::-;4377:6;4430:2;4418:9;4409:7;4405:23;4401:32;4398:52;;;4446:1;4443;4436:12;4398:52;4478:9;4472:16;4497:30;4521:5;4497:30;:::i;4562:450::-;4631:6;4684:2;4672:9;4663:7;4659:23;4655:32;4652:52;;;4700:1;4697;4690:12;4652:52;4740:9;4727:23;4773:18;4765:6;4762:30;4759:50;;;4805:1;4802;4795:12;4759:50;4828:22;;4881:4;4873:13;;4869:27;-1:-1:-1;4859:55:1;;4910:1;4907;4900:12;4859:55;4933:73;4998:7;4993:2;4980:16;4975:2;4971;4967:11;4933:73;:::i;5202:257::-;5243:3;5281:5;5275:12;5308:6;5303:3;5296:19;5324:63;5380:6;5373:4;5368:3;5364:14;5357:4;5350:5;5346:16;5324:63;:::i;:::-;5441:2;5420:15;-1:-1:-1;;5416:29:1;5407:39;;;;5448:4;5403:50;;5202:257;-1:-1:-1;;5202:257:1:o;5464:185::-;5506:3;5544:5;5538:12;5559:52;5604:6;5599:3;5592:4;5585:5;5581:16;5559:52;:::i;:::-;5627:16;;;;;5464:185;-1:-1:-1;;5464:185:1:o;5888:1174::-;6064:3;6093:1;6126:6;6120:13;6156:3;6178:1;6206:9;6202:2;6198:18;6188:28;;6266:2;6255:9;6251:18;6288;6278:61;;6332:4;6324:6;6320:17;6310:27;;6278:61;6358:2;6406;6398:6;6395:14;6375:18;6372:38;6369:165;;;-1:-1:-1;;;6433:33:1;;6489:4;6486:1;6479:15;6519:4;6440:3;6507:17;6369:165;6550:18;6577:104;;;;6695:1;6690:320;;;;6543:467;;6577:104;-1:-1:-1;;6610:24:1;;6598:37;;6655:16;;;;-1:-1:-1;6577:104:1;;6690:320;14108:1;14101:14;;;14145:4;14132:18;;6785:1;6799:165;6813:6;6810:1;6807:13;6799:165;;;6891:14;;6878:11;;;6871:35;6934:16;;;;6828:10;;6799:165;;;6803:3;;6993:6;6988:3;6984:16;6977:23;;6543:467;;;;;;;7026:30;7052:3;7044:6;7026:30;:::i;:::-;7019:37;5888:1174;-1:-1:-1;;;;;5888:1174:1:o;7508:511::-;7702:4;-1:-1:-1;;;;;7812:2:1;7804:6;7800:15;7789:9;7782:34;7864:2;7856:6;7852:15;7847:2;7836:9;7832:18;7825:43;;7904:6;7899:2;7888:9;7884:18;7877:34;7947:3;7942:2;7931:9;7927:18;7920:31;7968:45;8008:3;7997:9;7993:19;7985:6;7968:45;:::i;:::-;7960:53;7508:511;-1:-1:-1;;;;;;7508:511:1:o;8398:219::-;8547:2;8536:9;8529:21;8510:4;8567:44;8607:2;8596:9;8592:18;8584:6;8567:44;:::i;14161:128::-;14201:3;14232:1;14228:6;14225:1;14222:13;14219:39;;;14238:18;;:::i;:::-;-1:-1:-1;14274:9:1;;14161:128::o;14294:120::-;14334:1;14360;14350:35;;14365:18;;:::i;:::-;-1:-1:-1;14399:9:1;;14294:120::o;14419:168::-;14459:7;14525:1;14521;14517:6;14513:14;14510:1;14507:21;14502:1;14495:9;14488:17;14484:45;14481:71;;;14532:18;;:::i;:::-;-1:-1:-1;14572:9:1;;14419:168::o;14592:125::-;14632:4;14660:1;14657;14654:8;14651:34;;;14665:18;;:::i;:::-;-1:-1:-1;14702:9:1;;14592:125::o;14722:258::-;14794:1;14804:113;14818:6;14815:1;14812:13;14804:113;;;14894:11;;;14888:18;14875:11;;;14868:39;14840:2;14833:10;14804:113;;;14935:6;14932:1;14929:13;14926:48;;;-1:-1:-1;;14970:1:1;14952:16;;14945:27;14722:258::o;14985:380::-;15064:1;15060:12;;;;15107;;;15128:61;;15182:4;15174:6;15170:17;15160:27;;15128:61;15235:2;15227:6;15224:14;15204:18;15201:38;15198:161;;;15281:10;15276:3;15272:20;15269:1;15262:31;15316:4;15313:1;15306:15;15344:4;15341:1;15334:15;15198:161;;14985:380;;;:::o;15370:135::-;15409:3;-1:-1:-1;;15430:17:1;;15427:43;;;15450:18;;:::i;:::-;-1:-1:-1;15497:1:1;15486:13;;15370:135::o;15510:112::-;15542:1;15568;15558:35;;15573:18;;:::i;:::-;-1:-1:-1;15607:9:1;;15510:112::o;15627:127::-;15688:10;15683:3;15679:20;15676:1;15669:31;15719:4;15716:1;15709:15;15743:4;15740:1;15733:15;15759:127;15820:10;15815:3;15811:20;15808:1;15801:31;15851:4;15848:1;15841:15;15875:4;15872:1;15865:15;15891:127;15952:10;15947:3;15943:20;15940:1;15933:31;15983:4;15980:1;15973:15;16007:4;16004:1;15997:15;16023:127;16084:10;16079:3;16075:20;16072:1;16065:31;16115:4;16112:1;16105:15;16139:4;16136:1;16129:15;16155:127;16216:10;16211:3;16207:20;16204:1;16197:31;16247:4;16244:1;16237:15;16271:4;16268:1;16261:15;16287:131;-1:-1:-1;;;;;;16361:32:1;;16351:43;;16341:71;;16408:1;16405;16398:12

Swarm Source

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