ETH Price: $3,512.06 (+4.70%)

Token

BaoGnosis (BaoGno)
 

Overview

Max Total Supply

298 BaoGno

Holders

298

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 BaoGno
0xCe9D5fDc295dA5c25C5b216DEdc30bc4B9247373
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
BaoGnosis

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-18
*/

// Sources flattened with hardhat v2.8.0 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]

// SPDX-License-Identifier: MIT
// 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/token/ERC721/[email protected]


// 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/[email protected]


// 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/token/ERC721/extensions/[email protected]


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

pragma solidity ^0.8.0;

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

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

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


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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @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/utils/[email protected]


// 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/utils/[email protected]


// 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/introspection/[email protected]


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


// Creator: Chiru Labs

pragma solidity ^0.8.4;
error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

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

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

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

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

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

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

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

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

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

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

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

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

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


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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File contracts/MerkleProof.sol



pragma solidity ^0.8.4;

/**
 * @dev These functions deal with verification of Merkle trees (hash trees),
 */
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) {
        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 = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }
}


// File contracts/BaoGnosis.sol

pragma solidity ^0.8.4;
contract BaoGnosis is ERC721A, Ownable {
        using Strings for uint256;
        using MerkleProof for bytes32[];

        uint256 public constant MAX_SUPPLY = 5000;
        uint256 public constant MAX_PER_CALL = 1;

        bytes32 public merkleRoot;

        string public uri;
        string public suffix;

        mapping(address => bool) public whitelistClaimed;

        uint256 public whitelistSale;

        event BaoGMinted(uint256 indexed tokenId, address indexed receiver);

        constructor(uint256 _whitelistSale, bytes32 _root) ERC721A("BaoGnosis", "BaoGno") {
                whitelistSale = _whitelistSale;
                merkleRoot = _root;
        }

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

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

        function updateURI(string memory _newURI) public onlyOwner {
                uri = _newURI;
        }

        function updateWhitelistSale(uint256 _whitelistSale) public onlyOwner {
                whitelistSale = _whitelistSale;
        }

        function updateMerkleRoot(bytes32 _root) external onlyOwner {
        merkleRoot = _root;
    }

        function updateSuffix(string memory _suffix) public onlyOwner {
                suffix = _suffix;
        }

        function mintBaoGWithSignature(bytes32[] calldata _proof) public {
                require(block.timestamp >= whitelistSale, "Public sale not ready");
                require(!whitelistClaimed[msg.sender], "Caller not part of tree");

                bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
                require (MerkleProof.verify(_proof, merkleRoot, leaf), "Invalid proof");

                whitelistClaimed[msg.sender] = true;

    uint256 supply = totalSupply();
    require(supply + 1 <= MAX_SUPPLY, "Can't mint over limit");
    _safeMint(msg.sender, 1);
    emit BaoGMinted(supply + 1, msg.sender);
 }

        function fetchEther() external onlyOwner {
                payable(msg.sender).transfer(address(this).balance);
        }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_whitelistSale","type":"uint256"},{"internalType":"bytes32","name":"_root","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"}],"name":"BaoGMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PER_CALL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fetchEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"mintBaoGWithSignature","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":[],"name":"suffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"updateMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_suffix","type":"string"}],"name":"updateSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"updateURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelistSale","type":"uint256"}],"name":"updateWhitelistSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50604051620039e1380380620039e18339818101604052810190620000379190620002d4565b6040518060400160405280600981526020017f42616f476e6f73697300000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f42616f476e6f00000000000000000000000000000000000000000000000000008152508160029080519060200190620000bb929190620001f6565b508060039080519060200190620000d4929190620001f6565b50620000e56200012360201b60201c565b60008190555050506200010d620001016200012860201b60201c565b6200013060201b60201c565b81600d81905550806009819055505050620003c2565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002049062000329565b90600052602060002090601f01602090048101928262000228576000855562000274565b82601f106200024357805160ff191683800117855562000274565b8280016001018555821562000274579182015b828111156200027357825182559160200191906001019062000256565b5b50905062000283919062000287565b5090565b5b80821115620002a257600081600090555060010162000288565b5090565b600081519050620002b7816200038e565b92915050565b600081519050620002ce81620003a8565b92915050565b60008060408385031215620002e857600080fd5b6000620002f885828601620002bd565b92505060206200030b85828601620002a6565b9150509250929050565b6000819050919050565b6000819050919050565b600060028204905060018216806200034257607f821691505b602082108114156200035957620003586200035f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b620003998162000315565b8114620003a557600080fd5b50565b620003b3816200031f565b8114620003bf57600080fd5b50565b61360f80620003d26000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806370a0823111610104578063c87b56dd116100a2578063eac989f811610071578063eac989f814610541578063f2fde38b1461055f578063f7073c3a1461057b578063fe6feca214610599576101da565b8063c87b56dd14610493578063db4bec44146104c3578063e985e9c5146104f3578063ea156a9b14610523576101da565b806395d89b41116100de57806395d89b4114610421578063a22cb4651461043f578063b88d4fde1461045b578063c30f4a5a14610477576101da565b806370a08231146103c9578063715018a6146103f95780638da5cb5b14610403576101da565b80632eb4a7ab1161017c57806344081ca61161014b57806344081ca6146103455780634783f0ef146103615780635ca48c031461037d5780636352211e14610399576101da565b80632eb4a7ab146102cf57806331ffd6f1146102ed57806332cb6b0c1461030b57806342842e0e14610329576101da565b8063095cde8d116101b8578063095cde8d1461025d578063095ea7b31461027957806318160ddd1461029557806323b872dd146102b3576101da565b806301ffc9a7146101df57806306fdde031461020f578063081812fc1461022d575b600080fd5b6101f960048036038101906101f49190612b1f565b6105a3565b6040516102069190612f2e565b60405180910390f35b610217610685565b6040516102249190612f64565b60405180910390f35b61024760048036038101906102429190612bb2565b610717565b6040516102549190612ec7565b60405180910390f35b61027760048036038101906102729190612bb2565b610793565b005b610293600480360381019061028e9190612a75565b610819565b005b61029d610924565b6040516102aa9190613066565b60405180910390f35b6102cd60048036038101906102c8919061296f565b61093b565b005b6102d761094b565b6040516102e49190612f49565b60405180910390f35b6102f5610951565b6040516103029190613066565b60405180910390f35b610313610957565b6040516103209190613066565b60405180910390f35b610343600480360381019061033e919061296f565b61095d565b005b61035f600480360381019061035a9190612b71565b61097d565b005b61037b60048036038101906103769190612af6565b610a13565b005b61039760048036038101906103929190612ab1565b610a99565b005b6103b360048036038101906103ae9190612bb2565b610d39565b6040516103c09190612ec7565b60405180910390f35b6103e360048036038101906103de919061290a565b610d4f565b6040516103f09190613066565b60405180910390f35b610401610e1f565b005b61040b610ea7565b6040516104189190612ec7565b60405180910390f35b610429610ed1565b6040516104369190612f64565b60405180910390f35b61045960048036038101906104549190612a39565b610f63565b005b610475600480360381019061047091906129be565b6110db565b005b610491600480360381019061048c9190612b71565b611157565b005b6104ad60048036038101906104a89190612bb2565b6111ed565b6040516104ba9190612f64565b60405180910390f35b6104dd60048036038101906104d8919061290a565b61128d565b6040516104ea9190612f2e565b60405180910390f35b61050d60048036038101906105089190612933565b6112ad565b60405161051a9190612f2e565b60405180910390f35b61052b611341565b6040516105389190613066565b60405180910390f35b610549611346565b6040516105569190612f64565b60405180910390f35b6105796004803603810190610574919061290a565b6113d4565b005b6105836114cc565b6040516105909190612f64565b60405180910390f35b6105a161155a565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061066e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061067e575061067d8261161f565b5b9050919050565b60606002805461069490613276565b80601f01602080910402602001604051908101604052809291908181526020018280546106c090613276565b801561070d5780601f106106e25761010080835404028352916020019161070d565b820191906000526020600020905b8154815290600101906020018083116106f057829003601f168201915b5050505050905090565b600061072282611689565b610758576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61079b6116d7565b73ffffffffffffffffffffffffffffffffffffffff166107b9610ea7565b73ffffffffffffffffffffffffffffffffffffffff161461080f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080690612fe6565b60405180910390fd5b80600d8190555050565b600061082482610d39565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561088c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108ab6116d7565b73ffffffffffffffffffffffffffffffffffffffff16141580156108dd57506108db816108d66116d7565b6112ad565b155b15610914576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61091f8383836116df565b505050565b600061092e611791565b6001546000540303905090565b610946838383611796565b505050565b60095481565b600d5481565b61138881565b610978838383604051806020016040528060008152506110db565b505050565b6109856116d7565b73ffffffffffffffffffffffffffffffffffffffff166109a3610ea7565b73ffffffffffffffffffffffffffffffffffffffff16146109f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f090612fe6565b60405180910390fd5b80600b9080519060200190610a0f92919061268c565b5050565b610a1b6116d7565b73ffffffffffffffffffffffffffffffffffffffff16610a39610ea7565b73ffffffffffffffffffffffffffffffffffffffff1614610a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8690612fe6565b60405180910390fd5b8060098190555050565b600d54421015610ade576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad590612fc6565b60405180910390fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6290613006565b60405180910390fd5b600033604051602001610b7e9190612e5c565b604051602081830303815290604052805190602001209050610be4838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060095483611c4c565b610c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1a90613046565b60405180910390fd5b6001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000610c85610924565b9050611388600182610c979190613160565b1115610cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccf90612f86565b60405180910390fd5b610ce3336001611d28565b3373ffffffffffffffffffffffffffffffffffffffff16600182610d079190613160565b7ffe0acd36c8ee2414177d2cc4d3e4d77d7dd8b0e0ed391c55173ade630cefce7560405160405180910390a350505050565b6000610d4482611d46565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610db7576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610e276116d7565b73ffffffffffffffffffffffffffffffffffffffff16610e45610ea7565b73ffffffffffffffffffffffffffffffffffffffff1614610e9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9290612fe6565b60405180910390fd5b610ea56000611fd5565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610ee090613276565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0c90613276565b8015610f595780601f10610f2e57610100808354040283529160200191610f59565b820191906000526020600020905b815481529060010190602001808311610f3c57829003601f168201915b5050505050905090565b610f6b6116d7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fd0576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610fdd6116d7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661108a6116d7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110cf9190612f2e565b60405180910390a35050565b6110e6848484611796565b6111058373ffffffffffffffffffffffffffffffffffffffff1661209b565b801561111a5750611118848484846120ae565b155b15611151576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b61115f6116d7565b73ffffffffffffffffffffffffffffffffffffffff1661117d610ea7565b73ffffffffffffffffffffffffffffffffffffffff16146111d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ca90612fe6565b60405180910390fd5b80600a90805190602001906111e992919061268c565b5050565b60606111f882611689565b611237576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122e90613026565b60405180910390fd5b600061124161220e565b905060008151116112615760405180602001604052806000815250611285565b80600b604051602001611275929190612ea3565b6040516020818303038152906040525b915050919050565b600c6020528060005260406000206000915054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600181565b600a805461135390613276565b80601f016020809104026020016040519081016040528092919081815260200182805461137f90613276565b80156113cc5780601f106113a1576101008083540402835291602001916113cc565b820191906000526020600020905b8154815290600101906020018083116113af57829003601f168201915b505050505081565b6113dc6116d7565b73ffffffffffffffffffffffffffffffffffffffff166113fa610ea7565b73ffffffffffffffffffffffffffffffffffffffff1614611450576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144790612fe6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b790612fa6565b60405180910390fd5b6114c981611fd5565b50565b600b80546114d990613276565b80601f016020809104026020016040519081016040528092919081815260200182805461150590613276565b80156115525780601f1061152757610100808354040283529160200191611552565b820191906000526020600020905b81548152906001019060200180831161153557829003601f168201915b505050505081565b6115626116d7565b73ffffffffffffffffffffffffffffffffffffffff16611580610ea7565b73ffffffffffffffffffffffffffffffffffffffff16146115d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cd90612fe6565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561161c573d6000803e3d6000fd5b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611694611791565b111580156116a3575060005482105b80156116d0575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b60006117a182611d46565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461180c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661182d6116d7565b73ffffffffffffffffffffffffffffffffffffffff16148061185c575061185b856118566116d7565b6112ad565b5b806118a1575061186a6116d7565b73ffffffffffffffffffffffffffffffffffffffff1661188984610717565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806118da576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611941576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61194e85858560016122a0565b61195a600084876116df565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611bda576000548214611bd957878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c4585858560016122a6565b5050505050565b60008082905060005b8551811015611d1a576000868281518110611c99577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311611cda578281604051602001611cbd929190612e77565b604051602081830303815290604052805190602001209250611d06565b8083604051602001611ced929190612e77565b6040516020818303038152906040528051906020012092505b508080611d12906132d9565b915050611c55565b508381149150509392505050565b611d428282604051806020016040528060008152506122ac565b5050565b611d4e612712565b600082905080611d5c611791565b11158015611d6b575060005481105b15611f9e576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611f9c57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611e80578092505050611fd0565b5b600115611f9b57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611f96578092505050611fd0565b611e81565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026120d46116d7565b8786866040518563ffffffff1660e01b81526004016120f69493929190612ee2565b602060405180830381600087803b15801561211057600080fd5b505af192505050801561214157506040513d601f19601f8201168201806040525081019061213e9190612b48565b60015b6121bb573d8060008114612171576040519150601f19603f3d011682016040523d82523d6000602084013e612176565b606091505b506000815114156121b3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a805461221d90613276565b80601f016020809104026020016040519081016040528092919081815260200182805461224990613276565b80156122965780601f1061226b57610100808354040283529160200191612296565b820191906000526020600020905b81548152906001019060200180831161227957829003601f168201915b5050505050905090565b50505050565b50505050565b6122b983838360016122be565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561232b576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612366576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61237360008683876122a0565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561253d575061253c8773ffffffffffffffffffffffffffffffffffffffff1661209b565b5b15612603575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125b260008884806001019550886120ae565b6125e8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156125435782600054146125fe57600080fd5b61266f565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612604575b81600081905550505061268560008683876122a6565b5050505050565b82805461269890613276565b90600052602060002090601f0160209004810192826126ba5760008555612701565b82601f106126d357805160ff1916838001178555612701565b82800160010185558215612701579182015b828111156127005782518255916020019190600101906126e5565b5b50905061270e9190612755565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561276e576000816000905550600101612756565b5090565b6000612785612780846130a6565b613081565b90508281526020810184848401111561279d57600080fd5b6127a8848285613234565b509392505050565b60006127c36127be846130d7565b613081565b9050828152602081018484840111156127db57600080fd5b6127e6848285613234565b509392505050565b6000813590506127fd81613566565b92915050565b60008083601f84011261281557600080fd5b8235905067ffffffffffffffff81111561282e57600080fd5b60208301915083602082028301111561284657600080fd5b9250929050565b60008135905061285c8161357d565b92915050565b60008135905061287181613594565b92915050565b600081359050612886816135ab565b92915050565b60008151905061289b816135ab565b92915050565b600082601f8301126128b257600080fd5b81356128c2848260208601612772565b91505092915050565b600082601f8301126128dc57600080fd5b81356128ec8482602086016127b0565b91505092915050565b600081359050612904816135c2565b92915050565b60006020828403121561291c57600080fd5b600061292a848285016127ee565b91505092915050565b6000806040838503121561294657600080fd5b6000612954858286016127ee565b9250506020612965858286016127ee565b9150509250929050565b60008060006060848603121561298457600080fd5b6000612992868287016127ee565b93505060206129a3868287016127ee565b92505060406129b4868287016128f5565b9150509250925092565b600080600080608085870312156129d457600080fd5b60006129e2878288016127ee565b94505060206129f3878288016127ee565b9350506040612a04878288016128f5565b925050606085013567ffffffffffffffff811115612a2157600080fd5b612a2d878288016128a1565b91505092959194509250565b60008060408385031215612a4c57600080fd5b6000612a5a858286016127ee565b9250506020612a6b8582860161284d565b9150509250929050565b60008060408385031215612a8857600080fd5b6000612a96858286016127ee565b9250506020612aa7858286016128f5565b9150509250929050565b60008060208385031215612ac457600080fd5b600083013567ffffffffffffffff811115612ade57600080fd5b612aea85828601612803565b92509250509250929050565b600060208284031215612b0857600080fd5b6000612b1684828501612862565b91505092915050565b600060208284031215612b3157600080fd5b6000612b3f84828501612877565b91505092915050565b600060208284031215612b5a57600080fd5b6000612b688482850161288c565b91505092915050565b600060208284031215612b8357600080fd5b600082013567ffffffffffffffff811115612b9d57600080fd5b612ba9848285016128cb565b91505092915050565b600060208284031215612bc457600080fd5b6000612bd2848285016128f5565b91505092915050565b612be4816131b6565b82525050565b612bfb612bf6826131b6565b613322565b82525050565b612c0a816131c8565b82525050565b612c19816131d4565b82525050565b612c30612c2b826131d4565b613334565b82525050565b6000612c418261311d565b612c4b8185613133565b9350612c5b818560208601613243565b612c64816133dd565b840191505092915050565b6000612c7a82613128565b612c848185613144565b9350612c94818560208601613243565b612c9d816133dd565b840191505092915050565b6000612cb382613128565b612cbd8185613155565b9350612ccd818560208601613243565b80840191505092915050565b60008154612ce681613276565b612cf08186613155565b94506001821660008114612d0b5760018114612d1c57612d4f565b60ff19831686528186019350612d4f565b612d2585613108565b60005b83811015612d4757815481890152600182019150602081019050612d28565b838801955050505b50505092915050565b6000612d65601583613144565b9150612d70826133fb565b602082019050919050565b6000612d88602683613144565b9150612d9382613424565b604082019050919050565b6000612dab601583613144565b9150612db682613473565b602082019050919050565b6000612dce602083613144565b9150612dd98261349c565b602082019050919050565b6000612df1601783613144565b9150612dfc826134c5565b602082019050919050565b6000612e14602f83613144565b9150612e1f826134ee565b604082019050919050565b6000612e37600d83613144565b9150612e428261353d565b602082019050919050565b612e568161322a565b82525050565b6000612e688284612bea565b60148201915081905092915050565b6000612e838285612c1f565b602082019150612e938284612c1f565b6020820191508190509392505050565b6000612eaf8285612ca8565b9150612ebb8284612cd9565b91508190509392505050565b6000602082019050612edc6000830184612bdb565b92915050565b6000608082019050612ef76000830187612bdb565b612f046020830186612bdb565b612f116040830185612e4d565b8181036060830152612f238184612c36565b905095945050505050565b6000602082019050612f436000830184612c01565b92915050565b6000602082019050612f5e6000830184612c10565b92915050565b60006020820190508181036000830152612f7e8184612c6f565b905092915050565b60006020820190508181036000830152612f9f81612d58565b9050919050565b60006020820190508181036000830152612fbf81612d7b565b9050919050565b60006020820190508181036000830152612fdf81612d9e565b9050919050565b60006020820190508181036000830152612fff81612dc1565b9050919050565b6000602082019050818103600083015261301f81612de4565b9050919050565b6000602082019050818103600083015261303f81612e07565b9050919050565b6000602082019050818103600083015261305f81612e2a565b9050919050565b600060208201905061307b6000830184612e4d565b92915050565b600061308b61309c565b905061309782826132a8565b919050565b6000604051905090565b600067ffffffffffffffff8211156130c1576130c06133ae565b5b6130ca826133dd565b9050602081019050919050565b600067ffffffffffffffff8211156130f2576130f16133ae565b5b6130fb826133dd565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061316b8261322a565b91506131768361322a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156131ab576131aa613350565b5b828201905092915050565b60006131c18261320a565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613261578082015181840152602081019050613246565b83811115613270576000848401525b50505050565b6000600282049050600182168061328e57607f821691505b602082108114156132a2576132a161337f565b5b50919050565b6132b1826133dd565b810181811067ffffffffffffffff821117156132d0576132cf6133ae565b5b80604052505050565b60006132e48261322a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561331757613316613350565b5b600182019050919050565b600061332d8261333e565b9050919050565b6000819050919050565b6000613349826133ee565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f43616e2774206d696e74206f766572206c696d69740000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206e6f742072656164790000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f43616c6c6572206e6f742070617274206f662074726565000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b61356f816131b6565b811461357a57600080fd5b50565b613586816131c8565b811461359157600080fd5b50565b61359d816131d4565b81146135a857600080fd5b50565b6135b4816131de565b81146135bf57600080fd5b50565b6135cb8161322a565b81146135d657600080fd5b5056fea264697066735822122038e530b95bca937021c27c69c81ebee877cd2637de94bc2054120c5d6392828f64736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806370a0823111610104578063c87b56dd116100a2578063eac989f811610071578063eac989f814610541578063f2fde38b1461055f578063f7073c3a1461057b578063fe6feca214610599576101da565b8063c87b56dd14610493578063db4bec44146104c3578063e985e9c5146104f3578063ea156a9b14610523576101da565b806395d89b41116100de57806395d89b4114610421578063a22cb4651461043f578063b88d4fde1461045b578063c30f4a5a14610477576101da565b806370a08231146103c9578063715018a6146103f95780638da5cb5b14610403576101da565b80632eb4a7ab1161017c57806344081ca61161014b57806344081ca6146103455780634783f0ef146103615780635ca48c031461037d5780636352211e14610399576101da565b80632eb4a7ab146102cf57806331ffd6f1146102ed57806332cb6b0c1461030b57806342842e0e14610329576101da565b8063095cde8d116101b8578063095cde8d1461025d578063095ea7b31461027957806318160ddd1461029557806323b872dd146102b3576101da565b806301ffc9a7146101df57806306fdde031461020f578063081812fc1461022d575b600080fd5b6101f960048036038101906101f49190612b1f565b6105a3565b6040516102069190612f2e565b60405180910390f35b610217610685565b6040516102249190612f64565b60405180910390f35b61024760048036038101906102429190612bb2565b610717565b6040516102549190612ec7565b60405180910390f35b61027760048036038101906102729190612bb2565b610793565b005b610293600480360381019061028e9190612a75565b610819565b005b61029d610924565b6040516102aa9190613066565b60405180910390f35b6102cd60048036038101906102c8919061296f565b61093b565b005b6102d761094b565b6040516102e49190612f49565b60405180910390f35b6102f5610951565b6040516103029190613066565b60405180910390f35b610313610957565b6040516103209190613066565b60405180910390f35b610343600480360381019061033e919061296f565b61095d565b005b61035f600480360381019061035a9190612b71565b61097d565b005b61037b60048036038101906103769190612af6565b610a13565b005b61039760048036038101906103929190612ab1565b610a99565b005b6103b360048036038101906103ae9190612bb2565b610d39565b6040516103c09190612ec7565b60405180910390f35b6103e360048036038101906103de919061290a565b610d4f565b6040516103f09190613066565b60405180910390f35b610401610e1f565b005b61040b610ea7565b6040516104189190612ec7565b60405180910390f35b610429610ed1565b6040516104369190612f64565b60405180910390f35b61045960048036038101906104549190612a39565b610f63565b005b610475600480360381019061047091906129be565b6110db565b005b610491600480360381019061048c9190612b71565b611157565b005b6104ad60048036038101906104a89190612bb2565b6111ed565b6040516104ba9190612f64565b60405180910390f35b6104dd60048036038101906104d8919061290a565b61128d565b6040516104ea9190612f2e565b60405180910390f35b61050d60048036038101906105089190612933565b6112ad565b60405161051a9190612f2e565b60405180910390f35b61052b611341565b6040516105389190613066565b60405180910390f35b610549611346565b6040516105569190612f64565b60405180910390f35b6105796004803603810190610574919061290a565b6113d4565b005b6105836114cc565b6040516105909190612f64565b60405180910390f35b6105a161155a565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061066e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061067e575061067d8261161f565b5b9050919050565b60606002805461069490613276565b80601f01602080910402602001604051908101604052809291908181526020018280546106c090613276565b801561070d5780601f106106e25761010080835404028352916020019161070d565b820191906000526020600020905b8154815290600101906020018083116106f057829003601f168201915b5050505050905090565b600061072282611689565b610758576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61079b6116d7565b73ffffffffffffffffffffffffffffffffffffffff166107b9610ea7565b73ffffffffffffffffffffffffffffffffffffffff161461080f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080690612fe6565b60405180910390fd5b80600d8190555050565b600061082482610d39565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561088c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108ab6116d7565b73ffffffffffffffffffffffffffffffffffffffff16141580156108dd57506108db816108d66116d7565b6112ad565b155b15610914576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61091f8383836116df565b505050565b600061092e611791565b6001546000540303905090565b610946838383611796565b505050565b60095481565b600d5481565b61138881565b610978838383604051806020016040528060008152506110db565b505050565b6109856116d7565b73ffffffffffffffffffffffffffffffffffffffff166109a3610ea7565b73ffffffffffffffffffffffffffffffffffffffff16146109f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f090612fe6565b60405180910390fd5b80600b9080519060200190610a0f92919061268c565b5050565b610a1b6116d7565b73ffffffffffffffffffffffffffffffffffffffff16610a39610ea7565b73ffffffffffffffffffffffffffffffffffffffff1614610a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8690612fe6565b60405180910390fd5b8060098190555050565b600d54421015610ade576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad590612fc6565b60405180910390fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6290613006565b60405180910390fd5b600033604051602001610b7e9190612e5c565b604051602081830303815290604052805190602001209050610be4838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060095483611c4c565b610c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1a90613046565b60405180910390fd5b6001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000610c85610924565b9050611388600182610c979190613160565b1115610cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccf90612f86565b60405180910390fd5b610ce3336001611d28565b3373ffffffffffffffffffffffffffffffffffffffff16600182610d079190613160565b7ffe0acd36c8ee2414177d2cc4d3e4d77d7dd8b0e0ed391c55173ade630cefce7560405160405180910390a350505050565b6000610d4482611d46565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610db7576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610e276116d7565b73ffffffffffffffffffffffffffffffffffffffff16610e45610ea7565b73ffffffffffffffffffffffffffffffffffffffff1614610e9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9290612fe6565b60405180910390fd5b610ea56000611fd5565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610ee090613276565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0c90613276565b8015610f595780601f10610f2e57610100808354040283529160200191610f59565b820191906000526020600020905b815481529060010190602001808311610f3c57829003601f168201915b5050505050905090565b610f6b6116d7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fd0576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610fdd6116d7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661108a6116d7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110cf9190612f2e565b60405180910390a35050565b6110e6848484611796565b6111058373ffffffffffffffffffffffffffffffffffffffff1661209b565b801561111a5750611118848484846120ae565b155b15611151576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b61115f6116d7565b73ffffffffffffffffffffffffffffffffffffffff1661117d610ea7565b73ffffffffffffffffffffffffffffffffffffffff16146111d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ca90612fe6565b60405180910390fd5b80600a90805190602001906111e992919061268c565b5050565b60606111f882611689565b611237576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122e90613026565b60405180910390fd5b600061124161220e565b905060008151116112615760405180602001604052806000815250611285565b80600b604051602001611275929190612ea3565b6040516020818303038152906040525b915050919050565b600c6020528060005260406000206000915054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600181565b600a805461135390613276565b80601f016020809104026020016040519081016040528092919081815260200182805461137f90613276565b80156113cc5780601f106113a1576101008083540402835291602001916113cc565b820191906000526020600020905b8154815290600101906020018083116113af57829003601f168201915b505050505081565b6113dc6116d7565b73ffffffffffffffffffffffffffffffffffffffff166113fa610ea7565b73ffffffffffffffffffffffffffffffffffffffff1614611450576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144790612fe6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b790612fa6565b60405180910390fd5b6114c981611fd5565b50565b600b80546114d990613276565b80601f016020809104026020016040519081016040528092919081815260200182805461150590613276565b80156115525780601f1061152757610100808354040283529160200191611552565b820191906000526020600020905b81548152906001019060200180831161153557829003601f168201915b505050505081565b6115626116d7565b73ffffffffffffffffffffffffffffffffffffffff16611580610ea7565b73ffffffffffffffffffffffffffffffffffffffff16146115d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cd90612fe6565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561161c573d6000803e3d6000fd5b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611694611791565b111580156116a3575060005482105b80156116d0575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b60006117a182611d46565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461180c576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661182d6116d7565b73ffffffffffffffffffffffffffffffffffffffff16148061185c575061185b856118566116d7565b6112ad565b5b806118a1575061186a6116d7565b73ffffffffffffffffffffffffffffffffffffffff1661188984610717565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806118da576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611941576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61194e85858560016122a0565b61195a600084876116df565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611bda576000548214611bd957878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c4585858560016122a6565b5050505050565b60008082905060005b8551811015611d1a576000868281518110611c99577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050808311611cda578281604051602001611cbd929190612e77565b604051602081830303815290604052805190602001209250611d06565b8083604051602001611ced929190612e77565b6040516020818303038152906040528051906020012092505b508080611d12906132d9565b915050611c55565b508381149150509392505050565b611d428282604051806020016040528060008152506122ac565b5050565b611d4e612712565b600082905080611d5c611791565b11158015611d6b575060005481105b15611f9e576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611f9c57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611e80578092505050611fd0565b5b600115611f9b57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611f96578092505050611fd0565b611e81565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026120d46116d7565b8786866040518563ffffffff1660e01b81526004016120f69493929190612ee2565b602060405180830381600087803b15801561211057600080fd5b505af192505050801561214157506040513d601f19601f8201168201806040525081019061213e9190612b48565b60015b6121bb573d8060008114612171576040519150601f19603f3d011682016040523d82523d6000602084013e612176565b606091505b506000815114156121b3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a805461221d90613276565b80601f016020809104026020016040519081016040528092919081815260200182805461224990613276565b80156122965780601f1061226b57610100808354040283529160200191612296565b820191906000526020600020905b81548152906001019060200180831161227957829003601f168201915b5050505050905090565b50505050565b50505050565b6122b983838360016122be565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561232b576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612366576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61237360008683876122a0565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561253d575061253c8773ffffffffffffffffffffffffffffffffffffffff1661209b565b5b15612603575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125b260008884806001019550886120ae565b6125e8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156125435782600054146125fe57600080fd5b61266f565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612604575b81600081905550505061268560008683876122a6565b5050505050565b82805461269890613276565b90600052602060002090601f0160209004810192826126ba5760008555612701565b82601f106126d357805160ff1916838001178555612701565b82800160010185558215612701579182015b828111156127005782518255916020019190600101906126e5565b5b50905061270e9190612755565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561276e576000816000905550600101612756565b5090565b6000612785612780846130a6565b613081565b90508281526020810184848401111561279d57600080fd5b6127a8848285613234565b509392505050565b60006127c36127be846130d7565b613081565b9050828152602081018484840111156127db57600080fd5b6127e6848285613234565b509392505050565b6000813590506127fd81613566565b92915050565b60008083601f84011261281557600080fd5b8235905067ffffffffffffffff81111561282e57600080fd5b60208301915083602082028301111561284657600080fd5b9250929050565b60008135905061285c8161357d565b92915050565b60008135905061287181613594565b92915050565b600081359050612886816135ab565b92915050565b60008151905061289b816135ab565b92915050565b600082601f8301126128b257600080fd5b81356128c2848260208601612772565b91505092915050565b600082601f8301126128dc57600080fd5b81356128ec8482602086016127b0565b91505092915050565b600081359050612904816135c2565b92915050565b60006020828403121561291c57600080fd5b600061292a848285016127ee565b91505092915050565b6000806040838503121561294657600080fd5b6000612954858286016127ee565b9250506020612965858286016127ee565b9150509250929050565b60008060006060848603121561298457600080fd5b6000612992868287016127ee565b93505060206129a3868287016127ee565b92505060406129b4868287016128f5565b9150509250925092565b600080600080608085870312156129d457600080fd5b60006129e2878288016127ee565b94505060206129f3878288016127ee565b9350506040612a04878288016128f5565b925050606085013567ffffffffffffffff811115612a2157600080fd5b612a2d878288016128a1565b91505092959194509250565b60008060408385031215612a4c57600080fd5b6000612a5a858286016127ee565b9250506020612a6b8582860161284d565b9150509250929050565b60008060408385031215612a8857600080fd5b6000612a96858286016127ee565b9250506020612aa7858286016128f5565b9150509250929050565b60008060208385031215612ac457600080fd5b600083013567ffffffffffffffff811115612ade57600080fd5b612aea85828601612803565b92509250509250929050565b600060208284031215612b0857600080fd5b6000612b1684828501612862565b91505092915050565b600060208284031215612b3157600080fd5b6000612b3f84828501612877565b91505092915050565b600060208284031215612b5a57600080fd5b6000612b688482850161288c565b91505092915050565b600060208284031215612b8357600080fd5b600082013567ffffffffffffffff811115612b9d57600080fd5b612ba9848285016128cb565b91505092915050565b600060208284031215612bc457600080fd5b6000612bd2848285016128f5565b91505092915050565b612be4816131b6565b82525050565b612bfb612bf6826131b6565b613322565b82525050565b612c0a816131c8565b82525050565b612c19816131d4565b82525050565b612c30612c2b826131d4565b613334565b82525050565b6000612c418261311d565b612c4b8185613133565b9350612c5b818560208601613243565b612c64816133dd565b840191505092915050565b6000612c7a82613128565b612c848185613144565b9350612c94818560208601613243565b612c9d816133dd565b840191505092915050565b6000612cb382613128565b612cbd8185613155565b9350612ccd818560208601613243565b80840191505092915050565b60008154612ce681613276565b612cf08186613155565b94506001821660008114612d0b5760018114612d1c57612d4f565b60ff19831686528186019350612d4f565b612d2585613108565b60005b83811015612d4757815481890152600182019150602081019050612d28565b838801955050505b50505092915050565b6000612d65601583613144565b9150612d70826133fb565b602082019050919050565b6000612d88602683613144565b9150612d9382613424565b604082019050919050565b6000612dab601583613144565b9150612db682613473565b602082019050919050565b6000612dce602083613144565b9150612dd98261349c565b602082019050919050565b6000612df1601783613144565b9150612dfc826134c5565b602082019050919050565b6000612e14602f83613144565b9150612e1f826134ee565b604082019050919050565b6000612e37600d83613144565b9150612e428261353d565b602082019050919050565b612e568161322a565b82525050565b6000612e688284612bea565b60148201915081905092915050565b6000612e838285612c1f565b602082019150612e938284612c1f565b6020820191508190509392505050565b6000612eaf8285612ca8565b9150612ebb8284612cd9565b91508190509392505050565b6000602082019050612edc6000830184612bdb565b92915050565b6000608082019050612ef76000830187612bdb565b612f046020830186612bdb565b612f116040830185612e4d565b8181036060830152612f238184612c36565b905095945050505050565b6000602082019050612f436000830184612c01565b92915050565b6000602082019050612f5e6000830184612c10565b92915050565b60006020820190508181036000830152612f7e8184612c6f565b905092915050565b60006020820190508181036000830152612f9f81612d58565b9050919050565b60006020820190508181036000830152612fbf81612d7b565b9050919050565b60006020820190508181036000830152612fdf81612d9e565b9050919050565b60006020820190508181036000830152612fff81612dc1565b9050919050565b6000602082019050818103600083015261301f81612de4565b9050919050565b6000602082019050818103600083015261303f81612e07565b9050919050565b6000602082019050818103600083015261305f81612e2a565b9050919050565b600060208201905061307b6000830184612e4d565b92915050565b600061308b61309c565b905061309782826132a8565b919050565b6000604051905090565b600067ffffffffffffffff8211156130c1576130c06133ae565b5b6130ca826133dd565b9050602081019050919050565b600067ffffffffffffffff8211156130f2576130f16133ae565b5b6130fb826133dd565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061316b8261322a565b91506131768361322a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156131ab576131aa613350565b5b828201905092915050565b60006131c18261320a565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613261578082015181840152602081019050613246565b83811115613270576000848401525b50505050565b6000600282049050600182168061328e57607f821691505b602082108114156132a2576132a161337f565b5b50919050565b6132b1826133dd565b810181811067ffffffffffffffff821117156132d0576132cf6133ae565b5b80604052505050565b60006132e48261322a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561331757613316613350565b5b600182019050919050565b600061332d8261333e565b9050919050565b6000819050919050565b6000613349826133ee565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f43616e2774206d696e74206f766572206c696d69740000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206e6f742072656164790000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f43616c6c6572206e6f742070617274206f662074726565000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b61356f816131b6565b811461357a57600080fd5b50565b613586816131c8565b811461359157600080fd5b50565b61359d816131d4565b81146135a857600080fd5b50565b6135b4816131de565b81146135bf57600080fd5b50565b6135cb8161322a565b81146135d657600080fd5b5056fea264697066735822122038e530b95bca937021c27c69c81ebee877cd2637de94bc2054120c5d6392828f64736f6c63430008040033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _whitelistSale (uint256): 1
Arg [1] : _root (bytes32): 0x0000000000000000000000000000000000000000000000000000000000000000

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

45162:2443:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24003:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26597:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28100:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46453:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27663:371;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23252:303;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28965:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45397:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45557:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45292:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29206:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46705:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46596:97;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46826:641;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26405:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24372:206;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42961:103;;;:::i;:::-;;42310:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26766:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28376:287;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29462:369;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46338:103;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45986:340;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45496:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28734:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45344:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45435:17;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43219:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45463:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47479:123;;;:::i;:::-;;24003:305;24105:4;24157:25;24142:40;;;:11;:40;;;;:105;;;;24214:33;24199:48;;;:11;:48;;;;24142:105;:158;;;;24264:36;24288:11;24264:23;:36::i;:::-;24142:158;24122:178;;24003:305;;;:::o;26597:100::-;26651:13;26684:5;26677:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26597:100;:::o;28100:204::-;28168:7;28193:16;28201:7;28193;:16::i;:::-;28188:64;;28218:34;;;;;;;;;;;;;;28188:64;28272:15;:24;28288:7;28272:24;;;;;;;;;;;;;;;;;;;;;28265:31;;28100:204;;;:::o;46453:131::-;42541:12;:10;:12::i;:::-;42530:23;;:7;:5;:7::i;:::-;:23;;;42522:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46558:14:::1;46542:13;:30;;;;46453:131:::0;:::o;27663:371::-;27736:13;27752:24;27768:7;27752:15;:24::i;:::-;27736:40;;27797:5;27791:11;;:2;:11;;;27787:48;;;27811:24;;;;;;;;;;;;;;27787:48;27868:5;27852:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;27878:37;27895:5;27902:12;:10;:12::i;:::-;27878:16;:37::i;:::-;27877:38;27852:63;27848:138;;;27939:35;;;;;;;;;;;;;;27848:138;27998:28;28007:2;28011:7;28020:5;27998:8;:28::i;:::-;27663:371;;;:::o;23252:303::-;23296:7;23521:15;:13;:15::i;:::-;23506:12;;23490:13;;:28;:46;23483:53;;23252:303;:::o;28965:170::-;29099:28;29109:4;29115:2;29119:7;29099:9;:28::i;:::-;28965:170;;;:::o;45397:25::-;;;;:::o;45557:28::-;;;;:::o;45292:41::-;45329:4;45292:41;:::o;29206:185::-;29344:39;29361:4;29367:2;29371:7;29344:39;;;;;;;;;;;;:16;:39::i;:::-;29206:185;;;:::o;46705:109::-;42541:12;:10;:12::i;:::-;42530:23;;:7;:5;:7::i;:::-;:23;;;42522:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46795:7:::1;46786:6;:16;;;;;;;;;;;;:::i;:::-;;46705:109:::0;:::o;46596:97::-;42541:12;:10;:12::i;:::-;42530:23;;:7;:5;:7::i;:::-;:23;;;42522:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46680:5:::1;46667:10;:18;;;;46596:97:::0;:::o;46826:641::-;46937:13;;46918:15;:32;;46910:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;47004:16;:28;47021:10;47004:28;;;;;;;;;;;;;;;;;;;;;;;;;47003:29;46995:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;47081:12;47123:10;47106:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;47096:39;;;;;;47081:54;;47163:44;47182:6;;47163:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47190:10;;47202:4;47163:18;:44::i;:::-;47154:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;47277:4;47246:16;:28;47263:10;47246:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;47290:14;47307:13;:11;:13::i;:::-;47290:30;;45329:4;47344:1;47335:6;:10;;;;:::i;:::-;:24;;47327:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;47392:24;47402:10;47414:1;47392:9;:24::i;:::-;47451:10;47428:34;;47448:1;47439:6;:10;;;;:::i;:::-;47428:34;;;;;;;;;;46826:641;;;;:::o;26405:125::-;26469:7;26496:21;26509:7;26496:12;:21::i;:::-;:26;;;26489:33;;26405:125;;;:::o;24372:206::-;24436:7;24477:1;24460:19;;:5;:19;;;24456:60;;;24488:28;;;;;;;;;;;;;;24456:60;24542:12;:19;24555:5;24542:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;24534:36;;24527:43;;24372:206;;;:::o;42961:103::-;42541:12;:10;:12::i;:::-;42530:23;;:7;:5;:7::i;:::-;:23;;;42522:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43026:30:::1;43053:1;43026:18;:30::i;:::-;42961:103::o:0;42310:87::-;42356:7;42383:6;;;;;;;;;;;42376:13;;42310:87;:::o;26766:104::-;26822:13;26855:7;26848:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26766:104;:::o;28376:287::-;28487:12;:10;:12::i;:::-;28475:24;;:8;:24;;;28471:54;;;28508:17;;;;;;;;;;;;;;28471:54;28583:8;28538:18;:32;28557:12;:10;:12::i;:::-;28538:32;;;;;;;;;;;;;;;:42;28571:8;28538:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28636:8;28607:48;;28622:12;:10;:12::i;:::-;28607:48;;;28646:8;28607:48;;;;;;:::i;:::-;;;;;;;;28376:287;;:::o;29462:369::-;29629:28;29639:4;29645:2;29649:7;29629:9;:28::i;:::-;29672:15;:2;:13;;;:15::i;:::-;:76;;;;;29692:56;29723:4;29729:2;29733:7;29742:5;29692:30;:56::i;:::-;29691:57;29672:76;29668:156;;;29772:40;;;;;;;;;;;;;;29668:156;29462:369;;;;:::o;46338:103::-;42541:12;:10;:12::i;:::-;42530:23;;:7;:5;:7::i;:::-;:23;;;42522:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46422:7:::1;46416:3;:13;;;;;;;;;;;;:::i;:::-;;46338:103:::0;:::o;45986:340::-;46051:13;46085:16;46093:7;46085;:16::i;:::-;46077:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;46166:21;46190:10;:8;:10::i;:::-;46166:34;;46242:1;46224:7;46218:21;:25;:100;;;;;;;;;;;;;;;;;46283:7;46292:6;46266:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46218:100;46211:107;;;45986:340;;;:::o;45496:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;28734:164::-;28831:4;28855:18;:25;28874:5;28855:25;;;;;;;;;;;;;;;:35;28881:8;28855:35;;;;;;;;;;;;;;;;;;;;;;;;;28848:42;;28734:164;;;;:::o;45344:40::-;45383:1;45344:40;:::o;45435:17::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43219:201::-;42541:12;:10;:12::i;:::-;42530:23;;:7;:5;:7::i;:::-;:23;;;42522:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43328:1:::1;43308:22;;:8;:22;;;;43300:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43384:28;43403:8;43384:18;:28::i;:::-;43219:201:::0;:::o;45463:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47479:123::-;42541:12;:10;:12::i;:::-;42530:23;;:7;:5;:7::i;:::-;:23;;;42522:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47547:10:::1;47539:28;;:51;47568:21;47539:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;47479:123::o:0;19814:157::-;19899:4;19938:25;19923:40;;;:11;:40;;;;19916:47;;19814:157;;;:::o;30086:187::-;30143:4;30186:7;30167:15;:13;:15::i;:::-;:26;;:53;;;;;30207:13;;30197:7;:23;30167:53;:98;;;;;30238:11;:20;30250:7;30238:20;;;;;;;;;;;:27;;;;;;;;;;;;30237:28;30167:98;30160:105;;30086:187;;;:::o;16597:98::-;16650:7;16677:10;16670:17;;16597:98;:::o;38256:196::-;38398:2;38371:15;:24;38387:7;38371:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;38436:7;38432:2;38416:28;;38425:5;38416:28;;;;;;;;;;;;38256:196;;;:::o;23026:92::-;23082:7;23026:92;:::o;33199:2130::-;33314:35;33352:21;33365:7;33352:12;:21::i;:::-;33314:59;;33412:4;33390:26;;:13;:18;;;:26;;;33386:67;;33425:28;;;;;;;;;;;;;;33386:67;33466:22;33508:4;33492:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;33529:36;33546:4;33552:12;:10;:12::i;:::-;33529:16;:36::i;:::-;33492:73;:126;;;;33606:12;:10;:12::i;:::-;33582:36;;:20;33594:7;33582:11;:20::i;:::-;:36;;;33492:126;33466:153;;33637:17;33632:66;;33663:35;;;;;;;;;;;;;;33632:66;33727:1;33713:16;;:2;:16;;;33709:52;;;33738:23;;;;;;;;;;;;;;33709:52;33774:43;33796:4;33802:2;33806:7;33815:1;33774:21;:43::i;:::-;33882:35;33899:1;33903:7;33912:4;33882:8;:35::i;:::-;34243:1;34213:12;:18;34226:4;34213:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34287:1;34259:12;:16;34272:2;34259:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34305:31;34339:11;:20;34351:7;34339:20;;;;;;;;;;;34305:54;;34390:2;34374:8;:13;;;:18;;;;;;;;;;;;;;;;;;34440:15;34407:8;:23;;;:49;;;;;;;;;;;;;;;;;;34708:19;34740:1;34730:7;:11;34708:33;;34756:31;34790:11;:24;34802:11;34790:24;;;;;;;;;;;34756:58;;34858:1;34833:27;;:8;:13;;;;;;;;;;;;:27;;;34829:384;;;35043:13;;35028:11;:28;35024:174;;35097:4;35081:8;:13;;;:20;;;;;;;;;;;;;;;;;;35150:13;:28;;;35124:8;:23;;;:54;;;;;;;;;;;;;;;;;;35024:174;34829:384;33199:2130;;;35260:7;35256:2;35241:27;;35250:4;35241:27;;;;;;;;;;;;35279:42;35300:4;35306:2;35310:7;35319:1;35279:20;:42::i;:::-;33199:2130;;;;;:::o;44297:796::-;44388:4;44405:20;44428:4;44405:27;;44450:9;44445:525;44469:5;:12;44465:1;:16;44445:525;;;44503:20;44526:5;44532:1;44526:8;;;;;;;;;;;;;;;;;;;;;;44503:31;;44571:12;44555;:28;44551:408;;44725:12;44739;44708:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44698:55;;;;;;44683:70;;44551:408;;;44915:12;44929;44898:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44888:55;;;;;;44873:70;;44551:408;44445:525;44483:3;;;;;:::i;:::-;;;;44445:525;;;;45081:4;45065:12;:20;45058:27;;;44297:796;;;;;:::o;30281:104::-;30350:27;30360:2;30364:8;30350:27;;;;;;;;;;;;:9;:27::i;:::-;30281:104;;:::o;25234:1109::-;25296:21;;:::i;:::-;25330:12;25345:7;25330:22;;25413:4;25394:15;:13;:15::i;:::-;:23;;:47;;;;;25428:13;;25421:4;:20;25394:47;25390:886;;;25462:31;25496:11;:17;25508:4;25496:17;;;;;;;;;;;25462:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25537:9;:16;;;25532:729;;25608:1;25582:28;;:9;:14;;;:28;;;25578:101;;25646:9;25639:16;;;;;;25578:101;25981:261;25988:4;25981:261;;;26021:6;;;;;;;;26066:11;:17;26078:4;26066:17;;;;;;;;;;;26054:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26140:1;26114:28;;:9;:14;;;:28;;;26110:109;;26182:9;26175:16;;;;;;26110:109;25981:261;;;25532:729;25390:886;;26304:31;;;;;;;;;;;;;;25234:1109;;;;:::o;43580:191::-;43654:16;43673:6;;;;;;;;;;;43654:25;;43699:8;43690:6;;:17;;;;;;;;;;;;;;;;;;43754:8;43723:40;;43744:8;43723:40;;;;;;;;;;;;43580:191;;:::o;8579:387::-;8639:4;8847:12;8914:7;8902:20;8894:28;;8957:1;8950:4;:8;8943:15;;;8579:387;;;:::o;38944:667::-;39107:4;39144:2;39128:36;;;39165:12;:10;:12::i;:::-;39179:4;39185:7;39194:5;39128:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39124:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39379:1;39362:6;:13;:18;39358:235;;;39408:40;;;;;;;;;;;;;;39358:235;39551:6;39545:13;39536:6;39532:2;39528:15;39521:38;39124:480;39257:45;;;39247:55;;;:6;:55;;;;39240:62;;;38944:667;;;;;;:::o;45870:108::-;45922:13;45963:3;45956:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45870:108;:::o;40259:159::-;;;;;:::o;41077:158::-;;;;;:::o;30748:163::-;30871:32;30877:2;30881:8;30891:5;30898:4;30871:5;:32::i;:::-;30748:163;;;:::o;31170:1775::-;31309:20;31332:13;;31309:36;;31374:1;31360:16;;:2;:16;;;31356:48;;;31385:19;;;;;;;;;;;;;;31356:48;31431:1;31419:8;:13;31415:44;;;31441:18;;;;;;;;;;;;;;31415:44;31472:61;31502:1;31506:2;31510:12;31524:8;31472:21;:61::i;:::-;31845:8;31810:12;:16;31823:2;31810:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31909:8;31869:12;:16;31882:2;31869:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31968:2;31935:11;:25;31947:12;31935:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;32035:15;31985:11;:25;31997:12;31985:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;32068:20;32091:12;32068:35;;32118:11;32147:8;32132:12;:23;32118:37;;32176:4;:23;;;;;32184:15;:2;:13;;;:15::i;:::-;32176:23;32172:641;;;32220:314;32276:12;32272:2;32251:38;;32268:1;32251:38;;;;;;;;;;;;32317:69;32356:1;32360:2;32364:14;;;;;;32380:5;32317:30;:69::i;:::-;32312:174;;32422:40;;;;;;;;;;;;;;32312:174;32529:3;32513:12;:19;;32220:314;;32615:12;32598:13;;:29;32594:43;;32629:8;;;32594:43;32172:641;;;32678:120;32734:14;;;;;;32730:2;32709:40;;32726:1;32709:40;;;;;;;;;;;;32793:3;32777:12;:19;;32678:120;;32172:641;32843:12;32827:13;:28;;;;31170:1775;;32877:60;32906:1;32910:2;32914:12;32928:8;32877:20;:60::i;:::-;31170:1775;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;869:367::-;942:8;952:6;1002:3;995:4;987:6;983:17;979:27;969:2;;1020:1;1017;1010:12;969:2;1056:6;1043:20;1033:30;;1086:18;1078:6;1075:30;1072:2;;;1118:1;1115;1108:12;1072:2;1155:4;1147:6;1143:17;1131:29;;1209:3;1201:4;1193:6;1189:17;1179:8;1175:32;1172:41;1169:2;;;1226:1;1223;1216:12;1169:2;959:277;;;;;:::o;1242:133::-;1285:5;1323:6;1310:20;1301:29;;1339:30;1363:5;1339:30;:::i;:::-;1291:84;;;;:::o;1381:139::-;1427:5;1465:6;1452:20;1443:29;;1481:33;1508:5;1481:33;:::i;:::-;1433:87;;;;:::o;1526:137::-;1571:5;1609:6;1596:20;1587:29;;1625:32;1651:5;1625:32;:::i;:::-;1577:86;;;;:::o;1669:141::-;1725:5;1756:6;1750:13;1741:22;;1772:32;1798:5;1772:32;:::i;:::-;1731:79;;;;:::o;1829:271::-;1884:5;1933:3;1926:4;1918:6;1914:17;1910:27;1900:2;;1951:1;1948;1941:12;1900:2;1991:6;1978:20;2016:78;2090:3;2082:6;2075:4;2067:6;2063:17;2016:78;:::i;:::-;2007:87;;1890:210;;;;;:::o;2120:273::-;2176:5;2225:3;2218:4;2210:6;2206:17;2202:27;2192:2;;2243:1;2240;2233:12;2192:2;2283:6;2270:20;2308:79;2383:3;2375:6;2368:4;2360:6;2356:17;2308:79;:::i;:::-;2299:88;;2182:211;;;;;:::o;2399:139::-;2445:5;2483:6;2470:20;2461:29;;2499:33;2526:5;2499:33;:::i;:::-;2451:87;;;;:::o;2544:262::-;2603:6;2652:2;2640:9;2631:7;2627:23;2623:32;2620:2;;;2668:1;2665;2658:12;2620:2;2711:1;2736:53;2781:7;2772:6;2761:9;2757:22;2736:53;:::i;:::-;2726:63;;2682:117;2610:196;;;;:::o;2812:407::-;2880:6;2888;2937:2;2925:9;2916:7;2912:23;2908:32;2905:2;;;2953:1;2950;2943:12;2905:2;2996:1;3021:53;3066:7;3057:6;3046:9;3042:22;3021:53;:::i;:::-;3011:63;;2967:117;3123:2;3149:53;3194:7;3185:6;3174:9;3170:22;3149:53;:::i;:::-;3139:63;;3094:118;2895:324;;;;;:::o;3225:552::-;3302:6;3310;3318;3367:2;3355:9;3346:7;3342:23;3338:32;3335:2;;;3383:1;3380;3373:12;3335:2;3426:1;3451:53;3496:7;3487:6;3476:9;3472:22;3451:53;:::i;:::-;3441:63;;3397:117;3553:2;3579:53;3624:7;3615:6;3604:9;3600:22;3579:53;:::i;:::-;3569:63;;3524:118;3681:2;3707:53;3752:7;3743:6;3732:9;3728:22;3707:53;:::i;:::-;3697:63;;3652:118;3325:452;;;;;:::o;3783:809::-;3878:6;3886;3894;3902;3951:3;3939:9;3930:7;3926:23;3922:33;3919:2;;;3968:1;3965;3958:12;3919:2;4011:1;4036:53;4081:7;4072:6;4061:9;4057:22;4036:53;:::i;:::-;4026:63;;3982:117;4138:2;4164:53;4209:7;4200:6;4189:9;4185:22;4164:53;:::i;:::-;4154:63;;4109:118;4266:2;4292:53;4337:7;4328:6;4317:9;4313:22;4292:53;:::i;:::-;4282:63;;4237:118;4422:2;4411:9;4407:18;4394:32;4453:18;4445:6;4442:30;4439:2;;;4485:1;4482;4475:12;4439:2;4513:62;4567:7;4558:6;4547:9;4543:22;4513:62;:::i;:::-;4503:72;;4365:220;3909:683;;;;;;;:::o;4598:401::-;4663:6;4671;4720:2;4708:9;4699:7;4695:23;4691:32;4688:2;;;4736:1;4733;4726:12;4688:2;4779:1;4804:53;4849:7;4840:6;4829:9;4825:22;4804:53;:::i;:::-;4794:63;;4750:117;4906:2;4932:50;4974:7;4965:6;4954:9;4950:22;4932:50;:::i;:::-;4922:60;;4877:115;4678:321;;;;;:::o;5005:407::-;5073:6;5081;5130:2;5118:9;5109:7;5105:23;5101:32;5098:2;;;5146:1;5143;5136:12;5098:2;5189:1;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5160:117;5316:2;5342:53;5387:7;5378:6;5367:9;5363:22;5342:53;:::i;:::-;5332:63;;5287:118;5088:324;;;;;:::o;5418:425::-;5504:6;5512;5561:2;5549:9;5540:7;5536:23;5532:32;5529:2;;;5577:1;5574;5567:12;5529:2;5648:1;5637:9;5633:17;5620:31;5678:18;5670:6;5667:30;5664:2;;;5710:1;5707;5700:12;5664:2;5746:80;5818:7;5809:6;5798:9;5794:22;5746:80;:::i;:::-;5728:98;;;;5591:245;5519:324;;;;;:::o;5849:262::-;5908:6;5957:2;5945:9;5936:7;5932:23;5928:32;5925:2;;;5973:1;5970;5963:12;5925:2;6016:1;6041:53;6086:7;6077:6;6066:9;6062:22;6041:53;:::i;:::-;6031:63;;5987:117;5915:196;;;;:::o;6117:260::-;6175:6;6224:2;6212:9;6203:7;6199:23;6195:32;6192:2;;;6240:1;6237;6230:12;6192:2;6283:1;6308:52;6352:7;6343:6;6332:9;6328:22;6308:52;:::i;:::-;6298:62;;6254:116;6182:195;;;;:::o;6383:282::-;6452:6;6501:2;6489:9;6480:7;6476:23;6472:32;6469:2;;;6517:1;6514;6507:12;6469:2;6560:1;6585:63;6640:7;6631:6;6620:9;6616:22;6585:63;:::i;:::-;6575:73;;6531:127;6459:206;;;;:::o;6671:375::-;6740:6;6789:2;6777:9;6768:7;6764:23;6760:32;6757:2;;;6805:1;6802;6795:12;6757:2;6876:1;6865:9;6861:17;6848:31;6906:18;6898:6;6895:30;6892:2;;;6938:1;6935;6928:12;6892:2;6966:63;7021:7;7012:6;7001:9;6997:22;6966:63;:::i;:::-;6956:73;;6819:220;6747:299;;;;:::o;7052:262::-;7111:6;7160:2;7148:9;7139:7;7135:23;7131:32;7128:2;;;7176:1;7173;7166:12;7128:2;7219:1;7244:53;7289:7;7280:6;7269:9;7265:22;7244:53;:::i;:::-;7234:63;;7190:117;7118:196;;;;:::o;7320:118::-;7407:24;7425:5;7407:24;:::i;:::-;7402:3;7395:37;7385:53;;:::o;7444:157::-;7549:45;7569:24;7587:5;7569:24;:::i;:::-;7549:45;:::i;:::-;7544:3;7537:58;7527:74;;:::o;7607:109::-;7688:21;7703:5;7688:21;:::i;:::-;7683:3;7676:34;7666:50;;:::o;7722:118::-;7809:24;7827:5;7809:24;:::i;:::-;7804:3;7797:37;7787:53;;:::o;7846:157::-;7951:45;7971:24;7989:5;7971:24;:::i;:::-;7951:45;:::i;:::-;7946:3;7939:58;7929:74;;:::o;8009:360::-;8095:3;8123:38;8155:5;8123:38;:::i;:::-;8177:70;8240:6;8235:3;8177:70;:::i;:::-;8170:77;;8256:52;8301:6;8296:3;8289:4;8282:5;8278:16;8256:52;:::i;:::-;8333:29;8355:6;8333:29;:::i;:::-;8328:3;8324:39;8317:46;;8099:270;;;;;:::o;8375:364::-;8463:3;8491:39;8524:5;8491:39;:::i;:::-;8546:71;8610:6;8605:3;8546:71;:::i;:::-;8539:78;;8626:52;8671:6;8666:3;8659:4;8652:5;8648:16;8626:52;:::i;:::-;8703:29;8725:6;8703:29;:::i;:::-;8698:3;8694:39;8687:46;;8467:272;;;;;:::o;8745:377::-;8851:3;8879:39;8912:5;8879:39;:::i;:::-;8934:89;9016:6;9011:3;8934:89;:::i;:::-;8927:96;;9032:52;9077:6;9072:3;9065:4;9058:5;9054:16;9032:52;:::i;:::-;9109:6;9104:3;9100:16;9093:23;;8855:267;;;;;:::o;9152:845::-;9255:3;9292:5;9286:12;9321:36;9347:9;9321:36;:::i;:::-;9373:89;9455:6;9450:3;9373:89;:::i;:::-;9366:96;;9493:1;9482:9;9478:17;9509:1;9504:137;;;;9655:1;9650:341;;;;9471:520;;9504:137;9588:4;9584:9;9573;9569:25;9564:3;9557:38;9624:6;9619:3;9615:16;9608:23;;9504:137;;9650:341;9717:38;9749:5;9717:38;:::i;:::-;9777:1;9791:154;9805:6;9802:1;9799:13;9791:154;;;9879:7;9873:14;9869:1;9864:3;9860:11;9853:35;9929:1;9920:7;9916:15;9905:26;;9827:4;9824:1;9820:12;9815:17;;9791:154;;;9974:6;9969:3;9965:16;9958:23;;9657:334;;9471:520;;9259:738;;;;;;:::o;10003:366::-;10145:3;10166:67;10230:2;10225:3;10166:67;:::i;:::-;10159:74;;10242:93;10331:3;10242:93;:::i;:::-;10360:2;10355:3;10351:12;10344:19;;10149:220;;;:::o;10375:366::-;10517:3;10538:67;10602:2;10597:3;10538:67;:::i;:::-;10531:74;;10614:93;10703:3;10614:93;:::i;:::-;10732:2;10727:3;10723:12;10716:19;;10521:220;;;:::o;10747:366::-;10889:3;10910:67;10974:2;10969:3;10910:67;:::i;:::-;10903:74;;10986:93;11075:3;10986:93;:::i;:::-;11104:2;11099:3;11095:12;11088:19;;10893:220;;;:::o;11119:366::-;11261:3;11282:67;11346:2;11341:3;11282:67;:::i;:::-;11275:74;;11358:93;11447:3;11358:93;:::i;:::-;11476:2;11471:3;11467:12;11460:19;;11265:220;;;:::o;11491:366::-;11633:3;11654:67;11718:2;11713:3;11654:67;:::i;:::-;11647:74;;11730:93;11819:3;11730:93;:::i;:::-;11848:2;11843:3;11839:12;11832:19;;11637:220;;;:::o;11863:366::-;12005:3;12026:67;12090:2;12085:3;12026:67;:::i;:::-;12019:74;;12102:93;12191:3;12102:93;:::i;:::-;12220:2;12215:3;12211:12;12204:19;;12009:220;;;:::o;12235:366::-;12377:3;12398:67;12462:2;12457:3;12398:67;:::i;:::-;12391:74;;12474:93;12563:3;12474:93;:::i;:::-;12592:2;12587:3;12583:12;12576:19;;12381:220;;;:::o;12607:118::-;12694:24;12712:5;12694:24;:::i;:::-;12689:3;12682:37;12672:53;;:::o;12731:256::-;12843:3;12858:75;12929:3;12920:6;12858:75;:::i;:::-;12958:2;12953:3;12949:12;12942:19;;12978:3;12971:10;;12847:140;;;;:::o;12993:397::-;13133:3;13148:75;13219:3;13210:6;13148:75;:::i;:::-;13248:2;13243:3;13239:12;13232:19;;13261:75;13332:3;13323:6;13261:75;:::i;:::-;13361:2;13356:3;13352:12;13345:19;;13381:3;13374:10;;13137:253;;;;;:::o;13396:429::-;13573:3;13595:95;13686:3;13677:6;13595:95;:::i;:::-;13588:102;;13707:92;13795:3;13786:6;13707:92;:::i;:::-;13700:99;;13816:3;13809:10;;13577:248;;;;;:::o;13831:222::-;13924:4;13962:2;13951:9;13947:18;13939:26;;13975:71;14043:1;14032:9;14028:17;14019:6;13975:71;:::i;:::-;13929:124;;;;:::o;14059:640::-;14254:4;14292:3;14281:9;14277:19;14269:27;;14306:71;14374:1;14363:9;14359:17;14350:6;14306:71;:::i;:::-;14387:72;14455:2;14444:9;14440:18;14431:6;14387:72;:::i;:::-;14469;14537:2;14526:9;14522:18;14513:6;14469:72;:::i;:::-;14588:9;14582:4;14578:20;14573:2;14562:9;14558:18;14551:48;14616:76;14687:4;14678:6;14616:76;:::i;:::-;14608:84;;14259:440;;;;;;;:::o;14705:210::-;14792:4;14830:2;14819:9;14815:18;14807:26;;14843:65;14905:1;14894:9;14890:17;14881:6;14843:65;:::i;:::-;14797:118;;;;:::o;14921:222::-;15014:4;15052:2;15041:9;15037:18;15029:26;;15065:71;15133:1;15122:9;15118:17;15109:6;15065:71;:::i;:::-;15019:124;;;;:::o;15149:313::-;15262:4;15300:2;15289:9;15285:18;15277:26;;15349:9;15343:4;15339:20;15335:1;15324:9;15320:17;15313:47;15377:78;15450:4;15441:6;15377:78;:::i;:::-;15369:86;;15267:195;;;;:::o;15468:419::-;15634:4;15672:2;15661:9;15657:18;15649:26;;15721:9;15715:4;15711:20;15707:1;15696:9;15692:17;15685:47;15749:131;15875:4;15749:131;:::i;:::-;15741:139;;15639:248;;;:::o;15893:419::-;16059:4;16097:2;16086:9;16082:18;16074:26;;16146:9;16140:4;16136:20;16132:1;16121:9;16117:17;16110:47;16174:131;16300:4;16174:131;:::i;:::-;16166:139;;16064:248;;;:::o;16318:419::-;16484:4;16522:2;16511:9;16507:18;16499:26;;16571:9;16565:4;16561:20;16557:1;16546:9;16542:17;16535:47;16599:131;16725:4;16599:131;:::i;:::-;16591:139;;16489:248;;;:::o;16743:419::-;16909:4;16947:2;16936:9;16932:18;16924:26;;16996:9;16990:4;16986:20;16982:1;16971:9;16967:17;16960:47;17024:131;17150:4;17024:131;:::i;:::-;17016:139;;16914:248;;;:::o;17168:419::-;17334:4;17372:2;17361:9;17357:18;17349:26;;17421:9;17415:4;17411:20;17407:1;17396:9;17392:17;17385:47;17449:131;17575:4;17449:131;:::i;:::-;17441:139;;17339:248;;;:::o;17593:419::-;17759:4;17797:2;17786:9;17782:18;17774:26;;17846:9;17840:4;17836:20;17832:1;17821:9;17817:17;17810:47;17874:131;18000:4;17874:131;:::i;:::-;17866:139;;17764:248;;;:::o;18018:419::-;18184:4;18222:2;18211:9;18207:18;18199:26;;18271:9;18265:4;18261:20;18257:1;18246:9;18242:17;18235:47;18299:131;18425:4;18299:131;:::i;:::-;18291:139;;18189:248;;;:::o;18443:222::-;18536:4;18574:2;18563:9;18559:18;18551:26;;18587:71;18655:1;18644:9;18640:17;18631:6;18587:71;:::i;:::-;18541:124;;;;:::o;18671:129::-;18705:6;18732:20;;:::i;:::-;18722:30;;18761:33;18789:4;18781:6;18761:33;:::i;:::-;18712:88;;;:::o;18806:75::-;18839:6;18872:2;18866:9;18856:19;;18846:35;:::o;18887:307::-;18948:4;19038:18;19030:6;19027:30;19024:2;;;19060:18;;:::i;:::-;19024:2;19098:29;19120:6;19098:29;:::i;:::-;19090:37;;19182:4;19176;19172:15;19164:23;;18953:241;;;:::o;19200:308::-;19262:4;19352:18;19344:6;19341:30;19338:2;;;19374:18;;:::i;:::-;19338:2;19412:29;19434:6;19412:29;:::i;:::-;19404:37;;19496:4;19490;19486:15;19478:23;;19267:241;;;:::o;19514:141::-;19563:4;19586:3;19578:11;;19609:3;19606:1;19599:14;19643:4;19640:1;19630:18;19622:26;;19568:87;;;:::o;19661:98::-;19712:6;19746:5;19740:12;19730:22;;19719:40;;;:::o;19765:99::-;19817:6;19851:5;19845:12;19835:22;;19824:40;;;:::o;19870:168::-;19953:11;19987:6;19982:3;19975:19;20027:4;20022:3;20018:14;20003:29;;19965:73;;;;:::o;20044:169::-;20128:11;20162:6;20157:3;20150:19;20202:4;20197:3;20193:14;20178:29;;20140:73;;;;:::o;20219:148::-;20321:11;20358:3;20343:18;;20333:34;;;;:::o;20373:305::-;20413:3;20432:20;20450:1;20432:20;:::i;:::-;20427:25;;20466:20;20484:1;20466:20;:::i;:::-;20461:25;;20620:1;20552:66;20548:74;20545:1;20542:81;20539:2;;;20626:18;;:::i;:::-;20539:2;20670:1;20667;20663:9;20656:16;;20417:261;;;;:::o;20684:96::-;20721:7;20750:24;20768:5;20750:24;:::i;:::-;20739:35;;20729:51;;;:::o;20786:90::-;20820:7;20863:5;20856:13;20849:21;20838:32;;20828:48;;;:::o;20882:77::-;20919:7;20948:5;20937:16;;20927:32;;;:::o;20965:149::-;21001:7;21041:66;21034:5;21030:78;21019:89;;21009:105;;;:::o;21120:126::-;21157:7;21197:42;21190:5;21186:54;21175:65;;21165:81;;;:::o;21252:77::-;21289:7;21318:5;21307:16;;21297:32;;;:::o;21335:154::-;21419:6;21414:3;21409;21396:30;21481:1;21472:6;21467:3;21463:16;21456:27;21386:103;;;:::o;21495:307::-;21563:1;21573:113;21587:6;21584:1;21581:13;21573:113;;;21672:1;21667:3;21663:11;21657:18;21653:1;21648:3;21644:11;21637:39;21609:2;21606:1;21602:10;21597:15;;21573:113;;;21704:6;21701:1;21698:13;21695:2;;;21784:1;21775:6;21770:3;21766:16;21759:27;21695:2;21544:258;;;;:::o;21808:320::-;21852:6;21889:1;21883:4;21879:12;21869:22;;21936:1;21930:4;21926:12;21957:18;21947:2;;22013:4;22005:6;22001:17;21991:27;;21947:2;22075;22067:6;22064:14;22044:18;22041:38;22038:2;;;22094:18;;:::i;:::-;22038:2;21859:269;;;;:::o;22134:281::-;22217:27;22239:4;22217:27;:::i;:::-;22209:6;22205:40;22347:6;22335:10;22332:22;22311:18;22299:10;22296:34;22293:62;22290:2;;;22358:18;;:::i;:::-;22290:2;22398:10;22394:2;22387:22;22177:238;;;:::o;22421:233::-;22460:3;22483:24;22501:5;22483:24;:::i;:::-;22474:33;;22529:66;22522:5;22519:77;22516:2;;;22599:18;;:::i;:::-;22516:2;22646:1;22639:5;22635:13;22628:20;;22464:190;;;:::o;22660:100::-;22699:7;22728:26;22748:5;22728:26;:::i;:::-;22717:37;;22707:53;;;:::o;22766:79::-;22805:7;22834:5;22823:16;;22813:32;;;:::o;22851:94::-;22890:7;22919:20;22933:5;22919:20;:::i;:::-;22908:31;;22898:47;;;:::o;22951:180::-;22999:77;22996:1;22989:88;23096:4;23093:1;23086:15;23120:4;23117:1;23110:15;23137:180;23185:77;23182:1;23175:88;23282:4;23279:1;23272:15;23306:4;23303:1;23296:15;23323:180;23371:77;23368:1;23361:88;23468:4;23465:1;23458:15;23492:4;23489:1;23482:15;23509:102;23550:6;23601:2;23597:7;23592:2;23585:5;23581:14;23577:28;23567:38;;23557:54;;;:::o;23617:94::-;23650:8;23698:5;23694:2;23690:14;23669:35;;23659:52;;;:::o;23717:171::-;23857:23;23853:1;23845:6;23841:14;23834:47;23823:65;:::o;23894:225::-;24034:34;24030:1;24022:6;24018:14;24011:58;24103:8;24098:2;24090:6;24086:15;24079:33;24000:119;:::o;24125:171::-;24265:23;24261:1;24253:6;24249:14;24242:47;24231:65;:::o;24302:182::-;24442:34;24438:1;24430:6;24426:14;24419:58;24408:76;:::o;24490:173::-;24630:25;24626:1;24618:6;24614:14;24607:49;24596:67;:::o;24669:234::-;24809:34;24805:1;24797:6;24793:14;24786:58;24878:17;24873:2;24865:6;24861:15;24854:42;24775:128;:::o;24909:163::-;25049:15;25045:1;25037:6;25033:14;25026:39;25015:57;:::o;25078:122::-;25151:24;25169:5;25151:24;:::i;:::-;25144:5;25141:35;25131:2;;25190:1;25187;25180:12;25131:2;25121:79;:::o;25206:116::-;25276:21;25291:5;25276:21;:::i;:::-;25269:5;25266:32;25256:2;;25312:1;25309;25302:12;25256:2;25246:76;:::o;25328:122::-;25401:24;25419:5;25401:24;:::i;:::-;25394:5;25391:35;25381:2;;25440:1;25437;25430:12;25381:2;25371:79;:::o;25456:120::-;25528:23;25545:5;25528:23;:::i;:::-;25521:5;25518:34;25508:2;;25566:1;25563;25556:12;25508:2;25498:78;:::o;25582:122::-;25655:24;25673:5;25655:24;:::i;:::-;25648:5;25645:35;25635:2;;25694:1;25691;25684:12;25635:2;25625:79;:::o

Swarm Source

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