ETH Price: $3,313.26 (-3.94%)
Gas: 9.5 Gwei

Token

Kiba Inu Genesis I (KIBA)
 

Overview

Max Total Supply

111 KIBA

Holders

98

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
oakenfold.eth
Balance
1 KIBA
0x558eD3a844EC118A86EC87f833dBe41aAaB3578e
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:
KibaGenesis

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
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: node_modules\openzeppelin-solidity\contracts\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: node_modules\openzeppelin-solidity\contracts\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: node_modules\openzeppelin-solidity\contracts\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: node_modules\openzeppelin-solidity\contracts\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;
        // solhint-disable-next-line no-inline-assembly
        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"
        );

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: node_modules\openzeppelin-solidity\contracts\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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: node_modules\openzeppelin-solidity\contracts\utils\Strings.sol

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: node_modules\openzeppelin-solidity\contracts\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: node_modules\openzeppelin-solidity\contracts\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}. 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
    {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //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 Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try
                IERC721Receiver(to).onERC721Received(
                    _msgSender(),
                    from,
                    tokenId,
                    _data
                )
            returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert(
                        "ERC721: transfer to non ERC721Receiver implementer"
                    );
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    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` 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 {}
}

// File: node_modules\openzeppelin-solidity\contracts\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-solidity\contracts\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: contracts\lib\Counters.sol

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
       counter._value += 1;
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        {
            counter._value = value - 1;
        }
    }
}

// File: openzeppelin-solidity\contracts\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;
    address private _creator;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        _creator = msgSender;
        emit OwnershipTransferred(address(0), 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() || _creator == _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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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"
        );
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


pragma solidity ^0.8.0;

contract KibaGenesis is ERC721Enumerable, Ownable {
    using Counters for Counters.Counter;
    using Strings for uint256;

    //mappings for whitelisted addresses and total minted per address
    mapping(address => bool) whitelisted;
    mapping(address => uint) minted;

    // max / limits
    uint256 public MAX_MINTED = 112;
    uint256 public PURCHASE_LIMIT = 1;

    //minting for public active
    bool private _isActive = false;
    //minting for whitelisted addresses active
    bool private _whitelistActive = false;

    // uri
    string private _tokenBaseURI = "";

    // whitelisting
    address[] private _addresses;

    Counters.Counter private mintedCount;

    constructor() ERC721("Kiba Inu Genesis I", "KIBA") {
       _addresses = [
            0x2d866CaD6Ce8d9F7d69B1782a6Aa629766B53E46,
            0x4b948C4e76633E3e09Fb366Ac78D34c74edf7c21,
            0x64a9EB1B7B8601ED4bBc5F68934469ffDa7ef543,
            0xFD5B061127Be14dED27D8a8f380fD760321326E8,
            0x5C29616AF35b94212b8f3e2405c99240b641b2eA,
            0xD1453C1310846EC5Ba080fCb1D3E128e9D124745,
            0x88BB48b275288239D26f9aF4f58Edd0dd0cC2407,
            0x1B91e2C9Db800889eA34373eFaAb59c9dFdDd443,
            0xE0A779360c53e10226194Fc892413a3Aa98fF943,
            0x1088902574eF10b572BABeFc7418E79B4323fADF,
            0x2f50cf82BF670DfF6bf41aE1F62DF193fE5c2755,
            0xC53c9A7db86f5cB302D9eBad3a8527Ec4CCCaBd4,
            0x7271875cDdB4B3331b470A8Ee9DF7312D023a249,
            0x7CA96Db04642b82b4b1785354Ae316F6d0F8e963,
            0x1d7401Cdc9D2646428F44Ebbc3db57E5ffe3b065,
            0x0116Aa239011cA326f8E979416727884099a5990,
            0x6859BF91ba5330e8500E87eA5391cE6f22C9503F,
            0xfF221Fcb5F6c31cF03f11e4f1EfC961f32A831b1,
            0x69Fe7b81fE510062684C634225Bc9a8403EC7A1E,
            0xDBC09659dCE1A67340eab42596d0cEF3641072BE,
            0xBd90D521C288cB778F47d9258Fa20BAabD64dE40,
            0x3671f4Cb43695c1D461ef8A32BfCf89d1df708Cf,
            0xc63b5a24ba7Be3E1B06e54a24D3F54D188f856C8,
            0xDe99d90Bca10ba6c2d3Df2C0D52aA8717C3AAbDb,
            0x8c9D2cC7d217b79464BC6B331008a2B7d39C85B7,
            0x942496A3a0f7E246AA46470df96e6a1F40de765c,
            0xa07988E37dcC6687fd19665Bb402ae394E87aAF1,
            0x977738Eab01796aa79CAc893D11ab5448faDC54F,
            0xa37F7FE808ea441Fc34461485ce8DbB52351e742,
            0x4662938ECa7B49308aedE2Ca8e141De3aE4fD16f,
            0xD1022B0fFbB0E2585387A7bE3Fe6126c6b613DB5,
            0x296a070f102614C782F2C2aa426Ea3f0d1a0DAa7,
            0x2e7E9AA546640b06274Ec6dBD291491F85a5c4D5,
            0xf86f189bA628C8512a9fE44AFc01F7c36e50a6E9,
            0xBa6323A401E5047e8b19C7d58A75688e70D01cc6,
            0x9c60176FCE90D3D89477Ff21a2024cCB938d1f08,
            0x4ae11242726C74be06E87026d51FDb5bCBc23E23,
            0xeafb453eAb4bE6421383C2FBEC39D0f73f36da96,
            0x6cb65809bF80359c86A50C3BcCe8F5e78dBd8766,
            0x859bc104B5b547cb95bb19a0dCB616f04C9B341C,
            0x069AE2D2A4233e9f8616b34513A025EA3a8762E5,
            0xAf1cA1107a0abB87B18A336559BFf6bf3De6CC68,
            0x9ceB5e7787798B4E4BBB1927109B33E319d38e8e,
            0x794eeD24D8132cC231cf7EA493e5515b8F4DABAc,
            0x1B7CB5F7998010616b6bA971c5A5b9802A8eec51,
            0x1F8690f69F941c85CB94295c24E4EfC5Cda90B62,
            0xF01f8c14bA72C14c866104c95Ec3df5238920D7A,
            0xd99a8538582a1D0F5e64ef179992Ea0C1227b4C3,
            0xDf88fF458C2d28c9523CA9C469152E2Cb6304E12,
            0x05b2CC62d243035798fE38cA46AFBD1857CB8982,
            0xDb0C9B83FC4c413ce85A4B613F3503F4f992Bc46,
            0xE735fE25D6c8949168dF0977e80ccB1D915A2f5d,
            0x04C803052F88e52b7456C32402AdD6B2BAf045Ce,
            0xb6B26fd32870E8675856Fd193a71ba7f78577e93,
            0xd9404ce7Dace093e1ff67dF3808E74D6F7cC03a1,
            0xDcA13472B0b7ca18EA0b1Cf6Ed33dF8b3CCFe99b,
            0xC804b6FA0A2232cf2E6Eba1339Ade0A28DDF0a38,
            0x53DEAA1fcCBD434e2A596d511FaC13BDc6629bE6,
            0x6C3336B576D1d7E00c88E61B3474cCe59A9624b7,
            0xe57DDD314E39d569fc30c27cFB14Ed70F2636fc2,
            0x7B0cc731F5a42dA432fE685F76e5eA193DA28672,
            0xF0439C5f7A71cec2a6A541e9FcfeA1c18510C106,
            0x1ea0BB9f20dF10d8fFF7c04611998B44dbC65c07,
            0x2448C8d82B2b1029deD78d7cD984F23A6CA4CeE1,
            0x83CD515740B2b858B0D53944771DE3c3076BC563,
            0xf373501Cff547deb137E1A3A23710b7B0da9D86e,
            0x02BC786450F46E648B3a25CAe9FB825D466CCBd6,
            0x4a083Ceff06e20711b64B4cD21400c8156d51309,
            0xCC7a3976365B3E090006a7561989BF81C974D22f,
            0x1678db462f33a92cb5e6bc442Fe565523b808186,
            0x2448C8d82B2b1029deD78d7cD984F23A6CA4CeE1,
            0x1ea0BB9f20dF10d8fFF7c04611998B44dbC65c07
       ];

        for(uint i = 0; i < _addresses.length; i++) {
            address _address = address(_addresses[i]);
            whitelisted[_address]=true;
        }
    }

    function canMint ( address account ) external view returns ( bool ) {
        // genesis collection can only mint 1 per account
        return account == owner() ? true : minted[account] < PURCHASE_LIMIT;
    }

    function isAccountWhitelisted ( address account ) external view returns (bool) {
        return whitelisted[account];
    }

    function isActive ( ) external view returns (bool) {
        return _isActive;
    }

    function isWhitelistActive ( ) external view returns (bool) {
        return _whitelistActive;
    }
 
    function setWhitelistActive (bool _isWhitelistActive) external onlyOwner {
        _whitelistActive = _isWhitelistActive;
    }

    function setWhitelisted (address account, bool whitelistActive) external onlyOwner {
        whitelisted[account] = whitelistActive;
    }

    function setActive(bool isMintActive) external onlyOwner {
        _isActive = isMintActive;
    }

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

    function setPurchaseLimit(uint256 purchaseLimit) external onlyOwner {
        PURCHASE_LIMIT = purchaseLimit;
    }

    function gift(address to, uint256 numberOfTokens) external onlyOwner {
        for (uint256 i = 0; i < numberOfTokens; i++) {
            uint256 tokenId = mintedCount.current() + 1;

            if (tokenId < MAX_MINTED) {
                mintedCount.increment();
                _safeMint(to, tokenId);
                minted[to] += 1;
            }
        }
    }

    function normalMint() external payable {
        require(_isActive, "Minting is not active");
        require(mintedCount.current() + 1 < MAX_MINTED,"Purchase would exceed MAX_MINTED");
        // owner can mint as many as they pleases
        address contractOwner = owner();
        if (address(msg.sender) != contractOwner) {
            require(minted[msg.sender] < PURCHASE_LIMIT, "Only one whitelist minting is allowed per address");
        }
        // JSON files start at 1.json
        uint256 tokenId = mintedCount.current() + 1;

        if (mintedCount.current() < MAX_MINTED) {
            mintedCount.increment();
            _safeMint(msg.sender, tokenId);
            minted[msg.sender] += 1;
        }
    }

    function whitelistMint() external  {
        require(_whitelistActive, "whitelist not active");
        require(whitelisted[msg.sender], "Only whitelisted addresses can mint");
        // owner can mint as many as they please
        address contractOwner = owner();
        if (address(msg.sender) != contractOwner) {
            require(minted[msg.sender] < PURCHASE_LIMIT, "Only one whitelist minting is allowed per address");
        }    
         // JSON files start at 1.json
         uint256 tokenId = mintedCount.current() + 1;
         if (mintedCount.current() < MAX_MINTED) {
             mintedCount.increment();
             _safeMint(msg.sender, tokenId);
             minted[msg.sender] += 1;
         } 
    }

    // function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) {
    //     require(_exists(tokenId), "Token does not exist");
    //     return string(abi.encodePacked(_tokenBaseURI, tokenId.toString()));
    // }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "Token Does not exist");

        string memory baseURI = _tokenBaseURI;
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, Strings.toString(tokenId),".json")) : "";
    }
}

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":[],"name":"MAX_MINTED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PURCHASE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"canMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"to","type":"address"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAccountWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","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":"isWhitelistActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"normalMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isMintActive","type":"bool"}],"name":"setActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"purchaseLimit","type":"uint256"}],"name":"setPurchaseLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isWhitelistActive","type":"bool"}],"name":"setWhitelistActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"whitelistActive","type":"bool"}],"name":"setWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6070600e556001600f556010805461ffff1916905560a060408190526000608081905262000030916011916200091e565b503480156200003e57600080fd5b5060408051808201825260128152714b69626120496e752047656e65736973204960701b6020808301918252835180850190945260048452634b49424160e01b90840152815191929162000095916000916200091e565b508051620000ab9060019060208401906200091e565b5050506000620000c06200091a60201b60201c565b600a80546001600160a01b0383166001600160a01b03199182168117909255600b805490911682179055604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506040805161090081018252732d866cad6ce8d9f7d69b1782a6aa629766b53e468152734b948c4e76633e3e09fb366ac78d34c74edf7c2160208201527364a9eb1b7b8601ed4bbc5f68934469ffda7ef5439181019190915273fd5b061127be14ded27d8a8f380fd760321326e86060820152735c29616af35b94212b8f3e2405c99240b641b2ea608082015273d1453c1310846ec5ba080fcb1d3e128e9d12474560a08201527388bb48b275288239d26f9af4f58edd0dd0cc240760c0820152731b91e2c9db800889ea34373efaab59c9dfddd44360e082015273e0a779360c53e10226194fc892413a3aa98ff943610100820152731088902574ef10b572babefc7418e79b4323fadf610120820152732f50cf82bf670dff6bf41ae1f62df193fe5c275561014082015273c53c9a7db86f5cb302d9ebad3a8527ec4cccabd4610160820152737271875cddb4b3331b470a8ee9df7312d023a249610180820152737ca96db04642b82b4b1785354ae316f6d0f8e9636101a0820152731d7401cdc9d2646428f44ebbc3db57e5ffe3b0656101c0820152730116aa239011ca326f8e979416727884099a59906101e0820152736859bf91ba5330e8500e87ea5391ce6f22c9503f61020082015273ff221fcb5f6c31cf03f11e4f1efc961f32a831b16102208201527369fe7b81fe510062684c634225bc9a8403ec7a1e61024082015273dbc09659dce1a67340eab42596d0cef3641072be61026082015273bd90d521c288cb778f47d9258fa20baabd64de40610280820152733671f4cb43695c1d461ef8a32bfcf89d1df708cf6102a082015273c63b5a24ba7be3e1b06e54a24d3f54d188f856c86102c082015273de99d90bca10ba6c2d3df2c0d52aa8717c3aabdb6102e0820152738c9d2cc7d217b79464bc6b331008a2b7d39c85b761030082015273942496a3a0f7e246aa46470df96e6a1f40de765c61032082015273a07988e37dcc6687fd19665bb402ae394e87aaf161034082015273977738eab01796aa79cac893d11ab5448fadc54f61036082015273a37f7fe808ea441fc34461485ce8dbb52351e742610380820152734662938eca7b49308aede2ca8e141de3ae4fd16f6103a082015273d1022b0ffbb0e2585387a7be3fe6126c6b613db56103c082015273296a070f102614c782f2c2aa426ea3f0d1a0daa76103e0820152732e7e9aa546640b06274ec6dbd291491f85a5c4d561040082015273f86f189ba628c8512a9fe44afc01f7c36e50a6e961042082015273ba6323a401e5047e8b19c7d58a75688e70d01cc6610440820152739c60176fce90d3d89477ff21a2024ccb938d1f08610460820152734ae11242726c74be06e87026d51fdb5bcbc23e2361048082015273eafb453eab4be6421383c2fbec39d0f73f36da966104a0820152736cb65809bf80359c86a50c3bcce8f5e78dbd87666104c082015273859bc104b5b547cb95bb19a0dcb616f04c9b341c6104e082015273069ae2d2a4233e9f8616b34513a025ea3a8762e561050082015273af1ca1107a0abb87b18a336559bff6bf3de6cc68610520820152739ceb5e7787798b4e4bbb1927109b33e319d38e8e61054082015273794eed24d8132cc231cf7ea493e5515b8f4dabac610560820152731b7cb5f7998010616b6ba971c5a5b9802a8eec51610580820152731f8690f69f941c85cb94295c24e4efc5cda90b626105a082015273f01f8c14ba72c14c866104c95ec3df5238920d7a6105c082015273d99a8538582a1d0f5e64ef179992ea0c1227b4c36105e082015273df88ff458c2d28c9523ca9c469152e2cb6304e126106008201527305b2cc62d243035798fe38ca46afbd1857cb898261062082015273db0c9b83fc4c413ce85a4b613f3503f4f992bc4661064082015273e735fe25d6c8949168df0977e80ccb1d915a2f5d6106608201527304c803052f88e52b7456c32402add6b2baf045ce61068082015273b6b26fd32870e8675856fd193a71ba7f78577e936106a082015273d9404ce7dace093e1ff67df3808e74d6f7cc03a16106c082015273dca13472b0b7ca18ea0b1cf6ed33df8b3ccfe99b6106e082015273c804b6fa0a2232cf2e6eba1339ade0a28ddf0a386107008201527353deaa1fccbd434e2a596d511fac13bdc6629be6610720820152736c3336b576d1d7e00c88e61b3474cce59a9624b761074082015273e57ddd314e39d569fc30c27cfb14ed70f2636fc2610760820152737b0cc731f5a42da432fe685f76e5ea193da2867261078082015273f0439c5f7a71cec2a6a541e9fcfea1c18510c1066107a0820152731ea0bb9f20df10d8fff7c04611998b44dbc65c076107c08201819052732448c8d82b2b1029ded78d7cd984f23a6ca4cee16107e083018190527383cd515740b2b858b0d53944771de3c3076bc56361080084015273f373501cff547deb137e1a3a23710b7b0da9d86e6108208401527302bc786450f46e648b3a25cae9fb825d466ccbd6610840840152734a083ceff06e20711b64b4cd21400c8156d5130961086084015273cc7a3976365b3e090006a7561989bf81c974d22f610880840152731678db462f33a92cb5e6bc442fe565523b8081866108a08401526108c08301526108e08201526200089e906012906048620009ad565b5060005b6012548110156200091357600060128281548110620008d157634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168252600c905260409020805460ff1916600117905550806200090a8162000a59565b915050620008a2565b5062000a81565b3390565b8280546200092c9062000a1c565b90600052602060002090601f0160209004810192826200095057600085556200099b565b82601f106200096b57805160ff19168380011785556200099b565b828001600101855582156200099b579182015b828111156200099b5782518255916020019190600101906200097e565b50620009a992915062000a05565b5090565b8280548282559060005260206000209081019282156200099b579160200282015b828111156200099b57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620009ce565b5b80821115620009a9576000815560010162000a06565b60028104600182168062000a3157607f821691505b6020821081141562000a5357634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141562000a7a57634e487b7160e01b81526011600452602481fd5b5060010190565b6126538062000a916000396000f3fe6080604052600436106101ee5760003560e01c8063715018a61161010d578063acec338a116100a0578063c87b56dd1161006f578063c87b56dd14610537578063cbce4c9714610557578063d75e611014610577578063e985e9c51461058c578063f2fde38b146105ac576101ee565b8063acec338a146104b7578063b88d4fde146104d7578063c2ba4744146104f7578063c3b754dc14610517576101ee565b80639281aa0b116100dc5780639281aa0b1461044d57806395d89b411461046d578063a22cb46514610482578063a560ed7b146104a2576101ee565b8063715018a6146103ee578063804f43cd146104035780638907e787146104185780638da5cb5b14610438576101ee565b80632f745c591161018557806355f804b31161015457806355f804b31461036e5780636352211e1461038e5780636edc4388146103ae57806370a08231146103ce576101ee565b80632f745c59146102f957806342842e0e146103195780634f6ccce714610339578063524513d614610359576101ee565b806318160ddd116101c157806318160ddd1461029a57806322f3e2d4146102bc57806323b872dd146102d15780632abadeca146102f1576101ee565b806301ffc9a7146101f357806306fdde0314610229578063081812fc1461024b578063095ea7b314610278575b600080fd5b3480156101ff57600080fd5b5061021361020e366004611d6e565b6105cc565b6040516102209190611ec0565b60405180910390f35b34801561023557600080fd5b5061023e6105f9565b6040516102209190611ecb565b34801561025757600080fd5b5061026b610266366004611dec565b61068b565b6040516102209190611e6f565b34801561028457600080fd5b50610298610293366004611d2b565b6106d7565b005b3480156102a657600080fd5b506102af61076f565b60405161022091906124e0565b3480156102c857600080fd5b50610213610775565b3480156102dd57600080fd5b506102986102ec366004611c4e565b61077e565b6102986107b6565b34801561030557600080fd5b506102af610314366004611d2b565b6108c3565b34801561032557600080fd5b50610298610334366004611c4e565b610915565b34801561034557600080fd5b506102af610354366004611dec565b610930565b34801561036557600080fd5b5061021361098b565b34801561037a57600080fd5b50610298610389366004611da6565b610999565b34801561039a57600080fd5b5061026b6103a9366004611dec565b610a0b565b3480156103ba57600080fd5b506102986103c9366004611dec565b610a40565b3480156103da57600080fd5b506102af6103e9366004611c02565b610aa4565b3480156103fa57600080fd5b50610298610ae8565b34801561040f57600080fd5b50610298610b91565b34801561042457600080fd5b50610213610433366004611c02565b610be7565b34801561044457600080fd5b5061026b610c05565b34801561045957600080fd5b50610298610468366004611d02565b610c14565b34801561047957600080fd5b5061023e610c9e565b34801561048e57600080fd5b5061029861049d366004611d02565b610cad565b3480156104ae57600080fd5b506102af610d7b565b3480156104c357600080fd5b506102986104d2366004611d54565b610d81565b3480156104e357600080fd5b506102986104f2366004611c89565b610df3565b34801561050357600080fd5b50610213610512366004611c02565b610e32565b34801561052357600080fd5b50610298610532366004611d54565b610e7e565b34801561054357600080fd5b5061023e610552366004611dec565b610ef7565b34801561056357600080fd5b50610298610572366004611d2b565b610ffd565b34801561058357600080fd5b506102af6110e0565b34801561059857600080fd5b506102136105a7366004611c1c565b6110e6565b3480156105b857600080fd5b506102986105c7366004611c02565b611114565b60006001600160e01b0319821663780e9d6360e01b14806105f157506105f1826111f5565b90505b919050565b60606000805461060890612558565b80601f016020809104026020016040519081016040528092919081815260200182805461063490612558565b80156106815780601f1061065657610100808354040283529160200191610681565b820191906000526020600020905b81548152906001019060200180831161066457829003601f168201915b5050505050905090565b600061069682611235565b6106bb5760405162461bcd60e51b81526004016106b290612298565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006106e282610a0b565b9050806001600160a01b0316836001600160a01b031614156107165760405162461bcd60e51b81526004016106b290612402565b806001600160a01b0316610728611252565b6001600160a01b031614806107445750610744816105a7611252565b6107605760405162461bcd60e51b81526004016106b290612173565b61076a8383611256565b505050565b60085490565b60105460ff1690565b61078f610789611252565b826112c4565b6107ab5760405162461bcd60e51b81526004016106b290612443565b61076a838383611349565b60105460ff166107d85760405162461bcd60e51b81526004016106b290612319565b600e546107e56013611476565b6107f09060016124e9565b1061080d5760405162461bcd60e51b81526004016106b29061213e565b6000610817610c05565b9050336001600160a01b0382161461085957600f54336000908152600d6020526040902054106108595760405162461bcd60e51b81526004016106b290611ede565b60006108656013611476565b6108709060016124e9565b9050600e5461087f6013611476565b10156108bf5761088f601361147a565b6108993382611497565b336000908152600d602052604081208054600192906108b99084906124e9565b90915550505b5050565b60006108ce83610aa4565b82106108ec5760405162461bcd60e51b81526004016106b290611f2f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b61076a83838360405180602001604052806000815250610df3565b600061093a61076f565b82106109585760405162461bcd60e51b81526004016106b290612494565b6008828154811061097957634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b601054610100900460ff1690565b6109a1611252565b6001600160a01b03166109b2610c05565b6001600160a01b031614806109dc57506109ca611252565b600b546001600160a01b039081169116145b6109f85760405162461bcd60e51b81526004016106b2906122e4565b80516108bf906011906020840190611ad2565b6000818152600260205260408120546001600160a01b0316806105f15760405162461bcd60e51b81526004016106b29061221a565b610a48611252565b6001600160a01b0316610a59610c05565b6001600160a01b03161480610a835750610a71611252565b600b546001600160a01b039081169116145b610a9f5760405162461bcd60e51b81526004016106b2906122e4565b600f55565b60006001600160a01b038216610acc5760405162461bcd60e51b81526004016106b2906121d0565b506001600160a01b031660009081526003602052604090205490565b610af0611252565b6001600160a01b0316610b01610c05565b6001600160a01b03161480610b2b5750610b19611252565b600b546001600160a01b039081169116145b610b475760405162461bcd60e51b81526004016106b2906122e4565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b601054610100900460ff16610bb85760405162461bcd60e51b81526004016106b2906120c4565b336000908152600c602052604090205460ff1661080d5760405162461bcd60e51b81526004016106b2906123bf565b6001600160a01b03166000908152600c602052604090205460ff1690565b600a546001600160a01b031690565b610c1c611252565b6001600160a01b0316610c2d610c05565b6001600160a01b03161480610c575750610c45611252565b600b546001600160a01b039081169116145b610c735760405162461bcd60e51b81526004016106b2906122e4565b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b60606001805461060890612558565b610cb5611252565b6001600160a01b0316826001600160a01b03161415610ce65760405162461bcd60e51b81526004016106b29061208d565b8060056000610cf3611252565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610d37611252565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610d6f9190611ec0565b60405180910390a35050565b600e5481565b610d89611252565b6001600160a01b0316610d9a610c05565b6001600160a01b03161480610dc45750610db2611252565b600b546001600160a01b039081169116145b610de05760405162461bcd60e51b81526004016106b2906122e4565b6010805460ff1916911515919091179055565b610e04610dfe611252565b836112c4565b610e205760405162461bcd60e51b81526004016106b290612443565b610e2c848484846114b1565b50505050565b6000610e3c610c05565b6001600160a01b0316826001600160a01b031614610e7657600f546001600160a01b0383166000908152600d6020526040902054106105f1565b506001919050565b610e86611252565b6001600160a01b0316610e97610c05565b6001600160a01b03161480610ec15750610eaf611252565b600b546001600160a01b039081169116145b610edd5760405162461bcd60e51b81526004016106b2906122e4565b601080549115156101000261ff0019909216919091179055565b6060610f0282611235565b610f1e5760405162461bcd60e51b81526004016106b290612391565b600060118054610f2d90612558565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5990612558565b8015610fa65780601f10610f7b57610100808354040283529160200191610fa6565b820191906000526020600020905b815481529060010190602001808311610f8957829003601f168201915b505050505090506000815111610fcb5760405180602001604052806000815250610ff6565b80610fd5846114e4565b604051602001610fe6929190611e30565b6040516020818303038152906040525b9392505050565b611005611252565b6001600160a01b0316611016610c05565b6001600160a01b03161480611040575061102e611252565b600b546001600160a01b039081169116145b61105c5760405162461bcd60e51b81526004016106b2906122e4565b60005b8181101561076a5760006110736013611476565b61107e9060016124e9565b9050600e548110156110cd57611094601361147a565b61109e8482611497565b6001600160a01b0384166000908152600d602052604081208054600192906110c79084906124e9565b90915550505b50806110d881612593565b91505061105f565b600f5481565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61111c611252565b6001600160a01b031661112d610c05565b6001600160a01b031614806111575750611145611252565b600b546001600160a01b039081169116145b6111735760405162461bcd60e51b81526004016106b2906122e4565b6001600160a01b0381166111995760405162461bcd60e51b81526004016106b290611fcc565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b148061122657506001600160e01b03198216635b5e139f60e01b145b806105f157506105f1826115ff565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061128b82610a0b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006112cf82611235565b6112eb5760405162461bcd60e51b81526004016106b2906120f2565b60006112f683610a0b565b9050806001600160a01b0316846001600160a01b031614806113315750836001600160a01b03166113268461068b565b6001600160a01b0316145b80611341575061134181856110e6565b949350505050565b826001600160a01b031661135c82610a0b565b6001600160a01b0316146113825760405162461bcd60e51b81526004016106b290612348565b6001600160a01b0382166113a85760405162461bcd60e51b81526004016106b290612049565b6113b3838383611618565b6113be600082611256565b6001600160a01b03831660009081526003602052604081208054600192906113e7908490612515565b90915550506001600160a01b03821660009081526003602052604081208054600192906114159084906124e9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b5490565b600181600001600082825461148f91906124e9565b909155505050565b6108bf8282604051806020016040528060008152506116a1565b6114bc848484611349565b6114c8848484846116d4565b610e2c5760405162461bcd60e51b81526004016106b290611f7a565b60608161150957506040805180820190915260018152600360fc1b60208201526105f4565b8160005b8115611533578061151d81612593565b915061152c9050600a83612501565b915061150d565b60008167ffffffffffffffff81111561155c57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611586576020820181803683370190505b5090505b84156113415761159b600183612515565b91506115a8600a866125ae565b6115b39060306124e9565b60f81b8183815181106115d657634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506115f8600a86612501565b945061158a565b6001600160e01b031981166301ffc9a760e01b14919050565b61162383838361076a565b6001600160a01b03831661163f5761163a816117ef565b611662565b816001600160a01b0316836001600160a01b031614611662576116628382611833565b6001600160a01b03821661167e57611679816118d0565b61076a565b826001600160a01b0316826001600160a01b03161461076a5761076a82826119a9565b6116ab83836119ed565b6116b860008484846116d4565b61076a5760405162461bcd60e51b81526004016106b290611f7a565b60006116e8846001600160a01b0316611acc565b156117e457836001600160a01b031663150b7a02611704611252565b8786866040518563ffffffff1660e01b81526004016117269493929190611e83565b602060405180830381600087803b15801561174057600080fd5b505af1925050508015611770575060408051601f3d908101601f1916820190925261176d91810190611d8a565b60015b6117ca573d80801561179e576040519150601f19603f3d011682016040523d82523d6000602084013e6117a3565b606091505b5080516117c25760405162461bcd60e51b81526004016106b290611f7a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611341565b506001949350505050565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6000600161184084610aa4565b61184a9190612515565b60008381526007602052604090205490915080821461189d576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906118e290600190612515565b6000838152600960205260408120546008805493945090928490811061191857634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061194757634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061198d57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006119b483610aa4565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216611a135760405162461bcd60e51b81526004016106b290612263565b611a1c81611235565b15611a395760405162461bcd60e51b81526004016106b290612012565b611a4560008383611618565b6001600160a01b0382166000908152600360205260408120805460019290611a6e9084906124e9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b828054611ade90612558565b90600052602060002090601f016020900481019282611b005760008555611b46565b82601f10611b1957805160ff1916838001178555611b46565b82800160010185558215611b46579182015b82811115611b46578251825591602001919060010190611b2b565b50611b52929150611b56565b5090565b5b80821115611b525760008155600101611b57565b600067ffffffffffffffff80841115611b8657611b866125ee565b604051601f8501601f191681016020018281118282101715611baa57611baa6125ee565b604052848152915081838501861015611bc257600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b03811681146105f457600080fd5b803580151581146105f457600080fd5b600060208284031215611c13578081fd5b610ff682611bdb565b60008060408385031215611c2e578081fd5b611c3783611bdb565b9150611c4560208401611bdb565b90509250929050565b600080600060608486031215611c62578081fd5b611c6b84611bdb565b9250611c7960208501611bdb565b9150604084013590509250925092565b60008060008060808587031215611c9e578081fd5b611ca785611bdb565b9350611cb560208601611bdb565b925060408501359150606085013567ffffffffffffffff811115611cd7578182fd5b8501601f81018713611ce7578182fd5b611cf687823560208401611b6b565b91505092959194509250565b60008060408385031215611d14578182fd5b611d1d83611bdb565b9150611c4560208401611bf2565b60008060408385031215611d3d578182fd5b611d4683611bdb565b946020939093013593505050565b600060208284031215611d65578081fd5b610ff682611bf2565b600060208284031215611d7f578081fd5b8135610ff681612604565b600060208284031215611d9b578081fd5b8151610ff681612604565b600060208284031215611db7578081fd5b813567ffffffffffffffff811115611dcd578182fd5b8201601f81018413611ddd578182fd5b61134184823560208401611b6b565b600060208284031215611dfd578081fd5b5035919050565b60008151808452611e1c81602086016020860161252c565b601f01601f19169290920160200192915050565b60008351611e4281846020880161252c565b835190830190611e5681836020880161252c565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611eb690830184611e04565b9695505050505050565b901515815260200190565b600060208252610ff66020830184611e04565b60208082526031908201527f4f6e6c79206f6e652077686974656c697374206d696e74696e6720697320616c6040820152706c6f77656420706572206164647265737360781b606082015260800190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b60208082526014908201527377686974656c697374206e6f742061637469766560601b604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f507572636861736520776f756c6420657863656564204d41585f4d494e544544604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601590820152744d696e74696e67206973206e6f742061637469766560581b604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b602080825260149082015273151bdad95b88111bd95cc81b9bdd08195e1a5cdd60621b604082015260600190565b60208082526023908201527f4f6e6c792077686974656c6973746564206164647265737365732063616e206d6040820152621a5b9d60ea1b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b90815260200190565b600082198211156124fc576124fc6125c2565b500190565b600082612510576125106125d8565b500490565b600082821015612527576125276125c2565b500390565b60005b8381101561254757818101518382015260200161252f565b83811115610e2c5750506000910152565b60028104600182168061256c57607f821691505b6020821081141561258d57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156125a7576125a76125c2565b5060010190565b6000826125bd576125bd6125d8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461261a57600080fd5b5056fea2646970667358221220a164e604ec1decb6aa6ba3194cb91c0aaaa7d0ab99cae75f809f5ac445dd5c1964736f6c63430008000033

Deployed Bytecode

0x6080604052600436106101ee5760003560e01c8063715018a61161010d578063acec338a116100a0578063c87b56dd1161006f578063c87b56dd14610537578063cbce4c9714610557578063d75e611014610577578063e985e9c51461058c578063f2fde38b146105ac576101ee565b8063acec338a146104b7578063b88d4fde146104d7578063c2ba4744146104f7578063c3b754dc14610517576101ee565b80639281aa0b116100dc5780639281aa0b1461044d57806395d89b411461046d578063a22cb46514610482578063a560ed7b146104a2576101ee565b8063715018a6146103ee578063804f43cd146104035780638907e787146104185780638da5cb5b14610438576101ee565b80632f745c591161018557806355f804b31161015457806355f804b31461036e5780636352211e1461038e5780636edc4388146103ae57806370a08231146103ce576101ee565b80632f745c59146102f957806342842e0e146103195780634f6ccce714610339578063524513d614610359576101ee565b806318160ddd116101c157806318160ddd1461029a57806322f3e2d4146102bc57806323b872dd146102d15780632abadeca146102f1576101ee565b806301ffc9a7146101f357806306fdde0314610229578063081812fc1461024b578063095ea7b314610278575b600080fd5b3480156101ff57600080fd5b5061021361020e366004611d6e565b6105cc565b6040516102209190611ec0565b60405180910390f35b34801561023557600080fd5b5061023e6105f9565b6040516102209190611ecb565b34801561025757600080fd5b5061026b610266366004611dec565b61068b565b6040516102209190611e6f565b34801561028457600080fd5b50610298610293366004611d2b565b6106d7565b005b3480156102a657600080fd5b506102af61076f565b60405161022091906124e0565b3480156102c857600080fd5b50610213610775565b3480156102dd57600080fd5b506102986102ec366004611c4e565b61077e565b6102986107b6565b34801561030557600080fd5b506102af610314366004611d2b565b6108c3565b34801561032557600080fd5b50610298610334366004611c4e565b610915565b34801561034557600080fd5b506102af610354366004611dec565b610930565b34801561036557600080fd5b5061021361098b565b34801561037a57600080fd5b50610298610389366004611da6565b610999565b34801561039a57600080fd5b5061026b6103a9366004611dec565b610a0b565b3480156103ba57600080fd5b506102986103c9366004611dec565b610a40565b3480156103da57600080fd5b506102af6103e9366004611c02565b610aa4565b3480156103fa57600080fd5b50610298610ae8565b34801561040f57600080fd5b50610298610b91565b34801561042457600080fd5b50610213610433366004611c02565b610be7565b34801561044457600080fd5b5061026b610c05565b34801561045957600080fd5b50610298610468366004611d02565b610c14565b34801561047957600080fd5b5061023e610c9e565b34801561048e57600080fd5b5061029861049d366004611d02565b610cad565b3480156104ae57600080fd5b506102af610d7b565b3480156104c357600080fd5b506102986104d2366004611d54565b610d81565b3480156104e357600080fd5b506102986104f2366004611c89565b610df3565b34801561050357600080fd5b50610213610512366004611c02565b610e32565b34801561052357600080fd5b50610298610532366004611d54565b610e7e565b34801561054357600080fd5b5061023e610552366004611dec565b610ef7565b34801561056357600080fd5b50610298610572366004611d2b565b610ffd565b34801561058357600080fd5b506102af6110e0565b34801561059857600080fd5b506102136105a7366004611c1c565b6110e6565b3480156105b857600080fd5b506102986105c7366004611c02565b611114565b60006001600160e01b0319821663780e9d6360e01b14806105f157506105f1826111f5565b90505b919050565b60606000805461060890612558565b80601f016020809104026020016040519081016040528092919081815260200182805461063490612558565b80156106815780601f1061065657610100808354040283529160200191610681565b820191906000526020600020905b81548152906001019060200180831161066457829003601f168201915b5050505050905090565b600061069682611235565b6106bb5760405162461bcd60e51b81526004016106b290612298565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006106e282610a0b565b9050806001600160a01b0316836001600160a01b031614156107165760405162461bcd60e51b81526004016106b290612402565b806001600160a01b0316610728611252565b6001600160a01b031614806107445750610744816105a7611252565b6107605760405162461bcd60e51b81526004016106b290612173565b61076a8383611256565b505050565b60085490565b60105460ff1690565b61078f610789611252565b826112c4565b6107ab5760405162461bcd60e51b81526004016106b290612443565b61076a838383611349565b60105460ff166107d85760405162461bcd60e51b81526004016106b290612319565b600e546107e56013611476565b6107f09060016124e9565b1061080d5760405162461bcd60e51b81526004016106b29061213e565b6000610817610c05565b9050336001600160a01b0382161461085957600f54336000908152600d6020526040902054106108595760405162461bcd60e51b81526004016106b290611ede565b60006108656013611476565b6108709060016124e9565b9050600e5461087f6013611476565b10156108bf5761088f601361147a565b6108993382611497565b336000908152600d602052604081208054600192906108b99084906124e9565b90915550505b5050565b60006108ce83610aa4565b82106108ec5760405162461bcd60e51b81526004016106b290611f2f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b61076a83838360405180602001604052806000815250610df3565b600061093a61076f565b82106109585760405162461bcd60e51b81526004016106b290612494565b6008828154811061097957634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b601054610100900460ff1690565b6109a1611252565b6001600160a01b03166109b2610c05565b6001600160a01b031614806109dc57506109ca611252565b600b546001600160a01b039081169116145b6109f85760405162461bcd60e51b81526004016106b2906122e4565b80516108bf906011906020840190611ad2565b6000818152600260205260408120546001600160a01b0316806105f15760405162461bcd60e51b81526004016106b29061221a565b610a48611252565b6001600160a01b0316610a59610c05565b6001600160a01b03161480610a835750610a71611252565b600b546001600160a01b039081169116145b610a9f5760405162461bcd60e51b81526004016106b2906122e4565b600f55565b60006001600160a01b038216610acc5760405162461bcd60e51b81526004016106b2906121d0565b506001600160a01b031660009081526003602052604090205490565b610af0611252565b6001600160a01b0316610b01610c05565b6001600160a01b03161480610b2b5750610b19611252565b600b546001600160a01b039081169116145b610b475760405162461bcd60e51b81526004016106b2906122e4565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b601054610100900460ff16610bb85760405162461bcd60e51b81526004016106b2906120c4565b336000908152600c602052604090205460ff1661080d5760405162461bcd60e51b81526004016106b2906123bf565b6001600160a01b03166000908152600c602052604090205460ff1690565b600a546001600160a01b031690565b610c1c611252565b6001600160a01b0316610c2d610c05565b6001600160a01b03161480610c575750610c45611252565b600b546001600160a01b039081169116145b610c735760405162461bcd60e51b81526004016106b2906122e4565b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b60606001805461060890612558565b610cb5611252565b6001600160a01b0316826001600160a01b03161415610ce65760405162461bcd60e51b81526004016106b29061208d565b8060056000610cf3611252565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610d37611252565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610d6f9190611ec0565b60405180910390a35050565b600e5481565b610d89611252565b6001600160a01b0316610d9a610c05565b6001600160a01b03161480610dc45750610db2611252565b600b546001600160a01b039081169116145b610de05760405162461bcd60e51b81526004016106b2906122e4565b6010805460ff1916911515919091179055565b610e04610dfe611252565b836112c4565b610e205760405162461bcd60e51b81526004016106b290612443565b610e2c848484846114b1565b50505050565b6000610e3c610c05565b6001600160a01b0316826001600160a01b031614610e7657600f546001600160a01b0383166000908152600d6020526040902054106105f1565b506001919050565b610e86611252565b6001600160a01b0316610e97610c05565b6001600160a01b03161480610ec15750610eaf611252565b600b546001600160a01b039081169116145b610edd5760405162461bcd60e51b81526004016106b2906122e4565b601080549115156101000261ff0019909216919091179055565b6060610f0282611235565b610f1e5760405162461bcd60e51b81526004016106b290612391565b600060118054610f2d90612558565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5990612558565b8015610fa65780601f10610f7b57610100808354040283529160200191610fa6565b820191906000526020600020905b815481529060010190602001808311610f8957829003601f168201915b505050505090506000815111610fcb5760405180602001604052806000815250610ff6565b80610fd5846114e4565b604051602001610fe6929190611e30565b6040516020818303038152906040525b9392505050565b611005611252565b6001600160a01b0316611016610c05565b6001600160a01b03161480611040575061102e611252565b600b546001600160a01b039081169116145b61105c5760405162461bcd60e51b81526004016106b2906122e4565b60005b8181101561076a5760006110736013611476565b61107e9060016124e9565b9050600e548110156110cd57611094601361147a565b61109e8482611497565b6001600160a01b0384166000908152600d602052604081208054600192906110c79084906124e9565b90915550505b50806110d881612593565b91505061105f565b600f5481565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61111c611252565b6001600160a01b031661112d610c05565b6001600160a01b031614806111575750611145611252565b600b546001600160a01b039081169116145b6111735760405162461bcd60e51b81526004016106b2906122e4565b6001600160a01b0381166111995760405162461bcd60e51b81526004016106b290611fcc565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b148061122657506001600160e01b03198216635b5e139f60e01b145b806105f157506105f1826115ff565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061128b82610a0b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006112cf82611235565b6112eb5760405162461bcd60e51b81526004016106b2906120f2565b60006112f683610a0b565b9050806001600160a01b0316846001600160a01b031614806113315750836001600160a01b03166113268461068b565b6001600160a01b0316145b80611341575061134181856110e6565b949350505050565b826001600160a01b031661135c82610a0b565b6001600160a01b0316146113825760405162461bcd60e51b81526004016106b290612348565b6001600160a01b0382166113a85760405162461bcd60e51b81526004016106b290612049565b6113b3838383611618565b6113be600082611256565b6001600160a01b03831660009081526003602052604081208054600192906113e7908490612515565b90915550506001600160a01b03821660009081526003602052604081208054600192906114159084906124e9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b5490565b600181600001600082825461148f91906124e9565b909155505050565b6108bf8282604051806020016040528060008152506116a1565b6114bc848484611349565b6114c8848484846116d4565b610e2c5760405162461bcd60e51b81526004016106b290611f7a565b60608161150957506040805180820190915260018152600360fc1b60208201526105f4565b8160005b8115611533578061151d81612593565b915061152c9050600a83612501565b915061150d565b60008167ffffffffffffffff81111561155c57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611586576020820181803683370190505b5090505b84156113415761159b600183612515565b91506115a8600a866125ae565b6115b39060306124e9565b60f81b8183815181106115d657634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506115f8600a86612501565b945061158a565b6001600160e01b031981166301ffc9a760e01b14919050565b61162383838361076a565b6001600160a01b03831661163f5761163a816117ef565b611662565b816001600160a01b0316836001600160a01b031614611662576116628382611833565b6001600160a01b03821661167e57611679816118d0565b61076a565b826001600160a01b0316826001600160a01b03161461076a5761076a82826119a9565b6116ab83836119ed565b6116b860008484846116d4565b61076a5760405162461bcd60e51b81526004016106b290611f7a565b60006116e8846001600160a01b0316611acc565b156117e457836001600160a01b031663150b7a02611704611252565b8786866040518563ffffffff1660e01b81526004016117269493929190611e83565b602060405180830381600087803b15801561174057600080fd5b505af1925050508015611770575060408051601f3d908101601f1916820190925261176d91810190611d8a565b60015b6117ca573d80801561179e576040519150601f19603f3d011682016040523d82523d6000602084013e6117a3565b606091505b5080516117c25760405162461bcd60e51b81526004016106b290611f7a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611341565b506001949350505050565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6000600161184084610aa4565b61184a9190612515565b60008381526007602052604090205490915080821461189d576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906118e290600190612515565b6000838152600960205260408120546008805493945090928490811061191857634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061194757634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061198d57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006119b483610aa4565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216611a135760405162461bcd60e51b81526004016106b290612263565b611a1c81611235565b15611a395760405162461bcd60e51b81526004016106b290612012565b611a4560008383611618565b6001600160a01b0382166000908152600360205260408120805460019290611a6e9084906124e9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b828054611ade90612558565b90600052602060002090601f016020900481019282611b005760008555611b46565b82601f10611b1957805160ff1916838001178555611b46565b82800160010185558215611b46579182015b82811115611b46578251825591602001919060010190611b2b565b50611b52929150611b56565b5090565b5b80821115611b525760008155600101611b57565b600067ffffffffffffffff80841115611b8657611b866125ee565b604051601f8501601f191681016020018281118282101715611baa57611baa6125ee565b604052848152915081838501861015611bc257600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b03811681146105f457600080fd5b803580151581146105f457600080fd5b600060208284031215611c13578081fd5b610ff682611bdb565b60008060408385031215611c2e578081fd5b611c3783611bdb565b9150611c4560208401611bdb565b90509250929050565b600080600060608486031215611c62578081fd5b611c6b84611bdb565b9250611c7960208501611bdb565b9150604084013590509250925092565b60008060008060808587031215611c9e578081fd5b611ca785611bdb565b9350611cb560208601611bdb565b925060408501359150606085013567ffffffffffffffff811115611cd7578182fd5b8501601f81018713611ce7578182fd5b611cf687823560208401611b6b565b91505092959194509250565b60008060408385031215611d14578182fd5b611d1d83611bdb565b9150611c4560208401611bf2565b60008060408385031215611d3d578182fd5b611d4683611bdb565b946020939093013593505050565b600060208284031215611d65578081fd5b610ff682611bf2565b600060208284031215611d7f578081fd5b8135610ff681612604565b600060208284031215611d9b578081fd5b8151610ff681612604565b600060208284031215611db7578081fd5b813567ffffffffffffffff811115611dcd578182fd5b8201601f81018413611ddd578182fd5b61134184823560208401611b6b565b600060208284031215611dfd578081fd5b5035919050565b60008151808452611e1c81602086016020860161252c565b601f01601f19169290920160200192915050565b60008351611e4281846020880161252c565b835190830190611e5681836020880161252c565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611eb690830184611e04565b9695505050505050565b901515815260200190565b600060208252610ff66020830184611e04565b60208082526031908201527f4f6e6c79206f6e652077686974656c697374206d696e74696e6720697320616c6040820152706c6f77656420706572206164647265737360781b606082015260800190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b60208082526014908201527377686974656c697374206e6f742061637469766560601b604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f507572636861736520776f756c6420657863656564204d41585f4d494e544544604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601590820152744d696e74696e67206973206e6f742061637469766560581b604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b602080825260149082015273151bdad95b88111bd95cc81b9bdd08195e1a5cdd60621b604082015260600190565b60208082526023908201527f4f6e6c792077686974656c6973746564206164647265737365732063616e206d6040820152621a5b9d60ea1b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b90815260200190565b600082198211156124fc576124fc6125c2565b500190565b600082612510576125106125d8565b500490565b600082821015612527576125276125c2565b500390565b60005b8381101561254757818101518382015260200161252f565b83811115610e2c5750506000910152565b60028104600182168061256c57607f821691505b6020821081141561258d57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156125a7576125a76125c2565b5060010190565b6000826125bd576125bd6125d8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461261a57600080fd5b5056fea2646970667358221220a164e604ec1decb6aa6ba3194cb91c0aaaa7d0ab99cae75f809f5ac445dd5c1964736f6c63430008000033

Deployed Bytecode Sourcemap

49583:8731:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36763:300;;;;;;;;;;-1:-1:-1;36763:300:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22883:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24465:308::-;;;;;;;;;;-1:-1:-1;24465:308:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;23988:411::-;;;;;;;;;;-1:-1:-1;23988:411:0;;;;;:::i;:::-;;:::i;:::-;;37566:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;55015:86::-;;;;;;;;;;;;;:::i;25524:376::-;;;;;;;;;;-1:-1:-1;25524:376:0;;;;;:::i;:::-;;:::i;56235:741::-;;;:::i;37147:343::-;;;;;;;;;;-1:-1:-1;37147:343:0;;;;;:::i;:::-;;:::i;25971:185::-;;;;;;;;;;-1:-1:-1;25971:185:0;;;;;:::i;:::-;;:::i;37756:320::-;;;;;;;;;;-1:-1:-1;37756:320:0;;;;;:::i;:::-;;:::i;55109:102::-;;;;;;;;;;;;;:::i;55613:104::-;;;;;;;;;;-1:-1:-1;55613:104:0;;;;;:::i;:::-;;:::i;22490:326::-;;;;;;;;;;-1:-1:-1;22490:326:0;;;;;:::i;:::-;;:::i;55725:117::-;;;;;;;;;;-1:-1:-1;55725:117:0;;;;;:::i;:::-;;:::i;22133:295::-;;;;;;;;;;-1:-1:-1;22133:295:0;;;;;:::i;:::-;;:::i;46324:148::-;;;;;;;;;;;;;:::i;56984:741::-;;;;;;;;;;;;;:::i;54882:125::-;;;;;;;;;;-1:-1:-1;54882:125:0;;;;;:::i;:::-;;:::i;45608:87::-;;;;;;;;;;;;;:::i;55357:140::-;;;;;;;;;;-1:-1:-1;55357:140:0;;;;;:::i;:::-;;:::i;23052:104::-;;;;;;;;;;;;;:::i;24845:327::-;;;;;;;;;;-1:-1:-1;24845:327:0;;;;;:::i;:::-;;:::i;49891:31::-;;;;;;;;;;;;;:::i;55505:100::-;;;;;;;;;;-1:-1:-1;55505:100:0;;;;;:::i;:::-;;:::i;26227:365::-;;;;;;;;;;-1:-1:-1;26227:365:0;;;;;:::i;:::-;;:::i;54661:213::-;;;;;;;;;;-1:-1:-1;54661:213:0;;;;;:::i;:::-;;:::i;55220:129::-;;;;;;;;;;-1:-1:-1;55220:129:0;;;;;:::i;:::-;;:::i;57986:325::-;;;;;;;;;;-1:-1:-1;57986:325:0;;;;;:::i;:::-;;:::i;55850:377::-;;;;;;;;;;-1:-1:-1;55850:377:0;;;;;:::i;:::-;;:::i;49929:33::-;;;;;;;;;;;;;:::i;25243:214::-;;;;;;;;;;-1:-1:-1;25243:214:0;;;;;:::i;:::-;;:::i;46627:281::-;;;;;;;;;;-1:-1:-1;46627:281:0;;;;;:::i;:::-;;:::i;36763:300::-;36910:4;-1:-1:-1;;;;;;36952:50:0;;-1:-1:-1;;;36952:50:0;;:103;;;37019:36;37043:11;37019:23;:36::i;:::-;36932:123;;36763:300;;;;:::o;22883:100::-;22937:13;22970:5;22963:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22883:100;:::o;24465:308::-;24586:7;24633:16;24641:7;24633;:16::i;:::-;24611:110;;;;-1:-1:-1;;;24611:110:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;24741:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24741:24:0;;24465:308::o;23988:411::-;24069:13;24085:23;24100:7;24085:14;:23::i;:::-;24069:39;;24133:5;-1:-1:-1;;;;;24127:11:0;:2;-1:-1:-1;;;;;24127:11:0;;;24119:57;;;;-1:-1:-1;;;24119:57:0;;;;;;;:::i;:::-;24227:5;-1:-1:-1;;;;;24211:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;24211:21:0;;:62;;;;24236:37;24253:5;24260:12;:10;:12::i;24236:37::-;24189:168;;;;-1:-1:-1;;;24189:168:0;;;;;;;:::i;:::-;24370:21;24379:2;24383:7;24370:8;:21::i;:::-;23988:411;;;:::o;37566:113::-;37654:10;:17;37566:113;:::o;55015:86::-;55084:9;;;;55015:86;:::o;25524:376::-;25733:41;25752:12;:10;:12::i;:::-;25766:7;25733:18;:41::i;:::-;25711:140;;;;-1:-1:-1;;;25711:140:0;;;;;;;:::i;:::-;25864:28;25874:4;25880:2;25884:7;25864:9;:28::i;56235:741::-;56293:9;;;;56285:43;;;;-1:-1:-1;;;56285:43:0;;;;;;;:::i;:::-;56375:10;;56347:21;:11;:19;:21::i;:::-;:25;;56371:1;56347:25;:::i;:::-;:38;56339:82;;;;-1:-1:-1;;;56339:82:0;;;;;;;:::i;:::-;56483:21;56507:7;:5;:7::i;:::-;56483:31;-1:-1:-1;56537:10:0;-1:-1:-1;;;;;56529:36:0;;;56525:166;;56611:14;;56597:10;56590:18;;;;:6;:18;;;;;;:35;56582:97;;;;-1:-1:-1;;;56582:97:0;;;;;;;:::i;:::-;56740:15;56758:21;:11;:19;:21::i;:::-;:25;;56782:1;56758:25;:::i;:::-;56740:43;;56824:10;;56800:21;:11;:19;:21::i;:::-;:34;56796:173;;;56851:23;:11;:21;:23::i;:::-;56889:30;56899:10;56911:7;56889:9;:30::i;:::-;56941:10;56934:18;;;;:6;:18;;;;;:23;;56956:1;;56934:18;:23;;56956:1;;56934:23;:::i;:::-;;;;-1:-1:-1;;56796:173:0;56235:741;;:::o;37147:343::-;37289:7;37344:23;37361:5;37344:16;:23::i;:::-;37336:5;:31;37314:124;;;;-1:-1:-1;;;37314:124:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;37456:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;37147:343::o;25971:185::-;26109:39;26126:4;26132:2;26136:7;26109:39;;;;;;;;;;;;:16;:39::i;37756:320::-;37876:7;37931:30;:28;:30::i;:::-;37923:5;:38;37901:132;;;;-1:-1:-1;;;37901:132:0;;;;;;;:::i;:::-;38051:10;38062:5;38051:17;;;;;;-1:-1:-1;;;38051:17:0;;;;;;;;;;;;;;;;;38044:24;;37756:320;;;:::o;55109:102::-;55187:16;;;;;;;;55109:102::o;55613:104::-;45853:12;:10;:12::i;:::-;-1:-1:-1;;;;;45842:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;45842:23:0;;:51;;;;45881:12;:10;:12::i;:::-;45869:8;;-1:-1:-1;;;;;45869:8:0;;;:24;;;45842:51;45820:133;;;;-1:-1:-1;;;45820:133:0;;;;;;;:::i;:::-;55686:23;;::::1;::::0;:13:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;22490:326::-:0;22607:7;22648:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22648:16:0;22697:19;22675:110;;;;-1:-1:-1;;;22675:110:0;;;;;;;:::i;55725:117::-;45853:12;:10;:12::i;:::-;-1:-1:-1;;;;;45842:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;45842:23:0;;:51;;;;45881:12;:10;:12::i;:::-;45869:8;;-1:-1:-1;;;;;45869:8:0;;;:24;;;45842:51;45820:133;;;;-1:-1:-1;;;45820:133:0;;;;;;;:::i;:::-;55804:14:::1;:30:::0;55725:117::o;22133:295::-;22250:7;-1:-1:-1;;;;;22297:19:0;;22275:111;;;;-1:-1:-1;;;22275:111:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;22404:16:0;;;;;:9;:16;;;;;;;22133:295::o;46324:148::-;45853:12;:10;:12::i;:::-;-1:-1:-1;;;;;45842:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;45842:23:0;;:51;;;;45881:12;:10;:12::i;:::-;45869:8;;-1:-1:-1;;;;;45869:8:0;;;:24;;;45842:51;45820:133;;;;-1:-1:-1;;;45820:133:0;;;;;;;:::i;:::-;46415:6:::1;::::0;46394:40:::1;::::0;46431:1:::1;::::0;-1:-1:-1;;;;;46415:6:0::1;::::0;46394:40:::1;::::0;46431:1;;46394:40:::1;46445:6;:19:::0;;-1:-1:-1;;;;;;46445:19:0::1;::::0;;46324:148::o;56984:741::-;57038:16;;;;;;;57030:49;;;;-1:-1:-1;;;57030:49:0;;;;;;;:::i;:::-;57110:10;57098:23;;;;:11;:23;;;;;;;;57090:71;;;;-1:-1:-1;;;57090:71:0;;;;;;;:::i;54882:125::-;-1:-1:-1;;;;;54979:20:0;54955:4;54979:20;;;:11;:20;;;;;;;;;54882:125::o;45608:87::-;45681:6;;-1:-1:-1;;;;;45681:6:0;45608:87;:::o;55357:140::-;45853:12;:10;:12::i;:::-;-1:-1:-1;;;;;45842:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;45842:23:0;;:51;;;;45881:12;:10;:12::i;:::-;45869:8;;-1:-1:-1;;;;;45869:8:0;;;:24;;;45842:51;45820:133;;;;-1:-1:-1;;;45820:133:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;55451:20:0;;;::::1;;::::0;;;:11:::1;:20;::::0;;;;:38;;-1:-1:-1;;55451:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55357:140::o;23052:104::-;23108:13;23141:7;23134:14;;;;;:::i;24845:327::-;24992:12;:10;:12::i;:::-;-1:-1:-1;;;;;24980:24:0;:8;-1:-1:-1;;;;;24980:24:0;;;24972:62;;;;-1:-1:-1;;;24972:62:0;;;;;;;:::i;:::-;25092:8;25047:18;:32;25066:12;:10;:12::i;:::-;-1:-1:-1;;;;;25047:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;25047:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;25047:53:0;;;;;;;;;;;25131:12;:10;:12::i;:::-;-1:-1:-1;;;;;25116:48:0;;25155:8;25116:48;;;;;;:::i;:::-;;;;;;;;24845:327;;:::o;49891:31::-;;;;:::o;55505:100::-;45853:12;:10;:12::i;:::-;-1:-1:-1;;;;;45842:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;45842:23:0;;:51;;;;45881:12;:10;:12::i;:::-;45869:8;;-1:-1:-1;;;;;45869:8:0;;;:24;;;45842:51;45820:133;;;;-1:-1:-1;;;45820:133:0;;;;;;;:::i;:::-;55573:9:::1;:24:::0;;-1:-1:-1;;55573:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55505:100::o;26227:365::-;26416:41;26435:12;:10;:12::i;:::-;26449:7;26416:18;:41::i;:::-;26394:140;;;;-1:-1:-1;;;26394:140:0;;;;;;;:::i;:::-;26545:39;26559:4;26565:2;26569:7;26578:5;26545:13;:39::i;:::-;26227:365;;;;:::o;54661:213::-;54722:4;54817:7;:5;:7::i;:::-;-1:-1:-1;;;;;54806:18:0;:7;-1:-1:-1;;;;;54806:18:0;;:60;;54852:14;;-1:-1:-1;;;;;54834:15:0;;;;;;:6;:15;;;;;;:32;54806:60;;;-1:-1:-1;54827:4:0;;54661:213;-1:-1:-1;54661:213:0:o;55220:129::-;45853:12;:10;:12::i;:::-;-1:-1:-1;;;;;45842:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;45842:23:0;;:51;;;;45881:12;:10;:12::i;:::-;45869:8;;-1:-1:-1;;;;;45869:8:0;;;:24;;;45842:51;45820:133;;;;-1:-1:-1;;;45820:133:0;;;;;;;:::i;:::-;55304:16:::1;:37:::0;;;::::1;;;;-1:-1:-1::0;;55304:37:0;;::::1;::::0;;;::::1;::::0;;55220:129::o;57986:325::-;58059:13;58093:16;58101:7;58093;:16::i;:::-;58085:49;;;;-1:-1:-1;;;58085:49:0;;;;;;;:::i;:::-;58147:21;58171:13;58147:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58226:1;58208:7;58202:21;:25;:101;;;;;;;;;;;;;;;;;58254:7;58263:25;58280:7;58263:16;:25::i;:::-;58237:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58202:101;58195:108;57986:325;-1:-1:-1;;;57986:325:0:o;55850:377::-;45853:12;:10;:12::i;:::-;-1:-1:-1;;;;;45842:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;45842:23:0;;:51;;;;45881:12;:10;:12::i;:::-;45869:8;;-1:-1:-1;;;;;45869:8:0;;;:24;;;45842:51;45820:133;;;;-1:-1:-1;;;45820:133:0;;;;;;;:::i;:::-;55935:9:::1;55930:290;55954:14;55950:1;:18;55930:290;;;55990:15;56008:21;:11;:19;:21::i;:::-;:25;::::0;56032:1:::1;56008:25;:::i;:::-;55990:43;;56064:10;;56054:7;:20;56050:159;;;56095:23;:11;:21;:23::i;:::-;56137:22;56147:2;56151:7;56137:9;:22::i;:::-;-1:-1:-1::0;;;;;56178:10:0;::::1;;::::0;;;:6:::1;:10;::::0;;;;:15;;56192:1:::1;::::0;56178:10;:15:::1;::::0;56192:1;;56178:15:::1;:::i;:::-;::::0;;;-1:-1:-1;;56050:159:0::1;-1:-1:-1::0;55970:3:0;::::1;::::0;::::1;:::i;:::-;;;;55930:290;;49929:33:::0;;;;:::o;25243:214::-;-1:-1:-1;;;;;25414:25:0;;;25385:4;25414:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25243:214::o;46627:281::-;45853:12;:10;:12::i;:::-;-1:-1:-1;;;;;45842:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;45842:23:0;;:51;;;;45881:12;:10;:12::i;:::-;45869:8;;-1:-1:-1;;;;;45869:8:0;;;:24;;;45842:51;45820:133;;;;-1:-1:-1;;;45820:133:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46730:22:0;::::1;46708:110;;;;-1:-1:-1::0;;;46708:110:0::1;;;;;;;:::i;:::-;46855:6;::::0;46834:38:::1;::::0;-1:-1:-1;;;;;46834:38:0;;::::1;::::0;46855:6:::1;::::0;46834:38:::1;::::0;46855:6:::1;::::0;46834:38:::1;46883:6;:17:::0;;-1:-1:-1;;;;;;46883:17:0::1;-1:-1:-1::0;;;;;46883:17:0;;;::::1;::::0;;;::::1;::::0;;46627:281::o;21714:355::-;21861:4;-1:-1:-1;;;;;;21903:40:0;;-1:-1:-1;;;21903:40:0;;:105;;-1:-1:-1;;;;;;;21960:48:0;;-1:-1:-1;;;21960:48:0;21903:105;:158;;;;22025:36;22049:11;22025:23;:36::i;28139:127::-;28204:4;28228:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28228:16:0;:30;;;28139:127::o;16893:98::-;16973:10;16893:98;:::o;32262:174::-;32337:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32337:29:0;-1:-1:-1;;;;;32337:29:0;;;;;;;;:24;;32391:23;32337:24;32391:14;:23::i;:::-;-1:-1:-1;;;;;32382:46:0;;;;;;;;;;;32262:174;;:::o;28433:452::-;28562:4;28606:16;28614:7;28606;:16::i;:::-;28584:110;;;;-1:-1:-1;;;28584:110:0;;;;;;;:::i;:::-;28705:13;28721:23;28736:7;28721:14;:23::i;:::-;28705:39;;28774:5;-1:-1:-1;;;;;28763:16:0;:7;-1:-1:-1;;;;;28763:16:0;;:64;;;;28820:7;-1:-1:-1;;;;;28796:31:0;:20;28808:7;28796:11;:20::i;:::-;-1:-1:-1;;;;;28796:31:0;;28763:64;:113;;;;28844:32;28861:5;28868:7;28844:16;:32::i;:::-;28755:122;28433:452;-1:-1:-1;;;;28433:452:0:o;31529:615::-;31702:4;-1:-1:-1;;;;;31675:31:0;:23;31690:7;31675:14;:23::i;:::-;-1:-1:-1;;;;;31675:31:0;;31653:122;;;;-1:-1:-1;;;31653:122:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31794:16:0;;31786:65;;;;-1:-1:-1;;;31786:65:0;;;;;;;:::i;:::-;31864:39;31885:4;31891:2;31895:7;31864:20;:39::i;:::-;31968:29;31985:1;31989:7;31968:8;:29::i;:::-;-1:-1:-1;;;;;32010:15:0;;;;;;:9;:15;;;;;:20;;32029:1;;32010:15;:20;;32029:1;;32010:20;:::i;:::-;;;;-1:-1:-1;;;;;;;32041:13:0;;;;;;:9;:13;;;;;:18;;32058:1;;32041:13;:18;;32058:1;;32041:18;:::i;:::-;;;;-1:-1:-1;;32070:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32070:21:0;-1:-1:-1;;;;;32070:21:0;;;;;;;;;32109:27;;32070:16;;32109:27;;;;;;;31529:615;;;:::o;43972:114::-;44064:14;;43972:114::o;44094:90::-;44175:1;44157:7;:14;;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;;44094:90:0:o;29227:110::-;29303:26;29313:2;29317:7;29303:26;;;;;;;;;;;;:9;:26::i;27474:352::-;27631:28;27641:4;27647:2;27651:7;27631:9;:28::i;:::-;27692:48;27715:4;27721:2;27725:7;27734:5;27692:22;:48::i;:::-;27670:148;;;;-1:-1:-1;;;27670:148:0;;;;;;;:::i;17565:723::-;17621:13;17842:10;17838:53;;-1:-1:-1;17869:10:0;;;;;;;;;;;;-1:-1:-1;;;17869:10:0;;;;;;17838:53;17916:5;17901:12;17957:78;17964:9;;17957:78;;17990:8;;;;:::i;:::-;;-1:-1:-1;18013:10:0;;-1:-1:-1;18021:2:0;18013:10;;:::i;:::-;;;17957:78;;;18045:19;18077:6;18067:17;;;;;;-1:-1:-1;;;18067:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18067:17:0;;18045:39;;18095:154;18102:10;;18095:154;;18129:11;18139:1;18129:11;;:::i;:::-;;-1:-1:-1;18198:10:0;18206:2;18198:5;:10;:::i;:::-;18185:24;;:2;:24;:::i;:::-;18172:39;;18155:6;18162;18155:14;;;;;;-1:-1:-1;;;18155:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;18155:56:0;;;;;;;;-1:-1:-1;18226:11:0;18235:2;18226:11;;:::i;:::-;;;18095:154;;20165:207;-1:-1:-1;;;;;;20324:40:0;;-1:-1:-1;;;20324:40:0;20165:207;;;:::o;38689:589::-;38833:45;38860:4;38866:2;38870:7;38833:26;:45::i;:::-;-1:-1:-1;;;;;38895:18:0;;38891:187;;38930:40;38962:7;38930:31;:40::i;:::-;38891:187;;;39000:2;-1:-1:-1;;;;;38992:10:0;:4;-1:-1:-1;;;;;38992:10:0;;38988:90;;39019:47;39052:4;39058:7;39019:32;:47::i;:::-;-1:-1:-1;;;;;39092:16:0;;39088:183;;39125:45;39162:7;39125:36;:45::i;:::-;39088:183;;;39198:4;-1:-1:-1;;;;;39192:10:0;:2;-1:-1:-1;;;;;39192:10:0;;39188:83;;39219:40;39247:2;39251:7;39219:27;:40::i;29564:321::-;29694:18;29700:2;29704:7;29694:5;:18::i;:::-;29745:54;29776:1;29780:2;29784:7;29793:5;29745:22;:54::i;:::-;29723:154;;;;-1:-1:-1;;;29723:154:0;;;;;;;:::i;33001:1053::-;33156:4;33177:15;:2;-1:-1:-1;;;;;33177:13:0;;:15::i;:::-;33173:874;;;33246:2;-1:-1:-1;;;;;33230:36:0;;33289:12;:10;:12::i;:::-;33324:4;33351:7;33381:5;33230:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33230:175:0;;;;;;;;-1:-1:-1;;33230:175:0;;;;;;;;;;;;:::i;:::-;;;33209:783;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33592:13:0;;33588:389;;33635:108;;-1:-1:-1;;;33635:108:0;;;;;;;:::i;33588:389::-;33927:6;33921:13;33912:6;33908:2;33904:15;33897:38;33209:783;-1:-1:-1;;;;;;33469:55:0;-1:-1:-1;;;33469:55:0;;-1:-1:-1;33462:62:0;;33173:874;-1:-1:-1;34031:4:0;33001:1053;;;;;;:::o;40001:164::-;40105:10;:17;;40078:24;;;;:15;:24;;;;;:44;;;40133:24;;;;;;;;;;;;40001:164::o;40792:1002::-;41072:22;41122:1;41097:22;41114:4;41097:16;:22::i;:::-;:26;;;;:::i;:::-;41134:18;41155:26;;;:17;:26;;;;;;41072:51;;-1:-1:-1;41288:28:0;;;41284:328;;-1:-1:-1;;;;;41355:18:0;;41333:19;41355:18;;;:12;:18;;;;;;;;:34;;;;;;;;;41406:30;;;;;;:44;;;41523:30;;:17;:30;;;;;:43;;;41284:328;-1:-1:-1;41708:26:0;;;;:17;:26;;;;;;;;41701:33;;;-1:-1:-1;;;;;41752:18:0;;;;;:12;:18;;;;;:34;;;;;;;41745:41;40792:1002::o;42089:1079::-;42367:10;:17;42342:22;;42367:21;;42387:1;;42367:21;:::i;:::-;42399:18;42420:24;;;:15;:24;;;;;;42793:10;:26;;42342:46;;-1:-1:-1;42420:24:0;;42342:46;;42793:26;;;;-1:-1:-1;;;42793:26:0;;;;;;;;;;;;;;;;;42771:48;;42857:11;42832:10;42843;42832:22;;;;;;-1:-1:-1;;;42832:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;42937:28;;;:15;:28;;;;;;;:41;;;43109:24;;;;;43102:31;43144:10;:16;;;;;-1:-1:-1;;;43144:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;42089:1079;;;;:::o;39579:221::-;39664:14;39681:20;39698:2;39681:16;:20::i;:::-;-1:-1:-1;;;;;39712:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;39757:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;39579:221:0:o;30221:382::-;-1:-1:-1;;;;;30301:16:0;;30293:61;;;;-1:-1:-1;;;30293:61:0;;;;;;;:::i;:::-;30374:16;30382:7;30374;:16::i;:::-;30373:17;30365:58;;;;-1:-1:-1;;;30365:58:0;;;;;;;:::i;:::-;30436:45;30465:1;30469:2;30473:7;30436:20;:45::i;:::-;-1:-1:-1;;;;;30494:13:0;;;;;;:9;:13;;;;;:18;;30511:1;;30494:13;:18;;30511:1;;30494:18;:::i;:::-;;;;-1:-1:-1;;30523:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30523:21:0;-1:-1:-1;;;;;30523:21:0;;;;;;;;30562:33;;30523:16;;;30562:33;;30523:16;;30562:33;30221:382;;:::o;8292:444::-;8672:20;8720:8;;;8292:444::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:607:1;;110:18;151:2;143:6;140:14;137:2;;;157:18;;:::i;:::-;206:2;200:9;279:2;256:17;;-1:-1:-1;;252:31:1;240:44;;286:4;236:55;306:18;;;326:22;;;303:46;300:2;;;352:18;;:::i;:::-;388:2;381:22;436;;;421:6;-1:-1:-1;421:6:1;473:16;;;470:25;-1:-1:-1;467:2:1;;;508:1;505;498:12;467:2;558:6;553:3;546:4;538:6;534:17;521:44;613:1;606:4;597:6;589;585:19;581:30;574:41;;;90:531;;;;;:::o;626:175::-;696:20;;-1:-1:-1;;;;;745:31:1;;735:42;;725:2;;791:1;788;781:12;806:162;873:20;;929:13;;922:21;912:32;;902:2;;958:1;955;948:12;973:198;;1085:2;1073:9;1064:7;1060:23;1056:32;1053:2;;;1106:6;1098;1091:22;1053:2;1134:31;1155:9;1134:31;:::i;1176:274::-;;;1305:2;1293:9;1284:7;1280:23;1276:32;1273:2;;;1326:6;1318;1311:22;1273:2;1354:31;1375:9;1354:31;:::i;:::-;1344:41;;1404:40;1440:2;1429:9;1425:18;1404:40;:::i;:::-;1394:50;;1263:187;;;;;:::o;1455:342::-;;;;1601:2;1589:9;1580:7;1576:23;1572:32;1569:2;;;1622:6;1614;1607:22;1569:2;1650:31;1671:9;1650:31;:::i;:::-;1640:41;;1700:40;1736:2;1725:9;1721:18;1700:40;:::i;:::-;1690:50;;1787:2;1776:9;1772:18;1759:32;1749:42;;1559:238;;;;;:::o;1802:702::-;;;;;1974:3;1962:9;1953:7;1949:23;1945:33;1942:2;;;1996:6;1988;1981:22;1942:2;2024:31;2045:9;2024:31;:::i;:::-;2014:41;;2074:40;2110:2;2099:9;2095:18;2074:40;:::i;:::-;2064:50;;2161:2;2150:9;2146:18;2133:32;2123:42;;2216:2;2205:9;2201:18;2188:32;2243:18;2235:6;2232:30;2229:2;;;2280:6;2272;2265:22;2229:2;2308:22;;2361:4;2353:13;;2349:27;-1:-1:-1;2339:2:1;;2395:6;2387;2380:22;2339:2;2423:75;2490:7;2485:2;2472:16;2467:2;2463;2459:11;2423:75;:::i;:::-;2413:85;;;1932:572;;;;;;;:::o;2509:268::-;;;2635:2;2623:9;2614:7;2610:23;2606:32;2603:2;;;2656:6;2648;2641:22;2603:2;2684:31;2705:9;2684:31;:::i;:::-;2674:41;;2734:37;2767:2;2756:9;2752:18;2734:37;:::i;2782:266::-;;;2911:2;2899:9;2890:7;2886:23;2882:32;2879:2;;;2932:6;2924;2917:22;2879:2;2960:31;2981:9;2960:31;:::i;:::-;2950:41;3038:2;3023:18;;;;3010:32;;-1:-1:-1;;;2869:179:1:o;3053:192::-;;3162:2;3150:9;3141:7;3137:23;3133:32;3130:2;;;3183:6;3175;3168:22;3130:2;3211:28;3229:9;3211:28;:::i;3250:257::-;;3361:2;3349:9;3340:7;3336:23;3332:32;3329:2;;;3382:6;3374;3367:22;3329:2;3426:9;3413:23;3445:32;3471:5;3445:32;:::i;3512:261::-;;3634:2;3622:9;3613:7;3609:23;3605:32;3602:2;;;3655:6;3647;3640:22;3602:2;3692:9;3686:16;3711:32;3737:5;3711:32;:::i;3778:482::-;;3900:2;3888:9;3879:7;3875:23;3871:32;3868:2;;;3921:6;3913;3906:22;3868:2;3966:9;3953:23;3999:18;3991:6;3988:30;3985:2;;;4036:6;4028;4021:22;3985:2;4064:22;;4117:4;4109:13;;4105:27;-1:-1:-1;4095:2:1;;4151:6;4143;4136:22;4095:2;4179:75;4246:7;4241:2;4228:16;4223:2;4219;4215:11;4179:75;:::i;4265:190::-;;4377:2;4365:9;4356:7;4352:23;4348:32;4345:2;;;4398:6;4390;4383:22;4345:2;-1:-1:-1;4426:23:1;;4335:120;-1:-1:-1;4335:120:1:o;4460:259::-;;4541:5;4535:12;4568:6;4563:3;4556:19;4584:63;4640:6;4633:4;4628:3;4624:14;4617:4;4610:5;4606:16;4584:63;:::i;:::-;4701:2;4680:15;-1:-1:-1;;4676:29:1;4667:39;;;;4708:4;4663:50;;4511:208;-1:-1:-1;;4511:208:1:o;4724:637::-;;5042:6;5036:13;5058:53;5104:6;5099:3;5092:4;5084:6;5080:17;5058:53;:::i;:::-;5174:13;;5133:16;;;;5196:57;5174:13;5133:16;5230:4;5218:17;;5196:57;:::i;:::-;-1:-1:-1;;;5275:20:1;;5304:22;;;5353:1;5342:13;;5012:349;-1:-1:-1;;;;5012:349:1:o;5366:203::-;-1:-1:-1;;;;;5530:32:1;;;;5512:51;;5500:2;5485:18;;5467:102::o;5574:490::-;-1:-1:-1;;;;;5843:15:1;;;5825:34;;5895:15;;5890:2;5875:18;;5868:43;5942:2;5927:18;;5920:34;;;5990:3;5985:2;5970:18;;5963:31;;;5574:490;;6011:47;;6038:19;;6030:6;6011:47;:::i;:::-;6003:55;5777:287;-1:-1:-1;;;;;;5777:287:1:o;6069:187::-;6234:14;;6227:22;6209:41;;6197:2;6182:18;;6164:92::o;6261:221::-;;6410:2;6399:9;6392:21;6430:46;6472:2;6461:9;6457:18;6449:6;6430:46;:::i;6487:413::-;6689:2;6671:21;;;6728:2;6708:18;;;6701:30;6767:34;6762:2;6747:18;;6740:62;-1:-1:-1;;;6833:2:1;6818:18;;6811:47;6890:3;6875:19;;6661:239::o;6905:407::-;7107:2;7089:21;;;7146:2;7126:18;;;7119:30;7185:34;7180:2;7165:18;;7158:62;-1:-1:-1;;;7251:2:1;7236:18;;7229:41;7302:3;7287:19;;7079:233::o;7317:414::-;7519:2;7501:21;;;7558:2;7538:18;;;7531:30;7597:34;7592:2;7577:18;;7570:62;-1:-1:-1;;;7663:2:1;7648:18;;7641:48;7721:3;7706:19;;7491:240::o;7736:402::-;7938:2;7920:21;;;7977:2;7957:18;;;7950:30;8016:34;8011:2;7996:18;;7989:62;-1:-1:-1;;;8082:2:1;8067:18;;8060:36;8128:3;8113:19;;7910:228::o;8143:352::-;8345:2;8327:21;;;8384:2;8364:18;;;8357:30;8423;8418:2;8403:18;;8396:58;8486:2;8471:18;;8317:178::o;8500:400::-;8702:2;8684:21;;;8741:2;8721:18;;;8714:30;8780:34;8775:2;8760:18;;8753:62;-1:-1:-1;;;8846:2:1;8831:18;;8824:34;8890:3;8875:19;;8674:226::o;8905:349::-;9107:2;9089:21;;;9146:2;9126:18;;;9119:30;9185:27;9180:2;9165:18;;9158:55;9245:2;9230:18;;9079:175::o;9259:344::-;9461:2;9443:21;;;9500:2;9480:18;;;9473:30;-1:-1:-1;;;9534:2:1;9519:18;;9512:50;9594:2;9579:18;;9433:170::o;9608:408::-;9810:2;9792:21;;;9849:2;9829:18;;;9822:30;9888:34;9883:2;9868:18;;9861:62;-1:-1:-1;;;9954:2:1;9939:18;;9932:42;10006:3;9991:19;;9782:234::o;10021:356::-;10223:2;10205:21;;;10242:18;;;10235:30;10301:34;10296:2;10281:18;;10274:62;10368:2;10353:18;;10195:182::o;10382:420::-;10584:2;10566:21;;;10623:2;10603:18;;;10596:30;10662:34;10657:2;10642:18;;10635:62;10733:26;10728:2;10713:18;;10706:54;10792:3;10777:19;;10556:246::o;10807:406::-;11009:2;10991:21;;;11048:2;11028:18;;;11021:30;11087:34;11082:2;11067:18;;11060:62;-1:-1:-1;;;11153:2:1;11138:18;;11131:40;11203:3;11188:19;;10981:232::o;11218:405::-;11420:2;11402:21;;;11459:2;11439:18;;;11432:30;11498:34;11493:2;11478:18;;11471:62;-1:-1:-1;;;11564:2:1;11549:18;;11542:39;11613:3;11598:19;;11392:231::o;11628:356::-;11830:2;11812:21;;;11849:18;;;11842:30;11908:34;11903:2;11888:18;;11881:62;11975:2;11960:18;;11802:182::o;11989:408::-;12191:2;12173:21;;;12230:2;12210:18;;;12203:30;12269:34;12264:2;12249:18;;12242:62;-1:-1:-1;;;12335:2:1;12320:18;;12313:42;12387:3;12372:19;;12163:234::o;12402:356::-;12604:2;12586:21;;;12623:18;;;12616:30;12682:34;12677:2;12662:18;;12655:62;12749:2;12734:18;;12576:182::o;12763:345::-;12965:2;12947:21;;;13004:2;12984:18;;;12977:30;-1:-1:-1;;;13038:2:1;13023:18;;13016:51;13099:2;13084:18;;12937:171::o;13113:405::-;13315:2;13297:21;;;13354:2;13334:18;;;13327:30;13393:34;13388:2;13373:18;;13366:62;-1:-1:-1;;;13459:2:1;13444:18;;13437:39;13508:3;13493:19;;13287:231::o;13523:344::-;13725:2;13707:21;;;13764:2;13744:18;;;13737:30;-1:-1:-1;;;13798:2:1;13783:18;;13776:50;13858:2;13843:18;;13697:170::o;13872:399::-;14074:2;14056:21;;;14113:2;14093:18;;;14086:30;14152:34;14147:2;14132:18;;14125:62;-1:-1:-1;;;14218:2:1;14203:18;;14196:33;14261:3;14246:19;;14046:225::o;14276:397::-;14478:2;14460:21;;;14517:2;14497:18;;;14490:30;14556:34;14551:2;14536:18;;14529:62;-1:-1:-1;;;14622:2:1;14607:18;;14600:31;14663:3;14648:19;;14450:223::o;14678:413::-;14880:2;14862:21;;;14919:2;14899:18;;;14892:30;14958:34;14953:2;14938:18;;14931:62;-1:-1:-1;;;15024:2:1;15009:18;;15002:47;15081:3;15066:19;;14852:239::o;15096:408::-;15298:2;15280:21;;;15337:2;15317:18;;;15310:30;15376:34;15371:2;15356:18;;15349:62;-1:-1:-1;;;15442:2:1;15427:18;;15420:42;15494:3;15479:19;;15270:234::o;15509:177::-;15655:25;;;15643:2;15628:18;;15610:76::o;15691:128::-;;15762:1;15758:6;15755:1;15752:13;15749:2;;;15768:18;;:::i;:::-;-1:-1:-1;15804:9:1;;15739:80::o;15824:120::-;;15890:1;15880:2;;15895:18;;:::i;:::-;-1:-1:-1;15929:9:1;;15870:74::o;15949:125::-;;16017:1;16014;16011:8;16008:2;;;16022:18;;:::i;:::-;-1:-1:-1;16059:9:1;;15998:76::o;16079:258::-;16151:1;16161:113;16175:6;16172:1;16169:13;16161:113;;;16251:11;;;16245:18;16232:11;;;16225:39;16197:2;16190:10;16161:113;;;16292:6;16289:1;16286:13;16283:2;;;-1:-1:-1;;16327:1:1;16309:16;;16302:27;16132:205::o;16342:380::-;16427:1;16417:12;;16474:1;16464:12;;;16485:2;;16539:4;16531:6;16527:17;16517:27;;16485:2;16592;16584:6;16581:14;16561:18;16558:38;16555:2;;;16638:10;16633:3;16629:20;16626:1;16619:31;16673:4;16670:1;16663:15;16701:4;16698:1;16691:15;16555:2;;16397:325;;;:::o;16727:135::-;;-1:-1:-1;;16787:17:1;;16784:2;;;16807:18;;:::i;:::-;-1:-1:-1;16854:1:1;16843:13;;16774:88::o;16867:112::-;;16925:1;16915:2;;16930:18;;:::i;:::-;-1:-1:-1;16964:9:1;;16905:74::o;16984:127::-;17045:10;17040:3;17036:20;17033:1;17026:31;17076:4;17073:1;17066:15;17100:4;17097:1;17090:15;17116:127;17177:10;17172:3;17168:20;17165:1;17158:31;17208:4;17205:1;17198:15;17232:4;17229:1;17222:15;17248:127;17309:10;17304:3;17300:20;17297:1;17290:31;17340:4;17337:1;17330:15;17364:4;17361:1;17354:15;17380:133;-1:-1:-1;;;;;;17456:32:1;;17446:43;;17436:2;;17503:1;17500;17493:12;17436:2;17426:87;:::o

Swarm Source

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