ERC-721
Overview
Max Total Supply
3,000 FNTMWHLZ
Holders
518
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Balance
3 FNTMWHLZLoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
FantomWheelz
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2021-09-21 */ //SPDX-License-Identifier: MIT pragma solidity ^0.8.6; /** * @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); } 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; } //import "./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); } 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; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } //import "../../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; } } /** * @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); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @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 override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerable is IAccessControl { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); } /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } } /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl { using EnumerableSet for EnumerableSet.AddressSet; mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view override returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view override returns (uint256) { return _roleMembers[role].length(); } /** * @dev Overload {grantRole} to track enumerable memberships */ function grantRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) { super.grantRole(role, account); _roleMembers[role].add(account); } /** * @dev Overload {revokeRole} to track enumerable memberships */ function revokeRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) { super.revokeRole(role, account); _roleMembers[role].remove(account); } /** * @dev Overload {renounceRole} to track enumerable memberships */ function renounceRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) { super.renounceRole(role, account); _roleMembers[role].remove(account); } /** * @dev Overload {_setupRole} to track enumerable memberships */ function _setupRole(bytes32 role, address account) internal virtual override { super._setupRole(role, account); _roleMembers[role].add(account); } } /** * @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); } /** * @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(); } } /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } contract FantomWheelz is Context, AccessControlEnumerable, ERC721Enumerable, ERC721URIStorage { using Counters for Counters.Counter; using SafeMath for uint256; Counters.Counter public _tokenIdTracker; string private _baseTokenURI; uint private _priceOne; uint private _priceTen; uint private _priceFifty; uint private _max; address private _admin; bool private _mintingEnabled; mapping (uint => address) public tokenToOwner; mapping (address => uint) ownerTokenCount; mapping (uint => string) public tokenCustomURI; event Minted( uint256 tokenId, address minter, uint256 amount ); constructor(string memory name, string memory symbol, string memory baseTokenURI, uint mintPriceOne, uint mintPriceTen, uint mintPriceFifty, uint max, bool mintingEnabled, address admin) ERC721(name, symbol) { _baseTokenURI = baseTokenURI; _priceOne = mintPriceOne; _priceTen = mintPriceTen; _priceFifty = mintPriceFifty; _max = max; _admin = admin; _mintingEnabled = mintingEnabled; _setupRole(DEFAULT_ADMIN_ROLE, admin); } function mintedCount() public view returns(uint256) { return _tokenIdTracker.current(); } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseURI(string memory baseURI) external { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "FantomWheelz: must have admin role to change base URI"); _baseTokenURI = baseURI; } function setTokenURI(uint256 tokenId, string memory _tokenURI) external { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "FantomWheelz: must have admin role to change token URI"); _setTokenURI(tokenId, _tokenURI); } function setCustomURI(uint256 tokenId, string memory uri) external { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "FantomWheelz: must have admin role to change URI"); tokenCustomURI[tokenId] = uri; } function setPriceOne(uint mintPrice) external { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "FantomWheelz: must have admin role to change price"); _priceOne = mintPrice; } function setPriceTen(uint mintPrice) external { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "FantomWheelz: must have admin role to change price"); _priceTen = mintPrice; } function setPriceFifty(uint mintPrice) external { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "FantomWheelz: must have admin role to change price"); _priceFifty = mintPrice; } function priceOne() public view returns (uint) { return _priceOne; } function priceTen() public view returns (uint) { return _priceTen; } function priceFifty() public view returns (uint) { return _priceFifty; } /** * @dev Creates a new token for `to`. Its token ID will be automatically * assigned (and available on the emitted {IERC721-Transfer} event), and the token * URI autogenerated based on the base URI passed at construction. * */ function mintOne() public payable { require(_mintingEnabled, "FantomWheelz; Minting is not enabled yet"); require(msg.value == _priceOne, "FantomWheelz: must send correct price"); require(_tokenIdTracker.current() < _max, "FantomWheelz: all FantomWheelz have been minted"); _mint(msg.sender, _tokenIdTracker.current()); tokenToOwner[_tokenIdTracker.current()] = msg.sender; ownerTokenCount[msg.sender] = ownerTokenCount[msg.sender].add(1); _tokenIdTracker.increment(); payable(_admin).transfer(msg.value); emit Minted(_tokenIdTracker.current(),msg.sender,1); } /** * Returns the tokens of a single address */ function tokensOfOwner(address _owner) external view returns(uint256[] memory ownerTokens) { uint256 tokenCount = balanceOf(_owner); if (tokenCount == 0) { // Return an empty array return new uint256[](0); } else { uint256[] memory result = new uint256[](tokenCount); uint256 totalTokens = totalSupply(); uint256 resultIndex = 0; // We count on the fact that all tokens have IDs starting at 1 and increasing // sequentially up to the totalTokens count. uint256 idx; for (idx = 1; idx <= totalTokens; idx++) { if (tokenToOwner[idx] == _owner) { result[resultIndex] = idx; resultIndex++; } } return result; } } function toggleMinting() external { require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "FantomWheelz: must have admin role to change URI"); _mintingEnabled = !_mintingEnabled; } function mintTen() public payable { require(_mintingEnabled, "FantomWheelz: Minting is not enabled yet"); require(msg.value == _priceTen*10, "FantomWheelz: must send correct price"); require(_tokenIdTracker.current() + 10 < _max, "FantomWheelz: not enough FantomWheelz left to mint ten"); for(uint i=0; i < 10; i++){ _mint(msg.sender, _tokenIdTracker.current()); tokenToOwner[_tokenIdTracker.current()] = msg.sender; ownerTokenCount[msg.sender] = ownerTokenCount[msg.sender].add(1); _tokenIdTracker.increment(); } payable(_admin).transfer(msg.value); emit Minted(_tokenIdTracker.current(),msg.sender,10); } function mintFifty() public payable { require(_mintingEnabled, "FantomWheelz: Minting is not enabled yet"); require(msg.value == _priceFifty*50, "FantomWheelz: must send correct price"); require(_tokenIdTracker.current() + 50 < _max, "FantomWheelz: not enough FantomWheelz left to mint one fifty"); for(uint i=0; i < 50; i++){ _mint(msg.sender, _tokenIdTracker.current()); tokenToOwner[_tokenIdTracker.current()] = msg.sender; ownerTokenCount[msg.sender] = ownerTokenCount[msg.sender].add(1); _tokenIdTracker.increment(); } payable(_admin).transfer(msg.value); emit Minted(_tokenIdTracker.current(),msg.sender,50); } function _burn(uint256 tokenId) internal virtual override(ERC721, ERC721URIStorage) { return ERC721URIStorage._burn(tokenId); } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { if (abi.encodePacked(tokenCustomURI[tokenId]).length > 0) { return tokenCustomURI[tokenId]; } return ERC721URIStorage.tokenURI(tokenId); } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControlEnumerable, ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseTokenURI","type":"string"},{"internalType":"uint256","name":"mintPriceOne","type":"uint256"},{"internalType":"uint256","name":"mintPriceTen","type":"uint256"},{"internalType":"uint256","name":"mintPriceFifty","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"},{"internalType":"bool","name":"mintingEnabled","type":"bool"},{"internalType":"address","name":"admin","type":"address"}],"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":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokenIdTracker","outputs":[{"internalType":"uint256","name":"_value","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":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintFifty","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintOne","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintTen","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"priceFifty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceOne","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceTen","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"setCustomURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintPrice","type":"uint256"}],"name":"setPriceFifty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintPrice","type":"uint256"}],"name":"setPriceOne","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintPrice","type":"uint256"}],"name":"setPriceTen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenCustomURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"","type":"uint256"}],"name":"tokenToOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"ownerTokens","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200679a3803806200679a83398181016040528101906200003791906200052a565b8888816002908051906020019062000051929190620003b7565b5080600390805190602001906200006a929190620003b7565b50505086600e908051906020019062000085929190620003b7565b5085600f8190555084601081905550836011819055508260128190555080601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601360146101000a81548160ff021916908315150217905550620001126000801b826200012160201b60201c565b50505050505050505062000882565b6200013882826200016960201b6200226a1760201c565b6200016481600160008581526020019081526020016000206200017f60201b620022781790919060201c565b505050565b6200017b8282620001b760201b60201c565b5050565b6000620001af836000018373ffffffffffffffffffffffffffffffffffffffff1660001b620002a860201b60201c565b905092915050565b620001c982826200032260201b60201c565b620002a457600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620002496200038c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000620002bc83836200039460201b60201c565b620003175782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506200031c565b600090505b92915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b600080836001016000848152602001908152602001600020541415905092915050565b828054620003c59062000745565b90600052602060002090601f016020900481019282620003e9576000855562000435565b82601f106200040457805160ff191683800117855562000435565b8280016001018555821562000435579182015b828111156200043457825182559160200191906001019062000417565b5b50905062000444919062000448565b5090565b5b808211156200046357600081600090555060010162000449565b5090565b60006200047e62000478846200068f565b62000666565b9050828152602081018484840111156200049d576200049c62000814565b5b620004aa8482856200070f565b509392505050565b600081519050620004c38162000834565b92915050565b600081519050620004da816200084e565b92915050565b600082601f830112620004f857620004f76200080f565b5b81516200050a84826020860162000467565b91505092915050565b600081519050620005248162000868565b92915050565b60008060008060008060008060006101208a8c03121562000550576200054f6200081e565b5b60008a015167ffffffffffffffff81111562000571576200057062000819565b5b6200057f8c828d01620004e0565b99505060208a015167ffffffffffffffff811115620005a357620005a262000819565b5b620005b18c828d01620004e0565b98505060408a015167ffffffffffffffff811115620005d557620005d462000819565b5b620005e38c828d01620004e0565b9750506060620005f68c828d0162000513565b9650506080620006098c828d0162000513565b95505060a06200061c8c828d0162000513565b94505060c06200062f8c828d0162000513565b93505060e0620006428c828d01620004c9565b925050610100620006568c828d01620004b2565b9150509295985092959850929598565b60006200067262000685565b90506200068082826200077b565b919050565b6000604051905090565b600067ffffffffffffffff821115620006ad57620006ac620007e0565b5b620006b88262000823565b9050602081019050919050565b6000620006d282620006e5565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200072f57808201518184015260208101905062000712565b838111156200073f576000848401525b50505050565b600060028204905060018216806200075e57607f821691505b60208210811415620007755762000774620007b1565b5b50919050565b620007868262000823565b810181811067ffffffffffffffff82111715620007a857620007a7620007e0565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6200083f81620006c5565b81146200084b57600080fd5b50565b6200085981620006d9565b81146200086557600080fd5b50565b620008738162000705565b81146200087f57600080fd5b50565b615f0880620008926000396000f3fe6080604052600436106102515760003560e01c80637d55094d11610139578063a22cb465116100b6578063cc0b2c9f1161007a578063cc0b2c9f146108bf578063cf721b15146108fc578063d547741f14610927578063dacea8b814610950578063e985e9c514610979578063eda37870146109b657610251565b8063a22cb465146107e9578063b88d4fde14610812578063c0335ea91461083b578063c87b56dd14610845578063ca15c8731461088257610251565b80639075a3bf116100fd5780639075a3bf1461070057806391d148541461072b57806395d89b411461076857806398bcede914610793578063a217fddf146107be57610251565b80637d55094d1461063c5780638462151c1461065357806385e134d91461069057806388f6e28d146106b95780639010d07c146106c357610251565b80632f2ff15d116101d25780634f6ccce7116101965780634f6ccce7146105065780635287314f1461054357806355f804b31461056e5780636352211e14610597578063638024c3146105d457806370a08231146105ff57610251565b80632f2ff15d146104255780632f745c591461044e57806336568abe1461048b5780633adf80b4146104b457806342842e0e146104dd57610251565b80630ced8637116102195780630ced863714610361578063162094c41461036b57806318160ddd1461039457806323b872dd146103bf578063248a9ca3146103e857610251565b80630104e59b1461025657806301ffc9a71461029357806306fdde03146102d0578063081812fc146102fb578063095ea7b314610338575b600080fd5b34801561026257600080fd5b5061027d6004803603810190610278919061432b565b6109df565b60405161028a9190614b58565b60405180910390f35b34801561029f57600080fd5b506102ba60048036038101906102b59190614288565b610a7f565b6040516102c79190614b22565b60405180910390f35b3480156102dc57600080fd5b506102e5610a91565b6040516102f29190614b58565b60405180910390f35b34801561030757600080fd5b50610322600480360381019061031d919061432b565b610b23565b60405161032f9190614a99565b60405180910390f35b34801561034457600080fd5b5061035f600480360381019061035a919061419b565b610ba8565b005b610369610cc0565b005b34801561037757600080fd5b50610392600480360381019061038d9190614358565b610f5e565b005b3480156103a057600080fd5b506103a9610fbf565b6040516103b69190614f3a565b60405180910390f35b3480156103cb57600080fd5b506103e660048036038101906103e19190614085565b610fcc565b005b3480156103f457600080fd5b5061040f600480360381019061040a91906141db565b61102c565b60405161041c9190614b3d565b60405180910390f35b34801561043157600080fd5b5061044c60048036038101906104479190614208565b61104b565b005b34801561045a57600080fd5b506104756004803603810190610470919061419b565b61107f565b6040516104829190614f3a565b60405180910390f35b34801561049757600080fd5b506104b260048036038101906104ad9190614208565b611124565b005b3480156104c057600080fd5b506104db60048036038101906104d69190614358565b611158565b005b3480156104e957600080fd5b5061050460048036038101906104ff9190614085565b6111d7565b005b34801561051257600080fd5b5061052d6004803603810190610528919061432b565b6111f7565b60405161053a9190614f3a565b60405180910390f35b34801561054f57600080fd5b50610558611268565b6040516105659190614f3a565b60405180910390f35b34801561057a57600080fd5b50610595600480360381019061059091906142e2565b611272565b005b3480156105a357600080fd5b506105be60048036038101906105b9919061432b565b6112df565b6040516105cb9190614a99565b60405180910390f35b3480156105e057600080fd5b506105e9611391565b6040516105f69190614f3a565b60405180910390f35b34801561060b57600080fd5b5061062660048036038101906106219190614018565b61139b565b6040516106339190614f3a565b60405180910390f35b34801561064857600080fd5b50610651611453565b005b34801561065f57600080fd5b5061067a60048036038101906106759190614018565b6114d2565b6040516106879190614b00565b60405180910390f35b34801561069c57600080fd5b506106b760048036038101906106b2919061432b565b61165b565b005b6106c16116b8565b005b3480156106cf57600080fd5b506106ea60048036038101906106e59190614248565b61198e565b6040516106f79190614a99565b60405180910390f35b34801561070c57600080fd5b506107156119bd565b6040516107229190614f3a565b60405180910390f35b34801561073757600080fd5b50610752600480360381019061074d9190614208565b6119c7565b60405161075f9190614b22565b60405180910390f35b34801561077457600080fd5b5061077d611a31565b60405161078a9190614b58565b60405180910390f35b34801561079f57600080fd5b506107a8611ac3565b6040516107b59190614f3a565b60405180910390f35b3480156107ca57600080fd5b506107d3611acf565b6040516107e09190614b3d565b60405180910390f35b3480156107f557600080fd5b50610810600480360381019061080b919061415b565b611ad6565b005b34801561081e57600080fd5b50610839600480360381019061083491906140d8565b611c57565b005b610843611cb9565b005b34801561085157600080fd5b5061086c6004803603810190610867919061432b565b611f8f565b6040516108799190614b58565b60405180910390f35b34801561088e57600080fd5b506108a960048036038101906108a491906141db565b612080565b6040516108b69190614f3a565b60405180910390f35b3480156108cb57600080fd5b506108e660048036038101906108e1919061432b565b6120a4565b6040516108f39190614a99565b60405180910390f35b34801561090857600080fd5b506109116120d7565b60405161091e9190614f3a565b60405180910390f35b34801561093357600080fd5b5061094e60048036038101906109499190614208565b6120e8565b005b34801561095c57600080fd5b506109776004803603810190610972919061432b565b61211c565b005b34801561098557600080fd5b506109a0600480360381019061099b9190614045565b612179565b6040516109ad9190614b22565b60405180910390f35b3480156109c257600080fd5b506109dd60048036038101906109d8919061432b565b61220d565b005b601660205280600052604060002060009150905080546109fe90615347565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2a90615347565b8015610a775780601f10610a4c57610100808354040283529160200191610a77565b820191906000526020600020905b815481529060010190602001808311610a5a57829003601f168201915b505050505081565b6000610a8a826122a8565b9050919050565b606060028054610aa090615347565b80601f0160208091040260200160405190810160405280929190818152602001828054610acc90615347565b8015610b195780601f10610aee57610100808354040283529160200191610b19565b820191906000526020600020905b815481529060010190602001808311610afc57829003601f168201915b5050505050905090565b6000610b2e82612322565b610b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6490614e1a565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bb3826112df565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1b90614e7a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c4361238e565b73ffffffffffffffffffffffffffffffffffffffff161480610c725750610c7181610c6c61238e565b612179565b5b610cb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca890614d3a565b60405180910390fd5b610cbb8383612396565b505050565b601360149054906101000a900460ff16610d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0690614e9a565b60405180910390fd5b600f543414610d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4a90614dba565b60405180910390fd5b601254610d60600d61244f565b10610da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9790614b9a565b60405180910390fd5b610db333610dae600d61244f565b61245d565b3360146000610dc2600d61244f565b815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610e616001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461262b90919063ffffffff16565b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610eae600d612641565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015610f16573d6000803e3d6000fd5b507fc9d0543a84d3510329c0783b91576878ceb484e8699944cb5610c3436b3b8e39610f42600d61244f565b336001604051610f5493929190614f8c565b60405180910390a1565b610f726000801b610f6d61238e565b6119c7565b610fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa890614d1a565b60405180910390fd5b610fbb8282612657565b5050565b6000600a80549050905090565b610fdd610fd761238e565b826126cb565b61101c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101390614eba565b60405180910390fd5b6110278383836127a9565b505050565b6000806000838152602001908152602001600020600101549050919050565b6110558282612a05565b61107a816001600085815260200190815260200160002061227890919063ffffffff16565b505050565b600061108a8361139b565b82106110cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c290614bba565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61112e8282612a2e565b6111538160016000858152602001908152602001600020612ab190919063ffffffff16565b505050565b61116c6000801b61116761238e565b6119c7565b6111ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a290614c5a565b60405180910390fd5b806016600084815260200190815260200160002090805190602001906111d2929190613e17565b505050565b6111f283838360405180602001604052806000815250611c57565b505050565b6000611201610fbf565b8210611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123990614eda565b60405180910390fd5b600a8281548110611256576112556154e0565b5b90600052602060002001549050919050565b6000601154905090565b6112866000801b61128161238e565b6119c7565b6112c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bc90614c3a565b60405180910390fd5b80600e90805190602001906112db929190613e17565b5050565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137f90614d7a565b60405180910390fd5b80915050919050565b6000601054905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561140c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140390614d5a565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114676000801b61146261238e565b6119c7565b6114a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149d90614c5a565b60405180910390fd5b601360149054906101000a900460ff1615601360146101000a81548160ff021916908315150217905550565b606060006114df8361139b565b9050600081141561153c57600067ffffffffffffffff8111156115055761150461550f565b5b6040519080825280602002602001820160405280156115335781602001602082028036833780820191505090505b50915050611656565b60008167ffffffffffffffff8111156115585761155761550f565b5b6040519080825280602002602001820160405280156115865781602001602082028036833780820191505090505b5090506000611593610fbf565b9050600080600190505b82811161164d578673ffffffffffffffffffffffffffffffffffffffff166014600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561163a578084838151811061161f5761161e6154e0565b5b6020026020010181815250508180611636906153aa565b9250505b8080611645906153aa565b91505061159d565b83955050505050505b919050565b61166f6000801b61166a61238e565b6119c7565b6116ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a590614cda565b60405180910390fd5b8060118190555050565b601360149054906101000a900460ff16611707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fe90614efa565b60405180910390fd5b60326011546117169190615199565b3414611757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174e90614dba565b60405180910390fd5b6012546032611766600d61244f565b6117709190615112565b106117b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a790614bfa565b60405180910390fd5b60005b60328110156118dd576117cf336117ca600d61244f565b61245d565b33601460006117de600d61244f565b815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061187d6001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461262b90919063ffffffff16565b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506118ca600d612641565b80806118d5906153aa565b9150506117b3565b50601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611946573d6000803e3d6000fd5b507fc9d0543a84d3510329c0783b91576878ceb484e8699944cb5610c3436b3b8e39611972600d61244f565b33603260405161198493929190614fc3565b60405180910390a1565b60006119b58260016000868152602001908152602001600020612ae190919063ffffffff16565b905092915050565b6000600f54905090565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060038054611a4090615347565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6c90615347565b8015611ab95780601f10611a8e57610100808354040283529160200191611ab9565b820191906000526020600020905b815481529060010190602001808311611a9c57829003601f168201915b5050505050905090565b600d8060000154905081565b6000801b81565b611ade61238e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4390614c9a565b60405180910390fd5b8060076000611b5961238e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c0661238e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c4b9190614b22565b60405180910390a35050565b611c68611c6261238e565b836126cb565b611ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9e90614eba565b60405180910390fd5b611cb384848484612afb565b50505050565b601360149054906101000a900460ff16611d08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cff90614efa565b60405180910390fd5b600a601054611d179190615199565b3414611d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4f90614dba565b60405180910390fd5b601254600a611d67600d61244f565b611d719190615112565b10611db1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da890614cfa565b60405180910390fd5b60005b600a811015611ede57611dd033611dcb600d61244f565b61245d565b3360146000611ddf600d61244f565b815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611e7e6001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461262b90919063ffffffff16565b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611ecb600d612641565b8080611ed6906153aa565b915050611db4565b50601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611f47573d6000803e3d6000fd5b507fc9d0543a84d3510329c0783b91576878ceb484e8699944cb5610c3436b3b8e39611f73600d61244f565b33600a604051611f8593929190614f55565b60405180910390a1565b6060600060166000848152602001908152602001600020604051602001611fb69190614a48565b60405160208183030381529060405251111561206f57601660008381526020019081526020016000208054611fea90615347565b80601f016020809104026020016040519081016040528092919081815260200182805461201690615347565b80156120635780601f1061203857610100808354040283529160200191612063565b820191906000526020600020905b81548152906001019060200180831161204657829003601f168201915b5050505050905061207b565b61207882612b57565b90505b919050565b600061209d60016000848152602001908152602001600020612ca9565b9050919050565b60146020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006120e3600d61244f565b905090565b6120f28282612cbe565b6121178160016000858152602001908152602001600020612ab190919063ffffffff16565b505050565b6121306000801b61212b61238e565b6119c7565b61216f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216690614cda565b60405180910390fd5b80600f8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122216000801b61221c61238e565b6119c7565b612260576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225790614cda565b60405180910390fd5b8060108190555050565b6122748282612ce7565b5050565b60006122a0836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612dc7565b905092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061231b575061231a82612e37565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612409836112df565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c490614dda565b60405180910390fd5b6124d681612322565b15612516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250d90614c1a565b60405180910390fd5b61252260008383612f19565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125729190615112565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600081836126399190615112565b905092915050565b6001816000016000828254019250508190555050565b61266082612322565b61269f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269690614d9a565b60405180910390fd5b80600c600084815260200190815260200160002090805190602001906126c6929190613e17565b505050565b60006126d682612322565b612715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270c90614cba565b60405180910390fd5b6000612720836112df565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061278f57508373ffffffffffffffffffffffffffffffffffffffff1661277784610b23565b73ffffffffffffffffffffffffffffffffffffffff16145b806127a0575061279f8185612179565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127c9826112df565b73ffffffffffffffffffffffffffffffffffffffff161461281f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281690614e3a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561288f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288690614c7a565b60405180910390fd5b61289a838383612f19565b6128a5600082612396565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128f591906151f3565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461294c9190615112565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612a0e8261102c565b612a1f81612a1a61238e565b612f29565b612a298383612ce7565b505050565b612a3661238e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612aa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9a90614f1a565b60405180910390fd5b612aad8282612fc6565b5050565b6000612ad9836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6130a7565b905092915050565b6000612af083600001836131bb565b60001c905092915050565b612b068484846127a9565b612b12848484846131e6565b612b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4890614bda565b60405180910390fd5b50505050565b6060612b6282612322565b612ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9890614dfa565b60405180910390fd5b6000600c60008481526020019081526020016000208054612bc190615347565b80601f0160208091040260200160405190810160405280929190818152602001828054612bed90615347565b8015612c3a5780601f10612c0f57610100808354040283529160200191612c3a565b820191906000526020600020905b815481529060010190602001808311612c1d57829003601f168201915b505050505090506000612c4b61337d565b9050600081511415612c61578192505050612ca4565b600082511115612c96578082604051602001612c7e929190614a24565b60405160208183030381529060405292505050612ca4565b612c9f8461340f565b925050505b919050565b6000612cb7826000016134b6565b9050919050565b612cc78261102c565b612cd881612cd361238e565b612f29565b612ce28383612fc6565b505050565b612cf182826119c7565b612dc357600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612d6861238e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000612dd383836134c7565b612e2c578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612e31565b600090505b92915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612f0257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612f125750612f11826134ea565b5b9050919050565b612f24838383613564565b505050565b612f3382826119c7565b612fc257612f588173ffffffffffffffffffffffffffffffffffffffff166014613678565b612f668360001c6020613678565b604051602001612f77929190614a5f565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb99190614b58565b60405180910390fd5b5050565b612fd082826119c7565b156130a357600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061304861238e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600080836001016000848152602001908152602001600020549050600081146131af5760006001826130d991906151f3565b90506000600186600001805490506130f191906151f3565b9050818114613160576000866000018281548110613112576131116154e0565b5b9060005260206000200154905080876000018481548110613136576131356154e0565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480613174576131736154b1565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506131b5565b60009150505b92915050565b60008260000182815481106131d3576131d26154e0565b5b9060005260206000200154905092915050565b60006132078473ffffffffffffffffffffffffffffffffffffffff166138b4565b15613370578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261323061238e565b8786866040518563ffffffff1660e01b81526004016132529493929190614ab4565b602060405180830381600087803b15801561326c57600080fd5b505af192505050801561329d57506040513d601f19601f8201168201806040525081019061329a91906142b5565b60015b613320573d80600081146132cd576040519150601f19603f3d011682016040523d82523d6000602084013e6132d2565b606091505b50600081511415613318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330f90614bda565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613375565b600190505b949350505050565b6060600e805461338c90615347565b80601f01602080910402602001604051908101604052809291908181526020018280546133b890615347565b80156134055780601f106133da57610100808354040283529160200191613405565b820191906000526020600020905b8154815290600101906020018083116133e857829003601f168201915b5050505050905090565b606061341a82612322565b613459576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161345090614e5a565b60405180910390fd5b600061346361337d565b9050600081511161348357604051806020016040528060008152506134ae565b8061348d846138c7565b60405160200161349e929190614a24565b6040516020818303038152906040525b915050919050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061355d575061355c82613a28565b5b9050919050565b61356f838383613aa2565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156135b2576135ad81613aa7565b6135f1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146135f0576135ef8382613af0565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136345761362f81613c5d565b613673565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613672576136718282613d2e565b5b5b505050565b60606000600283600261368b9190615199565b6136959190615112565b67ffffffffffffffff8111156136ae576136ad61550f565b5b6040519080825280601f01601f1916602001820160405280156136e05781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110613718576137176154e0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061377c5761377b6154e0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026137bc9190615199565b6137c69190615112565b90505b6001811115613866577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110613808576138076154e0565b5b1a60f81b82828151811061381f5761381e6154e0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061385f9061531d565b90506137c9565b50600084146138aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138a190614b7a565b60405180910390fd5b8091505092915050565b600080823b905060008111915050919050565b6060600082141561390f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613a23565b600082905060005b6000821461394157808061392a906153aa565b915050600a8261393a9190615168565b9150613917565b60008167ffffffffffffffff81111561395d5761395c61550f565b5b6040519080825280601f01601f19166020018201604052801561398f5781602001600182028036833780820191505090505b5090505b60008514613a1c576001826139a891906151f3565b9150600a856139b791906153f3565b60306139c39190615112565b60f81b8183815181106139d9576139d86154e0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613a159190615168565b9450613993565b8093505050505b919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613a9b5750613a9a82613dad565b5b9050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613afd8461139b565b613b0791906151f3565b9050600060096000848152602001908152602001600020549050818114613bec576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a80549050613c7191906151f3565b90506000600b60008481526020019081526020016000205490506000600a8381548110613ca157613ca06154e0565b5b9060005260206000200154905080600a8381548110613cc357613cc26154e0565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480613d1257613d116154b1565b5b6001900381819060005260206000200160009055905550505050565b6000613d398361139b565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b828054613e2390615347565b90600052602060002090601f016020900481019282613e455760008555613e8c565b82601f10613e5e57805160ff1916838001178555613e8c565b82800160010185558215613e8c579182015b82811115613e8b578251825591602001919060010190613e70565b5b509050613e999190613e9d565b5090565b5b80821115613eb6576000816000905550600101613e9e565b5090565b6000613ecd613ec88461501f565b614ffa565b905082815260208101848484011115613ee957613ee8615543565b5b613ef48482856152db565b509392505050565b6000613f0f613f0a84615050565b614ffa565b905082815260208101848484011115613f2b57613f2a615543565b5b613f368482856152db565b509392505050565b600081359050613f4d81615e5f565b92915050565b600081359050613f6281615e76565b92915050565b600081359050613f7781615e8d565b92915050565b600081359050613f8c81615ea4565b92915050565b600081519050613fa181615ea4565b92915050565b600082601f830112613fbc57613fbb61553e565b5b8135613fcc848260208601613eba565b91505092915050565b600082601f830112613fea57613fe961553e565b5b8135613ffa848260208601613efc565b91505092915050565b60008135905061401281615ebb565b92915050565b60006020828403121561402e5761402d61554d565b5b600061403c84828501613f3e565b91505092915050565b6000806040838503121561405c5761405b61554d565b5b600061406a85828601613f3e565b925050602061407b85828601613f3e565b9150509250929050565b60008060006060848603121561409e5761409d61554d565b5b60006140ac86828701613f3e565b93505060206140bd86828701613f3e565b92505060406140ce86828701614003565b9150509250925092565b600080600080608085870312156140f2576140f161554d565b5b600061410087828801613f3e565b945050602061411187828801613f3e565b935050604061412287828801614003565b925050606085013567ffffffffffffffff81111561414357614142615548565b5b61414f87828801613fa7565b91505092959194509250565b600080604083850312156141725761417161554d565b5b600061418085828601613f3e565b925050602061419185828601613f53565b9150509250929050565b600080604083850312156141b2576141b161554d565b5b60006141c085828601613f3e565b92505060206141d185828601614003565b9150509250929050565b6000602082840312156141f1576141f061554d565b5b60006141ff84828501613f68565b91505092915050565b6000806040838503121561421f5761421e61554d565b5b600061422d85828601613f68565b925050602061423e85828601613f3e565b9150509250929050565b6000806040838503121561425f5761425e61554d565b5b600061426d85828601613f68565b925050602061427e85828601614003565b9150509250929050565b60006020828403121561429e5761429d61554d565b5b60006142ac84828501613f7d565b91505092915050565b6000602082840312156142cb576142ca61554d565b5b60006142d984828501613f92565b91505092915050565b6000602082840312156142f8576142f761554d565b5b600082013567ffffffffffffffff81111561431657614315615548565b5b61432284828501613fd5565b91505092915050565b6000602082840312156143415761434061554d565b5b600061434f84828501614003565b91505092915050565b6000806040838503121561436f5761436e61554d565b5b600061437d85828601614003565b925050602083013567ffffffffffffffff81111561439e5761439d615548565b5b6143aa85828601613fd5565b9150509250929050565b60006143c08383614a06565b60208301905092915050565b6143d581615227565b82525050565b60006143e6826150a6565b6143f081856150d4565b93506143fb83615081565b8060005b8381101561442c57815161441388826143b4565b975061441e836150c7565b9250506001810190506143ff565b5085935050505092915050565b61444281615239565b82525050565b61445181615245565b82525050565b6000614462826150b1565b61446c81856150e5565b935061447c8185602086016152ea565b61448581615552565b840191505092915050565b614499816152a5565b82525050565b6144a8816152b7565b82525050565b6144b7816152c9565b82525050565b60006144c8826150bc565b6144d281856150f6565b93506144e28185602086016152ea565b6144eb81615552565b840191505092915050565b6000614501826150bc565b61450b8185615107565b935061451b8185602086016152ea565b80840191505092915050565b6000815461453481615347565b61453e8186615107565b94506001821660008114614559576001811461456a5761459d565b60ff1983168652818601935061459d565b61457385615091565b60005b8381101561459557815481890152600182019150602081019050614576565b838801955050505b50505092915050565b60006145b36020836150f6565b91506145be82615563565b602082019050919050565b60006145d6602f836150f6565b91506145e18261558c565b604082019050919050565b60006145f9602b836150f6565b9150614604826155db565b604082019050919050565b600061461c6032836150f6565b91506146278261562a565b604082019050919050565b600061463f603c836150f6565b915061464a82615679565b604082019050919050565b6000614662601c836150f6565b915061466d826156c8565b602082019050919050565b60006146856035836150f6565b9150614690826156f1565b604082019050919050565b60006146a86030836150f6565b91506146b382615740565b604082019050919050565b60006146cb6024836150f6565b91506146d68261578f565b604082019050919050565b60006146ee6019836150f6565b91506146f9826157de565b602082019050919050565b6000614711602c836150f6565b915061471c82615807565b604082019050919050565b60006147346032836150f6565b915061473f82615856565b604082019050919050565b60006147576036836150f6565b9150614762826158a5565b604082019050919050565b600061477a6036836150f6565b9150614785826158f4565b604082019050919050565b600061479d6038836150f6565b91506147a882615943565b604082019050919050565b60006147c0602a836150f6565b91506147cb82615992565b604082019050919050565b60006147e36029836150f6565b91506147ee826159e1565b604082019050919050565b6000614806602e836150f6565b915061481182615a30565b604082019050919050565b60006148296025836150f6565b915061483482615a7f565b604082019050919050565b600061484c6020836150f6565b915061485782615ace565b602082019050919050565b600061486f6031836150f6565b915061487a82615af7565b604082019050919050565b6000614892602c836150f6565b915061489d82615b46565b604082019050919050565b60006148b56029836150f6565b91506148c082615b95565b604082019050919050565b60006148d8602f836150f6565b91506148e382615be4565b604082019050919050565b60006148fb6021836150f6565b915061490682615c33565b604082019050919050565b600061491e6028836150f6565b915061492982615c82565b604082019050919050565b60006149416031836150f6565b915061494c82615cd1565b604082019050919050565b6000614964602c836150f6565b915061496f82615d20565b604082019050919050565b6000614987601783615107565b915061499282615d6f565b601782019050919050565b60006149aa6028836150f6565b91506149b582615d98565b604082019050919050565b60006149cd601183615107565b91506149d882615de7565b601182019050919050565b60006149f0602f836150f6565b91506149fb82615e10565b604082019050919050565b614a0f8161529b565b82525050565b614a1e8161529b565b82525050565b6000614a3082856144f6565b9150614a3c82846144f6565b91508190509392505050565b6000614a548284614527565b915081905092915050565b6000614a6a8261497a565b9150614a7682856144f6565b9150614a81826149c0565b9150614a8d82846144f6565b91508190509392505050565b6000602082019050614aae60008301846143cc565b92915050565b6000608082019050614ac960008301876143cc565b614ad660208301866143cc565b614ae36040830185614a15565b8181036060830152614af58184614457565b905095945050505050565b60006020820190508181036000830152614b1a81846143db565b905092915050565b6000602082019050614b376000830184614439565b92915050565b6000602082019050614b526000830184614448565b92915050565b60006020820190508181036000830152614b7281846144bd565b905092915050565b60006020820190508181036000830152614b93816145a6565b9050919050565b60006020820190508181036000830152614bb3816145c9565b9050919050565b60006020820190508181036000830152614bd3816145ec565b9050919050565b60006020820190508181036000830152614bf38161460f565b9050919050565b60006020820190508181036000830152614c1381614632565b9050919050565b60006020820190508181036000830152614c3381614655565b9050919050565b60006020820190508181036000830152614c5381614678565b9050919050565b60006020820190508181036000830152614c738161469b565b9050919050565b60006020820190508181036000830152614c93816146be565b9050919050565b60006020820190508181036000830152614cb3816146e1565b9050919050565b60006020820190508181036000830152614cd381614704565b9050919050565b60006020820190508181036000830152614cf381614727565b9050919050565b60006020820190508181036000830152614d138161474a565b9050919050565b60006020820190508181036000830152614d338161476d565b9050919050565b60006020820190508181036000830152614d5381614790565b9050919050565b60006020820190508181036000830152614d73816147b3565b9050919050565b60006020820190508181036000830152614d93816147d6565b9050919050565b60006020820190508181036000830152614db3816147f9565b9050919050565b60006020820190508181036000830152614dd38161481c565b9050919050565b60006020820190508181036000830152614df38161483f565b9050919050565b60006020820190508181036000830152614e1381614862565b9050919050565b60006020820190508181036000830152614e3381614885565b9050919050565b60006020820190508181036000830152614e53816148a8565b9050919050565b60006020820190508181036000830152614e73816148cb565b9050919050565b60006020820190508181036000830152614e93816148ee565b9050919050565b60006020820190508181036000830152614eb381614911565b9050919050565b60006020820190508181036000830152614ed381614934565b9050919050565b60006020820190508181036000830152614ef381614957565b9050919050565b60006020820190508181036000830152614f138161499d565b9050919050565b60006020820190508181036000830152614f33816149e3565b9050919050565b6000602082019050614f4f6000830184614a15565b92915050565b6000606082019050614f6a6000830186614a15565b614f7760208301856143cc565b614f846040830184614490565b949350505050565b6000606082019050614fa16000830186614a15565b614fae60208301856143cc565b614fbb604083018461449f565b949350505050565b6000606082019050614fd86000830186614a15565b614fe560208301856143cc565b614ff260408301846144ae565b949350505050565b6000615004615015565b90506150108282615379565b919050565b6000604051905090565b600067ffffffffffffffff82111561503a5761503961550f565b5b61504382615552565b9050602081019050919050565b600067ffffffffffffffff82111561506b5761506a61550f565b5b61507482615552565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061511d8261529b565b91506151288361529b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561515d5761515c615424565b5b828201905092915050565b60006151738261529b565b915061517e8361529b565b92508261518e5761518d615453565b5b828204905092915050565b60006151a48261529b565b91506151af8361529b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151e8576151e7615424565b5b828202905092915050565b60006151fe8261529b565b91506152098361529b565b92508282101561521c5761521b615424565b5b828203905092915050565b60006152328261527b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006152b08261529b565b9050919050565b60006152c28261529b565b9050919050565b60006152d48261529b565b9050919050565b82818337600083830152505050565b60005b838110156153085780820151818401526020810190506152ed565b83811115615317576000848401525b50505050565b60006153288261529b565b9150600082141561533c5761533b615424565b5b600182039050919050565b6000600282049050600182168061535f57607f821691505b6020821081141561537357615372615482565b5b50919050565b61538282615552565b810181811067ffffffffffffffff821117156153a1576153a061550f565b5b80604052505050565b60006153b58261529b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156153e8576153e7615424565b5b600182019050919050565b60006153fe8261529b565b91506154098361529b565b92508261541957615418615453565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f46616e746f6d576865656c7a3a20616c6c2046616e746f6d576865656c7a206860008201527f617665206265656e206d696e7465640000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f46616e746f6d576865656c7a3a206e6f7420656e6f7567682046616e746f6d5760008201527f6865656c7a206c65667420746f206d696e74206f6e6520666966747900000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f46616e746f6d576865656c7a3a206d75737420686176652061646d696e20726f60008201527f6c6520746f206368616e67652062617365205552490000000000000000000000602082015250565b7f46616e746f6d576865656c7a3a206d75737420686176652061646d696e20726f60008201527f6c6520746f206368616e67652055524900000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f46616e746f6d576865656c7a3a206d75737420686176652061646d696e20726f60008201527f6c6520746f206368616e67652070726963650000000000000000000000000000602082015250565b7f46616e746f6d576865656c7a3a206e6f7420656e6f7567682046616e746f6d5760008201527f6865656c7a206c65667420746f206d696e742074656e00000000000000000000602082015250565b7f46616e746f6d576865656c7a3a206d75737420686176652061646d696e20726f60008201527f6c6520746f206368616e676520746f6b656e2055524900000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f46616e746f6d576865656c7a3a206d7573742073656e6420636f72726563742060008201527f7072696365000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f46616e746f6d576865656c7a3b204d696e74696e67206973206e6f7420656e6160008201527f626c656420796574000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f46616e746f6d576865656c7a3a204d696e74696e67206973206e6f7420656e6160008201527f626c656420796574000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b615e6881615227565b8114615e7357600080fd5b50565b615e7f81615239565b8114615e8a57600080fd5b50565b615e9681615245565b8114615ea157600080fd5b50565b615ead8161524f565b8114615eb857600080fd5b50565b615ec48161529b565b8114615ecf57600080fd5b5056fea2646970667358221220994f363ea10999631f014b173340eb4d7f96a1931473c2340e3345d331d0a46b64736f6c634300080700330000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000f2dc7d47f1560000000000000000000000000000000000000000000000000000e6b7dd6abede8000000000000000000000000000000000000000000000000000da933d8d8c67000000000000000000000000000000000000000000000000000000000000000000bb800000000000000000000000000000000000000000000000000000000000000000000000000000000000000006afadd417fc8c6a85cfb05711f825f3f6b59448d000000000000000000000000000000000000000000000000000000000000000d46616e746f6d20576865656c7a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008464e544d57484c5a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d575431466e4e363366796f4d5362526d4e52684768327a736a4258687567464d67707446716272544a3832592f00000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102515760003560e01c80637d55094d11610139578063a22cb465116100b6578063cc0b2c9f1161007a578063cc0b2c9f146108bf578063cf721b15146108fc578063d547741f14610927578063dacea8b814610950578063e985e9c514610979578063eda37870146109b657610251565b8063a22cb465146107e9578063b88d4fde14610812578063c0335ea91461083b578063c87b56dd14610845578063ca15c8731461088257610251565b80639075a3bf116100fd5780639075a3bf1461070057806391d148541461072b57806395d89b411461076857806398bcede914610793578063a217fddf146107be57610251565b80637d55094d1461063c5780638462151c1461065357806385e134d91461069057806388f6e28d146106b95780639010d07c146106c357610251565b80632f2ff15d116101d25780634f6ccce7116101965780634f6ccce7146105065780635287314f1461054357806355f804b31461056e5780636352211e14610597578063638024c3146105d457806370a08231146105ff57610251565b80632f2ff15d146104255780632f745c591461044e57806336568abe1461048b5780633adf80b4146104b457806342842e0e146104dd57610251565b80630ced8637116102195780630ced863714610361578063162094c41461036b57806318160ddd1461039457806323b872dd146103bf578063248a9ca3146103e857610251565b80630104e59b1461025657806301ffc9a71461029357806306fdde03146102d0578063081812fc146102fb578063095ea7b314610338575b600080fd5b34801561026257600080fd5b5061027d6004803603810190610278919061432b565b6109df565b60405161028a9190614b58565b60405180910390f35b34801561029f57600080fd5b506102ba60048036038101906102b59190614288565b610a7f565b6040516102c79190614b22565b60405180910390f35b3480156102dc57600080fd5b506102e5610a91565b6040516102f29190614b58565b60405180910390f35b34801561030757600080fd5b50610322600480360381019061031d919061432b565b610b23565b60405161032f9190614a99565b60405180910390f35b34801561034457600080fd5b5061035f600480360381019061035a919061419b565b610ba8565b005b610369610cc0565b005b34801561037757600080fd5b50610392600480360381019061038d9190614358565b610f5e565b005b3480156103a057600080fd5b506103a9610fbf565b6040516103b69190614f3a565b60405180910390f35b3480156103cb57600080fd5b506103e660048036038101906103e19190614085565b610fcc565b005b3480156103f457600080fd5b5061040f600480360381019061040a91906141db565b61102c565b60405161041c9190614b3d565b60405180910390f35b34801561043157600080fd5b5061044c60048036038101906104479190614208565b61104b565b005b34801561045a57600080fd5b506104756004803603810190610470919061419b565b61107f565b6040516104829190614f3a565b60405180910390f35b34801561049757600080fd5b506104b260048036038101906104ad9190614208565b611124565b005b3480156104c057600080fd5b506104db60048036038101906104d69190614358565b611158565b005b3480156104e957600080fd5b5061050460048036038101906104ff9190614085565b6111d7565b005b34801561051257600080fd5b5061052d6004803603810190610528919061432b565b6111f7565b60405161053a9190614f3a565b60405180910390f35b34801561054f57600080fd5b50610558611268565b6040516105659190614f3a565b60405180910390f35b34801561057a57600080fd5b50610595600480360381019061059091906142e2565b611272565b005b3480156105a357600080fd5b506105be60048036038101906105b9919061432b565b6112df565b6040516105cb9190614a99565b60405180910390f35b3480156105e057600080fd5b506105e9611391565b6040516105f69190614f3a565b60405180910390f35b34801561060b57600080fd5b5061062660048036038101906106219190614018565b61139b565b6040516106339190614f3a565b60405180910390f35b34801561064857600080fd5b50610651611453565b005b34801561065f57600080fd5b5061067a60048036038101906106759190614018565b6114d2565b6040516106879190614b00565b60405180910390f35b34801561069c57600080fd5b506106b760048036038101906106b2919061432b565b61165b565b005b6106c16116b8565b005b3480156106cf57600080fd5b506106ea60048036038101906106e59190614248565b61198e565b6040516106f79190614a99565b60405180910390f35b34801561070c57600080fd5b506107156119bd565b6040516107229190614f3a565b60405180910390f35b34801561073757600080fd5b50610752600480360381019061074d9190614208565b6119c7565b60405161075f9190614b22565b60405180910390f35b34801561077457600080fd5b5061077d611a31565b60405161078a9190614b58565b60405180910390f35b34801561079f57600080fd5b506107a8611ac3565b6040516107b59190614f3a565b60405180910390f35b3480156107ca57600080fd5b506107d3611acf565b6040516107e09190614b3d565b60405180910390f35b3480156107f557600080fd5b50610810600480360381019061080b919061415b565b611ad6565b005b34801561081e57600080fd5b50610839600480360381019061083491906140d8565b611c57565b005b610843611cb9565b005b34801561085157600080fd5b5061086c6004803603810190610867919061432b565b611f8f565b6040516108799190614b58565b60405180910390f35b34801561088e57600080fd5b506108a960048036038101906108a491906141db565b612080565b6040516108b69190614f3a565b60405180910390f35b3480156108cb57600080fd5b506108e660048036038101906108e1919061432b565b6120a4565b6040516108f39190614a99565b60405180910390f35b34801561090857600080fd5b506109116120d7565b60405161091e9190614f3a565b60405180910390f35b34801561093357600080fd5b5061094e60048036038101906109499190614208565b6120e8565b005b34801561095c57600080fd5b506109776004803603810190610972919061432b565b61211c565b005b34801561098557600080fd5b506109a0600480360381019061099b9190614045565b612179565b6040516109ad9190614b22565b60405180910390f35b3480156109c257600080fd5b506109dd60048036038101906109d8919061432b565b61220d565b005b601660205280600052604060002060009150905080546109fe90615347565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2a90615347565b8015610a775780601f10610a4c57610100808354040283529160200191610a77565b820191906000526020600020905b815481529060010190602001808311610a5a57829003601f168201915b505050505081565b6000610a8a826122a8565b9050919050565b606060028054610aa090615347565b80601f0160208091040260200160405190810160405280929190818152602001828054610acc90615347565b8015610b195780601f10610aee57610100808354040283529160200191610b19565b820191906000526020600020905b815481529060010190602001808311610afc57829003601f168201915b5050505050905090565b6000610b2e82612322565b610b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6490614e1a565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bb3826112df565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1b90614e7a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c4361238e565b73ffffffffffffffffffffffffffffffffffffffff161480610c725750610c7181610c6c61238e565b612179565b5b610cb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca890614d3a565b60405180910390fd5b610cbb8383612396565b505050565b601360149054906101000a900460ff16610d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0690614e9a565b60405180910390fd5b600f543414610d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4a90614dba565b60405180910390fd5b601254610d60600d61244f565b10610da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9790614b9a565b60405180910390fd5b610db333610dae600d61244f565b61245d565b3360146000610dc2600d61244f565b815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610e616001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461262b90919063ffffffff16565b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610eae600d612641565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015610f16573d6000803e3d6000fd5b507fc9d0543a84d3510329c0783b91576878ceb484e8699944cb5610c3436b3b8e39610f42600d61244f565b336001604051610f5493929190614f8c565b60405180910390a1565b610f726000801b610f6d61238e565b6119c7565b610fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa890614d1a565b60405180910390fd5b610fbb8282612657565b5050565b6000600a80549050905090565b610fdd610fd761238e565b826126cb565b61101c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101390614eba565b60405180910390fd5b6110278383836127a9565b505050565b6000806000838152602001908152602001600020600101549050919050565b6110558282612a05565b61107a816001600085815260200190815260200160002061227890919063ffffffff16565b505050565b600061108a8361139b565b82106110cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c290614bba565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61112e8282612a2e565b6111538160016000858152602001908152602001600020612ab190919063ffffffff16565b505050565b61116c6000801b61116761238e565b6119c7565b6111ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a290614c5a565b60405180910390fd5b806016600084815260200190815260200160002090805190602001906111d2929190613e17565b505050565b6111f283838360405180602001604052806000815250611c57565b505050565b6000611201610fbf565b8210611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123990614eda565b60405180910390fd5b600a8281548110611256576112556154e0565b5b90600052602060002001549050919050565b6000601154905090565b6112866000801b61128161238e565b6119c7565b6112c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bc90614c3a565b60405180910390fd5b80600e90805190602001906112db929190613e17565b5050565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137f90614d7a565b60405180910390fd5b80915050919050565b6000601054905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561140c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140390614d5a565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114676000801b61146261238e565b6119c7565b6114a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149d90614c5a565b60405180910390fd5b601360149054906101000a900460ff1615601360146101000a81548160ff021916908315150217905550565b606060006114df8361139b565b9050600081141561153c57600067ffffffffffffffff8111156115055761150461550f565b5b6040519080825280602002602001820160405280156115335781602001602082028036833780820191505090505b50915050611656565b60008167ffffffffffffffff8111156115585761155761550f565b5b6040519080825280602002602001820160405280156115865781602001602082028036833780820191505090505b5090506000611593610fbf565b9050600080600190505b82811161164d578673ffffffffffffffffffffffffffffffffffffffff166014600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561163a578084838151811061161f5761161e6154e0565b5b6020026020010181815250508180611636906153aa565b9250505b8080611645906153aa565b91505061159d565b83955050505050505b919050565b61166f6000801b61166a61238e565b6119c7565b6116ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a590614cda565b60405180910390fd5b8060118190555050565b601360149054906101000a900460ff16611707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fe90614efa565b60405180910390fd5b60326011546117169190615199565b3414611757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174e90614dba565b60405180910390fd5b6012546032611766600d61244f565b6117709190615112565b106117b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a790614bfa565b60405180910390fd5b60005b60328110156118dd576117cf336117ca600d61244f565b61245d565b33601460006117de600d61244f565b815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061187d6001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461262b90919063ffffffff16565b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506118ca600d612641565b80806118d5906153aa565b9150506117b3565b50601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611946573d6000803e3d6000fd5b507fc9d0543a84d3510329c0783b91576878ceb484e8699944cb5610c3436b3b8e39611972600d61244f565b33603260405161198493929190614fc3565b60405180910390a1565b60006119b58260016000868152602001908152602001600020612ae190919063ffffffff16565b905092915050565b6000600f54905090565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060038054611a4090615347565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6c90615347565b8015611ab95780601f10611a8e57610100808354040283529160200191611ab9565b820191906000526020600020905b815481529060010190602001808311611a9c57829003601f168201915b5050505050905090565b600d8060000154905081565b6000801b81565b611ade61238e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4390614c9a565b60405180910390fd5b8060076000611b5961238e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c0661238e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c4b9190614b22565b60405180910390a35050565b611c68611c6261238e565b836126cb565b611ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9e90614eba565b60405180910390fd5b611cb384848484612afb565b50505050565b601360149054906101000a900460ff16611d08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cff90614efa565b60405180910390fd5b600a601054611d179190615199565b3414611d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4f90614dba565b60405180910390fd5b601254600a611d67600d61244f565b611d719190615112565b10611db1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da890614cfa565b60405180910390fd5b60005b600a811015611ede57611dd033611dcb600d61244f565b61245d565b3360146000611ddf600d61244f565b815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611e7e6001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461262b90919063ffffffff16565b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611ecb600d612641565b8080611ed6906153aa565b915050611db4565b50601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611f47573d6000803e3d6000fd5b507fc9d0543a84d3510329c0783b91576878ceb484e8699944cb5610c3436b3b8e39611f73600d61244f565b33600a604051611f8593929190614f55565b60405180910390a1565b6060600060166000848152602001908152602001600020604051602001611fb69190614a48565b60405160208183030381529060405251111561206f57601660008381526020019081526020016000208054611fea90615347565b80601f016020809104026020016040519081016040528092919081815260200182805461201690615347565b80156120635780601f1061203857610100808354040283529160200191612063565b820191906000526020600020905b81548152906001019060200180831161204657829003601f168201915b5050505050905061207b565b61207882612b57565b90505b919050565b600061209d60016000848152602001908152602001600020612ca9565b9050919050565b60146020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006120e3600d61244f565b905090565b6120f28282612cbe565b6121178160016000858152602001908152602001600020612ab190919063ffffffff16565b505050565b6121306000801b61212b61238e565b6119c7565b61216f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216690614cda565b60405180910390fd5b80600f8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122216000801b61221c61238e565b6119c7565b612260576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225790614cda565b60405180910390fd5b8060108190555050565b6122748282612ce7565b5050565b60006122a0836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612dc7565b905092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061231b575061231a82612e37565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612409836112df565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c490614dda565b60405180910390fd5b6124d681612322565b15612516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250d90614c1a565b60405180910390fd5b61252260008383612f19565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125729190615112565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600081836126399190615112565b905092915050565b6001816000016000828254019250508190555050565b61266082612322565b61269f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269690614d9a565b60405180910390fd5b80600c600084815260200190815260200160002090805190602001906126c6929190613e17565b505050565b60006126d682612322565b612715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270c90614cba565b60405180910390fd5b6000612720836112df565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061278f57508373ffffffffffffffffffffffffffffffffffffffff1661277784610b23565b73ffffffffffffffffffffffffffffffffffffffff16145b806127a0575061279f8185612179565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127c9826112df565b73ffffffffffffffffffffffffffffffffffffffff161461281f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281690614e3a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561288f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288690614c7a565b60405180910390fd5b61289a838383612f19565b6128a5600082612396565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128f591906151f3565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461294c9190615112565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612a0e8261102c565b612a1f81612a1a61238e565b612f29565b612a298383612ce7565b505050565b612a3661238e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612aa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9a90614f1a565b60405180910390fd5b612aad8282612fc6565b5050565b6000612ad9836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6130a7565b905092915050565b6000612af083600001836131bb565b60001c905092915050565b612b068484846127a9565b612b12848484846131e6565b612b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4890614bda565b60405180910390fd5b50505050565b6060612b6282612322565b612ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9890614dfa565b60405180910390fd5b6000600c60008481526020019081526020016000208054612bc190615347565b80601f0160208091040260200160405190810160405280929190818152602001828054612bed90615347565b8015612c3a5780601f10612c0f57610100808354040283529160200191612c3a565b820191906000526020600020905b815481529060010190602001808311612c1d57829003601f168201915b505050505090506000612c4b61337d565b9050600081511415612c61578192505050612ca4565b600082511115612c96578082604051602001612c7e929190614a24565b60405160208183030381529060405292505050612ca4565b612c9f8461340f565b925050505b919050565b6000612cb7826000016134b6565b9050919050565b612cc78261102c565b612cd881612cd361238e565b612f29565b612ce28383612fc6565b505050565b612cf182826119c7565b612dc357600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612d6861238e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000612dd383836134c7565b612e2c578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612e31565b600090505b92915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612f0257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612f125750612f11826134ea565b5b9050919050565b612f24838383613564565b505050565b612f3382826119c7565b612fc257612f588173ffffffffffffffffffffffffffffffffffffffff166014613678565b612f668360001c6020613678565b604051602001612f77929190614a5f565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb99190614b58565b60405180910390fd5b5050565b612fd082826119c7565b156130a357600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061304861238e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600080836001016000848152602001908152602001600020549050600081146131af5760006001826130d991906151f3565b90506000600186600001805490506130f191906151f3565b9050818114613160576000866000018281548110613112576131116154e0565b5b9060005260206000200154905080876000018481548110613136576131356154e0565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480613174576131736154b1565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506131b5565b60009150505b92915050565b60008260000182815481106131d3576131d26154e0565b5b9060005260206000200154905092915050565b60006132078473ffffffffffffffffffffffffffffffffffffffff166138b4565b15613370578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261323061238e565b8786866040518563ffffffff1660e01b81526004016132529493929190614ab4565b602060405180830381600087803b15801561326c57600080fd5b505af192505050801561329d57506040513d601f19601f8201168201806040525081019061329a91906142b5565b60015b613320573d80600081146132cd576040519150601f19603f3d011682016040523d82523d6000602084013e6132d2565b606091505b50600081511415613318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330f90614bda565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613375565b600190505b949350505050565b6060600e805461338c90615347565b80601f01602080910402602001604051908101604052809291908181526020018280546133b890615347565b80156134055780601f106133da57610100808354040283529160200191613405565b820191906000526020600020905b8154815290600101906020018083116133e857829003601f168201915b5050505050905090565b606061341a82612322565b613459576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161345090614e5a565b60405180910390fd5b600061346361337d565b9050600081511161348357604051806020016040528060008152506134ae565b8061348d846138c7565b60405160200161349e929190614a24565b6040516020818303038152906040525b915050919050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061355d575061355c82613a28565b5b9050919050565b61356f838383613aa2565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156135b2576135ad81613aa7565b6135f1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146135f0576135ef8382613af0565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136345761362f81613c5d565b613673565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613672576136718282613d2e565b5b5b505050565b60606000600283600261368b9190615199565b6136959190615112565b67ffffffffffffffff8111156136ae576136ad61550f565b5b6040519080825280601f01601f1916602001820160405280156136e05781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110613718576137176154e0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061377c5761377b6154e0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026137bc9190615199565b6137c69190615112565b90505b6001811115613866577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110613808576138076154e0565b5b1a60f81b82828151811061381f5761381e6154e0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061385f9061531d565b90506137c9565b50600084146138aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138a190614b7a565b60405180910390fd5b8091505092915050565b600080823b905060008111915050919050565b6060600082141561390f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613a23565b600082905060005b6000821461394157808061392a906153aa565b915050600a8261393a9190615168565b9150613917565b60008167ffffffffffffffff81111561395d5761395c61550f565b5b6040519080825280601f01601f19166020018201604052801561398f5781602001600182028036833780820191505090505b5090505b60008514613a1c576001826139a891906151f3565b9150600a856139b791906153f3565b60306139c39190615112565b60f81b8183815181106139d9576139d86154e0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613a159190615168565b9450613993565b8093505050505b919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613a9b5750613a9a82613dad565b5b9050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613afd8461139b565b613b0791906151f3565b9050600060096000848152602001908152602001600020549050818114613bec576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a80549050613c7191906151f3565b90506000600b60008481526020019081526020016000205490506000600a8381548110613ca157613ca06154e0565b5b9060005260206000200154905080600a8381548110613cc357613cc26154e0565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480613d1257613d116154b1565b5b6001900381819060005260206000200160009055905550505050565b6000613d398361139b565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b828054613e2390615347565b90600052602060002090601f016020900481019282613e455760008555613e8c565b82601f10613e5e57805160ff1916838001178555613e8c565b82800160010185558215613e8c579182015b82811115613e8b578251825591602001919060010190613e70565b5b509050613e999190613e9d565b5090565b5b80821115613eb6576000816000905550600101613e9e565b5090565b6000613ecd613ec88461501f565b614ffa565b905082815260208101848484011115613ee957613ee8615543565b5b613ef48482856152db565b509392505050565b6000613f0f613f0a84615050565b614ffa565b905082815260208101848484011115613f2b57613f2a615543565b5b613f368482856152db565b509392505050565b600081359050613f4d81615e5f565b92915050565b600081359050613f6281615e76565b92915050565b600081359050613f7781615e8d565b92915050565b600081359050613f8c81615ea4565b92915050565b600081519050613fa181615ea4565b92915050565b600082601f830112613fbc57613fbb61553e565b5b8135613fcc848260208601613eba565b91505092915050565b600082601f830112613fea57613fe961553e565b5b8135613ffa848260208601613efc565b91505092915050565b60008135905061401281615ebb565b92915050565b60006020828403121561402e5761402d61554d565b5b600061403c84828501613f3e565b91505092915050565b6000806040838503121561405c5761405b61554d565b5b600061406a85828601613f3e565b925050602061407b85828601613f3e565b9150509250929050565b60008060006060848603121561409e5761409d61554d565b5b60006140ac86828701613f3e565b93505060206140bd86828701613f3e565b92505060406140ce86828701614003565b9150509250925092565b600080600080608085870312156140f2576140f161554d565b5b600061410087828801613f3e565b945050602061411187828801613f3e565b935050604061412287828801614003565b925050606085013567ffffffffffffffff81111561414357614142615548565b5b61414f87828801613fa7565b91505092959194509250565b600080604083850312156141725761417161554d565b5b600061418085828601613f3e565b925050602061419185828601613f53565b9150509250929050565b600080604083850312156141b2576141b161554d565b5b60006141c085828601613f3e565b92505060206141d185828601614003565b9150509250929050565b6000602082840312156141f1576141f061554d565b5b60006141ff84828501613f68565b91505092915050565b6000806040838503121561421f5761421e61554d565b5b600061422d85828601613f68565b925050602061423e85828601613f3e565b9150509250929050565b6000806040838503121561425f5761425e61554d565b5b600061426d85828601613f68565b925050602061427e85828601614003565b9150509250929050565b60006020828403121561429e5761429d61554d565b5b60006142ac84828501613f7d565b91505092915050565b6000602082840312156142cb576142ca61554d565b5b60006142d984828501613f92565b91505092915050565b6000602082840312156142f8576142f761554d565b5b600082013567ffffffffffffffff81111561431657614315615548565b5b61432284828501613fd5565b91505092915050565b6000602082840312156143415761434061554d565b5b600061434f84828501614003565b91505092915050565b6000806040838503121561436f5761436e61554d565b5b600061437d85828601614003565b925050602083013567ffffffffffffffff81111561439e5761439d615548565b5b6143aa85828601613fd5565b9150509250929050565b60006143c08383614a06565b60208301905092915050565b6143d581615227565b82525050565b60006143e6826150a6565b6143f081856150d4565b93506143fb83615081565b8060005b8381101561442c57815161441388826143b4565b975061441e836150c7565b9250506001810190506143ff565b5085935050505092915050565b61444281615239565b82525050565b61445181615245565b82525050565b6000614462826150b1565b61446c81856150e5565b935061447c8185602086016152ea565b61448581615552565b840191505092915050565b614499816152a5565b82525050565b6144a8816152b7565b82525050565b6144b7816152c9565b82525050565b60006144c8826150bc565b6144d281856150f6565b93506144e28185602086016152ea565b6144eb81615552565b840191505092915050565b6000614501826150bc565b61450b8185615107565b935061451b8185602086016152ea565b80840191505092915050565b6000815461453481615347565b61453e8186615107565b94506001821660008114614559576001811461456a5761459d565b60ff1983168652818601935061459d565b61457385615091565b60005b8381101561459557815481890152600182019150602081019050614576565b838801955050505b50505092915050565b60006145b36020836150f6565b91506145be82615563565b602082019050919050565b60006145d6602f836150f6565b91506145e18261558c565b604082019050919050565b60006145f9602b836150f6565b9150614604826155db565b604082019050919050565b600061461c6032836150f6565b91506146278261562a565b604082019050919050565b600061463f603c836150f6565b915061464a82615679565b604082019050919050565b6000614662601c836150f6565b915061466d826156c8565b602082019050919050565b60006146856035836150f6565b9150614690826156f1565b604082019050919050565b60006146a86030836150f6565b91506146b382615740565b604082019050919050565b60006146cb6024836150f6565b91506146d68261578f565b604082019050919050565b60006146ee6019836150f6565b91506146f9826157de565b602082019050919050565b6000614711602c836150f6565b915061471c82615807565b604082019050919050565b60006147346032836150f6565b915061473f82615856565b604082019050919050565b60006147576036836150f6565b9150614762826158a5565b604082019050919050565b600061477a6036836150f6565b9150614785826158f4565b604082019050919050565b600061479d6038836150f6565b91506147a882615943565b604082019050919050565b60006147c0602a836150f6565b91506147cb82615992565b604082019050919050565b60006147e36029836150f6565b91506147ee826159e1565b604082019050919050565b6000614806602e836150f6565b915061481182615a30565b604082019050919050565b60006148296025836150f6565b915061483482615a7f565b604082019050919050565b600061484c6020836150f6565b915061485782615ace565b602082019050919050565b600061486f6031836150f6565b915061487a82615af7565b604082019050919050565b6000614892602c836150f6565b915061489d82615b46565b604082019050919050565b60006148b56029836150f6565b91506148c082615b95565b604082019050919050565b60006148d8602f836150f6565b91506148e382615be4565b604082019050919050565b60006148fb6021836150f6565b915061490682615c33565b604082019050919050565b600061491e6028836150f6565b915061492982615c82565b604082019050919050565b60006149416031836150f6565b915061494c82615cd1565b604082019050919050565b6000614964602c836150f6565b915061496f82615d20565b604082019050919050565b6000614987601783615107565b915061499282615d6f565b601782019050919050565b60006149aa6028836150f6565b91506149b582615d98565b604082019050919050565b60006149cd601183615107565b91506149d882615de7565b601182019050919050565b60006149f0602f836150f6565b91506149fb82615e10565b604082019050919050565b614a0f8161529b565b82525050565b614a1e8161529b565b82525050565b6000614a3082856144f6565b9150614a3c82846144f6565b91508190509392505050565b6000614a548284614527565b915081905092915050565b6000614a6a8261497a565b9150614a7682856144f6565b9150614a81826149c0565b9150614a8d82846144f6565b91508190509392505050565b6000602082019050614aae60008301846143cc565b92915050565b6000608082019050614ac960008301876143cc565b614ad660208301866143cc565b614ae36040830185614a15565b8181036060830152614af58184614457565b905095945050505050565b60006020820190508181036000830152614b1a81846143db565b905092915050565b6000602082019050614b376000830184614439565b92915050565b6000602082019050614b526000830184614448565b92915050565b60006020820190508181036000830152614b7281846144bd565b905092915050565b60006020820190508181036000830152614b93816145a6565b9050919050565b60006020820190508181036000830152614bb3816145c9565b9050919050565b60006020820190508181036000830152614bd3816145ec565b9050919050565b60006020820190508181036000830152614bf38161460f565b9050919050565b60006020820190508181036000830152614c1381614632565b9050919050565b60006020820190508181036000830152614c3381614655565b9050919050565b60006020820190508181036000830152614c5381614678565b9050919050565b60006020820190508181036000830152614c738161469b565b9050919050565b60006020820190508181036000830152614c93816146be565b9050919050565b60006020820190508181036000830152614cb3816146e1565b9050919050565b60006020820190508181036000830152614cd381614704565b9050919050565b60006020820190508181036000830152614cf381614727565b9050919050565b60006020820190508181036000830152614d138161474a565b9050919050565b60006020820190508181036000830152614d338161476d565b9050919050565b60006020820190508181036000830152614d5381614790565b9050919050565b60006020820190508181036000830152614d73816147b3565b9050919050565b60006020820190508181036000830152614d93816147d6565b9050919050565b60006020820190508181036000830152614db3816147f9565b9050919050565b60006020820190508181036000830152614dd38161481c565b9050919050565b60006020820190508181036000830152614df38161483f565b9050919050565b60006020820190508181036000830152614e1381614862565b9050919050565b60006020820190508181036000830152614e3381614885565b9050919050565b60006020820190508181036000830152614e53816148a8565b9050919050565b60006020820190508181036000830152614e73816148cb565b9050919050565b60006020820190508181036000830152614e93816148ee565b9050919050565b60006020820190508181036000830152614eb381614911565b9050919050565b60006020820190508181036000830152614ed381614934565b9050919050565b60006020820190508181036000830152614ef381614957565b9050919050565b60006020820190508181036000830152614f138161499d565b9050919050565b60006020820190508181036000830152614f33816149e3565b9050919050565b6000602082019050614f4f6000830184614a15565b92915050565b6000606082019050614f6a6000830186614a15565b614f7760208301856143cc565b614f846040830184614490565b949350505050565b6000606082019050614fa16000830186614a15565b614fae60208301856143cc565b614fbb604083018461449f565b949350505050565b6000606082019050614fd86000830186614a15565b614fe560208301856143cc565b614ff260408301846144ae565b949350505050565b6000615004615015565b90506150108282615379565b919050565b6000604051905090565b600067ffffffffffffffff82111561503a5761503961550f565b5b61504382615552565b9050602081019050919050565b600067ffffffffffffffff82111561506b5761506a61550f565b5b61507482615552565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061511d8261529b565b91506151288361529b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561515d5761515c615424565b5b828201905092915050565b60006151738261529b565b915061517e8361529b565b92508261518e5761518d615453565b5b828204905092915050565b60006151a48261529b565b91506151af8361529b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151e8576151e7615424565b5b828202905092915050565b60006151fe8261529b565b91506152098361529b565b92508282101561521c5761521b615424565b5b828203905092915050565b60006152328261527b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006152b08261529b565b9050919050565b60006152c28261529b565b9050919050565b60006152d48261529b565b9050919050565b82818337600083830152505050565b60005b838110156153085780820151818401526020810190506152ed565b83811115615317576000848401525b50505050565b60006153288261529b565b9150600082141561533c5761533b615424565b5b600182039050919050565b6000600282049050600182168061535f57607f821691505b6020821081141561537357615372615482565b5b50919050565b61538282615552565b810181811067ffffffffffffffff821117156153a1576153a061550f565b5b80604052505050565b60006153b58261529b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156153e8576153e7615424565b5b600182019050919050565b60006153fe8261529b565b91506154098361529b565b92508261541957615418615453565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f46616e746f6d576865656c7a3a20616c6c2046616e746f6d576865656c7a206860008201527f617665206265656e206d696e7465640000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f46616e746f6d576865656c7a3a206e6f7420656e6f7567682046616e746f6d5760008201527f6865656c7a206c65667420746f206d696e74206f6e6520666966747900000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f46616e746f6d576865656c7a3a206d75737420686176652061646d696e20726f60008201527f6c6520746f206368616e67652062617365205552490000000000000000000000602082015250565b7f46616e746f6d576865656c7a3a206d75737420686176652061646d696e20726f60008201527f6c6520746f206368616e67652055524900000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f46616e746f6d576865656c7a3a206d75737420686176652061646d696e20726f60008201527f6c6520746f206368616e67652070726963650000000000000000000000000000602082015250565b7f46616e746f6d576865656c7a3a206e6f7420656e6f7567682046616e746f6d5760008201527f6865656c7a206c65667420746f206d696e742074656e00000000000000000000602082015250565b7f46616e746f6d576865656c7a3a206d75737420686176652061646d696e20726f60008201527f6c6520746f206368616e676520746f6b656e2055524900000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f46616e746f6d576865656c7a3a206d7573742073656e6420636f72726563742060008201527f7072696365000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f46616e746f6d576865656c7a3b204d696e74696e67206973206e6f7420656e6160008201527f626c656420796574000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f46616e746f6d576865656c7a3a204d696e74696e67206973206e6f7420656e6160008201527f626c656420796574000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b615e6881615227565b8114615e7357600080fd5b50565b615e7f81615239565b8114615e8a57600080fd5b50565b615e9681615245565b8114615ea157600080fd5b50565b615ead8161524f565b8114615eb857600080fd5b50565b615ec48161529b565b8114615ecf57600080fd5b5056fea2646970667358221220994f363ea10999631f014b173340eb4d7f96a1931473c2340e3345d331d0a46b64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000f2dc7d47f1560000000000000000000000000000000000000000000000000000e6b7dd6abede8000000000000000000000000000000000000000000000000000da933d8d8c67000000000000000000000000000000000000000000000000000000000000000000bb800000000000000000000000000000000000000000000000000000000000000000000000000000000000000006afadd417fc8c6a85cfb05711f825f3f6b59448d000000000000000000000000000000000000000000000000000000000000000d46616e746f6d20576865656c7a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008464e544d57484c5a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d575431466e4e363366796f4d5362526d4e52684768327a736a4258687567464d67707446716272544a3832592f00000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): Fantom Wheelz
Arg [1] : symbol (string): FNTMWHLZ
Arg [2] : baseTokenURI (string): https://ipfs.io/ipfs/QmWT1FnN63fyoMSbRmNRhGh2zsjBXhugFMgptFqbrTJ82Y/
Arg [3] : mintPriceOne (uint256): 280000000000000000000
Arg [4] : mintPriceTen (uint256): 266000000000000000000
Arg [5] : mintPriceFifty (uint256): 252000000000000000000
Arg [6] : max (uint256): 3000
Arg [7] : mintingEnabled (bool): False
Arg [8] : admin (address): 0x6aFADD417Fc8c6a85cfB05711F825f3f6b59448d
-----Encoded View---------------
17 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [3] : 00000000000000000000000000000000000000000000000f2dc7d47f15600000
Arg [4] : 00000000000000000000000000000000000000000000000e6b7dd6abede80000
Arg [5] : 00000000000000000000000000000000000000000000000da933d8d8c6700000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000bb8
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000006afadd417fc8c6a85cfb05711f825f3f6b59448d
Arg [9] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [10] : 46616e746f6d20576865656c7a00000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [12] : 464e544d57484c5a000000000000000000000000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000044
Arg [14] : 68747470733a2f2f697066732e696f2f697066732f516d575431466e4e363366
Arg [15] : 796f4d5362526d4e52684768327a736a4258687567464d67707446716272544a
Arg [16] : 3832592f00000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
76665:7207:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77180:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83667:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21062:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22621:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22144:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79835:614;;;:::i;:::-;;78263:232;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62961:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23511:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41859:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59568:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62629:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60153:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78503:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23921:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63151:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79492:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78055:202;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20756:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79410:76;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20486:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81410:212;;;;;;;;;;;;;:::i;:::-;;80516:876;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79127:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82307:682;;;:::i;:::-;;59023:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79328:76;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40744:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21231:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76840:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39835:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22914:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24177:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81628:673;;;:::i;:::-;;83137:273;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59342:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77084:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77834:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59857:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78733:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23280:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78930:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77180:46;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;83667:198::-;83803:4;83823:36;83847:11;83823:23;:36::i;:::-;83816:43;;83667:198;;;:::o;21062:100::-;21116:13;21149:5;21142:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21062:100;:::o;22621:221::-;22697:7;22725:16;22733:7;22725;:16::i;:::-;22717:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22810:15;:24;22826:7;22810:24;;;;;;;;;;;;;;;;;;;;;22803:31;;22621:221;;;:::o;22144:411::-;22225:13;22241:23;22256:7;22241:14;:23::i;:::-;22225:39;;22289:5;22283:11;;:2;:11;;;;22275:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22383:5;22367:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22392:37;22409:5;22416:12;:10;:12::i;:::-;22392:16;:37::i;:::-;22367:62;22345:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22526:21;22535:2;22539:7;22526:8;:21::i;:::-;22214:341;22144:411;;:::o;79835:614::-;79884:15;;;;;;;;;;;79876:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;79972:9;;79959;:22;79951:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;80066:4;;80038:25;:15;:23;:25::i;:::-;:32;80030:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;80129:44;80135:10;80147:25;:15;:23;:25::i;:::-;80129:5;:44::i;:::-;80222:10;80180:12;:39;80193:25;:15;:23;:25::i;:::-;80180:39;;;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;80269:34;80301:1;80269:15;:27;80285:10;80269:27;;;;;;;;;;;;;;;;:31;;:34;;;;:::i;:::-;80239:15;:27;80255:10;80239:27;;;;;;;;;;;;;;;:64;;;;80310:27;:15;:25;:27::i;:::-;80352:6;;;;;;;;;;;80344:24;;:35;80369:9;80344:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80391:46;80398:25;:15;:23;:25::i;:::-;80424:10;80435:1;80391:46;;;;;;;;:::i;:::-;;;;;;;;79835:614::o;78263:232::-;78350:41;39880:4;78358:18;;78378:12;:10;:12::i;:::-;78350:7;:41::i;:::-;78342:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;78457:32;78470:7;78479:9;78457:12;:32::i;:::-;78263:232;;:::o;62961:113::-;63022:7;63049:10;:17;;;;63042:24;;62961:113;:::o;23511:339::-;23706:41;23725:12;:10;:12::i;:::-;23739:7;23706:18;:41::i;:::-;23698:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23814:28;23824:4;23830:2;23834:7;23814:9;:28::i;:::-;23511:339;;;:::o;41859:123::-;41925:7;41952:6;:12;41959:4;41952:12;;;;;;;;;;;:22;;;41945:29;;41859:123;;;:::o;59568:196::-;59684:30;59700:4;59706:7;59684:15;:30::i;:::-;59725:31;59748:7;59725:12;:18;59738:4;59725:18;;;;;;;;;;;:22;;:31;;;;:::i;:::-;;59568:196;;:::o;62629:256::-;62726:7;62762:23;62779:5;62762:16;:23::i;:::-;62754:5;:31;62746:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;62851:12;:19;62864:5;62851:19;;;;;;;;;;;;;;;:26;62871:5;62851:26;;;;;;;;;;;;62844:33;;62629:256;;;;:::o;60153:205::-;60272:33;60291:4;60297:7;60272:18;:33::i;:::-;60316:34;60342:7;60316:12;:18;60329:4;60316:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;60153:205;;:::o;78503:224::-;78589:41;39880:4;78597:18;;78617:12;:10;:12::i;:::-;78589:7;:41::i;:::-;78581:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;78718:3;78692:14;:23;78707:7;78692:23;;;;;;;;;;;:29;;;;;;;;;;;;:::i;:::-;;78503:224;;:::o;23921:185::-;24059:39;24076:4;24082:2;24086:7;24059:39;;;;;;;;;;;;:16;:39::i;:::-;23921:185;;;:::o;63151:233::-;63226:7;63262:30;:28;:30::i;:::-;63254:5;:38;63246:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;63359:10;63370:5;63359:17;;;;;;;;:::i;:::-;;;;;;;;;;63352:24;;63151:233;;;:::o;79492:80::-;79535:4;79555:11;;79548:18;;79492:80;:::o;78055:202::-;78122:41;39880:4;78130:18;;78150:12;:10;:12::i;:::-;78122:7;:41::i;:::-;78114:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;78244:7;78228:13;:23;;;;;;;;;;;;:::i;:::-;;78055:202;:::o;20756:239::-;20828:7;20848:13;20864:7;:16;20872:7;20864:16;;;;;;;;;;;;;;;;;;;;;20848:32;;20916:1;20899:19;;:5;:19;;;;20891:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20982:5;20975:12;;;20756:239;;;:::o;79410:76::-;79451:4;79471:9;;79464:16;;79410:76;:::o;20486:208::-;20558:7;20603:1;20586:19;;:5;:19;;;;20578:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20670:9;:16;20680:5;20670:16;;;;;;;;;;;;;;;;20663:23;;20486:208;;;:::o;81410:212::-;81464:41;39880:4;81472:18;;81492:12;:10;:12::i;:::-;81464:7;:41::i;:::-;81456:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;81589:15;;;;;;;;;;;81588:16;81570:15;;:34;;;;;;;;;;;;;;;;;;81410:212::o;80516:876::-;80577:28;80618:18;80639:17;80649:6;80639:9;:17::i;:::-;80618:38;;80687:1;80673:10;:15;80669:716;;;80764:1;80750:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80743:23;;;;;80669:716;80799:23;80839:10;80825:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80799:51;;80865:19;80887:13;:11;:13::i;:::-;80865:35;;80915:19;81104:11;81143:1;81137:7;;81132:212;81153:11;81146:3;:18;81132:212;;81217:6;81196:27;;:12;:17;81209:3;81196:17;;;;;;;;;;;;;;;;;;;;;:27;;;81192:137;;;81270:3;81248:6;81255:11;81248:19;;;;;;;;:::i;:::-;;;;;;;:25;;;;;81296:13;;;;;:::i;:::-;;;;81192:137;81166:5;;;;;:::i;:::-;;;;81132:212;;;81367:6;81360:13;;;;;;;80516:876;;;;:::o;79127:195::-;79190:41;39880:4;79198:18;;79218:12;:10;:12::i;:::-;79190:7;:41::i;:::-;79182:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;79307:9;79293:11;:23;;;;79127:195;:::o;82307:682::-;82358:15;;;;;;;;;;;82350:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;82458:2;82446:11;;:14;;;;:::i;:::-;82433:9;:27;82425:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;82550:4;;82545:2;82517:25;:15;:23;:25::i;:::-;:30;;;;:::i;:::-;:37;82509:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;82630:6;82626:257;82644:2;82640:1;:6;82626:257;;;82661:44;82667:10;82679:25;:15;:23;:25::i;:::-;82661:5;:44::i;:::-;82756:10;82714:12;:39;82727:25;:15;:23;:25::i;:::-;82714:39;;;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;82805:34;82837:1;82805:15;:27;82821:10;82805:27;;;;;;;;;;;;;;;;:31;;:34;;;;:::i;:::-;82775:15;:27;82791:10;82775:27;;;;;;;;;;;;;;;:64;;;;82848:27;:15;:25;:27::i;:::-;82648:3;;;;;:::i;:::-;;;;82626:257;;;;82897:6;;;;;;;;;;;82889:24;;:35;82914:9;82889:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82936:47;82943:25;:15;:23;:25::i;:::-;82969:10;82980:2;82936:47;;;;;;;;:::i;:::-;;;;;;;;82307:682::o;59023:145::-;59105:7;59132:28;59154:5;59132:12;:18;59145:4;59132:18;;;;;;;;;;;:21;;:28;;;;:::i;:::-;59125:35;;59023:145;;;;:::o;79328:76::-;79369:4;79389:9;;79382:16;;79328:76;:::o;40744:139::-;40822:4;40846:6;:12;40853:4;40846:12;;;;;;;;;;;:20;;:29;40867:7;40846:29;;;;;;;;;;;;;;;;;;;;;;;;;40839:36;;40744:139;;;;:::o;21231:104::-;21287:13;21320:7;21313:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21231:104;:::o;76840:39::-;;;;;;;;;:::o;39835:49::-;39880:4;39835:49;;;:::o;22914:295::-;23029:12;:10;:12::i;:::-;23017:24;;:8;:24;;;;23009:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23129:8;23084:18;:32;23103:12;:10;:12::i;:::-;23084:32;;;;;;;;;;;;;;;:42;23117:8;23084:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23182:8;23153:48;;23168:12;:10;:12::i;:::-;23153:48;;;23192:8;23153:48;;;;;;:::i;:::-;;;;;;;;22914:295;;:::o;24177:328::-;24352:41;24371:12;:10;:12::i;:::-;24385:7;24352:18;:41::i;:::-;24344:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24458:39;24472:4;24478:2;24482:7;24491:5;24458:13;:39::i;:::-;24177:328;;;;:::o;81628:673::-;81677:15;;;;;;;;;;;81669:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;81775:2;81765:9;;:12;;;;:::i;:::-;81752:9;:25;81744:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;81867:4;;81862:2;81834:25;:15;:23;:25::i;:::-;:30;;;;:::i;:::-;:37;81826:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;81941:6;81937:257;81955:2;81951:1;:6;81937:257;;;81972:44;81978:10;81990:25;:15;:23;:25::i;:::-;81972:5;:44::i;:::-;82067:10;82025:12;:39;82038:25;:15;:23;:25::i;:::-;82025:39;;;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;82116:34;82148:1;82116:15;:27;82132:10;82116:27;;;;;;;;;;;;;;;;:31;;:34;;;;:::i;:::-;82086:15;:27;82102:10;82086:27;;;;;;;;;;;;;;;:64;;;;82159:27;:15;:25;:27::i;:::-;81959:3;;;;;:::i;:::-;;;;81937:257;;;;82208:6;;;;;;;;;;;82200:24;;:35;82225:9;82200:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82248:47;82255:25;:15;:23;:25::i;:::-;82281:10;82292:2;82248:47;;;;;;;;:::i;:::-;;;;;;;;81628:673::o;83137:273::-;83228:13;83305:1;83271:14;:23;83286:7;83271:23;;;;;;;;;;;83254:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;:48;:52;83250:107;;;83326:14;:23;83341:7;83326:23;;;;;;;;;;;83319:30;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83250:107;83370:34;83396:7;83370:25;:34::i;:::-;83363:41;;83137:273;;;;:::o;59342:134::-;59414:7;59441:27;:12;:18;59454:4;59441:18;;;;;;;;;;;:25;:27::i;:::-;59434:34;;59342:134;;;:::o;77084:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;77834:99::-;77877:7;77902:25;:15;:23;:25::i;:::-;77895:32;;77834:99;:::o;59857:201::-;59974:31;59991:4;59997:7;59974:16;:31::i;:::-;60016:34;60042:7;60016:12;:18;60029:4;60016:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;59857:201;;:::o;78733:191::-;78794:41;39880:4;78802:18;;78822:12;:10;:12::i;:::-;78794:7;:41::i;:::-;78786:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;78909:9;78897;:21;;;;78733:191;:::o;23280:164::-;23377:4;23401:18;:25;23420:5;23401:25;;;;;;;;;;;;;;;:35;23427:8;23401:35;;;;;;;;;;;;;;;;;;;;;;;;;23394:42;;23280:164;;;;:::o;78930:191::-;78991:41;39880:4;78999:18;;79019:12;:10;:12::i;:::-;78991:7;:41::i;:::-;78983:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;79106:9;79094;:21;;;;78930:191;:::o;44169:112::-;44248:25;44259:4;44265:7;44248:10;:25::i;:::-;44169:112;;:::o;53116:152::-;53186:4;53210:50;53215:3;:10;;53251:5;53235:23;;53227:32;;53210:4;:50::i;:::-;53203:57;;53116:152;;;;:::o;62321:224::-;62423:4;62462:35;62447:50;;;:11;:50;;;;:90;;;;62501:36;62525:11;62501:23;:36::i;:::-;62447:90;62440:97;;62321:224;;;:::o;26015:127::-;26080:4;26132:1;26104:30;;:7;:16;26112:7;26104:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26097:37;;26015:127;;;:::o;15095:98::-;15148:7;15175:10;15168:17;;15095:98;:::o;29997:174::-;30099:2;30072:15;:24;30088:7;30072:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30155:7;30151:2;30117:46;;30126:23;30141:7;30126:14;:23::i;:::-;30117:46;;;;;;;;;;;;29997:174;;:::o;69202:114::-;69267:7;69294;:14;;;69287:21;;69202:114;;;:::o;27993:382::-;28087:1;28073:16;;:2;:16;;;;28065:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28146:16;28154:7;28146;:16::i;:::-;28145:17;28137:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28208:45;28237:1;28241:2;28245:7;28208:20;:45::i;:::-;28283:1;28266:9;:13;28276:2;28266:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28314:2;28295:7;:16;28303:7;28295:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28359:7;28355:2;28334:33;;28351:1;28334:33;;;;;;;;;;;;27993:382;;:::o;72498:98::-;72556:7;72587:1;72583;:5;;;;:::i;:::-;72576:12;;72498:98;;;;:::o;69324:127::-;69431:1;69413:7;:14;;;:19;;;;;;;;;;;69324:127;:::o;33391:217::-;33491:16;33499:7;33491;:16::i;:::-;33483:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;33591:9;33569:10;:19;33580:7;33569:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;33391:217;;:::o;26309:348::-;26402:4;26427:16;26435:7;26427;:16::i;:::-;26419:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26503:13;26519:23;26534:7;26519:14;:23::i;:::-;26503:39;;26572:5;26561:16;;:7;:16;;;:51;;;;26605:7;26581:31;;:20;26593:7;26581:11;:20::i;:::-;:31;;;26561:51;:87;;;;26616:32;26633:5;26640:7;26616:16;:32::i;:::-;26561:87;26553:96;;;26309:348;;;;:::o;29301:578::-;29460:4;29433:31;;:23;29448:7;29433:14;:23::i;:::-;:31;;;29425:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29543:1;29529:16;;:2;:16;;;;29521:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29599:39;29620:4;29626:2;29630:7;29599:20;:39::i;:::-;29703:29;29720:1;29724:7;29703:8;:29::i;:::-;29764:1;29745:9;:15;29755:4;29745:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29793:1;29776:9;:13;29786:2;29776:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29824:2;29805:7;:16;29813:7;29805:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29863:7;29859:2;29844:27;;29853:4;29844:27;;;;;;;;;;;;29301:578;;;:::o;42244:147::-;42327:18;42340:4;42327:12;:18::i;:::-;40326:30;40337:4;40343:12;:10;:12::i;:::-;40326:10;:30::i;:::-;42358:25:::1;42369:4;42375:7;42358:10;:25::i;:::-;42244:147:::0;;;:::o;43292:218::-;43399:12;:10;:12::i;:::-;43388:23;;:7;:23;;;43380:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;43476:26;43488:4;43494:7;43476:11;:26::i;:::-;43292:218;;:::o;53444:158::-;53517:4;53541:53;53549:3;:10;;53585:5;53569:23;;53561:32;;53541:7;:53::i;:::-;53534:60;;53444:158;;;;:::o;54412:::-;54486:7;54537:22;54541:3;:10;;54553:5;54537:3;:22::i;:::-;54529:31;;54506:56;;54412:158;;;;:::o;25387:315::-;25544:28;25554:4;25560:2;25564:7;25544:9;:28::i;:::-;25591:48;25614:4;25620:2;25624:7;25633:5;25591:22;:48::i;:::-;25583:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25387:315;;;;:::o;32556:679::-;32629:13;32663:16;32671:7;32663;:16::i;:::-;32655:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;32746:23;32772:10;:19;32783:7;32772:19;;;;;;;;;;;32746:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32802:18;32823:10;:8;:10::i;:::-;32802:31;;32931:1;32915:4;32909:18;:23;32905:72;;;32956:9;32949:16;;;;;;32905:72;33107:1;33087:9;33081:23;:27;33077:108;;;33156:4;33162:9;33139:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33125:48;;;;;;33077:108;33204:23;33219:7;33204:14;:23::i;:::-;33197:30;;;;32556:679;;;;:::o;53941:117::-;54004:7;54031:19;54039:3;:10;;54031:7;:19::i;:::-;54024:26;;53941:117;;;:::o;42636:149::-;42720:18;42733:4;42720:12;:18::i;:::-;40326:30;40337:4;40343:12;:10;:12::i;:::-;40326:10;:30::i;:::-;42751:26:::1;42763:4;42769:7;42751:11;:26::i;:::-;42636:149:::0;;;:::o;44793:238::-;44877:22;44885:4;44891:7;44877;:22::i;:::-;44872:152;;44948:4;44916:6;:12;44923:4;44916:12;;;;;;;;;;;:20;;:29;44937:7;44916:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;44999:12;:10;:12::i;:::-;44972:40;;44990:7;44972:40;;44984:4;44972:40;;;;;;;;;;44872:152;44793:238;;:::o;47031:414::-;47094:4;47116:21;47126:3;47131:5;47116:9;:21::i;:::-;47111:327;;47154:3;:11;;47171:5;47154:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47337:3;:11;;:18;;;;47315:3;:12;;:19;47328:5;47315:19;;;;;;;;;;;:40;;;;47377:4;47370:11;;;;47111:327;47421:5;47414:12;;47031:414;;;;;:::o;20117:305::-;20219:4;20271:25;20256:40;;;:11;:40;;;;:105;;;;20328:33;20313:48;;;:11;:48;;;;20256:105;:158;;;;20378:36;20402:11;20378:23;:36::i;:::-;20256:158;20236:178;;20117:305;;;:::o;83418:183::-;83550:45;83577:4;83583:2;83587:7;83550:26;:45::i;:::-;83418:183;;;:::o;41173:497::-;41254:22;41262:4;41268:7;41254;:22::i;:::-;41249:414;;41442:41;41470:7;41442:41;;41480:2;41442:19;:41::i;:::-;41556:38;41584:4;41576:13;;41591:2;41556:19;:38::i;:::-;41347:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41293:358;;;;;;;;;;;:::i;:::-;;;;;;;;41249:414;41173:497;;:::o;45163:239::-;45247:22;45255:4;45261:7;45247;:22::i;:::-;45243:152;;;45318:5;45286:6;:12;45293:4;45286:12;;;;;;;;;;;:20;;:29;45307:7;45286:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;45370:12;:10;:12::i;:::-;45343:40;;45361:7;45343:40;;45355:4;45343:40;;;;;;;;;;45243:152;45163:239;;:::o;47621:1420::-;47687:4;47805:18;47826:3;:12;;:19;47839:5;47826:19;;;;;;;;;;;;47805:40;;47876:1;47862:10;:15;47858:1176;;48237:21;48274:1;48261:10;:14;;;;:::i;:::-;48237:38;;48290:17;48331:1;48310:3;:11;;:18;;;;:22;;;;:::i;:::-;48290:42;;48366:13;48353:9;:26;48349:405;;48400:17;48420:3;:11;;48432:9;48420:22;;;;;;;;:::i;:::-;;;;;;;;;;48400:42;;48574:9;48545:3;:11;;48557:13;48545:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;48685:10;48659:3;:12;;:23;48672:9;48659:23;;;;;;;;;;;:36;;;;48381:373;48349:405;48835:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;48930:3;:12;;:19;48943:5;48930:19;;;;;;;;;;;48923:26;;;48973:4;48966:11;;;;;;;47858:1176;49017:5;49010:12;;;47621:1420;;;;;:::o;49805:120::-;49872:7;49899:3;:11;;49911:5;49899:18;;;;;;;;:::i;:::-;;;;;;;;;;49892:25;;49805:120;;;;:::o;30736:799::-;30891:4;30912:15;:2;:13;;;:15::i;:::-;30908:620;;;30964:2;30948:36;;;30985:12;:10;:12::i;:::-;30999:4;31005:7;31014:5;30948:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30944:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31207:1;31190:6;:13;:18;31186:272;;;31233:60;;;;;;;;;;:::i;:::-;;;;;;;;31186:272;31408:6;31402:13;31393:6;31389:2;31385:15;31378:38;30944:529;31081:41;;;31071:51;;;:6;:51;;;;31064:58;;;;;30908:620;31512:4;31505:11;;30736:799;;;;;;;:::o;77939:110::-;77999:13;78030;78023:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77939:110;:::o;21406:334::-;21479:13;21513:16;21521:7;21513;:16::i;:::-;21505:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;21594:21;21618:10;:8;:10::i;:::-;21594:34;;21670:1;21652:7;21646:21;:25;:86;;;;;;;;;;;;;;;;;21698:7;21707:18;:7;:16;:18::i;:::-;21681:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21646:86;21639:93;;;21406:334;;;:::o;49342:109::-;49398:7;49425:3;:11;;:18;;;;49418:25;;49342:109;;;:::o;49127:129::-;49200:4;49247:1;49224:3;:12;;:19;49237:5;49224:19;;;;;;;;;;;;:24;;49217:31;;49127:129;;;;:::o;58210:214::-;58295:4;58334:42;58319:57;;;:11;:57;;;;:97;;;;58380:36;58404:11;58380:23;:36::i;:::-;58319:97;58312:104;;58210:214;;;:::o;63997:589::-;64141:45;64168:4;64174:2;64178:7;64141:26;:45::i;:::-;64219:1;64203:18;;:4;:18;;;64199:187;;;64238:40;64270:7;64238:31;:40::i;:::-;64199:187;;;64308:2;64300:10;;:4;:10;;;64296:90;;64327:47;64360:4;64366:7;64327:32;:47::i;:::-;64296:90;64199:187;64414:1;64400:16;;:2;:16;;;64396:183;;;64433:45;64470:7;64433:36;:45::i;:::-;64396:183;;;64506:4;64500:10;;:2;:10;;;64496:83;;64527:40;64555:2;64559:7;64527:27;:40::i;:::-;64496:83;64396:183;63997:589;;;:::o;16863:451::-;16938:13;16964:19;17009:1;17000:6;16996:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;16986:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16964:47;;17022:15;:6;17029:1;17022:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;17048;:6;17055:1;17048:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;17079:9;17104:1;17095:6;17091:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;17079:26;;17074:135;17111:1;17107;:5;17074:135;;;17146:12;17167:3;17159:5;:11;17146:25;;;;;;;:::i;:::-;;;;;17134:6;17141:1;17134:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;17196:1;17186:11;;;;;17114:3;;;;:::i;:::-;;;17074:135;;;;17236:1;17227:5;:10;17219:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;17299:6;17285:21;;;16863:451;;;;:::o;7195:387::-;7255:4;7463:12;7530:7;7518:20;7510:28;;7573:1;7566:4;:8;7559:15;;;7195:387;;;:::o;15562:723::-;15618:13;15848:1;15839:5;:10;15835:53;;;15866:10;;;;;;;;;;;;;;;;;;;;;15835:53;15898:12;15913:5;15898:20;;15929:14;15954:78;15969:1;15961:4;:9;15954:78;;15987:8;;;;;:::i;:::-;;;;16018:2;16010:10;;;;;:::i;:::-;;;15954:78;;;16042:19;16074:6;16064:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16042:39;;16092:154;16108:1;16099:5;:10;16092:154;;16136:1;16126:11;;;;;:::i;:::-;;;16203:2;16195:5;:10;;;;:::i;:::-;16182:2;:24;;;;:::i;:::-;16169:39;;16152:6;16159;16152:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;16232:2;16223:11;;;;;:::i;:::-;;;16092:154;;;16270:6;16256:21;;;;;15562:723;;;;:::o;40448:204::-;40533:4;40572:32;40557:47;;;:11;:47;;;;:87;;;;40608:36;40632:11;40608:23;:36::i;:::-;40557:87;40550:94;;40448:204;;;:::o;32107:126::-;;;;:::o;65309:164::-;65413:10;:17;;;;65386:15;:24;65402:7;65386:24;;;;;;;;;;;:44;;;;65441:10;65457:7;65441:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65309:164;:::o;66100:988::-;66366:22;66416:1;66391:22;66408:4;66391:16;:22::i;:::-;:26;;;;:::i;:::-;66366:51;;66428:18;66449:17;:26;66467:7;66449:26;;;;;;;;;;;;66428:47;;66596:14;66582:10;:28;66578:328;;66627:19;66649:12;:18;66662:4;66649:18;;;;;;;;;;;;;;;:34;66668:14;66649:34;;;;;;;;;;;;66627:56;;66733:11;66700:12;:18;66713:4;66700:18;;;;;;;;;;;;;;;:30;66719:10;66700:30;;;;;;;;;;;:44;;;;66850:10;66817:17;:30;66835:11;66817:30;;;;;;;;;;;:43;;;;66612:294;66578:328;67002:17;:26;67020:7;67002:26;;;;;;;;;;;66995:33;;;67046:12;:18;67059:4;67046:18;;;;;;;;;;;;;;;:34;67065:14;67046:34;;;;;;;;;;;67039:41;;;66181:907;;66100:988;;:::o;67383:1079::-;67636:22;67681:1;67661:10;:17;;;;:21;;;;:::i;:::-;67636:46;;67693:18;67714:15;:24;67730:7;67714:24;;;;;;;;;;;;67693:45;;68065:19;68087:10;68098:14;68087:26;;;;;;;;:::i;:::-;;;;;;;;;;68065:48;;68151:11;68126:10;68137;68126:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;68262:10;68231:15;:28;68247:11;68231:28;;;;;;;;;;;:41;;;;68403:15;:24;68419:7;68403:24;;;;;;;;;;;68396:31;;;68438:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;67454:1008;;;67383:1079;:::o;64887:221::-;64972:14;64989:20;65006:2;64989:16;:20::i;:::-;64972:37;;65047:7;65020:12;:16;65033:2;65020:16;;;;;;;;;;;;;;;:24;65037:6;65020:24;;;;;;;;;;;:34;;;;65094:6;65065:17;:26;65083:7;65065:26;;;;;;;;;;;:35;;;;64961:147;64887:221;;:::o;18102:157::-;18187:4;18226:25;18211:40;;;:11;:40;;;;18204:47;;18102:157;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:139::-;1171:5;1209:6;1196:20;1187:29;;1225:33;1252:5;1225:33;:::i;:::-;1125:139;;;;:::o;1270:137::-;1315:5;1353:6;1340:20;1331:29;;1369:32;1395:5;1369:32;:::i;:::-;1270:137;;;;:::o;1413:141::-;1469:5;1500:6;1494:13;1485:22;;1516:32;1542:5;1516:32;:::i;:::-;1413:141;;;;:::o;1573:338::-;1628:5;1677:3;1670:4;1662:6;1658:17;1654:27;1644:122;;1685:79;;:::i;:::-;1644:122;1802:6;1789:20;1827:78;1901:3;1893:6;1886:4;1878:6;1874:17;1827:78;:::i;:::-;1818:87;;1634:277;1573:338;;;;:::o;1931:340::-;1987:5;2036:3;2029:4;2021:6;2017:17;2013:27;2003:122;;2044:79;;:::i;:::-;2003:122;2161:6;2148:20;2186:79;2261:3;2253:6;2246:4;2238:6;2234:17;2186:79;:::i;:::-;2177:88;;1993:278;1931:340;;;;:::o;2277:139::-;2323:5;2361:6;2348:20;2339:29;;2377:33;2404:5;2377:33;:::i;:::-;2277:139;;;;:::o;2422:329::-;2481:6;2530:2;2518:9;2509:7;2505:23;2501:32;2498:119;;;2536:79;;:::i;:::-;2498:119;2656:1;2681:53;2726:7;2717:6;2706:9;2702:22;2681:53;:::i;:::-;2671:63;;2627:117;2422:329;;;;:::o;2757:474::-;2825:6;2833;2882:2;2870:9;2861:7;2857:23;2853:32;2850:119;;;2888:79;;:::i;:::-;2850:119;3008:1;3033:53;3078:7;3069:6;3058:9;3054:22;3033:53;:::i;:::-;3023:63;;2979:117;3135:2;3161:53;3206:7;3197:6;3186:9;3182:22;3161:53;:::i;:::-;3151:63;;3106:118;2757:474;;;;;:::o;3237:619::-;3314:6;3322;3330;3379:2;3367:9;3358:7;3354:23;3350:32;3347:119;;;3385:79;;:::i;:::-;3347:119;3505:1;3530:53;3575:7;3566:6;3555:9;3551:22;3530:53;:::i;:::-;3520:63;;3476:117;3632:2;3658:53;3703:7;3694:6;3683:9;3679:22;3658:53;:::i;:::-;3648:63;;3603:118;3760:2;3786:53;3831:7;3822:6;3811:9;3807:22;3786:53;:::i;:::-;3776:63;;3731:118;3237:619;;;;;:::o;3862:943::-;3957:6;3965;3973;3981;4030:3;4018:9;4009:7;4005:23;4001:33;3998:120;;;4037:79;;:::i;:::-;3998:120;4157:1;4182:53;4227:7;4218:6;4207:9;4203:22;4182:53;:::i;:::-;4172:63;;4128:117;4284:2;4310:53;4355:7;4346:6;4335:9;4331:22;4310:53;:::i;:::-;4300:63;;4255:118;4412:2;4438:53;4483:7;4474:6;4463:9;4459:22;4438:53;:::i;:::-;4428:63;;4383:118;4568:2;4557:9;4553:18;4540:32;4599:18;4591:6;4588:30;4585:117;;;4621:79;;:::i;:::-;4585:117;4726:62;4780:7;4771:6;4760:9;4756:22;4726:62;:::i;:::-;4716:72;;4511:287;3862:943;;;;;;;:::o;4811:468::-;4876:6;4884;4933:2;4921:9;4912:7;4908:23;4904:32;4901:119;;;4939:79;;:::i;:::-;4901:119;5059:1;5084:53;5129:7;5120:6;5109:9;5105:22;5084:53;:::i;:::-;5074:63;;5030:117;5186:2;5212:50;5254:7;5245:6;5234:9;5230:22;5212:50;:::i;:::-;5202:60;;5157:115;4811:468;;;;;:::o;5285:474::-;5353:6;5361;5410:2;5398:9;5389:7;5385:23;5381:32;5378:119;;;5416:79;;:::i;:::-;5378:119;5536:1;5561:53;5606:7;5597:6;5586:9;5582:22;5561:53;:::i;:::-;5551:63;;5507:117;5663:2;5689:53;5734:7;5725:6;5714:9;5710:22;5689:53;:::i;:::-;5679:63;;5634:118;5285:474;;;;;:::o;5765:329::-;5824:6;5873:2;5861:9;5852:7;5848:23;5844:32;5841:119;;;5879:79;;:::i;:::-;5841:119;5999:1;6024:53;6069:7;6060:6;6049:9;6045:22;6024:53;:::i;:::-;6014:63;;5970:117;5765:329;;;;:::o;6100:474::-;6168:6;6176;6225:2;6213:9;6204:7;6200:23;6196:32;6193:119;;;6231:79;;:::i;:::-;6193:119;6351:1;6376:53;6421:7;6412:6;6401:9;6397:22;6376:53;:::i;:::-;6366:63;;6322:117;6478:2;6504:53;6549:7;6540:6;6529:9;6525:22;6504:53;:::i;:::-;6494:63;;6449:118;6100:474;;;;;:::o;6580:::-;6648:6;6656;6705:2;6693:9;6684:7;6680:23;6676:32;6673:119;;;6711:79;;:::i;:::-;6673:119;6831:1;6856:53;6901:7;6892:6;6881:9;6877:22;6856:53;:::i;:::-;6846:63;;6802:117;6958:2;6984:53;7029:7;7020:6;7009:9;7005:22;6984:53;:::i;:::-;6974:63;;6929:118;6580:474;;;;;:::o;7060:327::-;7118:6;7167:2;7155:9;7146:7;7142:23;7138:32;7135:119;;;7173:79;;:::i;:::-;7135:119;7293:1;7318:52;7362:7;7353:6;7342:9;7338:22;7318:52;:::i;:::-;7308:62;;7264:116;7060:327;;;;:::o;7393:349::-;7462:6;7511:2;7499:9;7490:7;7486:23;7482:32;7479:119;;;7517:79;;:::i;:::-;7479:119;7637:1;7662:63;7717:7;7708:6;7697:9;7693:22;7662:63;:::i;:::-;7652:73;;7608:127;7393:349;;;;:::o;7748:509::-;7817:6;7866:2;7854:9;7845:7;7841:23;7837:32;7834:119;;;7872:79;;:::i;:::-;7834:119;8020:1;8009:9;8005:17;7992:31;8050:18;8042:6;8039:30;8036:117;;;8072:79;;:::i;:::-;8036:117;8177:63;8232:7;8223:6;8212:9;8208:22;8177:63;:::i;:::-;8167:73;;7963:287;7748:509;;;;:::o;8263:329::-;8322:6;8371:2;8359:9;8350:7;8346:23;8342:32;8339:119;;;8377:79;;:::i;:::-;8339:119;8497:1;8522:53;8567:7;8558:6;8547:9;8543:22;8522:53;:::i;:::-;8512:63;;8468:117;8263:329;;;;:::o;8598:654::-;8676:6;8684;8733:2;8721:9;8712:7;8708:23;8704:32;8701:119;;;8739:79;;:::i;:::-;8701:119;8859:1;8884:53;8929:7;8920:6;8909:9;8905:22;8884:53;:::i;:::-;8874:63;;8830:117;9014:2;9003:9;8999:18;8986:32;9045:18;9037:6;9034:30;9031:117;;;9067:79;;:::i;:::-;9031:117;9172:63;9227:7;9218:6;9207:9;9203:22;9172:63;:::i;:::-;9162:73;;8957:288;8598:654;;;;;:::o;9258:179::-;9327:10;9348:46;9390:3;9382:6;9348:46;:::i;:::-;9426:4;9421:3;9417:14;9403:28;;9258:179;;;;:::o;9443:118::-;9530:24;9548:5;9530:24;:::i;:::-;9525:3;9518:37;9443:118;;:::o;9597:732::-;9716:3;9745:54;9793:5;9745:54;:::i;:::-;9815:86;9894:6;9889:3;9815:86;:::i;:::-;9808:93;;9925:56;9975:5;9925:56;:::i;:::-;10004:7;10035:1;10020:284;10045:6;10042:1;10039:13;10020:284;;;10121:6;10115:13;10148:63;10207:3;10192:13;10148:63;:::i;:::-;10141:70;;10234:60;10287:6;10234:60;:::i;:::-;10224:70;;10080:224;10067:1;10064;10060:9;10055:14;;10020:284;;;10024:14;10320:3;10313:10;;9721:608;;;9597:732;;;;:::o;10335:109::-;10416:21;10431:5;10416:21;:::i;:::-;10411:3;10404:34;10335:109;;:::o;10450:118::-;10537:24;10555:5;10537:24;:::i;:::-;10532:3;10525:37;10450:118;;:::o;10574:360::-;10660:3;10688:38;10720:5;10688:38;:::i;:::-;10742:70;10805:6;10800:3;10742:70;:::i;:::-;10735:77;;10821:52;10866:6;10861:3;10854:4;10847:5;10843:16;10821:52;:::i;:::-;10898:29;10920:6;10898:29;:::i;:::-;10893:3;10889:39;10882:46;;10664:270;10574:360;;;;:::o;10940:149::-;11036:46;11076:5;11036:46;:::i;:::-;11031:3;11024:59;10940:149;;:::o;11095:147::-;11190:45;11229:5;11190:45;:::i;:::-;11185:3;11178:58;11095:147;;:::o;11248:149::-;11344:46;11384:5;11344:46;:::i;:::-;11339:3;11332:59;11248:149;;:::o;11403:364::-;11491:3;11519:39;11552:5;11519:39;:::i;:::-;11574:71;11638:6;11633:3;11574:71;:::i;:::-;11567:78;;11654:52;11699:6;11694:3;11687:4;11680:5;11676:16;11654:52;:::i;:::-;11731:29;11753:6;11731:29;:::i;:::-;11726:3;11722:39;11715:46;;11495:272;11403:364;;;;:::o;11773:377::-;11879:3;11907:39;11940:5;11907:39;:::i;:::-;11962:89;12044:6;12039:3;11962:89;:::i;:::-;11955:96;;12060:52;12105:6;12100:3;12093:4;12086:5;12082:16;12060:52;:::i;:::-;12137:6;12132:3;12128:16;12121:23;;11883:267;11773:377;;;;:::o;12180:845::-;12283:3;12320:5;12314:12;12349:36;12375:9;12349:36;:::i;:::-;12401:89;12483:6;12478:3;12401:89;:::i;:::-;12394:96;;12521:1;12510:9;12506:17;12537:1;12532:137;;;;12683:1;12678:341;;;;12499:520;;12532:137;12616:4;12612:9;12601;12597:25;12592:3;12585:38;12652:6;12647:3;12643:16;12636:23;;12532:137;;12678:341;12745:38;12777:5;12745:38;:::i;:::-;12805:1;12819:154;12833:6;12830:1;12827:13;12819:154;;;12907:7;12901:14;12897:1;12892:3;12888:11;12881:35;12957:1;12948:7;12944:15;12933:26;;12855:4;12852:1;12848:12;12843:17;;12819:154;;;13002:6;12997:3;12993:16;12986:23;;12685:334;;12499:520;;12287:738;;12180:845;;;;:::o;13031:366::-;13173:3;13194:67;13258:2;13253:3;13194:67;:::i;:::-;13187:74;;13270:93;13359:3;13270:93;:::i;:::-;13388:2;13383:3;13379:12;13372:19;;13031:366;;;:::o;13403:::-;13545:3;13566:67;13630:2;13625:3;13566:67;:::i;:::-;13559:74;;13642:93;13731:3;13642:93;:::i;:::-;13760:2;13755:3;13751:12;13744:19;;13403:366;;;:::o;13775:::-;13917:3;13938:67;14002:2;13997:3;13938:67;:::i;:::-;13931:74;;14014:93;14103:3;14014:93;:::i;:::-;14132:2;14127:3;14123:12;14116:19;;13775:366;;;:::o;14147:::-;14289:3;14310:67;14374:2;14369:3;14310:67;:::i;:::-;14303:74;;14386:93;14475:3;14386:93;:::i;:::-;14504:2;14499:3;14495:12;14488:19;;14147:366;;;:::o;14519:::-;14661:3;14682:67;14746:2;14741:3;14682:67;:::i;:::-;14675:74;;14758:93;14847:3;14758:93;:::i;:::-;14876:2;14871:3;14867:12;14860:19;;14519:366;;;:::o;14891:::-;15033:3;15054:67;15118:2;15113:3;15054:67;:::i;:::-;15047:74;;15130:93;15219:3;15130:93;:::i;:::-;15248:2;15243:3;15239:12;15232:19;;14891:366;;;:::o;15263:::-;15405:3;15426:67;15490:2;15485:3;15426:67;:::i;:::-;15419:74;;15502:93;15591:3;15502:93;:::i;:::-;15620:2;15615:3;15611:12;15604:19;;15263:366;;;:::o;15635:::-;15777:3;15798:67;15862:2;15857:3;15798:67;:::i;:::-;15791:74;;15874:93;15963:3;15874:93;:::i;:::-;15992:2;15987:3;15983:12;15976:19;;15635:366;;;:::o;16007:::-;16149:3;16170:67;16234:2;16229:3;16170:67;:::i;:::-;16163:74;;16246:93;16335:3;16246:93;:::i;:::-;16364:2;16359:3;16355:12;16348:19;;16007:366;;;:::o;16379:::-;16521:3;16542:67;16606:2;16601:3;16542:67;:::i;:::-;16535:74;;16618:93;16707:3;16618:93;:::i;:::-;16736:2;16731:3;16727:12;16720:19;;16379:366;;;:::o;16751:::-;16893:3;16914:67;16978:2;16973:3;16914:67;:::i;:::-;16907:74;;16990:93;17079:3;16990:93;:::i;:::-;17108:2;17103:3;17099:12;17092:19;;16751:366;;;:::o;17123:::-;17265:3;17286:67;17350:2;17345:3;17286:67;:::i;:::-;17279:74;;17362:93;17451:3;17362:93;:::i;:::-;17480:2;17475:3;17471:12;17464:19;;17123:366;;;:::o;17495:::-;17637:3;17658:67;17722:2;17717:3;17658:67;:::i;:::-;17651:74;;17734:93;17823:3;17734:93;:::i;:::-;17852:2;17847:3;17843:12;17836:19;;17495:366;;;:::o;17867:::-;18009:3;18030:67;18094:2;18089:3;18030:67;:::i;:::-;18023:74;;18106:93;18195:3;18106:93;:::i;:::-;18224:2;18219:3;18215:12;18208:19;;17867:366;;;:::o;18239:::-;18381:3;18402:67;18466:2;18461:3;18402:67;:::i;:::-;18395:74;;18478:93;18567:3;18478:93;:::i;:::-;18596:2;18591:3;18587:12;18580:19;;18239:366;;;:::o;18611:::-;18753:3;18774:67;18838:2;18833:3;18774:67;:::i;:::-;18767:74;;18850:93;18939:3;18850:93;:::i;:::-;18968:2;18963:3;18959:12;18952:19;;18611:366;;;:::o;18983:::-;19125:3;19146:67;19210:2;19205:3;19146:67;:::i;:::-;19139:74;;19222:93;19311:3;19222:93;:::i;:::-;19340:2;19335:3;19331:12;19324:19;;18983:366;;;:::o;19355:::-;19497:3;19518:67;19582:2;19577:3;19518:67;:::i;:::-;19511:74;;19594:93;19683:3;19594:93;:::i;:::-;19712:2;19707:3;19703:12;19696:19;;19355:366;;;:::o;19727:::-;19869:3;19890:67;19954:2;19949:3;19890:67;:::i;:::-;19883:74;;19966:93;20055:3;19966:93;:::i;:::-;20084:2;20079:3;20075:12;20068:19;;19727:366;;;:::o;20099:::-;20241:3;20262:67;20326:2;20321:3;20262:67;:::i;:::-;20255:74;;20338:93;20427:3;20338:93;:::i;:::-;20456:2;20451:3;20447:12;20440:19;;20099:366;;;:::o;20471:::-;20613:3;20634:67;20698:2;20693:3;20634:67;:::i;:::-;20627:74;;20710:93;20799:3;20710:93;:::i;:::-;20828:2;20823:3;20819:12;20812:19;;20471:366;;;:::o;20843:::-;20985:3;21006:67;21070:2;21065:3;21006:67;:::i;:::-;20999:74;;21082:93;21171:3;21082:93;:::i;:::-;21200:2;21195:3;21191:12;21184:19;;20843:366;;;:::o;21215:::-;21357:3;21378:67;21442:2;21437:3;21378:67;:::i;:::-;21371:74;;21454:93;21543:3;21454:93;:::i;:::-;21572:2;21567:3;21563:12;21556:19;;21215:366;;;:::o;21587:::-;21729:3;21750:67;21814:2;21809:3;21750:67;:::i;:::-;21743:74;;21826:93;21915:3;21826:93;:::i;:::-;21944:2;21939:3;21935:12;21928:19;;21587:366;;;:::o;21959:::-;22101:3;22122:67;22186:2;22181:3;22122:67;:::i;:::-;22115:74;;22198:93;22287:3;22198:93;:::i;:::-;22316:2;22311:3;22307:12;22300:19;;21959:366;;;:::o;22331:::-;22473:3;22494:67;22558:2;22553:3;22494:67;:::i;:::-;22487:74;;22570:93;22659:3;22570:93;:::i;:::-;22688:2;22683:3;22679:12;22672:19;;22331:366;;;:::o;22703:::-;22845:3;22866:67;22930:2;22925:3;22866:67;:::i;:::-;22859:74;;22942:93;23031:3;22942:93;:::i;:::-;23060:2;23055:3;23051:12;23044:19;;22703:366;;;:::o;23075:::-;23217:3;23238:67;23302:2;23297:3;23238:67;:::i;:::-;23231:74;;23314:93;23403:3;23314:93;:::i;:::-;23432:2;23427:3;23423:12;23416:19;;23075:366;;;:::o;23447:402::-;23607:3;23628:85;23710:2;23705:3;23628:85;:::i;:::-;23621:92;;23722:93;23811:3;23722:93;:::i;:::-;23840:2;23835:3;23831:12;23824:19;;23447:402;;;:::o;23855:366::-;23997:3;24018:67;24082:2;24077:3;24018:67;:::i;:::-;24011:74;;24094:93;24183:3;24094:93;:::i;:::-;24212:2;24207:3;24203:12;24196:19;;23855:366;;;:::o;24227:402::-;24387:3;24408:85;24490:2;24485:3;24408:85;:::i;:::-;24401:92;;24502:93;24591:3;24502:93;:::i;:::-;24620:2;24615:3;24611:12;24604:19;;24227:402;;;:::o;24635:366::-;24777:3;24798:67;24862:2;24857:3;24798:67;:::i;:::-;24791:74;;24874:93;24963:3;24874:93;:::i;:::-;24992:2;24987:3;24983:12;24976:19;;24635:366;;;:::o;25007:108::-;25084:24;25102:5;25084:24;:::i;:::-;25079:3;25072:37;25007:108;;:::o;25121:118::-;25208:24;25226:5;25208:24;:::i;:::-;25203:3;25196:37;25121:118;;:::o;25245:435::-;25425:3;25447:95;25538:3;25529:6;25447:95;:::i;:::-;25440:102;;25559:95;25650:3;25641:6;25559:95;:::i;:::-;25552:102;;25671:3;25664:10;;25245:435;;;;;:::o;25686:269::-;25815:3;25837:92;25925:3;25916:6;25837:92;:::i;:::-;25830:99;;25946:3;25939:10;;25686:269;;;;:::o;25961:967::-;26343:3;26365:148;26509:3;26365:148;:::i;:::-;26358:155;;26530:95;26621:3;26612:6;26530:95;:::i;:::-;26523:102;;26642:148;26786:3;26642:148;:::i;:::-;26635:155;;26807:95;26898:3;26889:6;26807:95;:::i;:::-;26800:102;;26919:3;26912:10;;25961:967;;;;;:::o;26934:222::-;27027:4;27065:2;27054:9;27050:18;27042:26;;27078:71;27146:1;27135:9;27131:17;27122:6;27078:71;:::i;:::-;26934:222;;;;:::o;27162:640::-;27357:4;27395:3;27384:9;27380:19;27372:27;;27409:71;27477:1;27466:9;27462:17;27453:6;27409:71;:::i;:::-;27490:72;27558:2;27547:9;27543:18;27534:6;27490:72;:::i;:::-;27572;27640:2;27629:9;27625:18;27616:6;27572:72;:::i;:::-;27691:9;27685:4;27681:20;27676:2;27665:9;27661:18;27654:48;27719:76;27790:4;27781:6;27719:76;:::i;:::-;27711:84;;27162:640;;;;;;;:::o;27808:373::-;27951:4;27989:2;27978:9;27974:18;27966:26;;28038:9;28032:4;28028:20;28024:1;28013:9;28009:17;28002:47;28066:108;28169:4;28160:6;28066:108;:::i;:::-;28058:116;;27808:373;;;;:::o;28187:210::-;28274:4;28312:2;28301:9;28297:18;28289:26;;28325:65;28387:1;28376:9;28372:17;28363:6;28325:65;:::i;:::-;28187:210;;;;:::o;28403:222::-;28496:4;28534:2;28523:9;28519:18;28511:26;;28547:71;28615:1;28604:9;28600:17;28591:6;28547:71;:::i;:::-;28403:222;;;;:::o;28631:313::-;28744:4;28782:2;28771:9;28767:18;28759:26;;28831:9;28825:4;28821:20;28817:1;28806:9;28802:17;28795:47;28859:78;28932:4;28923:6;28859:78;:::i;:::-;28851:86;;28631:313;;;;:::o;28950:419::-;29116:4;29154:2;29143:9;29139:18;29131:26;;29203:9;29197:4;29193:20;29189:1;29178:9;29174:17;29167:47;29231:131;29357:4;29231:131;:::i;:::-;29223:139;;28950:419;;;:::o;29375:::-;29541:4;29579:2;29568:9;29564:18;29556:26;;29628:9;29622:4;29618:20;29614:1;29603:9;29599:17;29592:47;29656:131;29782:4;29656:131;:::i;:::-;29648:139;;29375:419;;;:::o;29800:::-;29966:4;30004:2;29993:9;29989:18;29981:26;;30053:9;30047:4;30043:20;30039:1;30028:9;30024:17;30017:47;30081:131;30207:4;30081:131;:::i;:::-;30073:139;;29800:419;;;:::o;30225:::-;30391:4;30429:2;30418:9;30414:18;30406:26;;30478:9;30472:4;30468:20;30464:1;30453:9;30449:17;30442:47;30506:131;30632:4;30506:131;:::i;:::-;30498:139;;30225:419;;;:::o;30650:::-;30816:4;30854:2;30843:9;30839:18;30831:26;;30903:9;30897:4;30893:20;30889:1;30878:9;30874:17;30867:47;30931:131;31057:4;30931:131;:::i;:::-;30923:139;;30650:419;;;:::o;31075:::-;31241:4;31279:2;31268:9;31264:18;31256:26;;31328:9;31322:4;31318:20;31314:1;31303:9;31299:17;31292:47;31356:131;31482:4;31356:131;:::i;:::-;31348:139;;31075:419;;;:::o;31500:::-;31666:4;31704:2;31693:9;31689:18;31681:26;;31753:9;31747:4;31743:20;31739:1;31728:9;31724:17;31717:47;31781:131;31907:4;31781:131;:::i;:::-;31773:139;;31500:419;;;:::o;31925:::-;32091:4;32129:2;32118:9;32114:18;32106:26;;32178:9;32172:4;32168:20;32164:1;32153:9;32149:17;32142:47;32206:131;32332:4;32206:131;:::i;:::-;32198:139;;31925:419;;;:::o;32350:::-;32516:4;32554:2;32543:9;32539:18;32531:26;;32603:9;32597:4;32593:20;32589:1;32578:9;32574:17;32567:47;32631:131;32757:4;32631:131;:::i;:::-;32623:139;;32350:419;;;:::o;32775:::-;32941:4;32979:2;32968:9;32964:18;32956:26;;33028:9;33022:4;33018:20;33014:1;33003:9;32999:17;32992:47;33056:131;33182:4;33056:131;:::i;:::-;33048:139;;32775:419;;;:::o;33200:::-;33366:4;33404:2;33393:9;33389:18;33381:26;;33453:9;33447:4;33443:20;33439:1;33428:9;33424:17;33417:47;33481:131;33607:4;33481:131;:::i;:::-;33473:139;;33200:419;;;:::o;33625:::-;33791:4;33829:2;33818:9;33814:18;33806:26;;33878:9;33872:4;33868:20;33864:1;33853:9;33849:17;33842:47;33906:131;34032:4;33906:131;:::i;:::-;33898:139;;33625:419;;;:::o;34050:::-;34216:4;34254:2;34243:9;34239:18;34231:26;;34303:9;34297:4;34293:20;34289:1;34278:9;34274:17;34267:47;34331:131;34457:4;34331:131;:::i;:::-;34323:139;;34050:419;;;:::o;34475:::-;34641:4;34679:2;34668:9;34664:18;34656:26;;34728:9;34722:4;34718:20;34714:1;34703:9;34699:17;34692:47;34756:131;34882:4;34756:131;:::i;:::-;34748:139;;34475:419;;;:::o;34900:::-;35066:4;35104:2;35093:9;35089:18;35081:26;;35153:9;35147:4;35143:20;35139:1;35128:9;35124:17;35117:47;35181:131;35307:4;35181:131;:::i;:::-;35173:139;;34900:419;;;:::o;35325:::-;35491:4;35529:2;35518:9;35514:18;35506:26;;35578:9;35572:4;35568:20;35564:1;35553:9;35549:17;35542:47;35606:131;35732:4;35606:131;:::i;:::-;35598:139;;35325:419;;;:::o;35750:::-;35916:4;35954:2;35943:9;35939:18;35931:26;;36003:9;35997:4;35993:20;35989:1;35978:9;35974:17;35967:47;36031:131;36157:4;36031:131;:::i;:::-;36023:139;;35750:419;;;:::o;36175:::-;36341:4;36379:2;36368:9;36364:18;36356:26;;36428:9;36422:4;36418:20;36414:1;36403:9;36399:17;36392:47;36456:131;36582:4;36456:131;:::i;:::-;36448:139;;36175:419;;;:::o;36600:::-;36766:4;36804:2;36793:9;36789:18;36781:26;;36853:9;36847:4;36843:20;36839:1;36828:9;36824:17;36817:47;36881:131;37007:4;36881:131;:::i;:::-;36873:139;;36600:419;;;:::o;37025:::-;37191:4;37229:2;37218:9;37214:18;37206:26;;37278:9;37272:4;37268:20;37264:1;37253:9;37249:17;37242:47;37306:131;37432:4;37306:131;:::i;:::-;37298:139;;37025:419;;;:::o;37450:::-;37616:4;37654:2;37643:9;37639:18;37631:26;;37703:9;37697:4;37693:20;37689:1;37678:9;37674:17;37667:47;37731:131;37857:4;37731:131;:::i;:::-;37723:139;;37450:419;;;:::o;37875:::-;38041:4;38079:2;38068:9;38064:18;38056:26;;38128:9;38122:4;38118:20;38114:1;38103:9;38099:17;38092:47;38156:131;38282:4;38156:131;:::i;:::-;38148:139;;37875:419;;;:::o;38300:::-;38466:4;38504:2;38493:9;38489:18;38481:26;;38553:9;38547:4;38543:20;38539:1;38528:9;38524:17;38517:47;38581:131;38707:4;38581:131;:::i;:::-;38573:139;;38300:419;;;:::o;38725:::-;38891:4;38929:2;38918:9;38914:18;38906:26;;38978:9;38972:4;38968:20;38964:1;38953:9;38949:17;38942:47;39006:131;39132:4;39006:131;:::i;:::-;38998:139;;38725:419;;;:::o;39150:::-;39316:4;39354:2;39343:9;39339:18;39331:26;;39403:9;39397:4;39393:20;39389:1;39378:9;39374:17;39367:47;39431:131;39557:4;39431:131;:::i;:::-;39423:139;;39150:419;;;:::o;39575:::-;39741:4;39779:2;39768:9;39764:18;39756:26;;39828:9;39822:4;39818:20;39814:1;39803:9;39799:17;39792:47;39856:131;39982:4;39856:131;:::i;:::-;39848:139;;39575:419;;;:::o;40000:::-;40166:4;40204:2;40193:9;40189:18;40181:26;;40253:9;40247:4;40243:20;40239:1;40228:9;40224:17;40217:47;40281:131;40407:4;40281:131;:::i;:::-;40273:139;;40000:419;;;:::o;40425:::-;40591:4;40629:2;40618:9;40614:18;40606:26;;40678:9;40672:4;40668:20;40664:1;40653:9;40649:17;40642:47;40706:131;40832:4;40706:131;:::i;:::-;40698:139;;40425:419;;;:::o;40850:::-;41016:4;41054:2;41043:9;41039:18;41031:26;;41103:9;41097:4;41093:20;41089:1;41078:9;41074:17;41067:47;41131:131;41257:4;41131:131;:::i;:::-;41123:139;;40850:419;;;:::o;41275:::-;41441:4;41479:2;41468:9;41464:18;41456:26;;41528:9;41522:4;41518:20;41514:1;41503:9;41499:17;41492:47;41556:131;41682:4;41556:131;:::i;:::-;41548:139;;41275:419;;;:::o;41700:222::-;41793:4;41831:2;41820:9;41816:18;41808:26;;41844:71;41912:1;41901:9;41897:17;41888:6;41844:71;:::i;:::-;41700:222;;;;:::o;41928:460::-;42086:4;42124:2;42113:9;42109:18;42101:26;;42137:71;42205:1;42194:9;42190:17;42181:6;42137:71;:::i;:::-;42218:72;42286:2;42275:9;42271:18;42262:6;42218:72;:::i;:::-;42300:81;42377:2;42366:9;42362:18;42353:6;42300:81;:::i;:::-;41928:460;;;;;;:::o;42394:458::-;42551:4;42589:2;42578:9;42574:18;42566:26;;42602:71;42670:1;42659:9;42655:17;42646:6;42602:71;:::i;:::-;42683:72;42751:2;42740:9;42736:18;42727:6;42683:72;:::i;:::-;42765:80;42841:2;42830:9;42826:18;42817:6;42765:80;:::i;:::-;42394:458;;;;;;:::o;42858:460::-;43016:4;43054:2;43043:9;43039:18;43031:26;;43067:71;43135:1;43124:9;43120:17;43111:6;43067:71;:::i;:::-;43148:72;43216:2;43205:9;43201:18;43192:6;43148:72;:::i;:::-;43230:81;43307:2;43296:9;43292:18;43283:6;43230:81;:::i;:::-;42858:460;;;;;;:::o;43324:129::-;43358:6;43385:20;;:::i;:::-;43375:30;;43414:33;43442:4;43434:6;43414:33;:::i;:::-;43324:129;;;:::o;43459:75::-;43492:6;43525:2;43519:9;43509:19;;43459:75;:::o;43540:307::-;43601:4;43691:18;43683:6;43680:30;43677:56;;;43713:18;;:::i;:::-;43677:56;43751:29;43773:6;43751:29;:::i;:::-;43743:37;;43835:4;43829;43825:15;43817:23;;43540:307;;;:::o;43853:308::-;43915:4;44005:18;43997:6;43994:30;43991:56;;;44027:18;;:::i;:::-;43991:56;44065:29;44087:6;44065:29;:::i;:::-;44057:37;;44149:4;44143;44139:15;44131:23;;43853:308;;;:::o;44167:132::-;44234:4;44257:3;44249:11;;44287:4;44282:3;44278:14;44270:22;;44167:132;;;:::o;44305:141::-;44354:4;44377:3;44369:11;;44400:3;44397:1;44390:14;44434:4;44431:1;44421:18;44413:26;;44305:141;;;:::o;44452:114::-;44519:6;44553:5;44547:12;44537:22;;44452:114;;;:::o;44572:98::-;44623:6;44657:5;44651:12;44641:22;;44572:98;;;:::o;44676:99::-;44728:6;44762:5;44756:12;44746:22;;44676:99;;;:::o;44781:113::-;44851:4;44883;44878:3;44874:14;44866:22;;44781:113;;;:::o;44900:184::-;44999:11;45033:6;45028:3;45021:19;45073:4;45068:3;45064:14;45049:29;;44900:184;;;;:::o;45090:168::-;45173:11;45207:6;45202:3;45195:19;45247:4;45242:3;45238:14;45223:29;;45090:168;;;;:::o;45264:169::-;45348:11;45382:6;45377:3;45370:19;45422:4;45417:3;45413:14;45398:29;;45264:169;;;;:::o;45439:148::-;45541:11;45578:3;45563:18;;45439:148;;;;:::o;45593:305::-;45633:3;45652:20;45670:1;45652:20;:::i;:::-;45647:25;;45686:20;45704:1;45686:20;:::i;:::-;45681:25;;45840:1;45772:66;45768:74;45765:1;45762:81;45759:107;;;45846:18;;:::i;:::-;45759:107;45890:1;45887;45883:9;45876:16;;45593:305;;;;:::o;45904:185::-;45944:1;45961:20;45979:1;45961:20;:::i;:::-;45956:25;;45995:20;46013:1;45995:20;:::i;:::-;45990:25;;46034:1;46024:35;;46039:18;;:::i;:::-;46024:35;46081:1;46078;46074:9;46069:14;;45904:185;;;;:::o;46095:348::-;46135:7;46158:20;46176:1;46158:20;:::i;:::-;46153:25;;46192:20;46210:1;46192:20;:::i;:::-;46187:25;;46380:1;46312:66;46308:74;46305:1;46302:81;46297:1;46290:9;46283:17;46279:105;46276:131;;;46387:18;;:::i;:::-;46276:131;46435:1;46432;46428:9;46417:20;;46095:348;;;;:::o;46449:191::-;46489:4;46509:20;46527:1;46509:20;:::i;:::-;46504:25;;46543:20;46561:1;46543:20;:::i;:::-;46538:25;;46582:1;46579;46576:8;46573:34;;;46587:18;;:::i;:::-;46573:34;46632:1;46629;46625:9;46617:17;;46449:191;;;;:::o;46646:96::-;46683:7;46712:24;46730:5;46712:24;:::i;:::-;46701:35;;46646:96;;;:::o;46748:90::-;46782:7;46825:5;46818:13;46811:21;46800:32;;46748:90;;;:::o;46844:77::-;46881:7;46910:5;46899:16;;46844:77;;;:::o;46927:149::-;46963:7;47003:66;46996:5;46992:78;46981:89;;46927:149;;;:::o;47082:126::-;47119:7;47159:42;47152:5;47148:54;47137:65;;47082:126;;;:::o;47214:77::-;47251:7;47280:5;47269:16;;47214:77;;;:::o;47297:122::-;47356:9;47389:24;47407:5;47389:24;:::i;:::-;47376:37;;47297:122;;;:::o;47425:121::-;47483:9;47516:24;47534:5;47516:24;:::i;:::-;47503:37;;47425:121;;;:::o;47552:122::-;47611:9;47644:24;47662:5;47644:24;:::i;:::-;47631:37;;47552:122;;;:::o;47680:154::-;47764:6;47759:3;47754;47741:30;47826:1;47817:6;47812:3;47808:16;47801:27;47680:154;;;:::o;47840:307::-;47908:1;47918:113;47932:6;47929:1;47926:13;47918:113;;;48017:1;48012:3;48008:11;48002:18;47998:1;47993:3;47989:11;47982:39;47954:2;47951:1;47947:10;47942:15;;47918:113;;;48049:6;48046:1;48043:13;48040:101;;;48129:1;48120:6;48115:3;48111:16;48104:27;48040:101;47889:258;47840:307;;;:::o;48153:171::-;48192:3;48215:24;48233:5;48215:24;:::i;:::-;48206:33;;48261:4;48254:5;48251:15;48248:41;;;48269:18;;:::i;:::-;48248:41;48316:1;48309:5;48305:13;48298:20;;48153:171;;;:::o;48330:320::-;48374:6;48411:1;48405:4;48401:12;48391:22;;48458:1;48452:4;48448:12;48479:18;48469:81;;48535:4;48527:6;48523:17;48513:27;;48469:81;48597:2;48589:6;48586:14;48566:18;48563:38;48560:84;;;48616:18;;:::i;:::-;48560:84;48381:269;48330:320;;;:::o;48656:281::-;48739:27;48761:4;48739:27;:::i;:::-;48731:6;48727:40;48869:6;48857:10;48854:22;48833:18;48821:10;48818:34;48815:62;48812:88;;;48880:18;;:::i;:::-;48812:88;48920:10;48916:2;48909:22;48699:238;48656:281;;:::o;48943:233::-;48982:3;49005:24;49023:5;49005:24;:::i;:::-;48996:33;;49051:66;49044:5;49041:77;49038:103;;;49121:18;;:::i;:::-;49038:103;49168:1;49161:5;49157:13;49150:20;;48943:233;;;:::o;49182:176::-;49214:1;49231:20;49249:1;49231:20;:::i;:::-;49226:25;;49265:20;49283:1;49265:20;:::i;:::-;49260:25;;49304:1;49294:35;;49309:18;;:::i;:::-;49294:35;49350:1;49347;49343:9;49338:14;;49182:176;;;;:::o;49364:180::-;49412:77;49409:1;49402:88;49509:4;49506:1;49499:15;49533:4;49530:1;49523:15;49550:180;49598:77;49595:1;49588:88;49695:4;49692:1;49685:15;49719:4;49716:1;49709:15;49736:180;49784:77;49781:1;49774:88;49881:4;49878:1;49871:15;49905:4;49902:1;49895:15;49922:180;49970:77;49967:1;49960:88;50067:4;50064:1;50057:15;50091:4;50088:1;50081:15;50108:180;50156:77;50153:1;50146:88;50253:4;50250:1;50243:15;50277:4;50274:1;50267:15;50294:180;50342:77;50339:1;50332:88;50439:4;50436:1;50429:15;50463:4;50460:1;50453:15;50480:117;50589:1;50586;50579:12;50603:117;50712:1;50709;50702:12;50726:117;50835:1;50832;50825:12;50849:117;50958:1;50955;50948:12;50972:102;51013:6;51064:2;51060:7;51055:2;51048:5;51044:14;51040:28;51030:38;;50972:102;;;:::o;51080:182::-;51220:34;51216:1;51208:6;51204:14;51197:58;51080:182;:::o;51268:234::-;51408:34;51404:1;51396:6;51392:14;51385:58;51477:17;51472:2;51464:6;51460:15;51453:42;51268:234;:::o;51508:230::-;51648:34;51644:1;51636:6;51632:14;51625:58;51717:13;51712:2;51704:6;51700:15;51693:38;51508:230;:::o;51744:237::-;51884:34;51880:1;51872:6;51868:14;51861:58;51953:20;51948:2;51940:6;51936:15;51929:45;51744:237;:::o;51987:247::-;52127:34;52123:1;52115:6;52111:14;52104:58;52196:30;52191:2;52183:6;52179:15;52172:55;51987:247;:::o;52240:178::-;52380:30;52376:1;52368:6;52364:14;52357:54;52240:178;:::o;52424:240::-;52564:34;52560:1;52552:6;52548:14;52541:58;52633:23;52628:2;52620:6;52616:15;52609:48;52424:240;:::o;52670:235::-;52810:34;52806:1;52798:6;52794:14;52787:58;52879:18;52874:2;52866:6;52862:15;52855:43;52670:235;:::o;52911:223::-;53051:34;53047:1;53039:6;53035:14;53028:58;53120:6;53115:2;53107:6;53103:15;53096:31;52911:223;:::o;53140:175::-;53280:27;53276:1;53268:6;53264:14;53257:51;53140:175;:::o;53321:231::-;53461:34;53457:1;53449:6;53445:14;53438:58;53530:14;53525:2;53517:6;53513:15;53506:39;53321:231;:::o;53558:237::-;53698:34;53694:1;53686:6;53682:14;53675:58;53767:20;53762:2;53754:6;53750:15;53743:45;53558:237;:::o;53801:241::-;53941:34;53937:1;53929:6;53925:14;53918:58;54010:24;54005:2;53997:6;53993:15;53986:49;53801:241;:::o;54048:::-;54188:34;54184:1;54176:6;54172:14;54165:58;54257:24;54252:2;54244:6;54240:15;54233:49;54048:241;:::o;54295:243::-;54435:34;54431:1;54423:6;54419:14;54412:58;54504:26;54499:2;54491:6;54487:15;54480:51;54295:243;:::o;54544:229::-;54684:34;54680:1;54672:6;54668:14;54661:58;54753:12;54748:2;54740:6;54736:15;54729:37;54544:229;:::o;54779:228::-;54919:34;54915:1;54907:6;54903:14;54896:58;54988:11;54983:2;54975:6;54971:15;54964:36;54779:228;:::o;55013:233::-;55153:34;55149:1;55141:6;55137:14;55130:58;55222:16;55217:2;55209:6;55205:15;55198:41;55013:233;:::o;55252:224::-;55392:34;55388:1;55380:6;55376:14;55369:58;55461:7;55456:2;55448:6;55444:15;55437:32;55252:224;:::o;55482:182::-;55622:34;55618:1;55610:6;55606:14;55599:58;55482:182;:::o;55670:236::-;55810:34;55806:1;55798:6;55794:14;55787:58;55879:19;55874:2;55866:6;55862:15;55855:44;55670:236;:::o;55912:231::-;56052:34;56048:1;56040:6;56036:14;56029:58;56121:14;56116:2;56108:6;56104:15;56097:39;55912:231;:::o;56149:228::-;56289:34;56285:1;56277:6;56273:14;56266:58;56358:11;56353:2;56345:6;56341:15;56334:36;56149:228;:::o;56383:234::-;56523:34;56519:1;56511:6;56507:14;56500:58;56592:17;56587:2;56579:6;56575:15;56568:42;56383:234;:::o;56623:220::-;56763:34;56759:1;56751:6;56747:14;56740:58;56832:3;56827:2;56819:6;56815:15;56808:28;56623:220;:::o;56849:227::-;56989:34;56985:1;56977:6;56973:14;56966:58;57058:10;57053:2;57045:6;57041:15;57034:35;56849:227;:::o;57082:236::-;57222:34;57218:1;57210:6;57206:14;57199:58;57291:19;57286:2;57278:6;57274:15;57267:44;57082:236;:::o;57324:231::-;57464:34;57460:1;57452:6;57448:14;57441:58;57533:14;57528:2;57520:6;57516:15;57509:39;57324:231;:::o;57561:173::-;57701:25;57697:1;57689:6;57685:14;57678:49;57561:173;:::o;57740:227::-;57880:34;57876:1;57868:6;57864:14;57857:58;57949:10;57944:2;57936:6;57932:15;57925:35;57740:227;:::o;57973:167::-;58113:19;58109:1;58101:6;58097:14;58090:43;57973:167;:::o;58146:234::-;58286:34;58282:1;58274:6;58270:14;58263:58;58355:17;58350:2;58342:6;58338:15;58331:42;58146:234;:::o;58386:122::-;58459:24;58477:5;58459:24;:::i;:::-;58452:5;58449:35;58439:63;;58498:1;58495;58488:12;58439:63;58386:122;:::o;58514:116::-;58584:21;58599:5;58584:21;:::i;:::-;58577:5;58574:32;58564:60;;58620:1;58617;58610:12;58564:60;58514:116;:::o;58636:122::-;58709:24;58727:5;58709:24;:::i;:::-;58702:5;58699:35;58689:63;;58748:1;58745;58738:12;58689:63;58636:122;:::o;58764:120::-;58836:23;58853:5;58836:23;:::i;:::-;58829:5;58826:34;58816:62;;58874:1;58871;58864:12;58816:62;58764:120;:::o;58890:122::-;58963:24;58981:5;58963:24;:::i;:::-;58956:5;58953:35;58943:63;;59002:1;58999;58992:12;58943:63;58890:122;:::o
Swarm Source
ipfs://994f363ea10999631f014b173340eb4d7f96a1931473c2340e3345d331d0a46b
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.