ETH Price: $2,782.95 (+1.22%)
Gas: 4.42 Gwei

Token

Buff Doge NFT (BD)
 

Overview

Max Total Supply

178 BD

Holders

82

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
15 BD
0x0e279033ea931f98908cc52e1abfca60118caeba
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:
BD

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-15
*/

/**
 *Submitted for verification at Etherscan.io on 2021-12-14
*/

// SPDX-License-Identifier: MIT

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.0 (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/token/ERC721/IERC721Receiver.sol


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts v4.4.0 (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/token/ERC721/ERC721.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // 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;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @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 virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @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) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        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 virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_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 {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _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 {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @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`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * 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
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

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


// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

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


// OpenZeppelin Contracts v4.4.0 (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/BD.sol



pragma solidity ^0.8.4;




contract BD is ERC721Enumerable, Ownable {

    uint256 public tokenPricePresale = 0.06 ether;
    uint256 public tokenPricePublicSale = 0.08 ether;
    
    uint256 public constant giftUniquesStart = 0;
    uint256 public giftUniquesMinted = 0;
    uint256 public constant giftUniquesTotal = 17;

    uint256 public constant giftRegularsStart = giftUniquesStart + giftUniquesTotal;
    uint256 public giftRegularsMinted = 0;
    uint256 public constant giftRegularsTotal = 50;

    uint256 public constant forPurchaseStart = giftRegularsStart + giftRegularsTotal;
    uint256 public forPurchaseMinted = 0;
    uint256 public constant forPurchaseTotal = 5555 + 20 - giftUniquesTotal - giftRegularsTotal;

    uint256 public maxTokensPerMint = 10;
    uint256 public maxTokensPerWhitelistedAddress = 2;

    bool public hasPresaleStarted = false;
    bool public hasPublicSaleStarted = false;

    string public tokenBaseURI = "ipfs://QmfUnzwB6h2Nbx4gD8kh8pnPAc5BmrnuYeP4hVxrZUV8es/";

    mapping(address => bool) public presaleWhitelist;
    mapping(address => uint256) public presaleWhitelistPurchased;

    constructor() ERC721("Buff Doge NFT", "BD") {
        
    }

    function setTokenPricePresale(uint256 val) external onlyOwner {
        tokenPricePresale = val;
    }
    
    function setTokenPricePublicSale(uint256 val) external onlyOwner {
        tokenPricePublicSale = val;
    }

    function tokenPrice() public view returns (uint256) {
        if (hasPublicSaleStarted) {
            return tokenPricePublicSale;
        } else {
            return tokenPricePresale;
        }
    }

    function setMaxTokensPerMint(uint256 val) external onlyOwner {
        maxTokensPerMint = val;
    }

    function setMaxTokensPerWhitelistedAddress(uint256 val) external onlyOwner {
        maxTokensPerWhitelistedAddress = val;
    }

    function setPresale(bool val) external onlyOwner {
        hasPresaleStarted = val;
    }

    function setPublicSale(bool val) external onlyOwner {
        hasPublicSaleStarted = val;
    }

    function addToPresaleWhitelist(address[] calldata entries) external onlyOwner {
        for(uint256 i = 0; i < entries.length; i++) {
            presaleWhitelist[entries[i]] = true;
        }   
    }

    function removeFromPresaleWhitelist(address[] calldata entries) external onlyOwner {
        for(uint256 i = 0; i < entries.length; i++) {
            presaleWhitelist[entries[i]] = false;
        }
    }

    function giftUnique(address[] calldata receivers) external onlyOwner {
        require(giftUniquesMinted + receivers.length <= giftRegularsTotal, "Unique gifts empty");

        for (uint256 i = 0; i < receivers.length; i++) {
            _safeMint(receivers[i], 1 + giftUniquesStart + giftUniquesMinted + i);
        }

        giftUniquesMinted += receivers.length;
    }

    function giftRegular(address[] calldata receivers) external onlyOwner {
        require(giftRegularsMinted + receivers.length <= giftRegularsTotal, "Regular gifts empty");

        for (uint256 i = 0; i < receivers.length; i++) {
            _safeMint(receivers[i], 1 + giftRegularsStart + giftRegularsMinted + i);
        }

        giftRegularsMinted += receivers.length;
    }

    function mint(uint256 amount) external payable {
        require(msg.value >= tokenPrice() * amount, "Incorrect ETH");
        require(hasPresaleStarted, "Cannot mint before presale");
        require(hasPublicSaleStarted || presaleWhitelist[msg.sender], "Buyer not whitelisted for presale");
        require(amount <= maxTokensPerMint, "Cannot mint more than the max tokens per mint");
        require(forPurchaseMinted + amount <= forPurchaseTotal, "No tokens left for minting");
        require(hasPublicSaleStarted || (presaleWhitelistPurchased[msg.sender] + amount <= maxTokensPerWhitelistedAddress),
          "Cannot mint more than the max tokens per whitelisted address");

        for(uint256 i = 0; i < amount; i++) {
            _safeMint(msg.sender, 1 + forPurchaseStart + forPurchaseMinted + i);
        }

        if (!hasPublicSaleStarted) {
            presaleWhitelistPurchased[msg.sender] += amount;
        }

        forPurchaseMinted += amount;
    }
    
    function _baseURI() internal view override(ERC721) returns (string memory) {
        return tokenBaseURI;
    }
   
    function setBaseURI(string calldata URI) external onlyOwner {
        tokenBaseURI = URI;
    }

    function withdraw() external onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"entries","type":"address[]"}],"name":"addToPresaleWhitelist","outputs":[],"stateMutability":"nonpayable","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":"forPurchaseMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forPurchaseStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forPurchaseTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"}],"name":"giftRegular","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"giftRegularsMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giftRegularsStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giftRegularsTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"}],"name":"giftUnique","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"giftUniquesMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giftUniquesStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giftUniquesTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasPresaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasPublicSaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"maxTokensPerMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokensPerWhitelistedAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presaleWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presaleWhitelistPurchased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"entries","type":"address[]"}],"name":"removeFromPresaleWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setMaxTokensPerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setMaxTokensPerWhitelistedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"setPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"setPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setTokenPricePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setTokenPricePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPricePresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPricePublicSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

66d529ae9e860000600b5567011c37937e080000600c556000600d819055600e819055600f55600a60105560026011556012805461ffff1916905560e0604052603660808181529062002cd860a0398051620000649160139160209091019062000151565b503480156200007257600080fd5b50604080518082018252600d81526c109d599988111bd9d948139195609a1b602080830191825283518085019094526002845261109160f21b908401528151919291620000c29160009162000151565b508051620000d890600190602084019062000151565b505050620000f5620000ef620000fb60201b60201c565b620000ff565b62000234565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200015f90620001f7565b90600052602060002090601f016020900481019282620001835760008555620001ce565b82601f106200019e57805160ff1916838001178555620001ce565b82800160010185558215620001ce579182015b82811115620001ce578251825591602001919060010190620001b1565b50620001dc929150620001e0565b5090565b5b80821115620001dc5760008155600101620001e1565b600181811c908216806200020c57607f821691505b602082108114156200022e57634e487b7160e01b600052602260045260246000fd5b50919050565b612a9480620002446000396000f3fe6080604052600436106102e45760003560e01c806370a0823111610190578063a0712d68116100dc578063c87b56dd11610095578063f2fde38b1161006f578063f2fde38b14610879578063f9873dd114610899578063fdd4b0f0146108af578063ffc22fa8146108ce57600080fd5b8063c87b56dd146107e0578063e985e9c514610800578063eb8835ab1461084957600080fd5b8063a0712d681461073e578063a22cb46514610751578063b022001514610771578063b88d4fde1461078b578063bcb3714a146107ab578063c54e73e3146107c057600080fd5b80638b5b0cb5116101495780638e07484c116101235780638e07484c146106d45780638f65fe0a146106f457806395d89b41146107145780639922e3951461072957600080fd5b80638b5b0cb51461068c5780638bf9932c146106a15780638da5cb5b146106b657600080fd5b806370a08231146105ec578063715018a61461060c578063762cda3c1461062157806378c5fe37146106415780637d5eff12146106575780637ff9b5961461067757600080fd5b8063366b29621161024f5780634f6ccce7116102085780635aca1bb6116101e25780635aca1bb61461057657806360033400146105965780636352211e146105ac578063660112dc146105cc57600080fd5b80634f6ccce71461052057806353f6fa001461054057806355f804b31461055657600080fd5b8063366b2962146104745780633ccfd60b1461048957806342842e0e1461049e57806346c4dc27146104be57806348df7424146104de5780634e99b8001461050b57600080fd5b806317465471116102a157806317465471146103d357806318160ddd146103e957806323b872dd146103fe5780632b0384111461041e5780632f745c5914610434578063311df29a1461045457600080fd5b806301ffc9a7146102e957806301fff7f01461031e57806306fdde031461034157806307c5fc8c14610363578063081812fc14610379578063095ea7b3146103b1575b600080fd5b3480156102f557600080fd5b506103096103043660046126ac565b6108ee565b60405190151581526020015b60405180910390f35b34801561032a57600080fd5b50610333610919565b604051908152602001610315565b34801561034d57600080fd5b50610356610928565b60405161031591906127f7565b34801561036f57600080fd5b50610333600e5481565b34801561038557600080fd5b50610399610394366004612746565b6109ba565b6040516001600160a01b039091168152602001610315565b3480156103bd57600080fd5b506103d16103cc3660046125f2565b610a54565b005b3480156103df57600080fd5b5061033360105481565b3480156103f557600080fd5b50600854610333565b34801561040a57600080fd5b506103d16104193660046124b0565b610b6a565b34801561042a57600080fd5b50610333600b5481565b34801561044057600080fd5b5061033361044f3660046125f2565b610b9b565b34801561046057600080fd5b506103d161046f366004612746565b610c31565b34801561048057600080fd5b50610333603281565b34801561049557600080fd5b506103d1610c60565b3480156104aa57600080fd5b506103d16104b93660046124b0565b610cb0565b3480156104ca57600080fd5b506103d16104d9366004612746565b610ccb565b3480156104ea57600080fd5b506103336104f9366004612462565b60156020526000908152604090205481565b34801561051757600080fd5b50610356610cfa565b34801561052c57600080fd5b5061033361053b366004612746565b610d88565b34801561054c57600080fd5b50610333600d5481565b34801561056257600080fd5b506103d16105713660046126e6565b610e1b565b34801561058257600080fd5b506103d1610591366004612691565b610e51565b3480156105a257600080fd5b5061033360115481565b3480156105b857600080fd5b506103996105c7366004612746565b610e95565b3480156105d857600080fd5b506103d16105e736600461261c565b610f0c565b3480156105f857600080fd5b50610333610607366004612462565b61101a565b34801561061857600080fd5b506103d16110a1565b34801561062d57600080fd5b506103d161063c366004612746565b6110d5565b34801561064d57600080fd5b50610333600c5481565b34801561066357600080fd5b506103d161067236600461261c565b611104565b34801561068357600080fd5b506103336111fc565b34801561069857600080fd5b50610333601181565b3480156106ad57600080fd5b50610333600081565b3480156106c257600080fd5b50600a546001600160a01b0316610399565b3480156106e057600080fd5b506103d16106ef36600461261c565b61121d565b34801561070057600080fd5b506103d161070f36600461261c565b6112b9565b34801561072057600080fd5b50610356611355565b34801561073557600080fd5b50610333611364565b6103d161074c366004612746565b61137d565b34801561075d57600080fd5b506103d161076c3660046125c8565b6116ab565b34801561077d57600080fd5b506012546103099060ff1681565b34801561079757600080fd5b506103d16107a63660046124ec565b6116ba565b3480156107b757600080fd5b506103336116f2565b3480156107cc57600080fd5b506103d16107db366004612691565b61170a565b3480156107ec57600080fd5b506103566107fb366004612746565b611747565b34801561080c57600080fd5b5061030961081b36600461247d565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561085557600080fd5b50610309610864366004612462565b60146020526000908152604090205460ff1681565b34801561088557600080fd5b506103d1610894366004612462565b611822565b3480156108a557600080fd5b50610333600f5481565b3480156108bb57600080fd5b5060125461030990610100900460ff1681565b3480156108da57600080fd5b506103d16108e9366004612746565b6118bd565b60006001600160e01b0319821663780e9d6360e01b14806109135750610913826118ec565b92915050565b610925601160006128e2565b81565b60606000805461093790612970565b80601f016020809104026020016040519081016040528092919081815260200182805461096390612970565b80156109b05780601f10610985576101008083540402835291602001916109b0565b820191906000526020600020905b81548152906001019060200180831161099357829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610a385760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a5f82610e95565b9050806001600160a01b0316836001600160a01b03161415610acd5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a2f565b336001600160a01b0382161480610ae95750610ae9813361081b565b610b5b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a2f565b610b65838361193c565b505050565b610b7433826119aa565b610b905760405162461bcd60e51b8152600401610a2f90612891565b610b65838383611aa1565b6000610ba68361101a565b8210610c085760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610a2f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610c5b5760405162461bcd60e51b8152600401610a2f9061285c565b600b55565b600a546001600160a01b03163314610c8a5760405162461bcd60e51b8152600401610a2f9061285c565b60405133904780156108fc02916000818181858888f19350505050610cae57600080fd5b565b610b65838383604051806020016040528060008152506116ba565b600a546001600160a01b03163314610cf55760405162461bcd60e51b8152600401610a2f9061285c565b600c55565b60138054610d0790612970565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3390612970565b8015610d805780601f10610d5557610100808354040283529160200191610d80565b820191906000526020600020905b815481529060010190602001808311610d6357829003601f168201915b505050505081565b6000610d9360085490565b8210610df65760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610a2f565b60088281548110610e0957610e09612a1c565b90600052602060002001549050919050565b600a546001600160a01b03163314610e455760405162461bcd60e51b8152600401610a2f9061285c565b610b656013838361239d565b600a546001600160a01b03163314610e7b5760405162461bcd60e51b8152600401610a2f9061285c565b601280549115156101000261ff0019909216919091179055565b6000818152600260205260408120546001600160a01b0316806109135760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610a2f565b600a546001600160a01b03163314610f365760405162461bcd60e51b8152600401610a2f9061285c565b600d54603290610f479083906128e2565b1115610f8a5760405162461bcd60e51b8152602060048201526012602482015271556e6971756520676966747320656d70747960701b6044820152606401610a2f565b60005b81811015610ffb57610fe9838383818110610faa57610faa612a1c565b9050602002016020810190610fbf9190612462565b600d548390610fd0600060016128e2565b610fda91906128e2565b610fe491906128e2565b611c4c565b80610ff3816129ab565b915050610f8d565b5081819050600d600082825461101191906128e2565b90915550505050565b60006001600160a01b0382166110855760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610a2f565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146110cb5760405162461bcd60e51b8152600401610a2f9061285c565b610cae6000611c66565b600a546001600160a01b031633146110ff5760405162461bcd60e51b8152600401610a2f9061285c565b601055565b600a546001600160a01b0316331461112e5760405162461bcd60e51b8152600401610a2f9061285c565b600e5460329061113f9083906128e2565b11156111835760405162461bcd60e51b8152602060048201526013602482015272526567756c617220676966747320656d70747960681b6044820152606401610a2f565b60005b818110156111e6576111d48383838181106111a3576111a3612a1c565b90506020020160208101906111b89190612462565b600e5483906111c9601160006128e2565b610fd09060016128e2565b806111de816129ab565b915050611186565b5081819050600e600082825461101191906128e2565b601254600090610100900460ff16156112165750600c5490565b50600b5490565b600a546001600160a01b031633146112475760405162461bcd60e51b8152600401610a2f9061285c565b60005b81811015610b655760016014600085858581811061126a5761126a612a1c565b905060200201602081019061127f9190612462565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806112b1816129ab565b91505061124a565b600a546001600160a01b031633146112e35760405162461bcd60e51b8152600401610a2f9061285c565b60005b81811015610b655760006014600085858581811061130657611306612a1c565b905060200201602081019061131b9190612462565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061134d816129ab565b9150506112e6565b60606001805461093790612970565b603261137360116115c761292d565b610925919061292d565b806113866111fc565b611390919061290e565b3410156113cf5760405162461bcd60e51b815260206004820152600d60248201526c092dcc6dee4e4cac6e8408aa89609b1b6044820152606401610a2f565b60125460ff166114215760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f74206d696e74206265666f72652070726573616c650000000000006044820152606401610a2f565b601254610100900460ff168061144657503360009081526014602052604090205460ff165b61149c5760405162461bcd60e51b815260206004820152602160248201527f4275796572206e6f742077686974656c697374656420666f722070726573616c6044820152606560f81b6064820152608401610a2f565b6010548111156115045760405162461bcd60e51b815260206004820152602d60248201527f43616e6e6f74206d696e74206d6f7265207468616e20746865206d617820746f60448201526c1ad95b9cc81c195c881b5a5b9d609a1b6064820152608401610a2f565b603261151360116115c761292d565b61151d919061292d565b81600f5461152b91906128e2565b11156115795760405162461bcd60e51b815260206004820152601a60248201527f4e6f20746f6b656e73206c65667420666f72206d696e74696e670000000000006044820152606401610a2f565b601254610100900460ff16806115ab5750601154336000908152601560205260409020546115a89083906128e2565b11155b61161d5760405162461bcd60e51b815260206004820152603c60248201527f43616e6e6f74206d696e74206d6f7265207468616e20746865206d617820746f60448201527f6b656e73207065722077686974656c69737465642061646472657373000000006064820152608401610a2f565b60005b8181101561165c5761164a3382600f5460326011600061164091906128e2565b6111c991906128e2565b80611654816129ab565b915050611620565b50601254610100900460ff1661169157336000908152601560205260408120805483929061168b9084906128e2565b90915550505b80600f60008282546116a391906128e2565b909155505050565b6116b6338383611cb8565b5050565b6116c433836119aa565b6116e05760405162461bcd60e51b8152600401610a2f90612891565b6116ec84848484611d87565b50505050565b6032611700601160006128e2565b61092591906128e2565b600a546001600160a01b031633146117345760405162461bcd60e51b8152600401610a2f9061285c565b6012805460ff1916911515919091179055565b6000818152600260205260409020546060906001600160a01b03166117c65760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a2f565b60006117d0611dba565b905060008151116117f0576040518060200160405280600081525061181b565b806117fa84611dc9565b60405160200161180b92919061278b565b6040516020818303038152906040525b9392505050565b600a546001600160a01b0316331461184c5760405162461bcd60e51b8152600401610a2f9061285c565b6001600160a01b0381166118b15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a2f565b6118ba81611c66565b50565b600a546001600160a01b031633146118e75760405162461bcd60e51b8152600401610a2f9061285c565b601155565b60006001600160e01b031982166380ac58cd60e01b148061191d57506001600160e01b03198216635b5e139f60e01b145b8061091357506301ffc9a760e01b6001600160e01b0319831614610913565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061197182610e95565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611a235760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a2f565b6000611a2e83610e95565b9050806001600160a01b0316846001600160a01b03161480611a695750836001600160a01b0316611a5e846109ba565b6001600160a01b0316145b80611a9957506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611ab482610e95565b6001600160a01b031614611b1c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610a2f565b6001600160a01b038216611b7e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a2f565b611b89838383611ec7565b611b9460008261193c565b6001600160a01b0383166000908152600360205260408120805460019290611bbd90849061292d565b90915550506001600160a01b0382166000908152600360205260408120805460019290611beb9084906128e2565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6116b6828260405180602001604052806000815250611f7f565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611d1a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a2f565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611d92848484611aa1565b611d9e84848484611fb2565b6116ec5760405162461bcd60e51b8152600401610a2f9061280a565b60606013805461093790612970565b606081611ded5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e175780611e01816129ab565b9150611e109050600a836128fa565b9150611df1565b60008167ffffffffffffffff811115611e3257611e32612a32565b6040519080825280601f01601f191660200182016040528015611e5c576020820181803683370190505b5090505b8415611a9957611e7160018361292d565b9150611e7e600a866129c6565b611e899060306128e2565b60f81b818381518110611e9e57611e9e612a1c565b60200101906001600160f81b031916908160001a905350611ec0600a866128fa565b9450611e60565b6001600160a01b038316611f2257611f1d81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611f45565b816001600160a01b0316836001600160a01b031614611f4557611f4583826120bf565b6001600160a01b038216611f5c57610b658161215c565b826001600160a01b0316826001600160a01b031614610b6557610b65828261220b565b611f89838361224f565b611f966000848484611fb2565b610b655760405162461bcd60e51b8152600401610a2f9061280a565b60006001600160a01b0384163b156120b457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ff69033908990889088906004016127ba565b602060405180830381600087803b15801561201057600080fd5b505af1925050508015612040575060408051601f3d908101601f1916820190925261203d918101906126c9565b60015b61209a573d80801561206e576040519150601f19603f3d011682016040523d82523d6000602084013e612073565b606091505b5080516120925760405162461bcd60e51b8152600401610a2f9061280a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a99565b506001949350505050565b600060016120cc8461101a565b6120d6919061292d565b600083815260076020526040902054909150808214612129576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061216e9060019061292d565b6000838152600960205260408120546008805493945090928490811061219657612196612a1c565b9060005260206000200154905080600883815481106121b7576121b7612a1c565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806121ef576121ef612a06565b6001900381819060005260206000200160009055905550505050565b60006122168361101a565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166122a55760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a2f565b6000818152600260205260409020546001600160a01b03161561230a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a2f565b61231660008383611ec7565b6001600160a01b038216600090815260036020526040812080546001929061233f9084906128e2565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546123a990612970565b90600052602060002090601f0160209004810192826123cb5760008555612411565b82601f106123e45782800160ff19823516178555612411565b82800160010185558215612411579182015b828111156124115782358255916020019190600101906123f6565b5061241d929150612421565b5090565b5b8082111561241d5760008155600101612422565b80356001600160a01b038116811461244d57600080fd5b919050565b8035801515811461244d57600080fd5b60006020828403121561247457600080fd5b61181b82612436565b6000806040838503121561249057600080fd5b61249983612436565b91506124a760208401612436565b90509250929050565b6000806000606084860312156124c557600080fd5b6124ce84612436565b92506124dc60208501612436565b9150604084013590509250925092565b6000806000806080858703121561250257600080fd5b61250b85612436565b935061251960208601612436565b925060408501359150606085013567ffffffffffffffff8082111561253d57600080fd5b818701915087601f83011261255157600080fd5b81358181111561256357612563612a32565b604051601f8201601f19908116603f0116810190838211818310171561258b5761258b612a32565b816040528281528a60208487010111156125a457600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156125db57600080fd5b6125e483612436565b91506124a760208401612452565b6000806040838503121561260557600080fd5b61260e83612436565b946020939093013593505050565b6000806020838503121561262f57600080fd5b823567ffffffffffffffff8082111561264757600080fd5b818501915085601f83011261265b57600080fd5b81358181111561266a57600080fd5b8660208260051b850101111561267f57600080fd5b60209290920196919550909350505050565b6000602082840312156126a357600080fd5b61181b82612452565b6000602082840312156126be57600080fd5b813561181b81612a48565b6000602082840312156126db57600080fd5b815161181b81612a48565b600080602083850312156126f957600080fd5b823567ffffffffffffffff8082111561271157600080fd5b818501915085601f83011261272557600080fd5b81358181111561273457600080fd5b86602082850101111561267f57600080fd5b60006020828403121561275857600080fd5b5035919050565b60008151808452612777816020860160208601612944565b601f01601f19169290920160200192915050565b6000835161279d818460208801612944565b8351908301906127b1818360208801612944565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906127ed9083018461275f565b9695505050505050565b60208152600061181b602083018461275f565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156128f5576128f56129da565b500190565b600082612909576129096129f0565b500490565b6000816000190483118215151615612928576129286129da565b500290565b60008282101561293f5761293f6129da565b500390565b60005b8381101561295f578181015183820152602001612947565b838111156116ec5750506000910152565b600181811c9082168061298457607f821691505b602082108114156129a557634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156129bf576129bf6129da565b5060010190565b6000826129d5576129d56129f0565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146118ba57600080fdfea26469706673582212209b835bb49fc7a25cf6b21d9134bd03908bcaebe1caa58b1c5d5d118f0400f1e064736f6c63430008070033697066733a2f2f516d66556e7a77423668324e6278346744386b6838706e50416335426d726e7559655034685678725a55563865732f

Deployed Bytecode

0x6080604052600436106102e45760003560e01c806370a0823111610190578063a0712d68116100dc578063c87b56dd11610095578063f2fde38b1161006f578063f2fde38b14610879578063f9873dd114610899578063fdd4b0f0146108af578063ffc22fa8146108ce57600080fd5b8063c87b56dd146107e0578063e985e9c514610800578063eb8835ab1461084957600080fd5b8063a0712d681461073e578063a22cb46514610751578063b022001514610771578063b88d4fde1461078b578063bcb3714a146107ab578063c54e73e3146107c057600080fd5b80638b5b0cb5116101495780638e07484c116101235780638e07484c146106d45780638f65fe0a146106f457806395d89b41146107145780639922e3951461072957600080fd5b80638b5b0cb51461068c5780638bf9932c146106a15780638da5cb5b146106b657600080fd5b806370a08231146105ec578063715018a61461060c578063762cda3c1461062157806378c5fe37146106415780637d5eff12146106575780637ff9b5961461067757600080fd5b8063366b29621161024f5780634f6ccce7116102085780635aca1bb6116101e25780635aca1bb61461057657806360033400146105965780636352211e146105ac578063660112dc146105cc57600080fd5b80634f6ccce71461052057806353f6fa001461054057806355f804b31461055657600080fd5b8063366b2962146104745780633ccfd60b1461048957806342842e0e1461049e57806346c4dc27146104be57806348df7424146104de5780634e99b8001461050b57600080fd5b806317465471116102a157806317465471146103d357806318160ddd146103e957806323b872dd146103fe5780632b0384111461041e5780632f745c5914610434578063311df29a1461045457600080fd5b806301ffc9a7146102e957806301fff7f01461031e57806306fdde031461034157806307c5fc8c14610363578063081812fc14610379578063095ea7b3146103b1575b600080fd5b3480156102f557600080fd5b506103096103043660046126ac565b6108ee565b60405190151581526020015b60405180910390f35b34801561032a57600080fd5b50610333610919565b604051908152602001610315565b34801561034d57600080fd5b50610356610928565b60405161031591906127f7565b34801561036f57600080fd5b50610333600e5481565b34801561038557600080fd5b50610399610394366004612746565b6109ba565b6040516001600160a01b039091168152602001610315565b3480156103bd57600080fd5b506103d16103cc3660046125f2565b610a54565b005b3480156103df57600080fd5b5061033360105481565b3480156103f557600080fd5b50600854610333565b34801561040a57600080fd5b506103d16104193660046124b0565b610b6a565b34801561042a57600080fd5b50610333600b5481565b34801561044057600080fd5b5061033361044f3660046125f2565b610b9b565b34801561046057600080fd5b506103d161046f366004612746565b610c31565b34801561048057600080fd5b50610333603281565b34801561049557600080fd5b506103d1610c60565b3480156104aa57600080fd5b506103d16104b93660046124b0565b610cb0565b3480156104ca57600080fd5b506103d16104d9366004612746565b610ccb565b3480156104ea57600080fd5b506103336104f9366004612462565b60156020526000908152604090205481565b34801561051757600080fd5b50610356610cfa565b34801561052c57600080fd5b5061033361053b366004612746565b610d88565b34801561054c57600080fd5b50610333600d5481565b34801561056257600080fd5b506103d16105713660046126e6565b610e1b565b34801561058257600080fd5b506103d1610591366004612691565b610e51565b3480156105a257600080fd5b5061033360115481565b3480156105b857600080fd5b506103996105c7366004612746565b610e95565b3480156105d857600080fd5b506103d16105e736600461261c565b610f0c565b3480156105f857600080fd5b50610333610607366004612462565b61101a565b34801561061857600080fd5b506103d16110a1565b34801561062d57600080fd5b506103d161063c366004612746565b6110d5565b34801561064d57600080fd5b50610333600c5481565b34801561066357600080fd5b506103d161067236600461261c565b611104565b34801561068357600080fd5b506103336111fc565b34801561069857600080fd5b50610333601181565b3480156106ad57600080fd5b50610333600081565b3480156106c257600080fd5b50600a546001600160a01b0316610399565b3480156106e057600080fd5b506103d16106ef36600461261c565b61121d565b34801561070057600080fd5b506103d161070f36600461261c565b6112b9565b34801561072057600080fd5b50610356611355565b34801561073557600080fd5b50610333611364565b6103d161074c366004612746565b61137d565b34801561075d57600080fd5b506103d161076c3660046125c8565b6116ab565b34801561077d57600080fd5b506012546103099060ff1681565b34801561079757600080fd5b506103d16107a63660046124ec565b6116ba565b3480156107b757600080fd5b506103336116f2565b3480156107cc57600080fd5b506103d16107db366004612691565b61170a565b3480156107ec57600080fd5b506103566107fb366004612746565b611747565b34801561080c57600080fd5b5061030961081b36600461247d565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561085557600080fd5b50610309610864366004612462565b60146020526000908152604090205460ff1681565b34801561088557600080fd5b506103d1610894366004612462565b611822565b3480156108a557600080fd5b50610333600f5481565b3480156108bb57600080fd5b5060125461030990610100900460ff1681565b3480156108da57600080fd5b506103d16108e9366004612746565b6118bd565b60006001600160e01b0319821663780e9d6360e01b14806109135750610913826118ec565b92915050565b610925601160006128e2565b81565b60606000805461093790612970565b80601f016020809104026020016040519081016040528092919081815260200182805461096390612970565b80156109b05780601f10610985576101008083540402835291602001916109b0565b820191906000526020600020905b81548152906001019060200180831161099357829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610a385760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a5f82610e95565b9050806001600160a01b0316836001600160a01b03161415610acd5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a2f565b336001600160a01b0382161480610ae95750610ae9813361081b565b610b5b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a2f565b610b65838361193c565b505050565b610b7433826119aa565b610b905760405162461bcd60e51b8152600401610a2f90612891565b610b65838383611aa1565b6000610ba68361101a565b8210610c085760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610a2f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610c5b5760405162461bcd60e51b8152600401610a2f9061285c565b600b55565b600a546001600160a01b03163314610c8a5760405162461bcd60e51b8152600401610a2f9061285c565b60405133904780156108fc02916000818181858888f19350505050610cae57600080fd5b565b610b65838383604051806020016040528060008152506116ba565b600a546001600160a01b03163314610cf55760405162461bcd60e51b8152600401610a2f9061285c565b600c55565b60138054610d0790612970565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3390612970565b8015610d805780601f10610d5557610100808354040283529160200191610d80565b820191906000526020600020905b815481529060010190602001808311610d6357829003601f168201915b505050505081565b6000610d9360085490565b8210610df65760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610a2f565b60088281548110610e0957610e09612a1c565b90600052602060002001549050919050565b600a546001600160a01b03163314610e455760405162461bcd60e51b8152600401610a2f9061285c565b610b656013838361239d565b600a546001600160a01b03163314610e7b5760405162461bcd60e51b8152600401610a2f9061285c565b601280549115156101000261ff0019909216919091179055565b6000818152600260205260408120546001600160a01b0316806109135760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610a2f565b600a546001600160a01b03163314610f365760405162461bcd60e51b8152600401610a2f9061285c565b600d54603290610f479083906128e2565b1115610f8a5760405162461bcd60e51b8152602060048201526012602482015271556e6971756520676966747320656d70747960701b6044820152606401610a2f565b60005b81811015610ffb57610fe9838383818110610faa57610faa612a1c565b9050602002016020810190610fbf9190612462565b600d548390610fd0600060016128e2565b610fda91906128e2565b610fe491906128e2565b611c4c565b80610ff3816129ab565b915050610f8d565b5081819050600d600082825461101191906128e2565b90915550505050565b60006001600160a01b0382166110855760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610a2f565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146110cb5760405162461bcd60e51b8152600401610a2f9061285c565b610cae6000611c66565b600a546001600160a01b031633146110ff5760405162461bcd60e51b8152600401610a2f9061285c565b601055565b600a546001600160a01b0316331461112e5760405162461bcd60e51b8152600401610a2f9061285c565b600e5460329061113f9083906128e2565b11156111835760405162461bcd60e51b8152602060048201526013602482015272526567756c617220676966747320656d70747960681b6044820152606401610a2f565b60005b818110156111e6576111d48383838181106111a3576111a3612a1c565b90506020020160208101906111b89190612462565b600e5483906111c9601160006128e2565b610fd09060016128e2565b806111de816129ab565b915050611186565b5081819050600e600082825461101191906128e2565b601254600090610100900460ff16156112165750600c5490565b50600b5490565b600a546001600160a01b031633146112475760405162461bcd60e51b8152600401610a2f9061285c565b60005b81811015610b655760016014600085858581811061126a5761126a612a1c565b905060200201602081019061127f9190612462565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806112b1816129ab565b91505061124a565b600a546001600160a01b031633146112e35760405162461bcd60e51b8152600401610a2f9061285c565b60005b81811015610b655760006014600085858581811061130657611306612a1c565b905060200201602081019061131b9190612462565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061134d816129ab565b9150506112e6565b60606001805461093790612970565b603261137360116115c761292d565b610925919061292d565b806113866111fc565b611390919061290e565b3410156113cf5760405162461bcd60e51b815260206004820152600d60248201526c092dcc6dee4e4cac6e8408aa89609b1b6044820152606401610a2f565b60125460ff166114215760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f74206d696e74206265666f72652070726573616c650000000000006044820152606401610a2f565b601254610100900460ff168061144657503360009081526014602052604090205460ff165b61149c5760405162461bcd60e51b815260206004820152602160248201527f4275796572206e6f742077686974656c697374656420666f722070726573616c6044820152606560f81b6064820152608401610a2f565b6010548111156115045760405162461bcd60e51b815260206004820152602d60248201527f43616e6e6f74206d696e74206d6f7265207468616e20746865206d617820746f60448201526c1ad95b9cc81c195c881b5a5b9d609a1b6064820152608401610a2f565b603261151360116115c761292d565b61151d919061292d565b81600f5461152b91906128e2565b11156115795760405162461bcd60e51b815260206004820152601a60248201527f4e6f20746f6b656e73206c65667420666f72206d696e74696e670000000000006044820152606401610a2f565b601254610100900460ff16806115ab5750601154336000908152601560205260409020546115a89083906128e2565b11155b61161d5760405162461bcd60e51b815260206004820152603c60248201527f43616e6e6f74206d696e74206d6f7265207468616e20746865206d617820746f60448201527f6b656e73207065722077686974656c69737465642061646472657373000000006064820152608401610a2f565b60005b8181101561165c5761164a3382600f5460326011600061164091906128e2565b6111c991906128e2565b80611654816129ab565b915050611620565b50601254610100900460ff1661169157336000908152601560205260408120805483929061168b9084906128e2565b90915550505b80600f60008282546116a391906128e2565b909155505050565b6116b6338383611cb8565b5050565b6116c433836119aa565b6116e05760405162461bcd60e51b8152600401610a2f90612891565b6116ec84848484611d87565b50505050565b6032611700601160006128e2565b61092591906128e2565b600a546001600160a01b031633146117345760405162461bcd60e51b8152600401610a2f9061285c565b6012805460ff1916911515919091179055565b6000818152600260205260409020546060906001600160a01b03166117c65760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a2f565b60006117d0611dba565b905060008151116117f0576040518060200160405280600081525061181b565b806117fa84611dc9565b60405160200161180b92919061278b565b6040516020818303038152906040525b9392505050565b600a546001600160a01b0316331461184c5760405162461bcd60e51b8152600401610a2f9061285c565b6001600160a01b0381166118b15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a2f565b6118ba81611c66565b50565b600a546001600160a01b031633146118e75760405162461bcd60e51b8152600401610a2f9061285c565b601155565b60006001600160e01b031982166380ac58cd60e01b148061191d57506001600160e01b03198216635b5e139f60e01b145b8061091357506301ffc9a760e01b6001600160e01b0319831614610913565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061197182610e95565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611a235760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a2f565b6000611a2e83610e95565b9050806001600160a01b0316846001600160a01b03161480611a695750836001600160a01b0316611a5e846109ba565b6001600160a01b0316145b80611a9957506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611ab482610e95565b6001600160a01b031614611b1c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610a2f565b6001600160a01b038216611b7e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a2f565b611b89838383611ec7565b611b9460008261193c565b6001600160a01b0383166000908152600360205260408120805460019290611bbd90849061292d565b90915550506001600160a01b0382166000908152600360205260408120805460019290611beb9084906128e2565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6116b6828260405180602001604052806000815250611f7f565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611d1a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a2f565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611d92848484611aa1565b611d9e84848484611fb2565b6116ec5760405162461bcd60e51b8152600401610a2f9061280a565b60606013805461093790612970565b606081611ded5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e175780611e01816129ab565b9150611e109050600a836128fa565b9150611df1565b60008167ffffffffffffffff811115611e3257611e32612a32565b6040519080825280601f01601f191660200182016040528015611e5c576020820181803683370190505b5090505b8415611a9957611e7160018361292d565b9150611e7e600a866129c6565b611e899060306128e2565b60f81b818381518110611e9e57611e9e612a1c565b60200101906001600160f81b031916908160001a905350611ec0600a866128fa565b9450611e60565b6001600160a01b038316611f2257611f1d81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611f45565b816001600160a01b0316836001600160a01b031614611f4557611f4583826120bf565b6001600160a01b038216611f5c57610b658161215c565b826001600160a01b0316826001600160a01b031614610b6557610b65828261220b565b611f89838361224f565b611f966000848484611fb2565b610b655760405162461bcd60e51b8152600401610a2f9061280a565b60006001600160a01b0384163b156120b457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ff69033908990889088906004016127ba565b602060405180830381600087803b15801561201057600080fd5b505af1925050508015612040575060408051601f3d908101601f1916820190925261203d918101906126c9565b60015b61209a573d80801561206e576040519150601f19603f3d011682016040523d82523d6000602084013e612073565b606091505b5080516120925760405162461bcd60e51b8152600401610a2f9061280a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a99565b506001949350505050565b600060016120cc8461101a565b6120d6919061292d565b600083815260076020526040902054909150808214612129576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061216e9060019061292d565b6000838152600960205260408120546008805493945090928490811061219657612196612a1c565b9060005260206000200154905080600883815481106121b7576121b7612a1c565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806121ef576121ef612a06565b6001900381819060005260206000200160009055905550505050565b60006122168361101a565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166122a55760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a2f565b6000818152600260205260409020546001600160a01b03161561230a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a2f565b61231660008383611ec7565b6001600160a01b038216600090815260036020526040812080546001929061233f9084906128e2565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546123a990612970565b90600052602060002090601f0160209004810192826123cb5760008555612411565b82601f106123e45782800160ff19823516178555612411565b82800160010185558215612411579182015b828111156124115782358255916020019190600101906123f6565b5061241d929150612421565b5090565b5b8082111561241d5760008155600101612422565b80356001600160a01b038116811461244d57600080fd5b919050565b8035801515811461244d57600080fd5b60006020828403121561247457600080fd5b61181b82612436565b6000806040838503121561249057600080fd5b61249983612436565b91506124a760208401612436565b90509250929050565b6000806000606084860312156124c557600080fd5b6124ce84612436565b92506124dc60208501612436565b9150604084013590509250925092565b6000806000806080858703121561250257600080fd5b61250b85612436565b935061251960208601612436565b925060408501359150606085013567ffffffffffffffff8082111561253d57600080fd5b818701915087601f83011261255157600080fd5b81358181111561256357612563612a32565b604051601f8201601f19908116603f0116810190838211818310171561258b5761258b612a32565b816040528281528a60208487010111156125a457600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156125db57600080fd5b6125e483612436565b91506124a760208401612452565b6000806040838503121561260557600080fd5b61260e83612436565b946020939093013593505050565b6000806020838503121561262f57600080fd5b823567ffffffffffffffff8082111561264757600080fd5b818501915085601f83011261265b57600080fd5b81358181111561266a57600080fd5b8660208260051b850101111561267f57600080fd5b60209290920196919550909350505050565b6000602082840312156126a357600080fd5b61181b82612452565b6000602082840312156126be57600080fd5b813561181b81612a48565b6000602082840312156126db57600080fd5b815161181b81612a48565b600080602083850312156126f957600080fd5b823567ffffffffffffffff8082111561271157600080fd5b818501915085601f83011261272557600080fd5b81358181111561273457600080fd5b86602082850101111561267f57600080fd5b60006020828403121561275857600080fd5b5035919050565b60008151808452612777816020860160208601612944565b601f01601f19169290920160200192915050565b6000835161279d818460208801612944565b8351908301906127b1818360208801612944565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906127ed9083018461275f565b9695505050505050565b60208152600061181b602083018461275f565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156128f5576128f56129da565b500190565b600082612909576129096129f0565b500490565b6000816000190483118215151615612928576129286129da565b500290565b60008282101561293f5761293f6129da565b500390565b60005b8381101561295f578181015183820152602001612947565b838111156116ec5750506000910152565b600181811c9082168061298457607f821691505b602082108114156129a557634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156129bf576129bf6129da565b5060010190565b6000826129d5576129d56129f0565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146118ba57600080fdfea26469706673582212209b835bb49fc7a25cf6b21d9134bd03908bcaebe1caa58b1c5d5d118f0400f1e064736f6c63430008070033

Deployed Bytecode Sourcemap

44586:4669:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35842:224;;;;;;;;;;-1:-1:-1;35842:224:0;;;;;:::i;:::-;;:::i;:::-;;;6501:14:1;;6494:22;6476:41;;6464:2;6449:18;35842:224:0;;;;;;;;44897:79;;;;;;;;;;;;;:::i;:::-;;;17097:25:1;;;17085:2;17070:18;44897:79:0;16951:177:1;23336:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;44983:37::-;;;;;;;;;;;;;;;;24895:221;;;;;;;;;;-1:-1:-1;24895:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;5799:32:1;;;5781:51;;5769:2;5754:18;24895:221:0;5635:203:1;24418:411:0;;;;;;;;;;-1:-1:-1;24418:411:0;;;;;:::i;:::-;;:::i;:::-;;45312:36;;;;;;;;;;;;;;;;36482:113;;;;;;;;;;-1:-1:-1;36570:10:0;:17;36482:113;;25645:339;;;;;;;;;;-1:-1:-1;25645:339:0;;;;;:::i;:::-;;:::i;44636:45::-;;;;;;;;;;;;;;;;36150:256;;;;;;;;;;-1:-1:-1;36150:256:0;;;;;:::i;:::-;;:::i;45794:104::-;;;;;;;;;;-1:-1:-1;45794:104:0;;;;;:::i;:::-;;:::i;45027:46::-;;;;;;;;;;;;45071:2;45027:46;;49138:114;;;;;;;;;;;;;:::i;26055:185::-;;;;;;;;;;-1:-1:-1;26055:185:0;;;;;:::i;:::-;;:::i;45910:110::-;;;;;;;;;;-1:-1:-1;45910:110:0;;;;;:::i;:::-;;:::i;45655:60::-;;;;;;;;;;-1:-1:-1;45655:60:0;;;;;:::i;:::-;;;;;;;;;;;;;;45506:85;;;;;;;;;;;;;:::i;36672:233::-;;;;;;;;;;-1:-1:-1;36672:233:0;;;;;:::i;:::-;;:::i;44800:36::-;;;;;;;;;;;;;;;;49033:97;;;;;;;;;;-1:-1:-1;49033:97:0;;;;;:::i;:::-;;:::i;46590:::-;;;;;;;;;;-1:-1:-1;46590:97:0;;;;;:::i;:::-;;:::i;45355:49::-;;;;;;;;;;;;;;;;23030:239;;;;;;;;;;-1:-1:-1;23030:239:0;;;;;:::i;:::-;;:::i;47124:381::-;;;;;;;;;;-1:-1:-1;47124:381:0;;;;;:::i;:::-;;:::i;22760:208::-;;;;;;;;;;-1:-1:-1;22760:208:0;;;;;:::i;:::-;;:::i;43703:103::-;;;;;;;;;;;;;:::i;46243:102::-;;;;;;;;;;-1:-1:-1;46243:102:0;;;;;:::i;:::-;;:::i;44688:48::-;;;;;;;;;;;;;;;;47513:387;;;;;;;;;;-1:-1:-1;47513:387:0;;;;;:::i;:::-;;:::i;46028:207::-;;;;;;;;;;;;;:::i;44843:45::-;;;;;;;;;;;;44886:2;44843:45;;44749:44;;;;;;;;;;;;44792:1;44749:44;;43052:87;;;;;;;;;;-1:-1:-1;43125:6:0;;-1:-1:-1;;;;;43125:6:0;43052:87;;46695:205;;;;;;;;;;-1:-1:-1;46695:205:0;;;;;:::i;:::-;;:::i;46908:208::-;;;;;;;;;;-1:-1:-1;46908:208:0;;;;;:::i;:::-;;:::i;23505:104::-;;;;;;;;;;;;;:::i;45212:91::-;;;;;;;;;;;;;:::i;47908:989::-;;;;;;:::i;:::-;;:::i;25188:155::-;;;;;;;;;;-1:-1:-1;25188:155:0;;;;;:::i;:::-;;:::i;45413:37::-;;;;;;;;;;-1:-1:-1;45413:37:0;;;;;;;;26311:328;;;;;;;;;;-1:-1:-1;26311:328:0;;;;;:::i;:::-;;:::i;45082:80::-;;;;;;;;;;;;;:::i;46491:91::-;;;;;;;;;;-1:-1:-1;46491:91:0;;;;;:::i;:::-;;:::i;23680:334::-;;;;;;;;;;-1:-1:-1;23680:334:0;;;;;:::i;:::-;;:::i;25414:164::-;;;;;;;;;;-1:-1:-1;25414:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;25535:25:0;;;25511:4;25535:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25414:164;45600:48;;;;;;;;;;-1:-1:-1;45600:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;43961:201;;;;;;;;;;-1:-1:-1;43961:201:0;;;;;:::i;:::-;;:::i;45169:36::-;;;;;;;;;;;;;;;;45457:40;;;;;;;;;;-1:-1:-1;45457:40:0;;;;;;;;;;;46353:130;;;;;;;;;;-1:-1:-1;46353:130:0;;;;;:::i;:::-;;:::i;35842:224::-;35944:4;-1:-1:-1;;;;;;35968:50:0;;-1:-1:-1;;;35968:50:0;;:90;;;36022:36;36046:11;36022:23;:36::i;:::-;35961:97;35842:224;-1:-1:-1;;35842:224:0:o;44897:79::-;44941:35;44886:2;44792:1;44941:35;:::i;:::-;44897:79;:::o;23336:100::-;23390:13;23423:5;23416:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23336:100;:::o;24895:221::-;24971:7;28238:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28238:16:0;24991:73;;;;-1:-1:-1;;;24991:73:0;;13188:2:1;24991:73:0;;;13170:21:1;13227:2;13207:18;;;13200:30;13266:34;13246:18;;;13239:62;-1:-1:-1;;;13317:18:1;;;13310:42;13369:19;;24991:73:0;;;;;;;;;-1:-1:-1;25084:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25084:24:0;;24895:221::o;24418:411::-;24499:13;24515:23;24530:7;24515:14;:23::i;:::-;24499:39;;24563:5;-1:-1:-1;;;;;24557:11:0;:2;-1:-1:-1;;;;;24557:11:0;;;24549:57;;;;-1:-1:-1;;;24549:57:0;;14788:2:1;24549:57:0;;;14770:21:1;14827:2;14807:18;;;14800:30;14866:34;14846:18;;;14839:62;-1:-1:-1;;;14917:18:1;;;14910:31;14958:19;;24549:57:0;14586:397:1;24549:57:0;20865:10;-1:-1:-1;;;;;24641:21:0;;;;:62;;-1:-1:-1;24666:37:0;24683:5;20865:10;25414:164;:::i;24666:37::-;24619:168;;;;-1:-1:-1;;;24619:168:0;;11234:2:1;24619:168:0;;;11216:21:1;11273:2;11253:18;;;11246:30;11312:34;11292:18;;;11285:62;11383:26;11363:18;;;11356:54;11427:19;;24619:168:0;11032:420:1;24619:168:0;24800:21;24809:2;24813:7;24800:8;:21::i;:::-;24488:341;24418:411;;:::o;25645:339::-;25840:41;20865:10;25873:7;25840:18;:41::i;:::-;25832:103;;;;-1:-1:-1;;;25832:103:0;;;;;;;:::i;:::-;25948:28;25958:4;25964:2;25968:7;25948:9;:28::i;36150:256::-;36247:7;36283:23;36300:5;36283:16;:23::i;:::-;36275:5;:31;36267:87;;;;-1:-1:-1;;;36267:87:0;;7723:2:1;36267:87:0;;;7705:21:1;7762:2;7742:18;;;7735:30;7801:34;7781:18;;;7774:62;-1:-1:-1;;;7852:18:1;;;7845:41;7903:19;;36267:87:0;7521:407:1;36267:87:0;-1:-1:-1;;;;;;36372:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;36150:256::o;45794:104::-;43125:6;;-1:-1:-1;;;;;43125:6:0;20865:10;43272:23;43264:68;;;;-1:-1:-1;;;43264:68:0;;;;;;;:::i;:::-;45867:17:::1;:23:::0;45794:104::o;49138:114::-;43125:6;;-1:-1:-1;;;;;43125:6:0;20865:10;43272:23;43264:68;;;;-1:-1:-1;;;43264:68:0;;;;;;;:::i;:::-;49196:47:::1;::::0;49204:10:::1;::::0;49221:21:::1;49196:47:::0;::::1;;;::::0;::::1;::::0;;;49221:21;49204:10;49196:47;::::1;;;;;;49188:56;;;::::0;::::1;;49138:114::o:0;26055:185::-;26193:39;26210:4;26216:2;26220:7;26193:39;;;;;;;;;;;;:16;:39::i;45910:110::-;43125:6;;-1:-1:-1;;;;;43125:6:0;20865:10;43272:23;43264:68;;;;-1:-1:-1;;;43264:68:0;;;;;;;:::i;:::-;45986:20:::1;:26:::0;45910:110::o;45506:85::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36672:233::-;36747:7;36783:30;36570:10;:17;;36482:113;36783:30;36775:5;:38;36767:95;;;;-1:-1:-1;;;36767:95:0;;15956:2:1;36767:95:0;;;15938:21:1;15995:2;15975:18;;;15968:30;16034:34;16014:18;;;16007:62;-1:-1:-1;;;16085:18:1;;;16078:42;16137:19;;36767:95:0;15754:408:1;36767:95:0;36880:10;36891:5;36880:17;;;;;;;;:::i;:::-;;;;;;;;;36873:24;;36672:233;;;:::o;49033:97::-;43125:6;;-1:-1:-1;;;;;43125:6:0;20865:10;43272:23;43264:68;;;;-1:-1:-1;;;43264:68:0;;;;;;;:::i;:::-;49104:18:::1;:12;49119:3:::0;;49104:18:::1;:::i;46590:97::-:0;43125:6;;-1:-1:-1;;;;;43125:6:0;20865:10;43272:23;43264:68;;;;-1:-1:-1;;;43264:68:0;;;;;;;:::i;:::-;46653:20:::1;:26:::0;;;::::1;;;;-1:-1:-1::0;;46653:26:0;;::::1;::::0;;;::::1;::::0;;46590:97::o;23030:239::-;23102:7;23138:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23138:16:0;23173:19;23165:73;;;;-1:-1:-1;;;23165:73:0;;12070:2:1;23165:73:0;;;12052:21:1;12109:2;12089:18;;;12082:30;12148:34;12128:18;;;12121:62;-1:-1:-1;;;12199:18:1;;;12192:39;12248:19;;23165:73:0;11868:405:1;47124:381:0;43125:6;;-1:-1:-1;;;;;43125:6:0;20865:10;43272:23;43264:68;;;;-1:-1:-1;;;43264:68:0;;;;;;;:::i;:::-;47212:17:::1;::::0;45071:2:::1;::::0;47212:36:::1;::::0;47232:9;;47212:36:::1;:::i;:::-;:57;;47204:88;;;::::0;-1:-1:-1;;;47204:88:0;;12480:2:1;47204:88:0::1;::::0;::::1;12462:21:1::0;12519:2;12499:18;;;12492:30;-1:-1:-1;;;12538:18:1;;;12531:48;12596:18;;47204:88:0::1;12278:342:1::0;47204:88:0::1;47310:9;47305:143;47325:20:::0;;::::1;47305:143;;;47367:69;47377:9;;47387:1;47377:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;47414:17;::::0;47434:1;;47391:20:::1;44792:1;47391;:20;:::i;:::-;:40;;;;:::i;:::-;:44;;;;:::i;:::-;47367:9;:69::i;:::-;47347:3:::0;::::1;::::0;::::1;:::i;:::-;;;;47305:143;;;;47481:9;;:16;;47460:17;;:37;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;47124:381:0:o;22760:208::-;22832:7;-1:-1:-1;;;;;22860:19:0;;22852:74;;;;-1:-1:-1;;;22852:74:0;;11659:2:1;22852:74:0;;;11641:21:1;11698:2;11678:18;;;11671:30;11737:34;11717:18;;;11710:62;-1:-1:-1;;;11788:18:1;;;11781:40;11838:19;;22852:74:0;11457:406:1;22852:74:0;-1:-1:-1;;;;;;22944:16:0;;;;;:9;:16;;;;;;;22760:208::o;43703:103::-;43125:6;;-1:-1:-1;;;;;43125:6:0;20865:10;43272:23;43264:68;;;;-1:-1:-1;;;43264:68:0;;;;;;;:::i;:::-;43768:30:::1;43795:1;43768:18;:30::i;46243:102::-:0;43125:6;;-1:-1:-1;;;;;43125:6:0;20865:10;43272:23;43264:68;;;;-1:-1:-1;;;43264:68:0;;;;;;;:::i;:::-;46315:16:::1;:22:::0;46243:102::o;47513:387::-;43125:6;;-1:-1:-1;;;;;43125:6:0;20865:10;43272:23;43264:68;;;;-1:-1:-1;;;43264:68:0;;;;;;;:::i;:::-;47602:18:::1;::::0;45071:2:::1;::::0;47602:37:::1;::::0;47623:9;;47602:37:::1;:::i;:::-;:58;;47594:90;;;::::0;-1:-1:-1;;;47594:90:0;;15190:2:1;47594:90:0::1;::::0;::::1;15172:21:1::0;15229:2;15209:18;;;15202:30;-1:-1:-1;;;15248:18:1;;;15241:49;15307:18;;47594:90:0::1;14988:343:1::0;47594:90:0::1;47702:9;47697:145;47717:20:::0;;::::1;47697:145;;;47759:71;47769:9;;47779:1;47769:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;47807:18;::::0;47828:1;;44941:35:::1;44886:2;44792:1;44941:35;:::i;:::-;47783:21;::::0;:1:::1;:21;:::i;47759:71::-;47739:3:::0;::::1;::::0;::::1;:::i;:::-;;;;47697:145;;;;47876:9;;:16;;47854:18;;:38;;;;;;;:::i;46028:207::-:0;46095:20;;46071:7;;46095:20;;;;;46091:137;;;-1:-1:-1;46139:20:0;;;46028:207::o;46091:137::-;-1:-1:-1;46199:17:0;;;46028:207::o;46695:205::-;43125:6;;-1:-1:-1;;;;;43125:6:0;20865:10;43272:23;43264:68;;;;-1:-1:-1;;;43264:68:0;;;;;;;:::i;:::-;46788:9:::1;46784:106;46803:18:::0;;::::1;46784:106;;;46874:4;46843:16;:28;46860:7;;46868:1;46860:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;46843:28:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;46843:28:0;:35;;-1:-1:-1;;46843:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;46823:3;::::1;::::0;::::1;:::i;:::-;;;;46784:106;;46908:208:::0;43125:6;;-1:-1:-1;;;;;43125:6:0;20865:10;43272:23;43264:68;;;;-1:-1:-1;;;43264:68:0;;;;;;;:::i;:::-;47006:9:::1;47002:107;47021:18:::0;;::::1;47002:107;;;47092:5;47061:16;:28;47078:7;;47086:1;47078:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;47061:28:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;47061:28:0;:36;;-1:-1:-1;;47061:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47041:3;::::1;::::0;::::1;:::i;:::-;;;;47002:107;;23505:104:::0;23561:13;23594:7;23587:14;;;;;:::i;45212:91::-;45071:2;45255:28;44886:2;45255:9;:28;:::i;:::-;:48;;;;:::i;47908:989::-;48002:6;47987:12;:10;:12::i;:::-;:21;;;;:::i;:::-;47974:9;:34;;47966:60;;;;-1:-1:-1;;;47966:60:0;;9318:2:1;47966:60:0;;;9300:21:1;9357:2;9337:18;;;9330:30;-1:-1:-1;;;9376:18:1;;;9369:43;9429:18;;47966:60:0;9116:337:1;47966:60:0;48045:17;;;;48037:56;;;;-1:-1:-1;;;48037:56:0;;6954:2:1;48037:56:0;;;6936:21:1;6993:2;6973:18;;;6966:30;7032:28;7012:18;;;7005:56;7078:18;;48037:56:0;6752:350:1;48037:56:0;48112:20;;;;;;;;:52;;-1:-1:-1;48153:10:0;48136:28;;;;:16;:28;;;;;;;;48112:52;48104:98;;;;-1:-1:-1;;;48104:98:0;;10832:2:1;48104:98:0;;;10814:21:1;10871:2;10851:18;;;10844:30;10910:34;10890:18;;;10883:62;-1:-1:-1;;;10961:18:1;;;10954:31;11002:19;;48104:98:0;10630:397:1;48104:98:0;48231:16;;48221:6;:26;;48213:84;;;;-1:-1:-1;;;48213:84:0;;7309:2:1;48213:84:0;;;7291:21:1;7348:2;7328:18;;;7321:30;7387:34;7367:18;;;7360:62;-1:-1:-1;;;7438:18:1;;;7431:43;7491:19;;48213:84:0;7107:409:1;48213:84:0;45071:2;45255:28;44886:2;45255:9;:28;:::i;:::-;:48;;;;:::i;:::-;48336:6;48316:17;;:26;;;;:::i;:::-;:46;;48308:85;;;;-1:-1:-1;;;48308:85:0;;16369:2:1;48308:85:0;;;16351:21:1;16408:2;16388:18;;;16381:30;16447:28;16427:18;;;16420:56;16493:18;;48308:85:0;16167:350:1;48308:85:0;48412:20;;;;;;;;:106;;-1:-1:-1;48487:30:0;;48463:10;48437:37;;;;:25;:37;;;;;;:46;;48477:6;;48437:46;:::i;:::-;:80;;48412:106;48404:190;;;;-1:-1:-1;;;48404:190:0;;16724:2:1;48404:190:0;;;16706:21:1;16763:2;16743:18;;;16736:30;16802:34;16782:18;;;16775:62;16873:30;16853:18;;;16846:58;16921:19;;48404:190:0;16522:424:1;48404:190:0;48611:9;48607:130;48630:6;48626:1;:10;48607:130;;;48658:67;48668:10;48723:1;48703:17;;45071:2;44886;44792:1;44941:35;;;;:::i;:::-;45125:37;;;;:::i;48658:67::-;48638:3;;;;:::i;:::-;;;;48607:130;;;-1:-1:-1;48754:20:0;;;;;;;48749:101;;48817:10;48791:37;;;;:25;:37;;;;;:47;;48832:6;;48791:37;:47;;48832:6;;48791:47;:::i;:::-;;;;-1:-1:-1;;48749:101:0;48883:6;48862:17;;:27;;;;;;;:::i;:::-;;;;-1:-1:-1;;;47908:989:0:o;25188:155::-;25283:52;20865:10;25316:8;25326;25283:18;:52::i;:::-;25188:155;;:::o;26311:328::-;26486:41;20865:10;26519:7;26486:18;:41::i;:::-;26478:103;;;;-1:-1:-1;;;26478:103:0;;;;;;;:::i;:::-;26592:39;26606:4;26612:2;26616:7;26625:5;26592:13;:39::i;:::-;26311:328;;;;:::o;45082:80::-;45071:2;44941:35;44886:2;44792:1;44941:35;:::i;:::-;45125:37;;;;:::i;46491:91::-;43125:6;;-1:-1:-1;;;;;43125:6:0;20865:10;43272:23;43264:68;;;;-1:-1:-1;;;43264:68:0;;;;;;;:::i;:::-;46551:17:::1;:23:::0;;-1:-1:-1;;46551:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;46491:91::o;23680:334::-;28214:4;28238:16;;;:7;:16;;;;;;23753:13;;-1:-1:-1;;;;;28238:16:0;23779:76;;;;-1:-1:-1;;;23779:76:0;;14372:2:1;23779:76:0;;;14354:21:1;14411:2;14391:18;;;14384:30;14450:34;14430:18;;;14423:62;-1:-1:-1;;;14501:18:1;;;14494:45;14556:19;;23779:76:0;14170:411:1;23779:76:0;23868:21;23892:10;:8;:10::i;:::-;23868:34;;23944:1;23926:7;23920:21;:25;:86;;;;;;;;;;;;;;;;;23972:7;23981:18;:7;:16;:18::i;:::-;23955:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23920:86;23913:93;23680:334;-1:-1:-1;;;23680:334:0:o;43961:201::-;43125:6;;-1:-1:-1;;;;;43125:6:0;20865:10;43272:23;43264:68;;;;-1:-1:-1;;;43264:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44050:22:0;::::1;44042:73;;;::::0;-1:-1:-1;;;44042:73:0;;8554:2:1;44042:73:0::1;::::0;::::1;8536:21:1::0;8593:2;8573:18;;;8566:30;8632:34;8612:18;;;8605:62;-1:-1:-1;;;8683:18:1;;;8676:36;8729:19;;44042:73:0::1;8352:402:1::0;44042:73:0::1;44126:28;44145:8;44126:18;:28::i;:::-;43961:201:::0;:::o;46353:130::-;43125:6;;-1:-1:-1;;;;;43125:6:0;20865:10;43272:23;43264:68;;;;-1:-1:-1;;;43264:68:0;;;;;;;:::i;:::-;46439:30:::1;:36:::0;46353:130::o;22391:305::-;22493:4;-1:-1:-1;;;;;;22530:40:0;;-1:-1:-1;;;22530:40:0;;:105;;-1:-1:-1;;;;;;;22587:48:0;;-1:-1:-1;;;22587:48:0;22530:105;:158;;;-1:-1:-1;;;;;;;;;;13303:40:0;;;22652:36;13194:157;32131:174;32206:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32206:29:0;-1:-1:-1;;;;;32206:29:0;;;;;;;;:24;;32260:23;32206:24;32260:14;:23::i;:::-;-1:-1:-1;;;;;32251:46:0;;;;;;;;;;;32131:174;;:::o;28443:348::-;28536:4;28238:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28238:16:0;28553:73;;;;-1:-1:-1;;;28553:73:0;;10419:2:1;28553:73:0;;;10401:21:1;10458:2;10438:18;;;10431:30;10497:34;10477:18;;;10470:62;-1:-1:-1;;;10548:18:1;;;10541:42;10600:19;;28553:73:0;10217:408:1;28553:73:0;28637:13;28653:23;28668:7;28653:14;:23::i;:::-;28637:39;;28706:5;-1:-1:-1;;;;;28695:16:0;:7;-1:-1:-1;;;;;28695:16:0;;:51;;;;28739:7;-1:-1:-1;;;;;28715:31:0;:20;28727:7;28715:11;:20::i;:::-;-1:-1:-1;;;;;28715:31:0;;28695:51;:87;;;-1:-1:-1;;;;;;25535:25:0;;;25511:4;25535:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;28750:32;28687:96;28443:348;-1:-1:-1;;;;28443:348:0:o;31435:578::-;31594:4;-1:-1:-1;;;;;31567:31:0;:23;31582:7;31567:14;:23::i;:::-;-1:-1:-1;;;;;31567:31:0;;31559:85;;;;-1:-1:-1;;;31559:85:0;;13962:2:1;31559:85:0;;;13944:21:1;14001:2;13981:18;;;13974:30;14040:34;14020:18;;;14013:62;-1:-1:-1;;;14091:18:1;;;14084:39;14140:19;;31559:85:0;13760:405:1;31559:85:0;-1:-1:-1;;;;;31663:16:0;;31655:65;;;;-1:-1:-1;;;31655:65:0;;9660:2:1;31655:65:0;;;9642:21:1;9699:2;9679:18;;;9672:30;9738:34;9718:18;;;9711:62;-1:-1:-1;;;9789:18:1;;;9782:34;9833:19;;31655:65:0;9458:400:1;31655:65:0;31733:39;31754:4;31760:2;31764:7;31733:20;:39::i;:::-;31837:29;31854:1;31858:7;31837:8;:29::i;:::-;-1:-1:-1;;;;;31879:15:0;;;;;;:9;:15;;;;;:20;;31898:1;;31879:15;:20;;31898:1;;31879:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31910:13:0;;;;;;:9;:13;;;;;:18;;31927:1;;31910:13;:18;;31927:1;;31910:18;:::i;:::-;;;;-1:-1:-1;;31939:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31939:21:0;-1:-1:-1;;;;;31939:21:0;;;;;;;;;31978:27;;31939:16;;31978:27;;;;;;;31435:578;;;:::o;29133:110::-;29209:26;29219:2;29223:7;29209:26;;;;;;;;;;;;:9;:26::i;44322:191::-;44415:6;;;-1:-1:-1;;;;;44432:17:0;;;-1:-1:-1;;;;;;44432:17:0;;;;;;;44465:40;;44415:6;;;44432:17;44415:6;;44465:40;;44396:16;;44465:40;44385:128;44322:191;:::o;32447:315::-;32602:8;-1:-1:-1;;;;;32593:17:0;:5;-1:-1:-1;;;;;32593:17:0;;;32585:55;;;;-1:-1:-1;;;32585:55:0;;10065:2:1;32585:55:0;;;10047:21:1;10104:2;10084:18;;;10077:30;10143:27;10123:18;;;10116:55;10188:18;;32585:55:0;9863:349:1;32585:55:0;-1:-1:-1;;;;;32651:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;32651:46:0;;;;;;;;;;32713:41;;6476::1;;;32713::0;;6449:18:1;32713:41:0;;;;;;;32447:315;;;:::o;27521:::-;27678:28;27688:4;27694:2;27698:7;27678:9;:28::i;:::-;27725:48;27748:4;27754:2;27758:7;27767:5;27725:22;:48::i;:::-;27717:111;;;;-1:-1:-1;;;27717:111:0;;;;;;;:::i;48909:113::-;48969:13;49002:12;48995:19;;;;;:::i;471:723::-;527:13;748:10;744:53;;-1:-1:-1;;775:10:0;;;;;;;;;;;;-1:-1:-1;;;775:10:0;;;;;471:723::o;744:53::-;822:5;807:12;863:78;870:9;;863:78;;896:8;;;;:::i;:::-;;-1:-1:-1;919:10:0;;-1:-1:-1;927:2:0;919:10;;:::i;:::-;;;863:78;;;951:19;983:6;973:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;973:17:0;;951:39;;1001:154;1008:10;;1001:154;;1035:11;1045:1;1035:11;;:::i;:::-;;-1:-1:-1;1104:10:0;1112:2;1104:5;:10;:::i;:::-;1091:24;;:2;:24;:::i;:::-;1078:39;;1061:6;1068;1061:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;1061:56:0;;;;;;;;-1:-1:-1;1132:11:0;1141:2;1132:11;;:::i;:::-;;;1001:154;;37518:589;-1:-1:-1;;;;;37724:18:0;;37720:187;;37759:40;37791:7;38934:10;:17;;38907:24;;;;:15;:24;;;;;:44;;;38962:24;;;;;;;;;;;;38830:164;37759:40;37720:187;;;37829:2;-1:-1:-1;;;;;37821:10:0;:4;-1:-1:-1;;;;;37821:10:0;;37817:90;;37848:47;37881:4;37887:7;37848:32;:47::i;:::-;-1:-1:-1;;;;;37921:16:0;;37917:183;;37954:45;37991:7;37954:36;:45::i;37917:183::-;38027:4;-1:-1:-1;;;;;38021:10:0;:2;-1:-1:-1;;;;;38021:10:0;;38017:83;;38048:40;38076:2;38080:7;38048:27;:40::i;29470:321::-;29600:18;29606:2;29610:7;29600:5;:18::i;:::-;29651:54;29682:1;29686:2;29690:7;29699:5;29651:22;:54::i;:::-;29629:154;;;;-1:-1:-1;;;29629:154:0;;;;;;;:::i;33327:799::-;33482:4;-1:-1:-1;;;;;33503:13:0;;3373:20;3421:8;33499:620;;33539:72;;-1:-1:-1;;;33539:72:0;;-1:-1:-1;;;;;33539:36:0;;;;;:72;;20865:10;;33590:4;;33596:7;;33605:5;;33539:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33539:72:0;;;;;;;;-1:-1:-1;;33539:72:0;;;;;;;;;;;;:::i;:::-;;;33535:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33781:13:0;;33777:272;;33824:60;;-1:-1:-1;;;33824:60:0;;;;;;;:::i;33777:272::-;33999:6;33993:13;33984:6;33980:2;33976:15;33969:38;33535:529;-1:-1:-1;;;;;;33662:51:0;-1:-1:-1;;;33662:51:0;;-1:-1:-1;33655:58:0;;33499:620;-1:-1:-1;34103:4:0;33327:799;;;;;;:::o;39621:988::-;39887:22;39937:1;39912:22;39929:4;39912:16;:22::i;:::-;:26;;;;:::i;:::-;39949:18;39970:26;;;:17;:26;;;;;;39887:51;;-1:-1:-1;40103:28:0;;;40099:328;;-1:-1:-1;;;;;40170:18:0;;40148:19;40170:18;;;:12;:18;;;;;;;;:34;;;;;;;;;40221:30;;;;;;:44;;;40338:30;;:17;:30;;;;;:43;;;40099:328;-1:-1:-1;40523:26:0;;;;:17;:26;;;;;;;;40516:33;;;-1:-1:-1;;;;;40567:18:0;;;;;:12;:18;;;;;:34;;;;;;;40560:41;39621:988::o;40904:1079::-;41182:10;:17;41157:22;;41182:21;;41202:1;;41182:21;:::i;:::-;41214:18;41235:24;;;:15;:24;;;;;;41608:10;:26;;41157:46;;-1:-1:-1;41235:24:0;;41157:46;;41608:26;;;;;;:::i;:::-;;;;;;;;;41586:48;;41672:11;41647:10;41658;41647:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;41752:28;;;:15;:28;;;;;;;:41;;;41924:24;;;;;41917:31;41959:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;40975:1008;;;40904:1079;:::o;38408:221::-;38493:14;38510:20;38527:2;38510:16;:20::i;:::-;-1:-1:-1;;;;;38541:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;38586:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;38408:221:0:o;30127:382::-;-1:-1:-1;;;;;30207:16:0;;30199:61;;;;-1:-1:-1;;;30199:61:0;;12827:2:1;30199:61:0;;;12809:21:1;;;12846:18;;;12839:30;12905:34;12885:18;;;12878:62;12957:18;;30199:61:0;12625:356:1;30199:61:0;28214:4;28238:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28238:16:0;:30;30271:58;;;;-1:-1:-1;;;30271:58:0;;8961:2:1;30271:58:0;;;8943:21:1;9000:2;8980:18;;;8973:30;9039;9019:18;;;9012:58;9087:18;;30271:58:0;8759:352:1;30271:58:0;30342:45;30371:1;30375:2;30379:7;30342:20;:45::i;:::-;-1:-1:-1;;;;;30400:13:0;;;;;;:9;:13;;;;;:18;;30417:1;;30400:13;:18;;30417:1;;30400:18;:::i;:::-;;;;-1:-1:-1;;30429:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30429:21:0;-1:-1:-1;;;;;30429:21:0;;;;;;;;30468:33;;30429:16;;;30468:33;;30429:16;;30468:33;30127:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:160::-;257:20;;313:13;;306:21;296:32;;286:60;;342:1;339;332:12;357:186;416:6;469:2;457:9;448:7;444:23;440:32;437:52;;;485:1;482;475:12;437:52;508:29;527:9;508:29;:::i;548:260::-;616:6;624;677:2;665:9;656:7;652:23;648:32;645:52;;;693:1;690;683:12;645:52;716:29;735:9;716:29;:::i;:::-;706:39;;764:38;798:2;787:9;783:18;764:38;:::i;:::-;754:48;;548:260;;;;;:::o;813:328::-;890:6;898;906;959:2;947:9;938:7;934:23;930:32;927:52;;;975:1;972;965:12;927:52;998:29;1017:9;998:29;:::i;:::-;988:39;;1046:38;1080:2;1069:9;1065:18;1046:38;:::i;:::-;1036:48;;1131:2;1120:9;1116:18;1103:32;1093:42;;813:328;;;;;:::o;1146:1138::-;1241:6;1249;1257;1265;1318:3;1306:9;1297:7;1293:23;1289:33;1286:53;;;1335:1;1332;1325:12;1286:53;1358:29;1377:9;1358:29;:::i;:::-;1348:39;;1406:38;1440:2;1429:9;1425:18;1406:38;:::i;:::-;1396:48;;1491:2;1480:9;1476:18;1463:32;1453:42;;1546:2;1535:9;1531:18;1518:32;1569:18;1610:2;1602:6;1599:14;1596:34;;;1626:1;1623;1616:12;1596:34;1664:6;1653:9;1649:22;1639:32;;1709:7;1702:4;1698:2;1694:13;1690:27;1680:55;;1731:1;1728;1721:12;1680:55;1767:2;1754:16;1789:2;1785;1782:10;1779:36;;;1795:18;;:::i;:::-;1870:2;1864:9;1838:2;1924:13;;-1:-1:-1;;1920:22:1;;;1944:2;1916:31;1912:40;1900:53;;;1968:18;;;1988:22;;;1965:46;1962:72;;;2014:18;;:::i;:::-;2054:10;2050:2;2043:22;2089:2;2081:6;2074:18;2129:7;2124:2;2119;2115;2111:11;2107:20;2104:33;2101:53;;;2150:1;2147;2140:12;2101:53;2206:2;2201;2197;2193:11;2188:2;2180:6;2176:15;2163:46;2251:1;2246:2;2241;2233:6;2229:15;2225:24;2218:35;2272:6;2262:16;;;;;;;1146:1138;;;;;;;:::o;2289:254::-;2354:6;2362;2415:2;2403:9;2394:7;2390:23;2386:32;2383:52;;;2431:1;2428;2421:12;2383:52;2454:29;2473:9;2454:29;:::i;:::-;2444:39;;2502:35;2533:2;2522:9;2518:18;2502:35;:::i;2548:254::-;2616:6;2624;2677:2;2665:9;2656:7;2652:23;2648:32;2645:52;;;2693:1;2690;2683:12;2645:52;2716:29;2735:9;2716:29;:::i;:::-;2706:39;2792:2;2777:18;;;;2764:32;;-1:-1:-1;;;2548:254:1:o;2807:615::-;2893:6;2901;2954:2;2942:9;2933:7;2929:23;2925:32;2922:52;;;2970:1;2967;2960:12;2922:52;3010:9;2997:23;3039:18;3080:2;3072:6;3069:14;3066:34;;;3096:1;3093;3086:12;3066:34;3134:6;3123:9;3119:22;3109:32;;3179:7;3172:4;3168:2;3164:13;3160:27;3150:55;;3201:1;3198;3191:12;3150:55;3241:2;3228:16;3267:2;3259:6;3256:14;3253:34;;;3283:1;3280;3273:12;3253:34;3336:7;3331:2;3321:6;3318:1;3314:14;3310:2;3306:23;3302:32;3299:45;3296:65;;;3357:1;3354;3347:12;3296:65;3388:2;3380:11;;;;;3410:6;;-1:-1:-1;2807:615:1;;-1:-1:-1;;;;2807:615:1:o;3427:180::-;3483:6;3536:2;3524:9;3515:7;3511:23;3507:32;3504:52;;;3552:1;3549;3542:12;3504:52;3575:26;3591:9;3575:26;:::i;3612:245::-;3670:6;3723:2;3711:9;3702:7;3698:23;3694:32;3691:52;;;3739:1;3736;3729:12;3691:52;3778:9;3765:23;3797:30;3821:5;3797:30;:::i;3862:249::-;3931:6;3984:2;3972:9;3963:7;3959:23;3955:32;3952:52;;;4000:1;3997;3990:12;3952:52;4032:9;4026:16;4051:30;4075:5;4051:30;:::i;4116:592::-;4187:6;4195;4248:2;4236:9;4227:7;4223:23;4219:32;4216:52;;;4264:1;4261;4254:12;4216:52;4304:9;4291:23;4333:18;4374:2;4366:6;4363:14;4360:34;;;4390:1;4387;4380:12;4360:34;4428:6;4417:9;4413:22;4403:32;;4473:7;4466:4;4462:2;4458:13;4454:27;4444:55;;4495:1;4492;4485:12;4444:55;4535:2;4522:16;4561:2;4553:6;4550:14;4547:34;;;4577:1;4574;4567:12;4547:34;4622:7;4617:2;4608:6;4604:2;4600:15;4596:24;4593:37;4590:57;;;4643:1;4640;4633:12;4713:180;4772:6;4825:2;4813:9;4804:7;4800:23;4796:32;4793:52;;;4841:1;4838;4831:12;4793:52;-1:-1:-1;4864:23:1;;4713:180;-1:-1:-1;4713:180:1:o;4898:257::-;4939:3;4977:5;4971:12;5004:6;4999:3;4992:19;5020:63;5076:6;5069:4;5064:3;5060:14;5053:4;5046:5;5042:16;5020:63;:::i;:::-;5137:2;5116:15;-1:-1:-1;;5112:29:1;5103:39;;;;5144:4;5099:50;;4898:257;-1:-1:-1;;4898:257:1:o;5160:470::-;5339:3;5377:6;5371:13;5393:53;5439:6;5434:3;5427:4;5419:6;5415:17;5393:53;:::i;:::-;5509:13;;5468:16;;;;5531:57;5509:13;5468:16;5565:4;5553:17;;5531:57;:::i;:::-;5604:20;;5160:470;-1:-1:-1;;;;5160:470:1:o;5843:488::-;-1:-1:-1;;;;;6112:15:1;;;6094:34;;6164:15;;6159:2;6144:18;;6137:43;6211:2;6196:18;;6189:34;;;6259:3;6254:2;6239:18;;6232:31;;;6037:4;;6280:45;;6305:19;;6297:6;6280:45;:::i;:::-;6272:53;5843:488;-1:-1:-1;;;;;;5843:488:1:o;6528:219::-;6677:2;6666:9;6659:21;6640:4;6697:44;6737:2;6726:9;6722:18;6714:6;6697:44;:::i;7933:414::-;8135:2;8117:21;;;8174:2;8154:18;;;8147:30;8213:34;8208:2;8193:18;;8186:62;-1:-1:-1;;;8279:2:1;8264:18;;8257:48;8337:3;8322:19;;7933:414::o;13399:356::-;13601:2;13583:21;;;13620:18;;;13613:30;13679:34;13674:2;13659:18;;13652:62;13746:2;13731:18;;13399:356::o;15336:413::-;15538:2;15520:21;;;15577:2;15557:18;;;15550:30;15616:34;15611:2;15596:18;;15589:62;-1:-1:-1;;;15682:2:1;15667:18;;15660:47;15739:3;15724:19;;15336:413::o;17133:128::-;17173:3;17204:1;17200:6;17197:1;17194:13;17191:39;;;17210:18;;:::i;:::-;-1:-1:-1;17246:9:1;;17133:128::o;17266:120::-;17306:1;17332;17322:35;;17337:18;;:::i;:::-;-1:-1:-1;17371:9:1;;17266:120::o;17391:168::-;17431:7;17497:1;17493;17489:6;17485:14;17482:1;17479:21;17474:1;17467:9;17460:17;17456:45;17453:71;;;17504:18;;:::i;:::-;-1:-1:-1;17544:9:1;;17391:168::o;17564:125::-;17604:4;17632:1;17629;17626:8;17623:34;;;17637:18;;:::i;:::-;-1:-1:-1;17674:9:1;;17564:125::o;17694:258::-;17766:1;17776:113;17790:6;17787:1;17784:13;17776:113;;;17866:11;;;17860:18;17847:11;;;17840:39;17812:2;17805:10;17776:113;;;17907:6;17904:1;17901:13;17898:48;;;-1:-1:-1;;17942:1:1;17924:16;;17917:27;17694:258::o;17957:380::-;18036:1;18032:12;;;;18079;;;18100:61;;18154:4;18146:6;18142:17;18132:27;;18100:61;18207:2;18199:6;18196:14;18176:18;18173:38;18170:161;;;18253:10;18248:3;18244:20;18241:1;18234:31;18288:4;18285:1;18278:15;18316:4;18313:1;18306:15;18170:161;;17957:380;;;:::o;18342:135::-;18381:3;-1:-1:-1;;18402:17:1;;18399:43;;;18422:18;;:::i;:::-;-1:-1:-1;18469:1:1;18458:13;;18342:135::o;18482:112::-;18514:1;18540;18530:35;;18545:18;;:::i;:::-;-1:-1:-1;18579:9:1;;18482:112::o;18599:127::-;18660:10;18655:3;18651:20;18648:1;18641:31;18691:4;18688:1;18681:15;18715:4;18712:1;18705:15;18731:127;18792:10;18787:3;18783:20;18780:1;18773:31;18823:4;18820:1;18813:15;18847:4;18844:1;18837:15;18863:127;18924:10;18919:3;18915:20;18912:1;18905:31;18955:4;18952:1;18945:15;18979:4;18976:1;18969:15;18995:127;19056:10;19051:3;19047:20;19044:1;19037:31;19087:4;19084:1;19077:15;19111:4;19108:1;19101:15;19127:127;19188:10;19183:3;19179:20;19176:1;19169:31;19219:4;19216:1;19209:15;19243:4;19240:1;19233:15;19259:131;-1:-1:-1;;;;;;19333:32:1;;19323:43;;19313:71;;19380:1;19377;19370:12

Swarm Source

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