Token GrumpyGhosts
Overview CRC721
Total Supply:
1 GG
Holders:
1 addresses
Contract:
Balance
1 GG
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
GrumpyGhosts
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2022-10-28 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @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); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); 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: invalid token ID"); 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) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token 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: caller is not token 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) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @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 { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721Burnable.sol) pragma solidity ^0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _burn(tokenId); } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.0; /** * @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) { _requireMinted(tokenId); 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 See {ERC721-_burn}. This override additionally checks to see if a * token-specific URI was set for the token, and if so, it deletes the token URI from * the storage mapping. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: contracts/grumpnft.sol pragma solidity ^0.8.4; contract GrumpyGhosts is ERC721, ERC721Enumerable, ERC721URIStorage, ERC721Burnable, Ownable { using Counters for Counters.Counter; using Strings for uint256; string baseURI; string public baseExtension = ".json"; IERC20 public tokenAddress; uint256 public rate = 1 * 10 ** 18; uint public MAX_SUPPLY = 666; Counters.Counter private _tokenIdCounter; constructor(address _tokenAddress) ERC721("GrumpyGhosts", "GG") { tokenAddress = IERC20(_tokenAddress); } function _baseURI() internal pure override returns (string memory) { return "https://gateway.pinata.cloud/ipfs/Qme8G2pLxYUMyQEPLcKVcAcZQBGrHF5WJB52yjiDFkuRbU/"; } function safeMint(address) public payable{ require(totalSupply() < MAX_SUPPLY, "Whale status aquired"); require(msg.value >= rate, "Not enough SOUL."); _tokenIdCounter.increment(); uint256 tokenId = _tokenIdCounter.current(); tokenAddress.transferFrom(msg.sender, address(this), rate); _safeMint(msg.sender, tokenId); } // The following functions are overrides required by Solidity. function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } function withdraw() public onlyOwner { require(address(this).balance > 0, "It's empty"); payable(owner()).transfer(address(this).balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_tokenAddress","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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"safeMint","outputs":[],"stateMutability":"payable","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":"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":"tokenAddress","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d9080519060200190620000519291906200026d565b50670de0b6b3a7640000600f5561029a6010553480156200007157600080fd5b5060405162003f4c38038062003f4c833981810160405281019062000097919062000334565b6040518060400160405280600c81526020017f4772756d707947686f73747300000000000000000000000000000000000000008152506040518060400160405280600281526020017f474700000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200011b9291906200026d565b508060019080519060200190620001349291906200026d565b505050620001576200014b6200019f60201b60201c565b620001a760201b60201c565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506200041e565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200027b906200039a565b90600052602060002090601f0160209004810192826200029f5760008555620002eb565b82601f10620002ba57805160ff1916838001178555620002eb565b82800160010185558215620002eb579182015b82811115620002ea578251825591602001919060010190620002cd565b5b509050620002fa9190620002fe565b5090565b5b8082111562000319576000816000905550600101620002ff565b5090565b6000815190506200032e8162000404565b92915050565b6000602082840312156200034d576200034c620003ff565b5b60006200035d848285016200031d565b91505092915050565b600062000373826200037a565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006002820490506001821680620003b357607f821691505b60208210811415620003ca57620003c9620003d0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6200040f8162000366565b81146200041b57600080fd5b50565b613b1e806200042e6000396000f3fe6080604052600436106101815760003560e01c80634f6ccce7116100d15780639d76ea581161008a578063c668286211610064578063c668286214610561578063c87b56dd1461058c578063e985e9c5146105c9578063f2fde38b1461060657610181565b80639d76ea58146104e4578063a22cb4651461050f578063b88d4fde1461053857610181565b80634f6ccce7146103c05780636352211e146103fd57806370a082311461043a578063715018a6146104775780638da5cb5b1461048e57806395d89b41146104b957610181565b80632c4e722e1161013e5780633ccfd60b116101185780633ccfd60b1461033b57806340d097c31461035257806342842e0e1461036e57806342966c681461039757610181565b80632c4e722e146102a85780632f745c59146102d357806332cb6b0c1461031057610181565b806301ffc9a71461018657806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b57806318160ddd1461025457806323b872dd1461027f575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a89190612a30565b61062f565b6040516101ba9190612ece565b60405180910390f35b3480156101cf57600080fd5b506101d8610641565b6040516101e59190612f04565b60405180910390f35b3480156101fa57600080fd5b5061021560048036038101906102109190612a8a565b6106d3565b6040516102229190612e30565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d91906129c3565b610719565b005b34801561026057600080fd5b50610269610831565b6040516102769190613166565b60405180910390f35b34801561028b57600080fd5b506102a660048036038101906102a191906128ad565b61083e565b005b3480156102b457600080fd5b506102bd61089e565b6040516102ca9190613166565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f591906129c3565b6108a4565b6040516103079190613166565b60405180910390f35b34801561031c57600080fd5b50610325610949565b6040516103329190613166565b60405180910390f35b34801561034757600080fd5b5061035061094f565b005b61036c60048036038101906103679190612840565b6109ea565b005b34801561037a57600080fd5b50610395600480360381019061039091906128ad565b610b54565b005b3480156103a357600080fd5b506103be60048036038101906103b99190612a8a565b610b74565b005b3480156103cc57600080fd5b506103e760048036038101906103e29190612a8a565b610bd0565b6040516103f49190613166565b60405180910390f35b34801561040957600080fd5b50610424600480360381019061041f9190612a8a565b610c41565b6040516104319190612e30565b60405180910390f35b34801561044657600080fd5b50610461600480360381019061045c9190612840565b610cf3565b60405161046e9190613166565b60405180910390f35b34801561048357600080fd5b5061048c610dab565b005b34801561049a57600080fd5b506104a3610dbf565b6040516104b09190612e30565b60405180910390f35b3480156104c557600080fd5b506104ce610de9565b6040516104db9190612f04565b60405180910390f35b3480156104f057600080fd5b506104f9610e7b565b6040516105069190612ee9565b60405180910390f35b34801561051b57600080fd5b5061053660048036038101906105319190612983565b610ea1565b005b34801561054457600080fd5b5061055f600480360381019061055a9190612900565b610eb7565b005b34801561056d57600080fd5b50610576610f19565b6040516105839190612f04565b60405180910390f35b34801561059857600080fd5b506105b360048036038101906105ae9190612a8a565b610fa7565b6040516105c09190612f04565b60405180910390f35b3480156105d557600080fd5b506105f060048036038101906105eb919061286d565b610fb9565b6040516105fd9190612ece565b60405180910390f35b34801561061257600080fd5b5061062d60048036038101906106289190612840565b61104d565b005b600061063a826110d1565b9050919050565b606060008054610650906133c1565b80601f016020809104026020016040519081016040528092919081815260200182805461067c906133c1565b80156106c95780601f1061069e576101008083540402835291602001916106c9565b820191906000526020600020905b8154815290600101906020018083116106ac57829003601f168201915b5050505050905090565b60006106de8261114b565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061072482610c41565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078c90613106565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107b4611196565b73ffffffffffffffffffffffffffffffffffffffff1614806107e357506107e2816107dd611196565b610fb9565b5b610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081990613086565b60405180910390fd5b61082c838361119e565b505050565b6000600880549050905090565b61084f610849611196565b82611257565b61088e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088590613146565b60405180910390fd5b6108998383836112ec565b505050565b600f5481565b60006108af83610cf3565b82106108f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e790612f46565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60105481565b610957611553565b6000471161099a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099190612f26565b60405180910390fd5b6109a2610dbf565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156109e7573d6000803e3d6000fd5b50565b6010546109f5610831565b10610a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2c90613046565b60405180910390fd5b600f54341015610a7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7190612fc6565b60405180910390fd5b610a8460116115d1565b6000610a9060116115e7565b9050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330600f546040518463ffffffff1660e01b8152600401610af393929190612e4b565b602060405180830381600087803b158015610b0d57600080fd5b505af1158015610b21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b459190612a03565b50610b5033826115f5565b5050565b610b6f83838360405180602001604052806000815250610eb7565b505050565b610b85610b7f611196565b82611257565b610bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbb90613146565b60405180910390fd5b610bcd81611613565b50565b6000610bda610831565b8210610c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1290613126565b60405180910390fd5b60088281548110610c2f57610c2e61355a565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce1906130e6565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5b90613066565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610db3611553565b610dbd600061161f565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610df8906133c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610e24906133c1565b8015610e715780601f10610e4657610100808354040283529160200191610e71565b820191906000526020600020905b815481529060010190602001808311610e5457829003601f168201915b5050505050905090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610eb3610eac611196565b83836116e5565b5050565b610ec8610ec2611196565b83611257565b610f07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efe90613146565b60405180910390fd5b610f1384848484611852565b50505050565b600d8054610f26906133c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610f52906133c1565b8015610f9f5780601f10610f7457610100808354040283529160200191610f9f565b820191906000526020600020905b815481529060010190602001808311610f8257829003601f168201915b505050505081565b6060610fb2826118ae565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611055611553565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bc90612f86565b60405180910390fd5b6110ce8161161f565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806111445750611143826119c1565b5b9050919050565b61115481611aa3565b611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a906130e6565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661121183610c41565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061126383610c41565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806112a557506112a48185610fb9565b5b806112e357508373ffffffffffffffffffffffffffffffffffffffff166112cb846106d3565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661130c82610c41565b73ffffffffffffffffffffffffffffffffffffffff1614611362576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135990612fa6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c990613006565b60405180910390fd5b6113dd838383611b0f565b6113e860008261119e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461143891906132a1565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461148f919061321a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461154e838383611b1f565b505050565b61155b611196565b73ffffffffffffffffffffffffffffffffffffffff16611579610dbf565b73ffffffffffffffffffffffffffffffffffffffff16146115cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c6906130c6565b60405180910390fd5b565b6001816000016000828254019250508190555050565b600081600001549050919050565b61160f828260405180602001604052806000815250611b24565b5050565b61161c81611b7f565b50565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174b90613026565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118459190612ece565b60405180910390a3505050565b61185d8484846112ec565b61186984848484611bd2565b6118a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189f90612f66565b60405180910390fd5b50505050565b60606118b98261114b565b6000600a600084815260200190815260200160002080546118d9906133c1565b80601f0160208091040260200160405190810160405280929190818152602001828054611905906133c1565b80156119525780601f1061192757610100808354040283529160200191611952565b820191906000526020600020905b81548152906001019060200180831161193557829003601f168201915b505050505090506000611963611d69565b90506000815114156119795781925050506119bc565b6000825111156119ae578082604051602001611996929190612e0c565b604051602081830303815290604052925050506119bc565b6119b784611d89565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a8c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a9c5750611a9b82611df1565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b611b1a838383611e5b565b505050565b505050565b611b2e8383611f6f565b611b3b6000848484611bd2565b611b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7190612f66565b60405180910390fd5b505050565b611b8881612149565b6000600a60008381526020019081526020016000208054611ba8906133c1565b905014611bcf57600a60008281526020019081526020016000206000611bce91906126f5565b5b50565b6000611bf38473ffffffffffffffffffffffffffffffffffffffff16612266565b15611d5c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611c1c611196565b8786866040518563ffffffff1660e01b8152600401611c3e9493929190612e82565b602060405180830381600087803b158015611c5857600080fd5b505af1925050508015611c8957506040513d601f19601f82011682018060405250810190611c869190612a5d565b60015b611d0c573d8060008114611cb9576040519150601f19603f3d011682016040523d82523d6000602084013e611cbe565b606091505b50600081511415611d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfb90612f66565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611d61565b600190505b949350505050565b6060604051806080016040528060518152602001613a9860519139905090565b6060611d948261114b565b6000611d9e611d69565b90506000815111611dbe5760405180602001604052806000815250611de9565b80611dc884612289565b604051602001611dd9929190612e0c565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611e668383836123ea565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ea957611ea4816123ef565b611ee8565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611ee757611ee68382612438565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f2b57611f26816125a5565b611f6a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611f6957611f688282612676565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd6906130a6565b60405180910390fd5b611fe881611aa3565b15612028576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201f90612fe6565b60405180910390fd5b61203460008383611b0f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612084919061321a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461214560008383611b1f565b5050565b600061215482610c41565b905061216281600084611b0f565b61216d60008361119e565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121bd91906132a1565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461226281600084611b1f565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606060008214156122d1576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123e5565b600082905060005b600082146123035780806122ec90613424565b915050600a826122fc9190613270565b91506122d9565b60008167ffffffffffffffff81111561231f5761231e613589565b5b6040519080825280601f01601f1916602001820160405280156123515781602001600182028036833780820191505090505b5090505b600085146123de5760018261236a91906132a1565b9150600a85612379919061346d565b6030612385919061321a565b60f81b81838151811061239b5761239a61355a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123d79190613270565b9450612355565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161244584610cf3565b61244f91906132a1565b9050600060076000848152602001908152602001600020549050818114612534576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506125b991906132a1565b90506000600960008481526020019081526020016000205490506000600883815481106125e9576125e861355a565b5b90600052602060002001549050806008838154811061260b5761260a61355a565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061265a5761265961352b565b5b6001900381819060005260206000200160009055905550505050565b600061268183610cf3565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b508054612701906133c1565b6000825580601f106127135750612732565b601f0160209004906000526020600020908101906127319190612735565b5b50565b5b8082111561274e576000816000905550600101612736565b5090565b6000612765612760846131a6565b613181565b905082815260208101848484011115612781576127806135bd565b5b61278c84828561337f565b509392505050565b6000813590506127a381613a3b565b92915050565b6000813590506127b881613a52565b92915050565b6000815190506127cd81613a52565b92915050565b6000813590506127e281613a69565b92915050565b6000815190506127f781613a69565b92915050565b600082601f830112612812576128116135b8565b5b8135612822848260208601612752565b91505092915050565b60008135905061283a81613a80565b92915050565b600060208284031215612856576128556135c7565b5b600061286484828501612794565b91505092915050565b60008060408385031215612884576128836135c7565b5b600061289285828601612794565b92505060206128a385828601612794565b9150509250929050565b6000806000606084860312156128c6576128c56135c7565b5b60006128d486828701612794565b93505060206128e586828701612794565b92505060406128f68682870161282b565b9150509250925092565b6000806000806080858703121561291a576129196135c7565b5b600061292887828801612794565b945050602061293987828801612794565b935050604061294a8782880161282b565b925050606085013567ffffffffffffffff81111561296b5761296a6135c2565b5b612977878288016127fd565b91505092959194509250565b6000806040838503121561299a576129996135c7565b5b60006129a885828601612794565b92505060206129b9858286016127a9565b9150509250929050565b600080604083850312156129da576129d96135c7565b5b60006129e885828601612794565b92505060206129f98582860161282b565b9150509250929050565b600060208284031215612a1957612a186135c7565b5b6000612a27848285016127be565b91505092915050565b600060208284031215612a4657612a456135c7565b5b6000612a54848285016127d3565b91505092915050565b600060208284031215612a7357612a726135c7565b5b6000612a81848285016127e8565b91505092915050565b600060208284031215612aa057612a9f6135c7565b5b6000612aae8482850161282b565b91505092915050565b612ac0816132d5565b82525050565b612acf816132e7565b82525050565b6000612ae0826131d7565b612aea81856131ed565b9350612afa81856020860161338e565b612b03816135cc565b840191505092915050565b612b1781613349565b82525050565b6000612b28826131e2565b612b3281856131fe565b9350612b4281856020860161338e565b612b4b816135cc565b840191505092915050565b6000612b61826131e2565b612b6b818561320f565b9350612b7b81856020860161338e565b80840191505092915050565b6000612b94600a836131fe565b9150612b9f826135dd565b602082019050919050565b6000612bb7602b836131fe565b9150612bc282613606565b604082019050919050565b6000612bda6032836131fe565b9150612be582613655565b604082019050919050565b6000612bfd6026836131fe565b9150612c08826136a4565b604082019050919050565b6000612c206025836131fe565b9150612c2b826136f3565b604082019050919050565b6000612c436010836131fe565b9150612c4e82613742565b602082019050919050565b6000612c66601c836131fe565b9150612c718261376b565b602082019050919050565b6000612c896024836131fe565b9150612c9482613794565b604082019050919050565b6000612cac6019836131fe565b9150612cb7826137e3565b602082019050919050565b6000612ccf6014836131fe565b9150612cda8261380c565b602082019050919050565b6000612cf26029836131fe565b9150612cfd82613835565b604082019050919050565b6000612d15603e836131fe565b9150612d2082613884565b604082019050919050565b6000612d386020836131fe565b9150612d43826138d3565b602082019050919050565b6000612d5b6020836131fe565b9150612d66826138fc565b602082019050919050565b6000612d7e6018836131fe565b9150612d8982613925565b602082019050919050565b6000612da16021836131fe565b9150612dac8261394e565b604082019050919050565b6000612dc4602c836131fe565b9150612dcf8261399d565b604082019050919050565b6000612de7602e836131fe565b9150612df2826139ec565b604082019050919050565b612e068161333f565b82525050565b6000612e188285612b56565b9150612e248284612b56565b91508190509392505050565b6000602082019050612e456000830184612ab7565b92915050565b6000606082019050612e606000830186612ab7565b612e6d6020830185612ab7565b612e7a6040830184612dfd565b949350505050565b6000608082019050612e976000830187612ab7565b612ea46020830186612ab7565b612eb16040830185612dfd565b8181036060830152612ec38184612ad5565b905095945050505050565b6000602082019050612ee36000830184612ac6565b92915050565b6000602082019050612efe6000830184612b0e565b92915050565b60006020820190508181036000830152612f1e8184612b1d565b905092915050565b60006020820190508181036000830152612f3f81612b87565b9050919050565b60006020820190508181036000830152612f5f81612baa565b9050919050565b60006020820190508181036000830152612f7f81612bcd565b9050919050565b60006020820190508181036000830152612f9f81612bf0565b9050919050565b60006020820190508181036000830152612fbf81612c13565b9050919050565b60006020820190508181036000830152612fdf81612c36565b9050919050565b60006020820190508181036000830152612fff81612c59565b9050919050565b6000602082019050818103600083015261301f81612c7c565b9050919050565b6000602082019050818103600083015261303f81612c9f565b9050919050565b6000602082019050818103600083015261305f81612cc2565b9050919050565b6000602082019050818103600083015261307f81612ce5565b9050919050565b6000602082019050818103600083015261309f81612d08565b9050919050565b600060208201905081810360008301526130bf81612d2b565b9050919050565b600060208201905081810360008301526130df81612d4e565b9050919050565b600060208201905081810360008301526130ff81612d71565b9050919050565b6000602082019050818103600083015261311f81612d94565b9050919050565b6000602082019050818103600083015261313f81612db7565b9050919050565b6000602082019050818103600083015261315f81612dda565b9050919050565b600060208201905061317b6000830184612dfd565b92915050565b600061318b61319c565b905061319782826133f3565b919050565b6000604051905090565b600067ffffffffffffffff8211156131c1576131c0613589565b5b6131ca826135cc565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006132258261333f565b91506132308361333f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132655761326461349e565b5b828201905092915050565b600061327b8261333f565b91506132868361333f565b925082613296576132956134cd565b5b828204905092915050565b60006132ac8261333f565b91506132b78361333f565b9250828210156132ca576132c961349e565b5b828203905092915050565b60006132e08261331f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006133548261335b565b9050919050565b60006133668261336d565b9050919050565b60006133788261331f565b9050919050565b82818337600083830152505050565b60005b838110156133ac578082015181840152602081019050613391565b838111156133bb576000848401525b50505050565b600060028204905060018216806133d957607f821691505b602082108114156133ed576133ec6134fc565b5b50919050565b6133fc826135cc565b810181811067ffffffffffffffff8211171561341b5761341a613589565b5b80604052505050565b600061342f8261333f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156134625761346161349e565b5b600182019050919050565b60006134788261333f565b91506134838361333f565b925082613493576134926134cd565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4974277320656d70747900000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820534f554c2e00000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f5768616c65207374617475732061717569726564000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b613a44816132d5565b8114613a4f57600080fd5b50565b613a5b816132e7565b8114613a6657600080fd5b50565b613a72816132f3565b8114613a7d57600080fd5b50565b613a898161333f565b8114613a9457600080fd5b5056fe68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d65384732704c7859554d795145504c634b566341635a51424772484635574a423532796a6944466b755262552fa2646970667358221220d822334f6441012b10faf58305cdd2dea3b897ef49cb34fd4a83a0df49fd510164736f6c634300080700330000000000000000000000001eec7faaf1c747d2ce004e229c9614c048a3e5c0
Deployed Bytecode
0x6080604052600436106101815760003560e01c80634f6ccce7116100d15780639d76ea581161008a578063c668286211610064578063c668286214610561578063c87b56dd1461058c578063e985e9c5146105c9578063f2fde38b1461060657610181565b80639d76ea58146104e4578063a22cb4651461050f578063b88d4fde1461053857610181565b80634f6ccce7146103c05780636352211e146103fd57806370a082311461043a578063715018a6146104775780638da5cb5b1461048e57806395d89b41146104b957610181565b80632c4e722e1161013e5780633ccfd60b116101185780633ccfd60b1461033b57806340d097c31461035257806342842e0e1461036e57806342966c681461039757610181565b80632c4e722e146102a85780632f745c59146102d357806332cb6b0c1461031057610181565b806301ffc9a71461018657806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b57806318160ddd1461025457806323b872dd1461027f575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a89190612a30565b61062f565b6040516101ba9190612ece565b60405180910390f35b3480156101cf57600080fd5b506101d8610641565b6040516101e59190612f04565b60405180910390f35b3480156101fa57600080fd5b5061021560048036038101906102109190612a8a565b6106d3565b6040516102229190612e30565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d91906129c3565b610719565b005b34801561026057600080fd5b50610269610831565b6040516102769190613166565b60405180910390f35b34801561028b57600080fd5b506102a660048036038101906102a191906128ad565b61083e565b005b3480156102b457600080fd5b506102bd61089e565b6040516102ca9190613166565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f591906129c3565b6108a4565b6040516103079190613166565b60405180910390f35b34801561031c57600080fd5b50610325610949565b6040516103329190613166565b60405180910390f35b34801561034757600080fd5b5061035061094f565b005b61036c60048036038101906103679190612840565b6109ea565b005b34801561037a57600080fd5b50610395600480360381019061039091906128ad565b610b54565b005b3480156103a357600080fd5b506103be60048036038101906103b99190612a8a565b610b74565b005b3480156103cc57600080fd5b506103e760048036038101906103e29190612a8a565b610bd0565b6040516103f49190613166565b60405180910390f35b34801561040957600080fd5b50610424600480360381019061041f9190612a8a565b610c41565b6040516104319190612e30565b60405180910390f35b34801561044657600080fd5b50610461600480360381019061045c9190612840565b610cf3565b60405161046e9190613166565b60405180910390f35b34801561048357600080fd5b5061048c610dab565b005b34801561049a57600080fd5b506104a3610dbf565b6040516104b09190612e30565b60405180910390f35b3480156104c557600080fd5b506104ce610de9565b6040516104db9190612f04565b60405180910390f35b3480156104f057600080fd5b506104f9610e7b565b6040516105069190612ee9565b60405180910390f35b34801561051b57600080fd5b5061053660048036038101906105319190612983565b610ea1565b005b34801561054457600080fd5b5061055f600480360381019061055a9190612900565b610eb7565b005b34801561056d57600080fd5b50610576610f19565b6040516105839190612f04565b60405180910390f35b34801561059857600080fd5b506105b360048036038101906105ae9190612a8a565b610fa7565b6040516105c09190612f04565b60405180910390f35b3480156105d557600080fd5b506105f060048036038101906105eb919061286d565b610fb9565b6040516105fd9190612ece565b60405180910390f35b34801561061257600080fd5b5061062d60048036038101906106289190612840565b61104d565b005b600061063a826110d1565b9050919050565b606060008054610650906133c1565b80601f016020809104026020016040519081016040528092919081815260200182805461067c906133c1565b80156106c95780601f1061069e576101008083540402835291602001916106c9565b820191906000526020600020905b8154815290600101906020018083116106ac57829003601f168201915b5050505050905090565b60006106de8261114b565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061072482610c41565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078c90613106565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107b4611196565b73ffffffffffffffffffffffffffffffffffffffff1614806107e357506107e2816107dd611196565b610fb9565b5b610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081990613086565b60405180910390fd5b61082c838361119e565b505050565b6000600880549050905090565b61084f610849611196565b82611257565b61088e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088590613146565b60405180910390fd5b6108998383836112ec565b505050565b600f5481565b60006108af83610cf3565b82106108f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e790612f46565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60105481565b610957611553565b6000471161099a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099190612f26565b60405180910390fd5b6109a2610dbf565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156109e7573d6000803e3d6000fd5b50565b6010546109f5610831565b10610a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2c90613046565b60405180910390fd5b600f54341015610a7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7190612fc6565b60405180910390fd5b610a8460116115d1565b6000610a9060116115e7565b9050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330600f546040518463ffffffff1660e01b8152600401610af393929190612e4b565b602060405180830381600087803b158015610b0d57600080fd5b505af1158015610b21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b459190612a03565b50610b5033826115f5565b5050565b610b6f83838360405180602001604052806000815250610eb7565b505050565b610b85610b7f611196565b82611257565b610bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbb90613146565b60405180910390fd5b610bcd81611613565b50565b6000610bda610831565b8210610c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1290613126565b60405180910390fd5b60088281548110610c2f57610c2e61355a565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce1906130e6565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5b90613066565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610db3611553565b610dbd600061161f565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610df8906133c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610e24906133c1565b8015610e715780601f10610e4657610100808354040283529160200191610e71565b820191906000526020600020905b815481529060010190602001808311610e5457829003601f168201915b5050505050905090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610eb3610eac611196565b83836116e5565b5050565b610ec8610ec2611196565b83611257565b610f07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efe90613146565b60405180910390fd5b610f1384848484611852565b50505050565b600d8054610f26906133c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610f52906133c1565b8015610f9f5780601f10610f7457610100808354040283529160200191610f9f565b820191906000526020600020905b815481529060010190602001808311610f8257829003601f168201915b505050505081565b6060610fb2826118ae565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611055611553565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bc90612f86565b60405180910390fd5b6110ce8161161f565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806111445750611143826119c1565b5b9050919050565b61115481611aa3565b611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a906130e6565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661121183610c41565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061126383610c41565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806112a557506112a48185610fb9565b5b806112e357508373ffffffffffffffffffffffffffffffffffffffff166112cb846106d3565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661130c82610c41565b73ffffffffffffffffffffffffffffffffffffffff1614611362576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135990612fa6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c990613006565b60405180910390fd5b6113dd838383611b0f565b6113e860008261119e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461143891906132a1565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461148f919061321a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461154e838383611b1f565b505050565b61155b611196565b73ffffffffffffffffffffffffffffffffffffffff16611579610dbf565b73ffffffffffffffffffffffffffffffffffffffff16146115cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c6906130c6565b60405180910390fd5b565b6001816000016000828254019250508190555050565b600081600001549050919050565b61160f828260405180602001604052806000815250611b24565b5050565b61161c81611b7f565b50565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174b90613026565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118459190612ece565b60405180910390a3505050565b61185d8484846112ec565b61186984848484611bd2565b6118a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189f90612f66565b60405180910390fd5b50505050565b60606118b98261114b565b6000600a600084815260200190815260200160002080546118d9906133c1565b80601f0160208091040260200160405190810160405280929190818152602001828054611905906133c1565b80156119525780601f1061192757610100808354040283529160200191611952565b820191906000526020600020905b81548152906001019060200180831161193557829003601f168201915b505050505090506000611963611d69565b90506000815114156119795781925050506119bc565b6000825111156119ae578082604051602001611996929190612e0c565b604051602081830303815290604052925050506119bc565b6119b784611d89565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a8c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a9c5750611a9b82611df1565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b611b1a838383611e5b565b505050565b505050565b611b2e8383611f6f565b611b3b6000848484611bd2565b611b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7190612f66565b60405180910390fd5b505050565b611b8881612149565b6000600a60008381526020019081526020016000208054611ba8906133c1565b905014611bcf57600a60008281526020019081526020016000206000611bce91906126f5565b5b50565b6000611bf38473ffffffffffffffffffffffffffffffffffffffff16612266565b15611d5c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611c1c611196565b8786866040518563ffffffff1660e01b8152600401611c3e9493929190612e82565b602060405180830381600087803b158015611c5857600080fd5b505af1925050508015611c8957506040513d601f19601f82011682018060405250810190611c869190612a5d565b60015b611d0c573d8060008114611cb9576040519150601f19603f3d011682016040523d82523d6000602084013e611cbe565b606091505b50600081511415611d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfb90612f66565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611d61565b600190505b949350505050565b6060604051806080016040528060518152602001613a9860519139905090565b6060611d948261114b565b6000611d9e611d69565b90506000815111611dbe5760405180602001604052806000815250611de9565b80611dc884612289565b604051602001611dd9929190612e0c565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611e668383836123ea565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ea957611ea4816123ef565b611ee8565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611ee757611ee68382612438565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f2b57611f26816125a5565b611f6a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611f6957611f688282612676565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd6906130a6565b60405180910390fd5b611fe881611aa3565b15612028576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201f90612fe6565b60405180910390fd5b61203460008383611b0f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612084919061321a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461214560008383611b1f565b5050565b600061215482610c41565b905061216281600084611b0f565b61216d60008361119e565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121bd91906132a1565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461226281600084611b1f565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606060008214156122d1576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123e5565b600082905060005b600082146123035780806122ec90613424565b915050600a826122fc9190613270565b91506122d9565b60008167ffffffffffffffff81111561231f5761231e613589565b5b6040519080825280601f01601f1916602001820160405280156123515781602001600182028036833780820191505090505b5090505b600085146123de5760018261236a91906132a1565b9150600a85612379919061346d565b6030612385919061321a565b60f81b81838151811061239b5761239a61355a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123d79190613270565b9450612355565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161244584610cf3565b61244f91906132a1565b9050600060076000848152602001908152602001600020549050818114612534576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506125b991906132a1565b90506000600960008481526020019081526020016000205490506000600883815481106125e9576125e861355a565b5b90600052602060002001549050806008838154811061260b5761260a61355a565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061265a5761265961352b565b5b6001900381819060005260206000200160009055905550505050565b600061268183610cf3565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b508054612701906133c1565b6000825580601f106127135750612732565b601f0160209004906000526020600020908101906127319190612735565b5b50565b5b8082111561274e576000816000905550600101612736565b5090565b6000612765612760846131a6565b613181565b905082815260208101848484011115612781576127806135bd565b5b61278c84828561337f565b509392505050565b6000813590506127a381613a3b565b92915050565b6000813590506127b881613a52565b92915050565b6000815190506127cd81613a52565b92915050565b6000813590506127e281613a69565b92915050565b6000815190506127f781613a69565b92915050565b600082601f830112612812576128116135b8565b5b8135612822848260208601612752565b91505092915050565b60008135905061283a81613a80565b92915050565b600060208284031215612856576128556135c7565b5b600061286484828501612794565b91505092915050565b60008060408385031215612884576128836135c7565b5b600061289285828601612794565b92505060206128a385828601612794565b9150509250929050565b6000806000606084860312156128c6576128c56135c7565b5b60006128d486828701612794565b93505060206128e586828701612794565b92505060406128f68682870161282b565b9150509250925092565b6000806000806080858703121561291a576129196135c7565b5b600061292887828801612794565b945050602061293987828801612794565b935050604061294a8782880161282b565b925050606085013567ffffffffffffffff81111561296b5761296a6135c2565b5b612977878288016127fd565b91505092959194509250565b6000806040838503121561299a576129996135c7565b5b60006129a885828601612794565b92505060206129b9858286016127a9565b9150509250929050565b600080604083850312156129da576129d96135c7565b5b60006129e885828601612794565b92505060206129f98582860161282b565b9150509250929050565b600060208284031215612a1957612a186135c7565b5b6000612a27848285016127be565b91505092915050565b600060208284031215612a4657612a456135c7565b5b6000612a54848285016127d3565b91505092915050565b600060208284031215612a7357612a726135c7565b5b6000612a81848285016127e8565b91505092915050565b600060208284031215612aa057612a9f6135c7565b5b6000612aae8482850161282b565b91505092915050565b612ac0816132d5565b82525050565b612acf816132e7565b82525050565b6000612ae0826131d7565b612aea81856131ed565b9350612afa81856020860161338e565b612b03816135cc565b840191505092915050565b612b1781613349565b82525050565b6000612b28826131e2565b612b3281856131fe565b9350612b4281856020860161338e565b612b4b816135cc565b840191505092915050565b6000612b61826131e2565b612b6b818561320f565b9350612b7b81856020860161338e565b80840191505092915050565b6000612b94600a836131fe565b9150612b9f826135dd565b602082019050919050565b6000612bb7602b836131fe565b9150612bc282613606565b604082019050919050565b6000612bda6032836131fe565b9150612be582613655565b604082019050919050565b6000612bfd6026836131fe565b9150612c08826136a4565b604082019050919050565b6000612c206025836131fe565b9150612c2b826136f3565b604082019050919050565b6000612c436010836131fe565b9150612c4e82613742565b602082019050919050565b6000612c66601c836131fe565b9150612c718261376b565b602082019050919050565b6000612c896024836131fe565b9150612c9482613794565b604082019050919050565b6000612cac6019836131fe565b9150612cb7826137e3565b602082019050919050565b6000612ccf6014836131fe565b9150612cda8261380c565b602082019050919050565b6000612cf26029836131fe565b9150612cfd82613835565b604082019050919050565b6000612d15603e836131fe565b9150612d2082613884565b604082019050919050565b6000612d386020836131fe565b9150612d43826138d3565b602082019050919050565b6000612d5b6020836131fe565b9150612d66826138fc565b602082019050919050565b6000612d7e6018836131fe565b9150612d8982613925565b602082019050919050565b6000612da16021836131fe565b9150612dac8261394e565b604082019050919050565b6000612dc4602c836131fe565b9150612dcf8261399d565b604082019050919050565b6000612de7602e836131fe565b9150612df2826139ec565b604082019050919050565b612e068161333f565b82525050565b6000612e188285612b56565b9150612e248284612b56565b91508190509392505050565b6000602082019050612e456000830184612ab7565b92915050565b6000606082019050612e606000830186612ab7565b612e6d6020830185612ab7565b612e7a6040830184612dfd565b949350505050565b6000608082019050612e976000830187612ab7565b612ea46020830186612ab7565b612eb16040830185612dfd565b8181036060830152612ec38184612ad5565b905095945050505050565b6000602082019050612ee36000830184612ac6565b92915050565b6000602082019050612efe6000830184612b0e565b92915050565b60006020820190508181036000830152612f1e8184612b1d565b905092915050565b60006020820190508181036000830152612f3f81612b87565b9050919050565b60006020820190508181036000830152612f5f81612baa565b9050919050565b60006020820190508181036000830152612f7f81612bcd565b9050919050565b60006020820190508181036000830152612f9f81612bf0565b9050919050565b60006020820190508181036000830152612fbf81612c13565b9050919050565b60006020820190508181036000830152612fdf81612c36565b9050919050565b60006020820190508181036000830152612fff81612c59565b9050919050565b6000602082019050818103600083015261301f81612c7c565b9050919050565b6000602082019050818103600083015261303f81612c9f565b9050919050565b6000602082019050818103600083015261305f81612cc2565b9050919050565b6000602082019050818103600083015261307f81612ce5565b9050919050565b6000602082019050818103600083015261309f81612d08565b9050919050565b600060208201905081810360008301526130bf81612d2b565b9050919050565b600060208201905081810360008301526130df81612d4e565b9050919050565b600060208201905081810360008301526130ff81612d71565b9050919050565b6000602082019050818103600083015261311f81612d94565b9050919050565b6000602082019050818103600083015261313f81612db7565b9050919050565b6000602082019050818103600083015261315f81612dda565b9050919050565b600060208201905061317b6000830184612dfd565b92915050565b600061318b61319c565b905061319782826133f3565b919050565b6000604051905090565b600067ffffffffffffffff8211156131c1576131c0613589565b5b6131ca826135cc565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006132258261333f565b91506132308361333f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132655761326461349e565b5b828201905092915050565b600061327b8261333f565b91506132868361333f565b925082613296576132956134cd565b5b828204905092915050565b60006132ac8261333f565b91506132b78361333f565b9250828210156132ca576132c961349e565b5b828203905092915050565b60006132e08261331f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006133548261335b565b9050919050565b60006133668261336d565b9050919050565b60006133788261331f565b9050919050565b82818337600083830152505050565b60005b838110156133ac578082015181840152602081019050613391565b838111156133bb576000848401525b50505050565b600060028204905060018216806133d957607f821691505b602082108114156133ed576133ec6134fc565b5b50919050565b6133fc826135cc565b810181811067ffffffffffffffff8211171561341b5761341a613589565b5b80604052505050565b600061342f8261333f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156134625761346161349e565b5b600182019050919050565b60006134788261333f565b91506134838361333f565b925082613493576134926134cd565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4974277320656d70747900000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820534f554c2e00000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f5768616c65207374617475732061717569726564000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b613a44816132d5565b8114613a4f57600080fd5b50565b613a5b816132e7565b8114613a6657600080fd5b50565b613a72816132f3565b8114613a7d57600080fd5b50565b613a898161333f565b8114613a9457600080fd5b5056fe68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d65384732704c7859554d795145504c634b566341635a51424772484635574a423532796a6944466b755262552fa2646970667358221220d822334f6441012b10faf58305cdd2dea3b897ef49cb34fd4a83a0df49fd510164736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001eec7faaf1c747d2ce004e229c9614c048a3e5c0
-----Decoded View---------------
Arg [0] : _tokenAddress (address): 0x1eec7faaf1c747d2ce004e229c9614c048a3e5c0
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000001eec7faaf1c747d2ce004e229c9614c048a3e5c0
Deployed ByteCode Sourcemap
53366:2098:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55075:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28242:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29755:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29272:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44897:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30455:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53638:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44565:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53679:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55293:163;;;;;;;;;;;;;:::i;:::-;;54080:378;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30862:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41035:243;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45087:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27953:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27684:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6771:103;;;;;;;;;;;;;:::i;:::-;;6123:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28411:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53605:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29998:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31118:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53561:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54871:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30224:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7029:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55075:212;55214:4;55243:36;55267:11;55243:23;:36::i;:::-;55236:43;;55075:212;;;:::o;28242:100::-;28296:13;28329:5;28322:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28242:100;:::o;29755:171::-;29831:7;29851:23;29866:7;29851:14;:23::i;:::-;29894:15;:24;29910:7;29894:24;;;;;;;;;;;;;;;;;;;;;29887:31;;29755:171;;;:::o;29272:417::-;29353:13;29369:23;29384:7;29369:14;:23::i;:::-;29353:39;;29417:5;29411:11;;:2;:11;;;;29403:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;29511:5;29495:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;29520:37;29537:5;29544:12;:10;:12::i;:::-;29520:16;:37::i;:::-;29495:62;29473:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;29660:21;29669:2;29673:7;29660:8;:21::i;:::-;29342:347;29272:417;;:::o;44897:113::-;44958:7;44985:10;:17;;;;44978:24;;44897:113;:::o;30455:336::-;30650:41;30669:12;:10;:12::i;:::-;30683:7;30650:18;:41::i;:::-;30642:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;30755:28;30765:4;30771:2;30775:7;30755:9;:28::i;:::-;30455:336;;;:::o;53638:34::-;;;;:::o;44565:256::-;44662:7;44698:23;44715:5;44698:16;:23::i;:::-;44690:5;:31;44682:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;44787:12;:19;44800:5;44787:19;;;;;;;;;;;;;;;:26;44807:5;44787:26;;;;;;;;;;;;44780:33;;44565:256;;;;:::o;53679:28::-;;;;:::o;55293:163::-;6009:13;:11;:13::i;:::-;55373:1:::1;55349:21;:25;55341:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;55408:7;:5;:7::i;:::-;55400:25;;:48;55426:21;55400:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;55293:163::o:0;54080:378::-;54156:10;;54140:13;:11;:13::i;:::-;:26;54132:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;54223:4;;54210:9;:17;;54202:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;54259:27;:15;:25;:27::i;:::-;54297:15;54315:25;:15;:23;:25::i;:::-;54297:43;;54351:12;;;;;;;;;;;:25;;;54377:10;54397:4;54404;;54351:58;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;54420:30;54430:10;54442:7;54420:9;:30::i;:::-;54121:337;54080:378;:::o;30862:185::-;31000:39;31017:4;31023:2;31027:7;31000:39;;;;;;;;;;;;:16;:39::i;:::-;30862:185;;;:::o;41035:243::-;41153:41;41172:12;:10;:12::i;:::-;41186:7;41153:18;:41::i;:::-;41145:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;41256:14;41262:7;41256:5;:14::i;:::-;41035:243;:::o;45087:233::-;45162:7;45198:30;:28;:30::i;:::-;45190:5;:38;45182:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;45295:10;45306:5;45295:17;;;;;;;;:::i;:::-;;;;;;;;;;45288:24;;45087:233;;;:::o;27953:222::-;28025:7;28045:13;28061:7;:16;28069:7;28061:16;;;;;;;;;;;;;;;;;;;;;28045:32;;28113:1;28096:19;;:5;:19;;;;28088:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;28162:5;28155:12;;;27953:222;;;:::o;27684:207::-;27756:7;27801:1;27784:19;;:5;:19;;;;27776:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27867:9;:16;27877:5;27867:16;;;;;;;;;;;;;;;;27860:23;;27684:207;;;:::o;6771:103::-;6009:13;:11;:13::i;:::-;6836:30:::1;6863:1;6836:18;:30::i;:::-;6771:103::o:0;6123:87::-;6169:7;6196:6;;;;;;;;;;;6189:13;;6123:87;:::o;28411:104::-;28467:13;28500:7;28493:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28411:104;:::o;53605:26::-;;;;;;;;;;;;;:::o;29998:155::-;30093:52;30112:12;:10;:12::i;:::-;30126:8;30136;30093:18;:52::i;:::-;29998:155;;:::o;31118:323::-;31292:41;31311:12;:10;:12::i;:::-;31325:7;31292:18;:41::i;:::-;31284:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;31395:38;31409:4;31415:2;31419:7;31428:4;31395:13;:38::i;:::-;31118:323;;;;:::o;53561:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54871:196::-;54998:13;55036:23;55051:7;55036:14;:23::i;:::-;55029:30;;54871:196;;;:::o;30224:164::-;30321:4;30345:18;:25;30364:5;30345:25;;;;;;;;;;;;;;;:35;30371:8;30345:35;;;;;;;;;;;;;;;;;;;;;;;;;30338:42;;30224:164;;;;:::o;7029:201::-;6009:13;:11;:13::i;:::-;7138:1:::1;7118:22;;:8;:22;;;;7110:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7194:28;7213:8;7194:18;:28::i;:::-;7029:201:::0;:::o;44257:224::-;44359:4;44398:35;44383:50;;;:11;:50;;;;:90;;;;44437:36;44461:11;44437:23;:36::i;:::-;44383:90;44376:97;;44257:224;;;:::o;37730:135::-;37812:16;37820:7;37812;:16::i;:::-;37804:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;37730:135;:::o;4674:98::-;4727:7;4754:10;4747:17;;4674:98;:::o;37009:174::-;37111:2;37084:15;:24;37100:7;37084:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;37167:7;37163:2;37129:46;;37138:23;37153:7;37138:14;:23::i;:::-;37129:46;;;;;;;;;;;;37009:174;;:::o;33242:264::-;33335:4;33352:13;33368:23;33383:7;33368:14;:23::i;:::-;33352:39;;33421:5;33410:16;;:7;:16;;;:52;;;;33430:32;33447:5;33454:7;33430:16;:32::i;:::-;33410:52;:87;;;;33490:7;33466:31;;:20;33478:7;33466:11;:20::i;:::-;:31;;;33410:87;33402:96;;;33242:264;;;;:::o;36265:625::-;36424:4;36397:31;;:23;36412:7;36397:14;:23::i;:::-;:31;;;36389:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;36503:1;36489:16;;:2;:16;;;;36481:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36559:39;36580:4;36586:2;36590:7;36559:20;:39::i;:::-;36663:29;36680:1;36684:7;36663:8;:29::i;:::-;36724:1;36705:9;:15;36715:4;36705:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;36753:1;36736:9;:13;36746:2;36736:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36784:2;36765:7;:16;36773:7;36765:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36823:7;36819:2;36804:27;;36813:4;36804:27;;;;;;;;;;;;36844:38;36864:4;36870:2;36874:7;36844:19;:38::i;:::-;36265:625;;;:::o;6288:132::-;6363:12;:10;:12::i;:::-;6352:23;;:7;:5;:7::i;:::-;:23;;;6344:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6288:132::o;1027:127::-;1134:1;1116:7;:14;;;:19;;;;;;;;;;;1027:127;:::o;905:114::-;970:7;997;:14;;;990:21;;905:114;;;:::o;33848:110::-;33924:26;33934:2;33938:7;33924:26;;;;;;;;;;;;:9;:26::i;:::-;33848:110;;:::o;54748:115::-;54835:20;54847:7;54835:11;:20::i;:::-;54748:115;:::o;7390:191::-;7464:16;7483:6;;;;;;;;;;;7464:25;;7509:8;7500:6;;:17;;;;;;;;;;;;;;;;;;7564:8;7533:40;;7554:8;7533:40;;;;;;;;;;;;7453:128;7390:191;:::o;37326:315::-;37481:8;37472:17;;:5;:17;;;;37464:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;37568:8;37530:18;:25;37549:5;37530:25;;;;;;;;;;;;;;;:35;37556:8;37530:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;37614:8;37592:41;;37607:5;37592:41;;;37624:8;37592:41;;;;;;:::i;:::-;;;;;;;;37326:315;;;:::o;32322:313::-;32478:28;32488:4;32494:2;32498:7;32478:9;:28::i;:::-;32525:47;32548:4;32554:2;32558:7;32567:4;32525:22;:47::i;:::-;32517:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;32322:313;;;;:::o;41811:624::-;41884:13;41910:23;41925:7;41910:14;:23::i;:::-;41946;41972:10;:19;41983:7;41972:19;;;;;;;;;;;41946:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42002:18;42023:10;:8;:10::i;:::-;42002:31;;42131:1;42115:4;42109:18;:23;42105:72;;;42156:9;42149:16;;;;;;42105:72;42307:1;42287:9;42281:23;:27;42277:108;;;42356:4;42362:9;42339:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42325:48;;;;;;42277:108;42404:23;42419:7;42404:14;:23::i;:::-;42397:30;;;;41811:624;;;;:::o;27315:305::-;27417:4;27469:25;27454:40;;;:11;:40;;;;:105;;;;27526:33;27511:48;;;:11;:48;;;;27454:105;:158;;;;27576:36;27600:11;27576:23;:36::i;:::-;27454:158;27434:178;;27315:305;;;:::o;32948:127::-;33013:4;33065:1;33037:30;;:7;:16;33045:7;33037:16;;;;;;;;;;;;;;;;;;;;;:30;;;;33030:37;;32948:127;;;:::o;54536:204::-;54687:45;54714:4;54720:2;54724:7;54687:26;:45::i;:::-;54536:204;;;:::o;40365:125::-;;;;:::o;34185:319::-;34314:18;34320:2;34324:7;34314:5;:18::i;:::-;34365:53;34396:1;34400:2;34404:7;34413:4;34365:22;:53::i;:::-;34343:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;34185:319;;;:::o;43033:206::-;43102:20;43114:7;43102:11;:20::i;:::-;43176:1;43145:10;:19;43156:7;43145:19;;;;;;;;;;;43139:33;;;;;:::i;:::-;;;:38;43135:97;;43201:10;:19;43212:7;43201:19;;;;;;;;;;;;43194:26;;;;:::i;:::-;43135:97;43033:206;:::o;38429:853::-;38583:4;38604:15;:2;:13;;;:15::i;:::-;38600:675;;;38656:2;38640:36;;;38677:12;:10;:12::i;:::-;38691:4;38697:7;38706:4;38640:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38636:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38898:1;38881:6;:13;:18;38877:328;;;38924:60;;;;;;;;;;:::i;:::-;;;;;;;;38877:328;39155:6;39149:13;39140:6;39136:2;39132:15;39125:38;38636:584;38772:41;;;38762:51;;;:6;:51;;;;38755:58;;;;;38600:675;39259:4;39252:11;;38429:853;;;;;;;:::o;53894:176::-;53946:13;53972:90;;;;;;;;;;;;;;;;;;;53894:176;:::o;28586:281::-;28659:13;28685:23;28700:7;28685:14;:23::i;:::-;28721:21;28745:10;:8;:10::i;:::-;28721:34;;28797:1;28779:7;28773:21;:25;:86;;;;;;;;;;;;;;;;;28825:7;28834:18;:7;:16;:18::i;:::-;28808:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28773:86;28766:93;;;28586:281;;;:::o;18977:157::-;19062:4;19101:25;19086:40;;;:11;:40;;;;19079:47;;18977:157;;;:::o;45933:589::-;46077:45;46104:4;46110:2;46114:7;46077:26;:45::i;:::-;46155:1;46139:18;;:4;:18;;;46135:187;;;46174:40;46206:7;46174:31;:40::i;:::-;46135:187;;;46244:2;46236:10;;:4;:10;;;46232:90;;46263:47;46296:4;46302:7;46263:32;:47::i;:::-;46232:90;46135:187;46350:1;46336:16;;:2;:16;;;46332:183;;;46369:45;46406:7;46369:36;:45::i;:::-;46332:183;;;46442:4;46436:10;;:2;:10;;;46432:83;;46463:40;46491:2;46495:7;46463:27;:40::i;:::-;46432:83;46332:183;45933:589;;;:::o;34840:439::-;34934:1;34920:16;;:2;:16;;;;34912:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34993:16;35001:7;34993;:16::i;:::-;34992:17;34984:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35055:45;35084:1;35088:2;35092:7;35055:20;:45::i;:::-;35130:1;35113:9;:13;35123:2;35113:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35161:2;35142:7;:16;35150:7;35142:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35206:7;35202:2;35181:33;;35198:1;35181:33;;;;;;;;;;;;35227:44;35255:1;35259:2;35263:7;35227:19;:44::i;:::-;34840:439;;:::o;35508:420::-;35568:13;35584:23;35599:7;35584:14;:23::i;:::-;35568:39;;35620:48;35641:5;35656:1;35660:7;35620:20;:48::i;:::-;35709:29;35726:1;35730:7;35709:8;:29::i;:::-;35771:1;35751:9;:16;35761:5;35751:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;35790:7;:16;35798:7;35790:16;;;;;;;;;;;;35783:23;;;;;;;;;;;35852:7;35848:1;35824:36;;35833:5;35824:36;;;;;;;;;;;;35873:47;35893:5;35908:1;35912:7;35873:19;:47::i;:::-;35557:371;35508:420;:::o;8821:326::-;8881:4;9138:1;9116:7;:19;;;:23;9109:30;;8821:326;;;:::o;1928:723::-;1984:13;2214:1;2205:5;:10;2201:53;;;2232:10;;;;;;;;;;;;;;;;;;;;;2201:53;2264:12;2279:5;2264:20;;2295:14;2320:78;2335:1;2327:4;:9;2320:78;;2353:8;;;;;:::i;:::-;;;;2384:2;2376:10;;;;;:::i;:::-;;;2320:78;;;2408:19;2440:6;2430:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2408:39;;2458:154;2474:1;2465:5;:10;2458:154;;2502:1;2492:11;;;;;:::i;:::-;;;2569:2;2561:5;:10;;;;:::i;:::-;2548:2;:24;;;;:::i;:::-;2535:39;;2518:6;2525;2518:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2598:2;2589:11;;;;;:::i;:::-;;;2458:154;;;2636:6;2622:21;;;;;1928:723;;;;:::o;39854:126::-;;;;:::o;47245:164::-;47349:10;:17;;;;47322:15;:24;47338:7;47322:24;;;;;;;;;;;:44;;;;47377:10;47393:7;47377:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47245:164;:::o;48036:988::-;48302:22;48352:1;48327:22;48344:4;48327:16;:22::i;:::-;:26;;;;:::i;:::-;48302:51;;48364:18;48385:17;:26;48403:7;48385:26;;;;;;;;;;;;48364:47;;48532:14;48518:10;:28;48514:328;;48563:19;48585:12;:18;48598:4;48585:18;;;;;;;;;;;;;;;:34;48604:14;48585:34;;;;;;;;;;;;48563:56;;48669:11;48636:12;:18;48649:4;48636:18;;;;;;;;;;;;;;;:30;48655:10;48636:30;;;;;;;;;;;:44;;;;48786:10;48753:17;:30;48771:11;48753:30;;;;;;;;;;;:43;;;;48548:294;48514:328;48938:17;:26;48956:7;48938:26;;;;;;;;;;;48931:33;;;48982:12;:18;48995:4;48982:18;;;;;;;;;;;;;;;:34;49001:14;48982:34;;;;;;;;;;;48975:41;;;48117:907;;48036:988;;:::o;49319:1079::-;49572:22;49617:1;49597:10;:17;;;;:21;;;;:::i;:::-;49572:46;;49629:18;49650:15;:24;49666:7;49650:24;;;;;;;;;;;;49629:45;;50001:19;50023:10;50034:14;50023:26;;;;;;;;:::i;:::-;;;;;;;;;;50001:48;;50087:11;50062:10;50073;50062:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;50198:10;50167:15;:28;50183:11;50167:28;;;;;;;;;;;:41;;;;50339:15;:24;50355:7;50339:24;;;;;;;;;;;50332:31;;;50374:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;49390:1008;;;49319:1079;:::o;46823:221::-;46908:14;46925:20;46942:2;46925:16;:20::i;:::-;46908:37;;46983:7;46956:12;:16;46969:2;46956:16;;;;;;;;;;;;;;;:24;46973:6;46956:24;;;;;;;;;;;:34;;;;47030:6;47001:17;:26;47019:7;47001:26;;;;;;;;;;;:35;;;;46897:147;46823:221;;:::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:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;761:5;792:6;786:13;777:22;;808:30;832:5;808:30;:::i;:::-;707:137;;;;:::o;850:::-;895:5;933:6;920:20;911:29;;949:32;975:5;949:32;:::i;:::-;850:137;;;;:::o;993:141::-;1049:5;1080:6;1074:13;1065:22;;1096:32;1122:5;1096:32;:::i;:::-;993:141;;;;:::o;1153:338::-;1208:5;1257:3;1250:4;1242:6;1238:17;1234:27;1224:122;;1265:79;;:::i;:::-;1224:122;1382:6;1369:20;1407:78;1481:3;1473:6;1466:4;1458:6;1454:17;1407:78;:::i;:::-;1398:87;;1214:277;1153:338;;;;:::o;1497:139::-;1543:5;1581:6;1568:20;1559:29;;1597:33;1624:5;1597:33;:::i;:::-;1497:139;;;;:::o;1642:329::-;1701:6;1750:2;1738:9;1729:7;1725:23;1721:32;1718:119;;;1756:79;;:::i;:::-;1718:119;1876:1;1901:53;1946:7;1937:6;1926:9;1922:22;1901:53;:::i;:::-;1891:63;;1847:117;1642:329;;;;:::o;1977:474::-;2045:6;2053;2102:2;2090:9;2081:7;2077:23;2073:32;2070:119;;;2108:79;;:::i;:::-;2070:119;2228:1;2253:53;2298:7;2289:6;2278:9;2274:22;2253:53;:::i;:::-;2243:63;;2199:117;2355:2;2381:53;2426:7;2417:6;2406:9;2402:22;2381:53;:::i;:::-;2371:63;;2326:118;1977:474;;;;;:::o;2457:619::-;2534:6;2542;2550;2599:2;2587:9;2578:7;2574:23;2570:32;2567:119;;;2605:79;;:::i;:::-;2567:119;2725:1;2750:53;2795:7;2786:6;2775:9;2771:22;2750:53;:::i;:::-;2740:63;;2696:117;2852:2;2878:53;2923:7;2914:6;2903:9;2899:22;2878:53;:::i;:::-;2868:63;;2823:118;2980:2;3006:53;3051:7;3042:6;3031:9;3027:22;3006:53;:::i;:::-;2996:63;;2951:118;2457:619;;;;;:::o;3082:943::-;3177:6;3185;3193;3201;3250:3;3238:9;3229:7;3225:23;3221:33;3218:120;;;3257:79;;:::i;:::-;3218:120;3377:1;3402:53;3447:7;3438:6;3427:9;3423:22;3402:53;:::i;:::-;3392:63;;3348:117;3504:2;3530:53;3575:7;3566:6;3555:9;3551:22;3530:53;:::i;:::-;3520:63;;3475:118;3632:2;3658:53;3703:7;3694:6;3683:9;3679:22;3658:53;:::i;:::-;3648:63;;3603:118;3788:2;3777:9;3773:18;3760:32;3819:18;3811:6;3808:30;3805:117;;;3841:79;;:::i;:::-;3805:117;3946:62;4000:7;3991:6;3980:9;3976:22;3946:62;:::i;:::-;3936:72;;3731:287;3082:943;;;;;;;:::o;4031:468::-;4096:6;4104;4153:2;4141:9;4132:7;4128:23;4124:32;4121:119;;;4159:79;;:::i;:::-;4121:119;4279:1;4304:53;4349:7;4340:6;4329:9;4325:22;4304:53;:::i;:::-;4294:63;;4250:117;4406:2;4432:50;4474:7;4465:6;4454:9;4450:22;4432:50;:::i;:::-;4422:60;;4377:115;4031:468;;;;;:::o;4505:474::-;4573:6;4581;4630:2;4618:9;4609:7;4605:23;4601:32;4598:119;;;4636:79;;:::i;:::-;4598:119;4756:1;4781:53;4826:7;4817:6;4806:9;4802:22;4781:53;:::i;:::-;4771:63;;4727:117;4883:2;4909:53;4954:7;4945:6;4934:9;4930:22;4909:53;:::i;:::-;4899:63;;4854:118;4505:474;;;;;:::o;4985:345::-;5052:6;5101:2;5089:9;5080:7;5076:23;5072:32;5069:119;;;5107:79;;:::i;:::-;5069:119;5227:1;5252:61;5305:7;5296:6;5285:9;5281:22;5252:61;:::i;:::-;5242:71;;5198:125;4985:345;;;;:::o;5336:327::-;5394:6;5443:2;5431:9;5422:7;5418:23;5414:32;5411:119;;;5449:79;;:::i;:::-;5411:119;5569:1;5594:52;5638:7;5629:6;5618:9;5614:22;5594:52;:::i;:::-;5584:62;;5540:116;5336:327;;;;:::o;5669:349::-;5738:6;5787:2;5775:9;5766:7;5762:23;5758:32;5755:119;;;5793:79;;:::i;:::-;5755:119;5913:1;5938:63;5993:7;5984:6;5973:9;5969:22;5938:63;:::i;:::-;5928:73;;5884:127;5669:349;;;;:::o;6024:329::-;6083:6;6132:2;6120:9;6111:7;6107:23;6103:32;6100:119;;;6138:79;;:::i;:::-;6100:119;6258:1;6283:53;6328:7;6319:6;6308:9;6304:22;6283:53;:::i;:::-;6273:63;;6229:117;6024:329;;;;:::o;6359:118::-;6446:24;6464:5;6446:24;:::i;:::-;6441:3;6434:37;6359:118;;:::o;6483:109::-;6564:21;6579:5;6564:21;:::i;:::-;6559:3;6552:34;6483:109;;:::o;6598:360::-;6684:3;6712:38;6744:5;6712:38;:::i;:::-;6766:70;6829:6;6824:3;6766:70;:::i;:::-;6759:77;;6845:52;6890:6;6885:3;6878:4;6871:5;6867:16;6845:52;:::i;:::-;6922:29;6944:6;6922:29;:::i;:::-;6917:3;6913:39;6906:46;;6688:270;6598:360;;;;:::o;6964:161::-;7066:52;7112:5;7066:52;:::i;:::-;7061:3;7054:65;6964:161;;:::o;7131:364::-;7219:3;7247:39;7280:5;7247:39;:::i;:::-;7302:71;7366:6;7361:3;7302:71;:::i;:::-;7295:78;;7382:52;7427:6;7422:3;7415:4;7408:5;7404:16;7382:52;:::i;:::-;7459:29;7481:6;7459:29;:::i;:::-;7454:3;7450:39;7443:46;;7223:272;7131:364;;;;:::o;7501:377::-;7607:3;7635:39;7668:5;7635:39;:::i;:::-;7690:89;7772:6;7767:3;7690:89;:::i;:::-;7683:96;;7788:52;7833:6;7828:3;7821:4;7814:5;7810:16;7788:52;:::i;:::-;7865:6;7860:3;7856:16;7849:23;;7611:267;7501:377;;;;:::o;7884:366::-;8026:3;8047:67;8111:2;8106:3;8047:67;:::i;:::-;8040:74;;8123:93;8212:3;8123:93;:::i;:::-;8241:2;8236:3;8232:12;8225:19;;7884:366;;;:::o;8256:::-;8398:3;8419:67;8483:2;8478:3;8419:67;:::i;:::-;8412:74;;8495:93;8584:3;8495:93;:::i;:::-;8613:2;8608:3;8604:12;8597:19;;8256:366;;;:::o;8628:::-;8770:3;8791:67;8855:2;8850:3;8791:67;:::i;:::-;8784:74;;8867:93;8956:3;8867:93;:::i;:::-;8985:2;8980:3;8976:12;8969:19;;8628:366;;;:::o;9000:::-;9142:3;9163:67;9227:2;9222:3;9163:67;:::i;:::-;9156:74;;9239:93;9328:3;9239:93;:::i;:::-;9357:2;9352:3;9348:12;9341:19;;9000:366;;;:::o;9372:::-;9514:3;9535:67;9599:2;9594:3;9535:67;:::i;:::-;9528:74;;9611:93;9700:3;9611:93;:::i;:::-;9729:2;9724:3;9720:12;9713:19;;9372:366;;;:::o;9744:::-;9886:3;9907:67;9971:2;9966:3;9907:67;:::i;:::-;9900:74;;9983:93;10072:3;9983:93;:::i;:::-;10101:2;10096:3;10092:12;10085:19;;9744:366;;;:::o;10116:::-;10258:3;10279:67;10343:2;10338:3;10279:67;:::i;:::-;10272:74;;10355:93;10444:3;10355:93;:::i;:::-;10473:2;10468:3;10464:12;10457:19;;10116:366;;;:::o;10488:::-;10630:3;10651:67;10715:2;10710:3;10651:67;:::i;:::-;10644:74;;10727:93;10816:3;10727:93;:::i;:::-;10845:2;10840:3;10836:12;10829:19;;10488:366;;;:::o;10860:::-;11002:3;11023:67;11087:2;11082:3;11023:67;:::i;:::-;11016:74;;11099:93;11188:3;11099:93;:::i;:::-;11217:2;11212:3;11208:12;11201:19;;10860:366;;;:::o;11232:::-;11374:3;11395:67;11459:2;11454:3;11395:67;:::i;:::-;11388:74;;11471:93;11560:3;11471:93;:::i;:::-;11589:2;11584:3;11580:12;11573:19;;11232:366;;;:::o;11604:::-;11746:3;11767:67;11831:2;11826:3;11767:67;:::i;:::-;11760:74;;11843:93;11932:3;11843:93;:::i;:::-;11961:2;11956:3;11952:12;11945:19;;11604:366;;;:::o;11976:::-;12118:3;12139:67;12203:2;12198:3;12139:67;:::i;:::-;12132:74;;12215:93;12304:3;12215:93;:::i;:::-;12333:2;12328:3;12324:12;12317:19;;11976:366;;;:::o;12348:::-;12490:3;12511:67;12575:2;12570:3;12511:67;:::i;:::-;12504:74;;12587:93;12676:3;12587:93;:::i;:::-;12705:2;12700:3;12696:12;12689:19;;12348:366;;;:::o;12720:::-;12862:3;12883:67;12947:2;12942:3;12883:67;:::i;:::-;12876:74;;12959:93;13048:3;12959:93;:::i;:::-;13077:2;13072:3;13068:12;13061:19;;12720:366;;;:::o;13092:::-;13234:3;13255:67;13319:2;13314:3;13255:67;:::i;:::-;13248:74;;13331:93;13420:3;13331:93;:::i;:::-;13449:2;13444:3;13440:12;13433:19;;13092:366;;;:::o;13464:::-;13606:3;13627:67;13691:2;13686:3;13627:67;:::i;:::-;13620:74;;13703:93;13792:3;13703:93;:::i;:::-;13821:2;13816:3;13812:12;13805:19;;13464:366;;;:::o;13836:::-;13978:3;13999:67;14063:2;14058:3;13999:67;:::i;:::-;13992:74;;14075:93;14164:3;14075:93;:::i;:::-;14193:2;14188:3;14184:12;14177:19;;13836:366;;;:::o;14208:::-;14350:3;14371:67;14435:2;14430:3;14371:67;:::i;:::-;14364:74;;14447:93;14536:3;14447:93;:::i;:::-;14565:2;14560:3;14556:12;14549:19;;14208:366;;;:::o;14580:118::-;14667:24;14685:5;14667:24;:::i;:::-;14662:3;14655:37;14580:118;;:::o;14704:435::-;14884:3;14906:95;14997:3;14988:6;14906:95;:::i;:::-;14899:102;;15018:95;15109:3;15100:6;15018:95;:::i;:::-;15011:102;;15130:3;15123:10;;14704:435;;;;;:::o;15145:222::-;15238:4;15276:2;15265:9;15261:18;15253:26;;15289:71;15357:1;15346:9;15342:17;15333:6;15289:71;:::i;:::-;15145:222;;;;:::o;15373:442::-;15522:4;15560:2;15549:9;15545:18;15537:26;;15573:71;15641:1;15630:9;15626:17;15617:6;15573:71;:::i;:::-;15654:72;15722:2;15711:9;15707:18;15698:6;15654:72;:::i;:::-;15736;15804:2;15793:9;15789:18;15780:6;15736:72;:::i;:::-;15373:442;;;;;;:::o;15821:640::-;16016:4;16054:3;16043:9;16039:19;16031:27;;16068:71;16136:1;16125:9;16121:17;16112:6;16068:71;:::i;:::-;16149:72;16217:2;16206:9;16202:18;16193:6;16149:72;:::i;:::-;16231;16299:2;16288:9;16284:18;16275:6;16231:72;:::i;:::-;16350:9;16344:4;16340:20;16335:2;16324:9;16320:18;16313:48;16378:76;16449:4;16440:6;16378:76;:::i;:::-;16370:84;;15821:640;;;;;;;:::o;16467:210::-;16554:4;16592:2;16581:9;16577:18;16569:26;;16605:65;16667:1;16656:9;16652:17;16643:6;16605:65;:::i;:::-;16467:210;;;;:::o;16683:252::-;16791:4;16829:2;16818:9;16814:18;16806:26;;16842:86;16925:1;16914:9;16910:17;16901:6;16842:86;:::i;:::-;16683:252;;;;:::o;16941:313::-;17054:4;17092:2;17081:9;17077:18;17069:26;;17141:9;17135:4;17131:20;17127:1;17116:9;17112:17;17105:47;17169:78;17242:4;17233:6;17169:78;:::i;:::-;17161:86;;16941:313;;;;:::o;17260:419::-;17426:4;17464:2;17453:9;17449:18;17441:26;;17513:9;17507:4;17503:20;17499:1;17488:9;17484:17;17477:47;17541:131;17667:4;17541:131;:::i;:::-;17533:139;;17260:419;;;:::o;17685:::-;17851:4;17889:2;17878:9;17874:18;17866:26;;17938:9;17932:4;17928:20;17924:1;17913:9;17909:17;17902:47;17966:131;18092:4;17966:131;:::i;:::-;17958:139;;17685:419;;;:::o;18110:::-;18276:4;18314:2;18303:9;18299:18;18291:26;;18363:9;18357:4;18353:20;18349:1;18338:9;18334:17;18327:47;18391:131;18517:4;18391:131;:::i;:::-;18383:139;;18110:419;;;:::o;18535:::-;18701:4;18739:2;18728:9;18724:18;18716:26;;18788:9;18782:4;18778:20;18774:1;18763:9;18759:17;18752:47;18816:131;18942:4;18816:131;:::i;:::-;18808:139;;18535:419;;;:::o;18960:::-;19126:4;19164:2;19153:9;19149:18;19141:26;;19213:9;19207:4;19203:20;19199:1;19188:9;19184:17;19177:47;19241:131;19367:4;19241:131;:::i;:::-;19233:139;;18960:419;;;:::o;19385:::-;19551:4;19589:2;19578:9;19574:18;19566:26;;19638:9;19632:4;19628:20;19624:1;19613:9;19609:17;19602:47;19666:131;19792:4;19666:131;:::i;:::-;19658:139;;19385:419;;;:::o;19810:::-;19976:4;20014:2;20003:9;19999:18;19991:26;;20063:9;20057:4;20053:20;20049:1;20038:9;20034:17;20027:47;20091:131;20217:4;20091:131;:::i;:::-;20083:139;;19810:419;;;:::o;20235:::-;20401:4;20439:2;20428:9;20424:18;20416:26;;20488:9;20482:4;20478:20;20474:1;20463:9;20459:17;20452:47;20516:131;20642:4;20516:131;:::i;:::-;20508:139;;20235:419;;;:::o;20660:::-;20826:4;20864:2;20853:9;20849:18;20841:26;;20913:9;20907:4;20903:20;20899:1;20888:9;20884:17;20877:47;20941:131;21067:4;20941:131;:::i;:::-;20933:139;;20660:419;;;:::o;21085:::-;21251:4;21289:2;21278:9;21274:18;21266:26;;21338:9;21332:4;21328:20;21324:1;21313:9;21309:17;21302:47;21366:131;21492:4;21366:131;:::i;:::-;21358:139;;21085:419;;;:::o;21510:::-;21676:4;21714:2;21703:9;21699:18;21691:26;;21763:9;21757:4;21753:20;21749:1;21738:9;21734:17;21727:47;21791:131;21917:4;21791:131;:::i;:::-;21783:139;;21510:419;;;:::o;21935:::-;22101:4;22139:2;22128:9;22124:18;22116:26;;22188:9;22182:4;22178:20;22174:1;22163:9;22159:17;22152:47;22216:131;22342:4;22216:131;:::i;:::-;22208:139;;21935:419;;;:::o;22360:::-;22526:4;22564:2;22553:9;22549:18;22541:26;;22613:9;22607:4;22603:20;22599:1;22588:9;22584:17;22577:47;22641:131;22767:4;22641:131;:::i;:::-;22633:139;;22360:419;;;:::o;22785:::-;22951:4;22989:2;22978:9;22974:18;22966:26;;23038:9;23032:4;23028:20;23024:1;23013:9;23009:17;23002:47;23066:131;23192:4;23066:131;:::i;:::-;23058:139;;22785:419;;;:::o;23210:::-;23376:4;23414:2;23403:9;23399:18;23391:26;;23463:9;23457:4;23453:20;23449:1;23438:9;23434:17;23427:47;23491:131;23617:4;23491:131;:::i;:::-;23483:139;;23210:419;;;:::o;23635:::-;23801:4;23839:2;23828:9;23824:18;23816:26;;23888:9;23882:4;23878:20;23874:1;23863:9;23859:17;23852:47;23916:131;24042:4;23916:131;:::i;:::-;23908:139;;23635:419;;;:::o;24060:::-;24226:4;24264:2;24253:9;24249:18;24241:26;;24313:9;24307:4;24303:20;24299:1;24288:9;24284:17;24277:47;24341:131;24467:4;24341:131;:::i;:::-;24333:139;;24060:419;;;:::o;24485:::-;24651:4;24689:2;24678:9;24674:18;24666:26;;24738:9;24732:4;24728:20;24724:1;24713:9;24709:17;24702:47;24766:131;24892:4;24766:131;:::i;:::-;24758:139;;24485:419;;;:::o;24910:222::-;25003:4;25041:2;25030:9;25026:18;25018:26;;25054:71;25122:1;25111:9;25107:17;25098:6;25054:71;:::i;:::-;24910:222;;;;:::o;25138:129::-;25172:6;25199:20;;:::i;:::-;25189:30;;25228:33;25256:4;25248:6;25228:33;:::i;:::-;25138:129;;;:::o;25273:75::-;25306:6;25339:2;25333:9;25323:19;;25273:75;:::o;25354:307::-;25415:4;25505:18;25497:6;25494:30;25491:56;;;25527:18;;:::i;:::-;25491:56;25565:29;25587:6;25565:29;:::i;:::-;25557:37;;25649:4;25643;25639:15;25631:23;;25354:307;;;:::o;25667:98::-;25718:6;25752:5;25746:12;25736:22;;25667:98;;;:::o;25771:99::-;25823:6;25857:5;25851:12;25841:22;;25771:99;;;:::o;25876:168::-;25959:11;25993:6;25988:3;25981:19;26033:4;26028:3;26024:14;26009:29;;25876:168;;;;:::o;26050:169::-;26134:11;26168:6;26163:3;26156:19;26208:4;26203:3;26199:14;26184:29;;26050:169;;;;:::o;26225:148::-;26327:11;26364:3;26349:18;;26225:148;;;;:::o;26379:305::-;26419:3;26438:20;26456:1;26438:20;:::i;:::-;26433:25;;26472:20;26490:1;26472:20;:::i;:::-;26467:25;;26626:1;26558:66;26554:74;26551:1;26548:81;26545:107;;;26632:18;;:::i;:::-;26545:107;26676:1;26673;26669:9;26662:16;;26379:305;;;;:::o;26690:185::-;26730:1;26747:20;26765:1;26747:20;:::i;:::-;26742:25;;26781:20;26799:1;26781:20;:::i;:::-;26776:25;;26820:1;26810:35;;26825:18;;:::i;:::-;26810:35;26867:1;26864;26860:9;26855:14;;26690:185;;;;:::o;26881:191::-;26921:4;26941:20;26959:1;26941:20;:::i;:::-;26936:25;;26975:20;26993:1;26975:20;:::i;:::-;26970:25;;27014:1;27011;27008:8;27005:34;;;27019:18;;:::i;:::-;27005:34;27064:1;27061;27057:9;27049:17;;26881:191;;;;:::o;27078:96::-;27115:7;27144:24;27162:5;27144:24;:::i;:::-;27133:35;;27078:96;;;:::o;27180:90::-;27214:7;27257:5;27250:13;27243:21;27232:32;;27180:90;;;:::o;27276:149::-;27312:7;27352:66;27345:5;27341:78;27330:89;;27276:149;;;:::o;27431:126::-;27468:7;27508:42;27501:5;27497:54;27486:65;;27431:126;;;:::o;27563:77::-;27600:7;27629:5;27618:16;;27563:77;;;:::o;27646:141::-;27711:9;27744:37;27775:5;27744:37;:::i;:::-;27731:50;;27646:141;;;:::o;27793:126::-;27843:9;27876:37;27907:5;27876:37;:::i;:::-;27863:50;;27793:126;;;:::o;27925:113::-;27975:9;28008:24;28026:5;28008:24;:::i;:::-;27995:37;;27925:113;;;:::o;28044:154::-;28128:6;28123:3;28118;28105:30;28190:1;28181:6;28176:3;28172:16;28165:27;28044:154;;;:::o;28204:307::-;28272:1;28282:113;28296:6;28293:1;28290:13;28282:113;;;28381:1;28376:3;28372:11;28366:18;28362:1;28357:3;28353:11;28346:39;28318:2;28315:1;28311:10;28306:15;;28282:113;;;28413:6;28410:1;28407:13;28404:101;;;28493:1;28484:6;28479:3;28475:16;28468:27;28404:101;28253:258;28204:307;;;:::o;28517:320::-;28561:6;28598:1;28592:4;28588:12;28578:22;;28645:1;28639:4;28635:12;28666:18;28656:81;;28722:4;28714:6;28710:17;28700:27;;28656:81;28784:2;28776:6;28773:14;28753:18;28750:38;28747:84;;;28803:18;;:::i;:::-;28747:84;28568:269;28517:320;;;:::o;28843:281::-;28926:27;28948:4;28926:27;:::i;:::-;28918:6;28914:40;29056:6;29044:10;29041:22;29020:18;29008:10;29005:34;29002:62;28999:88;;;29067:18;;:::i;:::-;28999:88;29107:10;29103:2;29096:22;28886:238;28843:281;;:::o;29130:233::-;29169:3;29192:24;29210:5;29192:24;:::i;:::-;29183:33;;29238:66;29231:5;29228:77;29225:103;;;29308:18;;:::i;:::-;29225:103;29355:1;29348:5;29344:13;29337:20;;29130:233;;;:::o;29369:176::-;29401:1;29418:20;29436:1;29418:20;:::i;:::-;29413:25;;29452:20;29470:1;29452:20;:::i;:::-;29447:25;;29491:1;29481:35;;29496:18;;:::i;:::-;29481:35;29537:1;29534;29530:9;29525:14;;29369:176;;;;:::o;29551:180::-;29599:77;29596:1;29589:88;29696:4;29693:1;29686:15;29720:4;29717:1;29710:15;29737:180;29785:77;29782:1;29775:88;29882:4;29879:1;29872:15;29906:4;29903:1;29896:15;29923:180;29971:77;29968:1;29961:88;30068:4;30065:1;30058:15;30092:4;30089:1;30082:15;30109:180;30157:77;30154:1;30147:88;30254:4;30251:1;30244:15;30278:4;30275:1;30268:15;30295:180;30343:77;30340:1;30333:88;30440:4;30437:1;30430:15;30464:4;30461:1;30454:15;30481:180;30529:77;30526:1;30519:88;30626:4;30623:1;30616:15;30650:4;30647:1;30640:15;30667:117;30776:1;30773;30766:12;30790:117;30899:1;30896;30889:12;30913:117;31022:1;31019;31012:12;31036:117;31145:1;31142;31135:12;31159:102;31200:6;31251:2;31247:7;31242:2;31235:5;31231:14;31227:28;31217:38;;31159:102;;;:::o;31267:160::-;31407:12;31403:1;31395:6;31391:14;31384:36;31267:160;:::o;31433:230::-;31573:34;31569:1;31561:6;31557:14;31550:58;31642:13;31637:2;31629:6;31625:15;31618:38;31433:230;:::o;31669:237::-;31809:34;31805:1;31797:6;31793:14;31786:58;31878:20;31873:2;31865:6;31861:15;31854:45;31669:237;:::o;31912:225::-;32052:34;32048:1;32040:6;32036:14;32029:58;32121:8;32116:2;32108:6;32104:15;32097:33;31912:225;:::o;32143:224::-;32283:34;32279:1;32271:6;32267:14;32260:58;32352:7;32347:2;32339:6;32335:15;32328:32;32143:224;:::o;32373:166::-;32513:18;32509:1;32501:6;32497:14;32490:42;32373:166;:::o;32545:178::-;32685:30;32681:1;32673:6;32669:14;32662:54;32545:178;:::o;32729:223::-;32869:34;32865:1;32857:6;32853:14;32846:58;32938:6;32933:2;32925:6;32921:15;32914:31;32729:223;:::o;32958:175::-;33098:27;33094:1;33086:6;33082:14;33075:51;32958:175;:::o;33139:170::-;33279:22;33275:1;33267:6;33263:14;33256:46;33139:170;:::o;33315:228::-;33455:34;33451:1;33443:6;33439:14;33432:58;33524:11;33519:2;33511:6;33507:15;33500:36;33315:228;:::o;33549:249::-;33689:34;33685:1;33677:6;33673:14;33666:58;33758:32;33753:2;33745:6;33741:15;33734:57;33549:249;:::o;33804:182::-;33944:34;33940:1;33932:6;33928:14;33921:58;33804:182;:::o;33992:::-;34132:34;34128:1;34120:6;34116:14;34109:58;33992:182;:::o;34180:174::-;34320:26;34316:1;34308:6;34304:14;34297:50;34180:174;:::o;34360:220::-;34500:34;34496:1;34488:6;34484:14;34477:58;34569:3;34564:2;34556:6;34552:15;34545:28;34360:220;:::o;34586:231::-;34726:34;34722:1;34714:6;34710:14;34703:58;34795:14;34790:2;34782:6;34778:15;34771:39;34586:231;:::o;34823:233::-;34963:34;34959:1;34951:6;34947:14;34940:58;35032:16;35027:2;35019:6;35015:15;35008:41;34823:233;:::o;35062:122::-;35135:24;35153:5;35135:24;:::i;:::-;35128:5;35125:35;35115:63;;35174:1;35171;35164:12;35115:63;35062:122;:::o;35190:116::-;35260:21;35275:5;35260:21;:::i;:::-;35253:5;35250:32;35240:60;;35296:1;35293;35286:12;35240:60;35190:116;:::o;35312:120::-;35384:23;35401:5;35384:23;:::i;:::-;35377:5;35374:34;35364:62;;35422:1;35419;35412:12;35364:62;35312:120;:::o;35438:122::-;35511:24;35529:5;35511:24;:::i;:::-;35504:5;35501:35;35491:63;;35550:1;35547;35540:12;35491:63;35438:122;:::o
Swarm Source
ipfs://d822334f6441012b10faf58305cdd2dea3b897ef49cb34fd4a83a0df49fd5101