ETH Price: $3,398.26 (-0.55%)
Gas: 12 Gwei

Token

SquareUp (SQU)
 

Overview

Max Total Supply

200 SQU

Holders

173

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 SQU
0x3ea088e553232e7ed5c43678cd614b32bd8c04e3
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:
SquareUpContest

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-19
*/

// SPDX-License-Identifier: UNLICENSED
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * 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;

    /**
     * @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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @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);
}


// File @openzeppelin/contracts/token/ERC721/[email protected]


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


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

pragma solidity ^0.8.0;

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

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

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


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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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

pragma solidity ^0.8.0;

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

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


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


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

pragma solidity ^0.8.0;

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

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

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

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

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


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


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

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

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

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

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

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

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

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

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

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

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

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

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

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

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

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect 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);

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}


// File @chainlink/contracts/src/v0.8/interfaces/[email protected]


pragma solidity ^0.8.0;

interface VRFCoordinatorV2Interface {
  /**
   * @notice Get configuration relevant for making requests
   * @return minimumRequestConfirmations global min for request confirmations
   * @return maxGasLimit global max for request gas limit
   * @return s_provingKeyHashes list of registered key hashes
   */
  function getRequestConfig()
    external
    view
    returns (
      uint16,
      uint32,
      bytes32[] memory
    );

  /**
   * @notice Request a set of random words.
   * @param keyHash - Corresponds to a particular oracle job which uses
   * that key for generating the VRF proof. Different keyHash's have different gas price
   * ceilings, so you can select a specific one to bound your maximum per request cost.
   * @param subId  - The ID of the VRF subscription. Must be funded
   * with the minimum subscription balance required for the selected keyHash.
   * @param minimumRequestConfirmations - How many blocks you'd like the
   * oracle to wait before responding to the request. See SECURITY CONSIDERATIONS
   * for why you may want to request more. The acceptable range is
   * [minimumRequestBlockConfirmations, 200].
   * @param callbackGasLimit - How much gas you'd like to receive in your
   * fulfillRandomWords callback. Note that gasleft() inside fulfillRandomWords
   * may be slightly less than this amount because of gas used calling the function
   * (argument decoding etc.), so you may need to request slightly more than you expect
   * to have inside fulfillRandomWords. The acceptable range is
   * [0, maxGasLimit]
   * @param numWords - The number of uint256 random values you'd like to receive
   * in your fulfillRandomWords callback. Note these numbers are expanded in a
   * secure way by the VRFCoordinator from a single random value supplied by the oracle.
   * @return requestId - A unique identifier of the request. Can be used to match
   * a request to a response in fulfillRandomWords.
   */
  function requestRandomWords(
    bytes32 keyHash,
    uint64 subId,
    uint16 minimumRequestConfirmations,
    uint32 callbackGasLimit,
    uint32 numWords
  ) external returns (uint256 requestId);

  /**
   * @notice Create a VRF subscription.
   * @return subId - A unique subscription id.
   * @dev You can manage the consumer set dynamically with addConsumer/removeConsumer.
   * @dev Note to fund the subscription, use transferAndCall. For example
   * @dev  LINKTOKEN.transferAndCall(
   * @dev    address(COORDINATOR),
   * @dev    amount,
   * @dev    abi.encode(subId));
   */
  function createSubscription() external returns (uint64 subId);

  /**
   * @notice Get a VRF subscription.
   * @param subId - ID of the subscription
   * @return balance - LINK balance of the subscription in juels.
   * @return reqCount - number of requests for this subscription, determines fee tier.
   * @return owner - owner of the subscription.
   * @return consumers - list of consumer address which are able to use this subscription.
   */
  function getSubscription(uint64 subId)
    external
    view
    returns (
      uint96 balance,
      uint64 reqCount,
      address owner,
      address[] memory consumers
    );

  /**
   * @notice Request subscription owner transfer.
   * @param subId - ID of the subscription
   * @param newOwner - proposed new owner of the subscription
   */
  function requestSubscriptionOwnerTransfer(uint64 subId, address newOwner) external;

  /**
   * @notice Request subscription owner transfer.
   * @param subId - ID of the subscription
   * @dev will revert if original owner of subId has
   * not requested that msg.sender become the new owner.
   */
  function acceptSubscriptionOwnerTransfer(uint64 subId) external;

  /**
   * @notice Add a consumer to a VRF subscription.
   * @param subId - ID of the subscription
   * @param consumer - New consumer which can use the subscription
   */
  function addConsumer(uint64 subId, address consumer) external;

  /**
   * @notice Remove a consumer from a VRF subscription.
   * @param subId - ID of the subscription
   * @param consumer - Consumer to remove from the subscription
   */
  function removeConsumer(uint64 subId, address consumer) external;

  /**
   * @notice Cancel a subscription
   * @param subId - ID of the subscription
   * @param to - Where to send the remaining LINK to
   */
  function cancelSubscription(uint64 subId, address to) external;
}


// File @chainlink/contracts/src/v0.8/[email protected]


pragma solidity ^0.8.4;

/** ****************************************************************************
 * @notice Interface for contracts using VRF randomness
 * *****************************************************************************
 * @dev PURPOSE
 *
 * @dev Reggie the Random Oracle (not his real job) wants to provide randomness
 * @dev to Vera the verifier in such a way that Vera can be sure he's not
 * @dev making his output up to suit himself. Reggie provides Vera a public key
 * @dev to which he knows the secret key. Each time Vera provides a seed to
 * @dev Reggie, he gives back a value which is computed completely
 * @dev deterministically from the seed and the secret key.
 *
 * @dev Reggie provides a proof by which Vera can verify that the output was
 * @dev correctly computed once Reggie tells it to her, but without that proof,
 * @dev the output is indistinguishable to her from a uniform random sample
 * @dev from the output space.
 *
 * @dev The purpose of this contract is to make it easy for unrelated contracts
 * @dev to talk to Vera the verifier about the work Reggie is doing, to provide
 * @dev simple access to a verifiable source of randomness. It ensures 2 things:
 * @dev 1. The fulfillment came from the VRFCoordinator
 * @dev 2. The consumer contract implements fulfillRandomWords.
 * *****************************************************************************
 * @dev USAGE
 *
 * @dev Calling contracts must inherit from VRFConsumerBase, and can
 * @dev initialize VRFConsumerBase's attributes in their constructor as
 * @dev shown:
 *
 * @dev   contract VRFConsumer {
 * @dev     constructor(<other arguments>, address _vrfCoordinator, address _link)
 * @dev       VRFConsumerBase(_vrfCoordinator) public {
 * @dev         <initialization with other arguments goes here>
 * @dev       }
 * @dev   }
 *
 * @dev The oracle will have given you an ID for the VRF keypair they have
 * @dev committed to (let's call it keyHash). Create subscription, fund it
 * @dev and your consumer contract as a consumer of it (see VRFCoordinatorInterface
 * @dev subscription management functions).
 * @dev Call requestRandomWords(keyHash, subId, minimumRequestConfirmations,
 * @dev callbackGasLimit, numWords),
 * @dev see (VRFCoordinatorInterface for a description of the arguments).
 *
 * @dev Once the VRFCoordinator has received and validated the oracle's response
 * @dev to your request, it will call your contract's fulfillRandomWords method.
 *
 * @dev The randomness argument to fulfillRandomWords is a set of random words
 * @dev generated from your requestId and the blockHash of the request.
 *
 * @dev If your contract could have concurrent requests open, you can use the
 * @dev requestId returned from requestRandomWords to track which response is associated
 * @dev with which randomness request.
 * @dev See "SECURITY CONSIDERATIONS" for principles to keep in mind,
 * @dev if your contract could have multiple requests in flight simultaneously.
 *
 * @dev Colliding `requestId`s are cryptographically impossible as long as seeds
 * @dev differ.
 *
 * *****************************************************************************
 * @dev SECURITY CONSIDERATIONS
 *
 * @dev A method with the ability to call your fulfillRandomness method directly
 * @dev could spoof a VRF response with any random value, so it's critical that
 * @dev it cannot be directly called by anything other than this base contract
 * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method).
 *
 * @dev For your users to trust that your contract's random behavior is free
 * @dev from malicious interference, it's best if you can write it so that all
 * @dev behaviors implied by a VRF response are executed *during* your
 * @dev fulfillRandomness method. If your contract must store the response (or
 * @dev anything derived from it) and use it later, you must ensure that any
 * @dev user-significant behavior which depends on that stored value cannot be
 * @dev manipulated by a subsequent VRF request.
 *
 * @dev Similarly, both miners and the VRF oracle itself have some influence
 * @dev over the order in which VRF responses appear on the blockchain, so if
 * @dev your contract could have multiple VRF requests in flight simultaneously,
 * @dev you must ensure that the order in which the VRF responses arrive cannot
 * @dev be used to manipulate your contract's user-significant behavior.
 *
 * @dev Since the block hash of the block which contains the requestRandomness
 * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful
 * @dev miner could, in principle, fork the blockchain to evict the block
 * @dev containing the request, forcing the request to be included in a
 * @dev different block with a different hash, and therefore a different input
 * @dev to the VRF. However, such an attack would incur a substantial economic
 * @dev cost. This cost scales with the number of blocks the VRF oracle waits
 * @dev until it calls responds to a request. It is for this reason that
 * @dev that you can signal to an oracle you'd like them to wait longer before
 * @dev responding to the request (however this is not enforced in the contract
 * @dev and so remains effective only in the case of unmodified oracle software).
 */
abstract contract VRFConsumerBaseV2 {
  error OnlyCoordinatorCanFulfill(address have, address want);
  address private immutable vrfCoordinator;

  /**
   * @param _vrfCoordinator address of VRFCoordinator contract
   */
  constructor(address _vrfCoordinator) {
    vrfCoordinator = _vrfCoordinator;
  }

  /**
   * @notice fulfillRandomness handles the VRF response. Your contract must
   * @notice implement it. See "SECURITY CONSIDERATIONS" above for important
   * @notice principles to keep in mind when implementing your fulfillRandomness
   * @notice method.
   *
   * @dev VRFConsumerBaseV2 expects its subcontracts to have a method with this
   * @dev signature, and will call it once it has verified the proof
   * @dev associated with the randomness. (It is triggered via a call to
   * @dev rawFulfillRandomness, below.)
   *
   * @param requestId The Id initially returned by requestRandomness
   * @param randomWords the VRF output expanded to the requested number of words
   */
  function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal virtual;

  // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF
  // proof. rawFulfillRandomness then calls fulfillRandomness, after validating
  // the origin of the call
  function rawFulfillRandomWords(uint256 requestId, uint256[] memory randomWords) external {
    if (msg.sender != vrfCoordinator) {
      revert OnlyCoordinatorCanFulfill(msg.sender, vrfCoordinator);
    }
    fulfillRandomWords(requestId, randomWords);
  }
}


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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


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


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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


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


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

pragma solidity ^0.8.0;

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

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

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

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

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}


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


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

pragma solidity ^0.8.0;

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

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

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}


// File contracts/SquareUpContest.sol


pragma solidity ^0.8.0;
contract SquareUpContest is ERC721, VRFConsumerBaseV2, Ownable, ReentrancyGuard {
  using Counters for Counters.Counter;
  Counters.Counter public tokenIds;
  //link stuff
  VRFCoordinatorV2Interface COORDINATOR;
  uint64 public LinkSubScriptionId;
  address public VrfCoordinatorAddress;
  bytes32 public KeyHash;
  uint32 constant CallbackGasLimit = 300000;
  uint16 constant RequestConfirmations = 5;
  uint32 constant NumWords = 1;
  uint256[] public LinkRandomWords;
  uint256 public LinkRandomOffset;
  uint256 public RequestId;
  //global settings
  uint256 public MaxTickets;
  uint256 public MintFee;
  string public ContestDescription;
  bool public isMintPhase = true;
  bool public isGamePhase = false;
  string public BaselineURI;
  string public constant BaseExtension = ".json";
  uint constant private MaxTicketsPerMint = 1;
  //timestamp of when mint is allowed to begin
  uint256 public dtMintStartWhitelist;
  uint256 public dtMintStartPublic;
  struct Payout {
    uint256 token;
    uint256 amount;
  }
  struct PayoutSet {
    uint256 amount;
    uint time;
  }
  mapping(uint256 => PayoutSet) public PayoutPendingWithdrawls;
  uint256[] public TokenIdWinners;
  ///events
  event PayoutsSet(uint256 indexed tokenId, uint256 indexed amount);
  event PayoutWithdraw(uint256 indexed tokenId, address indexed user, uint256 indexed amount);
  event ReceivedEth(uint256 amount);
  //whitelisting
  bytes32 public MerkleRoot;

  constructor(
    uint64 _linkSubscriptionId,
    address _vrfCoordinatorAddress,
    bytes32 _keyHash,
    string memory _baselineURIMintPhase,
    uint256 _maxTickets,
    uint256 _mintFee,
    uint256 _dtMintStartWhitelist,
    uint256 _dtMintStartPublic,
    bytes32 _merkleRoot,
    string memory _contestDescription
    ) VRFConsumerBaseV2 (_vrfCoordinatorAddress) ERC721("SquareUp", "SQU") {
    COORDINATOR = VRFCoordinatorV2Interface(_vrfCoordinatorAddress);
    LinkSubScriptionId = _linkSubscriptionId;
    VrfCoordinatorAddress = _vrfCoordinatorAddress;
    KeyHash = _keyHash;
    BaselineURI = _baselineURIMintPhase;
    MaxTickets = _maxTickets;
    MintFee = _mintFee;
    dtMintStartWhitelist = _dtMintStartWhitelist;
    dtMintStartPublic = _dtMintStartPublic;
    MerkleRoot = _merkleRoot;
    ContestDescription = _contestDescription;
  }

  function mintTicket(uint quantity, address sender) private {
    for (uint32 i = 0; i < quantity; i++) {
      tokenIds.increment();
      uint256 newItemId = tokenIds.current();
      _mint(sender, newItemId);
    }
  }

  function mintCheck(uint quantity, uint amount, bool isWhitelist) private view {
    require(isMintPhase, "Mint phase is off");
    if (isWhitelist) {
      require(quantity <= MaxTicketsPerMint, "Can't mint this many tickets in one transaction");
    }
    else {
      require(quantity <= 10, "Can't mint this many tickets in one transaction");
    }
    require(tokenIds.current() + quantity <= MaxTickets, "Can't mint more than the total number of available tickets.");
    require(amount >= MintFee * quantity, "Not enough funds");
  }

  function mintTicketWhitelist(uint quantity, bytes32[] calldata _merkleProof) public payable nonReentrant {
    require(dtMintStartWhitelist <= block.timestamp, "Can't mint yet. Try again in a few seconds.");
    require(balanceOf(msg.sender) == 0, "Whitelist can't mint more than one ticket");
    mintCheck(quantity, msg.value, true);
    bytes32 leaf = keccak256((abi.encodePacked(msg.sender)));
    require(MerkleProof.verify(_merkleProof, MerkleRoot, leaf), "Not on the whitelist");
    mintTicket(quantity, msg.sender);
  }

  function mintTicketPublic(uint quantity) public payable nonReentrant {
    require(dtMintStartPublic <= block.timestamp, "Can't mint yet. Try again in a few seconds.");
    mintCheck(quantity, msg.value, false);
    mintTicket(quantity, msg.sender);
  }

  function setBaseURIGamePhase(string memory _baseUriNew) public onlyOwner {
    require(!isGamePhase, "Cannot switch team lists");
    require(LinkRandomWords.length > 0, "Cannot set base uri without chainlink random words");
    BaselineURI = _baseUriNew;
    isGamePhase = true;
  }

  function setMintPhaseOff() external onlyOwner() {
    require(isMintPhase, "Mint phase is off");
    isMintPhase = false;
  }

  function totalSupply() external view returns (uint256) {
    return tokenIds.current();
  }

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

  function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
    require(_exists(tokenId), "query for nonexistent token");
    string memory baseURI = _baseURI();
    if (!isGamePhase) {
      return baseURI;
    }
    uint256 offset = offsetCalcURI(tokenId);
    string memory uri = string(abi.encodePacked(baseURI, Strings.toString(offset)));
    return string(abi.encodePacked(uri, BaseExtension));
  }

  function offsetCalcURI(uint256 tokenId) public view returns (uint256) {
    require(_exists(tokenId), "query for nonexistent token");
    require(LinkRandomWords.length > 0, "link random words doesn't exist");
    return (LinkRandomWords[0] + tokenId) % tokenIds.current() + 1; //from 1 to # tickets minted
  }

  function _beforeTokenTransfer(
      address from,
      address to,
      uint256 tokenId
  ) internal virtual override(ERC721) {
      require(TokenIdWinners.length == 0, "No transfers once payouts are set");
      super._beforeTokenTransfer(from, to, tokenId);
  }


  function setMintStartTime(bool isPublicTime, uint256 _newTime) external onlyOwner{
      if (isPublicTime) {
        dtMintStartPublic = _newTime;
      }
      else {
        dtMintStartWhitelist = _newTime;
      }
  }

  function setGasLaneLink(bytes32 _gasLane) external onlyOwner {
    KeyHash = _gasLane;
  }

  function requestRandomWords() external onlyOwner {
    require(!isMintPhase, "Teams cannot be set during the mint phase");
    require(LinkRandomWords.length == 0, "Random words can only be set once");
    require(tokenIds.current() > 0, "Must have teams to shuffle");
    RequestId = COORDINATOR.requestRandomWords(
      KeyHash,
      LinkSubScriptionId,
      RequestConfirmations,
      CallbackGasLimit,
      NumWords
    );
  }

  function fulfillRandomWords(
    uint256, /* requestId */
    uint256[] memory randomWords
  ) internal override {
    require(!isMintPhase, "Teams cannot be set during the mint phase");
    LinkRandomWords = randomWords;
  }

  function randomWordsGet() external view returns (uint256[] memory) {
    return LinkRandomWords;
  }

  function setPayout(Payout calldata _payout) external onlyOwner {
    require(_exists(_payout.token), "query for nonexistent token");
    require(PayoutPendingWithdrawls[_payout.token].amount == 0 && PayoutPendingWithdrawls[_payout.token].time == 0, "Payout already set in the past");
    require(isGamePhase, "Must be in game phase");
    uint timeNow = block.timestamp;
    PayoutSet memory payoutSet = PayoutSet(_payout.amount, timeNow);
    PayoutPendingWithdrawls[_payout.token] = payoutSet;
    TokenIdWinners.push(_payout.token);
    emit PayoutsSet(_payout.token, _payout.amount);
  }

  function withdrawPayout(uint256 _tokenId) external payable nonReentrant {
    require(_exists(_tokenId), "query for nonexistent token");
    require(ownerOf(_tokenId) == msg.sender, "Unauthorized");
    require(PayoutPendingWithdrawls[_tokenId].time > 0, "No Payout set for this ticket");
    require(PayoutPendingWithdrawls[_tokenId].amount > 0, "Payout Already Claimed");
    uint256 amount = PayoutPendingWithdrawls[_tokenId].amount;
    PayoutPendingWithdrawls[_tokenId].amount = 0;
    emit PayoutWithdraw(_tokenId, msg.sender, amount);
    (bool sent, ) = (msg.sender.call{value: amount}(""));
    require(sent, "Transfer failed.");
  }

  function withdrawUnclaimed(address _destination, uint256 _tokenId) external payable onlyOwner {
    require(_exists(_tokenId), "query for nonexistent token");
    uint timeNow = block.timestamp;
    require(PayoutPendingWithdrawls[_tokenId].time != 0 && timeNow - PayoutPendingWithdrawls[_tokenId].time > 7776000 , "Can only withdraw unclaimed 90 days after Payouts are set");
    uint256 amount = PayoutPendingWithdrawls[_tokenId].amount;
    PayoutPendingWithdrawls[_tokenId].amount = 0;
    (bool sent, ) = (_destination.call{value: amount}(""));
    require(sent, "Transfer failed.");
  }

  function fundme() public payable {
    emit ReceivedEth(msg.value);
  }

  receive() external payable  {
      fundme();
  }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint64","name":"_linkSubscriptionId","type":"uint64"},{"internalType":"address","name":"_vrfCoordinatorAddress","type":"address"},{"internalType":"bytes32","name":"_keyHash","type":"bytes32"},{"internalType":"string","name":"_baselineURIMintPhase","type":"string"},{"internalType":"uint256","name":"_maxTickets","type":"uint256"},{"internalType":"uint256","name":"_mintFee","type":"uint256"},{"internalType":"uint256","name":"_dtMintStartWhitelist","type":"uint256"},{"internalType":"uint256","name":"_dtMintStartPublic","type":"uint256"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"string","name":"_contestDescription","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"have","type":"address"},{"internalType":"address","name":"want","type":"address"}],"name":"OnlyCoordinatorCanFulfill","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PayoutWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PayoutsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ReceivedEth","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":"BaseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BaselineURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ContestDescription","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KeyHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LinkRandomOffset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"LinkRandomWords","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LinkSubScriptionId","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxTickets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MintFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"PayoutPendingWithdrawls","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"time","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RequestId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"TokenIdWinners","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VrfCoordinatorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"dtMintStartPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dtMintStartWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fundme","outputs":[],"stateMutability":"payable","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":"isGamePhase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintPhase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintTicketPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mintTicketWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"offsetCalcURI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"randomWordsGet","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"rawFulfillRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requestRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseUriNew","type":"string"}],"name":"setBaseURIGamePhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_gasLane","type":"bytes32"}],"name":"setGasLaneLink","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setMintPhaseOff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isPublicTime","type":"bool"},{"internalType":"uint256","name":"_newTime","type":"uint256"}],"name":"setMintStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"token","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct SquareUpContest.Payout","name":"_payout","type":"tuple"}],"name":"setPayout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenIds","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"withdrawPayout","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_destination","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"withdrawUnclaimed","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040526012805461ffff191660011790553480156200001f57600080fd5b506040516200357e3803806200357e83398101604081905262000042916200034f565b6040805180820182526008815267053717561726555760c41b60208083019182528351808501909452600384526253515560e81b9084015281518c93916200008e9160009190620001bd565b508051620000a4906001906020840190620001bd565b50505060601b6001600160601b031916608052620000c9620000c33390565b6200016b565b6001600755600980546001600160a01b038b166001600160e01b03199091168117600160a01b6001600160401b038e160217909155600a80546001600160a01b0319169091179055600b88905586516200012b9060139060208a0190620001bd565b50600f869055601085905560148490556015839055601882905580516200015a906011906020840190620001bd565b50505050505050505050506200046e565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001cb906200041b565b90600052602060002090601f016020900481019282620001ef57600085556200023a565b82601f106200020a57805160ff19168380011785556200023a565b828001600101855582156200023a579182015b828111156200023a5782518255916020019190600101906200021d565b50620002489291506200024c565b5090565b5b808211156200024857600081556001016200024d565b80516001600160a01b03811681146200027b57600080fd5b919050565b600082601f8301126200029257600080fd5b81516001600160401b0380821115620002af57620002af62000458565b604051601f8301601f19908116603f01168101908282118183101715620002da57620002da62000458565b81604052838152602092508683858801011115620002f757600080fd5b600091505b838210156200031b5785820183015181830184015290820190620002fc565b838211156200032d5760008385830101525b9695505050505050565b80516001600160401b03811681146200027b57600080fd5b6000806000806000806000806000806101408b8d0312156200037057600080fd5b6200037b8b62000337565b99506200038b60208c0162000263565b60408c015160608d0151919a5098506001600160401b0380821115620003b057600080fd5b620003be8e838f0162000280565b985060808d0151975060a08d0151965060c08d0151955060e08d015194506101008d015193506101208d0151915080821115620003fa57600080fd5b50620004098d828e0162000280565b9150509295989b9194979a5092959850565b600181811c908216806200043057607f821691505b602082108114156200045257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b60805160601c6130ea6200049460003960008181610d700152610db201526130ea6000f3fe6080604052600436106102cd5760003560e01c80636e08423511610175578063a807e1a3116100dc578063d5c30ad111610095578063e985e9c51161006f578063e985e9c514610855578063f0871e541461089e578063f2fde38b146108b3578063fb96e649146108d357600080fd5b8063d5c30ad1146107e9578063da1f7bff146107ff578063e0c862891461084057600080fd5b8063a807e1a314610759578063b21c79351461076e578063b47654f414610781578063b88d4fde146107a1578063c87b56dd146107c1578063d1d9165d146107e157600080fd5b80638da5cb5b1161012e5780638da5cb5b146106ad57806395d89b41146106cb57806399eab53c146106e05780639bcc5fa3146106ff5780639c7b99a614610719578063a22cb4651461073957600080fd5b80636e0842351461062057806370a0823114610636578063714cff5614610656578063715018a61461066d57806376d4df2c1461068257806381e55e261461069857600080fd5b80634051a5a6116102345780635356d9e2116101ed5780635bb8ae7c116101c75780635bb8ae7c146105845780636352211e146105cd5780636672dfac146105ed5780636790884a1461060d57600080fd5b80635356d9e21461053657806353a8bf221461054c5780635867141e1461056257600080fd5b80634051a5a61461048d57806342842e0e146104ad5780634286918c146104cd57806344b7c545146104ed5780634d456dcb1461050d5780634eb5659f1461052057600080fd5b806318160ddd1161028657806318160ddd146103c75780631fe543e3146103dc57806323b872dd146103fc5780632b5b65391461041c57806333d0da4f1461043c5780633cb6a8d11461045c57600080fd5b806301ffc9a7146102e157806306fdde0314610316578063081812fc14610338578063095ea7b3146103705780630de5c71314610390578063132d3f6a146103a357600080fd5b366102dc576102da6108e9565b005b600080fd5b3480156102ed57600080fd5b506103016102fc3660046129fb565b61091e565b60405190151581526020015b60405180910390f35b34801561032257600080fd5b5061032b610970565b60405161030d9190612cc3565b34801561034457600080fd5b506103586103533660046129e2565b610a02565b6040516001600160a01b03909116815260200161030d565b34801561037c57600080fd5b506102da61038b36600461299c565b610a8f565b6102da61039e36600461299c565b610ba5565b3480156103af57600080fd5b506103b960185481565b60405190815260200161030d565b3480156103d357600080fd5b506103b9610d55565b3480156103e857600080fd5b506102da6103f7366004612b2e565b610d65565b34801561040857600080fd5b506102da6104173660046128ba565b610ded565b34801561042857600080fd5b506103b96104373660046129e2565b610e1e565b34801561044857600080fd5b506102da6104573660046129c6565b610e3f565b34801561046857600080fd5b5061032b60405180604001604052806005815260200164173539b7b760d91b81525081565b34801561049957600080fd5b506102da6104a8366004612a7e565b610e7b565b3480156104b957600080fd5b506102da6104c83660046128ba565b611029565b3480156104d957600080fd5b506103b96104e83660046129e2565b611044565b3480156104f957600080fd5b506102da6105083660046129e2565b6110fc565b6102da61051b3660046129e2565b61112b565b34801561052c57600080fd5b506103b960105481565b34801561054257600080fd5b506103b960145481565b34801561055857600080fd5b506103b9600b5481565b34801561056e57600080fd5b50610577611193565b60405161030d9190612c7f565b34801561059057600080fd5b506105b861059f3660046129e2565b6016602052600090815260409020805460019091015482565b6040805192835260208301919091520161030d565b3480156105d957600080fd5b506103586105e83660046129e2565b6111ea565b3480156105f957600080fd5b50600a54610358906001600160a01b031681565b6102da61061b366004612aaf565b611261565b34801561062c57600080fd5b506103b9600d5481565b34801561064257600080fd5b506103b9610651366004612865565b6113f1565b34801561066257600080fd5b506008546103b99081565b34801561067957600080fd5b506102da611478565b34801561068e57600080fd5b506103b9600f5481565b3480156106a457600080fd5b5061032b6114ae565b3480156106b957600080fd5b506006546001600160a01b0316610358565b3480156106d757600080fd5b5061032b61153c565b3480156106ec57600080fd5b5060125461030190610100900460ff1681565b34801561070b57600080fd5b506012546103019060ff1681565b34801561072557600080fd5b506103b96107343660046129e2565b61154b565b34801561074557600080fd5b506102da610754366004612972565b61155b565b34801561076557600080fd5b506102da611566565b6102da61077c3660046129e2565b6115e2565b34801561078d57600080fd5b506102da61079c366004612a35565b611808565b3480156107ad57600080fd5b506102da6107bc3660046128f6565b61191a565b3480156107cd57600080fd5b5061032b6107dc3660046129e2565b611952565b6102da6108e9565b3480156107f557600080fd5b506103b960155481565b34801561080b57600080fd5b5060095461082790600160a01b900467ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161030d565b34801561084c57600080fd5b506102da611a19565b34801561086157600080fd5b50610301610870366004612887565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108aa57600080fd5b5061032b611bcc565b3480156108bf57600080fd5b506102da6108ce366004612865565b611bd9565b3480156108df57600080fd5b506103b9600e5481565b6040513481527feac3bc00eb8bc276e61d902ebf696db93b7ee1cf44f1b16d6da1111427825e9e9060200160405180910390a1565b60006001600160e01b031982166380ac58cd60e01b148061094f57506001600160e01b03198216635b5e139f60e01b145b8061096a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461097f90612fbe565b80601f01602080910402602001604051908101604052809291908181526020018280546109ab90612fbe565b80156109f85780601f106109cd576101008083540402835291602001916109f8565b820191906000526020600020905b8154815290600101906020018083116109db57829003601f168201915b5050505050905090565b6000610a0d82611c74565b610a735760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a9a826111ea565b9050806001600160a01b0316836001600160a01b03161415610b085760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a6a565b336001600160a01b0382161480610b245750610b248133610870565b610b965760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a6a565b610ba08383611c91565b505050565b6006546001600160a01b03163314610bcf5760405162461bcd60e51b8152600401610a6a90612e42565b610bd881611c74565b610bf45760405162461bcd60e51b8152600401610a6a90612dc2565b600081815260166020526040902060010154429015801590610c3457506000828152601660205260409020600101546276a70090610c329083612f7b565b115b610ca65760405162461bcd60e51b815260206004820152603960248201527f43616e206f6e6c7920776974686472617720756e636c61696d6564203930206460448201527f617973206166746572205061796f7574732061726520736574000000000000006064820152608401610a6a565b60008281526016602052604080822080549083905590519091906001600160a01b0386169083908381818185875af1925050503d8060008114610d05576040519150601f19603f3d011682016040523d82523d6000602084013e610d0a565b606091505b5050905080610d4e5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610a6a565b5050505050565b6000610d6060085490565b905090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ddf5760405163073e64fd60e21b81523360048201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610a6a565b610de98282611cff565b5050565b610df73382611d35565b610e135760405162461bcd60e51b8152600401610a6a90612e77565b610ba0838383611e1f565b60178181548110610e2e57600080fd5b600091825260209091200154905081565b6006546001600160a01b03163314610e695760405162461bcd60e51b8152600401610a6a90612e42565b8115610e755760155550565b60145550565b6006546001600160a01b03163314610ea55760405162461bcd60e51b8152600401610a6a90612e42565b610eaf8135611c74565b610ecb5760405162461bcd60e51b8152600401610a6a90612dc2565b8035600090815260166020526040902054158015610efa57508035600090815260166020526040902060010154155b610f465760405162461bcd60e51b815260206004820152601e60248201527f5061796f757420616c72656164792073657420696e20746865207061737400006044820152606401610a6a565b601254610100900460ff16610f955760405162461bcd60e51b81526020600482015260156024820152744d75737420626520696e2067616d6520706861736560581b6044820152606401610a6a565b6040805180820182526020808401358083524282840181815286356000818152601690955286852086518155915160019283015560178054928301815585527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c159091018190559451909491927fd5d5d049e9608f1efc24130fb8104fb6919491de8667a9d7aad9efe3d24892d291a3505050565b610ba08383836040518060200160405280600081525061191a565b600061104f82611c74565b61106b5760405162461bcd60e51b8152600401610a6a90612dc2565b600c546110ba5760405162461bcd60e51b815260206004820152601f60248201527f6c696e6b2072616e646f6d20776f72647320646f65736e2774206578697374006044820152606401610a6a565b60085482600c6000815481106110d2576110d2613072565b90600052602060002001546110e79190612f30565b6110f19190613032565b61096a906001612f30565b6006546001600160a01b031633146111265760405162461bcd60e51b8152600401610a6a90612e42565b600b55565b6002600754141561114e5760405162461bcd60e51b8152600401610a6a90612ec8565b60026007556015544210156111755760405162461bcd60e51b8152600401610a6a90612cd6565b61118181346000611fc6565b61118b8133612134565b506001600755565b6060600c8054806020026020016040519081016040528092919081815260200182805480156109f857602002820191906000526020600020905b8154815260200190600101908083116111cd575050505050905090565b6000818152600260205260408120546001600160a01b03168061096a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610a6a565b600260075414156112845760405162461bcd60e51b8152600401610a6a90612ec8565b60026007556014544210156112ab5760405162461bcd60e51b8152600401610a6a90612cd6565b6112b4336113f1565b156113135760405162461bcd60e51b815260206004820152602960248201527f57686974656c6973742063616e2774206d696e74206d6f7265207468616e206f6044820152681b99481d1a58dad95d60ba1b6064820152608401610a6a565b61131f83346001611fc6565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061139983838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601854915084905061217d565b6113dc5760405162461bcd60e51b8152602060048201526014602482015273139bdd081bdb881d1a19481dda1a5d195b1a5cdd60621b6044820152606401610a6a565b6113e68433612134565b505060016007555050565b60006001600160a01b03821661145c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610a6a565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146114a25760405162461bcd60e51b8152600401610a6a90612e42565b6114ac6000612193565b565b601380546114bb90612fbe565b80601f01602080910402602001604051908101604052809291908181526020018280546114e790612fbe565b80156115345780601f1061150957610100808354040283529160200191611534565b820191906000526020600020905b81548152906001019060200180831161151757829003601f168201915b505050505081565b60606001805461097f90612fbe565b600c8181548110610e2e57600080fd5b610de93383836121e5565b6006546001600160a01b031633146115905760405162461bcd60e51b8152600401610a6a90612e42565b60125460ff166115d65760405162461bcd60e51b815260206004820152601160248201527026b4b73a10383430b9b29034b99037b33360791b6044820152606401610a6a565b6012805460ff19169055565b600260075414156116055760405162461bcd60e51b8152600401610a6a90612ec8565b600260075561161381611c74565b61162f5760405162461bcd60e51b8152600401610a6a90612dc2565b33611639826111ea565b6001600160a01b03161461167e5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610a6a565b6000818152601660205260409020600101546116dc5760405162461bcd60e51b815260206004820152601d60248201527f4e6f205061796f75742073657420666f722074686973207469636b65740000006044820152606401610a6a565b6000818152601660205260409020546117305760405162461bcd60e51b815260206004820152601660248201527514185e5bdd5d08105b1c9958591e4810db185a5b595960521b6044820152606401610a6a565b600081815260166020526040808220805490839055905190918291339185917f425e2e0a3c1682ab47811bf16fdcee1b57b4af7706f31c08e7230192e5b8c0819190a4604051600090339083908381818185875af1925050503d80600081146117b5576040519150601f19603f3d011682016040523d82523d6000602084013e6117ba565b606091505b50509050806117fe5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610a6a565b5050600160075550565b6006546001600160a01b031633146118325760405162461bcd60e51b8152600401610a6a90612e42565b601254610100900460ff161561188a5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420737769746368207465616d206c6973747300000000000000006044820152606401610a6a565b600c546118f45760405162461bcd60e51b815260206004820152603260248201527f43616e6e6f742073657420626173652075726920776974686f757420636861696044820152716e6c696e6b2072616e646f6d20776f72647360701b6064820152608401610a6a565b805161190790601390602084019061270e565b50506012805461ff001916610100179055565b6119243383611d35565b6119405760405162461bcd60e51b8152600401610a6a90612e77565b61194c848484846122b4565b50505050565b606061195d82611c74565b6119795760405162461bcd60e51b8152600401610a6a90612dc2565b60006119836122e7565b601254909150610100900460ff1661199b5792915050565b60006119a684611044565b90506000826119b4836122f6565b6040516020016119c5929190612c13565b60408051601f1981840301815282820182526005835264173539b7b760d91b6020848101919091529151909350611a00928492909101612c13565b6040516020818303038152906040529350505050919050565b6006546001600160a01b03163314611a435760405162461bcd60e51b8152600401610a6a90612e42565b60125460ff1615611a665760405162461bcd60e51b8152600401610a6a90612df9565b600c5415611ac05760405162461bcd60e51b815260206004820152602160248201527f52616e646f6d20776f7264732063616e206f6e6c7920626520736574206f6e636044820152606560f81b6064820152608401610a6a565b6000611acb60085490565b11611b185760405162461bcd60e51b815260206004820152601a60248201527f4d7573742068617665207465616d7320746f2073687566666c650000000000006044820152606401610a6a565b600954600b546040516305d3b1d360e41b81526004810191909152600160a01b820467ffffffffffffffff16602482015260056044820152620493e06064820152600160848201526001600160a01b0390911690635d3b1d309060a401602060405180830381600087803b158015611b8f57600080fd5b505af1158015611ba3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc79190612a96565b600e55565b601180546114bb90612fbe565b6006546001600160a01b03163314611c035760405162461bcd60e51b8152600401610a6a90612e42565b6001600160a01b038116611c685760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a6a565b611c7181612193565b50565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611cc6826111ea565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60125460ff1615611d225760405162461bcd60e51b8152600401610a6a90612df9565b8051610ba090600c906020840190612792565b6000611d4082611c74565b611da15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a6a565b6000611dac836111ea565b9050806001600160a01b0316846001600160a01b03161480611df357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80611e175750836001600160a01b0316611e0c84610a02565b6001600160a01b0316145b949350505050565b826001600160a01b0316611e32826111ea565b6001600160a01b031614611e965760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610a6a565b6001600160a01b038216611ef85760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a6a565b611f038383836123f4565b611f0e600082611c91565b6001600160a01b0383166000908152600360205260408120805460019290611f37908490612f7b565b90915550506001600160a01b0382166000908152600360205260408120805460019290611f65908490612f30565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60125460ff1661200c5760405162461bcd60e51b815260206004820152601160248201527026b4b73a10383430b9b29034b99037b33360791b6044820152606401610a6a565b80156120385760018311156120335760405162461bcd60e51b8152600401610a6a90612d73565b612059565b600a8311156120595760405162461bcd60e51b8152600401610a6a90612d73565b600f548361206660085490565b6120709190612f30565b11156120e45760405162461bcd60e51b815260206004820152603b60248201527f43616e2774206d696e74206d6f7265207468616e2074686520746f74616c206e60448201527f756d626572206f6620617661696c61626c65207469636b6574732e00000000006064820152608401610a6a565b826010546120f29190612f5c565b821015610ba05760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f7567682066756e647360801b6044820152606401610a6a565b60005b828163ffffffff161015610ba057612153600880546001019055565b600061215e60085490565b905061216a838261244e565b50806121758161300e565b915050612137565b60008261218a858461258d565b14949350505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156122475760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a6a565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6122bf848484611e1f565b6122cb84848484612601565b61194c5760405162461bcd60e51b8152600401610a6a90612d21565b60606013805461097f90612fbe565b60608161231a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612344578061232e81612ff3565b915061233d9050600a83612f48565b915061231e565b60008167ffffffffffffffff81111561235f5761235f613088565b6040519080825280601f01601f191660200182016040528015612389576020820181803683370190505b5090505b8415611e175761239e600183612f7b565b91506123ab600a86613032565b6123b6906030612f30565b60f81b8183815181106123cb576123cb613072565b60200101906001600160f81b031916908160001a9053506123ed600a86612f48565b945061238d565b60175415610ba05760405162461bcd60e51b815260206004820152602160248201527f4e6f207472616e7366657273206f6e6365207061796f757473206172652073656044820152601d60fa1b6064820152608401610a6a565b6001600160a01b0382166124a45760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a6a565b6124ad81611c74565b156124fa5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a6a565b612506600083836123f4565b6001600160a01b038216600090815260036020526040812080546001929061252f908490612f30565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815b84518110156125f95760008582815181106125af576125af613072565b602002602001015190508083116125d557600083815260208290526040902092506125e6565b600081815260208490526040902092505b50806125f181612ff3565b915050612592565b509392505050565b60006001600160a01b0384163b1561270357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612645903390899088908890600401612c42565b602060405180830381600087803b15801561265f57600080fd5b505af192505050801561268f575060408051601f3d908101601f1916820190925261268c91810190612a18565b60015b6126e9573d8080156126bd576040519150601f19603f3d011682016040523d82523d6000602084013e6126c2565b606091505b5080516126e15760405162461bcd60e51b8152600401610a6a90612d21565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e17565b506001949350505050565b82805461271a90612fbe565b90600052602060002090601f01602090048101928261273c5760008555612782565b82601f1061275557805160ff1916838001178555612782565b82800160010185558215612782579182015b82811115612782578251825591602001919060010190612767565b5061278e9291506127cc565b5090565b8280548282559060005260206000209081019282156127825791602002820182811115612782578251825591602001919060010190612767565b5b8082111561278e57600081556001016127cd565b600067ffffffffffffffff8311156127fb576127fb613088565b61280e601f8401601f1916602001612eff565b905082815283838301111561282257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461285057600080fd5b919050565b8035801515811461285057600080fd5b60006020828403121561287757600080fd5b61288082612839565b9392505050565b6000806040838503121561289a57600080fd5b6128a383612839565b91506128b160208401612839565b90509250929050565b6000806000606084860312156128cf57600080fd5b6128d884612839565b92506128e660208501612839565b9150604084013590509250925092565b6000806000806080858703121561290c57600080fd5b61291585612839565b935061292360208601612839565b925060408501359150606085013567ffffffffffffffff81111561294657600080fd5b8501601f8101871361295757600080fd5b612966878235602084016127e1565b91505092959194509250565b6000806040838503121561298557600080fd5b61298e83612839565b91506128b160208401612855565b600080604083850312156129af57600080fd5b6129b883612839565b946020939093013593505050565b600080604083850312156129d957600080fd5b6129b883612855565b6000602082840312156129f457600080fd5b5035919050565b600060208284031215612a0d57600080fd5b81356128808161309e565b600060208284031215612a2a57600080fd5b81516128808161309e565b600060208284031215612a4757600080fd5b813567ffffffffffffffff811115612a5e57600080fd5b8201601f81018413612a6f57600080fd5b611e17848235602084016127e1565b600060408284031215612a9057600080fd5b50919050565b600060208284031215612aa857600080fd5b5051919050565b600080600060408486031215612ac457600080fd5b83359250602084013567ffffffffffffffff80821115612ae357600080fd5b818601915086601f830112612af757600080fd5b813581811115612b0657600080fd5b8760208260051b8501011115612b1b57600080fd5b6020830194508093505050509250925092565b60008060408385031215612b4157600080fd5b8235915060208084013567ffffffffffffffff80821115612b6157600080fd5b818601915086601f830112612b7557600080fd5b813581811115612b8757612b87613088565b8060051b9150612b98848301612eff565b8181528481019084860184860187018b1015612bb357600080fd5b600095505b83861015612bd6578035835260019590950194918601918601612bb8565b508096505050505050509250929050565b60008151808452612bff816020860160208601612f92565b601f01601f19169290920160200192915050565b60008351612c25818460208801612f92565b835190830190612c39818360208801612f92565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612c7590830184612be7565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612cb757835183529284019291840191600101612c9b565b50909695505050505050565b6020815260006128806020830184612be7565b6020808252602b908201527f43616e2774206d696e74207965742e2054727920616761696e20696e2061206660408201526a32bb9039b2b1b7b732399760a91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602f908201527f43616e2774206d696e742074686973206d616e79207469636b65747320696e2060408201526e37b732903a3930b739b0b1ba34b7b760891b606082015260800190565b6020808252601b908201527f717565727920666f72206e6f6e6578697374656e7420746f6b656e0000000000604082015260600190565b60208082526029908201527f5465616d732063616e6e6f742062652073657420647572696e6720746865206d604082015268696e7420706861736560b81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612f2857612f28613088565b604052919050565b60008219821115612f4357612f43613046565b500190565b600082612f5757612f5761305c565b500490565b6000816000190483118215151615612f7657612f76613046565b500290565b600082821015612f8d57612f8d613046565b500390565b60005b83811015612fad578181015183820152602001612f95565b8381111561194c5750506000910152565b600181811c90821680612fd257607f821691505b60208210811415612a9057634e487b7160e01b600052602260045260246000fd5b600060001982141561300757613007613046565b5060010190565b600063ffffffff8083168181141561302857613028613046565b6001019392505050565b6000826130415761304161305c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611c7157600080fdfea2646970667358221220b5286d5d216ebf71508f418ce97d2a22f5eb5e26c7493776ccc3ee74732f815364736f6c63430008070033000000000000000000000000000000000000000000000000000000000000020f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e699098af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000637838a0000000000000000000000000000000000000000000000000000000006378e1609717d8c58639bca6feee435e845a2c71af419a6f10dcf94dcb7344218ef56c8300000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d6244664a77457334414b713654356a63514a6e4e417778527237786347324b4235374d5650473370394174430000000000000000000000000000000000000000000000000000000000000000000000000000000000001846494641202d20576f726c642043757020233120323032320000000000000000

Deployed Bytecode

0x6080604052600436106102cd5760003560e01c80636e08423511610175578063a807e1a3116100dc578063d5c30ad111610095578063e985e9c51161006f578063e985e9c514610855578063f0871e541461089e578063f2fde38b146108b3578063fb96e649146108d357600080fd5b8063d5c30ad1146107e9578063da1f7bff146107ff578063e0c862891461084057600080fd5b8063a807e1a314610759578063b21c79351461076e578063b47654f414610781578063b88d4fde146107a1578063c87b56dd146107c1578063d1d9165d146107e157600080fd5b80638da5cb5b1161012e5780638da5cb5b146106ad57806395d89b41146106cb57806399eab53c146106e05780639bcc5fa3146106ff5780639c7b99a614610719578063a22cb4651461073957600080fd5b80636e0842351461062057806370a0823114610636578063714cff5614610656578063715018a61461066d57806376d4df2c1461068257806381e55e261461069857600080fd5b80634051a5a6116102345780635356d9e2116101ed5780635bb8ae7c116101c75780635bb8ae7c146105845780636352211e146105cd5780636672dfac146105ed5780636790884a1461060d57600080fd5b80635356d9e21461053657806353a8bf221461054c5780635867141e1461056257600080fd5b80634051a5a61461048d57806342842e0e146104ad5780634286918c146104cd57806344b7c545146104ed5780634d456dcb1461050d5780634eb5659f1461052057600080fd5b806318160ddd1161028657806318160ddd146103c75780631fe543e3146103dc57806323b872dd146103fc5780632b5b65391461041c57806333d0da4f1461043c5780633cb6a8d11461045c57600080fd5b806301ffc9a7146102e157806306fdde0314610316578063081812fc14610338578063095ea7b3146103705780630de5c71314610390578063132d3f6a146103a357600080fd5b366102dc576102da6108e9565b005b600080fd5b3480156102ed57600080fd5b506103016102fc3660046129fb565b61091e565b60405190151581526020015b60405180910390f35b34801561032257600080fd5b5061032b610970565b60405161030d9190612cc3565b34801561034457600080fd5b506103586103533660046129e2565b610a02565b6040516001600160a01b03909116815260200161030d565b34801561037c57600080fd5b506102da61038b36600461299c565b610a8f565b6102da61039e36600461299c565b610ba5565b3480156103af57600080fd5b506103b960185481565b60405190815260200161030d565b3480156103d357600080fd5b506103b9610d55565b3480156103e857600080fd5b506102da6103f7366004612b2e565b610d65565b34801561040857600080fd5b506102da6104173660046128ba565b610ded565b34801561042857600080fd5b506103b96104373660046129e2565b610e1e565b34801561044857600080fd5b506102da6104573660046129c6565b610e3f565b34801561046857600080fd5b5061032b60405180604001604052806005815260200164173539b7b760d91b81525081565b34801561049957600080fd5b506102da6104a8366004612a7e565b610e7b565b3480156104b957600080fd5b506102da6104c83660046128ba565b611029565b3480156104d957600080fd5b506103b96104e83660046129e2565b611044565b3480156104f957600080fd5b506102da6105083660046129e2565b6110fc565b6102da61051b3660046129e2565b61112b565b34801561052c57600080fd5b506103b960105481565b34801561054257600080fd5b506103b960145481565b34801561055857600080fd5b506103b9600b5481565b34801561056e57600080fd5b50610577611193565b60405161030d9190612c7f565b34801561059057600080fd5b506105b861059f3660046129e2565b6016602052600090815260409020805460019091015482565b6040805192835260208301919091520161030d565b3480156105d957600080fd5b506103586105e83660046129e2565b6111ea565b3480156105f957600080fd5b50600a54610358906001600160a01b031681565b6102da61061b366004612aaf565b611261565b34801561062c57600080fd5b506103b9600d5481565b34801561064257600080fd5b506103b9610651366004612865565b6113f1565b34801561066257600080fd5b506008546103b99081565b34801561067957600080fd5b506102da611478565b34801561068e57600080fd5b506103b9600f5481565b3480156106a457600080fd5b5061032b6114ae565b3480156106b957600080fd5b506006546001600160a01b0316610358565b3480156106d757600080fd5b5061032b61153c565b3480156106ec57600080fd5b5060125461030190610100900460ff1681565b34801561070b57600080fd5b506012546103019060ff1681565b34801561072557600080fd5b506103b96107343660046129e2565b61154b565b34801561074557600080fd5b506102da610754366004612972565b61155b565b34801561076557600080fd5b506102da611566565b6102da61077c3660046129e2565b6115e2565b34801561078d57600080fd5b506102da61079c366004612a35565b611808565b3480156107ad57600080fd5b506102da6107bc3660046128f6565b61191a565b3480156107cd57600080fd5b5061032b6107dc3660046129e2565b611952565b6102da6108e9565b3480156107f557600080fd5b506103b960155481565b34801561080b57600080fd5b5060095461082790600160a01b900467ffffffffffffffff1681565b60405167ffffffffffffffff909116815260200161030d565b34801561084c57600080fd5b506102da611a19565b34801561086157600080fd5b50610301610870366004612887565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108aa57600080fd5b5061032b611bcc565b3480156108bf57600080fd5b506102da6108ce366004612865565b611bd9565b3480156108df57600080fd5b506103b9600e5481565b6040513481527feac3bc00eb8bc276e61d902ebf696db93b7ee1cf44f1b16d6da1111427825e9e9060200160405180910390a1565b60006001600160e01b031982166380ac58cd60e01b148061094f57506001600160e01b03198216635b5e139f60e01b145b8061096a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461097f90612fbe565b80601f01602080910402602001604051908101604052809291908181526020018280546109ab90612fbe565b80156109f85780601f106109cd576101008083540402835291602001916109f8565b820191906000526020600020905b8154815290600101906020018083116109db57829003601f168201915b5050505050905090565b6000610a0d82611c74565b610a735760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a9a826111ea565b9050806001600160a01b0316836001600160a01b03161415610b085760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a6a565b336001600160a01b0382161480610b245750610b248133610870565b610b965760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a6a565b610ba08383611c91565b505050565b6006546001600160a01b03163314610bcf5760405162461bcd60e51b8152600401610a6a90612e42565b610bd881611c74565b610bf45760405162461bcd60e51b8152600401610a6a90612dc2565b600081815260166020526040902060010154429015801590610c3457506000828152601660205260409020600101546276a70090610c329083612f7b565b115b610ca65760405162461bcd60e51b815260206004820152603960248201527f43616e206f6e6c7920776974686472617720756e636c61696d6564203930206460448201527f617973206166746572205061796f7574732061726520736574000000000000006064820152608401610a6a565b60008281526016602052604080822080549083905590519091906001600160a01b0386169083908381818185875af1925050503d8060008114610d05576040519150601f19603f3d011682016040523d82523d6000602084013e610d0a565b606091505b5050905080610d4e5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610a6a565b5050505050565b6000610d6060085490565b905090565b336001600160a01b037f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e699091614610ddf5760405163073e64fd60e21b81523360048201526001600160a01b037f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e69909166024820152604401610a6a565b610de98282611cff565b5050565b610df73382611d35565b610e135760405162461bcd60e51b8152600401610a6a90612e77565b610ba0838383611e1f565b60178181548110610e2e57600080fd5b600091825260209091200154905081565b6006546001600160a01b03163314610e695760405162461bcd60e51b8152600401610a6a90612e42565b8115610e755760155550565b60145550565b6006546001600160a01b03163314610ea55760405162461bcd60e51b8152600401610a6a90612e42565b610eaf8135611c74565b610ecb5760405162461bcd60e51b8152600401610a6a90612dc2565b8035600090815260166020526040902054158015610efa57508035600090815260166020526040902060010154155b610f465760405162461bcd60e51b815260206004820152601e60248201527f5061796f757420616c72656164792073657420696e20746865207061737400006044820152606401610a6a565b601254610100900460ff16610f955760405162461bcd60e51b81526020600482015260156024820152744d75737420626520696e2067616d6520706861736560581b6044820152606401610a6a565b6040805180820182526020808401358083524282840181815286356000818152601690955286852086518155915160019283015560178054928301815585527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c159091018190559451909491927fd5d5d049e9608f1efc24130fb8104fb6919491de8667a9d7aad9efe3d24892d291a3505050565b610ba08383836040518060200160405280600081525061191a565b600061104f82611c74565b61106b5760405162461bcd60e51b8152600401610a6a90612dc2565b600c546110ba5760405162461bcd60e51b815260206004820152601f60248201527f6c696e6b2072616e646f6d20776f72647320646f65736e2774206578697374006044820152606401610a6a565b60085482600c6000815481106110d2576110d2613072565b90600052602060002001546110e79190612f30565b6110f19190613032565b61096a906001612f30565b6006546001600160a01b031633146111265760405162461bcd60e51b8152600401610a6a90612e42565b600b55565b6002600754141561114e5760405162461bcd60e51b8152600401610a6a90612ec8565b60026007556015544210156111755760405162461bcd60e51b8152600401610a6a90612cd6565b61118181346000611fc6565b61118b8133612134565b506001600755565b6060600c8054806020026020016040519081016040528092919081815260200182805480156109f857602002820191906000526020600020905b8154815260200190600101908083116111cd575050505050905090565b6000818152600260205260408120546001600160a01b03168061096a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610a6a565b600260075414156112845760405162461bcd60e51b8152600401610a6a90612ec8565b60026007556014544210156112ab5760405162461bcd60e51b8152600401610a6a90612cd6565b6112b4336113f1565b156113135760405162461bcd60e51b815260206004820152602960248201527f57686974656c6973742063616e2774206d696e74206d6f7265207468616e206f6044820152681b99481d1a58dad95d60ba1b6064820152608401610a6a565b61131f83346001611fc6565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061139983838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601854915084905061217d565b6113dc5760405162461bcd60e51b8152602060048201526014602482015273139bdd081bdb881d1a19481dda1a5d195b1a5cdd60621b6044820152606401610a6a565b6113e68433612134565b505060016007555050565b60006001600160a01b03821661145c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610a6a565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146114a25760405162461bcd60e51b8152600401610a6a90612e42565b6114ac6000612193565b565b601380546114bb90612fbe565b80601f01602080910402602001604051908101604052809291908181526020018280546114e790612fbe565b80156115345780601f1061150957610100808354040283529160200191611534565b820191906000526020600020905b81548152906001019060200180831161151757829003601f168201915b505050505081565b60606001805461097f90612fbe565b600c8181548110610e2e57600080fd5b610de93383836121e5565b6006546001600160a01b031633146115905760405162461bcd60e51b8152600401610a6a90612e42565b60125460ff166115d65760405162461bcd60e51b815260206004820152601160248201527026b4b73a10383430b9b29034b99037b33360791b6044820152606401610a6a565b6012805460ff19169055565b600260075414156116055760405162461bcd60e51b8152600401610a6a90612ec8565b600260075561161381611c74565b61162f5760405162461bcd60e51b8152600401610a6a90612dc2565b33611639826111ea565b6001600160a01b03161461167e5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610a6a565b6000818152601660205260409020600101546116dc5760405162461bcd60e51b815260206004820152601d60248201527f4e6f205061796f75742073657420666f722074686973207469636b65740000006044820152606401610a6a565b6000818152601660205260409020546117305760405162461bcd60e51b815260206004820152601660248201527514185e5bdd5d08105b1c9958591e4810db185a5b595960521b6044820152606401610a6a565b600081815260166020526040808220805490839055905190918291339185917f425e2e0a3c1682ab47811bf16fdcee1b57b4af7706f31c08e7230192e5b8c0819190a4604051600090339083908381818185875af1925050503d80600081146117b5576040519150601f19603f3d011682016040523d82523d6000602084013e6117ba565b606091505b50509050806117fe5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610a6a565b5050600160075550565b6006546001600160a01b031633146118325760405162461bcd60e51b8152600401610a6a90612e42565b601254610100900460ff161561188a5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420737769746368207465616d206c6973747300000000000000006044820152606401610a6a565b600c546118f45760405162461bcd60e51b815260206004820152603260248201527f43616e6e6f742073657420626173652075726920776974686f757420636861696044820152716e6c696e6b2072616e646f6d20776f72647360701b6064820152608401610a6a565b805161190790601390602084019061270e565b50506012805461ff001916610100179055565b6119243383611d35565b6119405760405162461bcd60e51b8152600401610a6a90612e77565b61194c848484846122b4565b50505050565b606061195d82611c74565b6119795760405162461bcd60e51b8152600401610a6a90612dc2565b60006119836122e7565b601254909150610100900460ff1661199b5792915050565b60006119a684611044565b90506000826119b4836122f6565b6040516020016119c5929190612c13565b60408051601f1981840301815282820182526005835264173539b7b760d91b6020848101919091529151909350611a00928492909101612c13565b6040516020818303038152906040529350505050919050565b6006546001600160a01b03163314611a435760405162461bcd60e51b8152600401610a6a90612e42565b60125460ff1615611a665760405162461bcd60e51b8152600401610a6a90612df9565b600c5415611ac05760405162461bcd60e51b815260206004820152602160248201527f52616e646f6d20776f7264732063616e206f6e6c7920626520736574206f6e636044820152606560f81b6064820152608401610a6a565b6000611acb60085490565b11611b185760405162461bcd60e51b815260206004820152601a60248201527f4d7573742068617665207465616d7320746f2073687566666c650000000000006044820152606401610a6a565b600954600b546040516305d3b1d360e41b81526004810191909152600160a01b820467ffffffffffffffff16602482015260056044820152620493e06064820152600160848201526001600160a01b0390911690635d3b1d309060a401602060405180830381600087803b158015611b8f57600080fd5b505af1158015611ba3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc79190612a96565b600e55565b601180546114bb90612fbe565b6006546001600160a01b03163314611c035760405162461bcd60e51b8152600401610a6a90612e42565b6001600160a01b038116611c685760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a6a565b611c7181612193565b50565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611cc6826111ea565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60125460ff1615611d225760405162461bcd60e51b8152600401610a6a90612df9565b8051610ba090600c906020840190612792565b6000611d4082611c74565b611da15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a6a565b6000611dac836111ea565b9050806001600160a01b0316846001600160a01b03161480611df357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80611e175750836001600160a01b0316611e0c84610a02565b6001600160a01b0316145b949350505050565b826001600160a01b0316611e32826111ea565b6001600160a01b031614611e965760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610a6a565b6001600160a01b038216611ef85760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a6a565b611f038383836123f4565b611f0e600082611c91565b6001600160a01b0383166000908152600360205260408120805460019290611f37908490612f7b565b90915550506001600160a01b0382166000908152600360205260408120805460019290611f65908490612f30565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60125460ff1661200c5760405162461bcd60e51b815260206004820152601160248201527026b4b73a10383430b9b29034b99037b33360791b6044820152606401610a6a565b80156120385760018311156120335760405162461bcd60e51b8152600401610a6a90612d73565b612059565b600a8311156120595760405162461bcd60e51b8152600401610a6a90612d73565b600f548361206660085490565b6120709190612f30565b11156120e45760405162461bcd60e51b815260206004820152603b60248201527f43616e2774206d696e74206d6f7265207468616e2074686520746f74616c206e60448201527f756d626572206f6620617661696c61626c65207469636b6574732e00000000006064820152608401610a6a565b826010546120f29190612f5c565b821015610ba05760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f7567682066756e647360801b6044820152606401610a6a565b60005b828163ffffffff161015610ba057612153600880546001019055565b600061215e60085490565b905061216a838261244e565b50806121758161300e565b915050612137565b60008261218a858461258d565b14949350505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156122475760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a6a565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6122bf848484611e1f565b6122cb84848484612601565b61194c5760405162461bcd60e51b8152600401610a6a90612d21565b60606013805461097f90612fbe565b60608161231a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612344578061232e81612ff3565b915061233d9050600a83612f48565b915061231e565b60008167ffffffffffffffff81111561235f5761235f613088565b6040519080825280601f01601f191660200182016040528015612389576020820181803683370190505b5090505b8415611e175761239e600183612f7b565b91506123ab600a86613032565b6123b6906030612f30565b60f81b8183815181106123cb576123cb613072565b60200101906001600160f81b031916908160001a9053506123ed600a86612f48565b945061238d565b60175415610ba05760405162461bcd60e51b815260206004820152602160248201527f4e6f207472616e7366657273206f6e6365207061796f757473206172652073656044820152601d60fa1b6064820152608401610a6a565b6001600160a01b0382166124a45760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a6a565b6124ad81611c74565b156124fa5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a6a565b612506600083836123f4565b6001600160a01b038216600090815260036020526040812080546001929061252f908490612f30565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815b84518110156125f95760008582815181106125af576125af613072565b602002602001015190508083116125d557600083815260208290526040902092506125e6565b600081815260208490526040902092505b50806125f181612ff3565b915050612592565b509392505050565b60006001600160a01b0384163b1561270357604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612645903390899088908890600401612c42565b602060405180830381600087803b15801561265f57600080fd5b505af192505050801561268f575060408051601f3d908101601f1916820190925261268c91810190612a18565b60015b6126e9573d8080156126bd576040519150601f19603f3d011682016040523d82523d6000602084013e6126c2565b606091505b5080516126e15760405162461bcd60e51b8152600401610a6a90612d21565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e17565b506001949350505050565b82805461271a90612fbe565b90600052602060002090601f01602090048101928261273c5760008555612782565b82601f1061275557805160ff1916838001178555612782565b82800160010185558215612782579182015b82811115612782578251825591602001919060010190612767565b5061278e9291506127cc565b5090565b8280548282559060005260206000209081019282156127825791602002820182811115612782578251825591602001919060010190612767565b5b8082111561278e57600081556001016127cd565b600067ffffffffffffffff8311156127fb576127fb613088565b61280e601f8401601f1916602001612eff565b905082815283838301111561282257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461285057600080fd5b919050565b8035801515811461285057600080fd5b60006020828403121561287757600080fd5b61288082612839565b9392505050565b6000806040838503121561289a57600080fd5b6128a383612839565b91506128b160208401612839565b90509250929050565b6000806000606084860312156128cf57600080fd5b6128d884612839565b92506128e660208501612839565b9150604084013590509250925092565b6000806000806080858703121561290c57600080fd5b61291585612839565b935061292360208601612839565b925060408501359150606085013567ffffffffffffffff81111561294657600080fd5b8501601f8101871361295757600080fd5b612966878235602084016127e1565b91505092959194509250565b6000806040838503121561298557600080fd5b61298e83612839565b91506128b160208401612855565b600080604083850312156129af57600080fd5b6129b883612839565b946020939093013593505050565b600080604083850312156129d957600080fd5b6129b883612855565b6000602082840312156129f457600080fd5b5035919050565b600060208284031215612a0d57600080fd5b81356128808161309e565b600060208284031215612a2a57600080fd5b81516128808161309e565b600060208284031215612a4757600080fd5b813567ffffffffffffffff811115612a5e57600080fd5b8201601f81018413612a6f57600080fd5b611e17848235602084016127e1565b600060408284031215612a9057600080fd5b50919050565b600060208284031215612aa857600080fd5b5051919050565b600080600060408486031215612ac457600080fd5b83359250602084013567ffffffffffffffff80821115612ae357600080fd5b818601915086601f830112612af757600080fd5b813581811115612b0657600080fd5b8760208260051b8501011115612b1b57600080fd5b6020830194508093505050509250925092565b60008060408385031215612b4157600080fd5b8235915060208084013567ffffffffffffffff80821115612b6157600080fd5b818601915086601f830112612b7557600080fd5b813581811115612b8757612b87613088565b8060051b9150612b98848301612eff565b8181528481019084860184860187018b1015612bb357600080fd5b600095505b83861015612bd6578035835260019590950194918601918601612bb8565b508096505050505050509250929050565b60008151808452612bff816020860160208601612f92565b601f01601f19169290920160200192915050565b60008351612c25818460208801612f92565b835190830190612c39818360208801612f92565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612c7590830184612be7565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612cb757835183529284019291840191600101612c9b565b50909695505050505050565b6020815260006128806020830184612be7565b6020808252602b908201527f43616e2774206d696e74207965742e2054727920616761696e20696e2061206660408201526a32bb9039b2b1b7b732399760a91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602f908201527f43616e2774206d696e742074686973206d616e79207469636b65747320696e2060408201526e37b732903a3930b739b0b1ba34b7b760891b606082015260800190565b6020808252601b908201527f717565727920666f72206e6f6e6578697374656e7420746f6b656e0000000000604082015260600190565b60208082526029908201527f5465616d732063616e6e6f742062652073657420647572696e6720746865206d604082015268696e7420706861736560b81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715612f2857612f28613088565b604052919050565b60008219821115612f4357612f43613046565b500190565b600082612f5757612f5761305c565b500490565b6000816000190483118215151615612f7657612f76613046565b500290565b600082821015612f8d57612f8d613046565b500390565b60005b83811015612fad578181015183820152602001612f95565b8381111561194c5750506000910152565b600181811c90821680612fd257607f821691505b60208210811415612a9057634e487b7160e01b600052602260045260246000fd5b600060001982141561300757613007613046565b5060010190565b600063ffffffff8083168181141561302857613028613046565b6001019392505050565b6000826130415761304161305c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611c7157600080fdfea2646970667358221220b5286d5d216ebf71508f418ce97d2a22f5eb5e26c7493776ccc3ee74732f815364736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000020f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e699098af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000637838a0000000000000000000000000000000000000000000000000000000006378e1609717d8c58639bca6feee435e845a2c71af419a6f10dcf94dcb7344218ef56c8300000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d6244664a77457334414b713654356a63514a6e4e417778527237786347324b4235374d5650473370394174430000000000000000000000000000000000000000000000000000000000000000000000000000000000001846494641202d20576f726c642043757020233120323032320000000000000000

-----Decoded View---------------
Arg [0] : _linkSubscriptionId (uint64): 527
Arg [1] : _vrfCoordinatorAddress (address): 0x271682DEB8C4E0901D1a1550aD2e64D568E69909
Arg [2] : _keyHash (bytes32): 0x8af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef
Arg [3] : _baselineURIMintPhase (string): ipfs://QmbDfJwEs4AKq6T5jcQJnNAwxRr7xcG2KB57MVPG3p9AtC
Arg [4] : _maxTickets (uint256): 200
Arg [5] : _mintFee (uint256): 0
Arg [6] : _dtMintStartWhitelist (uint256): 1668823200
Arg [7] : _dtMintStartPublic (uint256): 1668866400
Arg [8] : _merkleRoot (bytes32): 0x9717d8c58639bca6feee435e845a2c71af419a6f10dcf94dcb7344218ef56c83
Arg [9] : _contestDescription (string): FIFA - World Cup #1 2022

-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000000000020f
Arg [1] : 000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e69909
Arg [2] : 8af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [4] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [6] : 00000000000000000000000000000000000000000000000000000000637838a0
Arg [7] : 000000000000000000000000000000000000000000000000000000006378e160
Arg [8] : 9717d8c58639bca6feee435e845a2c71af419a6f10dcf94dcb7344218ef56c83
Arg [9] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [11] : 697066733a2f2f516d6244664a77457334414b713654356a63514a6e4e417778
Arg [12] : 527237786347324b4235374d5650473370394174430000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000018
Arg [14] : 46494641202d20576f726c642043757020233120323032320000000000000000


Deployed Bytecode Sourcemap

55986:8780:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64747:8;:6;:8::i;:::-;55986:8780;;;;;21643:305;;;;;;;;;;-1:-1:-1;21643:305:0;;;;;:::i;:::-;;:::i;:::-;;;9425:14:1;;9418:22;9400:41;;9388:2;9373:18;21643:305:0;;;;;;;;22588:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24148:221::-;;;;;;;;;;-1:-1:-1;24148:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7777:32:1;;;7759:51;;7747:2;7732:18;24148:221:0;7613:203:1;23671:411:0;;;;;;;;;;-1:-1:-1;23671:411:0;;;;;:::i;:::-;;:::i;64025:600::-;;;;;;:::i;:::-;;:::i;57442:25::-;;;;;;;;;;;;;;;;;;;9598::1;;;9586:2;9571:18;57442:25:0;9452:177:1;60379:93:0;;;;;;;;;;;;;:::i;46179:261::-;;;;;;;;;;-1:-1:-1;46179:261:0;;;;;:::i;:::-;;:::i;24898:339::-;;;;;;;;;;-1:-1:-1;24898:339:0;;;;;:::i;:::-;;:::i;57171:31::-;;;;;;;;;;-1:-1:-1;57171:31:0;;;;;:::i;:::-;;:::i;61633:227::-;;;;;;;;;;-1:-1:-1;61633:227:0;;;;;:::i;:::-;;:::i;56753:46::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;56753:46:0;;;;;62761:600;;;;;;;;;;-1:-1:-1;62761:600:0;;;;;:::i;:::-;;:::i;25308:185::-;;;;;;;;;;-1:-1:-1;25308:185:0;;;;;:::i;:::-;;:::i;61031:314::-;;;;;;;;;;-1:-1:-1;61031:314:0;;;;;:::i;:::-;;:::i;61866:92::-;;;;;;;;;;-1:-1:-1;61866:92:0;;;;;:::i;:::-;;:::i;59688:257::-;;;;;;:::i;:::-;;:::i;56588:22::-;;;;;;;;;;;;;;;;56900:35;;;;;;;;;;;;;;;;56284:22;;;;;;;;;;;;;;;;62653:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;57106:60::-;;;;;;;;;;-1:-1:-1;57106:60:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;25374:25:1;;;25430:2;25415:18;;25408:34;;;;25347:18;57106:60:0;25200:248:1;22282:239:0;;;;;;;;;;-1:-1:-1;22282:239:0;;;;;:::i;:::-;;:::i;56243:36::-;;;;;;;;;;-1:-1:-1;56243:36:0;;;;-1:-1:-1;;;;;56243:36:0;;;59147:535;;;;;;:::i;:::-;;:::i;56472:31::-;;;;;;;;;;;;;;;;22012:208;;;;;;;;;;-1:-1:-1;22012:208:0;;;;;:::i;:::-;;:::i;56111:32::-;;;;;;;;;;-1:-1:-1;56111:32:0;;;;;;48166:103;;;;;;;;;;;;;:::i;56558:25::-;;;;;;;;;;;;;;;;56723;;;;;;;;;;;;;:::i;47515:87::-;;;;;;;;;;-1:-1:-1;47588:6:0;;-1:-1:-1;;;;;47588:6:0;47515:87;;22757:104;;;;;;;;;;;;;:::i;56687:31::-;;;;;;;;;;-1:-1:-1;56687:31:0;;;;;;;;;;;56652:30;;;;;;;;;;-1:-1:-1;56652:30:0;;;;;;;;56435:32;;;;;;;;;;-1:-1:-1;56435:32:0;;;;;:::i;:::-;;:::i;24441:155::-;;;;;;;;;;-1:-1:-1;24441:155:0;;;;;:::i;:::-;;:::i;60245:128::-;;;;;;;;;;;;;:::i;63367:652::-;;;;;;:::i;:::-;;:::i;59951:288::-;;;;;;;;;;-1:-1:-1;59951:288:0;;;;;:::i;:::-;;:::i;25564:328::-;;;;;;;;;;-1:-1:-1;25564:328:0;;;;;:::i;:::-;;:::i;60582:443::-;;;;;;;;;;-1:-1:-1;60582:443:0;;;;;:::i;:::-;;:::i;64631:73::-;;;:::i;56940:32::-;;;;;;;;;;;;;;;;56206;;;;;;;;;;-1:-1:-1;56206:32:0;;;;-1:-1:-1;;;56206:32:0;;;;;;;;;25627:18:1;25615:31;;;25597:50;;25585:2;25570:18;56206:32:0;25453:200:1;61964:446:0;;;;;;;;;;;;;:::i;24667:164::-;;;;;;;;;;-1:-1:-1;24667:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;24788:25:0;;;24764:4;24788:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24667:164;56615:32;;;;;;;;;;;;;:::i;48424:201::-;;;;;;;;;;-1:-1:-1;48424:201:0;;;;;:::i;:::-;;:::i;56508:24::-;;;;;;;;;;;;;;;;64631:73;64676:22;;64688:9;9598:25:1;;64676:22:0;;9586:2:1;9571:18;64676:22:0;;;;;;;64631:73::o;21643:305::-;21745:4;-1:-1:-1;;;;;;21782:40:0;;-1:-1:-1;;;21782:40:0;;:105;;-1:-1:-1;;;;;;;21839:48:0;;-1:-1:-1;;;21839:48:0;21782:105;:158;;;-1:-1:-1;;;;;;;;;;20175:40:0;;;21904:36;21762:178;21643:305;-1:-1:-1;;21643:305:0:o;22588:100::-;22642:13;22675:5;22668:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22588:100;:::o;24148:221::-;24224:7;24252:16;24260:7;24252;:16::i;:::-;24244:73;;;;-1:-1:-1;;;24244:73:0;;20232:2:1;24244:73:0;;;20214:21:1;20271:2;20251:18;;;20244:30;20310:34;20290:18;;;20283:62;-1:-1:-1;;;20361:18:1;;;20354:42;20413:19;;24244:73:0;;;;;;;;;-1:-1:-1;24337:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24337:24:0;;24148:221::o;23671:411::-;23752:13;23768:23;23783:7;23768:14;:23::i;:::-;23752:39;;23816:5;-1:-1:-1;;;;;23810:11:0;:2;-1:-1:-1;;;;;23810:11:0;;;23802:57;;;;-1:-1:-1;;;23802:57:0;;22623:2:1;23802:57:0;;;22605:21:1;22662:2;22642:18;;;22635:30;22701:34;22681:18;;;22674:62;-1:-1:-1;;;22752:18:1;;;22745:31;22793:19;;23802:57:0;22421:397:1;23802:57:0;16929:10;-1:-1:-1;;;;;23894:21:0;;;;:62;;-1:-1:-1;23919:37:0;23936:5;16929:10;24667:164;:::i;23919:37::-;23872:168;;;;-1:-1:-1;;;23872:168:0;;17796:2:1;23872:168:0;;;17778:21:1;17835:2;17815:18;;;17808:30;17874:34;17854:18;;;17847:62;17945:26;17925:18;;;17918:54;17989:19;;23872:168:0;17594:420:1;23872:168:0;24053:21;24062:2;24066:7;24053:8;:21::i;:::-;23741:341;23671:411;;:::o;64025:600::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;64134:17:::1;64142:8;64134:7;:17::i;:::-;64126:57;;;;-1:-1:-1::0;;;64126:57:0::1;;;;;;;:::i;:::-;64190:12;64235:33:::0;;;:23:::1;:33;::::0;;;;:38:::1;;::::0;64205:15:::1;::::0;64235:43;;::::1;::::0;:105:::1;;-1:-1:-1::0;64292:33:0::1;::::0;;;:23:::1;:33;::::0;;;;:38:::1;;::::0;64333:7:::1;::::0;64282:48:::1;::::0;:7;:48:::1;:::i;:::-;:58;64235:105;64227:176;;;::::0;-1:-1:-1;;;64227:176:0;;21844:2:1;64227:176:0::1;::::0;::::1;21826:21:1::0;21883:2;21863:18;;;21856:30;21922:34;21902:18;;;21895:62;21993:27;21973:18;;;21966:55;22038:19;;64227:176:0::1;21642:421:1::0;64227:176:0::1;64410:14;64427:33:::0;;;:23:::1;:33;::::0;;;;;:40;;64474:44;;;;64542:36;;64427:40;;64410:14;-1:-1:-1;;;;;64542:17:0;::::1;::::0;64427:40;;64410:14;64542:36;64410:14;64542:36;64427:40;64542:17;:36:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64525:54;;;64594:4;64586:33;;;::::0;-1:-1:-1;;;64586:33:0;;23380:2:1;64586:33:0::1;::::0;::::1;23362:21:1::0;23419:2;23399:18;;;23392:30;-1:-1:-1;;;23438:18:1;;;23431:46;23494:18;;64586:33:0::1;23178:340:1::0;64586:33:0::1;64119:506;;;64025:600:::0;;:::o;60379:93::-;60425:7;60448:18;:8;52722:14;;52630:114;60448:18;60441:25;;60379:93;:::o;46179:261::-;46279:10;-1:-1:-1;;;;;46293:14:0;46279:28;;46275:111;;46325:53;;-1:-1:-1;;;46325:53:0;;46351:10;46325:53;;;8033:34:1;-1:-1:-1;;;;;46363:14:0;8103:15:1;8083:18;;;8076:43;7968:18;;46325:53:0;7821:304:1;46275:111:0;46392:42;46411:9;46422:11;46392:18;:42::i;:::-;46179:261;;:::o;24898:339::-;25093:41;16929:10;25126:7;25093:18;:41::i;:::-;25085:103;;;;-1:-1:-1;;;25085:103:0;;;;;;;:::i;:::-;25201:28;25211:4;25217:2;25221:7;25201:9;:28::i;57171:31::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57171:31:0;:::o;61633:227::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;61727:12:::1;61723:132;;;61752:17;:28:::0;-1:-1:-1;46179:261:0:o;61723:132::-:1;61814:20;:31:::0;-1:-1:-1;61633:227:0:o;62761:600::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;62839:22:::1;62847:13:::0;::::1;62839:7;:22::i;:::-;62831:62;;;;-1:-1:-1::0;;;62831:62:0::1;;;;;;;:::i;:::-;62932:13:::0;::::1;62908:38;::::0;;;:23:::1;:38;::::0;;;;:45;:50;:102;::::1;;;-1:-1:-1::0;62986:13:0;::::1;62962:38;::::0;;;:23:::1;:38;::::0;;;;:43:::1;;::::0;:48;62908:102:::1;62900:145;;;::::0;-1:-1:-1;;;62900:145:0;;24861:2:1;62900:145:0::1;::::0;::::1;24843:21:1::0;24900:2;24880:18;;;24873:30;24939:32;24919:18;;;24912:60;24989:18;;62900:145:0::1;24659:354:1::0;62900:145:0::1;63060:11;::::0;::::1;::::0;::::1;;;63052:45;;;::::0;-1:-1:-1;;;63052:45:0;;14806:2:1;63052:45:0::1;::::0;::::1;14788:21:1::0;14845:2;14825:18;;;14818:30;-1:-1:-1;;;14864:18:1;;;14857:51;14925:18;;63052:45:0::1;14604:345:1::0;63052:45:0::1;63170:34;::::0;;;;::::1;::::0;;63180:14:::1;::::0;;::::1;;63170:34:::0;;;63119:15:::1;63170:34:::0;;::::1;::::0;;;63235:13;::::1;63104:12;63211:38:::0;;;:23:::1;:38:::0;;;;;;:50;;;;;;::::1;::::0;;::::1;::::0;63268:14:::1;:34:::0;;;;::::1;::::0;;;;;;;::::1;::::0;;;63314:41;;63119:15;;63180:14;;63314:41:::1;::::0;::::1;62824:537;;62761:600:::0;:::o;25308:185::-;25446:39;25463:4;25469:2;25473:7;25446:39;;;;;;;;;;;;:16;:39::i;61031:314::-;61092:7;61116:16;61124:7;61116;:16::i;:::-;61108:56;;;;-1:-1:-1;;;61108:56:0;;;;;;;:::i;:::-;61179:15;:22;61171:70;;;;-1:-1:-1;;;61171:70:0;;10605:2:1;61171:70:0;;;10587:21:1;10644:2;10624:18;;;10617:30;10683:33;10663:18;;;10656:61;10734:18;;61171:70:0;10403:355:1;61171:70:0;61288:8;52722:14;61277:7;61256:15;61272:1;61256:18;;;;;;;;:::i;:::-;;;;;;;;;:28;;;;:::i;:::-;61255:51;;;;:::i;:::-;:55;;61309:1;61255:55;:::i;61866:92::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;61934:7:::1;:18:::0;61866:92::o;59688:257::-;50803:1;51401:7;;:19;;51393:63;;;;-1:-1:-1;;;51393:63:0;;;;;;;:::i;:::-;50803:1;51534:7;:18;59772:17:::1;::::0;59793:15:::1;-1:-1:-1::0;59772:36:0::1;59764:92;;;;-1:-1:-1::0;;;59764:92:0::1;;;;;;;:::i;:::-;59863:37;59873:8;59883:9;59894:5;59863:9;:37::i;:::-;59907:32;59918:8;59928:10;59907;:32::i;:::-;-1:-1:-1::0;50759:1:0;51713:7;:22;59688:257::o;62653:102::-;62702:16;62734:15;62727:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62653:102;:::o;22282:239::-;22354:7;22390:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22390:16:0;22425:19;22417:73;;;;-1:-1:-1;;;22417:73:0;;19042:2:1;22417:73:0;;;19024:21:1;19081:2;19061:18;;;19054:30;19120:34;19100:18;;;19093:62;-1:-1:-1;;;19171:18:1;;;19164:39;19220:19;;22417:73:0;18840:405:1;59147:535:0;50803:1;51401:7;;:19;;51393:63;;;;-1:-1:-1;;;51393:63:0;;;;;;;:::i;:::-;50803:1;51534:7;:18;59267:20:::1;::::0;59291:15:::1;-1:-1:-1::0;59267:39:0::1;59259:95;;;;-1:-1:-1::0;;;59259:95:0::1;;;;;;;:::i;:::-;59369:21;59379:10;59369:9;:21::i;:::-;:26:::0;59361:80:::1;;;::::0;-1:-1:-1;;;59361:80:0;;18221:2:1;59361:80:0::1;::::0;::::1;18203:21:1::0;18260:2;18240:18;;;18233:30;18299:34;18279:18;;;18272:62;-1:-1:-1;;;18350:18:1;;;18343:39;18399:19;;59361:80:0::1;18019:405:1::0;59361:80:0::1;59448:36;59458:8;59468:9;59479:4;59448:9;:36::i;:::-;59517:28;::::0;-1:-1:-1;;59534:10:0::1;6843:2:1::0;6839:15;6835:53;59517:28:0::1;::::0;::::1;6823:66:1::0;59491:12:0::1;::::0;6905::1;;59517:28:0::1;;;;;;;;;;;;59506:41;;;;;;59491:56;;59562:50;59581:12;;59562:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;59595:10:0::1;::::0;;-1:-1:-1;59607:4:0;;-1:-1:-1;59562:18:0::1;:50::i;:::-;59554:83;;;::::0;-1:-1:-1;;;59554:83:0;;13694:2:1;59554:83:0::1;::::0;::::1;13676:21:1::0;13733:2;13713:18;;;13706:30;-1:-1:-1;;;13752:18:1;;;13745:50;13812:18;;59554:83:0::1;13492:344:1::0;59554:83:0::1;59644:32;59655:8;59665:10;59644;:32::i;:::-;-1:-1:-1::0;;50759:1:0;51713:7;:22;-1:-1:-1;;59147:535:0:o;22012:208::-;22084:7;-1:-1:-1;;;;;22112:19:0;;22104:74;;;;-1:-1:-1;;;22104:74:0;;18631:2:1;22104:74:0;;;18613:21:1;18670:2;18650:18;;;18643:30;18709:34;18689:18;;;18682:62;-1:-1:-1;;;18760:18:1;;;18753:40;18810:19;;22104:74:0;18429:406:1;22104:74:0;-1:-1:-1;;;;;;22196:16:0;;;;;:9;:16;;;;;;;22012:208::o;48166:103::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;48231:30:::1;48258:1;48231:18;:30::i;:::-;48166:103::o:0;56723:25::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22757:104::-;22813:13;22846:7;22839:14;;;;;:::i;56435:32::-;;;;;;;;;;;;24441:155;24536:52;16929:10;24569:8;24579;24536:18;:52::i;60245:128::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;60308:11:::1;::::0;::::1;;60300:41;;;::::0;-1:-1:-1;;;60300:41:0;;13348:2:1;60300:41:0::1;::::0;::::1;13330:21:1::0;13387:2;13367:18;;;13360:30;-1:-1:-1;;;13406:18:1;;;13399:47;13463:18;;60300:41:0::1;13146:341:1::0;60300:41:0::1;60348:11;:19:::0;;-1:-1:-1;;60348:19:0::1;::::0;;60245:128::o;63367:652::-;50803:1;51401:7;;:19;;51393:63;;;;-1:-1:-1;;;51393:63:0;;;;;;;:::i;:::-;50803:1;51534:7;:18;63454:17:::1;63462:8:::0;63454:7:::1;:17::i;:::-;63446:57;;;;-1:-1:-1::0;;;63446:57:0::1;;;;;;;:::i;:::-;63539:10;63518:17;63526:8:::0;63518:7:::1;:17::i;:::-;-1:-1:-1::0;;;;;63518:31:0::1;;63510:56;;;::::0;-1:-1:-1;;;63510:56:0;;11779:2:1;63510:56:0::1;::::0;::::1;11761:21:1::0;11818:2;11798:18;;;11791:30;-1:-1:-1;;;11837:18:1;;;11830:42;11889:18;;63510:56:0::1;11577:336:1::0;63510:56:0::1;63622:1;63581:33:::0;;;:23:::1;:33;::::0;;;;:38:::1;;::::0;63573:84:::1;;;::::0;-1:-1:-1;;;63573:84:0;;24503:2:1;63573:84:0::1;::::0;::::1;24485:21:1::0;24542:2;24522:18;;;24515:30;24581:31;24561:18;;;24554:59;24630:18;;63573:84:0::1;24301:353:1::0;63573:84:0::1;63715:1;63672:33:::0;;;:23:::1;:33;::::0;;;;:40;63664:79:::1;;;::::0;-1:-1:-1;;;63664:79:0;;17445:2:1;63664:79:0::1;::::0;::::1;17427:21:1::0;17484:2;17464:18;;;17457:30;-1:-1:-1;;;17503:18:1;;;17496:52;17565:18;;63664:79:0::1;17243:346:1::0;63664:79:0::1;63750:14;63767:33:::0;;;:23:::1;:33;::::0;;;;;:40;;63814:44;;;;63870;;63767:40;;;;63895:10:::1;::::0;63791:8;;63870:44:::1;::::0;63750:14;63870:44:::1;63938:34;::::0;63922:9:::1;::::0;63938:10:::1;::::0;63961:6;;63922:9;63938:34;63922:9;63938:34;63961:6;63938:10;:34:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63921:52;;;63988:4;63980:33;;;::::0;-1:-1:-1;;;63980:33:0;;23380:2:1;63980:33:0::1;::::0;::::1;23362:21:1::0;23419:2;23399:18;;;23392:30;-1:-1:-1;;;23438:18:1;;;23431:46;23494:18;;63980:33:0::1;23178:340:1::0;63980:33:0::1;-1:-1:-1::0;;50759:1:0;51713:7;:22;-1:-1:-1;63367:652:0:o;59951:288::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;60040:11:::1;::::0;::::1;::::0;::::1;;;60039:12;60031:49;;;::::0;-1:-1:-1;;;60031:49:0;;22270:2:1;60031:49:0::1;::::0;::::1;22252:21:1::0;22309:2;22289:18;;;22282:30;22348:26;22328:18;;;22321:54;22392:18;;60031:49:0::1;22068:348:1::0;60031:49:0::1;60095:15;:22:::0;60087:89:::1;;;::::0;-1:-1:-1;;;60087:89:0;;19452:2:1;60087:89:0::1;::::0;::::1;19434:21:1::0;19491:2;19471:18;;;19464:30;19530:34;19510:18;;;19503:62;-1:-1:-1;;;19581:18:1;;;19574:48;19639:19;;60087:89:0::1;19250:414:1::0;60087:89:0::1;60183:25:::0;;::::1;::::0;:11:::1;::::0;:25:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;60215:11:0::1;:18:::0;;-1:-1:-1;;60215:18:0::1;;;::::0;;59951:288::o;25564:328::-;25739:41;16929:10;25772:7;25739:18;:41::i;:::-;25731:103;;;;-1:-1:-1;;;25731:103:0;;;;;;;:::i;:::-;25845:39;25859:4;25865:2;25869:7;25878:5;25845:13;:39::i;:::-;25564:328;;;;:::o;60582:443::-;60655:13;60685:16;60693:7;60685;:16::i;:::-;60677:56;;;;-1:-1:-1;;;60677:56:0;;;;;;;:::i;:::-;60740:21;60764:10;:8;:10::i;:::-;60786:11;;60740:34;;-1:-1:-1;60786:11:0;;;;;60781:49;;60815:7;60582:443;-1:-1:-1;;60582:443:0:o;60781:49::-;60836:14;60853:22;60867:7;60853:13;:22::i;:::-;60836:39;;60882:17;60926:7;60935:24;60952:6;60935:16;:24::i;:::-;60909:51;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;60909:51:0;;;;;;61004:13;;;;;;;;-1:-1:-1;;;60909:51:0;61004:13;;;;;;;60982:36;;60909:51;;-1:-1:-1;60982:36:0;;60909:51;;;;60982:36;;:::i;:::-;;;;;;;;;;;;;60968:51;;;;;60582:443;;;:::o;61964:446::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;62029:11:::1;::::0;::::1;;62028:12;62020:66;;;;-1:-1:-1::0;;;62020:66:0::1;;;;;;;:::i;:::-;62101:15;:22:::0;:27;62093:73:::1;;;::::0;-1:-1:-1;;;62093:73:0;;12539:2:1;62093:73:0::1;::::0;::::1;12521:21:1::0;12578:2;12558:18;;;12551:30;12617:34;12597:18;;;12590:62;-1:-1:-1;;;12668:18:1;;;12661:31;12709:19;;62093:73:0::1;12337:397:1::0;62093:73:0::1;62202:1;62181:18;:8;52722:14:::0;;52630:114;62181:18:::1;:22;62173:61;;;::::0;-1:-1:-1;;;62173:61:0;;23025:2:1;62173:61:0::1;::::0;::::1;23007:21:1::0;23064:2;23044:18;;;23037:30;23103:28;23083:18;;;23076:56;23149:18;;62173:61:0::1;22823:350:1::0;62173:61:0::1;62253:11;::::0;62292:7:::1;::::0;62253:151:::1;::::0;-1:-1:-1;;;62253:151:0;;::::1;::::0;::::1;9885:25:1::0;;;;-1:-1:-1;;;62308:18:0;::::1;;;9926::1::0;;;9919:59;56396:1:0::1;9994:18:1::0;;;9987:47;56346:6:0::1;10079:18:1::0;;;10072:43;62253:11:0;10131:19:1;;;10124:44;-1:-1:-1;;;;;62253:11:0;;::::1;::::0;:30:::1;::::0;9857:19:1;;62253:151:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62241:9;:163:::0;61964:446::o;56615:32::-;;;;;;;:::i;48424:201::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48513:22:0;::::1;48505:73;;;::::0;-1:-1:-1;;;48505:73:0;;12941:2:1;48505:73:0::1;::::0;::::1;12923:21:1::0;12980:2;12960:18;;;12953:30;13019:34;12999:18;;;12992:62;-1:-1:-1;;;13070:18:1;;;13063:36;13116:19;;48505:73:0::1;12739:402:1::0;48505:73:0::1;48589:28;48608:8;48589:18;:28::i;:::-;48424:201:::0;:::o;27402:127::-;27467:4;27491:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27491:16:0;:30;;;27402:127::o;31548:174::-;31623:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31623:29:0;-1:-1:-1;;;;;31623:29:0;;;;;;;;:24;;31677:23;31623:24;31677:14;:23::i;:::-;-1:-1:-1;;;;;31668:46:0;;;;;;;;;;;31548:174;;:::o;62416:231::-;62548:11;;;;62547:12;62539:66;;;;-1:-1:-1;;;62539:66:0;;;;;;;:::i;:::-;62612:29;;;;:15;;:29;;;;;:::i;27696:348::-;27789:4;27814:16;27822:7;27814;:16::i;:::-;27806:73;;;;-1:-1:-1;;;27806:73:0;;16676:2:1;27806:73:0;;;16658:21:1;16715:2;16695:18;;;16688:30;16754:34;16734:18;;;16727:62;-1:-1:-1;;;16805:18:1;;;16798:42;16857:19;;27806:73:0;16474:408:1;27806:73:0;27890:13;27906:23;27921:7;27906:14;:23::i;:::-;27890:39;;27959:5;-1:-1:-1;;;;;27948:16:0;:7;-1:-1:-1;;;;;27948:16:0;;:52;;;-1:-1:-1;;;;;;24788:25:0;;;24764:4;24788:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27968:32;27948:87;;;;28028:7;-1:-1:-1;;;;;28004:31:0;:20;28016:7;28004:11;:20::i;:::-;-1:-1:-1;;;;;28004:31:0;;27948:87;27940:96;27696:348;-1:-1:-1;;;;27696:348:0:o;30805:625::-;30964:4;-1:-1:-1;;;;;30937:31:0;:23;30952:7;30937:14;:23::i;:::-;-1:-1:-1;;;;;30937:31:0;;30929:81;;;;-1:-1:-1;;;30929:81:0;;14043:2:1;30929:81:0;;;14025:21:1;14082:2;14062:18;;;14055:30;14121:34;14101:18;;;14094:62;-1:-1:-1;;;14172:18:1;;;14165:35;14217:19;;30929:81:0;13841:401:1;30929:81:0;-1:-1:-1;;;;;31029:16:0;;31021:65;;;;-1:-1:-1;;;31021:65:0;;15501:2:1;31021:65:0;;;15483:21:1;15540:2;15520:18;;;15513:30;15579:34;15559:18;;;15552:62;-1:-1:-1;;;15630:18:1;;;15623:34;15674:19;;31021:65:0;15299:400:1;31021:65:0;31099:39;31120:4;31126:2;31130:7;31099:20;:39::i;:::-;31203:29;31220:1;31224:7;31203:8;:29::i;:::-;-1:-1:-1;;;;;31245:15:0;;;;;;:9;:15;;;;;:20;;31264:1;;31245:15;:20;;31264:1;;31245:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31276:13:0;;;;;;:9;:13;;;;;:18;;31293:1;;31276:13;:18;;31293:1;;31276:18;:::i;:::-;;;;-1:-1:-1;;31305:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31305:21:0;-1:-1:-1;;;;;31305:21:0;;;;;;;;;31344:27;;31305:16;;31344:27;;;;;;;23741:341;23671:411;;:::o;58592:549::-;58685:11;;;;58677:41;;;;-1:-1:-1;;;58677:41:0;;13348:2:1;58677:41:0;;;13330:21:1;13387:2;13367:18;;;13360:30;-1:-1:-1;;;13406:18:1;;;13399:47;13463:18;;58677:41:0;13146:341:1;58677:41:0;58729:11;58725:225;;;56846:1;58759:8;:29;;58751:89;;;;-1:-1:-1;;;58751:89:0;;;;;;;:::i;:::-;58725:225;;;58888:2;58876:8;:14;;58868:74;;;;-1:-1:-1;;;58868:74:0;;;;;;;:::i;:::-;58997:10;;58985:8;58964:18;:8;52722:14;;52630:114;58964:18;:29;;;;:::i;:::-;:43;;58956:115;;;;-1:-1:-1;;;58956:115:0;;21416:2:1;58956:115:0;;;21398:21:1;21455:2;21435:18;;;21428:30;21494:34;21474:18;;;21467:62;21565:29;21545:18;;;21538:57;21612:19;;58956:115:0;21214:423:1;58956:115:0;59106:8;59096:7;;:18;;;;:::i;:::-;59086:6;:28;;59078:57;;;;-1:-1:-1;;;59078:57:0;;15156:2:1;59078:57:0;;;15138:21:1;15195:2;15175:18;;;15168:30;-1:-1:-1;;;15214:18:1;;;15207:46;15270:18;;59078:57:0;14954:340:1;58360:226:0;58431:8;58426:155;58449:8;58445:1;:12;;;58426:155;;;58473:20;:8;52841:19;;52859:1;52841:19;;;52752:127;58473:20;58502:17;58522:18;:8;52722:14;;52630:114;58522:18;58502:38;;58549:24;58555:6;58563:9;58549:5;:24::i;:::-;-1:-1:-1;58459:3:0;;;;:::i;:::-;;;;58426:155;;54451:190;54576:4;54629;54600:25;54613:5;54620:4;54600:12;:25::i;:::-;:33;;54451:190;-1:-1:-1;;;;54451:190:0:o;48785:191::-;48878:6;;;-1:-1:-1;;;;;48895:17:0;;;-1:-1:-1;;;;;;48895:17:0;;;;;;;48928:40;;48878:6;;;48895:17;48878:6;;48928:40;;48859:16;;48928:40;48848:128;48785:191;:::o;31864:315::-;32019:8;-1:-1:-1;;;;;32010:17:0;:5;-1:-1:-1;;;;;32010:17:0;;;32002:55;;;;-1:-1:-1;;;32002:55:0;;15906:2:1;32002:55:0;;;15888:21:1;15945:2;15925:18;;;15918:30;15984:27;15964:18;;;15957:55;16029:18;;32002:55:0;15704:349:1;32002:55:0;-1:-1:-1;;;;;32068:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;32068:46:0;;;;;;;;;;32130:41;;9400::1;;;32130::0;;9373:18:1;32130:41:0;;;;;;;31864:315;;;:::o;26774:::-;26931:28;26941:4;26947:2;26951:7;26931:9;:28::i;:::-;26978:48;27001:4;27007:2;27011:7;27020:5;26978:22;:48::i;:::-;26970:111;;;;-1:-1:-1;;;26970:111:0;;;;;;;:::i;60478:98::-;60530:13;60559:11;60552:18;;;;;:::i;17436:723::-;17492:13;17713:10;17709:53;;-1:-1:-1;;17740:10:0;;;;;;;;;;;;-1:-1:-1;;;17740:10:0;;;;;17436:723::o;17709:53::-;17787:5;17772:12;17828:78;17835:9;;17828:78;;17861:8;;;;:::i;:::-;;-1:-1:-1;17884:10:0;;-1:-1:-1;17892:2:0;17884:10;;:::i;:::-;;;17828:78;;;17916:19;17948:6;17938:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17938:17:0;;17916:39;;17966:154;17973:10;;17966:154;;18000:11;18010:1;18000:11;;:::i;:::-;;-1:-1:-1;18069:10:0;18077:2;18069:5;:10;:::i;:::-;18056:24;;:2;:24;:::i;:::-;18043:39;;18026:6;18033;18026:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;18026:56:0;;;;;;;;-1:-1:-1;18097:11:0;18106:2;18097:11;;:::i;:::-;;;17966:154;;61351:274;61501:14;:21;:26;61493:72;;;;-1:-1:-1;;;61493:72:0;;11377:2:1;61493:72:0;;;11359:21:1;11416:2;11396:18;;;11389:30;11455:34;11435:18;;;11428:62;-1:-1:-1;;;11506:18:1;;;11499:31;11547:19;;61493:72:0;11175:397:1;29380:439:0;-1:-1:-1;;;;;29460:16:0;;29452:61;;;;-1:-1:-1;;;29452:61:0;;19871:2:1;29452:61:0;;;19853:21:1;;;19890:18;;;19883:30;19949:34;19929:18;;;19922:62;20001:18;;29452:61:0;19669:356:1;29452:61:0;29533:16;29541:7;29533;:16::i;:::-;29532:17;29524:58;;;;-1:-1:-1;;;29524:58:0;;14449:2:1;29524:58:0;;;14431:21:1;14488:2;14468:18;;;14461:30;14527;14507:18;;;14500:58;14575:18;;29524:58:0;14247:352:1;29524:58:0;29595:45;29624:1;29628:2;29632:7;29595:20;:45::i;:::-;-1:-1:-1;;;;;29653:13:0;;;;;;:9;:13;;;;;:18;;29670:1;;29653:13;:18;;29670:1;;29653:18;:::i;:::-;;;;-1:-1:-1;;29682:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29682:21:0;-1:-1:-1;;;;;29682:21:0;;;;;;;;29721:33;;29682:16;;;29721:33;;29682:16;;29721:33;46179:261;;:::o;55002:675::-;55085:7;55128:4;55085:7;55143:497;55167:5;:12;55163:1;:16;55143:497;;;55201:20;55224:5;55230:1;55224:8;;;;;;;;:::i;:::-;;;;;;;55201:31;;55267:12;55251;:28;55247:382;;55753:13;55803:15;;;55839:4;55832:15;;;55886:4;55870:21;;55379:57;;55247:382;;;55753:13;55803:15;;;55839:4;55832:15;;;55886:4;55870:21;;55556:57;;55247:382;-1:-1:-1;55181:3:0;;;;:::i;:::-;;;;55143:497;;;-1:-1:-1;55657:12:0;55002:675;-1:-1:-1;;;55002:675:0:o;32744:799::-;32899:4;-1:-1:-1;;;;;32920:13:0;;9187:19;:23;32916:620;;32956:72;;-1:-1:-1;;;32956:72:0;;-1:-1:-1;;;;;32956:36:0;;;;;:72;;16929:10;;33007:4;;33013:7;;33022:5;;32956:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32956:72:0;;;;;;;;-1:-1:-1;;32956:72:0;;;;;;;;;;;;:::i;:::-;;;32952:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33198:13:0;;33194:272;;33241:60;;-1:-1:-1;;;33241:60:0;;;;;;;:::i;33194:272::-;33416:6;33410:13;33401:6;33397:2;33393:15;33386:38;32952:529;-1:-1:-1;;;;;;33079:51:0;-1:-1:-1;;;33079:51:0;;-1:-1:-1;33072:58:0;;32916:620;-1:-1:-1;33520:4:0;32744:799;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:160::-;668:20;;724:13;;717:21;707:32;;697:60;;753:1;750;743:12;768:186;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;919:29;938:9;919:29;:::i;:::-;909:39;768:186;-1:-1:-1;;;768:186:1:o;959:260::-;1027:6;1035;1088:2;1076:9;1067:7;1063:23;1059:32;1056:52;;;1104:1;1101;1094:12;1056:52;1127:29;1146:9;1127:29;:::i;:::-;1117:39;;1175:38;1209:2;1198:9;1194:18;1175:38;:::i;:::-;1165:48;;959:260;;;;;:::o;1224:328::-;1301:6;1309;1317;1370:2;1358:9;1349:7;1345:23;1341:32;1338:52;;;1386:1;1383;1376:12;1338:52;1409:29;1428:9;1409:29;:::i;:::-;1399:39;;1457:38;1491:2;1480:9;1476:18;1457:38;:::i;:::-;1447:48;;1542:2;1531:9;1527:18;1514:32;1504:42;;1224:328;;;;;:::o;1557:666::-;1652:6;1660;1668;1676;1729:3;1717:9;1708:7;1704:23;1700:33;1697:53;;;1746:1;1743;1736:12;1697:53;1769:29;1788:9;1769:29;:::i;:::-;1759:39;;1817:38;1851:2;1840:9;1836:18;1817:38;:::i;:::-;1807:48;;1902:2;1891:9;1887:18;1874:32;1864:42;;1957:2;1946:9;1942:18;1929:32;1984:18;1976:6;1973:30;1970:50;;;2016:1;2013;2006:12;1970:50;2039:22;;2092:4;2084:13;;2080:27;-1:-1:-1;2070:55:1;;2121:1;2118;2111:12;2070:55;2144:73;2209:7;2204:2;2191:16;2186:2;2182;2178:11;2144:73;:::i;:::-;2134:83;;;1557:666;;;;;;;:::o;2228:254::-;2293:6;2301;2354:2;2342:9;2333:7;2329:23;2325:32;2322:52;;;2370:1;2367;2360:12;2322:52;2393:29;2412:9;2393:29;:::i;:::-;2383:39;;2441:35;2472:2;2461:9;2457:18;2441:35;:::i;2487:254::-;2555:6;2563;2616:2;2604:9;2595:7;2591:23;2587:32;2584:52;;;2632:1;2629;2622:12;2584:52;2655:29;2674:9;2655:29;:::i;:::-;2645:39;2731:2;2716:18;;;;2703:32;;-1:-1:-1;;;2487:254:1:o;2746:248::-;2811:6;2819;2872:2;2860:9;2851:7;2847:23;2843:32;2840:52;;;2888:1;2885;2878:12;2840:52;2911:26;2927:9;2911:26;:::i;2999:180::-;3058:6;3111:2;3099:9;3090:7;3086:23;3082:32;3079:52;;;3127:1;3124;3117:12;3079:52;-1:-1:-1;3150:23:1;;2999:180;-1:-1:-1;2999:180:1:o;3184:245::-;3242:6;3295:2;3283:9;3274:7;3270:23;3266:32;3263:52;;;3311:1;3308;3301:12;3263:52;3350:9;3337:23;3369:30;3393:5;3369:30;:::i;3434:249::-;3503:6;3556:2;3544:9;3535:7;3531:23;3527:32;3524:52;;;3572:1;3569;3562:12;3524:52;3604:9;3598:16;3623:30;3647:5;3623:30;:::i;3688:450::-;3757:6;3810:2;3798:9;3789:7;3785:23;3781:32;3778:52;;;3826:1;3823;3816:12;3778:52;3866:9;3853:23;3899:18;3891:6;3888:30;3885:50;;;3931:1;3928;3921:12;3885:50;3954:22;;4007:4;3999:13;;3995:27;-1:-1:-1;3985:55:1;;4036:1;4033;4026:12;3985:55;4059:73;4124:7;4119:2;4106:16;4101:2;4097;4093:11;4059:73;:::i;4143:192::-;4228:6;4281:2;4269:9;4260:7;4256:23;4252:32;4249:52;;;4297:1;4294;4287:12;4249:52;-1:-1:-1;4320:9:1;4143:192;-1:-1:-1;4143:192:1:o;4525:184::-;4595:6;4648:2;4636:9;4627:7;4623:23;4619:32;4616:52;;;4664:1;4661;4654:12;4616:52;-1:-1:-1;4687:16:1;;4525:184;-1:-1:-1;4525:184:1:o;4714:683::-;4809:6;4817;4825;4878:2;4866:9;4857:7;4853:23;4849:32;4846:52;;;4894:1;4891;4884:12;4846:52;4930:9;4917:23;4907:33;;4991:2;4980:9;4976:18;4963:32;5014:18;5055:2;5047:6;5044:14;5041:34;;;5071:1;5068;5061:12;5041:34;5109:6;5098:9;5094:22;5084:32;;5154:7;5147:4;5143:2;5139:13;5135:27;5125:55;;5176:1;5173;5166:12;5125:55;5216:2;5203:16;5242:2;5234:6;5231:14;5228:34;;;5258:1;5255;5248:12;5228:34;5311:7;5306:2;5296:6;5293:1;5289:14;5285:2;5281:23;5277:32;5274:45;5271:65;;;5332:1;5329;5322:12;5271:65;5363:2;5359;5355:11;5345:21;;5385:6;5375:16;;;;;4714:683;;;;;:::o;5402:1025::-;5495:6;5503;5556:2;5544:9;5535:7;5531:23;5527:32;5524:52;;;5572:1;5569;5562:12;5524:52;5608:9;5595:23;5585:33;;5637:2;5690;5679:9;5675:18;5662:32;5713:18;5754:2;5746:6;5743:14;5740:34;;;5770:1;5767;5760:12;5740:34;5808:6;5797:9;5793:22;5783:32;;5853:7;5846:4;5842:2;5838:13;5834:27;5824:55;;5875:1;5872;5865:12;5824:55;5911:2;5898:16;5933:2;5929;5926:10;5923:36;;;5939:18;;:::i;:::-;5985:2;5982:1;5978:10;5968:20;;6008:28;6032:2;6028;6024:11;6008:28;:::i;:::-;6070:15;;;6101:12;;;;6133:11;;;6163;;;6159:20;;6156:33;-1:-1:-1;6153:53:1;;;6202:1;6199;6192:12;6153:53;6224:1;6215:10;;6234:163;6248:2;6245:1;6242:9;6234:163;;;6305:17;;6293:30;;6266:1;6259:9;;;;;6343:12;;;;6375;;6234:163;;;6238:3;6416:5;6406:15;;;;;;;;5402:1025;;;;;:::o;6432:257::-;6473:3;6511:5;6505:12;6538:6;6533:3;6526:19;6554:63;6610:6;6603:4;6598:3;6594:14;6587:4;6580:5;6576:16;6554:63;:::i;:::-;6671:2;6650:15;-1:-1:-1;;6646:29:1;6637:39;;;;6678:4;6633:50;;6432:257;-1:-1:-1;;6432:257:1:o;6928:470::-;7107:3;7145:6;7139:13;7161:53;7207:6;7202:3;7195:4;7187:6;7183:17;7161:53;:::i;:::-;7277:13;;7236:16;;;;7299:57;7277:13;7236:16;7333:4;7321:17;;7299:57;:::i;:::-;7372:20;;6928:470;-1:-1:-1;;;;6928:470:1:o;8130:488::-;-1:-1:-1;;;;;8399:15:1;;;8381:34;;8451:15;;8446:2;8431:18;;8424:43;8498:2;8483:18;;8476:34;;;8546:3;8541:2;8526:18;;8519:31;;;8324:4;;8567:45;;8592:19;;8584:6;8567:45;:::i;:::-;8559:53;8130:488;-1:-1:-1;;;;;;8130:488:1:o;8623:632::-;8794:2;8846:21;;;8916:13;;8819:18;;;8938:22;;;8765:4;;8794:2;9017:15;;;;8991:2;8976:18;;;8765:4;9060:169;9074:6;9071:1;9068:13;9060:169;;;9135:13;;9123:26;;9204:15;;;;9169:12;;;;9096:1;9089:9;9060:169;;;-1:-1:-1;9246:3:1;;8623:632;-1:-1:-1;;;;;;8623:632:1:o;10179:219::-;10328:2;10317:9;10310:21;10291:4;10348:44;10388:2;10377:9;10373:18;10365:6;10348:44;:::i;10763:407::-;10965:2;10947:21;;;11004:2;10984:18;;;10977:30;11043:34;11038:2;11023:18;;11016:62;-1:-1:-1;;;11109:2:1;11094:18;;11087:41;11160:3;11145:19;;10763:407::o;11918:414::-;12120:2;12102:21;;;12159:2;12139:18;;;12132:30;12198:34;12193:2;12178:18;;12171:62;-1:-1:-1;;;12264:2:1;12249:18;;12242:48;12322:3;12307:19;;11918:414::o;16058:411::-;16260:2;16242:21;;;16299:2;16279:18;;;16272:30;16338:34;16333:2;16318:18;;16311:62;-1:-1:-1;;;16404:2:1;16389:18;;16382:45;16459:3;16444:19;;16058:411::o;16887:351::-;17089:2;17071:21;;;17128:2;17108:18;;;17101:30;17167:29;17162:2;17147:18;;17140:57;17229:2;17214:18;;16887:351::o;20443:405::-;20645:2;20627:21;;;20684:2;20664:18;;;20657:30;20723:34;20718:2;20703:18;;20696:62;-1:-1:-1;;;20789:2:1;20774:18;;20767:39;20838:3;20823:19;;20443:405::o;20853:356::-;21055:2;21037:21;;;21074:18;;;21067:30;21133:34;21128:2;21113:18;;21106:62;21200:2;21185:18;;20853:356::o;23523:413::-;23725:2;23707:21;;;23764:2;23744:18;;;23737:30;23803:34;23798:2;23783:18;;23776:62;-1:-1:-1;;;23869:2:1;23854:18;;23847:47;23926:3;23911:19;;23523:413::o;23941:355::-;24143:2;24125:21;;;24182:2;24162:18;;;24155:30;24221:33;24216:2;24201:18;;24194:61;24287:2;24272:18;;23941:355::o;25658:275::-;25729:2;25723:9;25794:2;25775:13;;-1:-1:-1;;25771:27:1;25759:40;;25829:18;25814:34;;25850:22;;;25811:62;25808:88;;;25876:18;;:::i;:::-;25912:2;25905:22;25658:275;;-1:-1:-1;25658:275:1:o;25938:128::-;25978:3;26009:1;26005:6;26002:1;25999:13;25996:39;;;26015:18;;:::i;:::-;-1:-1:-1;26051:9:1;;25938:128::o;26071:120::-;26111:1;26137;26127:35;;26142:18;;:::i;:::-;-1:-1:-1;26176:9:1;;26071:120::o;26196:168::-;26236:7;26302:1;26298;26294:6;26290:14;26287:1;26284:21;26279:1;26272:9;26265:17;26261:45;26258:71;;;26309:18;;:::i;:::-;-1:-1:-1;26349:9:1;;26196:168::o;26369:125::-;26409:4;26437:1;26434;26431:8;26428:34;;;26442:18;;:::i;:::-;-1:-1:-1;26479:9:1;;26369:125::o;26499:258::-;26571:1;26581:113;26595:6;26592:1;26589:13;26581:113;;;26671:11;;;26665:18;26652:11;;;26645:39;26617:2;26610:10;26581:113;;;26712:6;26709:1;26706:13;26703:48;;;-1:-1:-1;;26747:1:1;26729:16;;26722:27;26499:258::o;26762:380::-;26841:1;26837:12;;;;26884;;;26905:61;;26959:4;26951:6;26947:17;26937:27;;26905:61;27012:2;27004:6;27001:14;26981:18;26978:38;26975:161;;;27058:10;27053:3;27049:20;27046:1;27039:31;27093:4;27090:1;27083:15;27121:4;27118:1;27111:15;27147:135;27186:3;-1:-1:-1;;27207:17:1;;27204:43;;;27227:18;;:::i;:::-;-1:-1:-1;27274:1:1;27263:13;;27147:135::o;27287:201::-;27325:3;27353:10;27398:2;27391:5;27387:14;27425:2;27416:7;27413:15;27410:41;;;27431:18;;:::i;:::-;27480:1;27467:15;;27287:201;-1:-1:-1;;;27287:201:1:o;27493:112::-;27525:1;27551;27541:35;;27556:18;;:::i;:::-;-1:-1:-1;27590:9:1;;27493:112::o;27610:127::-;27671:10;27666:3;27662:20;27659:1;27652:31;27702:4;27699:1;27692:15;27726:4;27723:1;27716:15;27742:127;27803:10;27798:3;27794:20;27791:1;27784:31;27834:4;27831:1;27824:15;27858:4;27855:1;27848:15;27874:127;27935:10;27930:3;27926:20;27923:1;27916:31;27966:4;27963:1;27956:15;27990:4;27987:1;27980:15;28006:127;28067:10;28062:3;28058:20;28055:1;28048:31;28098:4;28095:1;28088:15;28122:4;28119:1;28112:15;28138:131;-1:-1:-1;;;;;;28212:32:1;;28202:43;;28192:71;;28259:1;28256;28249:12

Swarm Source

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