ETH Price: $2,630.93 (-1.49%)

Token

Okay Beers (OKB)
 

Overview

Max Total Supply

1,014 OKB

Holders

81

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
anfromvietnam.eth
Balance
20 OKB
0xbbe3746ecb684b4cbf374fc2cba3849269d04709
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:
okaybeers

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

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

// SPDX-License-Identifier: MIT

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 GSN 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 payable) {
        return payable(msg.sender);
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}


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


    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: @openzeppelin/contracts/utils/Strings.sol

pragma solidity ^0.8.0;

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

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

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    //using EnumerableSet for EnumerableSet.UintSet;
    //using EnumerableMap for EnumerableMap.UintToAddressMap;
    using Strings for uint256;

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    // Mapping from holder address to their (enumerable) set of owned tokens
    //mapping (address => EnumerableSet.UintSet) private _holderTokens;

    // Enumerable mapping from token ids to their owners
    //EnumerableMap.UintToAddressMap private _tokenOwners;

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

    mapping (address => uint256) private tokenBalance;
    mapping (uint256 => address) private tokenOwner;
    mapping (uint256 => bool) private tokenExists;
    mapping (uint256 => bool) private winnerToken;
    mapping (address => uint8) public winner;
    mapping (address => uint8) public mintedQty;
    uint8 public winnersCount = 0;

    uint256 public tokensMinted = 0;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    uint256 public MAX_OKB;

    // Optional mapping for token URIs
    //mapping (uint256 => string) private _tokenURIs;

    // Base URI
    string private _baseURI = "QmXRSD2KL2bNnUEzbJBNGH2k61NRLgToxD3Jqi9mb3oyeg";

    /*
     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
     *
     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
     *        0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    /*
     *     bytes4(keccak256('name()')) == 0x06fdde03
     *     bytes4(keccak256('symbol()')) == 0x95d89b41
     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
     *
     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
     */
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    /*
     *     bytes4(keccak256('totalSupply()')) == 0x18160ddd
     *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59
     *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7
     *
     *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63
     */
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

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

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }

    /**
     * @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 _holderTokens[owner].length();
        return tokenBalance[owner];
    }

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

    /**
     * @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 _tokenURI = _tokenURIs[tokenId];
        string memory base = baseURI();

        // If there is no base URI, return the token URI.
        /*if (bytes(base).length == 0) {
            return _tokenURI;
        }*/
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        /*if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }*/
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked("ipfs://", base, "/", tokenId.toString()));
    }

    /**
    * @dev Returns the base URI set via {_setBaseURI}. This will be
    * automatically added as a prefix in {tokenURI} to each token's URI, or
    * to the token ID if no specific URI is set for that token ID.
    */
    function baseURI() public view virtual returns (string memory) {
        return _baseURI;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    /*function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        return _holderTokens[owner].at(index);
    }*/

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual returns (uint256) {
        // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds
        //return _tokenOwners.length();
        //return tokenBalance[];
        return tokensMinted;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    /*function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        (uint256 tokenId, ) = _tokenOwners.at(index);
        return tokenId;
    }*/

    /**
     * @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 || ERC721.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 _tokenOwners.contains(tokenId);
        return tokenExists[tokenId];
    }

    /**
     * @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 || ERC721.isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     d*
     * - `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 random() private view returns (uint) {
        uint randomHash = uint(keccak256(abi.encodePacked(block.difficulty, block.timestamp)));
        return randomHash % 1000;
    }

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

        tokenOwner[tokenId] = to;
        tokenExists[tokenId] = true;

        tokenBalance[to] = tokenBalance[to] + 1;
        tokensMinted = tokensMinted + 1;
        
        if (totalSupply() < (MAX_OKB - (MAX_OKB / 10)) && winnersCount == 15) {
            winnerToken[tokenId] = false;
        } else {
            if (totalSupply() < (MAX_OKB - (MAX_OKB / 2)) && winnersCount == 10) {
                winnerToken[tokenId] = false;
            } else {
                uint randNum = random();
                if (randNum < 100) {
                    if (winnersCount < 20) {
                        winnersCount = winnersCount + 1;
                        winnerToken[tokenId] = true;
                        winner[to] = winner[to] + 1;
                    } else {
                        winnerToken[tokenId] = false;
                    }
                } else {
                    winnerToken[tokenId] = false;
                }
            }
        }

        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.
     */

    /**
     * @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"); // internal owner
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        tokenBalance[from]--;
        tokenOwner[tokenId] = to;
        tokenBalance[to]++;

        if (winnerToken[tokenId]) {
            winner[from]--;
            winner[to]++;
        }

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    /*function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }*/

    /**
     * @dev Internal function to set the base URI for all token IDs. It is
     * automatically added as a prefix to the value returned in {tokenURI},
     * or to the token ID if {tokenURI} is empty.
     */
    function _setBaseURI(string memory baseURI_) internal virtual {
        _baseURI = baseURI_;
    }

    /**
     * @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()) {
            return true;
        }
        bytes memory returndata = to.functionCall(abi.encodeWithSelector(
            IERC721Receiver(to).onERC721Received.selector,
            _msgSender(),
            from,
            tokenId,
            _data
        ), "ERC721: transfer to non ERC721Receiver implementer");
        bytes4 retval = abi.decode(returndata, (bytes4));
        return (retval == _ERC721_RECEIVED);
    }

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

    /**
     * @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: @openzeppelin/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;

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

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



pragma solidity ^0.8.0;

/*
 * @title OKBottie contract
 */
contract okaybeers is Ownable, ERC721 {

    uint256 public OKBPrice = 20000000000000000; //0.02 ETH

    
    uint256 public constant maxOKBPurchase = 30;

    uint256 public constant preMaxPerWallet = 60;
    uint256 public constant freeMintQty = 1000;
    
    
    /*
    uint256 public constant maxOKBPurchase = 10;

    uint256 public constant preMaxPerWallet = 10;
    uint256 public constant freeMintQty = 15;
    */


    uint256 public mintContrib = 0;
    
    mapping (address => bool) public withdrawn;

    bool public saleIsActive = false;

    uint256 public ownerWithdrawals = 0;

    uint256 public deposited = 0;

    constructor(string memory name, string memory symbol, uint256 maxNftSupply) ERC721(name, symbol) {
        MAX_OKB = maxNftSupply;
    }

    function withdrawWinnings() public {
        require(winner[msg.sender] > 0, "No winning tokens");
        require(totalSupply() >= MAX_OKB, "Minting not done");
        require(!withdrawn[msg.sender], "Already withdrawn");

        withdrawn[msg.sender] = true;
        uint256 winnersWallet = (mintContrib * 30) / 100;
        uint256 winnings = (winner[msg.sender] * winnersWallet) / winnersCount;
        payable(msg.sender).transfer(winnings);
    }

    function withdraw(uint256 amount) public onlyOwner {
        require(amount <= (((mintContrib * 70) / 100) - ownerWithdrawals), "Cannot withdraw more than 70%");
        ownerWithdrawals = ownerWithdrawals + amount;
        payable(msg.sender).transfer(amount);
    }

    function emergencyWithdraw(uint256 amount) public onlyOwner {
        payable(msg.sender).transfer(amount);
    }

    function emergencyDeposit() public payable {
        require(msg.value > 0, "must deposit some eth");
        deposited = deposited + msg.value;
    }

    function updateMintPrice(uint256 newPrice) public onlyOwner {
        OKBPrice = newPrice;
    }

    function setBaseURI(string memory baseURI) public onlyOwner {
        _setBaseURI(baseURI);
    }

    /*
    * Pause sale if active, make active if paused
    */
    function flipState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    /**
    * Mints OKB
    */
    function mintOKB(uint8 numberOfTokens) public payable {
        uint256 supply = totalSupply();
        require(numberOfTokens <= maxOKBPurchase, "E11");
        require((supply + numberOfTokens) <= MAX_OKB, "E12");
        require(saleIsActive, "E10");

        if (supply >= freeMintQty) {
            require((OKBPrice * numberOfTokens) <= msg.value, "E15");
        } else {
            require((mintedQty[msg.sender] + numberOfTokens) <= preMaxPerWallet, "max per wallet reached for premint");
            if (numberOfTokens <= (freeMintQty - supply)) {
                mintContrib = mintContrib + (OKBPrice * numberOfTokens);
            } else {
                require(((numberOfTokens - (freeMintQty - supply)) * OKBPrice) <= msg.value, "E15");
                mintContrib = mintContrib + ((numberOfTokens - (freeMintQty - supply)) * OKBPrice);
            }
        }

        mintedQty[msg.sender] = mintedQty[msg.sender] + numberOfTokens;

        for(uint256 i = 1; i <= numberOfTokens; i++) {
            if (supply < MAX_OKB) {
                _safeMint(msg.sender, supply + i);
            }
        }
    }



}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"maxNftSupply","type":"uint256"}],"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_OKB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OKBPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyDeposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMintQty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxOKBPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintContrib","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"numberOfTokens","type":"uint8"}],"name":"mintOKB","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedQty","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerWithdrawals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preMaxPerWallet","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":"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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"newPrice","type":"uint256"}],"name":"updateMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"winner","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"winnersCount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawWinnings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"withdrawn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

600a805460ff191690556000600b5560e0604052602e60808181529062002b0060a03980516200003891600f91602090910190620001c9565b5066470de4df820000601055600060118190556013805460ff1916905560148190556015553480156200006a57600080fd5b5060405162002b2e38038062002b2e8339810160408190526200008d916200031a565b828260006200009b62000167565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620000f76301ffc9a760e01b6200016b565b81516200010c90600c906020850190620001c9565b5080516200012290600d906020840190620001c9565b50620001356380ac58cd60e01b6200016b565b62000147635b5e139f60e01b6200016b565b6200015963780e9d6360e01b6200016b565b5050600e5550620004149050565b3390565b6001600160e01b03198082161415620001a15760405162461bcd60e51b815260040162000198906200038a565b60405180910390fd5b6001600160e01b0319166000908152600160208190526040909120805460ff19169091179055565b828054620001d790620003c1565b90600052602060002090601f016020900481019282620001fb576000855562000246565b82601f106200021657805160ff191683800117855562000246565b8280016001018555821562000246579182015b828111156200024657825182559160200191906001019062000229565b506200025492915062000258565b5090565b5b8082111562000254576000815560010162000259565b600082601f83011262000280578081fd5b81516001600160401b03808211156200029d576200029d620003fe565b6040516020601f8401601f1916820181018381118382101715620002c557620002c5620003fe565b6040528382528584018101871015620002dc578485fd5b8492505b83831015620002ff5785830181015182840182015291820191620002e0565b838311156200031057848185840101525b5095945050505050565b6000806000606084860312156200032f578283fd5b83516001600160401b038082111562000346578485fd5b62000354878388016200026f565b945060208601519150808211156200036a578384fd5b5062000379868287016200026f565b925050604084015190509250925092565b6020808252601c908201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604082015260600190565b600281046001821680620003d657607f821691505b60208210811415620003f857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6126dc80620004246000396000f3fe6080604052600436106102245760003560e01c806370a0823111610123578063b88d4fde116100ab578063e985e9c51161006f578063e985e9c5146105d8578063eb27bf81146105f8578063eb8d24441461060d578063eef49ee314610622578063f240ca561461063757610224565b8063b88d4fde1461055b578063c87b56dd1461057b578063cc42e83a1461059b578063cfb15ef0146105b0578063d885a21e146105d057610224565b806388256beb116100f257806388256beb146104e75780638da5cb5b146104fc5780638e9203511461051157806395d89b4114610526578063a22cb4651461053b57610224565b806370a0823114610488578063807f54f6146104a857806384c99fc2146104bd578063861d47b4146104d257610224565b80632e1a7d4d116101b157806355f804b31161017557806355f804b3146103fe5780636352211e1461041e5780636c0360eb1461043e5780636de9f32b146104535780636ef610921461046857610224565b80632e1a7d4d1461037457806342842e0e1461039457806349713811146103b45780634a2eeebb146103c95780635312ea8e146103de57610224565b8063081812fc116101f8578063081812fc146102c5578063095ea7b3146102f257806318160ddd1461031257806323b872dd146103275780632ad957861461034757610224565b8062728e461461022957806301ffc9a71461024b578063027969961461028157806306fdde03146102a3575b600080fd5b34801561023557600080fd5b50610249610244366004611d0e565b61064a565b005b34801561025757600080fd5b5061026b610266366004611c90565b610697565b6040516102789190611e3d565b60405180910390f35b34801561028d57600080fd5b506102966106ba565b6040516102789190612494565b3480156102af57600080fd5b506102b86106c0565b6040516102789190611e48565b3480156102d157600080fd5b506102e56102e0366004611d0e565b610752565b6040516102789190611dec565b3480156102fe57600080fd5b5061024961030d366004611c67565b610795565b34801561031e57600080fd5b5061029661082d565b34801561033357600080fd5b50610249610342366004611b79565b610833565b34801561035357600080fd5b50610367610362366004611b2d565b61086b565b604051610278919061249d565b34801561038057600080fd5b5061024961038f366004611d0e565b610880565b3480156103a057600080fd5b506102496103af366004611b79565b610948565b3480156103c057600080fd5b50610367610963565b3480156103d557600080fd5b5061029661096c565b3480156103ea57600080fd5b506102496103f9366004611d0e565b610972565b34801561040a57600080fd5b50610249610419366004611cc8565b6109de565b34801561042a57600080fd5b506102e5610439366004611d0e565b610a29565b34801561044a57600080fd5b506102b8610a66565b34801561045f57600080fd5b50610296610a75565b34801561047457600080fd5b5061026b610483366004611b2d565b610a7b565b34801561049457600080fd5b506102966104a3366004611b2d565b610a90565b3480156104b457600080fd5b50610296610ad4565b3480156104c957600080fd5b50610296610ada565b3480156104de57600080fd5b50610296610adf565b3480156104f357600080fd5b50610296610ae4565b34801561050857600080fd5b506102e5610aea565b34801561051d57600080fd5b50610249610af9565b34801561053257600080fd5b506102b8610b4c565b34801561054757600080fd5b50610249610556366004611c2d565b610b5b565b34801561056757600080fd5b50610249610576366004611bb4565b610c29565b34801561058757600080fd5b506102b8610596366004611d0e565b610c68565b3480156105a757600080fd5b50610249610ccd565b3480156105bc57600080fd5b506103676105cb366004611b2d565b610ded565b610249610e02565b3480156105e457600080fd5b5061026b6105f3366004611b47565b610e35565b34801561060457600080fd5b50610296610e63565b34801561061957600080fd5b5061026b610e69565b34801561062e57600080fd5b50610296610e72565b610249610645366004611d26565b610e78565b6106526110ab565b6001600160a01b0316610663610aea565b6001600160a01b0316146106925760405162461bcd60e51b81526004016106899061226f565b60405180910390fd5b601055565b6001600160e01b0319811660009081526001602052604090205460ff165b919050565b600e5481565b6060600c80546106cf90612592565b80601f01602080910402602001604051908101604052809291908181526020018280546106fb90612592565b80156107485780601f1061071d57610100808354040283529160200191610748565b820191906000526020600020905b81548152906001019060200180831161072b57829003601f168201915b5050505050905090565b600061075d826110af565b6107795760405162461bcd60e51b815260040161068990612223565b506000908152600260205260409020546001600160a01b031690565b60006107a082610a29565b9050806001600160a01b0316836001600160a01b031614156107d45760405162461bcd60e51b815260040161068990612383565b806001600160a01b03166107e66110ab565b6001600160a01b031614806108025750610802816105f36110ab565b61081e5760405162461bcd60e51b8152600401610689906120aa565b61082883836110c4565b505050565b600b5490565b61084461083e6110ab565b82611132565b6108605760405162461bcd60e51b8152600401610689906123c4565b6108288383836111b7565b60086020526000908152604090205460ff1681565b6108886110ab565b6001600160a01b0316610899610aea565b6001600160a01b0316146108bf5760405162461bcd60e51b81526004016106899061226f565b601454606460115460466108d391906124fc565b6108dd91906124e8565b6108e7919061251b565b8111156109065760405162461bcd60e51b81526004016106899061219a565b8060145461091491906124ab565b601455604051339082156108fc029083906000818181858888f19350505050158015610944573d6000803e3d6000fd5b5050565b61082883838360405180602001604052806000815250610c29565b600a5460ff1681565b60145481565b61097a6110ab565b6001600160a01b031661098b610aea565b6001600160a01b0316146109b15760405162461bcd60e51b81526004016106899061226f565b604051339082156108fc029083906000818181858888f19350505050158015610944573d6000803e3d6000fd5b6109e66110ab565b6001600160a01b03166109f7610aea565b6001600160a01b031614610a1d5760405162461bcd60e51b81526004016106899061226f565b610a268161137c565b50565b6000808211610a4a5760405162461bcd60e51b815260040161068990612151565b506000908152600560205260409020546001600160a01b031690565b6060600f80546106cf90612592565b600b5481565b60126020526000908152604090205460ff1681565b60006001600160a01b038216610ab85760405162461bcd60e51b815260040161068990612107565b506001600160a01b031660009081526004602052604090205490565b60115481565b601e81565b603c81565b60105481565b6000546001600160a01b031690565b610b016110ab565b6001600160a01b0316610b12610aea565b6001600160a01b031614610b385760405162461bcd60e51b81526004016106899061226f565b6013805460ff19811660ff90911615179055565b6060600d80546106cf90612592565b610b636110ab565b6001600160a01b0316826001600160a01b03161415610b945760405162461bcd60e51b815260040161068990611f57565b8060036000610ba16110ab565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610be56110ab565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610c1d9190611e3d565b60405180910390a35050565b610c3a610c346110ab565b83611132565b610c565760405162461bcd60e51b8152600401610689906123c4565b610c628484848461138f565b50505050565b6060610c73826110af565b610c8f5760405162461bcd60e51b8152600401610689906122ed565b6000610c99610a66565b905080610ca5846113c2565b604051602001610cb6929190611d8f565b604051602081830303815290604052915050919050565b3360009081526008602052604090205460ff16610cfc5760405162461bcd60e51b81526004016106899061244c565b600e54610d0761082d565b1015610d255760405162461bcd60e51b81526004016106899061233c565b3360009081526012602052604090205460ff1615610d555760405162461bcd60e51b815260040161068990612062565b336000908152601260205260408120805460ff19166001179055601154606490610d8090601e6124fc565b610d8a91906124e8565b600a54336000908152600860205260408120549293509160ff91821691610db3918591166124fc565b610dbd91906124e8565b604051909150339082156108fc029083906000818181858888f19350505050158015610828573d6000803e3d6000fd5b60096020526000908152604090205460ff1681565b60003411610e225760405162461bcd60e51b815260040161068990611ead565b34601554610e3091906124ab565b601555565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205460ff1690565b6103e881565b60135460ff1681565b60155481565b6000610e8261082d565b9050601e8260ff161115610ea85760405162461bcd60e51b815260040161068990612206565b600e54610eb860ff8416836124ab565b1115610ed65760405162461bcd60e51b815260040161068990612477565b60135460ff16610ef85760405162461bcd60e51b81526004016106899061208d565b6103e88110610f3657348260ff16601054610f1391906124fc565b1115610f315760405162461bcd60e51b815260040161068990612366565b611030565b33600090815260096020526040902054603c90610f5790849060ff166124c3565b60ff161115610f785760405162461bcd60e51b815260040161068990612020565b610f84816103e861251b565b8260ff1611610fb3578160ff16601054610f9e91906124fc565b601154610fab91906124ab565b601155611030565b6010543490610fc4836103e861251b565b610fd19060ff861661251b565b610fdb91906124fc565b1115610ff95760405162461bcd60e51b815260040161068990612366565b601054611008826103e861251b565b6110159060ff851661251b565b61101f91906124fc565b60115461102c91906124ab565b6011555b3360009081526009602052604090205461104e90839060ff166124c3565b336000908152600960205260409020805460ff191660ff9290921691909117905560015b8260ff16811161082857600e54821015611099576110993361109483856124ab565b6114dd565b806110a3816125cd565b915050611072565b3390565b60009081526006602052604090205460ff1690565b600081815260026020526040902080546001600160a01b0319166001600160a01b03841690811790915581906110f982610a29565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061113d826110af565b6111595760405162461bcd60e51b815260040161068990611fd4565b600061116483610a29565b9050806001600160a01b0316846001600160a01b0316148061119f5750836001600160a01b031661119484610752565b6001600160a01b0316145b806111af57506111af8185610e35565b949350505050565b826001600160a01b03166111ca82610a29565b6001600160a01b0316146111f05760405162461bcd60e51b8152600401610689906122a4565b6001600160a01b0382166112165760405162461bcd60e51b815260040161068990611f13565b611221838383610828565b61122c6000826110c4565b6001600160a01b03831660009081526004602052604081208054916112508361255e565b9091555050600081815260056020908152604080832080546001600160a01b0319166001600160a01b038716908117909155835260049091528120805491611297836125cd565b909155505060008181526007602052604090205460ff1615611336576001600160a01b0383166000908152600860205260408120805460ff16916112da83612575565b82546101009290920a60ff8181021990931691831602179091556001600160a01b03841660009081526008602052604081208054909216925061131c836125e8565b91906101000a81548160ff021916908360ff160217905550505b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b805161094490600f906020840190611a0d565b61139a8484846111b7565b6113a6848484846114f7565b610c625760405162461bcd60e51b815260040161068990611e5b565b6060816113e757506040805180820190915260018152600360fc1b60208201526106b5565b8160005b811561141157806113fb816125cd565b915061140a9050600a836124e8565b91506113eb565b60008167ffffffffffffffff81111561143a57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611464576020820181803683370190505b5090505b84156111af5761147960018361251b565b9150611486600a86612608565b6114919060306124ab565b60f81b8183815181106114b457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506114d6600a866124e8565b9450611468565b6109448282604051806020016040528060008152506115d6565b600061150b846001600160a01b0316611609565b611517575060016111af565b600061159f630a85bd0160e11b61152c6110ab565b8887876040516024016115429493929190611e00565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001612675603291396001600160a01b038816919061160f565b90506000818060200190518101906115b79190611cac565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b6115e08383611628565b6115ed60008484846114f7565b6108285760405162461bcd60e51b815260040161068990611e5b565b3b151590565b606061161e84846000856118d2565b90505b9392505050565b6001600160a01b03821661164e5760405162461bcd60e51b8152600401610689906121d1565b611657816110af565b156116745760405162461bcd60e51b815260040161068990611edc565b61168060008383610828565b600081815260056020908152604080832080546001600160a01b0319166001600160a01b03871690811790915560068352818420805460ff191660019081179091559084526004909252909120546116d7916124ab565b6001600160a01b038316600090815260046020526040902055600b546116fe9060016124ab565b600b55600e5461171090600a906124e8565b600e5461171d919061251b565b61172561082d565b1080156117375750600a5460ff16600f145b15611757576000818152600760205260409020805460ff19169055611896565b6002600e5461176691906124e8565b600e54611773919061251b565b61177b61082d565b10801561178c5750600a805460ff16145b156117ac576000818152600760205260409020805460ff19169055611896565b60006117b6611992565b9050606481101561187d57600a54601460ff909116101561186157600a546117e29060ff1660016124c3565b600a805460ff92831660ff19918216179091556000848152600760209081526040808320805490941660019081179094556001600160a01b038816835260089091529020546118329216906124c3565b6001600160a01b0384166000908152600860205260409020805460ff191660ff92909216919091179055611878565b6000828152600760205260409020805460ff191690555b611894565b6000828152600760205260409020805460ff191690555b505b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060824710156118f45760405162461bcd60e51b815260040161068990611f8e565b6118fd85611609565b6119195760405162461bcd60e51b815260040161068990612415565b600080866001600160a01b031685876040516119359190611d73565b60006040518083038185875af1925050503d8060008114611972576040519150601f19603f3d011682016040523d82523d6000602084013e611977565b606091505b50915091506119878282866119d4565b979650505050505050565b60008044426040516020016119a8929190611dde565b60408051601f19818403018152919052805160209091012090506119ce6103e882612608565b91505090565b606083156119e3575081611621565b8251156119f35782518084602001fd5b8160405162461bcd60e51b81526004016106899190611e48565b828054611a1990612592565b90600052602060002090601f016020900481019282611a3b5760008555611a81565b82601f10611a5457805160ff1916838001178555611a81565b82800160010185558215611a81579182015b82811115611a81578251825591602001919060010190611a66565b50611a8d929150611a91565b5090565b5b80821115611a8d5760008155600101611a92565b600067ffffffffffffffff80841115611ac157611ac1612648565b604051601f8501601f191681016020018281118282101715611ae557611ae5612648565b604052848152915081838501861015611afd57600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b03811681146106b557600080fd5b600060208284031215611b3e578081fd5b61162182611b16565b60008060408385031215611b59578081fd5b611b6283611b16565b9150611b7060208401611b16565b90509250929050565b600080600060608486031215611b8d578081fd5b611b9684611b16565b9250611ba460208501611b16565b9150604084013590509250925092565b60008060008060808587031215611bc9578081fd5b611bd285611b16565b9350611be060208601611b16565b925060408501359150606085013567ffffffffffffffff811115611c02578182fd5b8501601f81018713611c12578182fd5b611c2187823560208401611aa6565b91505092959194509250565b60008060408385031215611c3f578182fd5b611c4883611b16565b915060208301358015158114611c5c578182fd5b809150509250929050565b60008060408385031215611c79578182fd5b611c8283611b16565b946020939093013593505050565b600060208284031215611ca1578081fd5b81356116218161265e565b600060208284031215611cbd578081fd5b81516116218161265e565b600060208284031215611cd9578081fd5b813567ffffffffffffffff811115611cef578182fd5b8201601f81018413611cff578182fd5b6111af84823560208401611aa6565b600060208284031215611d1f578081fd5b5035919050565b600060208284031215611d37578081fd5b813560ff81168114611621578182fd5b60008151808452611d5f816020860160208601612532565b601f01601f19169290920160200192915050565b60008251611d85818460208701612532565b9190910192915050565b600066697066733a2f2f60c81b82528351611db1816007850160208801612532565b602f60f81b6007918401918201528351611dd2816008840160208801612532565b01600801949350505050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611e3390830184611d47565b9695505050505050565b901515815260200190565b6000602082526116216020830184611d47565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601590820152740daeae6e840c8cae0dee6d2e840e6dedaca40cae8d605b1b604082015260600190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526022908201527f6d6178207065722077616c6c6574207265616368656420666f72207072656d696040820152611b9d60f21b606082015260800190565b60208082526011908201527020b63932b0b23c903bb4ba34323930bbb760791b604082015260600190565b60208082526003908201526204531360ec1b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252601d908201527f43616e6e6f74207769746864726177206d6f7265207468616e20373025000000604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526003908201526245313160e81b604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526010908201526f4d696e74696e67206e6f7420646f6e6560801b604082015260600190565b60208082526003908201526245313560e81b604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252601190820152704e6f2077696e6e696e6720746f6b656e7360781b604082015260600190565b60208082526003908201526222989960e91b604082015260600190565b90815260200190565b60ff91909116815260200190565b600082198211156124be576124be61261c565b500190565b600060ff821660ff84168060ff038211156124e0576124e061261c565b019392505050565b6000826124f7576124f7612632565b500490565b60008160001904831182151516156125165761251661261c565b500290565b60008282101561252d5761252d61261c565b500390565b60005b8381101561254d578181015183820152602001612535565b83811115610c625750506000910152565b60008161256d5761256d61261c565b506000190190565b600060ff8216806125885761258861261c565b6000190192915050565b6002810460018216806125a657607f821691505b602082108114156125c757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156125e1576125e161261c565b5060010190565b600060ff821660ff8114156125ff576125ff61261c565b60010192915050565b60008261261757612617612632565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610a2657600080fdfe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e746572a26469706673582212205594f92230937d4fbe47af574701c3a0cba2ce838c33e64ab2249fc85e426f5964736f6c63430008000033516d58525344324b4c32624e6e55457a624a424e4748326b36314e524c67546f7844334a7169396d62336f796567000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000000a4f6b61792042656572730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034f4b420000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102245760003560e01c806370a0823111610123578063b88d4fde116100ab578063e985e9c51161006f578063e985e9c5146105d8578063eb27bf81146105f8578063eb8d24441461060d578063eef49ee314610622578063f240ca561461063757610224565b8063b88d4fde1461055b578063c87b56dd1461057b578063cc42e83a1461059b578063cfb15ef0146105b0578063d885a21e146105d057610224565b806388256beb116100f257806388256beb146104e75780638da5cb5b146104fc5780638e9203511461051157806395d89b4114610526578063a22cb4651461053b57610224565b806370a0823114610488578063807f54f6146104a857806384c99fc2146104bd578063861d47b4146104d257610224565b80632e1a7d4d116101b157806355f804b31161017557806355f804b3146103fe5780636352211e1461041e5780636c0360eb1461043e5780636de9f32b146104535780636ef610921461046857610224565b80632e1a7d4d1461037457806342842e0e1461039457806349713811146103b45780634a2eeebb146103c95780635312ea8e146103de57610224565b8063081812fc116101f8578063081812fc146102c5578063095ea7b3146102f257806318160ddd1461031257806323b872dd146103275780632ad957861461034757610224565b8062728e461461022957806301ffc9a71461024b578063027969961461028157806306fdde03146102a3575b600080fd5b34801561023557600080fd5b50610249610244366004611d0e565b61064a565b005b34801561025757600080fd5b5061026b610266366004611c90565b610697565b6040516102789190611e3d565b60405180910390f35b34801561028d57600080fd5b506102966106ba565b6040516102789190612494565b3480156102af57600080fd5b506102b86106c0565b6040516102789190611e48565b3480156102d157600080fd5b506102e56102e0366004611d0e565b610752565b6040516102789190611dec565b3480156102fe57600080fd5b5061024961030d366004611c67565b610795565b34801561031e57600080fd5b5061029661082d565b34801561033357600080fd5b50610249610342366004611b79565b610833565b34801561035357600080fd5b50610367610362366004611b2d565b61086b565b604051610278919061249d565b34801561038057600080fd5b5061024961038f366004611d0e565b610880565b3480156103a057600080fd5b506102496103af366004611b79565b610948565b3480156103c057600080fd5b50610367610963565b3480156103d557600080fd5b5061029661096c565b3480156103ea57600080fd5b506102496103f9366004611d0e565b610972565b34801561040a57600080fd5b50610249610419366004611cc8565b6109de565b34801561042a57600080fd5b506102e5610439366004611d0e565b610a29565b34801561044a57600080fd5b506102b8610a66565b34801561045f57600080fd5b50610296610a75565b34801561047457600080fd5b5061026b610483366004611b2d565b610a7b565b34801561049457600080fd5b506102966104a3366004611b2d565b610a90565b3480156104b457600080fd5b50610296610ad4565b3480156104c957600080fd5b50610296610ada565b3480156104de57600080fd5b50610296610adf565b3480156104f357600080fd5b50610296610ae4565b34801561050857600080fd5b506102e5610aea565b34801561051d57600080fd5b50610249610af9565b34801561053257600080fd5b506102b8610b4c565b34801561054757600080fd5b50610249610556366004611c2d565b610b5b565b34801561056757600080fd5b50610249610576366004611bb4565b610c29565b34801561058757600080fd5b506102b8610596366004611d0e565b610c68565b3480156105a757600080fd5b50610249610ccd565b3480156105bc57600080fd5b506103676105cb366004611b2d565b610ded565b610249610e02565b3480156105e457600080fd5b5061026b6105f3366004611b47565b610e35565b34801561060457600080fd5b50610296610e63565b34801561061957600080fd5b5061026b610e69565b34801561062e57600080fd5b50610296610e72565b610249610645366004611d26565b610e78565b6106526110ab565b6001600160a01b0316610663610aea565b6001600160a01b0316146106925760405162461bcd60e51b81526004016106899061226f565b60405180910390fd5b601055565b6001600160e01b0319811660009081526001602052604090205460ff165b919050565b600e5481565b6060600c80546106cf90612592565b80601f01602080910402602001604051908101604052809291908181526020018280546106fb90612592565b80156107485780601f1061071d57610100808354040283529160200191610748565b820191906000526020600020905b81548152906001019060200180831161072b57829003601f168201915b5050505050905090565b600061075d826110af565b6107795760405162461bcd60e51b815260040161068990612223565b506000908152600260205260409020546001600160a01b031690565b60006107a082610a29565b9050806001600160a01b0316836001600160a01b031614156107d45760405162461bcd60e51b815260040161068990612383565b806001600160a01b03166107e66110ab565b6001600160a01b031614806108025750610802816105f36110ab565b61081e5760405162461bcd60e51b8152600401610689906120aa565b61082883836110c4565b505050565b600b5490565b61084461083e6110ab565b82611132565b6108605760405162461bcd60e51b8152600401610689906123c4565b6108288383836111b7565b60086020526000908152604090205460ff1681565b6108886110ab565b6001600160a01b0316610899610aea565b6001600160a01b0316146108bf5760405162461bcd60e51b81526004016106899061226f565b601454606460115460466108d391906124fc565b6108dd91906124e8565b6108e7919061251b565b8111156109065760405162461bcd60e51b81526004016106899061219a565b8060145461091491906124ab565b601455604051339082156108fc029083906000818181858888f19350505050158015610944573d6000803e3d6000fd5b5050565b61082883838360405180602001604052806000815250610c29565b600a5460ff1681565b60145481565b61097a6110ab565b6001600160a01b031661098b610aea565b6001600160a01b0316146109b15760405162461bcd60e51b81526004016106899061226f565b604051339082156108fc029083906000818181858888f19350505050158015610944573d6000803e3d6000fd5b6109e66110ab565b6001600160a01b03166109f7610aea565b6001600160a01b031614610a1d5760405162461bcd60e51b81526004016106899061226f565b610a268161137c565b50565b6000808211610a4a5760405162461bcd60e51b815260040161068990612151565b506000908152600560205260409020546001600160a01b031690565b6060600f80546106cf90612592565b600b5481565b60126020526000908152604090205460ff1681565b60006001600160a01b038216610ab85760405162461bcd60e51b815260040161068990612107565b506001600160a01b031660009081526004602052604090205490565b60115481565b601e81565b603c81565b60105481565b6000546001600160a01b031690565b610b016110ab565b6001600160a01b0316610b12610aea565b6001600160a01b031614610b385760405162461bcd60e51b81526004016106899061226f565b6013805460ff19811660ff90911615179055565b6060600d80546106cf90612592565b610b636110ab565b6001600160a01b0316826001600160a01b03161415610b945760405162461bcd60e51b815260040161068990611f57565b8060036000610ba16110ab565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610be56110ab565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610c1d9190611e3d565b60405180910390a35050565b610c3a610c346110ab565b83611132565b610c565760405162461bcd60e51b8152600401610689906123c4565b610c628484848461138f565b50505050565b6060610c73826110af565b610c8f5760405162461bcd60e51b8152600401610689906122ed565b6000610c99610a66565b905080610ca5846113c2565b604051602001610cb6929190611d8f565b604051602081830303815290604052915050919050565b3360009081526008602052604090205460ff16610cfc5760405162461bcd60e51b81526004016106899061244c565b600e54610d0761082d565b1015610d255760405162461bcd60e51b81526004016106899061233c565b3360009081526012602052604090205460ff1615610d555760405162461bcd60e51b815260040161068990612062565b336000908152601260205260408120805460ff19166001179055601154606490610d8090601e6124fc565b610d8a91906124e8565b600a54336000908152600860205260408120549293509160ff91821691610db3918591166124fc565b610dbd91906124e8565b604051909150339082156108fc029083906000818181858888f19350505050158015610828573d6000803e3d6000fd5b60096020526000908152604090205460ff1681565b60003411610e225760405162461bcd60e51b815260040161068990611ead565b34601554610e3091906124ab565b601555565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205460ff1690565b6103e881565b60135460ff1681565b60155481565b6000610e8261082d565b9050601e8260ff161115610ea85760405162461bcd60e51b815260040161068990612206565b600e54610eb860ff8416836124ab565b1115610ed65760405162461bcd60e51b815260040161068990612477565b60135460ff16610ef85760405162461bcd60e51b81526004016106899061208d565b6103e88110610f3657348260ff16601054610f1391906124fc565b1115610f315760405162461bcd60e51b815260040161068990612366565b611030565b33600090815260096020526040902054603c90610f5790849060ff166124c3565b60ff161115610f785760405162461bcd60e51b815260040161068990612020565b610f84816103e861251b565b8260ff1611610fb3578160ff16601054610f9e91906124fc565b601154610fab91906124ab565b601155611030565b6010543490610fc4836103e861251b565b610fd19060ff861661251b565b610fdb91906124fc565b1115610ff95760405162461bcd60e51b815260040161068990612366565b601054611008826103e861251b565b6110159060ff851661251b565b61101f91906124fc565b60115461102c91906124ab565b6011555b3360009081526009602052604090205461104e90839060ff166124c3565b336000908152600960205260409020805460ff191660ff9290921691909117905560015b8260ff16811161082857600e54821015611099576110993361109483856124ab565b6114dd565b806110a3816125cd565b915050611072565b3390565b60009081526006602052604090205460ff1690565b600081815260026020526040902080546001600160a01b0319166001600160a01b03841690811790915581906110f982610a29565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061113d826110af565b6111595760405162461bcd60e51b815260040161068990611fd4565b600061116483610a29565b9050806001600160a01b0316846001600160a01b0316148061119f5750836001600160a01b031661119484610752565b6001600160a01b0316145b806111af57506111af8185610e35565b949350505050565b826001600160a01b03166111ca82610a29565b6001600160a01b0316146111f05760405162461bcd60e51b8152600401610689906122a4565b6001600160a01b0382166112165760405162461bcd60e51b815260040161068990611f13565b611221838383610828565b61122c6000826110c4565b6001600160a01b03831660009081526004602052604081208054916112508361255e565b9091555050600081815260056020908152604080832080546001600160a01b0319166001600160a01b038716908117909155835260049091528120805491611297836125cd565b909155505060008181526007602052604090205460ff1615611336576001600160a01b0383166000908152600860205260408120805460ff16916112da83612575565b82546101009290920a60ff8181021990931691831602179091556001600160a01b03841660009081526008602052604081208054909216925061131c836125e8565b91906101000a81548160ff021916908360ff160217905550505b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b805161094490600f906020840190611a0d565b61139a8484846111b7565b6113a6848484846114f7565b610c625760405162461bcd60e51b815260040161068990611e5b565b6060816113e757506040805180820190915260018152600360fc1b60208201526106b5565b8160005b811561141157806113fb816125cd565b915061140a9050600a836124e8565b91506113eb565b60008167ffffffffffffffff81111561143a57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611464576020820181803683370190505b5090505b84156111af5761147960018361251b565b9150611486600a86612608565b6114919060306124ab565b60f81b8183815181106114b457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506114d6600a866124e8565b9450611468565b6109448282604051806020016040528060008152506115d6565b600061150b846001600160a01b0316611609565b611517575060016111af565b600061159f630a85bd0160e11b61152c6110ab565b8887876040516024016115429493929190611e00565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001612675603291396001600160a01b038816919061160f565b90506000818060200190518101906115b79190611cac565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b6115e08383611628565b6115ed60008484846114f7565b6108285760405162461bcd60e51b815260040161068990611e5b565b3b151590565b606061161e84846000856118d2565b90505b9392505050565b6001600160a01b03821661164e5760405162461bcd60e51b8152600401610689906121d1565b611657816110af565b156116745760405162461bcd60e51b815260040161068990611edc565b61168060008383610828565b600081815260056020908152604080832080546001600160a01b0319166001600160a01b03871690811790915560068352818420805460ff191660019081179091559084526004909252909120546116d7916124ab565b6001600160a01b038316600090815260046020526040902055600b546116fe9060016124ab565b600b55600e5461171090600a906124e8565b600e5461171d919061251b565b61172561082d565b1080156117375750600a5460ff16600f145b15611757576000818152600760205260409020805460ff19169055611896565b6002600e5461176691906124e8565b600e54611773919061251b565b61177b61082d565b10801561178c5750600a805460ff16145b156117ac576000818152600760205260409020805460ff19169055611896565b60006117b6611992565b9050606481101561187d57600a54601460ff909116101561186157600a546117e29060ff1660016124c3565b600a805460ff92831660ff19918216179091556000848152600760209081526040808320805490941660019081179094556001600160a01b038816835260089091529020546118329216906124c3565b6001600160a01b0384166000908152600860205260409020805460ff191660ff92909216919091179055611878565b6000828152600760205260409020805460ff191690555b611894565b6000828152600760205260409020805460ff191690555b505b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060824710156118f45760405162461bcd60e51b815260040161068990611f8e565b6118fd85611609565b6119195760405162461bcd60e51b815260040161068990612415565b600080866001600160a01b031685876040516119359190611d73565b60006040518083038185875af1925050503d8060008114611972576040519150601f19603f3d011682016040523d82523d6000602084013e611977565b606091505b50915091506119878282866119d4565b979650505050505050565b60008044426040516020016119a8929190611dde565b60408051601f19818403018152919052805160209091012090506119ce6103e882612608565b91505090565b606083156119e3575081611621565b8251156119f35782518084602001fd5b8160405162461bcd60e51b81526004016106899190611e48565b828054611a1990612592565b90600052602060002090601f016020900481019282611a3b5760008555611a81565b82601f10611a5457805160ff1916838001178555611a81565b82800160010185558215611a81579182015b82811115611a81578251825591602001919060010190611a66565b50611a8d929150611a91565b5090565b5b80821115611a8d5760008155600101611a92565b600067ffffffffffffffff80841115611ac157611ac1612648565b604051601f8501601f191681016020018281118282101715611ae557611ae5612648565b604052848152915081838501861015611afd57600080fd5b8484602083013760006020868301015250509392505050565b80356001600160a01b03811681146106b557600080fd5b600060208284031215611b3e578081fd5b61162182611b16565b60008060408385031215611b59578081fd5b611b6283611b16565b9150611b7060208401611b16565b90509250929050565b600080600060608486031215611b8d578081fd5b611b9684611b16565b9250611ba460208501611b16565b9150604084013590509250925092565b60008060008060808587031215611bc9578081fd5b611bd285611b16565b9350611be060208601611b16565b925060408501359150606085013567ffffffffffffffff811115611c02578182fd5b8501601f81018713611c12578182fd5b611c2187823560208401611aa6565b91505092959194509250565b60008060408385031215611c3f578182fd5b611c4883611b16565b915060208301358015158114611c5c578182fd5b809150509250929050565b60008060408385031215611c79578182fd5b611c8283611b16565b946020939093013593505050565b600060208284031215611ca1578081fd5b81356116218161265e565b600060208284031215611cbd578081fd5b81516116218161265e565b600060208284031215611cd9578081fd5b813567ffffffffffffffff811115611cef578182fd5b8201601f81018413611cff578182fd5b6111af84823560208401611aa6565b600060208284031215611d1f578081fd5b5035919050565b600060208284031215611d37578081fd5b813560ff81168114611621578182fd5b60008151808452611d5f816020860160208601612532565b601f01601f19169290920160200192915050565b60008251611d85818460208701612532565b9190910192915050565b600066697066733a2f2f60c81b82528351611db1816007850160208801612532565b602f60f81b6007918401918201528351611dd2816008840160208801612532565b01600801949350505050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611e3390830184611d47565b9695505050505050565b901515815260200190565b6000602082526116216020830184611d47565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252601590820152740daeae6e840c8cae0dee6d2e840e6dedaca40cae8d605b1b604082015260600190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526022908201527f6d6178207065722077616c6c6574207265616368656420666f72207072656d696040820152611b9d60f21b606082015260800190565b60208082526011908201527020b63932b0b23c903bb4ba34323930bbb760791b604082015260600190565b60208082526003908201526204531360ec1b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252601d908201527f43616e6e6f74207769746864726177206d6f7265207468616e20373025000000604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526003908201526245313160e81b604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526010908201526f4d696e74696e67206e6f7420646f6e6560801b604082015260600190565b60208082526003908201526245313560e81b604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252601190820152704e6f2077696e6e696e6720746f6b656e7360781b604082015260600190565b60208082526003908201526222989960e91b604082015260600190565b90815260200190565b60ff91909116815260200190565b600082198211156124be576124be61261c565b500190565b600060ff821660ff84168060ff038211156124e0576124e061261c565b019392505050565b6000826124f7576124f7612632565b500490565b60008160001904831182151516156125165761251661261c565b500290565b60008282101561252d5761252d61261c565b500390565b60005b8381101561254d578181015183820152602001612535565b83811115610c625750506000910152565b60008161256d5761256d61261c565b506000190190565b600060ff8216806125885761258861261c565b6000190192915050565b6002810460018216806125a657607f821691505b602082108114156125c757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156125e1576125e161261c565b5060010190565b600060ff821660ff8114156125ff576125ff61261c565b60010192915050565b60008261261757612617612632565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610a2657600080fdfe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e746572a26469706673582212205594f92230937d4fbe47af574701c3a0cba2ce838c33e64ab2249fc85e426f5964736f6c63430008000033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000000a4f6b61792042656572730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034f4b420000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Okay Beers
Arg [1] : symbol (string): OKB
Arg [2] : maxNftSupply (uint256): 10000

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [4] : 4f6b617920426565727300000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 4f4b420000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

40037:3410:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41883:98;;;;;;;;;;-1:-1:-1;41883:98:0;;;;;:::i;:::-;;:::i;:::-;;10229:150;;;;;;;;;;-1:-1:-1;10229:150:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20802:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23940:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26817:221::-;;;;;;;;;;-1:-1:-1;26817:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;26347:404::-;;;;;;;;;;-1:-1:-1;26347:404:0;;;;;:::i;:::-;;:::i;25764:268::-;;;;;;;;;;;;;:::i;27707:305::-;;;;;;;;;;-1:-1:-1;27707:305:0;;;;;:::i;:::-;;:::i;20527:40::-;;;;;;;;;;-1:-1:-1;20527:40:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;41320:271::-;;;;;;;;;;-1:-1:-1;41320:271:0;;;;;:::i;:::-;;:::i;28083:151::-;;;;;;;;;;-1:-1:-1;28083:151:0;;;;;:::i;:::-;;:::i;20624:29::-;;;;;;;;;;;;;:::i;40622:35::-;;;;;;;;;;;;;:::i;41599:115::-;;;;;;;;;;-1:-1:-1;41599:115:0;;;;;:::i;:::-;;:::i;41989:99::-;;;;;;;;;;-1:-1:-1;41989:99:0;;;;;:::i;:::-;;:::i;23581:292::-;;;;;;;;;;-1:-1:-1;23581:292:0;;;;;:::i;:::-;;:::i;25341:97::-;;;;;;;;;;;;;:::i;20662:31::-;;;;;;;;;;;;;:::i;40530:42::-;;;;;;;;;;-1:-1:-1;40530:42:0;;;;;:::i;:::-;;:::i;23259:260::-;;;;;;;;;;-1:-1:-1;23259:260:0;;;;;:::i;:::-;;:::i;40487:30::-;;;;;;;;;;;;;:::i;40153:43::-;;;;;;;;;;;;;:::i;40205:44::-;;;;;;;;;;;;;:::i;40084:43::-;;;;;;;;;;;;;:::i;38755:87::-;;;;;;;;;;;;;:::i;42163:85::-;;;;;;;;;;;;;:::i;24109:104::-;;;;;;;;;;;;;:::i;27110:295::-;;;;;;;;;;-1:-1:-1;27110:295:0;;;;;:::i;:::-;;:::i;28305:285::-;;;;;;;;;;-1:-1:-1;28305:285:0;;;;;:::i;:::-;;:::i;24284:818::-;;;;;;;;;;-1:-1:-1;24284:818:0;;;;;:::i;:::-;;:::i;40849:463::-;;;;;;;;;;;;;:::i;20574:43::-;;;;;;;;;;-1:-1:-1;20574:43:0;;;;;:::i;:::-;;:::i;41722:153::-;;;:::i;27476:164::-;;;;;;;;;;-1:-1:-1;27476:164:0;;;;;:::i;:::-;;:::i;40256:42::-;;;;;;;;;;;;;:::i;40581:32::-;;;;;;;;;;;;;:::i;40666:28::-;;;;;;;;;;;;;:::i;42290:1148::-;;;;;;:::i;:::-;;:::i;41883:98::-;38986:12;:10;:12::i;:::-;-1:-1:-1;;;;;38975:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;38975:23:0;;38967:68;;;;-1:-1:-1;;;38967:68:0;;;;;;;:::i;:::-;;;;;;;;;41954:8:::1;:19:::0;41883:98::o;10229:150::-;-1:-1:-1;;;;;;10338:33:0;;10314:4;10338:33;;;:20;:33;;;;;;;;10229:150;;;;:::o;20802:22::-;;;;:::o;23940:100::-;23994:13;24027:5;24020:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23940:100;:::o;26817:221::-;26893:7;26921:16;26929:7;26921;:16::i;:::-;26913:73;;;;-1:-1:-1;;;26913:73:0;;;;;;;:::i;:::-;-1:-1:-1;27006:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;27006:24:0;;26817:221::o;26347:404::-;26428:13;26444:23;26459:7;26444:14;:23::i;:::-;26428:39;;26492:5;-1:-1:-1;;;;;26486:11:0;:2;-1:-1:-1;;;;;26486:11:0;;;26478:57;;;;-1:-1:-1;;;26478:57:0;;;;;;;:::i;:::-;26572:5;-1:-1:-1;;;;;26556:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;26556:21:0;;:69;;;;26581:44;26605:5;26612:12;:10;:12::i;26581:44::-;26548:161;;;;-1:-1:-1;;;26548:161:0;;;;;;;:::i;:::-;26722:21;26731:2;26735:7;26722:8;:21::i;:::-;26347:404;;;:::o;25764:268::-;26012:12;;25764:268;:::o;27707:305::-;27868:41;27887:12;:10;:12::i;:::-;27901:7;27868:18;:41::i;:::-;27860:103;;;;-1:-1:-1;;;27860:103:0;;;;;;;:::i;:::-;27976:28;27986:4;27992:2;27996:7;27976:9;:28::i;20527:40::-;;;;;;;;;;;;;;;:::o;41320:271::-;38986:12;:10;:12::i;:::-;-1:-1:-1;;;;;38975:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;38975:23:0;;38967:68;;;;-1:-1:-1;;;38967:68:0;;;;;;;:::i;:::-;41430:16:::1;;41423:3;41403:11;;41417:2;41403:16;;;;:::i;:::-;41402:24;;;;:::i;:::-;41401:45;;;;:::i;:::-;41390:6;:57;;41382:99;;;;-1:-1:-1::0;;;41382:99:0::1;;;;;;;:::i;:::-;41530:6;41511:16;;:25;;;;:::i;:::-;41492:16;:44:::0;41547:36:::1;::::0;41555:10:::1;::::0;41547:36;::::1;;;::::0;41576:6;;41547:36:::1;::::0;;;41576:6;41555:10;41547:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;41320:271:::0;:::o;28083:151::-;28187:39;28204:4;28210:2;28214:7;28187:39;;;;;;;;;;;;:16;:39::i;20624:29::-;;;;;;:::o;40622:35::-;;;;:::o;41599:115::-;38986:12;:10;:12::i;:::-;-1:-1:-1;;;;;38975:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;38975:23:0;;38967:68;;;;-1:-1:-1;;;38967:68:0;;;;;;;:::i;:::-;41670:36:::1;::::0;41678:10:::1;::::0;41670:36;::::1;;;::::0;41699:6;;41670:36:::1;::::0;;;41699:6;41678:10;41670:36;::::1;;;;;;;;;;;;;::::0;::::1;;;;41989:99:::0;38986:12;:10;:12::i;:::-;-1:-1:-1;;;;;38975:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;38975:23:0;;38967:68;;;;-1:-1:-1;;;38967:68:0;;;;;;;:::i;:::-;42060:20:::1;42072:7;42060:11;:20::i;:::-;41989:99:::0;:::o;23581:292::-;23653:7;23781:1;23771:7;:11;23763:65;;;;-1:-1:-1;;;23763:65:0;;;;;;;:::i;:::-;-1:-1:-1;23846:19:0;;;;:10;:19;;;;;;-1:-1:-1;;;;;23846:19:0;;23581:292::o;25341:97::-;25389:13;25422:8;25415:15;;;;;:::i;20662:31::-;;;;:::o;40530:42::-;;;;;;;;;;;;;;;:::o;23259:260::-;23331:7;-1:-1:-1;;;;;23359:19:0;;23351:74;;;;-1:-1:-1;;;23351:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;23492:19:0;;;;;:12;:19;;;;;;;23259:260::o;40487:30::-;;;;:::o;40153:43::-;40194:2;40153:43;:::o;40205:44::-;40247:2;40205:44;:::o;40084:43::-;;;;:::o;38755:87::-;38801:7;38828:6;-1:-1:-1;;;;;38828:6:0;38755:87;:::o;42163:85::-;38986:12;:10;:12::i;:::-;-1:-1:-1;;;;;38975:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;38975:23:0;;38967:68;;;;-1:-1:-1;;;38967:68:0;;;;;;;:::i;:::-;42228:12:::1;::::0;;-1:-1:-1;;42212:28:0;::::1;42228:12;::::0;;::::1;42227:13;42212:28;::::0;;42163:85::o;24109:104::-;24165:13;24198:7;24191:14;;;;;:::i;27110:295::-;27225:12;:10;:12::i;:::-;-1:-1:-1;;;;;27213:24:0;:8;-1:-1:-1;;;;;27213:24:0;;;27205:62;;;;-1:-1:-1;;;27205:62:0;;;;;;;:::i;:::-;27325:8;27280:18;:32;27299:12;:10;:12::i;:::-;-1:-1:-1;;;;;27280:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;27280:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;27280:53:0;;;;;;;;;;;27364:12;:10;:12::i;:::-;-1:-1:-1;;;;;27349:48:0;;27388:8;27349:48;;;;;;:::i;:::-;;;;;;;;27110:295;;:::o;28305:285::-;28437:41;28456:12;:10;:12::i;:::-;28470:7;28437:18;:41::i;:::-;28429:103;;;;-1:-1:-1;;;28429:103:0;;;;;;;:::i;:::-;28543:39;28557:4;28563:2;28567:7;28576:5;28543:13;:39::i;:::-;28305:285;;;;:::o;24284:818::-;24357:13;24391:16;24399:7;24391;:16::i;:::-;24383:76;;;;-1:-1:-1;;;24383:76:0;;;;;;;:::i;:::-;24530:18;24551:9;:7;:9::i;:::-;24530:30;;25063:4;25074:18;:7;:16;:18::i;:::-;25035:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25021:73;;;24284:818;;;:::o;40849:463::-;40910:10;40924:1;40903:18;;;:6;:18;;;;;;;;40895:52;;;;-1:-1:-1;;;40895:52:0;;;;;;;:::i;:::-;40983:7;;40966:13;:11;:13::i;:::-;:24;;40958:53;;;;-1:-1:-1;;;40958:53:0;;;;;;;:::i;:::-;41041:10;41031:21;;;;:9;:21;;;;;;;;41030:22;41022:52;;;;-1:-1:-1;;;41022:52:0;;;;;;;:::i;:::-;41097:10;41087:21;;;;:9;:21;;;;;:28;;-1:-1:-1;;41087:28:0;41111:4;41087:28;;;41151:11;;41171:3;;41151:16;;41165:2;41151:16;:::i;:::-;41150:24;;;;:::i;:::-;41243:12;;41212:10;41185:16;41205:18;;;:6;:18;;;;;;41126:48;;-1:-1:-1;41185:16:0;41243:12;;;;;41205:34;;41126:48;;41205:18;:34;:::i;:::-;41204:51;;;;:::i;:::-;41266:38;;41185:70;;-1:-1:-1;41274:10:0;;41266:38;;;;;41185:70;;41266:38;;;;41185:70;41274:10;41266:38;;;;;;;;;;;;;;;;;;;20574:43;;;;;;;;;;;;;;;:::o;41722:153::-;41796:1;41784:9;:13;41776:47;;;;-1:-1:-1;;;41776:47:0;;;;;;;:::i;:::-;41858:9;41846;;:21;;;;:::i;:::-;41834:9;:33;41722:153::o;27476:164::-;-1:-1:-1;;;;;27597:25:0;;;27573:4;27597:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;27476:164::o;40256:42::-;40294:4;40256:42;:::o;40581:32::-;;;;;;:::o;40666:28::-;;;;:::o;42290:1148::-;42355:14;42372:13;:11;:13::i;:::-;42355:30;;40194:2;42404:14;:32;;;;42396:48;;;;-1:-1:-1;;;42396:48:0;;;;;;;:::i;:::-;42492:7;;42464:23;;;;:6;:23;:::i;:::-;42463:36;;42455:52;;;;-1:-1:-1;;;42455:52:0;;;;;;;:::i;:::-;42526:12;;;;42518:28;;;;-1:-1:-1;;;42518:28:0;;;;;;;:::i;:::-;40294:4;42563:6;:21;42559:624;;42640:9;42621:14;42610:25;;:8;;:25;;;;:::i;:::-;42609:40;;42601:56;;;;-1:-1:-1;;;42601:56:0;;;;;;;:::i;:::-;42559:624;;;42709:10;42699:21;;;;:9;:21;;;;;;40247:2;;42699:38;;42723:14;;42699:21;;:38;:::i;:::-;42698:59;;;;42690:106;;;;-1:-1:-1;;;42690:106:0;;;;;;;:::i;:::-;42834:20;42848:6;40294:4;42834:20;:::i;:::-;42815:14;:40;;;42811:361;;42916:14;42905:25;;:8;;:25;;;;:::i;:::-;42890:11;;:41;;;;:::i;:::-;42876:11;:55;42811:361;;;43025:8;;43038:9;;43000:20;43014:6;40294:4;43000:20;:::i;:::-;42982:39;;;;;;:::i;:::-;42981:52;;;;:::i;:::-;42980:67;;42972:83;;;;-1:-1:-1;;;42972:83:0;;;;;;;:::i;:::-;43147:8;;43122:20;43136:6;40294:4;43122:20;:::i;:::-;43104:39;;;;;;:::i;:::-;43103:52;;;;:::i;:::-;43088:11;;:68;;;;:::i;:::-;43074:11;:82;42811:361;43229:10;43219:21;;;;:9;:21;;;;;;:38;;43243:14;;43219:21;;:38;:::i;:::-;43205:10;43195:21;;;;:9;:21;;;;;:62;;-1:-1:-1;;43195:62:0;;;;;;;;;;;;-1:-1:-1;43270:161:0;43294:14;43289:19;;:1;:19;43270:161;;43343:7;;43334:6;:16;43330:90;;;43371:33;43381:10;43393;43402:1;43393:6;:10;:::i;:::-;43371:9;:33::i;:::-;43310:3;;;;:::i;:::-;;;;43270:161;;730:115;826:10;730:115;:::o;30057:167::-;30122:4;30196:20;;;:11;:20;;;;;;;;;30057:167::o;36747:192::-;36822:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;36822:29:0;-1:-1:-1;;;;;36822:29:0;;;;;;;;:24;;36876:23;36822:24;36876:14;:23::i;:::-;-1:-1:-1;;;;;36867:46:0;;;;;;;;;;;36747:192;;:::o;30391:355::-;30484:4;30509:16;30517:7;30509;:16::i;:::-;30501:73;;;;-1:-1:-1;;;30501:73:0;;;;;;;:::i;:::-;30585:13;30601:23;30616:7;30601:14;:23::i;:::-;30585:39;;30654:5;-1:-1:-1;;;;;30643:16:0;:7;-1:-1:-1;;;;;30643:16:0;;:51;;;;30687:7;-1:-1:-1;;;;;30663:31:0;:20;30675:7;30663:11;:20::i;:::-;-1:-1:-1;;;;;30663:31:0;;30643:51;:94;;;;30698:39;30722:5;30729:7;30698:23;:39::i;:::-;30635:103;30391:355;-1:-1:-1;;;;30391:355:0:o;34083:671::-;34208:4;-1:-1:-1;;;;;34181:31:0;:23;34196:7;34181:14;:23::i;:::-;-1:-1:-1;;;;;34181:31:0;;34173:85;;;;-1:-1:-1;;;34173:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34295:16:0;;34287:65;;;;-1:-1:-1;;;34287:65:0;;;;;;;:::i;:::-;34365:39;34386:4;34392:2;34396:7;34365:20;:39::i;:::-;34469:29;34486:1;34490:7;34469:8;:29::i;:::-;-1:-1:-1;;;;;34511:18:0;;;;;;:12;:18;;;;;:20;;;;;;:::i;:::-;;;;-1:-1:-1;;34542:19:0;;;;:10;:19;;;;;;;;:24;;-1:-1:-1;;;;;;34542:24:0;-1:-1:-1;;;;;34542:24:0;;;;;;;;34577:16;;:12;:16;;;;;:18;;;;;;:::i;:::-;;;;-1:-1:-1;;34612:20:0;;;;:11;:20;;;;;;;;34608:94;;;-1:-1:-1;;;;;34649:12:0;;;;;;:6;:12;;;;;:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34678:10:0;;-1:-1:-1;34678:10:0;;;:6;:10;;;;;:12;;;;;;-1:-1:-1;34678:12:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;34608:94;34738:7;34734:2;-1:-1:-1;;;;;34719:27:0;34728:4;-1:-1:-1;;;;;34719:27:0;;;;;;;;;;;34083:671;;;:::o;35359:100::-;35432:19;;;;:8;;:19;;;;;:::i;29472:272::-;29586:28;29596:4;29602:2;29606:7;29586:9;:28::i;:::-;29633:48;29656:4;29662:2;29666:7;29675:5;29633:22;:48::i;:::-;29625:111;;;;-1:-1:-1;;;29625:111:0;;;;;;;:::i;17328:723::-;17384:13;17605:10;17601:53;;-1:-1:-1;17632:10:0;;;;;;;;;;;;-1:-1:-1;;;17632:10:0;;;;;;17601:53;17679:5;17664:12;17720:78;17727:9;;17720:78;;17753:8;;;;:::i;:::-;;-1:-1:-1;17776:10:0;;-1:-1:-1;17784:2:0;17776:10;;:::i;:::-;;;17720:78;;;17808:19;17840:6;17830:17;;;;;;-1:-1:-1;;;17830:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17830:17:0;;17808:39;;17858:154;17865:10;;17858:154;;17892:11;17902:1;17892:11;;:::i;:::-;;-1:-1:-1;17961:10:0;17969:2;17961:5;:10;:::i;:::-;17948:24;;:2;:24;:::i;:::-;17935:39;;17918:6;17925;17918:14;;;;;;-1:-1:-1;;;17918:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;17918:56:0;;;;;;;;-1:-1:-1;17989:11:0;17998:2;17989:11;;:::i;:::-;;;17858:154;;31089:110;31165:26;31175:2;31179:7;31165:26;;;;;;;;;;;;:9;:26::i;36024:604::-;36145:4;36172:15;:2;-1:-1:-1;;;;;36172:13:0;;:15::i;:::-;36167:60;;-1:-1:-1;36211:4:0;36204:11;;36167:60;36237:23;36263:252;-1:-1:-1;;;36376:12:0;:10;:12::i;:::-;36403:4;36422:7;36444:5;36279:181;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;36279:181:0;;;;;;;-1:-1:-1;;;;;36279:181:0;;;;;;;;;;;36263:252;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36263:15:0;;;:252;:15;:252::i;:::-;36237:278;;36526:13;36553:10;36542:32;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;36593:26:0;-1:-1:-1;;;36593:26:0;;-1:-1:-1;;;36024:604:0;;;;;;:::o;31426:250::-;31522:18;31528:2;31532:7;31522:5;:18::i;:::-;31559:54;31590:1;31594:2;31598:7;31607:5;31559:22;:54::i;:::-;31551:117;;;;-1:-1:-1;;;31551:117:0;;;;;;;:::i;11758:422::-;12125:20;12164:8;;;11758:422::o;14680:195::-;14783:12;14815:52;14837:6;14845:4;14851:1;14854:12;14815:21;:52::i;:::-;14808:59;;14680:195;;;;;;:::o;32208:1315::-;-1:-1:-1;;;;;32288:16:0;;32280:61;;;;-1:-1:-1;;;32280:61:0;;;;;;;:::i;:::-;32361:16;32369:7;32361;:16::i;:::-;32360:17;32352:58;;;;-1:-1:-1;;;32352:58:0;;;;;;;:::i;:::-;32423:45;32452:1;32456:2;32460:7;32423:20;:45::i;:::-;32481:19;;;;:10;:19;;;;;;;;:24;;-1:-1:-1;;;;;;32481:24:0;-1:-1:-1;;;;;32481:24:0;;;;;;;;32516:11;:20;;;;;:27;;-1:-1:-1;;32516:27:0;-1:-1:-1;32516:27:0;;;;;;32575:16;;;:12;:16;;;;;;;:20;;;:::i;:::-;-1:-1:-1;;;;;32556:16:0;;;;;;:12;:16;;;;;:39;32621:12;;:16;;32636:1;32621:16;:::i;:::-;32606:12;:31;32690:7;;:12;;32700:2;;32690:12;:::i;:::-;32679:7;;:24;;;;:::i;:::-;32662:13;:11;:13::i;:::-;:42;:64;;;;-1:-1:-1;32708:12:0;;;;32724:2;32708:18;32662:64;32658:807;;;32766:5;32743:20;;;:11;:20;;;;;:28;;-1:-1:-1;;32743:28:0;;;32658:807;;;32846:1;32836:7;;:11;;;;:::i;:::-;32825:7;;:23;;;;:::i;:::-;32808:13;:11;:13::i;:::-;:41;:63;;;;-1:-1:-1;32853:12:0;;;;;:18;32808:63;32804:650;;;32915:5;32892:20;;;:11;:20;;;;;:28;;-1:-1:-1;;32892:28:0;;;32804:650;;;32961:12;32976:8;:6;:8::i;:::-;32961:23;;33017:3;33007:7;:13;33003:436;;;33049:12;;33064:2;33049:12;;;;:17;33045:298;;;33110:12;;:16;;:12;;;:16;:::i;:::-;33095:12;:31;;;;;;-1:-1:-1;;33095:31:0;;;;;;;:12;33153:20;;;:11;:20;;;;;;;;:27;;;;;33095:31;33153:27;;;;;;-1:-1:-1;;;;;33220:10:0;;;;:6;:10;;;;;;:14;;:10;;:14;:::i;:::-;-1:-1:-1;;;;;33207:10:0;;;;;;:6;:10;;;;;:27;;-1:-1:-1;;33207:27:0;;;;;;;;;;;;33045:298;;;33314:5;33291:20;;;:11;:20;;;;;:28;;-1:-1:-1;;33291:28:0;;;33045:298;33003:436;;;33414:5;33391:20;;;:11;:20;;;;;:28;;-1:-1:-1;;33391:28:0;;;33003:436;32804:650;;33482:33;;33507:7;;-1:-1:-1;;;;;33482:33:0;;;33499:1;;33482:33;;33499:1;;33482:33;32208:1315;;:::o;15732:530::-;15859:12;15917:5;15892:21;:30;;15884:81;;;;-1:-1:-1;;;15884:81:0;;;;;;;:::i;:::-;15984:18;15995:6;15984:10;:18::i;:::-;15976:60;;;;-1:-1:-1;;;15976:60:0;;;;;;;:::i;:::-;16110:12;16124:23;16151:6;-1:-1:-1;;;;;16151:11:0;16171:5;16179:4;16151:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16109:75;;;;16202:52;16220:7;16229:10;16241:12;16202:17;:52::i;:::-;16195:59;15732:530;-1:-1:-1;;;;;;;15732:530:0:o;32014:186::-;32054:4;32071:15;32121:16;32139:15;32104:51;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;32104:51:0;;;;;;;;;32094:62;;32104:51;32094:62;;;;;-1:-1:-1;32175:17:0;32188:4;32094:62;32175:17;:::i;:::-;32168:24;;;32014:186;:::o;16272:742::-;16387:12;16416:7;16412:595;;;-1:-1:-1;16447:10:0;16440:17;;16412:595;16561:17;;:21;16557:439;;16824:10;16818:17;16885:15;16872:10;16868:2;16864:19;16857:44;16772:148;16967:12;16960:20;;-1:-1:-1;;;16960:20:0;;;;;;;;:::i;-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:198;;918:2;906:9;897:7;893:23;889:32;886:2;;;939:6;931;924:22;886:2;967:31;988:9;967:31;:::i;1009:274::-;;;1138:2;1126:9;1117:7;1113:23;1109:32;1106:2;;;1159:6;1151;1144:22;1106:2;1187:31;1208:9;1187:31;:::i;:::-;1177:41;;1237:40;1273:2;1262:9;1258:18;1237:40;:::i;:::-;1227:50;;1096:187;;;;;:::o;1288:342::-;;;;1434:2;1422:9;1413:7;1409:23;1405:32;1402:2;;;1455:6;1447;1440:22;1402:2;1483:31;1504:9;1483:31;:::i;:::-;1473:41;;1533:40;1569:2;1558:9;1554:18;1533:40;:::i;:::-;1523:50;;1620:2;1609:9;1605:18;1592:32;1582:42;;1392:238;;;;;:::o;1635:702::-;;;;;1807:3;1795:9;1786:7;1782:23;1778:33;1775:2;;;1829:6;1821;1814:22;1775:2;1857:31;1878:9;1857:31;:::i;:::-;1847:41;;1907:40;1943:2;1932:9;1928:18;1907:40;:::i;:::-;1897:50;;1994:2;1983:9;1979:18;1966:32;1956:42;;2049:2;2038:9;2034:18;2021:32;2076:18;2068:6;2065:30;2062:2;;;2113:6;2105;2098:22;2062:2;2141:22;;2194:4;2186:13;;2182:27;-1:-1:-1;2172:2:1;;2228:6;2220;2213:22;2172:2;2256:75;2323:7;2318:2;2305:16;2300:2;2296;2292:11;2256:75;:::i;:::-;2246:85;;;1765:572;;;;;;;:::o;2342:369::-;;;2468:2;2456:9;2447:7;2443:23;2439:32;2436:2;;;2489:6;2481;2474:22;2436:2;2517:31;2538:9;2517:31;:::i;:::-;2507:41;;2598:2;2587:9;2583:18;2570:32;2645:5;2638:13;2631:21;2624:5;2621:32;2611:2;;2672:6;2664;2657:22;2611:2;2700:5;2690:15;;;2426:285;;;;;:::o;2716:266::-;;;2845:2;2833:9;2824:7;2820:23;2816:32;2813:2;;;2866:6;2858;2851:22;2813:2;2894:31;2915:9;2894:31;:::i;:::-;2884:41;2972:2;2957:18;;;;2944:32;;-1:-1:-1;;;2803:179:1:o;2987:257::-;;3098:2;3086:9;3077:7;3073:23;3069:32;3066:2;;;3119:6;3111;3104:22;3066:2;3163:9;3150:23;3182:32;3208:5;3182:32;:::i;3249:261::-;;3371:2;3359:9;3350:7;3346:23;3342:32;3339:2;;;3392:6;3384;3377:22;3339:2;3429:9;3423:16;3448:32;3474:5;3448:32;:::i;3515:482::-;;3637:2;3625:9;3616:7;3612:23;3608:32;3605:2;;;3658:6;3650;3643:22;3605:2;3703:9;3690:23;3736:18;3728:6;3725:30;3722:2;;;3773:6;3765;3758:22;3722:2;3801:22;;3854:4;3846:13;;3842:27;-1:-1:-1;3832:2:1;;3888:6;3880;3873:22;3832:2;3916:75;3983:7;3978:2;3965:16;3960:2;3956;3952:11;3916:75;:::i;4002:190::-;;4114:2;4102:9;4093:7;4089:23;4085:32;4082:2;;;4135:6;4127;4120:22;4082:2;-1:-1:-1;4163:23:1;;4072:120;-1:-1:-1;4072:120:1:o;4197:289::-;;4307:2;4295:9;4286:7;4282:23;4278:32;4275:2;;;4328:6;4320;4313:22;4275:2;4372:9;4359:23;4422:4;4415:5;4411:16;4404:5;4401:27;4391:2;;4447:6;4439;4432:22;4491:259;;4572:5;4566:12;4599:6;4594:3;4587:19;4615:63;4671:6;4664:4;4659:3;4655:14;4648:4;4641:5;4637:16;4615:63;:::i;:::-;4732:2;4711:15;-1:-1:-1;;4707:29:1;4698:39;;;;4739:4;4694:50;;4542:208;-1:-1:-1;;4542:208:1:o;4755:274::-;;4922:6;4916:13;4938:53;4984:6;4979:3;4972:4;4964:6;4960:17;4938:53;:::i;:::-;5007:16;;;;;4892:137;-1:-1:-1;;4892:137:1:o;5034:750::-;;-1:-1:-1;;;5440:3:1;5433:22;5484:6;5478:13;5500:61;5554:6;5550:1;5545:3;5541:11;5534:4;5526:6;5522:17;5500:61;:::i;:::-;-1:-1:-1;;;5620:1:1;5580:16;;;5612:10;;;5605:23;5653:13;;5675:62;5653:13;5724:1;5716:10;;5709:4;5697:17;;5675:62;:::i;:::-;5757:17;5776:1;5753:25;;5423:361;-1:-1:-1;;;;5423:361:1:o;5789:247::-;5946:19;;;5990:2;5981:12;;5974:28;6027:2;6018:12;;5936:100::o;6041:203::-;-1:-1:-1;;;;;6205:32:1;;;;6187:51;;6175:2;6160:18;;6142:102::o;6249:506::-;-1:-1:-1;;;;;6534:15:1;;;6516:34;;6586:15;;6581:2;6566:18;;6559:43;6633:2;6618:18;;6611:34;;;6681:3;6676:2;6661:18;;6654:31;;;6249:506;;6702:47;;6729:19;;6721:6;6702:47;:::i;:::-;6694:55;6468:287;-1:-1:-1;;;;;;6468:287:1:o;6760:187::-;6925:14;;6918:22;6900:41;;6888:2;6873:18;;6855:92::o;6952:221::-;;7101:2;7090:9;7083:21;7121:46;7163:2;7152:9;7148:18;7140:6;7121:46;:::i;7178:414::-;7380:2;7362:21;;;7419:2;7399:18;;;7392:30;7458:34;7453:2;7438:18;;7431:62;-1:-1:-1;;;7524:2:1;7509:18;;7502:48;7582:3;7567:19;;7352:240::o;7597:345::-;7799:2;7781:21;;;7838:2;7818:18;;;7811:30;-1:-1:-1;;;7872:2:1;7857:18;;7850:51;7933:2;7918:18;;7771:171::o;7947:352::-;8149:2;8131:21;;;8188:2;8168:18;;;8161:30;8227;8222:2;8207:18;;8200:58;8290:2;8275:18;;8121:178::o;8304:400::-;8506:2;8488:21;;;8545:2;8525:18;;;8518:30;8584:34;8579:2;8564:18;;8557:62;-1:-1:-1;;;8650:2:1;8635:18;;8628:34;8694:3;8679:19;;8478:226::o;8709:349::-;8911:2;8893:21;;;8950:2;8930:18;;;8923:30;8989:27;8984:2;8969:18;;8962:55;9049:2;9034:18;;8883:175::o;9063:402::-;9265:2;9247:21;;;9304:2;9284:18;;;9277:30;9343:34;9338:2;9323:18;;9316:62;-1:-1:-1;;;9409:2:1;9394:18;;9387:36;9455:3;9440:19;;9237:228::o;9470:408::-;9672:2;9654:21;;;9711:2;9691:18;;;9684:30;9750:34;9745:2;9730:18;;9723:62;-1:-1:-1;;;9816:2:1;9801:18;;9794:42;9868:3;9853:19;;9644:234::o;9883:398::-;10085:2;10067:21;;;10124:2;10104:18;;;10097:30;10163:34;10158:2;10143:18;;10136:62;-1:-1:-1;;;10229:2:1;10214:18;;10207:32;10271:3;10256:19;;10057:224::o;10286:341::-;10488:2;10470:21;;;10527:2;10507:18;;;10500:30;-1:-1:-1;;;10561:2:1;10546:18;;10539:47;10618:2;10603:18;;10460:167::o;10632:326::-;10834:2;10816:21;;;10873:1;10853:18;;;10846:29;-1:-1:-1;;;10906:2:1;10891:18;;10884:33;10949:2;10934:18;;10806:152::o;10963:420::-;11165:2;11147:21;;;11204:2;11184:18;;;11177:30;11243:34;11238:2;11223:18;;11216:62;11314:26;11309:2;11294:18;;11287:54;11373:3;11358:19;;11137:246::o;11388:406::-;11590:2;11572:21;;;11629:2;11609:18;;;11602:30;11668:34;11663:2;11648:18;;11641:62;-1:-1:-1;;;11734:2:1;11719:18;;11712:40;11784:3;11769:19;;11562:232::o;11799:405::-;12001:2;11983:21;;;12040:2;12020:18;;;12013:30;12079:34;12074:2;12059:18;;12052:62;-1:-1:-1;;;12145:2:1;12130:18;;12123:39;12194:3;12179:19;;11973:231::o;12209:353::-;12411:2;12393:21;;;12450:2;12430:18;;;12423:30;12489:31;12484:2;12469:18;;12462:59;12553:2;12538:18;;12383:179::o;12567:356::-;12769:2;12751:21;;;12788:18;;;12781:30;12847:34;12842:2;12827:18;;12820:62;12914:2;12899:18;;12741:182::o;12928:326::-;13130:2;13112:21;;;13169:1;13149:18;;;13142:29;-1:-1:-1;;;13202:2:1;13187:18;;13180:33;13245:2;13230:18;;13102:152::o;13259:408::-;13461:2;13443:21;;;13500:2;13480:18;;;13473:30;13539:34;13534:2;13519:18;;13512:62;-1:-1:-1;;;13605:2:1;13590:18;;13583:42;13657:3;13642:19;;13433:234::o;13672:356::-;13874:2;13856:21;;;13893:18;;;13886:30;13952:34;13947:2;13932:18;;13925:62;14019:2;14004:18;;13846:182::o;14033:405::-;14235:2;14217:21;;;14274:2;14254:18;;;14247:30;14313:34;14308:2;14293:18;;14286:62;-1:-1:-1;;;14379:2:1;14364:18;;14357:39;14428:3;14413:19;;14207:231::o;14443:411::-;14645:2;14627:21;;;14684:2;14664:18;;;14657:30;14723:34;14718:2;14703:18;;14696:62;-1:-1:-1;;;14789:2:1;14774:18;;14767:45;14844:3;14829:19;;14617:237::o;14859:340::-;15061:2;15043:21;;;15100:2;15080:18;;;15073:30;-1:-1:-1;;;15134:2:1;15119:18;;15112:46;15190:2;15175:18;;15033:166::o;15204:326::-;15406:2;15388:21;;;15445:1;15425:18;;;15418:29;-1:-1:-1;;;15478:2:1;15463:18;;15456:33;15521:2;15506:18;;15378:152::o;15535:397::-;15737:2;15719:21;;;15776:2;15756:18;;;15749:30;15815:34;15810:2;15795:18;;15788:62;-1:-1:-1;;;15881:2:1;15866:18;;15859:31;15922:3;15907:19;;15709:223::o;15937:413::-;16139:2;16121:21;;;16178:2;16158:18;;;16151:30;16217:34;16212:2;16197:18;;16190:62;-1:-1:-1;;;16283:2:1;16268:18;;16261:47;16340:3;16325:19;;16111:239::o;16355:353::-;16557:2;16539:21;;;16596:2;16576:18;;;16569:30;16635:31;16630:2;16615:18;;16608:59;16699:2;16684:18;;16529:179::o;16713:341::-;16915:2;16897:21;;;16954:2;16934:18;;;16927:30;-1:-1:-1;;;16988:2:1;16973:18;;16966:47;17045:2;17030:18;;16887:167::o;17059:326::-;17261:2;17243:21;;;17300:1;17280:18;;;17273:29;-1:-1:-1;;;17333:2:1;17318:18;;17311:33;17376:2;17361:18;;17233:152::o;17390:177::-;17536:25;;;17524:2;17509:18;;17491:76::o;17572:184::-;17744:4;17732:17;;;;17714:36;;17702:2;17687:18;;17669:87::o;17761:128::-;;17832:1;17828:6;17825:1;17822:13;17819:2;;;17838:18;;:::i;:::-;-1:-1:-1;17874:9:1;;17809:80::o;17894:204::-;;17968:4;17965:1;17961:12;18000:4;17997:1;17993:12;18035:3;18029:4;18025:14;18020:3;18017:23;18014:2;;;18043:18;;:::i;:::-;18079:13;;17940:158;-1:-1:-1;;;17940:158:1:o;18103:120::-;;18169:1;18159:2;;18174:18;;:::i;:::-;-1:-1:-1;18208:9:1;;18149:74::o;18228:168::-;;18334:1;18330;18326:6;18322:14;18319:1;18316:21;18311:1;18304:9;18297:17;18293:45;18290:2;;;18341:18;;:::i;:::-;-1:-1:-1;18381:9:1;;18280:116::o;18401:125::-;;18469:1;18466;18463:8;18460:2;;;18474:18;;:::i;:::-;-1:-1:-1;18511:9:1;;18450:76::o;18531:258::-;18603:1;18613:113;18627:6;18624:1;18621:13;18613:113;;;18703:11;;;18697:18;18684:11;;;18677:39;18649:2;18642:10;18613:113;;;18744:6;18741:1;18738:13;18735:2;;;-1:-1:-1;;18779:1:1;18761:16;;18754:27;18584:205::o;18794:136::-;;18861:5;18851:2;;18870:18;;:::i;:::-;-1:-1:-1;;;18906:18:1;;18841:89::o;18935:178::-;;19016:4;19009:5;19005:16;19040:7;19030:2;;19051:18;;:::i;:::-;-1:-1:-1;;19087:20:1;;18980:133;-1:-1:-1;;18980:133:1:o;19118:380::-;19203:1;19193:12;;19250:1;19240:12;;;19261:2;;19315:4;19307:6;19303:17;19293:27;;19261:2;19368;19360:6;19357:14;19337:18;19334:38;19331:2;;;19414:10;19409:3;19405:20;19402:1;19395:31;19449:4;19446:1;19439:15;19477:4;19474:1;19467:15;19331:2;;19173:325;;;:::o;19503:135::-;;-1:-1:-1;;19563:17:1;;19560:2;;;19583:18;;:::i;:::-;-1:-1:-1;19630:1:1;19619:13;;19550:88::o;19643:175::-;;19724:4;19717:5;19713:16;19753:4;19744:7;19741:17;19738:2;;;19761:18;;:::i;:::-;19810:1;19797:15;;19688:130;-1:-1:-1;;19688:130:1:o;19823:112::-;;19881:1;19871:2;;19886:18;;:::i;:::-;-1:-1:-1;19920:9:1;;19861:74::o;19940:127::-;20001:10;19996:3;19992:20;19989:1;19982:31;20032:4;20029:1;20022:15;20056:4;20053:1;20046:15;20072:127;20133:10;20128:3;20124:20;20121:1;20114:31;20164:4;20161:1;20154:15;20188:4;20185:1;20178:15;20204:127;20265:10;20260:3;20256:20;20253:1;20246:31;20296:4;20293:1;20286:15;20320:4;20317:1;20310:15;20336:133;-1:-1:-1;;;;;;20412:32:1;;20402:43;;20392:2;;20459:1;20456;20449:12

Swarm Source

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