ETH Price: $3,480.10 (+4.39%)
Gas: 5 Gwei

Token

Circleorzo (CIRCLE)
 

Overview

Max Total Supply

4,444 CIRCLE

Holders

694

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
Wormhole: NFT Bridge
Balance
1 CIRCLE
0x6FFd7EdE62328b3Af38FCD61461Bbfc52F5651fE
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Circleorzo

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol
pragma solidity ^0.8.0;


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

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

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

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

// File: @openzeppelin/contracts/utils/Address.sol
pragma solidity ^0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol
pragma solidity ^0.8.0;

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol
pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol
pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol
pragma solidity ^0.8.0;

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol
pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/access/Ownable.sol
pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

// File: contracts/Circleorzo.sol
pragma solidity ^0.8.0;

contract Circleorzo is ERC721Enumerable, Ownable {
    uint256 public constant MAX_NFT_SUPPLY = 4444;
    uint public constant MAX_PURCHASABLE = 20;
    uint256 public NFT_PRICE = 44000000000000000; // 0.044 ETH
    bool public saleStarted = false;

    constructor() ERC721("Circleorzo", "CIRCLE") {
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return "https://api.circleorzo.com/";
    }

    function getTokenURI(uint256 tokenId) public view returns (string memory) {
        return tokenURI(tokenId);
    }

   function mint(uint256 amountToMint) public payable {
        require(saleStarted == true, "This sale has not started.");
        require(totalSupply() < MAX_NFT_SUPPLY, "All NFTs have been minted.");
        require(amountToMint > 0, "You must mint at least one circleorzo.");
        require(amountToMint <= MAX_PURCHASABLE, "You cannot mint more than 20 circleorzos.");
        require(totalSupply() + amountToMint <= MAX_NFT_SUPPLY, "The amount of circleorzos you are trying to mint exceeds the MAX_NFT_SUPPLY.");
        
        require(NFT_PRICE * amountToMint == msg.value, "Incorrect Ether value.");

        for (uint256 i = 0; i < amountToMint; i++) {
            uint256 mintIndex = totalSupply();
            _safeMint(msg.sender, mintIndex);
        }
   }

    function startSale() public onlyOwner {
        saleStarted = true;
    }

    function pauseSale() public onlyOwner {
        saleStarted = false;
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_NFT_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PURCHASABLE","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":"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":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"amountToMint","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052669c51c4521e0000600b556000600c60006101000a81548160ff0219169083151502179055503480156200003757600080fd5b506040518060400160405280600a81526020017f436972636c656f727a6f000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f434952434c4500000000000000000000000000000000000000000000000000008152508160009080519060200190620000bc92919062000197565b508060019080519060200190620000d592919062000197565b5050506000620000ea6200018f60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620002ac565b600033905090565b828054620001a59062000247565b90600052602060002090601f016020900481019282620001c9576000855562000215565b82601f10620001e457805160ff191683800117855562000215565b8280016001018555821562000215579182015b8281111562000214578251825591602001919060010190620001f7565b5b50905062000224919062000228565b5090565b5b808211156200024357600081600090555060010162000229565b5090565b600060028204905060018216806200026057607f821691505b602082108114156200027757620002766200027d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613cab80620002bc6000396000f3fe6080604052600436106101b75760003560e01c80636352211e116100ec578063a22cb4651161008a578063b88d4fde11610064578063b88d4fde146105ce578063c87b56dd146105f7578063e985e9c514610634578063f2fde38b14610671576101b7565b8063a22cb46514610563578063b5077f441461058c578063b66a0e5d146105b7576101b7565b8063715018a6116100c6578063715018a6146104da5780638da5cb5b146104f157806395d89b411461051c578063a0712d6814610547576101b7565b80636352211e14610435578063676dd5631461047257806370a082311461049d576101b7565b80632f745c591161015957806342842e0e1161013357806342842e0e1461038d5780634f6ccce7146103b657806355367ba9146103f35780635c474f9e1461040a576101b7565b80632f745c59146103095780633bb3a24d146103465780633ccfd60b14610383576101b7565b8063095ea7b311610195578063095ea7b314610261578063119e43981461028a57806318160ddd146102b557806323b872dd146102e0576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612a57565b61069a565b6040516101f091906134d9565b60405180910390f35b34801561020557600080fd5b5061020e610714565b60405161021b91906134f4565b60405180910390f35b34801561023057600080fd5b5061024b60048036038101906102469190612aa9565b6107a6565b6040516102589190613472565b60405180910390f35b34801561026d57600080fd5b5061028860048036038101906102839190612a1b565b61082b565b005b34801561029657600080fd5b5061029f610943565b6040516102ac9190613816565b60405180910390f35b3480156102c157600080fd5b506102ca610948565b6040516102d79190613816565b60405180910390f35b3480156102ec57600080fd5b5061030760048036038101906103029190612915565b610955565b005b34801561031557600080fd5b50610330600480360381019061032b9190612a1b565b6109b5565b60405161033d9190613816565b60405180910390f35b34801561035257600080fd5b5061036d60048036038101906103689190612aa9565b610a5a565b60405161037a91906134f4565b60405180910390f35b61038b610a6c565b005b34801561039957600080fd5b506103b460048036038101906103af9190612915565b610b28565b005b3480156103c257600080fd5b506103dd60048036038101906103d89190612aa9565b610b48565b6040516103ea9190613816565b60405180910390f35b3480156103ff57600080fd5b50610408610bdf565b005b34801561041657600080fd5b5061041f610c78565b60405161042c91906134d9565b60405180910390f35b34801561044157600080fd5b5061045c60048036038101906104579190612aa9565b610c8b565b6040516104699190613472565b60405180910390f35b34801561047e57600080fd5b50610487610d3d565b6040516104949190613816565b60405180910390f35b3480156104a957600080fd5b506104c460048036038101906104bf91906128b0565b610d43565b6040516104d19190613816565b60405180910390f35b3480156104e657600080fd5b506104ef610dfb565b005b3480156104fd57600080fd5b50610506610f38565b6040516105139190613472565b60405180910390f35b34801561052857600080fd5b50610531610f62565b60405161053e91906134f4565b60405180910390f35b610561600480360381019061055c9190612aa9565b610ff4565b005b34801561056f57600080fd5b5061058a600480360381019061058591906129df565b6111fb565b005b34801561059857600080fd5b506105a161137c565b6040516105ae9190613816565b60405180910390f35b3480156105c357600080fd5b506105cc611382565b005b3480156105da57600080fd5b506105f560048036038101906105f09190612964565b61141b565b005b34801561060357600080fd5b5061061e60048036038101906106199190612aa9565b61147d565b60405161062b91906134f4565b60405180910390f35b34801561064057600080fd5b5061065b600480360381019061065691906128d9565b611524565b60405161066891906134d9565b60405180910390f35b34801561067d57600080fd5b50610698600480360381019061069391906128b0565b6115b8565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061070d575061070c82611764565b5b9050919050565b60606000805461072390613aa0565b80601f016020809104026020016040519081016040528092919081815260200182805461074f90613aa0565b801561079c5780601f106107715761010080835404028352916020019161079c565b820191906000526020600020905b81548152906001019060200180831161077f57829003601f168201915b5050505050905090565b60006107b182611846565b6107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790613716565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061083682610c8b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089e906137b6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108c66118b2565b73ffffffffffffffffffffffffffffffffffffffff1614806108f557506108f4816108ef6118b2565b611524565b5b610934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092b90613656565b60405180910390fd5b61093e83836118ba565b505050565b601481565b6000600880549050905090565b6109666109606118b2565b82611973565b6109a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099c906137d6565b60405180910390fd5b6109b0838383611a51565b505050565b60006109c083610d43565b8210610a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f890613536565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6060610a658261147d565b9050919050565b610a746118b2565b73ffffffffffffffffffffffffffffffffffffffff16610a92610f38565b73ffffffffffffffffffffffffffffffffffffffff1614610ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adf90613756565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610b2657600080fd5b565b610b438383836040518060200160405280600081525061141b565b505050565b6000610b52610948565b8210610b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8a906137f6565b60405180910390fd5b60088281548110610bcd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610be76118b2565b73ffffffffffffffffffffffffffffffffffffffff16610c05610f38565b73ffffffffffffffffffffffffffffffffffffffff1614610c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5290613756565b60405180910390fd5b6000600c60006101000a81548160ff021916908315150217905550565b600c60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2b90613696565b60405180910390fd5b80915050919050565b600b5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dab90613676565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e036118b2565b73ffffffffffffffffffffffffffffffffffffffff16610e21610f38565b73ffffffffffffffffffffffffffffffffffffffff1614610e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6e90613756565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610f7190613aa0565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9d90613aa0565b8015610fea5780601f10610fbf57610100808354040283529160200191610fea565b820191906000526020600020905b815481529060010190602001808311610fcd57829003601f168201915b5050505050905090565b60011515600c60009054906101000a900460ff1615151461104a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104190613516565b60405180910390fd5b61115c611055610948565b10611095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108c906135f6565b60405180910390fd5b600081116110d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cf90613736565b60405180910390fd5b601481111561111c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111390613636565b60405180910390fd5b61115c81611128610948565b61113291906138d5565b1115611173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116a906136d6565b60405180910390fd5b3481600b54611182919061395c565b146111c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b9906136b6565b60405180910390fd5b60005b818110156111f75760006111d7610948565b90506111e33382611cad565b5080806111ef90613ad2565b9150506111c5565b5050565b6112036118b2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611271576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611268906135d6565b60405180910390fd5b806005600061127e6118b2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661132b6118b2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161137091906134d9565b60405180910390a35050565b61115c81565b61138a6118b2565b73ffffffffffffffffffffffffffffffffffffffff166113a8610f38565b73ffffffffffffffffffffffffffffffffffffffff16146113fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f590613756565b60405180910390fd5b6001600c60006101000a81548160ff021916908315150217905550565b61142c6114266118b2565b83611973565b61146b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611462906137d6565b60405180910390fd5b61147784848484611ccb565b50505050565b606061148882611846565b6114c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114be90613796565b60405180910390fd5b60006114d1611d27565b905060008151116114f1576040518060200160405280600081525061151c565b806114fb84611d64565b60405160200161150c92919061344e565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115c06118b2565b73ffffffffffffffffffffffffffffffffffffffff166115de610f38565b73ffffffffffffffffffffffffffffffffffffffff1614611634576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162b90613756565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169b90613576565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061182f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061183f575061183e82611f11565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661192d83610c8b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061197e82611846565b6119bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b490613616565b60405180910390fd5b60006119c883610c8b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a3757508373ffffffffffffffffffffffffffffffffffffffff16611a1f846107a6565b73ffffffffffffffffffffffffffffffffffffffff16145b80611a485750611a478185611524565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611a7182610c8b565b73ffffffffffffffffffffffffffffffffffffffff1614611ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abe90613776565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2e906135b6565b60405180910390fd5b611b42838383611f7b565b611b4d6000826118ba565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b9d91906139b6565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bf491906138d5565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611cc782826040518060200160405280600081525061208f565b5050565b611cd6848484611a51565b611ce2848484846120ea565b611d21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1890613556565b60405180910390fd5b50505050565b60606040518060400160405280601b81526020017f68747470733a2f2f6170692e636972636c656f727a6f2e636f6d2f0000000000815250905090565b60606000821415611dac576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f0c565b600082905060005b60008214611dde578080611dc790613ad2565b915050600a82611dd7919061392b565b9150611db4565b60008167ffffffffffffffff811115611e20577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611e525781602001600182028036833780820191505090505b5090505b60008514611f0557600182611e6b91906139b6565b9150600a85611e7a9190613b1b565b6030611e8691906138d5565b60f81b818381518110611ec2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611efe919061392b565b9450611e56565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611f86838383612281565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611fc957611fc481612286565b612008565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146120075761200683826122cf565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561204b576120468161243c565b61208a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461208957612088828261257f565b5b5b505050565b61209983836125fe565b6120a660008484846120ea565b6120e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120dc90613556565b60405180910390fd5b505050565b600061210b8473ffffffffffffffffffffffffffffffffffffffff166127cc565b15612274578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026121346118b2565b8786866040518563ffffffff1660e01b8152600401612156949392919061348d565b602060405180830381600087803b15801561217057600080fd5b505af19250505080156121a157506040513d601f19601f8201168201806040525081019061219e9190612a80565b60015b612224573d80600081146121d1576040519150601f19603f3d011682016040523d82523d6000602084013e6121d6565b606091505b5060008151141561221c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221390613556565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612279565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016122dc84610d43565b6122e691906139b6565b90506000600760008481526020019081526020016000205490508181146123cb576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061245091906139b6565b90506000600960008481526020019081526020016000205490506000600883815481106124a6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106124ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612563577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061258a83610d43565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561266e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612665906136f6565b60405180910390fd5b61267781611846565b156126b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ae90613596565b60405180910390fd5b6126c360008383611f7b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461271391906138d5565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60006127f26127ed84613862565b613831565b90508281526020810184848401111561280a57600080fd5b612815848285613a5e565b509392505050565b60008135905061282c81613c19565b92915050565b60008135905061284181613c30565b92915050565b60008135905061285681613c47565b92915050565b60008151905061286b81613c47565b92915050565b600082601f83011261288257600080fd5b81356128928482602086016127df565b91505092915050565b6000813590506128aa81613c5e565b92915050565b6000602082840312156128c257600080fd5b60006128d08482850161281d565b91505092915050565b600080604083850312156128ec57600080fd5b60006128fa8582860161281d565b925050602061290b8582860161281d565b9150509250929050565b60008060006060848603121561292a57600080fd5b60006129388682870161281d565b93505060206129498682870161281d565b925050604061295a8682870161289b565b9150509250925092565b6000806000806080858703121561297a57600080fd5b60006129888782880161281d565b94505060206129998782880161281d565b93505060406129aa8782880161289b565b925050606085013567ffffffffffffffff8111156129c757600080fd5b6129d387828801612871565b91505092959194509250565b600080604083850312156129f257600080fd5b6000612a008582860161281d565b9250506020612a1185828601612832565b9150509250929050565b60008060408385031215612a2e57600080fd5b6000612a3c8582860161281d565b9250506020612a4d8582860161289b565b9150509250929050565b600060208284031215612a6957600080fd5b6000612a7784828501612847565b91505092915050565b600060208284031215612a9257600080fd5b6000612aa08482850161285c565b91505092915050565b600060208284031215612abb57600080fd5b6000612ac98482850161289b565b91505092915050565b612adb816139ea565b82525050565b612aea816139fc565b82525050565b6000612afb82613892565b612b0581856138a8565b9350612b15818560208601613a6d565b612b1e81613c08565b840191505092915050565b6000612b348261389d565b612b3e81856138b9565b9350612b4e818560208601613a6d565b612b5781613c08565b840191505092915050565b6000612b6d8261389d565b612b7781856138ca565b9350612b87818560208601613a6d565b80840191505092915050565b6000612ba0601a836138b9565b91507f546869732073616c6520686173206e6f7420737461727465642e0000000000006000830152602082019050919050565b6000612be0602b836138b9565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000612c466032836138b9565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612cac6026836138b9565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612d12601c836138b9565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000612d526024836138b9565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612db86019836138b9565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000612df8601a836138b9565b91507f416c6c204e4654732068617665206265656e206d696e7465642e0000000000006000830152602082019050919050565b6000612e38602c836138b9565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000612e9e6029836138b9565b91507f596f752063616e6e6f74206d696e74206d6f7265207468616e2032302063697260008301527f636c656f727a6f732e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000612f046038836138b9565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000612f6a602a836138b9565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000612fd06029836138b9565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006130366016836138b9565b91507f496e636f72726563742045746865722076616c75652e000000000000000000006000830152602082019050919050565b6000613076604c836138b9565b91507f54686520616d6f756e74206f6620636972636c656f727a6f7320796f7520617260008301527f6520747279696e6720746f206d696e74206578636565647320746865204d415860208301527f5f4e46545f535550504c592e00000000000000000000000000000000000000006040830152606082019050919050565b60006131026020836138b9565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613142602c836138b9565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006131a86026836138b9565b91507f596f75206d757374206d696e74206174206c65617374206f6e6520636972636c60008301527f656f727a6f2e00000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061320e6020836138b9565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061324e6029836138b9565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006132b4602f836138b9565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061331a6021836138b9565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133806031836138b9565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006133e6602c836138b9565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b61344881613a54565b82525050565b600061345a8285612b62565b91506134668284612b62565b91508190509392505050565b60006020820190506134876000830184612ad2565b92915050565b60006080820190506134a26000830187612ad2565b6134af6020830186612ad2565b6134bc604083018561343f565b81810360608301526134ce8184612af0565b905095945050505050565b60006020820190506134ee6000830184612ae1565b92915050565b6000602082019050818103600083015261350e8184612b29565b905092915050565b6000602082019050818103600083015261352f81612b93565b9050919050565b6000602082019050818103600083015261354f81612bd3565b9050919050565b6000602082019050818103600083015261356f81612c39565b9050919050565b6000602082019050818103600083015261358f81612c9f565b9050919050565b600060208201905081810360008301526135af81612d05565b9050919050565b600060208201905081810360008301526135cf81612d45565b9050919050565b600060208201905081810360008301526135ef81612dab565b9050919050565b6000602082019050818103600083015261360f81612deb565b9050919050565b6000602082019050818103600083015261362f81612e2b565b9050919050565b6000602082019050818103600083015261364f81612e91565b9050919050565b6000602082019050818103600083015261366f81612ef7565b9050919050565b6000602082019050818103600083015261368f81612f5d565b9050919050565b600060208201905081810360008301526136af81612fc3565b9050919050565b600060208201905081810360008301526136cf81613029565b9050919050565b600060208201905081810360008301526136ef81613069565b9050919050565b6000602082019050818103600083015261370f816130f5565b9050919050565b6000602082019050818103600083015261372f81613135565b9050919050565b6000602082019050818103600083015261374f8161319b565b9050919050565b6000602082019050818103600083015261376f81613201565b9050919050565b6000602082019050818103600083015261378f81613241565b9050919050565b600060208201905081810360008301526137af816132a7565b9050919050565b600060208201905081810360008301526137cf8161330d565b9050919050565b600060208201905081810360008301526137ef81613373565b9050919050565b6000602082019050818103600083015261380f816133d9565b9050919050565b600060208201905061382b600083018461343f565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561385857613857613bd9565b5b8060405250919050565b600067ffffffffffffffff82111561387d5761387c613bd9565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006138e082613a54565b91506138eb83613a54565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139205761391f613b4c565b5b828201905092915050565b600061393682613a54565b915061394183613a54565b92508261395157613950613b7b565b5b828204905092915050565b600061396782613a54565b915061397283613a54565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156139ab576139aa613b4c565b5b828202905092915050565b60006139c182613a54565b91506139cc83613a54565b9250828210156139df576139de613b4c565b5b828203905092915050565b60006139f582613a34565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613a8b578082015181840152602081019050613a70565b83811115613a9a576000848401525b50505050565b60006002820490506001821680613ab857607f821691505b60208210811415613acc57613acb613baa565b5b50919050565b6000613add82613a54565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b1057613b0f613b4c565b5b600182019050919050565b6000613b2682613a54565b9150613b3183613a54565b925082613b4157613b40613b7b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613c22816139ea565b8114613c2d57600080fd5b50565b613c39816139fc565b8114613c4457600080fd5b50565b613c5081613a08565b8114613c5b57600080fd5b50565b613c6781613a54565b8114613c7257600080fd5b5056fea2646970667358221220c3f790ce9759327df45755a6268d32100e9bea0907bca8b2be613dd0536058a164736f6c63430008000033

Deployed Bytecode

0x6080604052600436106101b75760003560e01c80636352211e116100ec578063a22cb4651161008a578063b88d4fde11610064578063b88d4fde146105ce578063c87b56dd146105f7578063e985e9c514610634578063f2fde38b14610671576101b7565b8063a22cb46514610563578063b5077f441461058c578063b66a0e5d146105b7576101b7565b8063715018a6116100c6578063715018a6146104da5780638da5cb5b146104f157806395d89b411461051c578063a0712d6814610547576101b7565b80636352211e14610435578063676dd5631461047257806370a082311461049d576101b7565b80632f745c591161015957806342842e0e1161013357806342842e0e1461038d5780634f6ccce7146103b657806355367ba9146103f35780635c474f9e1461040a576101b7565b80632f745c59146103095780633bb3a24d146103465780633ccfd60b14610383576101b7565b8063095ea7b311610195578063095ea7b314610261578063119e43981461028a57806318160ddd146102b557806323b872dd146102e0576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612a57565b61069a565b6040516101f091906134d9565b60405180910390f35b34801561020557600080fd5b5061020e610714565b60405161021b91906134f4565b60405180910390f35b34801561023057600080fd5b5061024b60048036038101906102469190612aa9565b6107a6565b6040516102589190613472565b60405180910390f35b34801561026d57600080fd5b5061028860048036038101906102839190612a1b565b61082b565b005b34801561029657600080fd5b5061029f610943565b6040516102ac9190613816565b60405180910390f35b3480156102c157600080fd5b506102ca610948565b6040516102d79190613816565b60405180910390f35b3480156102ec57600080fd5b5061030760048036038101906103029190612915565b610955565b005b34801561031557600080fd5b50610330600480360381019061032b9190612a1b565b6109b5565b60405161033d9190613816565b60405180910390f35b34801561035257600080fd5b5061036d60048036038101906103689190612aa9565b610a5a565b60405161037a91906134f4565b60405180910390f35b61038b610a6c565b005b34801561039957600080fd5b506103b460048036038101906103af9190612915565b610b28565b005b3480156103c257600080fd5b506103dd60048036038101906103d89190612aa9565b610b48565b6040516103ea9190613816565b60405180910390f35b3480156103ff57600080fd5b50610408610bdf565b005b34801561041657600080fd5b5061041f610c78565b60405161042c91906134d9565b60405180910390f35b34801561044157600080fd5b5061045c60048036038101906104579190612aa9565b610c8b565b6040516104699190613472565b60405180910390f35b34801561047e57600080fd5b50610487610d3d565b6040516104949190613816565b60405180910390f35b3480156104a957600080fd5b506104c460048036038101906104bf91906128b0565b610d43565b6040516104d19190613816565b60405180910390f35b3480156104e657600080fd5b506104ef610dfb565b005b3480156104fd57600080fd5b50610506610f38565b6040516105139190613472565b60405180910390f35b34801561052857600080fd5b50610531610f62565b60405161053e91906134f4565b60405180910390f35b610561600480360381019061055c9190612aa9565b610ff4565b005b34801561056f57600080fd5b5061058a600480360381019061058591906129df565b6111fb565b005b34801561059857600080fd5b506105a161137c565b6040516105ae9190613816565b60405180910390f35b3480156105c357600080fd5b506105cc611382565b005b3480156105da57600080fd5b506105f560048036038101906105f09190612964565b61141b565b005b34801561060357600080fd5b5061061e60048036038101906106199190612aa9565b61147d565b60405161062b91906134f4565b60405180910390f35b34801561064057600080fd5b5061065b600480360381019061065691906128d9565b611524565b60405161066891906134d9565b60405180910390f35b34801561067d57600080fd5b50610698600480360381019061069391906128b0565b6115b8565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061070d575061070c82611764565b5b9050919050565b60606000805461072390613aa0565b80601f016020809104026020016040519081016040528092919081815260200182805461074f90613aa0565b801561079c5780601f106107715761010080835404028352916020019161079c565b820191906000526020600020905b81548152906001019060200180831161077f57829003601f168201915b5050505050905090565b60006107b182611846565b6107f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e790613716565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061083682610c8b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089e906137b6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108c66118b2565b73ffffffffffffffffffffffffffffffffffffffff1614806108f557506108f4816108ef6118b2565b611524565b5b610934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092b90613656565b60405180910390fd5b61093e83836118ba565b505050565b601481565b6000600880549050905090565b6109666109606118b2565b82611973565b6109a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099c906137d6565b60405180910390fd5b6109b0838383611a51565b505050565b60006109c083610d43565b8210610a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f890613536565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6060610a658261147d565b9050919050565b610a746118b2565b73ffffffffffffffffffffffffffffffffffffffff16610a92610f38565b73ffffffffffffffffffffffffffffffffffffffff1614610ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610adf90613756565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610b2657600080fd5b565b610b438383836040518060200160405280600081525061141b565b505050565b6000610b52610948565b8210610b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8a906137f6565b60405180910390fd5b60088281548110610bcd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610be76118b2565b73ffffffffffffffffffffffffffffffffffffffff16610c05610f38565b73ffffffffffffffffffffffffffffffffffffffff1614610c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5290613756565b60405180910390fd5b6000600c60006101000a81548160ff021916908315150217905550565b600c60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2b90613696565b60405180910390fd5b80915050919050565b600b5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dab90613676565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e036118b2565b73ffffffffffffffffffffffffffffffffffffffff16610e21610f38565b73ffffffffffffffffffffffffffffffffffffffff1614610e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6e90613756565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610f7190613aa0565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9d90613aa0565b8015610fea5780601f10610fbf57610100808354040283529160200191610fea565b820191906000526020600020905b815481529060010190602001808311610fcd57829003601f168201915b5050505050905090565b60011515600c60009054906101000a900460ff1615151461104a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104190613516565b60405180910390fd5b61115c611055610948565b10611095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108c906135f6565b60405180910390fd5b600081116110d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cf90613736565b60405180910390fd5b601481111561111c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111390613636565b60405180910390fd5b61115c81611128610948565b61113291906138d5565b1115611173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116a906136d6565b60405180910390fd5b3481600b54611182919061395c565b146111c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b9906136b6565b60405180910390fd5b60005b818110156111f75760006111d7610948565b90506111e33382611cad565b5080806111ef90613ad2565b9150506111c5565b5050565b6112036118b2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611271576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611268906135d6565b60405180910390fd5b806005600061127e6118b2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661132b6118b2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161137091906134d9565b60405180910390a35050565b61115c81565b61138a6118b2565b73ffffffffffffffffffffffffffffffffffffffff166113a8610f38565b73ffffffffffffffffffffffffffffffffffffffff16146113fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f590613756565b60405180910390fd5b6001600c60006101000a81548160ff021916908315150217905550565b61142c6114266118b2565b83611973565b61146b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611462906137d6565b60405180910390fd5b61147784848484611ccb565b50505050565b606061148882611846565b6114c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114be90613796565b60405180910390fd5b60006114d1611d27565b905060008151116114f1576040518060200160405280600081525061151c565b806114fb84611d64565b60405160200161150c92919061344e565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115c06118b2565b73ffffffffffffffffffffffffffffffffffffffff166115de610f38565b73ffffffffffffffffffffffffffffffffffffffff1614611634576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162b90613756565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169b90613576565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061182f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061183f575061183e82611f11565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661192d83610c8b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061197e82611846565b6119bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b490613616565b60405180910390fd5b60006119c883610c8b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a3757508373ffffffffffffffffffffffffffffffffffffffff16611a1f846107a6565b73ffffffffffffffffffffffffffffffffffffffff16145b80611a485750611a478185611524565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611a7182610c8b565b73ffffffffffffffffffffffffffffffffffffffff1614611ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abe90613776565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2e906135b6565b60405180910390fd5b611b42838383611f7b565b611b4d6000826118ba565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b9d91906139b6565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bf491906138d5565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611cc782826040518060200160405280600081525061208f565b5050565b611cd6848484611a51565b611ce2848484846120ea565b611d21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1890613556565b60405180910390fd5b50505050565b60606040518060400160405280601b81526020017f68747470733a2f2f6170692e636972636c656f727a6f2e636f6d2f0000000000815250905090565b60606000821415611dac576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f0c565b600082905060005b60008214611dde578080611dc790613ad2565b915050600a82611dd7919061392b565b9150611db4565b60008167ffffffffffffffff811115611e20577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611e525781602001600182028036833780820191505090505b5090505b60008514611f0557600182611e6b91906139b6565b9150600a85611e7a9190613b1b565b6030611e8691906138d5565b60f81b818381518110611ec2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611efe919061392b565b9450611e56565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611f86838383612281565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611fc957611fc481612286565b612008565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146120075761200683826122cf565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561204b576120468161243c565b61208a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461208957612088828261257f565b5b5b505050565b61209983836125fe565b6120a660008484846120ea565b6120e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120dc90613556565b60405180910390fd5b505050565b600061210b8473ffffffffffffffffffffffffffffffffffffffff166127cc565b15612274578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026121346118b2565b8786866040518563ffffffff1660e01b8152600401612156949392919061348d565b602060405180830381600087803b15801561217057600080fd5b505af19250505080156121a157506040513d601f19601f8201168201806040525081019061219e9190612a80565b60015b612224573d80600081146121d1576040519150601f19603f3d011682016040523d82523d6000602084013e6121d6565b606091505b5060008151141561221c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221390613556565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612279565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016122dc84610d43565b6122e691906139b6565b90506000600760008481526020019081526020016000205490508181146123cb576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061245091906139b6565b90506000600960008481526020019081526020016000205490506000600883815481106124a6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106124ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612563577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061258a83610d43565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561266e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612665906136f6565b60405180910390fd5b61267781611846565b156126b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ae90613596565b60405180910390fd5b6126c360008383611f7b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461271391906138d5565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60006127f26127ed84613862565b613831565b90508281526020810184848401111561280a57600080fd5b612815848285613a5e565b509392505050565b60008135905061282c81613c19565b92915050565b60008135905061284181613c30565b92915050565b60008135905061285681613c47565b92915050565b60008151905061286b81613c47565b92915050565b600082601f83011261288257600080fd5b81356128928482602086016127df565b91505092915050565b6000813590506128aa81613c5e565b92915050565b6000602082840312156128c257600080fd5b60006128d08482850161281d565b91505092915050565b600080604083850312156128ec57600080fd5b60006128fa8582860161281d565b925050602061290b8582860161281d565b9150509250929050565b60008060006060848603121561292a57600080fd5b60006129388682870161281d565b93505060206129498682870161281d565b925050604061295a8682870161289b565b9150509250925092565b6000806000806080858703121561297a57600080fd5b60006129888782880161281d565b94505060206129998782880161281d565b93505060406129aa8782880161289b565b925050606085013567ffffffffffffffff8111156129c757600080fd5b6129d387828801612871565b91505092959194509250565b600080604083850312156129f257600080fd5b6000612a008582860161281d565b9250506020612a1185828601612832565b9150509250929050565b60008060408385031215612a2e57600080fd5b6000612a3c8582860161281d565b9250506020612a4d8582860161289b565b9150509250929050565b600060208284031215612a6957600080fd5b6000612a7784828501612847565b91505092915050565b600060208284031215612a9257600080fd5b6000612aa08482850161285c565b91505092915050565b600060208284031215612abb57600080fd5b6000612ac98482850161289b565b91505092915050565b612adb816139ea565b82525050565b612aea816139fc565b82525050565b6000612afb82613892565b612b0581856138a8565b9350612b15818560208601613a6d565b612b1e81613c08565b840191505092915050565b6000612b348261389d565b612b3e81856138b9565b9350612b4e818560208601613a6d565b612b5781613c08565b840191505092915050565b6000612b6d8261389d565b612b7781856138ca565b9350612b87818560208601613a6d565b80840191505092915050565b6000612ba0601a836138b9565b91507f546869732073616c6520686173206e6f7420737461727465642e0000000000006000830152602082019050919050565b6000612be0602b836138b9565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000612c466032836138b9565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612cac6026836138b9565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612d12601c836138b9565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000612d526024836138b9565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612db86019836138b9565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000612df8601a836138b9565b91507f416c6c204e4654732068617665206265656e206d696e7465642e0000000000006000830152602082019050919050565b6000612e38602c836138b9565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000612e9e6029836138b9565b91507f596f752063616e6e6f74206d696e74206d6f7265207468616e2032302063697260008301527f636c656f727a6f732e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000612f046038836138b9565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000612f6a602a836138b9565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000612fd06029836138b9565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006130366016836138b9565b91507f496e636f72726563742045746865722076616c75652e000000000000000000006000830152602082019050919050565b6000613076604c836138b9565b91507f54686520616d6f756e74206f6620636972636c656f727a6f7320796f7520617260008301527f6520747279696e6720746f206d696e74206578636565647320746865204d415860208301527f5f4e46545f535550504c592e00000000000000000000000000000000000000006040830152606082019050919050565b60006131026020836138b9565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613142602c836138b9565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006131a86026836138b9565b91507f596f75206d757374206d696e74206174206c65617374206f6e6520636972636c60008301527f656f727a6f2e00000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061320e6020836138b9565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061324e6029836138b9565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006132b4602f836138b9565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061331a6021836138b9565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133806031836138b9565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006133e6602c836138b9565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b61344881613a54565b82525050565b600061345a8285612b62565b91506134668284612b62565b91508190509392505050565b60006020820190506134876000830184612ad2565b92915050565b60006080820190506134a26000830187612ad2565b6134af6020830186612ad2565b6134bc604083018561343f565b81810360608301526134ce8184612af0565b905095945050505050565b60006020820190506134ee6000830184612ae1565b92915050565b6000602082019050818103600083015261350e8184612b29565b905092915050565b6000602082019050818103600083015261352f81612b93565b9050919050565b6000602082019050818103600083015261354f81612bd3565b9050919050565b6000602082019050818103600083015261356f81612c39565b9050919050565b6000602082019050818103600083015261358f81612c9f565b9050919050565b600060208201905081810360008301526135af81612d05565b9050919050565b600060208201905081810360008301526135cf81612d45565b9050919050565b600060208201905081810360008301526135ef81612dab565b9050919050565b6000602082019050818103600083015261360f81612deb565b9050919050565b6000602082019050818103600083015261362f81612e2b565b9050919050565b6000602082019050818103600083015261364f81612e91565b9050919050565b6000602082019050818103600083015261366f81612ef7565b9050919050565b6000602082019050818103600083015261368f81612f5d565b9050919050565b600060208201905081810360008301526136af81612fc3565b9050919050565b600060208201905081810360008301526136cf81613029565b9050919050565b600060208201905081810360008301526136ef81613069565b9050919050565b6000602082019050818103600083015261370f816130f5565b9050919050565b6000602082019050818103600083015261372f81613135565b9050919050565b6000602082019050818103600083015261374f8161319b565b9050919050565b6000602082019050818103600083015261376f81613201565b9050919050565b6000602082019050818103600083015261378f81613241565b9050919050565b600060208201905081810360008301526137af816132a7565b9050919050565b600060208201905081810360008301526137cf8161330d565b9050919050565b600060208201905081810360008301526137ef81613373565b9050919050565b6000602082019050818103600083015261380f816133d9565b9050919050565b600060208201905061382b600083018461343f565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561385857613857613bd9565b5b8060405250919050565b600067ffffffffffffffff82111561387d5761387c613bd9565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006138e082613a54565b91506138eb83613a54565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139205761391f613b4c565b5b828201905092915050565b600061393682613a54565b915061394183613a54565b92508261395157613950613b7b565b5b828204905092915050565b600061396782613a54565b915061397283613a54565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156139ab576139aa613b4c565b5b828202905092915050565b60006139c182613a54565b91506139cc83613a54565b9250828210156139df576139de613b4c565b5b828203905092915050565b60006139f582613a34565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613a8b578082015181840152602081019050613a70565b83811115613a9a576000848401525b50505050565b60006002820490506001821680613ab857607f821691505b60208210811415613acc57613acb613baa565b5b50919050565b6000613add82613a54565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b1057613b0f613b4c565b5b600182019050919050565b6000613b2682613a54565b9150613b3183613a54565b925082613b4157613b40613b7b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613c22816139ea565b8114613c2d57600080fd5b50565b613c39816139fc565b8114613c4457600080fd5b50565b613c5081613a08565b8114613c5b57600080fd5b50565b613c6781613a54565b8114613c7257600080fd5b5056fea2646970667358221220c3f790ce9759327df45755a6268d32100e9bea0907bca8b2be613dd0536058a164736f6c63430008000033

Deployed Bytecode Sourcemap

42728:1663:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34246:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21469:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22929:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22466:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42836:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34899:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23819:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34567:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43187:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44268:120;;;:::i;:::-;;24195:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35089:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44184:76;;;;;;;;;;;;;:::i;:::-;;42948:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21163:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42884:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20893:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42112:148;;;;;;;;;;;;;:::i;:::-;;41461:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21638:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43311:782;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23222:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42784:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44101:75;;;;;;;;;;;;;:::i;:::-;;24417:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21813:360;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23588:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42415:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34246:237;34348:4;34387:35;34372:50;;;:11;:50;;;;:103;;;;34439:36;34463:11;34439:23;:36::i;:::-;34372:103;34365:110;;34246:237;;;:::o;21469:100::-;21523:13;21556:5;21549:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21469:100;:::o;22929:221::-;23005:7;23033:16;23041:7;23033;:16::i;:::-;23025:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23118:15;:24;23134:7;23118:24;;;;;;;;;;;;;;;;;;;;;23111:31;;22929:221;;;:::o;22466:397::-;22547:13;22563:23;22578:7;22563:14;:23::i;:::-;22547:39;;22611:5;22605:11;;:2;:11;;;;22597:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22691:5;22675:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22700:37;22717:5;22724:12;:10;:12::i;:::-;22700:16;:37::i;:::-;22675:62;22667:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;22834:21;22843:2;22847:7;22834:8;:21::i;:::-;22466:397;;;:::o;42836:41::-;42875:2;42836:41;:::o;34899:113::-;34960:7;34987:10;:17;;;;34980:24;;34899:113;:::o;23819:305::-;23980:41;23999:12;:10;:12::i;:::-;24013:7;23980:18;:41::i;:::-;23972:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24088:28;24098:4;24104:2;24108:7;24088:9;:28::i;:::-;23819:305;;;:::o;34567:256::-;34664:7;34700:23;34717:5;34700:16;:23::i;:::-;34692:5;:31;34684:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34789:12;:19;34802:5;34789:19;;;;;;;;;;;;;;;:26;34809:5;34789:26;;;;;;;;;;;;34782:33;;34567:256;;;;:::o;43187:117::-;43246:13;43279:17;43288:7;43279:8;:17::i;:::-;43272:24;;43187:117;;;:::o;44268:120::-;41692:12;:10;:12::i;:::-;41681:23;;:7;:5;:7::i;:::-;:23;;;41673:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44340:10:::1;44332:24;;:47;44357:21;44332:47;;;;;;;;;;;;;;;;;;;;;;;44324:56;;;::::0;::::1;;44268:120::o:0;24195:151::-;24299:39;24316:4;24322:2;24326:7;24299:39;;;;;;;;;;;;:16;:39::i;:::-;24195:151;;;:::o;35089:233::-;35164:7;35200:30;:28;:30::i;:::-;35192:5;:38;35184:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35297:10;35308:5;35297:17;;;;;;;;;;;;;;;;;;;;;;;;35290:24;;35089:233;;;:::o;44184:76::-;41692:12;:10;:12::i;:::-;41681:23;;:7;:5;:7::i;:::-;:23;;;41673:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44247:5:::1;44233:11;;:19;;;;;;;;;;;;;;;;;;44184:76::o:0;42948:31::-;;;;;;;;;;;;;:::o;21163:239::-;21235:7;21255:13;21271:7;:16;21279:7;21271:16;;;;;;;;;;;;;;;;;;;;;21255:32;;21323:1;21306:19;;:5;:19;;;;21298:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21389:5;21382:12;;;21163:239;;;:::o;42884:44::-;;;;:::o;20893:208::-;20965:7;21010:1;20993:19;;:5;:19;;;;20985:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21077:9;:16;21087:5;21077:16;;;;;;;;;;;;;;;;21070:23;;20893:208;;;:::o;42112:148::-;41692:12;:10;:12::i;:::-;41681:23;;:7;:5;:7::i;:::-;:23;;;41673:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42219:1:::1;42182:40;;42203:6;;;;;;;;;;;42182:40;;;;;;;;;;;;42250:1;42233:6;;:19;;;;;;;;;;;;;;;;;;42112:148::o:0;41461:87::-;41507:7;41534:6;;;;;;;;;;;41527:13;;41461:87;:::o;21638:104::-;21694:13;21727:7;21720:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21638:104;:::o;43311:782::-;43396:4;43381:19;;:11;;;;;;;;;;;:19;;;43373:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;42825:4;43450:13;:11;:13::i;:::-;:30;43442:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;43545:1;43530:12;:16;43522:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;42875:2;43608:12;:31;;43600:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;42825:4;43720:12;43704:13;:11;:13::i;:::-;:28;;;;:::i;:::-;:46;;43696:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;43888:9;43872:12;43860:9;;:24;;;;:::i;:::-;:37;43852:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;43942:9;43937:150;43961:12;43957:1;:16;43937:150;;;43995:17;44015:13;:11;:13::i;:::-;43995:33;;44043:32;44053:10;44065:9;44043;:32::i;:::-;43937:150;43975:3;;;;;:::i;:::-;;;;43937:150;;;;43311:782;:::o;23222:295::-;23337:12;:10;:12::i;:::-;23325:24;;:8;:24;;;;23317:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23437:8;23392:18;:32;23411:12;:10;:12::i;:::-;23392:32;;;;;;;;;;;;;;;:42;23425:8;23392:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23490:8;23461:48;;23476:12;:10;:12::i;:::-;23461:48;;;23500:8;23461:48;;;;;;:::i;:::-;;;;;;;;23222:295;;:::o;42784:45::-;42825:4;42784:45;:::o;44101:75::-;41692:12;:10;:12::i;:::-;41681:23;;:7;:5;:7::i;:::-;:23;;;41673:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44164:4:::1;44150:11;;:18;;;;;;;;;;;;;;;;;;44101:75::o:0;24417:285::-;24549:41;24568:12;:10;:12::i;:::-;24582:7;24549:18;:41::i;:::-;24541:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24655:39;24669:4;24675:2;24679:7;24688:5;24655:13;:39::i;:::-;24417:285;;;;:::o;21813:360::-;21886:13;21920:16;21928:7;21920;:16::i;:::-;21912:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22001:21;22025:10;:8;:10::i;:::-;22001:34;;22077:1;22059:7;22053:21;:25;:112;;;;;;;;;;;;;;;;;22118:7;22127:18;:7;:16;:18::i;:::-;22101:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22053:112;22046:119;;;21813:360;;;:::o;23588:164::-;23685:4;23709:18;:25;23728:5;23709:25;;;;;;;;;;;;;;;:35;23735:8;23709:35;;;;;;;;;;;;;;;;;;;;;;;;;23702:42;;23588:164;;;;:::o;42415:244::-;41692:12;:10;:12::i;:::-;41681:23;;:7;:5;:7::i;:::-;:23;;;41673:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42524:1:::1;42504:22;;:8;:22;;;;42496:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42614:8;42585:38;;42606:6;;;;;;;;;;;42585:38;;;;;;;;;;;;42643:8;42634:6;;:17;;;;;;;;;;;;;;;;;;42415:244:::0;:::o;20537:292::-;20639:4;20678:25;20663:40;;;:11;:40;;;;:105;;;;20735:33;20720:48;;;:11;:48;;;;20663:105;:158;;;;20785:36;20809:11;20785:23;:36::i;:::-;20663:158;20656:165;;20537:292;;;:::o;26169:127::-;26234:4;26286:1;26258:30;;:7;:16;26266:7;26258:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26251:37;;26169:127;;;:::o;15851:98::-;15904:7;15931:10;15924:17;;15851:98;:::o;30046:174::-;30148:2;30121:15;:24;30137:7;30121:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30204:7;30200:2;30166:46;;30175:23;30190:7;30175:14;:23::i;:::-;30166:46;;;;;;;;;;;;30046:174;;:::o;26463:348::-;26556:4;26581:16;26589:7;26581;:16::i;:::-;26573:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26657:13;26673:23;26688:7;26673:14;:23::i;:::-;26657:39;;26726:5;26715:16;;:7;:16;;;:51;;;;26759:7;26735:31;;:20;26747:7;26735:11;:20::i;:::-;:31;;;26715:51;:87;;;;26770:32;26787:5;26794:7;26770:16;:32::i;:::-;26715:87;26707:96;;;26463:348;;;;:::o;29384:544::-;29509:4;29482:31;;:23;29497:7;29482:14;:23::i;:::-;:31;;;29474:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29592:1;29578:16;;:2;:16;;;;29570:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29648:39;29669:4;29675:2;29679:7;29648:20;:39::i;:::-;29752:29;29769:1;29773:7;29752:8;:29::i;:::-;29813:1;29794:9;:15;29804:4;29794:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29842:1;29825:9;:13;29835:2;29825:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29873:2;29854:7;:16;29862:7;29854:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29912:7;29908:2;29893:27;;29902:4;29893:27;;;;;;;;;;;;29384:544;;;:::o;27153:110::-;27229:26;27239:2;27243:7;27229:26;;;;;;;;;;;;:9;:26::i;:::-;27153:110;;:::o;25584:272::-;25698:28;25708:4;25714:2;25718:7;25698:9;:28::i;:::-;25745:48;25768:4;25774:2;25778:7;25787:5;25745:22;:48::i;:::-;25737:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25584:272;;;;:::o;43049:130::-;43109:13;43135:36;;;;;;;;;;;;;;;;;;;43049:130;:::o;16506:723::-;16562:13;16792:1;16783:5;:10;16779:53;;;16810:10;;;;;;;;;;;;;;;;;;;;;16779:53;16842:12;16857:5;16842:20;;16873:14;16898:78;16913:1;16905:4;:9;16898:78;;16931:8;;;;;:::i;:::-;;;;16962:2;16954:10;;;;;:::i;:::-;;;16898:78;;;16986:19;17018:6;17008:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16986:39;;17036:154;17052:1;17043:5;:10;17036:154;;17080:1;17070:11;;;;;:::i;:::-;;;17147:2;17139:5;:10;;;;:::i;:::-;17126:2;:24;;;;:::i;:::-;17113:39;;17096:6;17103;17096:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17176:2;17167:11;;;;;:::i;:::-;;;17036:154;;;17214:6;17200:21;;;;;16506:723;;;;:::o;19055:157::-;19140:4;19179:25;19164:40;;;:11;:40;;;;19157:47;;19055:157;;;:::o;35935:555::-;36045:45;36072:4;36078:2;36082:7;36045:26;:45::i;:::-;36123:1;36107:18;;:4;:18;;;36103:187;;;36142:40;36174:7;36142:31;:40::i;:::-;36103:187;;;36212:2;36204:10;;:4;:10;;;36200:90;;36231:47;36264:4;36270:7;36231:32;:47::i;:::-;36200:90;36103:187;36318:1;36304:16;;:2;:16;;;36300:183;;;36337:45;36374:7;36337:36;:45::i;:::-;36300:183;;;36410:4;36404:10;;:2;:10;;;36400:83;;36431:40;36459:2;36463:7;36431:27;:40::i;:::-;36400:83;36300:183;35935:555;;;:::o;27490:250::-;27586:18;27592:2;27596:7;27586:5;:18::i;:::-;27623:54;27654:1;27658:2;27662:7;27671:5;27623:22;:54::i;:::-;27615:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;27490:250;;;:::o;30785:843::-;30906:4;30932:15;:2;:13;;;:15::i;:::-;30928:693;;;30984:2;30968:36;;;31005:12;:10;:12::i;:::-;31019:4;31025:7;31034:5;30968:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30964:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31231:1;31214:6;:13;:18;31210:341;;;31257:60;;;;;;;;;;:::i;:::-;;;;;;;;31210:341;31501:6;31495:13;31486:6;31482:2;31478:15;31471:38;30964:602;31101:45;;;31091:55;;;:6;:55;;;;31084:62;;;;;30928:693;31605:4;31598:11;;30785:843;;;;;;;:::o;32241:93::-;;;;:::o;37213:164::-;37317:10;:17;;;;37290:15;:24;37306:7;37290:24;;;;;;;;;;;:44;;;;37345:10;37361:7;37345:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37213:164;:::o;38004:988::-;38270:22;38320:1;38295:22;38312:4;38295:16;:22::i;:::-;:26;;;;:::i;:::-;38270:51;;38332:18;38353:17;:26;38371:7;38353:26;;;;;;;;;;;;38332:47;;38500:14;38486:10;:28;38482:328;;38531:19;38553:12;:18;38566:4;38553:18;;;;;;;;;;;;;;;:34;38572:14;38553:34;;;;;;;;;;;;38531:56;;38637:11;38604:12;:18;38617:4;38604:18;;;;;;;;;;;;;;;:30;38623:10;38604:30;;;;;;;;;;;:44;;;;38754:10;38721:17;:30;38739:11;38721:30;;;;;;;;;;;:43;;;;38482:328;;38906:17;:26;38924:7;38906:26;;;;;;;;;;;38899:33;;;38950:12;:18;38963:4;38950:18;;;;;;;;;;;;;;;:34;38969:14;38950:34;;;;;;;;;;;38943:41;;;38004:988;;;;:::o;39287:1079::-;39540:22;39585:1;39565:10;:17;;;;:21;;;;:::i;:::-;39540:46;;39597:18;39618:15;:24;39634:7;39618:24;;;;;;;;;;;;39597:45;;39969:19;39991:10;40002:14;39991:26;;;;;;;;;;;;;;;;;;;;;;;;39969:48;;40055:11;40030:10;40041;40030:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40166:10;40135:15;:28;40151:11;40135:28;;;;;;;;;;;:41;;;;40307:15;:24;40323:7;40307:24;;;;;;;;;;;40300:31;;;40342:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39287:1079;;;;:::o;36791:221::-;36876:14;36893:20;36910:2;36893:16;:20::i;:::-;36876:37;;36951:7;36924:12;:16;36937:2;36924:16;;;;;;;;;;;;;;;:24;36941:6;36924:24;;;;;;;;;;;:34;;;;36998:6;36969:17;:26;36987:7;36969:26;;;;;;;;;;;:35;;;;36791:221;;;:::o;28076:382::-;28170:1;28156:16;;:2;:16;;;;28148:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28229:16;28237:7;28229;:16::i;:::-;28228:17;28220:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28291:45;28320:1;28324:2;28328:7;28291:20;:45::i;:::-;28366:1;28349:9;:13;28359:2;28349:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28397:2;28378:7;:16;28386:7;28378:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28442:7;28438:2;28417:33;;28434:1;28417:33;;;;;;;;;;;;28076:382;;:::o;7974:422::-;8034:4;8242:12;8353:7;8341:20;8333:28;;8387:1;8380:4;:8;8373:15;;;7974:422;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:139::-;;439:6;426:20;417:29;;455:33;482:5;455:33;:::i;:::-;407:87;;;;:::o;500:133::-;;581:6;568:20;559:29;;597:30;621:5;597:30;:::i;:::-;549:84;;;;:::o;639:137::-;;722:6;709:20;700:29;;738:32;764:5;738:32;:::i;:::-;690:86;;;;:::o;782:141::-;;869:6;863:13;854:22;;885:32;911:5;885:32;:::i;:::-;844:79;;;;:::o;942:271::-;;1046:3;1039:4;1031:6;1027:17;1023:27;1013:2;;1064:1;1061;1054:12;1013:2;1104:6;1091:20;1129:78;1203:3;1195:6;1188:4;1180:6;1176:17;1129:78;:::i;:::-;1120:87;;1003:210;;;;;:::o;1219:139::-;;1303:6;1290:20;1281:29;;1319:33;1346:5;1319:33;:::i;:::-;1271:87;;;;:::o;1364:262::-;;1472:2;1460:9;1451:7;1447:23;1443:32;1440:2;;;1488:1;1485;1478:12;1440:2;1531:1;1556:53;1601:7;1592:6;1581:9;1577:22;1556:53;:::i;:::-;1546:63;;1502:117;1430:196;;;;:::o;1632:407::-;;;1757:2;1745:9;1736:7;1732:23;1728:32;1725:2;;;1773:1;1770;1763:12;1725:2;1816:1;1841:53;1886:7;1877:6;1866:9;1862:22;1841:53;:::i;:::-;1831:63;;1787:117;1943:2;1969:53;2014:7;2005:6;1994:9;1990:22;1969:53;:::i;:::-;1959:63;;1914:118;1715:324;;;;;:::o;2045:552::-;;;;2187:2;2175:9;2166:7;2162:23;2158:32;2155:2;;;2203:1;2200;2193:12;2155:2;2246:1;2271:53;2316:7;2307:6;2296:9;2292:22;2271:53;:::i;:::-;2261:63;;2217:117;2373:2;2399:53;2444:7;2435:6;2424:9;2420:22;2399:53;:::i;:::-;2389:63;;2344:118;2501:2;2527:53;2572:7;2563:6;2552:9;2548:22;2527:53;:::i;:::-;2517:63;;2472:118;2145:452;;;;;:::o;2603:809::-;;;;;2771:3;2759:9;2750:7;2746:23;2742:33;2739:2;;;2788:1;2785;2778:12;2739:2;2831:1;2856:53;2901:7;2892:6;2881:9;2877:22;2856:53;:::i;:::-;2846:63;;2802:117;2958:2;2984:53;3029:7;3020:6;3009:9;3005:22;2984:53;:::i;:::-;2974:63;;2929:118;3086:2;3112:53;3157:7;3148:6;3137:9;3133:22;3112:53;:::i;:::-;3102:63;;3057:118;3242:2;3231:9;3227:18;3214:32;3273:18;3265:6;3262:30;3259:2;;;3305:1;3302;3295:12;3259:2;3333:62;3387:7;3378:6;3367:9;3363:22;3333:62;:::i;:::-;3323:72;;3185:220;2729:683;;;;;;;:::o;3418:401::-;;;3540:2;3528:9;3519:7;3515:23;3511:32;3508:2;;;3556:1;3553;3546:12;3508:2;3599:1;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3570:117;3726:2;3752:50;3794:7;3785:6;3774:9;3770:22;3752:50;:::i;:::-;3742:60;;3697:115;3498:321;;;;;:::o;3825:407::-;;;3950:2;3938:9;3929:7;3925:23;3921:32;3918:2;;;3966:1;3963;3956:12;3918:2;4009:1;4034:53;4079:7;4070:6;4059:9;4055:22;4034:53;:::i;:::-;4024:63;;3980:117;4136:2;4162:53;4207:7;4198:6;4187:9;4183:22;4162:53;:::i;:::-;4152:63;;4107:118;3908:324;;;;;:::o;4238:260::-;;4345:2;4333:9;4324:7;4320:23;4316:32;4313:2;;;4361:1;4358;4351:12;4313:2;4404:1;4429:52;4473:7;4464:6;4453:9;4449:22;4429:52;:::i;:::-;4419:62;;4375:116;4303:195;;;;:::o;4504:282::-;;4622:2;4610:9;4601:7;4597:23;4593:32;4590:2;;;4638:1;4635;4628:12;4590:2;4681:1;4706:63;4761:7;4752:6;4741:9;4737:22;4706:63;:::i;:::-;4696:73;;4652:127;4580:206;;;;:::o;4792:262::-;;4900:2;4888:9;4879:7;4875:23;4871:32;4868:2;;;4916:1;4913;4906:12;4868:2;4959:1;4984:53;5029:7;5020:6;5009:9;5005:22;4984:53;:::i;:::-;4974:63;;4930:117;4858:196;;;;:::o;5060:118::-;5147:24;5165:5;5147:24;:::i;:::-;5142:3;5135:37;5125:53;;:::o;5184:109::-;5265:21;5280:5;5265:21;:::i;:::-;5260:3;5253:34;5243:50;;:::o;5299:360::-;;5413:38;5445:5;5413:38;:::i;:::-;5467:70;5530:6;5525:3;5467:70;:::i;:::-;5460:77;;5546:52;5591:6;5586:3;5579:4;5572:5;5568:16;5546:52;:::i;:::-;5623:29;5645:6;5623:29;:::i;:::-;5618:3;5614:39;5607:46;;5389:270;;;;;:::o;5665:364::-;;5781:39;5814:5;5781:39;:::i;:::-;5836:71;5900:6;5895:3;5836:71;:::i;:::-;5829:78;;5916:52;5961:6;5956:3;5949:4;5942:5;5938:16;5916:52;:::i;:::-;5993:29;6015:6;5993:29;:::i;:::-;5988:3;5984:39;5977:46;;5757:272;;;;;:::o;6035:377::-;;6169:39;6202:5;6169:39;:::i;:::-;6224:89;6306:6;6301:3;6224:89;:::i;:::-;6217:96;;6322:52;6367:6;6362:3;6355:4;6348:5;6344:16;6322:52;:::i;:::-;6399:6;6394:3;6390:16;6383:23;;6145:267;;;;;:::o;6418:324::-;;6581:67;6645:2;6640:3;6581:67;:::i;:::-;6574:74;;6678:28;6674:1;6669:3;6665:11;6658:49;6733:2;6728:3;6724:12;6717:19;;6564:178;;;:::o;6748:375::-;;6911:67;6975:2;6970:3;6911:67;:::i;:::-;6904:74;;7008:34;7004:1;6999:3;6995:11;6988:55;7074:13;7069:2;7064:3;7060:12;7053:35;7114:2;7109:3;7105:12;7098:19;;6894:229;;;:::o;7129:382::-;;7292:67;7356:2;7351:3;7292:67;:::i;:::-;7285:74;;7389:34;7385:1;7380:3;7376:11;7369:55;7455:20;7450:2;7445:3;7441:12;7434:42;7502:2;7497:3;7493:12;7486:19;;7275:236;;;:::o;7517:370::-;;7680:67;7744:2;7739:3;7680:67;:::i;:::-;7673:74;;7777:34;7773:1;7768:3;7764:11;7757:55;7843:8;7838:2;7833:3;7829:12;7822:30;7878:2;7873:3;7869:12;7862:19;;7663:224;;;:::o;7893:326::-;;8056:67;8120:2;8115:3;8056:67;:::i;:::-;8049:74;;8153:30;8149:1;8144:3;8140:11;8133:51;8210:2;8205:3;8201:12;8194:19;;8039:180;;;:::o;8225:368::-;;8388:67;8452:2;8447:3;8388:67;:::i;:::-;8381:74;;8485:34;8481:1;8476:3;8472:11;8465:55;8551:6;8546:2;8541:3;8537:12;8530:28;8584:2;8579:3;8575:12;8568:19;;8371:222;;;:::o;8599:323::-;;8762:67;8826:2;8821:3;8762:67;:::i;:::-;8755:74;;8859:27;8855:1;8850:3;8846:11;8839:48;8913:2;8908:3;8904:12;8897:19;;8745:177;;;:::o;8928:324::-;;9091:67;9155:2;9150:3;9091:67;:::i;:::-;9084:74;;9188:28;9184:1;9179:3;9175:11;9168:49;9243:2;9238:3;9234:12;9227:19;;9074:178;;;:::o;9258:376::-;;9421:67;9485:2;9480:3;9421:67;:::i;:::-;9414:74;;9518:34;9514:1;9509:3;9505:11;9498:55;9584:14;9579:2;9574:3;9570:12;9563:36;9625:2;9620:3;9616:12;9609:19;;9404:230;;;:::o;9640:373::-;;9803:67;9867:2;9862:3;9803:67;:::i;:::-;9796:74;;9900:34;9896:1;9891:3;9887:11;9880:55;9966:11;9961:2;9956:3;9952:12;9945:33;10004:2;9999:3;9995:12;9988:19;;9786:227;;;:::o;10019:388::-;;10182:67;10246:2;10241:3;10182:67;:::i;:::-;10175:74;;10279:34;10275:1;10270:3;10266:11;10259:55;10345:26;10340:2;10335:3;10331:12;10324:48;10398:2;10393:3;10389:12;10382:19;;10165:242;;;:::o;10413:374::-;;10576:67;10640:2;10635:3;10576:67;:::i;:::-;10569:74;;10673:34;10669:1;10664:3;10660:11;10653:55;10739:12;10734:2;10729:3;10725:12;10718:34;10778:2;10773:3;10769:12;10762:19;;10559:228;;;:::o;10793:373::-;;10956:67;11020:2;11015:3;10956:67;:::i;:::-;10949:74;;11053:34;11049:1;11044:3;11040:11;11033:55;11119:11;11114:2;11109:3;11105:12;11098:33;11157:2;11152:3;11148:12;11141:19;;10939:227;;;:::o;11172:320::-;;11335:67;11399:2;11394:3;11335:67;:::i;:::-;11328:74;;11432:24;11428:1;11423:3;11419:11;11412:45;11483:2;11478:3;11474:12;11467:19;;11318:174;;;:::o;11498:442::-;;11661:67;11725:2;11720:3;11661:67;:::i;:::-;11654:74;;11758:34;11754:1;11749:3;11745:11;11738:55;11824:34;11819:2;11814:3;11810:12;11803:56;11890:14;11885:2;11880:3;11876:12;11869:36;11931:2;11926:3;11922:12;11915:19;;11644:296;;;:::o;11946:330::-;;12109:67;12173:2;12168:3;12109:67;:::i;:::-;12102:74;;12206:34;12202:1;12197:3;12193:11;12186:55;12267:2;12262:3;12258:12;12251:19;;12092:184;;;:::o;12282:376::-;;12445:67;12509:2;12504:3;12445:67;:::i;:::-;12438:74;;12542:34;12538:1;12533:3;12529:11;12522:55;12608:14;12603:2;12598:3;12594:12;12587:36;12649:2;12644:3;12640:12;12633:19;;12428:230;;;:::o;12664:370::-;;12827:67;12891:2;12886:3;12827:67;:::i;:::-;12820:74;;12924:34;12920:1;12915:3;12911:11;12904:55;12990:8;12985:2;12980:3;12976:12;12969:30;13025:2;13020:3;13016:12;13009:19;;12810:224;;;:::o;13040:330::-;;13203:67;13267:2;13262:3;13203:67;:::i;:::-;13196:74;;13300:34;13296:1;13291:3;13287:11;13280:55;13361:2;13356:3;13352:12;13345:19;;13186:184;;;:::o;13376:373::-;;13539:67;13603:2;13598:3;13539:67;:::i;:::-;13532:74;;13636:34;13632:1;13627:3;13623:11;13616:55;13702:11;13697:2;13692:3;13688:12;13681:33;13740:2;13735:3;13731:12;13724:19;;13522:227;;;:::o;13755:379::-;;13918:67;13982:2;13977:3;13918:67;:::i;:::-;13911:74;;14015:34;14011:1;14006:3;14002:11;13995:55;14081:17;14076:2;14071:3;14067:12;14060:39;14125:2;14120:3;14116:12;14109:19;;13901:233;;;:::o;14140:365::-;;14303:67;14367:2;14362:3;14303:67;:::i;:::-;14296:74;;14400:34;14396:1;14391:3;14387:11;14380:55;14466:3;14461:2;14456:3;14452:12;14445:25;14496:2;14491:3;14487:12;14480:19;;14286:219;;;:::o;14511:381::-;;14674:67;14738:2;14733:3;14674:67;:::i;:::-;14667:74;;14771:34;14767:1;14762:3;14758:11;14751:55;14837:19;14832:2;14827:3;14823:12;14816:41;14883:2;14878:3;14874:12;14867:19;;14657:235;;;:::o;14898:376::-;;15061:67;15125:2;15120:3;15061:67;:::i;:::-;15054:74;;15158:34;15154:1;15149:3;15145:11;15138:55;15224:14;15219:2;15214:3;15210:12;15203:36;15265:2;15260:3;15256:12;15249:19;;15044:230;;;:::o;15280:118::-;15367:24;15385:5;15367:24;:::i;:::-;15362:3;15355:37;15345:53;;:::o;15404:435::-;;15606:95;15697:3;15688:6;15606:95;:::i;:::-;15599:102;;15718:95;15809:3;15800:6;15718:95;:::i;:::-;15711:102;;15830:3;15823:10;;15588:251;;;;;:::o;15845:222::-;;15976:2;15965:9;15961:18;15953:26;;15989:71;16057:1;16046:9;16042:17;16033:6;15989:71;:::i;:::-;15943:124;;;;:::o;16073:640::-;;16306:3;16295:9;16291:19;16283:27;;16320:71;16388:1;16377:9;16373:17;16364:6;16320:71;:::i;:::-;16401:72;16469:2;16458:9;16454:18;16445:6;16401:72;:::i;:::-;16483;16551:2;16540:9;16536:18;16527:6;16483:72;:::i;:::-;16602:9;16596:4;16592:20;16587:2;16576:9;16572:18;16565:48;16630:76;16701:4;16692:6;16630:76;:::i;:::-;16622:84;;16273:440;;;;;;;:::o;16719:210::-;;16844:2;16833:9;16829:18;16821:26;;16857:65;16919:1;16908:9;16904:17;16895:6;16857:65;:::i;:::-;16811:118;;;;:::o;16935:313::-;;17086:2;17075:9;17071:18;17063:26;;17135:9;17129:4;17125:20;17121:1;17110:9;17106:17;17099:47;17163:78;17236:4;17227:6;17163:78;:::i;:::-;17155:86;;17053:195;;;;:::o;17254:419::-;;17458:2;17447:9;17443:18;17435:26;;17507:9;17501:4;17497:20;17493:1;17482:9;17478:17;17471:47;17535:131;17661:4;17535:131;:::i;:::-;17527:139;;17425:248;;;:::o;17679:419::-;;17883:2;17872:9;17868:18;17860:26;;17932:9;17926:4;17922:20;17918:1;17907:9;17903:17;17896:47;17960:131;18086:4;17960:131;:::i;:::-;17952:139;;17850:248;;;:::o;18104:419::-;;18308:2;18297:9;18293:18;18285:26;;18357:9;18351:4;18347:20;18343:1;18332:9;18328:17;18321:47;18385:131;18511:4;18385:131;:::i;:::-;18377:139;;18275:248;;;:::o;18529:419::-;;18733:2;18722:9;18718:18;18710:26;;18782:9;18776:4;18772:20;18768:1;18757:9;18753:17;18746:47;18810:131;18936:4;18810:131;:::i;:::-;18802:139;;18700:248;;;:::o;18954:419::-;;19158:2;19147:9;19143:18;19135:26;;19207:9;19201:4;19197:20;19193:1;19182:9;19178:17;19171:47;19235:131;19361:4;19235:131;:::i;:::-;19227:139;;19125:248;;;:::o;19379:419::-;;19583:2;19572:9;19568:18;19560:26;;19632:9;19626:4;19622:20;19618:1;19607:9;19603:17;19596:47;19660:131;19786:4;19660:131;:::i;:::-;19652:139;;19550:248;;;:::o;19804:419::-;;20008:2;19997:9;19993:18;19985:26;;20057:9;20051:4;20047:20;20043:1;20032:9;20028:17;20021:47;20085:131;20211:4;20085:131;:::i;:::-;20077:139;;19975:248;;;:::o;20229:419::-;;20433:2;20422:9;20418:18;20410:26;;20482:9;20476:4;20472:20;20468:1;20457:9;20453:17;20446:47;20510:131;20636:4;20510:131;:::i;:::-;20502:139;;20400:248;;;:::o;20654:419::-;;20858:2;20847:9;20843:18;20835:26;;20907:9;20901:4;20897:20;20893:1;20882:9;20878:17;20871:47;20935:131;21061:4;20935:131;:::i;:::-;20927:139;;20825:248;;;:::o;21079:419::-;;21283:2;21272:9;21268:18;21260:26;;21332:9;21326:4;21322:20;21318:1;21307:9;21303:17;21296:47;21360:131;21486:4;21360:131;:::i;:::-;21352:139;;21250:248;;;:::o;21504:419::-;;21708:2;21697:9;21693:18;21685:26;;21757:9;21751:4;21747:20;21743:1;21732:9;21728:17;21721:47;21785:131;21911:4;21785:131;:::i;:::-;21777:139;;21675:248;;;:::o;21929:419::-;;22133:2;22122:9;22118:18;22110:26;;22182:9;22176:4;22172:20;22168:1;22157:9;22153:17;22146:47;22210:131;22336:4;22210:131;:::i;:::-;22202:139;;22100:248;;;:::o;22354:419::-;;22558:2;22547:9;22543:18;22535:26;;22607:9;22601:4;22597:20;22593:1;22582:9;22578:17;22571:47;22635:131;22761:4;22635:131;:::i;:::-;22627:139;;22525:248;;;:::o;22779:419::-;;22983:2;22972:9;22968:18;22960:26;;23032:9;23026:4;23022:20;23018:1;23007:9;23003:17;22996:47;23060:131;23186:4;23060:131;:::i;:::-;23052:139;;22950:248;;;:::o;23204:419::-;;23408:2;23397:9;23393:18;23385:26;;23457:9;23451:4;23447:20;23443:1;23432:9;23428:17;23421:47;23485:131;23611:4;23485:131;:::i;:::-;23477:139;;23375:248;;;:::o;23629:419::-;;23833:2;23822:9;23818:18;23810:26;;23882:9;23876:4;23872:20;23868:1;23857:9;23853:17;23846:47;23910:131;24036:4;23910:131;:::i;:::-;23902:139;;23800:248;;;:::o;24054:419::-;;24258:2;24247:9;24243:18;24235:26;;24307:9;24301:4;24297:20;24293:1;24282:9;24278:17;24271:47;24335:131;24461:4;24335:131;:::i;:::-;24327:139;;24225:248;;;:::o;24479:419::-;;24683:2;24672:9;24668:18;24660:26;;24732:9;24726:4;24722:20;24718:1;24707:9;24703:17;24696:47;24760:131;24886:4;24760:131;:::i;:::-;24752:139;;24650:248;;;:::o;24904:419::-;;25108:2;25097:9;25093:18;25085:26;;25157:9;25151:4;25147:20;25143:1;25132:9;25128:17;25121:47;25185:131;25311:4;25185:131;:::i;:::-;25177:139;;25075:248;;;:::o;25329:419::-;;25533:2;25522:9;25518:18;25510:26;;25582:9;25576:4;25572:20;25568:1;25557:9;25553:17;25546:47;25610:131;25736:4;25610:131;:::i;:::-;25602:139;;25500:248;;;:::o;25754:419::-;;25958:2;25947:9;25943:18;25935:26;;26007:9;26001:4;25997:20;25993:1;25982:9;25978:17;25971:47;26035:131;26161:4;26035:131;:::i;:::-;26027:139;;25925:248;;;:::o;26179:419::-;;26383:2;26372:9;26368:18;26360:26;;26432:9;26426:4;26422:20;26418:1;26407:9;26403:17;26396:47;26460:131;26586:4;26460:131;:::i;:::-;26452:139;;26350:248;;;:::o;26604:419::-;;26808:2;26797:9;26793:18;26785:26;;26857:9;26851:4;26847:20;26843:1;26832:9;26828:17;26821:47;26885:131;27011:4;26885:131;:::i;:::-;26877:139;;26775:248;;;:::o;27029:419::-;;27233:2;27222:9;27218:18;27210:26;;27282:9;27276:4;27272:20;27268:1;27257:9;27253:17;27246:47;27310:131;27436:4;27310:131;:::i;:::-;27302:139;;27200:248;;;:::o;27454:222::-;;27585:2;27574:9;27570:18;27562:26;;27598:71;27666:1;27655:9;27651:17;27642:6;27598:71;:::i;:::-;27552:124;;;;:::o;27682:283::-;;27748:2;27742:9;27732:19;;27790:4;27782:6;27778:17;27897:6;27885:10;27882:22;27861:18;27849:10;27846:34;27843:62;27840:2;;;27908:18;;:::i;:::-;27840:2;27948:10;27944:2;27937:22;27722:243;;;;:::o;27971:331::-;;28122:18;28114:6;28111:30;28108:2;;;28144:18;;:::i;:::-;28108:2;28229:4;28225:9;28218:4;28210:6;28206:17;28202:33;28194:41;;28290:4;28284;28280:15;28272:23;;28037:265;;;:::o;28308:98::-;;28393:5;28387:12;28377:22;;28366:40;;;:::o;28412:99::-;;28498:5;28492:12;28482:22;;28471:40;;;:::o;28517:168::-;;28634:6;28629:3;28622:19;28674:4;28669:3;28665:14;28650:29;;28612:73;;;;:::o;28691:169::-;;28809:6;28804:3;28797:19;28849:4;28844:3;28840:14;28825:29;;28787:73;;;;:::o;28866:148::-;;29005:3;28990:18;;28980:34;;;;:::o;29020:305::-;;29079:20;29097:1;29079:20;:::i;:::-;29074:25;;29113:20;29131:1;29113:20;:::i;:::-;29108:25;;29267:1;29199:66;29195:74;29192:1;29189:81;29186:2;;;29273:18;;:::i;:::-;29186:2;29317:1;29314;29310:9;29303:16;;29064:261;;;;:::o;29331:185::-;;29388:20;29406:1;29388:20;:::i;:::-;29383:25;;29422:20;29440:1;29422:20;:::i;:::-;29417:25;;29461:1;29451:2;;29466:18;;:::i;:::-;29451:2;29508:1;29505;29501:9;29496:14;;29373:143;;;;:::o;29522:348::-;;29585:20;29603:1;29585:20;:::i;:::-;29580:25;;29619:20;29637:1;29619:20;:::i;:::-;29614:25;;29807:1;29739:66;29735:74;29732:1;29729:81;29724:1;29717:9;29710:17;29706:105;29703:2;;;29814:18;;:::i;:::-;29703:2;29862:1;29859;29855:9;29844:20;;29570:300;;;;:::o;29876:191::-;;29936:20;29954:1;29936:20;:::i;:::-;29931:25;;29970:20;29988:1;29970:20;:::i;:::-;29965:25;;30009:1;30006;30003:8;30000:2;;;30014:18;;:::i;:::-;30000:2;30059:1;30056;30052:9;30044:17;;29921:146;;;;:::o;30073:96::-;;30139:24;30157:5;30139:24;:::i;:::-;30128:35;;30118:51;;;:::o;30175:90::-;;30252:5;30245:13;30238:21;30227:32;;30217:48;;;:::o;30271:149::-;;30347:66;30340:5;30336:78;30325:89;;30315:105;;;:::o;30426:126::-;;30503:42;30496:5;30492:54;30481:65;;30471:81;;;:::o;30558:77::-;;30624:5;30613:16;;30603:32;;;:::o;30641:154::-;30725:6;30720:3;30715;30702:30;30787:1;30778:6;30773:3;30769:16;30762:27;30692:103;;;:::o;30801:307::-;30869:1;30879:113;30893:6;30890:1;30887:13;30879:113;;;30978:1;30973:3;30969:11;30963:18;30959:1;30954:3;30950:11;30943:39;30915:2;30912:1;30908:10;30903:15;;30879:113;;;31010:6;31007:1;31004:13;31001:2;;;31090:1;31081:6;31076:3;31072:16;31065:27;31001:2;30850:258;;;;:::o;31114:320::-;;31195:1;31189:4;31185:12;31175:22;;31242:1;31236:4;31232:12;31263:18;31253:2;;31319:4;31311:6;31307:17;31297:27;;31253:2;31381;31373:6;31370:14;31350:18;31347:38;31344:2;;;31400:18;;:::i;:::-;31344:2;31165:269;;;;:::o;31440:233::-;;31502:24;31520:5;31502:24;:::i;:::-;31493:33;;31548:66;31541:5;31538:77;31535:2;;;31618:18;;:::i;:::-;31535:2;31665:1;31658:5;31654:13;31647:20;;31483:190;;;:::o;31679:176::-;;31728:20;31746:1;31728:20;:::i;:::-;31723:25;;31762:20;31780:1;31762:20;:::i;:::-;31757:25;;31801:1;31791:2;;31806:18;;:::i;:::-;31791:2;31847:1;31844;31840:9;31835:14;;31713:142;;;;:::o;31861:180::-;31909:77;31906:1;31899:88;32006:4;32003:1;31996:15;32030:4;32027:1;32020:15;32047:180;32095:77;32092:1;32085:88;32192:4;32189:1;32182:15;32216:4;32213:1;32206:15;32233:180;32281:77;32278:1;32271:88;32378:4;32375:1;32368:15;32402:4;32399:1;32392:15;32419:180;32467:77;32464:1;32457:88;32564:4;32561:1;32554:15;32588:4;32585:1;32578:15;32605:102;;32697:2;32693:7;32688:2;32681:5;32677:14;32673:28;32663:38;;32653:54;;;:::o;32713:122::-;32786:24;32804:5;32786:24;:::i;:::-;32779:5;32776:35;32766:2;;32825:1;32822;32815:12;32766:2;32756:79;:::o;32841:116::-;32911:21;32926:5;32911:21;:::i;:::-;32904:5;32901:32;32891:2;;32947:1;32944;32937:12;32891:2;32881:76;:::o;32963:120::-;33035:23;33052:5;33035:23;:::i;:::-;33028:5;33025:34;33015:2;;33073:1;33070;33063:12;33015:2;33005:78;:::o;33089:122::-;33162:24;33180:5;33162:24;:::i;:::-;33155:5;33152:35;33142:2;;33201:1;33198;33191:12;33142:2;33132:79;:::o

Swarm Source

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