ETH Price: $3,111.70 (+1.35%)

Token

Chill Frogs (FROGS)
 

Overview

Max Total Supply

6,000 FROGS

Holders

2,395

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 FROGS
0x02605aae96649c6171171e98cbe5b354a9796c47
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Chill Frogs are the chillest collection of 6,000 generative frog NFTs.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ChillFrogs

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-23
*/

// SPDX-License-Identifier: UNLICENSED

// File: @openzeppelin/contracts/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/IERC721.sol

/**
 * @dev Required interface of an ERC721 compliant contract.https://bafybeihtl7sst4jza7r3myipylg5z5ywktt2zritdqnvxbqrvaw5qpvkmu.ipfs.infura-ipfs.io/0.png
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @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/Address.sol

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @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/Strings.sol

/**
 * @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/ERC165.sol

/**
 * @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/ERC721.sol

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

/**
 * @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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/security/Pausable.sol

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File: contracts/ChillFrogs.sol

contract ChillFrogs is ERC721, Ownable, Pausable {

    uint256 public constant MAX_PER_CALL = 20;
    uint256 public constant MAX_PER_CALL_PRESALE = 4;
    uint256 public constant MAX_SUPPLY = 6000;
    uint256 public constant NFT_PRICE = 0.045e18;

    string internal baseURI;
    bool public presaleOngoing;

    uint256 public totalSupply;

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

    constructor() ERC721("Chill Frogs", "FROGS") {
        _pause();
    }

    function mint(uint256 amount) external payable whenNotPaused {
        require(amount <= MAX_PER_CALL, "Amount exceeds max per tx");

        uint256 newSupply = totalSupply + amount;

        require(newSupply <= MAX_SUPPLY, "Amount exceeds max supply");
        require(msg.value == NFT_PRICE * amount, "Wrong eth amount");

        for (uint256 i = 0; i < amount; i++) {
            _mint(msg.sender, totalSupply + i);
        }

        totalSupply = newSupply;
    }

    function mintOwner(uint256 amount) external onlyOwner {
        uint256 newSupply = totalSupply + amount;
        require(newSupply <= MAX_SUPPLY, "Amount exceeds max supply");

        for (uint256 i = 0; i < amount; i++) {
            _mint(msg.sender, totalSupply + i);
        }

        totalSupply = newSupply;
    }

    function mintPresale(uint256 amount) external payable whenPaused {
        require(presaleOngoing, "Presale hasn't started yet");
        require(presaleWhitelist[msg.sender], "Address isn't whitelisted");
        require(presaleMintedAmounts[msg.sender] + amount <= MAX_PER_CALL_PRESALE, "Amount exceeds presale max");
        require(msg.value == NFT_PRICE * amount, "Wrong eth amount");

        for (uint256 i = 0; i < amount; i++) {
            _mint(msg.sender, totalSupply + i);
        }

        totalSupply = totalSupply + amount;
        
        presaleMintedAmounts[msg.sender] = presaleMintedAmounts[msg.sender] + amount;
    }

    function addAddressesToWhitelist(address[] memory whitelisted) external onlyOwner {
        for (uint256 i = 0; i < whitelisted.length; i++) {
            presaleWhitelist[whitelisted[i]] = true;
        }
    }

    function startPresale() external onlyOwner {
        presaleOngoing = true;
    }

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

    function unpause() external onlyOwner {
        _unpause();
    }

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_PER_CALL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_CALL_PRESALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"whitelisted","type":"address[]"}],"name":"addAddressesToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presaleMintedAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleOngoing","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presaleWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604080518082018252600b81526a4368696c6c2046726f677360a81b60208083019182528351808501909452600584526446524f475360d81b9084015281519192916200006291600091620001ba565b50805162000078906001906020840190620001ba565b505050620000956200008f620000b260201b60201c565b620000b6565b6006805460ff60a01b19169055620000ac62000108565b6200029d565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200011c600654600160a01b900460ff1690565b15620001615760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640160405180910390fd5b6006805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586200019d3390565b6040516001600160a01b03909116815260200160405180910390a1565b828054620001c89062000260565b90600052602060002090601f016020900481019282620001ec576000855562000237565b82601f106200020757805160ff191683800117855562000237565b8280016001018555821562000237579182015b82811115620002375782518255916020019190600101906200021a565b506200024592915062000249565b5090565b5b808211156200024557600081556001016200024a565b600181811c908216806200027557607f821691505b602082108114156200029757634e487b7160e01b600052602260045260246000fd5b50919050565b612df380620002ad6000396000f3fe6080604052600436106101fe5760003560e01c80636352211e1161011d578063b1936c24116100b0578063e985e9c51161007f578063eb8835ab11610064578063eb8835ab146105f4578063f2fde38b14610624578063f759867a1461064457600080fd5b8063e985e9c514610589578063ea156a9b146105df57600080fd5b8063b1936c241461050f578063b88d4fde14610529578063c87b56dd14610549578063e2ec6ec31461056957600080fd5b80638da5cb5b116100ec5780638da5cb5b1461049c57806395d89b41146104c7578063a0712d68146104dc578063a22cb465146104ef57600080fd5b80636352211e1461042c578063676dd5631461044c57806370a0823114610467578063715018a61461048757600080fd5b806332cb6b0c1161019557806342842e0e1161016457806342842e0e1461038f57806355f804b3146103af5780635c477073146103cf5780635c975abb146103fc57600080fd5b806332cb6b0c1461032f57806333f88d22146103455780633ccfd60b146103655780633f4ba83a1461037a57600080fd5b8063095ea7b3116101d1578063095ea7b3146102b657806316336ee4146102d657806318160ddd146102f957806323b872dd1461030f57600080fd5b806301ffc9a71461020357806304c98b2b1461023857806306fdde031461024f578063081812fc14610271575b600080fd5b34801561020f57600080fd5b5061022361021e3660046129fb565b610657565b60405190151581526020015b60405180910390f35b34801561024457600080fd5b5061024d61073c565b005b34801561025b57600080fd5b506102646107ef565b60405161022f9190612b53565b34801561027d57600080fd5b5061029161028c366004612a79565b610881565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161022f565b3480156102c257600080fd5b5061024d6102d1366004612923565b61095b565b3480156102e257600080fd5b506102eb600481565b60405190815260200161022f565b34801561030557600080fd5b506102eb60095481565b34801561031b57600080fd5b5061024d61032a366004612835565b610ae8565b34801561033b57600080fd5b506102eb61177081565b34801561035157600080fd5b5061024d610360366004612a79565b610b89565b34801561037157600080fd5b5061024d610cc3565b34801561038657600080fd5b5061024d610d73565b34801561039b57600080fd5b5061024d6103aa366004612835565b610dfe565b3480156103bb57600080fd5b5061024d6103ca366004612a33565b610e19565b3480156103db57600080fd5b506102eb6103ea3660046127e9565b600b6020526000908152604090205481565b34801561040857600080fd5b5060065474010000000000000000000000000000000000000000900460ff16610223565b34801561043857600080fd5b50610291610447366004612a79565b610eb1565b34801561045857600080fd5b506102eb669fdf42f6e4800081565b34801561047357600080fd5b506102eb6104823660046127e9565b610f63565b34801561049357600080fd5b5061024d611031565b3480156104a857600080fd5b5060065473ffffffffffffffffffffffffffffffffffffffff16610291565b3480156104d357600080fd5b506102646110bc565b61024d6104ea366004612a79565b6110cb565b3480156104fb57600080fd5b5061024d61050a3660046128e9565b6112e1565b34801561051b57600080fd5b506008546102239060ff1681565b34801561053557600080fd5b5061024d610544366004612870565b6113f8565b34801561055557600080fd5b50610264610564366004612a79565b6114a0565b34801561057557600080fd5b5061024d61058436600461294c565b6115b0565b34801561059557600080fd5b506102236105a4366004612803565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156105eb57600080fd5b506102eb601481565b34801561060057600080fd5b5061022361060f3660046127e9565b600a6020526000908152604090205460ff1681565b34801561063057600080fd5b5061024d61063f3660046127e9565b6116eb565b61024d610652366004612a79565b611818565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806106ea57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061073657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60065473ffffffffffffffffffffffffffffffffffffffff1633146107c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6060600080546107fe90612c61565b80601f016020809104026020016040519081016040528092919081815260200182805461082a90612c61565b80156108775780601f1061084c57610100808354040283529160200191610877565b820191906000526020600020905b81548152906001019060200180831161085a57829003601f168201915b5050505050905090565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16610932576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016107b9565b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600061096682610eb1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a24576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016107b9565b3373ffffffffffffffffffffffffffffffffffffffff82161480610a4d5750610a4d81336105a4565b610ad9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107b9565b610ae38383611aef565b505050565b610af23382611b8f565b610b7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016107b9565b610ae3838383611cff565b60065473ffffffffffffffffffffffffffffffffffffffff163314610c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107b9565b600081600954610c1a9190612bb5565b9050611770811115610c88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f416d6f756e742065786365656473206d617820737570706c790000000000000060448201526064016107b9565b60005b82811015610cbc57610caa3382600954610ca59190612bb5565b611f66565b80610cb481612cb5565b915050610c8b565b5060095550565b60065473ffffffffffffffffffffffffffffffffffffffff163314610d44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107b9565b60405133904780156108fc02916000818181858888f19350505050158015610d70573d6000803e3d6000fd5b50565b60065473ffffffffffffffffffffffffffffffffffffffff163314610df4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107b9565b610dfc612128565b565b610ae3838383604051806020016040528060008152506113f8565b60065473ffffffffffffffffffffffffffffffffffffffff163314610e9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107b9565b8051610ead9060079060208401906126b1565b5050565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff1680610736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016107b9565b600073ffffffffffffffffffffffffffffffffffffffff8216611008576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016107b9565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b60065473ffffffffffffffffffffffffffffffffffffffff1633146110b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107b9565b610dfc6000612209565b6060600180546107fe90612c61565b60065474010000000000000000000000000000000000000000900460ff1615611150576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016107b9565b60148111156111bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f416d6f756e742065786365656473206d6178207065722074780000000000000060448201526064016107b9565b6000816009546111cb9190612bb5565b9050611770811115611239576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f416d6f756e742065786365656473206d617820737570706c790000000000000060448201526064016107b9565b61124a82669fdf42f6e48000612be1565b34146112b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f57726f6e672065746820616d6f756e740000000000000000000000000000000060448201526064016107b9565b60005b82811015610cbc576112cf3382600954610ca59190612bb5565b806112d981612cb5565b9150506112b5565b73ffffffffffffffffffffffffffffffffffffffff8216331415611361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107b9565b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6114023383611b8f565b61148e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016107b9565b61149a84848484612280565b50505050565b60008181526002602052604090205460609073ffffffffffffffffffffffffffffffffffffffff16611554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e000000000000000000000000000000000060648201526084016107b9565b600061155e612323565b9050600081511161157e57604051806020016040528060008152506115a9565b8061158884612332565b604051602001611599929190612adb565b6040516020818303038152906040525b9392505050565b60065473ffffffffffffffffffffffffffffffffffffffff163314611631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107b9565b60005b8151811015610ead576001600a600084848151811061167c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055806116e381612cb5565b915050611634565b60065473ffffffffffffffffffffffffffffffffffffffff16331461176c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107b9565b73ffffffffffffffffffffffffffffffffffffffff811661180f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107b9565b610d7081612209565b60065474010000000000000000000000000000000000000000900460ff1661189c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016107b9565b60085460ff16611908576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f50726573616c65206861736e277420737461727465642079657400000000000060448201526064016107b9565b336000908152600a602052604090205460ff16611981576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f416464726573732069736e27742077686974656c69737465640000000000000060448201526064016107b9565b336000908152600b602052604090205460049061199f908390612bb5565b1115611a07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f416d6f756e7420657863656564732070726573616c65206d617800000000000060448201526064016107b9565b611a1881669fdf42f6e48000612be1565b3414611a80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f57726f6e672065746820616d6f756e740000000000000000000000000000000060448201526064016107b9565b60005b81811015611aaf57611a9d3382600954610ca59190612bb5565b80611aa781612cb5565b915050611a83565b5080600954611abe9190612bb5565b600955336000908152600b6020526040902054611adc908290612bb5565b336000908152600b602052604090205550565b600081815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190611b4982610eb1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16611c40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016107b9565b6000611c4b83610eb1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611cba57508373ffffffffffffffffffffffffffffffffffffffff16611ca284610881565b73ffffffffffffffffffffffffffffffffffffffff16145b80611cf7575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff16611d1f82610eb1565b73ffffffffffffffffffffffffffffffffffffffff1614611dc2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e000000000000000000000000000000000000000000000060648201526084016107b9565b73ffffffffffffffffffffffffffffffffffffffff8216611e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016107b9565b611e6f600082611aef565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120805460019290611ea5908490612c1e565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260408120805460019290611ee0908490612bb5565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b73ffffffffffffffffffffffffffffffffffffffff8216611fe3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107b9565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff161561206f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107b9565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054600192906120a5908490612bb5565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60065474010000000000000000000000000000000000000000900460ff166121ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016107b9565b600680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040805133815290517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9181900360200190a1565b6006805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61228b848484611cff565b612297848484846124b2565b61149a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016107b9565b6060600780546107fe90612c61565b60608161237257505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561239c578061238681612cb5565b91506123959050600a83612bcd565b9150612376565b60008167ffffffffffffffff8111156123de577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612408576020820181803683370190505b5090505b8415611cf75761241d600183612c1e565b915061242a600a86612cee565b612435906030612bb5565b60f81b818381518110612471577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506124ab600a86612bcd565b945061240c565b600073ffffffffffffffffffffffffffffffffffffffff84163b156126a6576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290612529903390899088908890600401612b0a565b602060405180830381600087803b15801561254357600080fd5b505af1925050508015612591575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261258e91810190612a17565b60015b61265b573d8080156125bf576040519150601f19603f3d011682016040523d82523d6000602084013e6125c4565b606091505b508051612653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016107b9565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611cf7565b506001949350505050565b8280546126bd90612c61565b90600052602060002090601f0160209004810192826126df5760008555612725565b82601f106126f857805160ff1916838001178555612725565b82800160010185558215612725579182015b8281111561272557825182559160200191906001019061270a565b50612731929150612735565b5090565b5b808211156127315760008155600101612736565b600067ffffffffffffffff83111561276457612764612d60565b61279560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601612b66565b90508281528383830111156127a957600080fd5b828260208301376000602084830101529392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146127e457600080fd5b919050565b6000602082840312156127fa578081fd5b6115a9826127c0565b60008060408385031215612815578081fd5b61281e836127c0565b915061282c602084016127c0565b90509250929050565b600080600060608486031215612849578081fd5b612852846127c0565b9250612860602085016127c0565b9150604084013590509250925092565b60008060008060808587031215612885578081fd5b61288e856127c0565b935061289c602086016127c0565b925060408501359150606085013567ffffffffffffffff8111156128be578182fd5b8501601f810187136128ce578182fd5b6128dd8782356020840161274a565b91505092959194509250565b600080604083850312156128fb578182fd5b612904836127c0565b915060208301358015158114612918578182fd5b809150509250929050565b60008060408385031215612935578182fd5b61293e836127c0565b946020939093013593505050565b6000602080838503121561295e578182fd5b823567ffffffffffffffff80821115612975578384fd5b818501915085601f830112612988578384fd5b81358181111561299a5761299a612d60565b8060051b91506129ab848301612b66565b8181528481019084860184860187018a10156129c5578788fd5b8795505b838610156129ee576129da816127c0565b8352600195909501949186019186016129c9565b5098975050505050505050565b600060208284031215612a0c578081fd5b81356115a981612d8f565b600060208284031215612a28578081fd5b81516115a981612d8f565b600060208284031215612a44578081fd5b813567ffffffffffffffff811115612a5a578182fd5b8201601f81018413612a6a578182fd5b611cf78482356020840161274a565b600060208284031215612a8a578081fd5b5035919050565b60008151808452612aa9816020860160208601612c35565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008351612aed818460208801612c35565b835190830190612b01818360208801612c35565b01949350505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152612b496080830184612a91565b9695505050505050565b6020815260006115a96020830184612a91565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612bad57612bad612d60565b604052919050565b60008219821115612bc857612bc8612d02565b500190565b600082612bdc57612bdc612d31565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612c1957612c19612d02565b500290565b600082821015612c3057612c30612d02565b500390565b60005b83811015612c50578181015183820152602001612c38565b8381111561149a5750506000910152565b600181811c90821680612c7557607f821691505b60208210811415612caf577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ce757612ce7612d02565b5060010190565b600082612cfd57612cfd612d31565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610d7057600080fdfea264697066735822122026e821d582030e23b32e12a8dede5c357027539de34804bd129290e390a59c0e64736f6c63430008040033

Deployed Bytecode

0x6080604052600436106101fe5760003560e01c80636352211e1161011d578063b1936c24116100b0578063e985e9c51161007f578063eb8835ab11610064578063eb8835ab146105f4578063f2fde38b14610624578063f759867a1461064457600080fd5b8063e985e9c514610589578063ea156a9b146105df57600080fd5b8063b1936c241461050f578063b88d4fde14610529578063c87b56dd14610549578063e2ec6ec31461056957600080fd5b80638da5cb5b116100ec5780638da5cb5b1461049c57806395d89b41146104c7578063a0712d68146104dc578063a22cb465146104ef57600080fd5b80636352211e1461042c578063676dd5631461044c57806370a0823114610467578063715018a61461048757600080fd5b806332cb6b0c1161019557806342842e0e1161016457806342842e0e1461038f57806355f804b3146103af5780635c477073146103cf5780635c975abb146103fc57600080fd5b806332cb6b0c1461032f57806333f88d22146103455780633ccfd60b146103655780633f4ba83a1461037a57600080fd5b8063095ea7b3116101d1578063095ea7b3146102b657806316336ee4146102d657806318160ddd146102f957806323b872dd1461030f57600080fd5b806301ffc9a71461020357806304c98b2b1461023857806306fdde031461024f578063081812fc14610271575b600080fd5b34801561020f57600080fd5b5061022361021e3660046129fb565b610657565b60405190151581526020015b60405180910390f35b34801561024457600080fd5b5061024d61073c565b005b34801561025b57600080fd5b506102646107ef565b60405161022f9190612b53565b34801561027d57600080fd5b5061029161028c366004612a79565b610881565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161022f565b3480156102c257600080fd5b5061024d6102d1366004612923565b61095b565b3480156102e257600080fd5b506102eb600481565b60405190815260200161022f565b34801561030557600080fd5b506102eb60095481565b34801561031b57600080fd5b5061024d61032a366004612835565b610ae8565b34801561033b57600080fd5b506102eb61177081565b34801561035157600080fd5b5061024d610360366004612a79565b610b89565b34801561037157600080fd5b5061024d610cc3565b34801561038657600080fd5b5061024d610d73565b34801561039b57600080fd5b5061024d6103aa366004612835565b610dfe565b3480156103bb57600080fd5b5061024d6103ca366004612a33565b610e19565b3480156103db57600080fd5b506102eb6103ea3660046127e9565b600b6020526000908152604090205481565b34801561040857600080fd5b5060065474010000000000000000000000000000000000000000900460ff16610223565b34801561043857600080fd5b50610291610447366004612a79565b610eb1565b34801561045857600080fd5b506102eb669fdf42f6e4800081565b34801561047357600080fd5b506102eb6104823660046127e9565b610f63565b34801561049357600080fd5b5061024d611031565b3480156104a857600080fd5b5060065473ffffffffffffffffffffffffffffffffffffffff16610291565b3480156104d357600080fd5b506102646110bc565b61024d6104ea366004612a79565b6110cb565b3480156104fb57600080fd5b5061024d61050a3660046128e9565b6112e1565b34801561051b57600080fd5b506008546102239060ff1681565b34801561053557600080fd5b5061024d610544366004612870565b6113f8565b34801561055557600080fd5b50610264610564366004612a79565b6114a0565b34801561057557600080fd5b5061024d61058436600461294c565b6115b0565b34801561059557600080fd5b506102236105a4366004612803565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156105eb57600080fd5b506102eb601481565b34801561060057600080fd5b5061022361060f3660046127e9565b600a6020526000908152604090205460ff1681565b34801561063057600080fd5b5061024d61063f3660046127e9565b6116eb565b61024d610652366004612a79565b611818565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806106ea57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061073657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60065473ffffffffffffffffffffffffffffffffffffffff1633146107c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6060600080546107fe90612c61565b80601f016020809104026020016040519081016040528092919081815260200182805461082a90612c61565b80156108775780601f1061084c57610100808354040283529160200191610877565b820191906000526020600020905b81548152906001019060200180831161085a57829003601f168201915b5050505050905090565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16610932576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016107b9565b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600061096682610eb1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a24576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016107b9565b3373ffffffffffffffffffffffffffffffffffffffff82161480610a4d5750610a4d81336105a4565b610ad9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107b9565b610ae38383611aef565b505050565b610af23382611b8f565b610b7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016107b9565b610ae3838383611cff565b60065473ffffffffffffffffffffffffffffffffffffffff163314610c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107b9565b600081600954610c1a9190612bb5565b9050611770811115610c88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f416d6f756e742065786365656473206d617820737570706c790000000000000060448201526064016107b9565b60005b82811015610cbc57610caa3382600954610ca59190612bb5565b611f66565b80610cb481612cb5565b915050610c8b565b5060095550565b60065473ffffffffffffffffffffffffffffffffffffffff163314610d44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107b9565b60405133904780156108fc02916000818181858888f19350505050158015610d70573d6000803e3d6000fd5b50565b60065473ffffffffffffffffffffffffffffffffffffffff163314610df4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107b9565b610dfc612128565b565b610ae3838383604051806020016040528060008152506113f8565b60065473ffffffffffffffffffffffffffffffffffffffff163314610e9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107b9565b8051610ead9060079060208401906126b1565b5050565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff1680610736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016107b9565b600073ffffffffffffffffffffffffffffffffffffffff8216611008576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016107b9565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b60065473ffffffffffffffffffffffffffffffffffffffff1633146110b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107b9565b610dfc6000612209565b6060600180546107fe90612c61565b60065474010000000000000000000000000000000000000000900460ff1615611150576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016107b9565b60148111156111bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f416d6f756e742065786365656473206d6178207065722074780000000000000060448201526064016107b9565b6000816009546111cb9190612bb5565b9050611770811115611239576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f416d6f756e742065786365656473206d617820737570706c790000000000000060448201526064016107b9565b61124a82669fdf42f6e48000612be1565b34146112b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f57726f6e672065746820616d6f756e740000000000000000000000000000000060448201526064016107b9565b60005b82811015610cbc576112cf3382600954610ca59190612bb5565b806112d981612cb5565b9150506112b5565b73ffffffffffffffffffffffffffffffffffffffff8216331415611361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107b9565b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6114023383611b8f565b61148e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016107b9565b61149a84848484612280565b50505050565b60008181526002602052604090205460609073ffffffffffffffffffffffffffffffffffffffff16611554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e000000000000000000000000000000000060648201526084016107b9565b600061155e612323565b9050600081511161157e57604051806020016040528060008152506115a9565b8061158884612332565b604051602001611599929190612adb565b6040516020818303038152906040525b9392505050565b60065473ffffffffffffffffffffffffffffffffffffffff163314611631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107b9565b60005b8151811015610ead576001600a600084848151811061167c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055806116e381612cb5565b915050611634565b60065473ffffffffffffffffffffffffffffffffffffffff16331461176c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107b9565b73ffffffffffffffffffffffffffffffffffffffff811661180f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107b9565b610d7081612209565b60065474010000000000000000000000000000000000000000900460ff1661189c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016107b9565b60085460ff16611908576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f50726573616c65206861736e277420737461727465642079657400000000000060448201526064016107b9565b336000908152600a602052604090205460ff16611981576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f416464726573732069736e27742077686974656c69737465640000000000000060448201526064016107b9565b336000908152600b602052604090205460049061199f908390612bb5565b1115611a07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f416d6f756e7420657863656564732070726573616c65206d617800000000000060448201526064016107b9565b611a1881669fdf42f6e48000612be1565b3414611a80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f57726f6e672065746820616d6f756e740000000000000000000000000000000060448201526064016107b9565b60005b81811015611aaf57611a9d3382600954610ca59190612bb5565b80611aa781612cb5565b915050611a83565b5080600954611abe9190612bb5565b600955336000908152600b6020526040902054611adc908290612bb5565b336000908152600b602052604090205550565b600081815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190611b4982610eb1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16611c40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016107b9565b6000611c4b83610eb1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611cba57508373ffffffffffffffffffffffffffffffffffffffff16611ca284610881565b73ffffffffffffffffffffffffffffffffffffffff16145b80611cf7575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff16611d1f82610eb1565b73ffffffffffffffffffffffffffffffffffffffff1614611dc2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e000000000000000000000000000000000000000000000060648201526084016107b9565b73ffffffffffffffffffffffffffffffffffffffff8216611e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016107b9565b611e6f600082611aef565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120805460019290611ea5908490612c1e565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260408120805460019290611ee0908490612bb5565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b73ffffffffffffffffffffffffffffffffffffffff8216611fe3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107b9565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff161561206f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107b9565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054600192906120a5908490612bb5565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60065474010000000000000000000000000000000000000000900460ff166121ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016107b9565b600680547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040805133815290517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9181900360200190a1565b6006805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61228b848484611cff565b612297848484846124b2565b61149a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016107b9565b6060600780546107fe90612c61565b60608161237257505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561239c578061238681612cb5565b91506123959050600a83612bcd565b9150612376565b60008167ffffffffffffffff8111156123de577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612408576020820181803683370190505b5090505b8415611cf75761241d600183612c1e565b915061242a600a86612cee565b612435906030612bb5565b60f81b818381518110612471577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506124ab600a86612bcd565b945061240c565b600073ffffffffffffffffffffffffffffffffffffffff84163b156126a6576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290612529903390899088908890600401612b0a565b602060405180830381600087803b15801561254357600080fd5b505af1925050508015612591575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261258e91810190612a17565b60015b61265b573d8080156125bf576040519150601f19603f3d011682016040523d82523d6000602084013e6125c4565b606091505b508051612653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016107b9565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611cf7565b506001949350505050565b8280546126bd90612c61565b90600052602060002090601f0160209004810192826126df5760008555612725565b82601f106126f857805160ff1916838001178555612725565b82800160010185558215612725579182015b8281111561272557825182559160200191906001019061270a565b50612731929150612735565b5090565b5b808211156127315760008155600101612736565b600067ffffffffffffffff83111561276457612764612d60565b61279560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601612b66565b90508281528383830111156127a957600080fd5b828260208301376000602084830101529392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146127e457600080fd5b919050565b6000602082840312156127fa578081fd5b6115a9826127c0565b60008060408385031215612815578081fd5b61281e836127c0565b915061282c602084016127c0565b90509250929050565b600080600060608486031215612849578081fd5b612852846127c0565b9250612860602085016127c0565b9150604084013590509250925092565b60008060008060808587031215612885578081fd5b61288e856127c0565b935061289c602086016127c0565b925060408501359150606085013567ffffffffffffffff8111156128be578182fd5b8501601f810187136128ce578182fd5b6128dd8782356020840161274a565b91505092959194509250565b600080604083850312156128fb578182fd5b612904836127c0565b915060208301358015158114612918578182fd5b809150509250929050565b60008060408385031215612935578182fd5b61293e836127c0565b946020939093013593505050565b6000602080838503121561295e578182fd5b823567ffffffffffffffff80821115612975578384fd5b818501915085601f830112612988578384fd5b81358181111561299a5761299a612d60565b8060051b91506129ab848301612b66565b8181528481019084860184860187018a10156129c5578788fd5b8795505b838610156129ee576129da816127c0565b8352600195909501949186019186016129c9565b5098975050505050505050565b600060208284031215612a0c578081fd5b81356115a981612d8f565b600060208284031215612a28578081fd5b81516115a981612d8f565b600060208284031215612a44578081fd5b813567ffffffffffffffff811115612a5a578182fd5b8201601f81018413612a6a578182fd5b611cf78482356020840161274a565b600060208284031215612a8a578081fd5b5035919050565b60008151808452612aa9816020860160208601612c35565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008351612aed818460208801612c35565b835190830190612b01818360208801612c35565b01949350505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152612b496080830184612a91565b9695505050505050565b6020815260006115a96020830184612a91565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612bad57612bad612d60565b604052919050565b60008219821115612bc857612bc8612d02565b500190565b600082612bdc57612bdc612d31565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612c1957612c19612d02565b500290565b600082821015612c3057612c30612d02565b500390565b60005b83811015612c50578181015183820152602001612c38565b8381111561149a5750506000910152565b600181811c90821680612c7557607f821691505b60208210811415612caf577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ce757612ce7612d02565b5060010190565b600082612cfd57612cfd612d31565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610d7057600080fdfea264697066735822122026e821d582030e23b32e12a8dede5c357027539de34804bd129290e390a59c0e64736f6c63430008040033

Deployed Bytecode Sourcemap

37140:2760:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20508:305;;;;;;;;;;-1:-1:-1;20508:305:0;;;;;:::i;:::-;;:::i;:::-;;;6771:14:1;;6764:22;6746:41;;6734:2;6719:18;20508:305:0;;;;;;;;39417:83;;;;;;;;;;;;;:::i;:::-;;21453:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23012:221::-;;;;;;;;;;-1:-1:-1;23012:221:0;;;;;:::i;:::-;;:::i;:::-;;;6035:42:1;6023:55;;;6005:74;;5993:2;5978:18;23012:221:0;5960:125:1;22535:411:0;;;;;;;;;;-1:-1:-1;22535:411:0;;;;;:::i;:::-;;:::i;37246:48::-;;;;;;;;;;;;37293:1;37246:48;;;;;16361:25:1;;;16349:2;16334:18;37246:48:0;16316:76:1;37467:26:0;;;;;;;;;;;;;;;;23902:339;;;;;;;;;;-1:-1:-1;23902:339:0;;;;;:::i;:::-;;:::i;37301:41::-;;;;;;;;;;;;37338:4;37301:41;;38193:331;;;;;;;;;;-1:-1:-1;38193:331:0;;;;;:::i;:::-;;:::i;39681:109::-;;;;;;;;;;;;;:::i;39606:67::-;;;;;;;;;;;;;:::i;24312:185::-;;;;;;;;;;-1:-1:-1;24312:185:0;;;;;:::i;:::-;;:::i;39508:90::-;;;;;;;;;;-1:-1:-1;39508:90:0;;;;;:::i;:::-;;:::i;37557:55::-;;;;;;;;;;-1:-1:-1;37557:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;35917:86;;;;;;;;;;-1:-1:-1;35988:7:0;;;;;;;35917:86;;21147:239;;;;;;;;;;-1:-1:-1;21147:239:0;;;;;:::i;:::-;;:::i;37349:44::-;;;;;;;;;;;;37385:8;37349:44;;20877:208;;;;;;;;;;-1:-1:-1;20877:208:0;;;;;:::i;:::-;;:::i;34247:94::-;;;;;;;;;;;;;:::i;33596:87::-;;;;;;;;;;-1:-1:-1;33669:6:0;;;;33596:87;;21622:104;;;;;;;;;;;;;:::i;37701:484::-;;;;;;:::i;:::-;;:::i;23305:295::-;;;;;;;;;;-1:-1:-1;23305:295:0;;;;;:::i;:::-;;:::i;37432:26::-;;;;;;;;;;-1:-1:-1;37432:26:0;;;;;;;;24568:328;;;;;;;;;;-1:-1:-1;24568:328:0;;;;;:::i;:::-;;:::i;21797:334::-;;;;;;;;;;-1:-1:-1;21797:334:0;;;;;:::i;:::-;;:::i;39194:215::-;;;;;;;;;;-1:-1:-1;39194:215:0;;;;;:::i;:::-;;:::i;23671:164::-;;;;;;;;;;-1:-1:-1;23671:164:0;;;;;:::i;:::-;23792:25;;;;23768:4;23792:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23671:164;37198:41;;;;;;;;;;;;37237:2;37198:41;;37502:48;;;;;;;;;;-1:-1:-1;37502:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;34496:192;;;;;;;;;;-1:-1:-1;34496:192:0;;;;;:::i;:::-;;:::i;38532:654::-;;;;;;:::i;:::-;;:::i;20508:305::-;20610:4;20647:40;;;20662:25;20647:40;;:105;;-1:-1:-1;20704:48:0;;;20719:33;20704:48;20647:105;:158;;;-1:-1:-1;19181:25:0;19166:40;;;;20769:36;20627:178;20508:305;-1:-1:-1;;20508:305:0:o;39417:83::-;33669:6;;33816:23;33669:6;16119:10;33816:23;33808:68;;;;;;;13702:2:1;33808:68:0;;;13684:21:1;;;13721:18;;;13714:30;13780:34;13760:18;;;13753:62;13832:18;;33808:68:0;;;;;;;;;39471:14:::1;:21:::0;;;::::1;39488:4;39471:21;::::0;;39417:83::o;21453:100::-;21507:13;21540:5;21533:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21453:100;:::o;23012:221::-;23088:7;26495:16;;;:7;:16;;;;;;:30;:16;23108:73;;;;;;;13289:2:1;23108:73:0;;;13271:21:1;13328:2;13308:18;;;13301:30;13367:34;13347:18;;;13340:62;13438:14;13418:18;;;13411:42;13470:19;;23108:73:0;13261:234:1;23108:73:0;-1:-1:-1;23201:24:0;;;;:15;:24;;;;;;;;;23012:221::o;22535:411::-;22616:13;22632:23;22647:7;22632:14;:23::i;:::-;22616:39;;22680:5;22674:11;;:2;:11;;;;22666:57;;;;;;;14889:2:1;22666:57:0;;;14871:21:1;14928:2;14908:18;;;14901:30;14967:34;14947:18;;;14940:62;15038:3;15018:18;;;15011:31;15059:19;;22666:57:0;14861:223:1;22666:57:0;16119:10;22758:21;;;;;:62;;-1:-1:-1;22783:37:0;22800:5;16119:10;23671:164;:::i;22783:37::-;22736:168;;;;;;;11327:2:1;22736:168:0;;;11309:21:1;11366:2;11346:18;;;11339:30;11405:34;11385:18;;;11378:62;11476:26;11456:18;;;11449:54;11520:19;;22736:168:0;11299:246:1;22736:168:0;22917:21;22926:2;22930:7;22917:8;:21::i;:::-;22535:411;;;:::o;23902:339::-;24097:41;16119:10;24130:7;24097:18;:41::i;:::-;24089:103;;;;;;;15645:2:1;24089:103:0;;;15627:21:1;15684:2;15664:18;;;15657:30;15723:34;15703:18;;;15696:62;15794:19;15774:18;;;15767:47;15831:19;;24089:103:0;15617:239:1;24089:103:0;24205:28;24215:4;24221:2;24225:7;24205:9;:28::i;38193:331::-;33669:6;;33816:23;33669:6;16119:10;33816:23;33808:68;;;;;;;13702:2:1;33808:68:0;;;13684:21:1;;;13721:18;;;13714:30;13780:34;13760:18;;;13753:62;13832:18;;33808:68:0;13674:182:1;33808:68:0;38258:17:::1;38292:6;38278:11;;:20;;;;:::i;:::-;38258:40;;37338:4;38317:9;:23;;38309:61;;;::::0;::::1;::::0;;16063:2:1;38309:61:0::1;::::0;::::1;16045:21:1::0;16102:2;16082:18;;;16075:30;16141:27;16121:18;;;16114:55;16186:18;;38309:61:0::1;16035:175:1::0;38309:61:0::1;38388:9;38383:98;38407:6;38403:1;:10;38383:98;;;38435:34;38441:10;38467:1;38453:11;;:15;;;;:::i;:::-;38435:5;:34::i;:::-;38415:3:::0;::::1;::::0;::::1;:::i;:::-;;;;38383:98;;;-1:-1:-1::0;38493:11:0::1;:23:::0;-1:-1:-1;38193:331:0:o;39681:109::-;33669:6;;33816:23;33669:6;16119:10;33816:23;33808:68;;;;;;;13702:2:1;33808:68:0;;;13684:21:1;;;13721:18;;;13714:30;13780:34;13760:18;;;13753:62;13832:18;;33808:68:0;13674:182:1;33808:68:0;39731:51:::1;::::0;39739:10:::1;::::0;39760:21:::1;39731:51:::0;::::1;;;::::0;::::1;::::0;;;39760:21;39739:10;39731:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;39681:109::o:0;39606:67::-;33669:6;;33816:23;33669:6;16119:10;33816:23;33808:68;;;;;;;13702:2:1;33808:68:0;;;13684:21:1;;;13721:18;;;13714:30;13780:34;13760:18;;;13753:62;13832:18;;33808:68:0;13674:182:1;33808:68:0;39655:10:::1;:8;:10::i;:::-;39606:67::o:0;24312:185::-;24450:39;24467:4;24473:2;24477:7;24450:39;;;;;;;;;;;;:16;:39::i;39508:90::-;33669:6;;33816:23;33669:6;16119:10;33816:23;33808:68;;;;;;;13702:2:1;33808:68:0;;;13684:21:1;;;13721:18;;;13714:30;13780:34;13760:18;;;13753:62;13832:18;;33808:68:0;13674:182:1;33808:68:0;39577:13;;::::1;::::0;:7:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;;39508:90:::0;:::o;21147:239::-;21219:7;21255:16;;;:7;:16;;;;;;;;21290:19;21282:73;;;;;;;12163:2:1;21282:73:0;;;12145:21:1;12202:2;12182:18;;;12175:30;12241:34;12221:18;;;12214:62;12312:11;12292:18;;;12285:39;12341:19;;21282:73:0;12135:231:1;20877:208:0;20949:7;20977:19;;;20969:74;;;;;;;11752:2:1;20969:74:0;;;11734:21:1;11791:2;11771:18;;;11764:30;11830:34;11810:18;;;11803:62;11901:12;11881:18;;;11874:40;11931:19;;20969:74:0;11724:232:1;20969:74:0;-1:-1:-1;21061:16:0;;;;;;:9;:16;;;;;;;20877:208::o;34247:94::-;33669:6;;33816:23;33669:6;16119:10;33816:23;33808:68;;;;;;;13702:2:1;33808:68:0;;;13684:21:1;;;13721:18;;;13714:30;13780:34;13760:18;;;13753:62;13832:18;;33808:68:0;13674:182:1;33808:68:0;34312:21:::1;34330:1;34312:9;:21::i;21622:104::-:0;21678:13;21711:7;21704:14;;;;;:::i;37701:484::-;35988:7;;;;;;;36242:9;36234:38;;;;;;;10982:2:1;36234:38:0;;;10964:21:1;11021:2;11001:18;;;10994:30;11060:18;11040;;;11033:46;11096:18;;36234:38:0;10954:166:1;36234:38:0;37237:2:::1;37781:6;:22;;37773:60;;;::::0;::::1;::::0;;10215:2:1;37773:60:0::1;::::0;::::1;10197:21:1::0;10254:2;10234:18;;;10227:30;10293:27;10273:18;;;10266:55;10338:18;;37773:60:0::1;10187:175:1::0;37773:60:0::1;37846:17;37880:6;37866:11;;:20;;;;:::i;:::-;37846:40;;37338:4;37907:9;:23;;37899:61;;;::::0;::::1;::::0;;16063:2:1;37899:61:0::1;::::0;::::1;16045:21:1::0;16102:2;16082:18;;;16075:30;16141:27;16121:18;;;16114:55;16186:18;;37899:61:0::1;16035:175:1::0;37899:61:0::1;37992:18;38004:6:::0;37385:8:::1;37992:18;:::i;:::-;37979:9;:31;37971:60;;;::::0;::::1;::::0;;9111:2:1;37971:60:0::1;::::0;::::1;9093:21:1::0;9150:2;9130:18;;;9123:30;9189:18;9169;;;9162:46;9225:18;;37971:60:0::1;9083:166:1::0;37971:60:0::1;38049:9;38044:98;38068:6;38064:1;:10;38044:98;;;38096:34;38102:10;38128:1;38114:11;;:15;;;;:::i;38096:34::-;38076:3:::0;::::1;::::0;::::1;:::i;:::-;;;;38044:98;;23305:295:::0;23408:24;;;16119:10;23408:24;;23400:62;;;;;;;9861:2:1;23400:62:0;;;9843:21:1;9900:2;9880:18;;;9873:30;9939:27;9919:18;;;9912:55;9984:18;;23400:62:0;9833:175:1;23400:62:0;16119:10;23475:32;;;;:18;:32;;;;;;;;;:42;;;;;;;;;;;;:53;;;;;;;;;;;;;23544:48;;6746:41:1;;;23475:42:0;;16119:10;23544:48;;6719:18:1;23544:48:0;;;;;;;23305:295;;:::o;24568:328::-;24743:41;16119:10;24776:7;24743:18;:41::i;:::-;24735:103;;;;;;;15645:2:1;24735:103:0;;;15627:21:1;15684:2;15664:18;;;15657:30;15723:34;15703:18;;;15696:62;15794:19;15774:18;;;15767:47;15831:19;;24735:103:0;15617:239:1;24735:103:0;24849:39;24863:4;24869:2;24873:7;24882:5;24849:13;:39::i;:::-;24568:328;;;;:::o;21797:334::-;26471:4;26495:16;;;:7;:16;;;;;;21870:13;;26495:30;:16;21896:76;;;;;;;14473:2:1;21896:76:0;;;14455:21:1;14512:2;14492:18;;;14485:30;14551:34;14531:18;;;14524:62;14622:17;14602:18;;;14595:45;14657:19;;21896:76:0;14445:237:1;21896:76:0;21985:21;22009:10;:8;:10::i;:::-;21985:34;;22061:1;22043:7;22037:21;:25;:86;;;;;;;;;;;;;;;;;22089:7;22098:18;:7;:16;:18::i;:::-;22072:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22037:86;22030:93;21797:334;-1:-1:-1;;;21797:334:0:o;39194:215::-;33669:6;;33816:23;33669:6;16119:10;33816:23;33808:68;;;;;;;13702:2:1;33808:68:0;;;13684:21:1;;;13721:18;;;13714:30;13780:34;13760:18;;;13753:62;13832:18;;33808:68:0;13674:182:1;33808:68:0;39292:9:::1;39287:115;39311:11;:18;39307:1;:22;39287:115;;;39386:4;39351:16;:32;39368:11;39380:1;39368:14;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;;;;;39351:32:::1;;::::0;;;::::1;::::0;;;;;;-1:-1:-1;39351:32:0;:39;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;39331:3;::::1;::::0;::::1;:::i;:::-;;;;39287:115;;34496:192:::0;33669:6;;33816:23;33669:6;16119:10;33816:23;33808:68;;;;;;;13702:2:1;33808:68:0;;;13684:21:1;;;13721:18;;;13714:30;13780:34;13760:18;;;13753:62;13832:18;;33808:68:0;13674:182:1;33808:68:0;34585:22:::1;::::0;::::1;34577:73;;;::::0;::::1;::::0;;8347:2:1;34577:73:0::1;::::0;::::1;8329:21:1::0;8386:2;8366:18;;;8359:30;8425:34;8405:18;;;8398:62;8496:8;8476:18;;;8469:36;8522:19;;34577:73:0::1;8319:228:1::0;34577:73:0::1;34661:19;34671:8;34661:9;:19::i;38532:654::-:0;35988:7;;;;;;;36512:41;;;;;;;7224:2:1;36512:41:0;;;7206:21:1;7263:2;7243:18;;;7236:30;7302:22;7282:18;;;7275:50;7342:18;;36512:41:0;7196:170:1;36512:41:0;38616:14:::1;::::0;::::1;;38608:53;;;::::0;::::1;::::0;;7992:2:1;38608:53:0::1;::::0;::::1;7974:21:1::0;8031:2;8011:18;;;8004:30;8070:28;8050:18;;;8043:56;8116:18;;38608:53:0::1;7964:176:1::0;38608:53:0::1;38697:10;38680:28;::::0;;;:16:::1;:28;::::0;;;;;::::1;;38672:66;;;::::0;::::1;::::0;;15291:2:1;38672:66:0::1;::::0;::::1;15273:21:1::0;15330:2;15310:18;;;15303:30;15369:27;15349:18;;;15342:55;15414:18;;38672:66:0::1;15263:175:1::0;38672:66:0::1;38778:10;38757:32;::::0;;;:20:::1;:32;::::0;;;;;37293:1:::1;::::0;38757:41:::1;::::0;38792:6;;38757:41:::1;:::i;:::-;:65;;38749:104;;;::::0;::::1;::::0;;12573:2:1;38749:104:0::1;::::0;::::1;12555:21:1::0;12612:2;12592:18;;;12585:30;12651:28;12631:18;;;12624:56;12697:18;;38749:104:0::1;12545:176:1::0;38749:104:0::1;38885:18;38897:6:::0;37385:8:::1;38885:18;:::i;:::-;38872:9;:31;38864:60;;;::::0;::::1;::::0;;9111:2:1;38864:60:0::1;::::0;::::1;9093:21:1::0;9150:2;9130:18;;;9123:30;9189:18;9169;;;9162:46;9225:18;;38864:60:0::1;9083:166:1::0;38864:60:0::1;38942:9;38937:98;38961:6;38957:1;:10;38937:98;;;38989:34;38995:10;39021:1;39007:11;;:15;;;;:::i;38989:34::-;38969:3:::0;::::1;::::0;::::1;:::i;:::-;;;;38937:98;;;;39075:6;39061:11;;:20;;;;:::i;:::-;39047:11;:34:::0;39158:10:::1;39137:32;::::0;;;:20:::1;:32;::::0;;;;;:41:::1;::::0;39172:6;;39137:41:::1;:::i;:::-;39123:10;39102:32;::::0;;;:20:::1;:32;::::0;;;;:76;-1:-1:-1;38532:654:0:o;30388:174::-;30463:24;;;;:15;:24;;;;;:29;;;;;;;;;;;;;:24;;30517:23;30463:24;30517:14;:23::i;:::-;30508:46;;;;;;;;;;;;30388:174;;:::o;26700:348::-;26793:4;26495:16;;;:7;:16;;;;;;:30;:16;26810:73;;;;;;;10569:2:1;26810:73:0;;;10551:21:1;10608:2;10588:18;;;10581:30;10647:34;10627:18;;;10620:62;10718:14;10698:18;;;10691:42;10750:19;;26810:73:0;10541:234:1;26810:73:0;26894:13;26910:23;26925:7;26910:14;:23::i;:::-;26894:39;;26963:5;26952:16;;:7;:16;;;:51;;;;26996:7;26972:31;;:20;26984:7;26972:11;:20::i;:::-;:31;;;26952:51;:87;;;-1:-1:-1;23792:25:0;;;;23768:4;23792:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27007:32;26944:96;26700:348;-1:-1:-1;;;;26700:348:0:o;29692:578::-;29851:4;29824:31;;:23;29839:7;29824:14;:23::i;:::-;:31;;;29816:85;;;;;;;14063:2:1;29816:85:0;;;14045:21:1;14102:2;14082:18;;;14075:30;14141:34;14121:18;;;14114:62;14212:11;14192:18;;;14185:39;14241:19;;29816:85:0;14035:231:1;29816:85:0;29920:16;;;29912:65;;;;;;;9456:2:1;29912:65:0;;;9438:21:1;9495:2;9475:18;;;9468:30;9534:34;9514:18;;;9507:62;9605:6;9585:18;;;9578:34;9629:19;;29912:65:0;9428:226:1;29912:65:0;30094:29;30111:1;30115:7;30094:8;:29::i;:::-;30136:15;;;;;;;:9;:15;;;;;:20;;30155:1;;30136:15;:20;;30155:1;;30136:20;:::i;:::-;;;;-1:-1:-1;;30167:13:0;;;;;;;:9;:13;;;;;:18;;30184:1;;30167:13;:18;;30184:1;;30167:18;:::i;:::-;;;;-1:-1:-1;;30196:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;;30235:27;;30196:16;;30235:27;;;;;;;29692:578;;;:::o;28384:382::-;28464:16;;;28456:61;;;;;;;12928:2:1;28456:61:0;;;12910:21:1;;;12947:18;;;12940:30;13006:34;12986:18;;;12979:62;13058:18;;28456:61:0;12900:182:1;28456:61:0;26471:4;26495:16;;;:7;:16;;;;;;:30;:16;:30;28528:58;;;;;;;8754:2:1;28528:58:0;;;8736:21:1;8793:2;8773:18;;;8766:30;8832;8812:18;;;8805:58;8880:18;;28528:58:0;8726:178:1;28528:58:0;28657:13;;;;;;;:9;:13;;;;;:18;;28674:1;;28657:13;:18;;28674:1;;28657:18;:::i;:::-;;;;-1:-1:-1;;28686:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;28725:33;;28686:16;;;28725:33;;28686:16;;28725:33;28384:382;;:::o;36976:120::-;35988:7;;;;;;;36512:41;;;;;;;7224:2:1;36512:41:0;;;7206:21:1;7263:2;7243:18;;;7236:30;7302:22;7282:18;;;7275:50;7342:18;;36512:41:0;7196:170:1;36512:41:0;37035:7:::1;:15:::0;;;::::1;::::0;;37066:22:::1;::::0;;16119:10;6005:74:1;;37066:22:0;;::::1;::::0;;;;5993:2:1;37066:22:0;;::::1;36976:120::o:0;34696:173::-;34771:6;;;;34788:17;;;;;;;;;;;34821:40;;34771:6;;;34788:17;34771:6;;34821:40;;34752:16;;34821:40;34696:173;;:::o;25778:315::-;25935:28;25945:4;25951:2;25955:7;25935:9;:28::i;:::-;25982:48;26005:4;26011:2;26015:7;26024:5;25982:22;:48::i;:::-;25974:111;;;;;;;7573:2:1;25974:111:0;;;7555:21:1;7612:2;7592:18;;;7585:30;7651:34;7631:18;;;7624:62;7722:20;7702:18;;;7695:48;7760:19;;25974:111:0;7545:240:1;39798:99:0;39849:13;39882:7;39875:14;;;;;:::i;16533:723::-;16589:13;16810:10;16806:53;;-1:-1:-1;;16837:10:0;;;;;;;;;;;;;;;;;;16533:723::o;16806:53::-;16884:5;16869:12;16925:78;16932:9;;16925:78;;16958:8;;;;:::i;:::-;;-1:-1:-1;16981:10:0;;-1:-1:-1;16989:2:0;16981:10;;:::i;:::-;;;16925:78;;;17013:19;17045:6;17035:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17035:17:0;;17013:39;;17063:154;17070:10;;17063:154;;17097:11;17107:1;17097:11;;:::i;:::-;;-1:-1:-1;17166:10:0;17174:2;17166:5;:10;:::i;:::-;17153:24;;:2;:24;:::i;:::-;17140:39;;17123:6;17130;17123:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;-1:-1:-1;17194:11:0;17203:2;17194:11;;:::i;:::-;;;17063:154;;31127:799;31282:4;31303:13;;;8437:20;8485:8;31299:620;;31339:72;;;;;:36;;;;;;:72;;16119:10;;31390:4;;31396:7;;31405:5;;31339:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31339:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31335:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31581:13:0;;31577:272;;31624:60;;;;;7573:2:1;31624:60:0;;;7555:21:1;7612:2;7592:18;;;7585:30;7651:34;7631:18;;;7624:62;7722:20;7702:18;;;7695:48;7760:19;;31624:60:0;7545:240:1;31577:272:0;31799:6;31793:13;31784:6;31780:2;31776:15;31769:38;31335:529;31462:51;;31472:41;31462:51;;-1:-1:-1;31455:58:0;;31299:620;-1:-1:-1;31903:4:0;31127:799;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:465:1;78:5;112:18;104:6;101:30;98:2;;;134:18;;:::i;:::-;172:116;282:4;213:66;208:2;200:6;196:15;192:88;188:99;172:116;:::i;:::-;163:125;;311:6;304:5;297:21;351:3;342:6;337:3;333:16;330:25;327:2;;;368:1;365;358:12;327:2;417:6;412:3;405:4;398:5;394:16;381:43;471:1;464:4;455:6;448:5;444:18;440:29;433:40;88:391;;;;;:::o;484:196::-;552:20;;612:42;601:54;;591:65;;581:2;;670:1;667;660:12;581:2;533:147;;;:::o;685:196::-;744:6;797:2;785:9;776:7;772:23;768:32;765:2;;;818:6;810;803:22;765:2;846:29;865:9;846:29;:::i;886:270::-;954:6;962;1015:2;1003:9;994:7;990:23;986:32;983:2;;;1036:6;1028;1021:22;983:2;1064:29;1083:9;1064:29;:::i;:::-;1054:39;;1112:38;1146:2;1135:9;1131:18;1112:38;:::i;:::-;1102:48;;973:183;;;;;:::o;1161:338::-;1238:6;1246;1254;1307:2;1295:9;1286:7;1282:23;1278:32;1275:2;;;1328:6;1320;1313:22;1275:2;1356:29;1375:9;1356:29;:::i;:::-;1346:39;;1404:38;1438:2;1427:9;1423:18;1404:38;:::i;:::-;1394:48;;1489:2;1478:9;1474:18;1461:32;1451:42;;1265:234;;;;;:::o;1504:696::-;1599:6;1607;1615;1623;1676:3;1664:9;1655:7;1651:23;1647:33;1644:2;;;1698:6;1690;1683:22;1644:2;1726:29;1745:9;1726:29;:::i;:::-;1716:39;;1774:38;1808:2;1797:9;1793:18;1774:38;:::i;:::-;1764:48;;1859:2;1848:9;1844:18;1831:32;1821:42;;1914:2;1903:9;1899:18;1886:32;1941:18;1933:6;1930:30;1927:2;;;1978:6;1970;1963:22;1927:2;2006:22;;2059:4;2051:13;;2047:27;-1:-1:-1;2037:2:1;;2093:6;2085;2078:22;2037:2;2121:73;2186:7;2181:2;2168:16;2163:2;2159;2155:11;2121:73;:::i;:::-;2111:83;;;1634:566;;;;;;;:::o;2205:367::-;2270:6;2278;2331:2;2319:9;2310:7;2306:23;2302:32;2299:2;;;2352:6;2344;2337:22;2299:2;2380:29;2399:9;2380:29;:::i;:::-;2370:39;;2459:2;2448:9;2444:18;2431:32;2506:5;2499:13;2492:21;2485:5;2482:32;2472:2;;2533:6;2525;2518:22;2472:2;2561:5;2551:15;;;2289:283;;;;;:::o;2577:264::-;2645:6;2653;2706:2;2694:9;2685:7;2681:23;2677:32;2674:2;;;2727:6;2719;2712:22;2674:2;2755:29;2774:9;2755:29;:::i;:::-;2745:39;2831:2;2816:18;;;;2803:32;;-1:-1:-1;;;2664:177:1:o;2846:1008::-;2930:6;2961:2;3004;2992:9;2983:7;2979:23;2975:32;2972:2;;;3025:6;3017;3010:22;2972:2;3070:9;3057:23;3099:18;3140:2;3132:6;3129:14;3126:2;;;3161:6;3153;3146:22;3126:2;3204:6;3193:9;3189:22;3179:32;;3249:7;3242:4;3238:2;3234:13;3230:27;3220:2;;3276:6;3268;3261:22;3220:2;3317;3304:16;3339:2;3335;3332:10;3329:2;;;3345:18;;:::i;:::-;3391:2;3388:1;3384:10;3374:20;;3414:28;3438:2;3434;3430:11;3414:28;:::i;:::-;3476:15;;;3507:12;;;;3539:11;;;3569;;;3565:20;;3562:33;-1:-1:-1;3559:2:1;;;3613:6;3605;3598:22;3559:2;3640:6;3631:15;;3655:169;3669:2;3666:1;3663:9;3655:169;;;3726:23;3745:3;3726:23;:::i;:::-;3714:36;;3687:1;3680:9;;;;;3770:12;;;;3802;;3655:169;;;-1:-1:-1;3843:5:1;2941:913;-1:-1:-1;;;;;;;;2941:913:1:o;3859:255::-;3917:6;3970:2;3958:9;3949:7;3945:23;3941:32;3938:2;;;3991:6;3983;3976:22;3938:2;4035:9;4022:23;4054:30;4078:5;4054:30;:::i;4119:259::-;4188:6;4241:2;4229:9;4220:7;4216:23;4212:32;4209:2;;;4262:6;4254;4247:22;4209:2;4299:9;4293:16;4318:30;4342:5;4318:30;:::i;4383:480::-;4452:6;4505:2;4493:9;4484:7;4480:23;4476:32;4473:2;;;4526:6;4518;4511:22;4473:2;4571:9;4558:23;4604:18;4596:6;4593:30;4590:2;;;4641:6;4633;4626:22;4590:2;4669:22;;4722:4;4714:13;;4710:27;-1:-1:-1;4700:2:1;;4756:6;4748;4741:22;4700:2;4784:73;4849:7;4844:2;4831:16;4826:2;4822;4818:11;4784:73;:::i;4868:190::-;4927:6;4980:2;4968:9;4959:7;4955:23;4951:32;4948:2;;;5001:6;4993;4986:22;4948:2;-1:-1:-1;5029:23:1;;4938:120;-1:-1:-1;4938:120:1:o;5063:316::-;5104:3;5142:5;5136:12;5169:6;5164:3;5157:19;5185:63;5241:6;5234:4;5229:3;5225:14;5218:4;5211:5;5207:16;5185:63;:::i;:::-;5293:2;5281:15;5298:66;5277:88;5268:98;;;;5368:4;5264:109;;5112:267;-1:-1:-1;;5112:267:1:o;5384:470::-;5563:3;5601:6;5595:13;5617:53;5663:6;5658:3;5651:4;5643:6;5639:17;5617:53;:::i;:::-;5733:13;;5692:16;;;;5755:57;5733:13;5692:16;5789:4;5777:17;;5755:57;:::i;:::-;5828:20;;5571:283;-1:-1:-1;;;;5571:283:1:o;6090:511::-;6284:4;6313:42;6394:2;6386:6;6382:15;6371:9;6364:34;6446:2;6438:6;6434:15;6429:2;6418:9;6414:18;6407:43;;6486:6;6481:2;6470:9;6466:18;6459:34;6529:3;6524:2;6513:9;6509:18;6502:31;6550:45;6590:3;6579:9;6575:19;6567:6;6550:45;:::i;:::-;6542:53;6293:308;-1:-1:-1;;;;;;6293:308:1:o;6798:219::-;6947:2;6936:9;6929:21;6910:4;6967:44;7007:2;6996:9;6992:18;6984:6;6967:44;:::i;16397:334::-;16468:2;16462:9;16524:2;16514:13;;16529:66;16510:86;16498:99;;16627:18;16612:34;;16648:22;;;16609:62;16606:2;;;16674:18;;:::i;:::-;16710:2;16703:22;16442:289;;-1:-1:-1;16442:289:1:o;16736:128::-;16776:3;16807:1;16803:6;16800:1;16797:13;16794:2;;;16813:18;;:::i;:::-;-1:-1:-1;16849:9:1;;16784:80::o;16869:120::-;16909:1;16935;16925:2;;16940:18;;:::i;:::-;-1:-1:-1;16974:9:1;;16915:74::o;16994:228::-;17034:7;17160:1;17092:66;17088:74;17085:1;17082:81;17077:1;17070:9;17063:17;17059:105;17056:2;;;17167:18;;:::i;:::-;-1:-1:-1;17207:9:1;;17046:176::o;17227:125::-;17267:4;17295:1;17292;17289:8;17286:2;;;17300:18;;:::i;:::-;-1:-1:-1;17337:9:1;;17276:76::o;17357:258::-;17429:1;17439:113;17453:6;17450:1;17447:13;17439:113;;;17529:11;;;17523:18;17510:11;;;17503:39;17475:2;17468:10;17439:113;;;17570:6;17567:1;17564:13;17561:2;;;-1:-1:-1;;17605:1:1;17587:16;;17580:27;17410:205::o;17620:437::-;17699:1;17695:12;;;;17742;;;17763:2;;17817:4;17809:6;17805:17;17795:27;;17763:2;17870;17862:6;17859:14;17839:18;17836:38;17833:2;;;17907:77;17904:1;17897:88;18008:4;18005:1;17998:15;18036:4;18033:1;18026:15;17833:2;;17675:382;;;:::o;18062:195::-;18101:3;18132:66;18125:5;18122:77;18119:2;;;18202:18;;:::i;:::-;-1:-1:-1;18249:1:1;18238:13;;18109:148::o;18262:112::-;18294:1;18320;18310:2;;18325:18;;:::i;:::-;-1:-1:-1;18359:9:1;;18300:74::o;18379:184::-;18431:77;18428:1;18421:88;18528:4;18525:1;18518:15;18552:4;18549:1;18542:15;18568:184;18620:77;18617:1;18610:88;18717:4;18714:1;18707:15;18741:4;18738:1;18731:15;18757:184;18809:77;18806:1;18799:88;18906:4;18903:1;18896:15;18930:4;18927:1;18920:15;18946:177;19031:66;19024:5;19020:78;19013:5;19010:89;19000:2;;19113:1;19110;19103:12

Swarm Source

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