ERC-721
NFT
Overview
Max Total Supply
10,000 LPSD
Holders
52
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 LPSDLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CryptopunkShoe
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-27 */ // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.0 (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/Address.sol // OpenZeppelin Contracts v4.4.0 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.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 `IERC721.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.0 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.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`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.0 (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/utils/Strings.sol // OpenZeppelin Contracts v4.4.0 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts v4.4.0 (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File: @openzeppelin/contracts/utils/cryptography/draft-EIP712.sol // OpenZeppelin Contracts v4.4.0 (utils/cryptography/draft-EIP712.sol) pragma solidity ^0.8.0; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; address private immutable _CACHED_THIS; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _CACHED_THIS = address(this); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.0 (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/security/Pausable.sol // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Pausable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Pausable.sol) pragma solidity ^0.8.0; /** * @dev ERC721 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. */ abstract contract ERC721Pausable is ERC721, Pausable { /** * @dev See {ERC721-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); require(!paused(), "ERC721Pausable: token transfer while paused"); } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Burnable.sol) pragma solidity ^0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly 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), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.0 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts v4.4.0 (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: contracts/luxeto-punk-sneaker.sol pragma solidity ^0.8.0; contract CryptopunkShoe is EIP712, AccessControl, Ownable, ERC721Burnable, ERC721Pausable { bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); string private base_membership_uri = "https://bafybeicq3soejnakreh267azmc7s7jrbeanqn4qz4zp5j5turvrktuw2he.ipfs.dweb.link/"; uint256 total_supply = 10000; address private cryptopunk_contract_address = 0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB; mapping(uint256=>uint256) public already_minted; uint256 public shoe_price = 120000000000000000; // 0.12 ETH address private _receiver; uint256[] private _minted_token_list; mapping(address=>bool) public promo_used; mapping(uint256=>uint256) public token_promo_mapping; function getAllMintedTokens() public view returns (uint256[] memory) { return _minted_token_list; } // no dedup. function getAllOwners() public view returns (address[] memory){ address[] memory ret = new address[](_minted_token_list.length); for (uint256 i = 0; i < _minted_token_list.length; i++) { if (already_minted[_minted_token_list[i]] == 1) { ret[i] = ownerOf(_minted_token_list[i]); } } return ret; } function getAllTokensFromAddress(address account) public view returns (uint256[] memory) { uint256[] memory ret = new uint256[](balanceOf(account)); uint256 j = 0; for (uint256 i = 0; i < _minted_token_list.length; i++) { if (already_minted[_minted_token_list[i]] == 1) { if (ownerOf(_minted_token_list[i]) == account) { ret[j] = _minted_token_list[i]; j = j + 1; } } } return ret; } function burn(uint256 tokenId) public override(ERC721Burnable) { super.burn(tokenId); already_minted[tokenId] = 2; } constructor(string memory name, string memory symbol, address receiver) ERC721(name, symbol) EIP712(name, "1.0.0") { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(MINTER_ROLE, _msgSender()); _receiver = receiver; } function _setMapping(uint256 tokenId) internal { already_minted[tokenId] = 1; _minted_token_list.push(tokenId); } function updatePrice(uint256 price) external onlyOwner { shoe_price = price; } function updateReceiver(address receiver) external onlyOwner { _receiver = receiver; } function updateURI(string memory uri) external onlyOwner { base_membership_uri = uri; } function _baseURI() internal view override virtual returns (string memory) { return base_membership_uri; } function totalSupply() public view returns (uint256) { return total_supply; } function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControl, ERC721) returns (bool) { return super.supportsInterface(interfaceId); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override(ERC721, ERC721Pausable) { super._beforeTokenTransfer(from, to, tokenId); require(!paused(), "ERC721Pausable: token transfer while paused"); } function mintBySignature(address account, uint256 tokenId, bytes calldata signature) external payable { require(already_minted[tokenId] == 0); require(_verify(_hash(account, tokenId), signature), "Invalid signature"); require(msg.value >= shoe_price); payable(_receiver).transfer(msg.value); _safeMint(account, tokenId); _setMapping(tokenId); } function mintByOwner(address account, uint256 tokenId) external onlyOwner { _safeMint(account, tokenId); _setMapping(tokenId); } function mintByMinter(address account, uint256 tokenId) external { require(hasRole(MINTER_ROLE, _msgSender())); _safeMint(account, tokenId); _setMapping(tokenId); } function mintByCryptopunk(address account, uint256 tokenId, uint256 promo, bytes calldata promo_signature) external payable { uint256 new_shoe_price = shoe_price; if (promo_signature.length != 0) { new_shoe_price = shoe_price * _discount_factor(account, tokenId, promo, promo_signature) / 10; } require(already_minted[tokenId] == 0); CryptoPunks c = CryptoPunks(cryptopunk_contract_address); require(c.punkIndexToAddress(tokenId) == account); require(msg.value >= new_shoe_price); payable(_receiver).transfer(msg.value); _safeMint(account, tokenId); _setMapping(tokenId); } function _hash(address account, uint256 tokenId) internal view returns (bytes32) { return _hashTypedDataV4(keccak256(abi.encode( keccak256("NFT(address account,uint256 tokenId)"), account, tokenId ))); } function _discount_factor(address account, uint256 tokenId, uint256 promo, bytes memory promo_signature) internal returns (uint256 discount) { if (hasRole(MINTER_ROLE, ECDSA.recover(_hash(account, 200000), promo_signature))) { token_promo_mapping[tokenId] = promo; return 8; } if (!promo_used[account] && hasRole(MINTER_ROLE, ECDSA.recover(_hash(account, 500000), promo_signature))) { promo_used[account] = true; token_promo_mapping[tokenId] = promo; return 5; } if (!promo_used[account] && hasRole(MINTER_ROLE, ECDSA.recover(_hash(account, 1000000), promo_signature))) { promo_used[account] = true; token_promo_mapping[tokenId] = promo; return 0; } return 10; } function _verify(bytes32 digest, bytes memory signature) internal view returns (bool) { return hasRole(MINTER_ROLE, ECDSA.recover(digest, signature)); } function decodedAddress(address account, uint256 tokenId, bytes calldata signature) external view returns (address) { return ECDSA.recover(_hash(account, tokenId), signature); } } contract CryptoPunks { mapping (uint => address) public punkIndexToAddress; }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"receiver","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"already_minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"decodedAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllMintedTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllOwners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAllTokensFromAddress","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"promo","type":"uint256"},{"internalType":"bytes","name":"promo_signature","type":"bytes"}],"name":"mintByCryptopunk","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mintByMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mintByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mintBySignature","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"promo_used","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shoe_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"token_promo_mapping","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"updatePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"updateReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"updateURI","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101406040526040518060800160405280605381526020016200650460539139600990805190602001906200003692919062000558565b50612710600a5573b47e3cd837ddf8e4c57f05d70ab865de6e193bbb600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506701aa535d3d0c0000600d55348015620000ab57600080fd5b5060405162006557380380620065578339818101604052810190620000d191906200069d565b8282846040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a0818152505062000173818484620002dd60201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508061012081815250505050505050620001df620001d36200031960201b60201c565b6200032160201b60201c565b8160029080519060200190620001f792919062000558565b5080600390805190602001906200021092919062000558565b5050506000600860006101000a81548160ff021916908315150217905550620002526000801b620002466200031960201b60201c565b620003e760201b60201c565b620002937f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620002876200031960201b60201c565b620003e760201b60201c565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050620009ad565b60008383834630604051602001620002fa9594939291906200076a565b6040516020818303038152906040528051906020012090509392505050565b600033905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003f98282620003fd60201b60201c565b5050565b6200040f8282620004ee60201b60201c565b620004ea57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200048f6200031960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8280546200056690620008a4565b90600052602060002090601f0160209004810192826200058a5760008555620005d6565b82601f10620005a557805160ff1916838001178555620005d6565b82800160010185558215620005d6579182015b82811115620005d5578251825591602001919060010190620005b8565b5b509050620005e59190620005e9565b5090565b5b8082111562000604576000816000905550600101620005ea565b5090565b60006200061f6200061984620007f0565b620007c7565b9050828152602081018484840111156200063e576200063d62000973565b5b6200064b8482856200086e565b509392505050565b600081519050620006648162000993565b92915050565b600082601f8301126200068257620006816200096e565b5b81516200069484826020860162000608565b91505092915050565b600080600060608486031215620006b957620006b86200097d565b5b600084015167ffffffffffffffff811115620006da57620006d962000978565b5b620006e8868287016200066a565b935050602084015167ffffffffffffffff8111156200070c576200070b62000978565b5b6200071a868287016200066a565b92505060406200072d8682870162000653565b9150509250925092565b620007428162000826565b82525050565b62000753816200083a565b82525050565b620007648162000864565b82525050565b600060a08201905062000781600083018862000748565b62000790602083018762000748565b6200079f604083018662000748565b620007ae606083018562000759565b620007bd608083018462000737565b9695505050505050565b6000620007d3620007e6565b9050620007e18282620008da565b919050565b6000604051905090565b600067ffffffffffffffff8211156200080e576200080d6200093f565b5b620008198262000982565b9050602081019050919050565b6000620008338262000844565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200088e57808201518184015260208101905062000871565b838111156200089e576000848401525b50505050565b60006002820490506001821680620008bd57607f821691505b60208210811415620008d457620008d362000910565b5b50919050565b620008e58262000982565b810181811067ffffffffffffffff821117156200090757620009066200093f565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6200099e8162000826565b8114620009aa57600080fd5b50565b60805160a05160c05160601c60e0516101005161012051615b0462000a00600039600061398e015260006139d0015260006139af015260006138e40152600061393a015260006139630152615b046000f3fe6080604052600436106102465760003560e01c8063715018a611610139578063c30f4a5a116100b6578063d547741f1161007a578063d547741f146108a3578063daf7757c146108cc578063de7d4502146108e8578063e985e9c514610925578063e9cda9b214610962578063f2fde38b1461099f57610246565b8063c30f4a5a146107b9578063c87b56dd146107e2578063caeff61f1461081f578063d27768021461083b578063d53913931461087857610246565b806395d89b41116100fd57806395d89b41146106d4578063a217fddf146106ff578063a22cb4651461072a578063b21e05c414610753578063b88d4fde1461079057610246565b8063715018a6146106035780637ba2196a1461061a5780638d6cc56d146106435780638da5cb5b1461066c57806391d148541461069757610246565b80633542aee2116101c75780635c975abb1161018b5780635c975abb146104f65780635d5199391461052157806361fc2cbc1461055e5780636352211e1461058957806370a08231146105c657610246565b80633542aee21461042957806336568abe1461045257806342842e0e1461047b57806342966c68146104a457806352491d77146104cd57610246565b806316c127461161020e57806316c127461461034457806318160ddd1461036f57806323b872dd1461039a578063248a9ca3146103c35780632f2ff15d1461040057610246565b806301ffc9a71461024b57806306fdde0314610288578063080b0179146102b3578063081812fc146102de578063095ea7b31461031b575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d919061418c565b6109c8565b60405161027f919061497f565b60405180910390f35b34801561029457600080fd5b5061029d6109da565b6040516102aa9190614a84565b60405180910390f35b3480156102bf57600080fd5b506102c8610a6c565b6040516102d5919061495d565b60405180910390f35b3480156102ea57600080fd5b506103056004803603810190610300919061422f565b610ac4565b60405161031291906148d4565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d9190613fe3565b610b49565b005b34801561035057600080fd5b50610359610c61565b604051610366919061493b565b60405180910390f35b34801561037b57600080fd5b50610384610d8f565b6040516103919190614dc6565b60405180910390f35b3480156103a657600080fd5b506103c160048036038101906103bc9190613ecd565b610d99565b005b3480156103cf57600080fd5b506103ea60048036038101906103e5919061411f565b610df9565b6040516103f7919061499a565b60405180910390f35b34801561040c57600080fd5b506104276004803603810190610422919061414c565b610e18565b005b34801561043557600080fd5b50610450600480360381019061044b9190613fe3565b610e41565b005b34801561045e57600080fd5b506104796004803603810190610474919061414c565b610ed4565b005b34801561048757600080fd5b506104a2600480360381019061049d9190613ecd565b610f57565b005b3480156104b057600080fd5b506104cb60048036038101906104c6919061422f565b610f77565b005b3480156104d957600080fd5b506104f460048036038101906104ef9190613fe3565b610f9c565b005b34801561050257600080fd5b5061050b610fed565b604051610518919061497f565b60405180910390f35b34801561052d57600080fd5b5061054860048036038101906105439190613e33565b611004565b604051610555919061495d565b60405180910390f35b34801561056a57600080fd5b5061057361116d565b6040516105809190614dc6565b60405180910390f35b34801561059557600080fd5b506105b060048036038101906105ab919061422f565b611173565b6040516105bd91906148d4565b60405180910390f35b3480156105d257600080fd5b506105ed60048036038101906105e89190613e33565b611225565b6040516105fa9190614dc6565b60405180910390f35b34801561060f57600080fd5b506106186112dd565b005b34801561062657600080fd5b50610641600480360381019061063c9190613e33565b611365565b005b34801561064f57600080fd5b5061066a6004803603810190610665919061422f565b611425565b005b34801561067857600080fd5b506106816114ab565b60405161068e91906148d4565b60405180910390f35b3480156106a357600080fd5b506106be60048036038101906106b9919061414c565b6114d5565b6040516106cb919061497f565b60405180910390f35b3480156106e057600080fd5b506106e961153f565b6040516106f69190614a84565b60405180910390f35b34801561070b57600080fd5b506107146115d1565b604051610721919061499a565b60405180910390f35b34801561073657600080fd5b50610751600480360381019061074c9190613fa3565b6115d8565b005b34801561075f57600080fd5b5061077a60048036038101906107759190613e33565b6115ee565b604051610787919061497f565b60405180910390f35b34801561079c57600080fd5b506107b760048036038101906107b29190613f20565b61160e565b005b3480156107c557600080fd5b506107e060048036038101906107db91906141e6565b611670565b005b3480156107ee57600080fd5b506108096004803603810190610804919061422f565b611706565b6040516108169190614a84565b60405180910390f35b61083960048036038101906108349190614097565b6117ad565b005b34801561084757600080fd5b50610862600480360381019061085d919061422f565b6119c4565b60405161086f9190614dc6565b60405180910390f35b34801561088457600080fd5b5061088d6119dc565b60405161089a919061499a565b60405180910390f35b3480156108af57600080fd5b506108ca60048036038101906108c5919061414c565b611a00565b005b6108e660048036038101906108e19190614023565b611a29565b005b3480156108f457600080fd5b5061090f600480360381019061090a9190614023565b611b70565b60405161091c91906148d4565b60405180910390f35b34801561093157600080fd5b5061094c60048036038101906109479190613e8d565b611bd3565b604051610959919061497f565b60405180910390f35b34801561096e57600080fd5b506109896004803603810190610984919061422f565b611c67565b6040516109969190614dc6565b60405180910390f35b3480156109ab57600080fd5b506109c660048036038101906109c19190613e33565b611c7f565b005b60006109d382611d77565b9050919050565b6060600280546109e990615129565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1590615129565b8015610a625780601f10610a3757610100808354040283529160200191610a62565b820191906000526020600020905b815481529060010190602001808311610a4557829003601f168201915b5050505050905090565b6060600f805480602002602001604051908101604052809291908181526020018280548015610aba57602002820191906000526020600020905b815481526020019060010190808311610aa6575b5050505050905090565b6000610acf82611e59565b610b0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0590614cc6565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b5482611173565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbc90614d46565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610be4611ec5565b73ffffffffffffffffffffffffffffffffffffffff161480610c135750610c1281610c0d611ec5565b611bd3565b5b610c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4990614c26565b60405180910390fd5b610c5c8383611ecd565b505050565b60606000600f8054905067ffffffffffffffff811115610c8457610c836152fb565b5b604051908082528060200260200182016040528015610cb25781602001602082028036833780820191505090505b50905060005b600f80549050811015610d87576001600c6000600f8481548110610cdf57610cde6152cc565b5b90600052602060002001548152602001908152602001600020541415610d7457610d26600f8281548110610d1657610d156152cc565b5b9060005260206000200154611173565b828281518110610d3957610d386152cc565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b8080610d7f9061518c565b915050610cb8565b508091505090565b6000600a54905090565b610daa610da4611ec5565b82611f86565b610de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de090614d66565b60405180910390fd5b610df4838383612064565b505050565b6000806000838152602001908152602001600020600101549050919050565b610e2182610df9565b610e3281610e2d611ec5565b6122c0565b610e3c838361235d565b505050565b610e49611ec5565b73ffffffffffffffffffffffffffffffffffffffff16610e676114ab565b73ffffffffffffffffffffffffffffffffffffffff1614610ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb490614ce6565b60405180910390fd5b610ec7828261243d565b610ed08161245b565b5050565b610edc611ec5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4090614da6565b60405180910390fd5b610f5382826124a0565b5050565b610f728383836040518060200160405280600081525061160e565b505050565b610f8081612581565b6002600c60008381526020019081526020016000208190555050565b610fcd7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610fc8611ec5565b6114d5565b610fd657600080fd5b610fe0828261243d565b610fe98161245b565b5050565b6000600860009054906101000a900460ff16905090565b6060600061101183611225565b67ffffffffffffffff81111561102a576110296152fb565b5b6040519080825280602002602001820160405280156110585781602001602082028036833780820191505090505b5090506000805b600f80549050811015611162576001600c6000600f8481548110611086576110856152cc565b5b9060005260206000200154815260200190815260200160002054141561114f578473ffffffffffffffffffffffffffffffffffffffff166110e4600f83815481106110d4576110d36152cc565b5b9060005260206000200154611173565b73ffffffffffffffffffffffffffffffffffffffff16141561114e57600f8181548110611114576111136152cc565b5b9060005260206000200154838381518110611132576111316152cc565b5b60200260200101818152505060018261114b9190614f1d565b91505b5b808061115a9061518c565b91505061105f565b508192505050919050565b600d5481565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561121c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121390614c66565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d90614c46565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112e5611ec5565b73ffffffffffffffffffffffffffffffffffffffff166113036114ab565b73ffffffffffffffffffffffffffffffffffffffff1614611359576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135090614ce6565b60405180910390fd5b61136360006125dd565b565b61136d611ec5565b73ffffffffffffffffffffffffffffffffffffffff1661138b6114ab565b73ffffffffffffffffffffffffffffffffffffffff16146113e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d890614ce6565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61142d611ec5565b73ffffffffffffffffffffffffffffffffffffffff1661144b6114ab565b73ffffffffffffffffffffffffffffffffffffffff16146114a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149890614ce6565b60405180910390fd5b80600d8190555050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606003805461154e90615129565b80601f016020809104026020016040519081016040528092919081815260200182805461157a90615129565b80156115c75780601f1061159c576101008083540402835291602001916115c7565b820191906000526020600020905b8154815290600101906020018083116115aa57829003601f168201915b5050505050905090565b6000801b81565b6115ea6115e3611ec5565b83836126a3565b5050565b60106020528060005260406000206000915054906101000a900460ff1681565b61161f611619611ec5565b83611f86565b61165e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165590614d66565b60405180910390fd5b61166a84848484612810565b50505050565b611678611ec5565b73ffffffffffffffffffffffffffffffffffffffff166116966114ab565b73ffffffffffffffffffffffffffffffffffffffff16146116ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e390614ce6565b60405180910390fd5b8060099080519060200190611702929190613bc7565b5050565b606061171182611e59565b611750576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174790614d26565b60405180910390fd5b600061175a61286c565b9050600081511161177a57604051806020016040528060008152506117a5565b80611784846128fe565b60405160200161179592919061483f565b6040516020818303038152906040525b915050919050565b6000600d5490506000838390501461182b57600a61181187878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612a5f565b600d5461181e9190614fa4565b6118289190614f73565b90505b6000600c6000878152602001908152602001600020541461184b57600080fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff166358178168886040518263ffffffff1660e01b81526004016118c29190614dc6565b60206040518083038186803b1580156118da57600080fd5b505afa1580156118ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119129190613e60565b73ffffffffffffffffffffffffffffffffffffffff161461193257600080fd5b8134101561193f57600080fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156119a7573d6000803e3d6000fd5b506119b2878761243d565b6119bb8661245b565b50505050505050565b60116020528060005260406000206000915090505481565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b611a0982610df9565b611a1a81611a15611ec5565b6122c0565b611a2483836124a0565b505050565b6000600c60008581526020019081526020016000205414611a4957600080fd5b611aa0611a568585612cf9565b83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612d56565b611adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad690614bc6565b60405180910390fd5b600d54341015611aee57600080fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611b56573d6000803e3d6000fd5b50611b61848461243d565b611b6a8361245b565b50505050565b6000611bc9611b7f8686612cf9565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612d93565b9050949350505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c6020528060005260406000206000915090505481565b611c87611ec5565b73ffffffffffffffffffffffffffffffffffffffff16611ca56114ab565b73ffffffffffffffffffffffffffffffffffffffff1614611cfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf290614ce6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6290614b46565b60405180910390fd5b611d74816125dd565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e4257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e525750611e5182612dba565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f4083611173565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f9182611e59565b611fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc790614c06565b60405180910390fd5b6000611fdb83611173565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061204a57508373ffffffffffffffffffffffffffffffffffffffff1661203284610ac4565b73ffffffffffffffffffffffffffffffffffffffff16145b8061205b575061205a8185611bd3565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661208482611173565b73ffffffffffffffffffffffffffffffffffffffff16146120da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d190614d06565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561214a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214190614b86565b60405180910390fd5b612155838383612e34565b612160600082611ecd565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121b09190614ffe565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122079190614f1d565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6122ca82826114d5565b612359576122ef8173ffffffffffffffffffffffffffffffffffffffff166014612e8c565b6122fd8360001c6020612e8c565b60405160200161230e92919061489a565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123509190614a84565b60405180910390fd5b5050565b61236782826114d5565b61243957600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506123de611ec5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6124578282604051806020016040528060008152506130c8565b5050565b6001600c600083815260200190815260200160002081905550600f81908060018154018082558091505060019003906000526020600020016000909190919091505550565b6124aa82826114d5565b1561257d57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612522611ec5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b61259261258c611ec5565b82611f86565b6125d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c890614d86565b60405180910390fd5b6125da81613123565b50565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270990614ba6565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612803919061497f565b60405180910390a3505050565b61281b848484612064565b61282784848484613234565b612866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285d90614b26565b60405180910390fd5b50505050565b60606009805461287b90615129565b80601f01602080910402602001604051908101604052809291908181526020018280546128a790615129565b80156128f45780601f106128c9576101008083540402835291602001916128f4565b820191906000526020600020905b8154815290600101906020018083116128d757829003601f168201915b5050505050905090565b60606000821415612946576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a5a565b600082905060005b600082146129785780806129619061518c565b915050600a826129719190614f73565b915061294e565b60008167ffffffffffffffff811115612994576129936152fb565b5b6040519080825280601f01601f1916602001820160405280156129c65781602001600182028036833780820191505090505b5090505b60008514612a53576001826129df9190614ffe565b9150600a856129ee91906151df565b60306129fa9190614f1d565b60f81b818381518110612a1057612a0f6152cc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a4c9190614f73565b94506129ca565b8093505050505b919050565b6000612aa07f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6612a9b612a958862030d40612cf9565b85612d93565b6114d5565b15612ac65782601160008681526020019081526020016000208190555060089050612cf1565b601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612b5b5750612b5a7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6612b55612b4f886207a120612cf9565b85612d93565b6114d5565b5b15612bd9576001601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555082601160008681526020019081526020016000208190555060059050612cf1565b601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612c6e5750612c6d7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6612c68612c6288620f4240612cf9565b85612d93565b6114d5565b5b15612cec576001601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555082601160008681526020019081526020016000208190555060009050612cf1565b600a90505b949350505050565b6000612d4e7f902b030076749a80f1f788dc72d1690ca6ad255658b0f0b0b65ff1dc3c99e9ae8484604051602001612d33939291906149b5565b604051602081830303815290604052805190602001206133cb565b905092915050565b6000612d8b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6612d868585612d93565b6114d5565b905092915050565b6000806000612da285856133e5565b91509150612daf81613468565b819250505092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612e2d5750612e2c8261363d565b5b9050919050565b612e3f8383836136a7565b612e47610fed565b15612e87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7e90614ae6565b60405180910390fd5b505050565b606060006002836002612e9f9190614fa4565b612ea99190614f1d565b67ffffffffffffffff811115612ec257612ec16152fb565b5b6040519080825280601f01601f191660200182016040528015612ef45781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612f2c57612f2b6152cc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612f9057612f8f6152cc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612fd09190614fa4565b612fda9190614f1d565b90505b600181111561307a577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061301c5761301b6152cc565b5b1a60f81b828281518110613033576130326152cc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080613073906150ff565b9050612fdd565b50600084146130be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b590614ac6565b60405180910390fd5b8091505092915050565b6130d283836136ff565b6130df6000848484613234565b61311e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311590614b26565b60405180910390fd5b505050565b600061312e82611173565b905061313c81600084612e34565b613147600083611ecd565b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131979190614ffe565b925050819055506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006132558473ffffffffffffffffffffffffffffffffffffffff166138cd565b156133be578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261327e611ec5565b8786866040518563ffffffff1660e01b81526004016132a094939291906148ef565b602060405180830381600087803b1580156132ba57600080fd5b505af19250505080156132eb57506040513d601f19601f820116820180604052508101906132e891906141b9565b60015b61336e573d806000811461331b576040519150601f19603f3d011682016040523d82523d6000602084013e613320565b606091505b50600081511415613366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335d90614b26565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506133c3565b600190505b949350505050565b60006133de6133d86138e0565b836139fa565b9050919050565b6000806041835114156134275760008060006020860151925060408601519150606086015160001a905061341b87828585613a2d565b94509450505050613461565b60408351141561345857600080602085015191506040850151905061344d868383613b3a565b935093505050613461565b60006002915091505b9250929050565b6000600481111561347c5761347b61526e565b5b81600481111561348f5761348e61526e565b5b141561349a5761363a565b600160048111156134ae576134ad61526e565b5b8160048111156134c1576134c061526e565b5b1415613502576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134f990614aa6565b60405180910390fd5b600260048111156135165761351561526e565b5b8160048111156135295761352861526e565b5b141561356a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161356190614b06565b60405180910390fd5b6003600481111561357e5761357d61526e565b5b8160048111156135915761359061526e565b5b14156135d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135c990614be6565b60405180910390fd5b6004808111156135e5576135e461526e565b5b8160048111156135f8576135f761526e565b5b1415613639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161363090614c86565b60405180910390fd5b5b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6136b2838383613b88565b6136ba610fed565b156136fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136f190614ae6565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561376f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161376690614ca6565b60405180910390fd5b61377881611e59565b156137b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137af90614b66565b60405180910390fd5b6137c460008383612e34565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138149190614f1d565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561395c57507f000000000000000000000000000000000000000000000000000000000000000046145b15613989577f000000000000000000000000000000000000000000000000000000000000000090506139f7565b6139f47f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613b8d565b90505b90565b60008282604051602001613a0f929190614863565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613a68576000600391509150613b31565b601b8560ff1614158015613a805750601c8560ff1614155b15613a92576000600491509150613b31565b600060018787878760405160008152602001604052604051613ab79493929190614a3f565b6020604051602081039080840390855afa158015613ad9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613b2857600060019250925050613b31565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050613b7a87828885613a2d565b935093505050935093915050565b505050565b60008383834630604051602001613ba89594939291906149ec565b6040516020818303038152906040528051906020012090509392505050565b828054613bd390615129565b90600052602060002090601f016020900481019282613bf55760008555613c3c565b82601f10613c0e57805160ff1916838001178555613c3c565b82800160010185558215613c3c579182015b82811115613c3b578251825591602001919060010190613c20565b5b509050613c499190613c4d565b5090565b5b80821115613c66576000816000905550600101613c4e565b5090565b6000613c7d613c7884614e06565b614de1565b905082815260208101848484011115613c9957613c98615339565b5b613ca48482856150bd565b509392505050565b6000613cbf613cba84614e37565b614de1565b905082815260208101848484011115613cdb57613cda615339565b5b613ce68482856150bd565b509392505050565b600081359050613cfd81615a5b565b92915050565b600081519050613d1281615a5b565b92915050565b600081359050613d2781615a72565b92915050565b600081359050613d3c81615a89565b92915050565b600081359050613d5181615aa0565b92915050565b600081519050613d6681615aa0565b92915050565b60008083601f840112613d8257613d8161532f565b5b8235905067ffffffffffffffff811115613d9f57613d9e61532a565b5b602083019150836001820283011115613dbb57613dba615334565b5b9250929050565b600082601f830112613dd757613dd661532f565b5b8135613de7848260208601613c6a565b91505092915050565b600082601f830112613e0557613e0461532f565b5b8135613e15848260208601613cac565b91505092915050565b600081359050613e2d81615ab7565b92915050565b600060208284031215613e4957613e48615343565b5b6000613e5784828501613cee565b91505092915050565b600060208284031215613e7657613e75615343565b5b6000613e8484828501613d03565b91505092915050565b60008060408385031215613ea457613ea3615343565b5b6000613eb285828601613cee565b9250506020613ec385828601613cee565b9150509250929050565b600080600060608486031215613ee657613ee5615343565b5b6000613ef486828701613cee565b9350506020613f0586828701613cee565b9250506040613f1686828701613e1e565b9150509250925092565b60008060008060808587031215613f3a57613f39615343565b5b6000613f4887828801613cee565b9450506020613f5987828801613cee565b9350506040613f6a87828801613e1e565b925050606085013567ffffffffffffffff811115613f8b57613f8a61533e565b5b613f9787828801613dc2565b91505092959194509250565b60008060408385031215613fba57613fb9615343565b5b6000613fc885828601613cee565b9250506020613fd985828601613d18565b9150509250929050565b60008060408385031215613ffa57613ff9615343565b5b600061400885828601613cee565b925050602061401985828601613e1e565b9150509250929050565b6000806000806060858703121561403d5761403c615343565b5b600061404b87828801613cee565b945050602061405c87828801613e1e565b935050604085013567ffffffffffffffff81111561407d5761407c61533e565b5b61408987828801613d6c565b925092505092959194509250565b6000806000806000608086880312156140b3576140b2615343565b5b60006140c188828901613cee565b95505060206140d288828901613e1e565b94505060406140e388828901613e1e565b935050606086013567ffffffffffffffff8111156141045761410361533e565b5b61411088828901613d6c565b92509250509295509295909350565b60006020828403121561413557614134615343565b5b600061414384828501613d2d565b91505092915050565b6000806040838503121561416357614162615343565b5b600061417185828601613d2d565b925050602061418285828601613cee565b9150509250929050565b6000602082840312156141a2576141a1615343565b5b60006141b084828501613d42565b91505092915050565b6000602082840312156141cf576141ce615343565b5b60006141dd84828501613d57565b91505092915050565b6000602082840312156141fc576141fb615343565b5b600082013567ffffffffffffffff81111561421a5761421961533e565b5b61422684828501613df0565b91505092915050565b60006020828403121561424557614244615343565b5b600061425384828501613e1e565b91505092915050565b6000614268838361428c565b60208301905092915050565b60006142808383614812565b60208301905092915050565b61429581615032565b82525050565b6142a481615032565b82525050565b60006142b582614e88565b6142bf8185614ece565b93506142ca83614e68565b8060005b838110156142fb5781516142e2888261425c565b97506142ed83614eb4565b9250506001810190506142ce565b5085935050505092915050565b600061431382614e93565b61431d8185614edf565b935061432883614e78565b8060005b838110156143595781516143408882614274565b975061434b83614ec1565b92505060018101905061432c565b5085935050505092915050565b61436f81615044565b82525050565b61437e81615050565b82525050565b61439561439082615050565b6151d5565b82525050565b60006143a682614e9e565b6143b08185614ef0565b93506143c08185602086016150cc565b6143c981615348565b840191505092915050565b60006143df82614ea9565b6143e98185614f01565b93506143f98185602086016150cc565b61440281615348565b840191505092915050565b600061441882614ea9565b6144228185614f12565b93506144328185602086016150cc565b80840191505092915050565b600061444b601883614f01565b915061445682615359565b602082019050919050565b600061446e602083614f01565b915061447982615382565b602082019050919050565b6000614491602b83614f01565b915061449c826153ab565b604082019050919050565b60006144b4601f83614f01565b91506144bf826153fa565b602082019050919050565b60006144d7603283614f01565b91506144e282615423565b604082019050919050565b60006144fa602683614f01565b915061450582615472565b604082019050919050565b600061451d601c83614f01565b9150614528826154c1565b602082019050919050565b6000614540600283614f12565b915061454b826154ea565b600282019050919050565b6000614563602483614f01565b915061456e82615513565b604082019050919050565b6000614586601983614f01565b915061459182615562565b602082019050919050565b60006145a9601183614f01565b91506145b48261558b565b602082019050919050565b60006145cc602283614f01565b91506145d7826155b4565b604082019050919050565b60006145ef602c83614f01565b91506145fa82615603565b604082019050919050565b6000614612603883614f01565b915061461d82615652565b604082019050919050565b6000614635602a83614f01565b9150614640826156a1565b604082019050919050565b6000614658602983614f01565b9150614663826156f0565b604082019050919050565b600061467b602283614f01565b91506146868261573f565b604082019050919050565b600061469e602083614f01565b91506146a98261578e565b602082019050919050565b60006146c1602c83614f01565b91506146cc826157b7565b604082019050919050565b60006146e4602083614f01565b91506146ef82615806565b602082019050919050565b6000614707602983614f01565b91506147128261582f565b604082019050919050565b600061472a602f83614f01565b91506147358261587e565b604082019050919050565b600061474d602183614f01565b9150614758826158cd565b604082019050919050565b6000614770603183614f01565b915061477b8261591c565b604082019050919050565b6000614793601783614f12565b915061479e8261596b565b601782019050919050565b60006147b6603083614f01565b91506147c182615994565b604082019050919050565b60006147d9601183614f12565b91506147e4826159e3565b601182019050919050565b60006147fc602f83614f01565b915061480782615a0c565b604082019050919050565b61481b816150a6565b82525050565b61482a816150a6565b82525050565b614839816150b0565b82525050565b600061484b828561440d565b9150614857828461440d565b91508190509392505050565b600061486e82614533565b915061487a8285614384565b60208201915061488a8284614384565b6020820191508190509392505050565b60006148a582614786565b91506148b1828561440d565b91506148bc826147cc565b91506148c8828461440d565b91508190509392505050565b60006020820190506148e9600083018461429b565b92915050565b6000608082019050614904600083018761429b565b614911602083018661429b565b61491e6040830185614821565b8181036060830152614930818461439b565b905095945050505050565b6000602082019050818103600083015261495581846142aa565b905092915050565b600060208201905081810360008301526149778184614308565b905092915050565b60006020820190506149946000830184614366565b92915050565b60006020820190506149af6000830184614375565b92915050565b60006060820190506149ca6000830186614375565b6149d7602083018561429b565b6149e46040830184614821565b949350505050565b600060a082019050614a016000830188614375565b614a0e6020830187614375565b614a1b6040830186614375565b614a286060830185614821565b614a35608083018461429b565b9695505050505050565b6000608082019050614a546000830187614375565b614a616020830186614830565b614a6e6040830185614375565b614a7b6060830184614375565b95945050505050565b60006020820190508181036000830152614a9e81846143d4565b905092915050565b60006020820190508181036000830152614abf8161443e565b9050919050565b60006020820190508181036000830152614adf81614461565b9050919050565b60006020820190508181036000830152614aff81614484565b9050919050565b60006020820190508181036000830152614b1f816144a7565b9050919050565b60006020820190508181036000830152614b3f816144ca565b9050919050565b60006020820190508181036000830152614b5f816144ed565b9050919050565b60006020820190508181036000830152614b7f81614510565b9050919050565b60006020820190508181036000830152614b9f81614556565b9050919050565b60006020820190508181036000830152614bbf81614579565b9050919050565b60006020820190508181036000830152614bdf8161459c565b9050919050565b60006020820190508181036000830152614bff816145bf565b9050919050565b60006020820190508181036000830152614c1f816145e2565b9050919050565b60006020820190508181036000830152614c3f81614605565b9050919050565b60006020820190508181036000830152614c5f81614628565b9050919050565b60006020820190508181036000830152614c7f8161464b565b9050919050565b60006020820190508181036000830152614c9f8161466e565b9050919050565b60006020820190508181036000830152614cbf81614691565b9050919050565b60006020820190508181036000830152614cdf816146b4565b9050919050565b60006020820190508181036000830152614cff816146d7565b9050919050565b60006020820190508181036000830152614d1f816146fa565b9050919050565b60006020820190508181036000830152614d3f8161471d565b9050919050565b60006020820190508181036000830152614d5f81614740565b9050919050565b60006020820190508181036000830152614d7f81614763565b9050919050565b60006020820190508181036000830152614d9f816147a9565b9050919050565b60006020820190508181036000830152614dbf816147ef565b9050919050565b6000602082019050614ddb6000830184614821565b92915050565b6000614deb614dfc565b9050614df7828261515b565b919050565b6000604051905090565b600067ffffffffffffffff821115614e2157614e206152fb565b5b614e2a82615348565b9050602081019050919050565b600067ffffffffffffffff821115614e5257614e516152fb565b5b614e5b82615348565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f28826150a6565b9150614f33836150a6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f6857614f67615210565b5b828201905092915050565b6000614f7e826150a6565b9150614f89836150a6565b925082614f9957614f9861523f565b5b828204905092915050565b6000614faf826150a6565b9150614fba836150a6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ff357614ff2615210565b5b828202905092915050565b6000615009826150a6565b9150615014836150a6565b92508282101561502757615026615210565b5b828203905092915050565b600061503d82615086565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156150ea5780820151818401526020810190506150cf565b838111156150f9576000848401525b50505050565b600061510a826150a6565b9150600082141561511e5761511d615210565b5b600182039050919050565b6000600282049050600182168061514157607f821691505b602082108114156151555761515461529d565b5b50919050565b61516482615348565b810181811067ffffffffffffffff82111715615183576151826152fb565b5b80604052505050565b6000615197826150a6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156151ca576151c9615210565b5b600182019050919050565b6000819050919050565b60006151ea826150a6565b91506151f5836150a6565b9250826152055761520461523f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f496e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b615a6481615032565b8114615a6f57600080fd5b50565b615a7b81615044565b8114615a8657600080fd5b50565b615a9281615050565b8114615a9d57600080fd5b50565b615aa98161505a565b8114615ab457600080fd5b50565b615ac0816150a6565b8114615acb57600080fd5b5056fea264697066735822122074f7d7a7e6840b3025a1acc34868657988846c4888e72b1d625a8f5bb9f0c6f064736f6c6343000807003368747470733a2f2f62616679626569637133736f656a6e616b726568323637617a6d633773376a726265616e716e34717a347a70356a3574757276726b7475773268652e697066732e647765622e6c696e6b2f000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000015eb66b35586f94a1df04850ebab49560a1c07ff00000000000000000000000000000000000000000000000000000000000000134c757865746f2050756e6b20536e65616b65720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044c50534400000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102465760003560e01c8063715018a611610139578063c30f4a5a116100b6578063d547741f1161007a578063d547741f146108a3578063daf7757c146108cc578063de7d4502146108e8578063e985e9c514610925578063e9cda9b214610962578063f2fde38b1461099f57610246565b8063c30f4a5a146107b9578063c87b56dd146107e2578063caeff61f1461081f578063d27768021461083b578063d53913931461087857610246565b806395d89b41116100fd57806395d89b41146106d4578063a217fddf146106ff578063a22cb4651461072a578063b21e05c414610753578063b88d4fde1461079057610246565b8063715018a6146106035780637ba2196a1461061a5780638d6cc56d146106435780638da5cb5b1461066c57806391d148541461069757610246565b80633542aee2116101c75780635c975abb1161018b5780635c975abb146104f65780635d5199391461052157806361fc2cbc1461055e5780636352211e1461058957806370a08231146105c657610246565b80633542aee21461042957806336568abe1461045257806342842e0e1461047b57806342966c68146104a457806352491d77146104cd57610246565b806316c127461161020e57806316c127461461034457806318160ddd1461036f57806323b872dd1461039a578063248a9ca3146103c35780632f2ff15d1461040057610246565b806301ffc9a71461024b57806306fdde0314610288578063080b0179146102b3578063081812fc146102de578063095ea7b31461031b575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d919061418c565b6109c8565b60405161027f919061497f565b60405180910390f35b34801561029457600080fd5b5061029d6109da565b6040516102aa9190614a84565b60405180910390f35b3480156102bf57600080fd5b506102c8610a6c565b6040516102d5919061495d565b60405180910390f35b3480156102ea57600080fd5b506103056004803603810190610300919061422f565b610ac4565b60405161031291906148d4565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d9190613fe3565b610b49565b005b34801561035057600080fd5b50610359610c61565b604051610366919061493b565b60405180910390f35b34801561037b57600080fd5b50610384610d8f565b6040516103919190614dc6565b60405180910390f35b3480156103a657600080fd5b506103c160048036038101906103bc9190613ecd565b610d99565b005b3480156103cf57600080fd5b506103ea60048036038101906103e5919061411f565b610df9565b6040516103f7919061499a565b60405180910390f35b34801561040c57600080fd5b506104276004803603810190610422919061414c565b610e18565b005b34801561043557600080fd5b50610450600480360381019061044b9190613fe3565b610e41565b005b34801561045e57600080fd5b506104796004803603810190610474919061414c565b610ed4565b005b34801561048757600080fd5b506104a2600480360381019061049d9190613ecd565b610f57565b005b3480156104b057600080fd5b506104cb60048036038101906104c6919061422f565b610f77565b005b3480156104d957600080fd5b506104f460048036038101906104ef9190613fe3565b610f9c565b005b34801561050257600080fd5b5061050b610fed565b604051610518919061497f565b60405180910390f35b34801561052d57600080fd5b5061054860048036038101906105439190613e33565b611004565b604051610555919061495d565b60405180910390f35b34801561056a57600080fd5b5061057361116d565b6040516105809190614dc6565b60405180910390f35b34801561059557600080fd5b506105b060048036038101906105ab919061422f565b611173565b6040516105bd91906148d4565b60405180910390f35b3480156105d257600080fd5b506105ed60048036038101906105e89190613e33565b611225565b6040516105fa9190614dc6565b60405180910390f35b34801561060f57600080fd5b506106186112dd565b005b34801561062657600080fd5b50610641600480360381019061063c9190613e33565b611365565b005b34801561064f57600080fd5b5061066a6004803603810190610665919061422f565b611425565b005b34801561067857600080fd5b506106816114ab565b60405161068e91906148d4565b60405180910390f35b3480156106a357600080fd5b506106be60048036038101906106b9919061414c565b6114d5565b6040516106cb919061497f565b60405180910390f35b3480156106e057600080fd5b506106e961153f565b6040516106f69190614a84565b60405180910390f35b34801561070b57600080fd5b506107146115d1565b604051610721919061499a565b60405180910390f35b34801561073657600080fd5b50610751600480360381019061074c9190613fa3565b6115d8565b005b34801561075f57600080fd5b5061077a60048036038101906107759190613e33565b6115ee565b604051610787919061497f565b60405180910390f35b34801561079c57600080fd5b506107b760048036038101906107b29190613f20565b61160e565b005b3480156107c557600080fd5b506107e060048036038101906107db91906141e6565b611670565b005b3480156107ee57600080fd5b506108096004803603810190610804919061422f565b611706565b6040516108169190614a84565b60405180910390f35b61083960048036038101906108349190614097565b6117ad565b005b34801561084757600080fd5b50610862600480360381019061085d919061422f565b6119c4565b60405161086f9190614dc6565b60405180910390f35b34801561088457600080fd5b5061088d6119dc565b60405161089a919061499a565b60405180910390f35b3480156108af57600080fd5b506108ca60048036038101906108c5919061414c565b611a00565b005b6108e660048036038101906108e19190614023565b611a29565b005b3480156108f457600080fd5b5061090f600480360381019061090a9190614023565b611b70565b60405161091c91906148d4565b60405180910390f35b34801561093157600080fd5b5061094c60048036038101906109479190613e8d565b611bd3565b604051610959919061497f565b60405180910390f35b34801561096e57600080fd5b506109896004803603810190610984919061422f565b611c67565b6040516109969190614dc6565b60405180910390f35b3480156109ab57600080fd5b506109c660048036038101906109c19190613e33565b611c7f565b005b60006109d382611d77565b9050919050565b6060600280546109e990615129565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1590615129565b8015610a625780601f10610a3757610100808354040283529160200191610a62565b820191906000526020600020905b815481529060010190602001808311610a4557829003601f168201915b5050505050905090565b6060600f805480602002602001604051908101604052809291908181526020018280548015610aba57602002820191906000526020600020905b815481526020019060010190808311610aa6575b5050505050905090565b6000610acf82611e59565b610b0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0590614cc6565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b5482611173565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbc90614d46565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610be4611ec5565b73ffffffffffffffffffffffffffffffffffffffff161480610c135750610c1281610c0d611ec5565b611bd3565b5b610c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4990614c26565b60405180910390fd5b610c5c8383611ecd565b505050565b60606000600f8054905067ffffffffffffffff811115610c8457610c836152fb565b5b604051908082528060200260200182016040528015610cb25781602001602082028036833780820191505090505b50905060005b600f80549050811015610d87576001600c6000600f8481548110610cdf57610cde6152cc565b5b90600052602060002001548152602001908152602001600020541415610d7457610d26600f8281548110610d1657610d156152cc565b5b9060005260206000200154611173565b828281518110610d3957610d386152cc565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b8080610d7f9061518c565b915050610cb8565b508091505090565b6000600a54905090565b610daa610da4611ec5565b82611f86565b610de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de090614d66565b60405180910390fd5b610df4838383612064565b505050565b6000806000838152602001908152602001600020600101549050919050565b610e2182610df9565b610e3281610e2d611ec5565b6122c0565b610e3c838361235d565b505050565b610e49611ec5565b73ffffffffffffffffffffffffffffffffffffffff16610e676114ab565b73ffffffffffffffffffffffffffffffffffffffff1614610ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb490614ce6565b60405180910390fd5b610ec7828261243d565b610ed08161245b565b5050565b610edc611ec5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4090614da6565b60405180910390fd5b610f5382826124a0565b5050565b610f728383836040518060200160405280600081525061160e565b505050565b610f8081612581565b6002600c60008381526020019081526020016000208190555050565b610fcd7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610fc8611ec5565b6114d5565b610fd657600080fd5b610fe0828261243d565b610fe98161245b565b5050565b6000600860009054906101000a900460ff16905090565b6060600061101183611225565b67ffffffffffffffff81111561102a576110296152fb565b5b6040519080825280602002602001820160405280156110585781602001602082028036833780820191505090505b5090506000805b600f80549050811015611162576001600c6000600f8481548110611086576110856152cc565b5b9060005260206000200154815260200190815260200160002054141561114f578473ffffffffffffffffffffffffffffffffffffffff166110e4600f83815481106110d4576110d36152cc565b5b9060005260206000200154611173565b73ffffffffffffffffffffffffffffffffffffffff16141561114e57600f8181548110611114576111136152cc565b5b9060005260206000200154838381518110611132576111316152cc565b5b60200260200101818152505060018261114b9190614f1d565b91505b5b808061115a9061518c565b91505061105f565b508192505050919050565b600d5481565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561121c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121390614c66565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128d90614c46565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112e5611ec5565b73ffffffffffffffffffffffffffffffffffffffff166113036114ab565b73ffffffffffffffffffffffffffffffffffffffff1614611359576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135090614ce6565b60405180910390fd5b61136360006125dd565b565b61136d611ec5565b73ffffffffffffffffffffffffffffffffffffffff1661138b6114ab565b73ffffffffffffffffffffffffffffffffffffffff16146113e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d890614ce6565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61142d611ec5565b73ffffffffffffffffffffffffffffffffffffffff1661144b6114ab565b73ffffffffffffffffffffffffffffffffffffffff16146114a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149890614ce6565b60405180910390fd5b80600d8190555050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606003805461154e90615129565b80601f016020809104026020016040519081016040528092919081815260200182805461157a90615129565b80156115c75780601f1061159c576101008083540402835291602001916115c7565b820191906000526020600020905b8154815290600101906020018083116115aa57829003601f168201915b5050505050905090565b6000801b81565b6115ea6115e3611ec5565b83836126a3565b5050565b60106020528060005260406000206000915054906101000a900460ff1681565b61161f611619611ec5565b83611f86565b61165e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165590614d66565b60405180910390fd5b61166a84848484612810565b50505050565b611678611ec5565b73ffffffffffffffffffffffffffffffffffffffff166116966114ab565b73ffffffffffffffffffffffffffffffffffffffff16146116ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e390614ce6565b60405180910390fd5b8060099080519060200190611702929190613bc7565b5050565b606061171182611e59565b611750576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174790614d26565b60405180910390fd5b600061175a61286c565b9050600081511161177a57604051806020016040528060008152506117a5565b80611784846128fe565b60405160200161179592919061483f565b6040516020818303038152906040525b915050919050565b6000600d5490506000838390501461182b57600a61181187878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612a5f565b600d5461181e9190614fa4565b6118289190614f73565b90505b6000600c6000878152602001908152602001600020541461184b57600080fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff166358178168886040518263ffffffff1660e01b81526004016118c29190614dc6565b60206040518083038186803b1580156118da57600080fd5b505afa1580156118ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119129190613e60565b73ffffffffffffffffffffffffffffffffffffffff161461193257600080fd5b8134101561193f57600080fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156119a7573d6000803e3d6000fd5b506119b2878761243d565b6119bb8661245b565b50505050505050565b60116020528060005260406000206000915090505481565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b611a0982610df9565b611a1a81611a15611ec5565b6122c0565b611a2483836124a0565b505050565b6000600c60008581526020019081526020016000205414611a4957600080fd5b611aa0611a568585612cf9565b83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612d56565b611adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad690614bc6565b60405180910390fd5b600d54341015611aee57600080fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611b56573d6000803e3d6000fd5b50611b61848461243d565b611b6a8361245b565b50505050565b6000611bc9611b7f8686612cf9565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612d93565b9050949350505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c6020528060005260406000206000915090505481565b611c87611ec5565b73ffffffffffffffffffffffffffffffffffffffff16611ca56114ab565b73ffffffffffffffffffffffffffffffffffffffff1614611cfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf290614ce6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6290614b46565b60405180910390fd5b611d74816125dd565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e4257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e525750611e5182612dba565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f4083611173565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f9182611e59565b611fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc790614c06565b60405180910390fd5b6000611fdb83611173565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061204a57508373ffffffffffffffffffffffffffffffffffffffff1661203284610ac4565b73ffffffffffffffffffffffffffffffffffffffff16145b8061205b575061205a8185611bd3565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661208482611173565b73ffffffffffffffffffffffffffffffffffffffff16146120da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d190614d06565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561214a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214190614b86565b60405180910390fd5b612155838383612e34565b612160600082611ecd565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121b09190614ffe565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122079190614f1d565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6122ca82826114d5565b612359576122ef8173ffffffffffffffffffffffffffffffffffffffff166014612e8c565b6122fd8360001c6020612e8c565b60405160200161230e92919061489a565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123509190614a84565b60405180910390fd5b5050565b61236782826114d5565b61243957600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506123de611ec5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6124578282604051806020016040528060008152506130c8565b5050565b6001600c600083815260200190815260200160002081905550600f81908060018154018082558091505060019003906000526020600020016000909190919091505550565b6124aa82826114d5565b1561257d57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612522611ec5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b61259261258c611ec5565b82611f86565b6125d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c890614d86565b60405180910390fd5b6125da81613123565b50565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270990614ba6565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612803919061497f565b60405180910390a3505050565b61281b848484612064565b61282784848484613234565b612866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285d90614b26565b60405180910390fd5b50505050565b60606009805461287b90615129565b80601f01602080910402602001604051908101604052809291908181526020018280546128a790615129565b80156128f45780601f106128c9576101008083540402835291602001916128f4565b820191906000526020600020905b8154815290600101906020018083116128d757829003601f168201915b5050505050905090565b60606000821415612946576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a5a565b600082905060005b600082146129785780806129619061518c565b915050600a826129719190614f73565b915061294e565b60008167ffffffffffffffff811115612994576129936152fb565b5b6040519080825280601f01601f1916602001820160405280156129c65781602001600182028036833780820191505090505b5090505b60008514612a53576001826129df9190614ffe565b9150600a856129ee91906151df565b60306129fa9190614f1d565b60f81b818381518110612a1057612a0f6152cc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a4c9190614f73565b94506129ca565b8093505050505b919050565b6000612aa07f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6612a9b612a958862030d40612cf9565b85612d93565b6114d5565b15612ac65782601160008681526020019081526020016000208190555060089050612cf1565b601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612b5b5750612b5a7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6612b55612b4f886207a120612cf9565b85612d93565b6114d5565b5b15612bd9576001601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555082601160008681526020019081526020016000208190555060059050612cf1565b601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612c6e5750612c6d7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6612c68612c6288620f4240612cf9565b85612d93565b6114d5565b5b15612cec576001601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555082601160008681526020019081526020016000208190555060009050612cf1565b600a90505b949350505050565b6000612d4e7f902b030076749a80f1f788dc72d1690ca6ad255658b0f0b0b65ff1dc3c99e9ae8484604051602001612d33939291906149b5565b604051602081830303815290604052805190602001206133cb565b905092915050565b6000612d8b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6612d868585612d93565b6114d5565b905092915050565b6000806000612da285856133e5565b91509150612daf81613468565b819250505092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612e2d5750612e2c8261363d565b5b9050919050565b612e3f8383836136a7565b612e47610fed565b15612e87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7e90614ae6565b60405180910390fd5b505050565b606060006002836002612e9f9190614fa4565b612ea99190614f1d565b67ffffffffffffffff811115612ec257612ec16152fb565b5b6040519080825280601f01601f191660200182016040528015612ef45781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612f2c57612f2b6152cc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612f9057612f8f6152cc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612fd09190614fa4565b612fda9190614f1d565b90505b600181111561307a577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061301c5761301b6152cc565b5b1a60f81b828281518110613033576130326152cc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080613073906150ff565b9050612fdd565b50600084146130be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b590614ac6565b60405180910390fd5b8091505092915050565b6130d283836136ff565b6130df6000848484613234565b61311e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311590614b26565b60405180910390fd5b505050565b600061312e82611173565b905061313c81600084612e34565b613147600083611ecd565b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131979190614ffe565b925050819055506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006132558473ffffffffffffffffffffffffffffffffffffffff166138cd565b156133be578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261327e611ec5565b8786866040518563ffffffff1660e01b81526004016132a094939291906148ef565b602060405180830381600087803b1580156132ba57600080fd5b505af19250505080156132eb57506040513d601f19601f820116820180604052508101906132e891906141b9565b60015b61336e573d806000811461331b576040519150601f19603f3d011682016040523d82523d6000602084013e613320565b606091505b50600081511415613366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335d90614b26565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506133c3565b600190505b949350505050565b60006133de6133d86138e0565b836139fa565b9050919050565b6000806041835114156134275760008060006020860151925060408601519150606086015160001a905061341b87828585613a2d565b94509450505050613461565b60408351141561345857600080602085015191506040850151905061344d868383613b3a565b935093505050613461565b60006002915091505b9250929050565b6000600481111561347c5761347b61526e565b5b81600481111561348f5761348e61526e565b5b141561349a5761363a565b600160048111156134ae576134ad61526e565b5b8160048111156134c1576134c061526e565b5b1415613502576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134f990614aa6565b60405180910390fd5b600260048111156135165761351561526e565b5b8160048111156135295761352861526e565b5b141561356a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161356190614b06565b60405180910390fd5b6003600481111561357e5761357d61526e565b5b8160048111156135915761359061526e565b5b14156135d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135c990614be6565b60405180910390fd5b6004808111156135e5576135e461526e565b5b8160048111156135f8576135f761526e565b5b1415613639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161363090614c86565b60405180910390fd5b5b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6136b2838383613b88565b6136ba610fed565b156136fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136f190614ae6565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561376f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161376690614ca6565b60405180910390fd5b61377881611e59565b156137b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137af90614b66565b60405180910390fd5b6137c460008383612e34565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138149190614f1d565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60007f000000000000000000000000f152e743a6773fc65d3ec1a4e10db5da7d249d2973ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561395c57507f000000000000000000000000000000000000000000000000000000000000000146145b15613989577fc762ef6807a2f88a3504222c7f8025a4337b6e54abb2fc6e4df533fa8727118f90506139f7565b6139f47f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7feacaa7875384e6dffdb3734c7205ac799e248fc0539ea33812c25e5c8d727c307f06c015bd22b4c69690933c1058878ebdfef31f9aaae40bbe86d8a09fe1b2972c613b8d565b90505b90565b60008282604051602001613a0f929190614863565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613a68576000600391509150613b31565b601b8560ff1614158015613a805750601c8560ff1614155b15613a92576000600491509150613b31565b600060018787878760405160008152602001604052604051613ab79493929190614a3f565b6020604051602081039080840390855afa158015613ad9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613b2857600060019250925050613b31565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050613b7a87828885613a2d565b935093505050935093915050565b505050565b60008383834630604051602001613ba89594939291906149ec565b6040516020818303038152906040528051906020012090509392505050565b828054613bd390615129565b90600052602060002090601f016020900481019282613bf55760008555613c3c565b82601f10613c0e57805160ff1916838001178555613c3c565b82800160010185558215613c3c579182015b82811115613c3b578251825591602001919060010190613c20565b5b509050613c499190613c4d565b5090565b5b80821115613c66576000816000905550600101613c4e565b5090565b6000613c7d613c7884614e06565b614de1565b905082815260208101848484011115613c9957613c98615339565b5b613ca48482856150bd565b509392505050565b6000613cbf613cba84614e37565b614de1565b905082815260208101848484011115613cdb57613cda615339565b5b613ce68482856150bd565b509392505050565b600081359050613cfd81615a5b565b92915050565b600081519050613d1281615a5b565b92915050565b600081359050613d2781615a72565b92915050565b600081359050613d3c81615a89565b92915050565b600081359050613d5181615aa0565b92915050565b600081519050613d6681615aa0565b92915050565b60008083601f840112613d8257613d8161532f565b5b8235905067ffffffffffffffff811115613d9f57613d9e61532a565b5b602083019150836001820283011115613dbb57613dba615334565b5b9250929050565b600082601f830112613dd757613dd661532f565b5b8135613de7848260208601613c6a565b91505092915050565b600082601f830112613e0557613e0461532f565b5b8135613e15848260208601613cac565b91505092915050565b600081359050613e2d81615ab7565b92915050565b600060208284031215613e4957613e48615343565b5b6000613e5784828501613cee565b91505092915050565b600060208284031215613e7657613e75615343565b5b6000613e8484828501613d03565b91505092915050565b60008060408385031215613ea457613ea3615343565b5b6000613eb285828601613cee565b9250506020613ec385828601613cee565b9150509250929050565b600080600060608486031215613ee657613ee5615343565b5b6000613ef486828701613cee565b9350506020613f0586828701613cee565b9250506040613f1686828701613e1e565b9150509250925092565b60008060008060808587031215613f3a57613f39615343565b5b6000613f4887828801613cee565b9450506020613f5987828801613cee565b9350506040613f6a87828801613e1e565b925050606085013567ffffffffffffffff811115613f8b57613f8a61533e565b5b613f9787828801613dc2565b91505092959194509250565b60008060408385031215613fba57613fb9615343565b5b6000613fc885828601613cee565b9250506020613fd985828601613d18565b9150509250929050565b60008060408385031215613ffa57613ff9615343565b5b600061400885828601613cee565b925050602061401985828601613e1e565b9150509250929050565b6000806000806060858703121561403d5761403c615343565b5b600061404b87828801613cee565b945050602061405c87828801613e1e565b935050604085013567ffffffffffffffff81111561407d5761407c61533e565b5b61408987828801613d6c565b925092505092959194509250565b6000806000806000608086880312156140b3576140b2615343565b5b60006140c188828901613cee565b95505060206140d288828901613e1e565b94505060406140e388828901613e1e565b935050606086013567ffffffffffffffff8111156141045761410361533e565b5b61411088828901613d6c565b92509250509295509295909350565b60006020828403121561413557614134615343565b5b600061414384828501613d2d565b91505092915050565b6000806040838503121561416357614162615343565b5b600061417185828601613d2d565b925050602061418285828601613cee565b9150509250929050565b6000602082840312156141a2576141a1615343565b5b60006141b084828501613d42565b91505092915050565b6000602082840312156141cf576141ce615343565b5b60006141dd84828501613d57565b91505092915050565b6000602082840312156141fc576141fb615343565b5b600082013567ffffffffffffffff81111561421a5761421961533e565b5b61422684828501613df0565b91505092915050565b60006020828403121561424557614244615343565b5b600061425384828501613e1e565b91505092915050565b6000614268838361428c565b60208301905092915050565b60006142808383614812565b60208301905092915050565b61429581615032565b82525050565b6142a481615032565b82525050565b60006142b582614e88565b6142bf8185614ece565b93506142ca83614e68565b8060005b838110156142fb5781516142e2888261425c565b97506142ed83614eb4565b9250506001810190506142ce565b5085935050505092915050565b600061431382614e93565b61431d8185614edf565b935061432883614e78565b8060005b838110156143595781516143408882614274565b975061434b83614ec1565b92505060018101905061432c565b5085935050505092915050565b61436f81615044565b82525050565b61437e81615050565b82525050565b61439561439082615050565b6151d5565b82525050565b60006143a682614e9e565b6143b08185614ef0565b93506143c08185602086016150cc565b6143c981615348565b840191505092915050565b60006143df82614ea9565b6143e98185614f01565b93506143f98185602086016150cc565b61440281615348565b840191505092915050565b600061441882614ea9565b6144228185614f12565b93506144328185602086016150cc565b80840191505092915050565b600061444b601883614f01565b915061445682615359565b602082019050919050565b600061446e602083614f01565b915061447982615382565b602082019050919050565b6000614491602b83614f01565b915061449c826153ab565b604082019050919050565b60006144b4601f83614f01565b91506144bf826153fa565b602082019050919050565b60006144d7603283614f01565b91506144e282615423565b604082019050919050565b60006144fa602683614f01565b915061450582615472565b604082019050919050565b600061451d601c83614f01565b9150614528826154c1565b602082019050919050565b6000614540600283614f12565b915061454b826154ea565b600282019050919050565b6000614563602483614f01565b915061456e82615513565b604082019050919050565b6000614586601983614f01565b915061459182615562565b602082019050919050565b60006145a9601183614f01565b91506145b48261558b565b602082019050919050565b60006145cc602283614f01565b91506145d7826155b4565b604082019050919050565b60006145ef602c83614f01565b91506145fa82615603565b604082019050919050565b6000614612603883614f01565b915061461d82615652565b604082019050919050565b6000614635602a83614f01565b9150614640826156a1565b604082019050919050565b6000614658602983614f01565b9150614663826156f0565b604082019050919050565b600061467b602283614f01565b91506146868261573f565b604082019050919050565b600061469e602083614f01565b91506146a98261578e565b602082019050919050565b60006146c1602c83614f01565b91506146cc826157b7565b604082019050919050565b60006146e4602083614f01565b91506146ef82615806565b602082019050919050565b6000614707602983614f01565b91506147128261582f565b604082019050919050565b600061472a602f83614f01565b91506147358261587e565b604082019050919050565b600061474d602183614f01565b9150614758826158cd565b604082019050919050565b6000614770603183614f01565b915061477b8261591c565b604082019050919050565b6000614793601783614f12565b915061479e8261596b565b601782019050919050565b60006147b6603083614f01565b91506147c182615994565b604082019050919050565b60006147d9601183614f12565b91506147e4826159e3565b601182019050919050565b60006147fc602f83614f01565b915061480782615a0c565b604082019050919050565b61481b816150a6565b82525050565b61482a816150a6565b82525050565b614839816150b0565b82525050565b600061484b828561440d565b9150614857828461440d565b91508190509392505050565b600061486e82614533565b915061487a8285614384565b60208201915061488a8284614384565b6020820191508190509392505050565b60006148a582614786565b91506148b1828561440d565b91506148bc826147cc565b91506148c8828461440d565b91508190509392505050565b60006020820190506148e9600083018461429b565b92915050565b6000608082019050614904600083018761429b565b614911602083018661429b565b61491e6040830185614821565b8181036060830152614930818461439b565b905095945050505050565b6000602082019050818103600083015261495581846142aa565b905092915050565b600060208201905081810360008301526149778184614308565b905092915050565b60006020820190506149946000830184614366565b92915050565b60006020820190506149af6000830184614375565b92915050565b60006060820190506149ca6000830186614375565b6149d7602083018561429b565b6149e46040830184614821565b949350505050565b600060a082019050614a016000830188614375565b614a0e6020830187614375565b614a1b6040830186614375565b614a286060830185614821565b614a35608083018461429b565b9695505050505050565b6000608082019050614a546000830187614375565b614a616020830186614830565b614a6e6040830185614375565b614a7b6060830184614375565b95945050505050565b60006020820190508181036000830152614a9e81846143d4565b905092915050565b60006020820190508181036000830152614abf8161443e565b9050919050565b60006020820190508181036000830152614adf81614461565b9050919050565b60006020820190508181036000830152614aff81614484565b9050919050565b60006020820190508181036000830152614b1f816144a7565b9050919050565b60006020820190508181036000830152614b3f816144ca565b9050919050565b60006020820190508181036000830152614b5f816144ed565b9050919050565b60006020820190508181036000830152614b7f81614510565b9050919050565b60006020820190508181036000830152614b9f81614556565b9050919050565b60006020820190508181036000830152614bbf81614579565b9050919050565b60006020820190508181036000830152614bdf8161459c565b9050919050565b60006020820190508181036000830152614bff816145bf565b9050919050565b60006020820190508181036000830152614c1f816145e2565b9050919050565b60006020820190508181036000830152614c3f81614605565b9050919050565b60006020820190508181036000830152614c5f81614628565b9050919050565b60006020820190508181036000830152614c7f8161464b565b9050919050565b60006020820190508181036000830152614c9f8161466e565b9050919050565b60006020820190508181036000830152614cbf81614691565b9050919050565b60006020820190508181036000830152614cdf816146b4565b9050919050565b60006020820190508181036000830152614cff816146d7565b9050919050565b60006020820190508181036000830152614d1f816146fa565b9050919050565b60006020820190508181036000830152614d3f8161471d565b9050919050565b60006020820190508181036000830152614d5f81614740565b9050919050565b60006020820190508181036000830152614d7f81614763565b9050919050565b60006020820190508181036000830152614d9f816147a9565b9050919050565b60006020820190508181036000830152614dbf816147ef565b9050919050565b6000602082019050614ddb6000830184614821565b92915050565b6000614deb614dfc565b9050614df7828261515b565b919050565b6000604051905090565b600067ffffffffffffffff821115614e2157614e206152fb565b5b614e2a82615348565b9050602081019050919050565b600067ffffffffffffffff821115614e5257614e516152fb565b5b614e5b82615348565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f28826150a6565b9150614f33836150a6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f6857614f67615210565b5b828201905092915050565b6000614f7e826150a6565b9150614f89836150a6565b925082614f9957614f9861523f565b5b828204905092915050565b6000614faf826150a6565b9150614fba836150a6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ff357614ff2615210565b5b828202905092915050565b6000615009826150a6565b9150615014836150a6565b92508282101561502757615026615210565b5b828203905092915050565b600061503d82615086565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156150ea5780820151818401526020810190506150cf565b838111156150f9576000848401525b50505050565b600061510a826150a6565b9150600082141561511e5761511d615210565b5b600182039050919050565b6000600282049050600182168061514157607f821691505b602082108114156151555761515461529d565b5b50919050565b61516482615348565b810181811067ffffffffffffffff82111715615183576151826152fb565b5b80604052505050565b6000615197826150a6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156151ca576151c9615210565b5b600182019050919050565b6000819050919050565b60006151ea826150a6565b91506151f5836150a6565b9250826152055761520461523f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f496e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b615a6481615032565b8114615a6f57600080fd5b50565b615a7b81615044565b8114615a8657600080fd5b50565b615a9281615050565b8114615a9d57600080fd5b50565b615aa98161505a565b8114615ab457600080fd5b50565b615ac0816150a6565b8114615acb57600080fd5b5056fea264697066735822122074f7d7a7e6840b3025a1acc34868657988846c4888e72b1d625a8f5bb9f0c6f064736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000015eb66b35586f94a1df04850ebab49560a1c07ff00000000000000000000000000000000000000000000000000000000000000134c757865746f2050756e6b20536e65616b65720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044c50534400000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): Luxeto Punk Sneaker
Arg [1] : symbol (string): LPSD
Arg [2] : receiver (address): 0x15eB66B35586F94a1dF04850ebAb49560A1C07ff
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000015eb66b35586f94a1df04850ebab49560a1c07ff
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000013
Arg [4] : 4c757865746f2050756e6b20536e65616b657200000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [6] : 4c50534400000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
66581:6484:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69530:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40137:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67325:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41696:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41219:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67464:379;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69431:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42446:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62938:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63323:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70442:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64371:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42856:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68401:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70615:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36614:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67851:542;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67075:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39831:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39561:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55093:103;;;;;;;;;;;;;:::i;:::-;;69076:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68976:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54442:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61823:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40306:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60914:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41989:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67215:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43112:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69190:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40481:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70843:691;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67262:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66683:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63715:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70021:413;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72865:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42215:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67021:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55351:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69530:176;69638:4;69662:36;69686:11;69662:23;:36::i;:::-;69655:43;;69530:176;;;:::o;40137:100::-;40191:13;40224:5;40217:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40137:100;:::o;67325:113::-;67376:16;67412:18;67405:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67325:113;:::o;41696:221::-;41772:7;41800:16;41808:7;41800;:16::i;:::-;41792:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41885:15;:24;41901:7;41885:24;;;;;;;;;;;;;;;;;;;;;41878:31;;41696:221;;;:::o;41219:411::-;41300:13;41316:23;41331:7;41316:14;:23::i;:::-;41300:39;;41364:5;41358:11;;:2;:11;;;;41350:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;41458:5;41442:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;41467:37;41484:5;41491:12;:10;:12::i;:::-;41467:16;:37::i;:::-;41442:62;41420:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;41601:21;41610:2;41614:7;41601:8;:21::i;:::-;41289:341;41219:411;;:::o;67464:379::-;67509:16;67537:20;67574:18;:25;;;;67560:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67537:63;;67616:9;67611:204;67635:18;:25;;;;67631:1;:29;67611:204;;;67727:1;67686:14;:37;67701:18;67720:1;67701:21;;;;;;;;:::i;:::-;;;;;;;;;;67686:37;;;;;;;;;;;;:42;67682:122;;;67758:30;67766:18;67785:1;67766:21;;;;;;;;:::i;:::-;;;;;;;;;;67758:7;:30::i;:::-;67749:3;67753:1;67749:6;;;;;;;;:::i;:::-;;;;;;;:39;;;;;;;;;;;67682:122;67662:3;;;;;:::i;:::-;;;;67611:204;;;;67832:3;67825:10;;;67464:379;:::o;69431:91::-;69475:7;69502:12;;69495:19;;69431:91;:::o;42446:339::-;42641:41;42660:12;:10;:12::i;:::-;42674:7;42641:18;:41::i;:::-;42633:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;42749:28;42759:4;42765:2;42769:7;42749:9;:28::i;:::-;42446:339;;;:::o;62938:123::-;63004:7;63031:6;:12;63038:4;63031:12;;;;;;;;;;;:22;;;63024:29;;62938:123;;;:::o;63323:147::-;63406:18;63419:4;63406:12;:18::i;:::-;61405:30;61416:4;61422:12;:10;:12::i;:::-;61405:10;:30::i;:::-;63437:25:::1;63448:4;63454:7;63437:10;:25::i;:::-;63323:147:::0;;;:::o;70442:161::-;54673:12;:10;:12::i;:::-;54662:23;;:7;:5;:7::i;:::-;:23;;;54654:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70537:27:::1;70547:7;70556;70537:9;:27::i;:::-;70575:20;70587:7;70575:11;:20::i;:::-;70442:161:::0;;:::o;64371:218::-;64478:12;:10;:12::i;:::-;64467:23;;:7;:23;;;64459:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;64555:26;64567:4;64573:7;64555:11;:26::i;:::-;64371:218;;:::o;42856:185::-;42994:39;43011:4;43017:2;43021:7;42994:39;;;;;;;;;;;;:16;:39::i;:::-;42856:185;;;:::o;68401:139::-;68475:19;68486:7;68475:10;:19::i;:::-;68531:1;68505:14;:23;68520:7;68505:23;;;;;;;;;;;:27;;;;68401:139;:::o;70615:216::-;70709:34;66721:24;70730:12;:10;:12::i;:::-;70709:7;:34::i;:::-;70701:43;;;;;;70755:27;70765:7;70774;70755:9;:27::i;:::-;70793:20;70805:7;70793:11;:20::i;:::-;70615:216;;:::o;36614:86::-;36661:4;36685:7;;;;;;;;;;;36678:14;;36614:86;:::o;67851:542::-;67922:16;67951:20;67988:18;67998:7;67988:9;:18::i;:::-;67974:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67951:56;;68018:9;68047;68042:323;68066:18;:25;;;;68062:1;:29;68042:323;;;68158:1;68117:14;:37;68132:18;68151:1;68132:21;;;;;;;;:::i;:::-;;;;;;;;;;68117:37;;;;;;;;;;;;:42;68113:234;;;68218:7;68184:41;;:30;68192:18;68211:1;68192:21;;;;;;;;:::i;:::-;;;;;;;;;;68184:7;:30::i;:::-;:41;;;68180:152;;;68259:18;68278:1;68259:21;;;;;;;;:::i;:::-;;;;;;;;;;68250:3;68254:1;68250:6;;;;;;;;:::i;:::-;;;;;;;:30;;;;;68311:1;68307;:5;;;;:::i;:::-;68303:9;;68180:152;68113:234;68093:3;;;;;:::i;:::-;;;;68042:323;;;;68382:3;68375:10;;;;67851:542;;;:::o;67075:46::-;;;;:::o;39831:239::-;39903:7;39923:13;39939:7;:16;39947:7;39939:16;;;;;;;;;;;;;;;;;;;;;39923:32;;39991:1;39974:19;;:5;:19;;;;39966:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40057:5;40050:12;;;39831:239;;;:::o;39561:208::-;39633:7;39678:1;39661:19;;:5;:19;;;;39653:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;39745:9;:16;39755:5;39745:16;;;;;;;;;;;;;;;;39738:23;;39561:208;;;:::o;55093:103::-;54673:12;:10;:12::i;:::-;54662:23;;:7;:5;:7::i;:::-;:23;;;54654:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55158:30:::1;55185:1;55158:18;:30::i;:::-;55093:103::o:0;69076:106::-;54673:12;:10;:12::i;:::-;54662:23;;:7;:5;:7::i;:::-;:23;;;54654:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69160:8:::1;69148:9;;:20;;;;;;;;;;;;;;;;;;69076:106:::0;:::o;68976:92::-;54673:12;:10;:12::i;:::-;54662:23;;:7;:5;:7::i;:::-;:23;;;54654:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69055:5:::1;69042:10;:18;;;;68976:92:::0;:::o;54442:87::-;54488:7;54515:6;;;;;;;;;;;54508:13;;54442:87;:::o;61823:139::-;61901:4;61925:6;:12;61932:4;61925:12;;;;;;;;;;;:20;;:29;61946:7;61925:29;;;;;;;;;;;;;;;;;;;;;;;;;61918:36;;61823:139;;;;:::o;40306:104::-;40362:13;40395:7;40388:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40306:104;:::o;60914:49::-;60959:4;60914:49;;;:::o;41989:155::-;42084:52;42103:12;:10;:12::i;:::-;42117:8;42127;42084:18;:52::i;:::-;41989:155;;:::o;67215:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;43112:328::-;43287:41;43306:12;:10;:12::i;:::-;43320:7;43287:18;:41::i;:::-;43279:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;43393:39;43407:4;43413:2;43417:7;43426:5;43393:13;:39::i;:::-;43112:328;;;;:::o;69190:101::-;54673:12;:10;:12::i;:::-;54662:23;;:7;:5;:7::i;:::-;:23;;;54654:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69280:3:::1;69258:19;:25;;;;;;;;;;;;:::i;:::-;;69190:101:::0;:::o;40481:334::-;40554:13;40588:16;40596:7;40588;:16::i;:::-;40580:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;40669:21;40693:10;:8;:10::i;:::-;40669:34;;40745:1;40727:7;40721:21;:25;:86;;;;;;;;;;;;;;;;;40773:7;40782:18;:7;:16;:18::i;:::-;40756:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40721:86;40714:93;;;40481:334;;;:::o;70843:691::-;70988:22;71013:10;;70988:35;;71064:1;71038:15;;:22;;:27;71034:153;;71173:2;71112:58;71129:7;71138;71147:5;71154:15;;71112:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:58::i;:::-;71099:10;;:71;;;;:::i;:::-;:76;;;;:::i;:::-;71082:93;;71034:153;71232:1;71205:14;:23;71220:7;71205:23;;;;;;;;;;;;:28;71197:37;;;;;;71245:13;71273:27;;;;;;;;;;;71245:56;;71353:7;71320:40;;:1;:20;;;71341:7;71320:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;;;71312:49;;;;;;71393:14;71380:9;:27;;71372:36;;;;;;71427:9;;;;;;;;;;;71419:27;;:38;71447:9;71419:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71468:27;71478:7;71487;71468:9;:27::i;:::-;71506:20;71518:7;71506:11;:20::i;:::-;70977:557;;70843:691;;;;;:::o;67262:52::-;;;;;;;;;;;;;;;;;:::o;66683:62::-;66721:24;66683:62;:::o;63715:149::-;63799:18;63812:4;63799:12;:18::i;:::-;61405:30;61416:4;61422:12;:10;:12::i;:::-;61405:10;:30::i;:::-;63830:26:::1;63842:4;63848:7;63830:11;:26::i;:::-;63715:149:::0;;;:::o;70021:413::-;70179:1;70152:14;:23;70167:7;70152:23;;;;;;;;;;;;:28;70144:37;;;;;;70200:43;70208:23;70214:7;70223;70208:5;:23::i;:::-;70233:9;;70200:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:43::i;:::-;70192:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;70297:10;;70284:9;:23;;70276:32;;;;;;70327:9;;;;;;;;;;;70319:27;;:38;70347:9;70319:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70368:27;70378:7;70387;70368:9;:27::i;:::-;70406:20;70418:7;70406:11;:20::i;:::-;70021:413;;;;:::o;72865:197::-;72972:7;73005:49;73019:23;73025:7;73034;73019:5;:23::i;:::-;73044:9;;73005:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:49::i;:::-;72998:56;;72865:197;;;;;;:::o;42215:164::-;42312:4;42336:18;:25;42355:5;42336:25;;;;;;;;;;;;;;;:35;42362:8;42336:35;;;;;;;;;;;;;;;;;;;;;;;;;42329:42;;42215:164;;;;:::o;67021:47::-;;;;;;;;;;;;;;;;;:::o;55351:201::-;54673:12;:10;:12::i;:::-;54662:23;;:7;:5;:7::i;:::-;:23;;;54654:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55460:1:::1;55440:22;;:8;:22;;;;55432:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;55516:28;55535:8;55516:18;:28::i;:::-;55351:201:::0;:::o;39192:305::-;39294:4;39346:25;39331:40;;;:11;:40;;;;:105;;;;39403:33;39388:48;;;:11;:48;;;;39331:105;:158;;;;39453:36;39477:11;39453:23;:36::i;:::-;39331:158;39311:178;;39192:305;;;:::o;44950:127::-;45015:4;45067:1;45039:30;;:7;:16;45047:7;45039:16;;;;;;;;;;;;;;;;;;;;;:30;;;;45032:37;;44950:127;;;:::o;35268:98::-;35321:7;35348:10;35341:17;;35268:98;:::o;48932:174::-;49034:2;49007:15;:24;49023:7;49007:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;49090:7;49086:2;49052:46;;49061:23;49076:7;49061:14;:23::i;:::-;49052:46;;;;;;;;;;;;48932:174;;:::o;45244:348::-;45337:4;45362:16;45370:7;45362;:16::i;:::-;45354:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45438:13;45454:23;45469:7;45454:14;:23::i;:::-;45438:39;;45507:5;45496:16;;:7;:16;;;:51;;;;45540:7;45516:31;;:20;45528:7;45516:11;:20::i;:::-;:31;;;45496:51;:87;;;;45551:32;45568:5;45575:7;45551:16;:32::i;:::-;45496:87;45488:96;;;45244:348;;;;:::o;48236:578::-;48395:4;48368:31;;:23;48383:7;48368:14;:23::i;:::-;:31;;;48360:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;48478:1;48464:16;;:2;:16;;;;48456:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;48534:39;48555:4;48561:2;48565:7;48534:20;:39::i;:::-;48638:29;48655:1;48659:7;48638:8;:29::i;:::-;48699:1;48680:9;:15;48690:4;48680:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;48728:1;48711:9;:13;48721:2;48711:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;48759:2;48740:7;:16;48748:7;48740:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;48798:7;48794:2;48779:27;;48788:4;48779:27;;;;;;;;;;;;48236:578;;;:::o;62252:497::-;62333:22;62341:4;62347:7;62333;:22::i;:::-;62328:414;;62521:41;62549:7;62521:41;;62559:2;62521:19;:41::i;:::-;62635:38;62663:4;62655:13;;62670:2;62635:19;:38::i;:::-;62426:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62372:358;;;;;;;;;;;:::i;:::-;;;;;;;;62328:414;62252:497;;:::o;65872:238::-;65956:22;65964:4;65970:7;65956;:22::i;:::-;65951:152;;66027:4;65995:6;:12;66002:4;65995:12;;;;;;;;;;;:20;;:29;66016:7;65995:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;66078:12;:10;:12::i;:::-;66051:40;;66069:7;66051:40;;66063:4;66051:40;;;;;;;;;;65951:152;65872:238;;:::o;45934:110::-;46010:26;46020:2;46024:7;46010:26;;;;;;;;;;;;:9;:26::i;:::-;45934:110;;:::o;68832:136::-;68916:1;68890:14;:23;68905:7;68890:23;;;;;;;;;;;:27;;;;68928:18;68952:7;68928:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68832:136;:::o;66242:239::-;66326:22;66334:4;66340:7;66326;:22::i;:::-;66322:152;;;66397:5;66365:6;:12;66372:4;66365:12;;;;;;;;;;;:20;;:29;66386:7;66365:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;66449:12;:10;:12::i;:::-;66422:40;;66440:7;66422:40;;66434:4;66422:40;;;;;;;;;;66322:152;66242:239;;:::o;53128:245::-;53246:41;53265:12;:10;:12::i;:::-;53279:7;53246:18;:41::i;:::-;53238:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;53351:14;53357:7;53351:5;:14::i;:::-;53128:245;:::o;55712:191::-;55786:16;55805:6;;;;;;;;;;;55786:25;;55831:8;55822:6;;:17;;;;;;;;;;;;;;;;;;55886:8;55855:40;;55876:8;55855:40;;;;;;;;;;;;55775:128;55712:191;:::o;49248:315::-;49403:8;49394:17;;:5;:17;;;;49386:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;49490:8;49452:18;:25;49471:5;49452:25;;;;;;;;;;;;;;;:35;49478:8;49452:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;49536:8;49514:41;;49529:5;49514:41;;;49546:8;49514:41;;;;;;:::i;:::-;;;;;;;;49248:315;;;:::o;44322:::-;44479:28;44489:4;44495:2;44499:7;44479:9;:28::i;:::-;44526:48;44549:4;44555:2;44559:7;44568:5;44526:22;:48::i;:::-;44518:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;44322:315;;;;:::o;69299:120::-;69359:13;69392:19;69385:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69299:120;:::o;18633:723::-;18689:13;18919:1;18910:5;:10;18906:53;;;18937:10;;;;;;;;;;;;;;;;;;;;;18906:53;18969:12;18984:5;18969:20;;19000:14;19025:78;19040:1;19032:4;:9;19025:78;;19058:8;;;;;:::i;:::-;;;;19089:2;19081:10;;;;;:::i;:::-;;;19025:78;;;19113:19;19145:6;19135:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19113:39;;19163:154;19179:1;19170:5;:10;19163:154;;19207:1;19197:11;;;;;:::i;:::-;;;19274:2;19266:5;:10;;;;:::i;:::-;19253:2;:24;;;;:::i;:::-;19240:39;;19223:6;19230;19223:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;19303:2;19294:11;;;;;:::i;:::-;;;19163:154;;;19341:6;19327:21;;;;;18633:723;;;;:::o;71825:844::-;71953:16;71991:76;66721:24;72012:54;72026:22;72032:7;72041:6;72026:5;:22::i;:::-;72050:15;72012:13;:54::i;:::-;71991:7;:76::i;:::-;71987:168;;;72115:5;72084:19;:28;72104:7;72084:28;;;;;;;;;;;:36;;;;72142:1;72135:8;;;;71987:168;72170:10;:19;72181:7;72170:19;;;;;;;;;;;;;;;;;;;;;;;;;72169:20;:100;;;;;72193:76;66721:24;72214:54;72228:22;72234:7;72243:6;72228:5;:22::i;:::-;72252:15;72214:13;:54::i;:::-;72193:7;:76::i;:::-;72169:100;72165:233;;;72308:4;72286:10;:19;72297:7;72286:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;72358:5;72327:19;:28;72347:7;72327:28;;;;;;;;;;;:36;;;;72385:1;72378:8;;;;72165:233;72413:10;:19;72424:7;72413:19;;;;;;;;;;;;;;;;;;;;;;;;;72412:20;:101;;;;;72436:77;66721:24;72457:55;72471:23;72477:7;72486;72471:5;:23::i;:::-;72496:15;72457:13;:55::i;:::-;72436:7;:77::i;:::-;72412:101;72408:234;;;72552:4;72530:10;:19;72541:7;72530:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;72602:5;72571:19;:28;72591:7;72571:28;;;;;;;;;;;:36;;;;72629:1;72622:8;;;;72408:234;72659:2;72652:9;;71825:844;;;;;;;:::o;71542:275::-;71619:7;71651:158;71703:49;71767:7;71789;71678:129;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71668:140;;;;;;71651:16;:158::i;:::-;71644:165;;71542:275;;;;:::o;72677:176::-;72762:4;72791:54;66721:24;72812:32;72826:6;72834:9;72812:13;:32::i;:::-;72791:7;:54::i;:::-;72784:61;;72677:176;;;;:::o;24794:231::-;24872:7;24893:17;24912:18;24934:27;24945:4;24951:9;24934:10;:27::i;:::-;24892:69;;;;24972:18;24984:5;24972:11;:18::i;:::-;25008:9;25001:16;;;;24794:231;;;;:::o;61527:204::-;61612:4;61651:32;61636:47;;;:11;:47;;;;:87;;;;61687:36;61711:11;61687:23;:36::i;:::-;61636:87;61629:94;;61527:204;;;:::o;69714:299::-;69882:45;69909:4;69915:2;69919:7;69882:26;:45::i;:::-;69949:8;:6;:8::i;:::-;69948:9;69940:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;69714:299;;;:::o;19934:451::-;20009:13;20035:19;20080:1;20071:6;20067:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;20057:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20035:47;;20093:15;:6;20100:1;20093:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;20119;:6;20126:1;20119:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;20150:9;20175:1;20166:6;20162:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;20150:26;;20145:135;20182:1;20178;:5;20145:135;;;20217:12;20238:3;20230:5;:11;20217:25;;;;;;;:::i;:::-;;;;;20205:6;20212:1;20205:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;20267:1;20257:11;;;;;20185:3;;;;:::i;:::-;;;20145:135;;;;20307:1;20298:5;:10;20290:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;20370:6;20356:21;;;19934:451;;;;:::o;46271:321::-;46401:18;46407:2;46411:7;46401:5;:18::i;:::-;46452:54;46483:1;46487:2;46491:7;46500:5;46452:22;:54::i;:::-;46430:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;46271:321;;;:::o;47539:360::-;47599:13;47615:23;47630:7;47615:14;:23::i;:::-;47599:39;;47651:48;47672:5;47687:1;47691:7;47651:20;:48::i;:::-;47740:29;47757:1;47761:7;47740:8;:29::i;:::-;47802:1;47782:9;:16;47792:5;47782:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;47821:7;:16;47829:7;47821:16;;;;;;;;;;;;47814:23;;;;;;;;;;;47883:7;47879:1;47855:36;;47864:5;47855:36;;;;;;;;;;;;47588:311;47539:360;:::o;50128:799::-;50283:4;50304:15;:2;:13;;;:15::i;:::-;50300:620;;;50356:2;50340:36;;;50377:12;:10;:12::i;:::-;50391:4;50397:7;50406:5;50340:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;50336:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50599:1;50582:6;:13;:18;50578:272;;;50625:60;;;;;;;;;;:::i;:::-;;;;;;;;50578:272;50800:6;50794:13;50785:6;50781:2;50777:15;50770:38;50336:529;50473:41;;;50463:51;;;:6;:51;;;;50456:58;;;;;50300:620;50904:4;50897:11;;50128:799;;;;;;;:::o;34415:167::-;34492:7;34519:55;34541:20;:18;:20::i;:::-;34563:10;34519:21;:55::i;:::-;34512:62;;34415:167;;;:::o;22684:1308::-;22765:7;22774:12;23019:2;22999:9;:16;:22;22995:990;;;23038:9;23062;23086:7;23295:4;23284:9;23280:20;23274:27;23269:32;;23345:4;23334:9;23330:20;23324:27;23319:32;;23403:4;23392:9;23388:20;23382:27;23379:1;23374:36;23369:41;;23446:25;23457:4;23463:1;23466;23469;23446:10;:25::i;:::-;23439:32;;;;;;;;;22995:990;23513:2;23493:9;:16;:22;23489:496;;;23532:9;23556:10;23768:4;23757:9;23753:20;23747:27;23742:32;;23819:4;23808:9;23804:20;23798:27;23792:33;;23861:23;23872:4;23878:1;23881:2;23861:10;:23::i;:::-;23854:30;;;;;;;;23489:496;23933:1;23937:35;23917:56;;;;22684:1308;;;;;;:::o;20955:643::-;21033:20;21024:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;21020:571;;;21070:7;;21020:571;21131:29;21122:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;21118:473;;;21177:34;;;;;;;;;;:::i;:::-;;;;;;;;21118:473;21242:35;21233:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;21229:362;;;21294:41;;;;;;;;;;:::i;:::-;;;;;;;;21229:362;21366:30;21357:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;21353:238;;;21413:44;;;;;;;;;;:::i;:::-;;;;;;;;21353:238;21488:30;21479:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;21475:116;;;21535:44;;;;;;;;;;:::i;:::-;;;;;;;;21475:116;20955:643;;:::o;18104:157::-;18189:4;18228:25;18213:40;;;:11;:40;;;;18206:47;;18104:157;;;:::o;52310:275::-;52454:45;52481:4;52487:2;52491:7;52454:26;:45::i;:::-;52521:8;:6;:8::i;:::-;52520:9;52512:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;52310:275;;;:::o;46928:382::-;47022:1;47008:16;;:2;:16;;;;47000:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;47081:16;47089:7;47081;:16::i;:::-;47080:17;47072:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;47143:45;47172:1;47176:2;47180:7;47143:20;:45::i;:::-;47218:1;47201:9;:13;47211:2;47201:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;47249:2;47230:7;:16;47238:7;47230:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;47294:7;47290:2;47269:33;;47286:1;47269:33;;;;;;;;;;;;46928:382;;:::o;2285:387::-;2345:4;2553:12;2620:7;2608:20;2600:28;;2663:1;2656:4;:8;2649:15;;;2285:387;;;:::o;33188:314::-;33241:7;33282:12;33265:29;;33273:4;33265:29;;;:66;;;;;33315:16;33298:13;:33;33265:66;33261:234;;;33355:24;33348:31;;;;33261:234;33419:64;33441:10;33453:12;33467:15;33419:21;:64::i;:::-;33412:71;;33188:314;;:::o;29755:196::-;29848:7;29914:15;29931:10;29885:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29875:68;;;;;;29868:75;;29755:196;;;;:::o;26293:1632::-;26424:7;26433:12;27358:66;27353:1;27345:10;;:79;27341:163;;;27457:1;27461:30;27441:51;;;;;;27341:163;27523:2;27518:1;:7;;;;:18;;;;;27534:2;27529:1;:7;;;;27518:18;27514:102;;;27569:1;27573:30;27553:51;;;;;;27514:102;27713:14;27730:24;27740:4;27746:1;27749;27752;27730:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27713:41;;27787:1;27769:20;;:6;:20;;;27765:103;;;27822:1;27826:29;27806:50;;;;;;;27765:103;27888:6;27896:20;27880:37;;;;;26293:1632;;;;;;;;:::o;25288:391::-;25402:7;25411:12;25436:9;25456:7;25511:66;25507:2;25503:75;25498:80;;25615:2;25610;25605:3;25601:12;25597:21;25592:26;;25646:25;25657:4;25663:1;25666;25669;25646:10;:25::i;:::-;25639:32;;;;;;25288:391;;;;;;:::o;51499:126::-;;;;:::o;33510:263::-;33654:7;33702:8;33712;33722:11;33735:13;33758:4;33691:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33681:84;;;;;;33674:91;;33510:263;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:143::-;1043:5;1074:6;1068:13;1059:22;;1090:33;1117:5;1090:33;:::i;:::-;986:143;;;;:::o;1135:133::-;1178:5;1216:6;1203:20;1194:29;;1232:30;1256:5;1232:30;:::i;:::-;1135:133;;;;:::o;1274:139::-;1320:5;1358:6;1345:20;1336:29;;1374:33;1401:5;1374:33;:::i;:::-;1274:139;;;;:::o;1419:137::-;1464:5;1502:6;1489:20;1480:29;;1518:32;1544:5;1518:32;:::i;:::-;1419:137;;;;:::o;1562:141::-;1618:5;1649:6;1643:13;1634:22;;1665:32;1691:5;1665:32;:::i;:::-;1562:141;;;;:::o;1722:552::-;1779:8;1789:6;1839:3;1832:4;1824:6;1820:17;1816:27;1806:122;;1847:79;;:::i;:::-;1806:122;1960:6;1947:20;1937:30;;1990:18;1982:6;1979:30;1976:117;;;2012:79;;:::i;:::-;1976:117;2126:4;2118:6;2114:17;2102:29;;2180:3;2172:4;2164:6;2160:17;2150:8;2146:32;2143:41;2140:128;;;2187:79;;:::i;:::-;2140:128;1722:552;;;;;:::o;2293:338::-;2348:5;2397:3;2390:4;2382:6;2378:17;2374:27;2364:122;;2405:79;;:::i;:::-;2364:122;2522:6;2509:20;2547:78;2621:3;2613:6;2606:4;2598:6;2594:17;2547:78;:::i;:::-;2538:87;;2354:277;2293:338;;;;:::o;2651:340::-;2707:5;2756:3;2749:4;2741:6;2737:17;2733:27;2723:122;;2764:79;;:::i;:::-;2723:122;2881:6;2868:20;2906:79;2981:3;2973:6;2966:4;2958:6;2954:17;2906:79;:::i;:::-;2897:88;;2713:278;2651:340;;;;:::o;2997:139::-;3043:5;3081:6;3068:20;3059:29;;3097:33;3124:5;3097:33;:::i;:::-;2997:139;;;;:::o;3142:329::-;3201:6;3250:2;3238:9;3229:7;3225:23;3221:32;3218:119;;;3256:79;;:::i;:::-;3218:119;3376:1;3401:53;3446:7;3437:6;3426:9;3422:22;3401:53;:::i;:::-;3391:63;;3347:117;3142:329;;;;:::o;3477:351::-;3547:6;3596:2;3584:9;3575:7;3571:23;3567:32;3564:119;;;3602:79;;:::i;:::-;3564:119;3722:1;3747:64;3803:7;3794:6;3783:9;3779:22;3747:64;:::i;:::-;3737:74;;3693:128;3477:351;;;;:::o;3834:474::-;3902:6;3910;3959:2;3947:9;3938:7;3934:23;3930:32;3927:119;;;3965:79;;:::i;:::-;3927:119;4085:1;4110:53;4155:7;4146:6;4135:9;4131:22;4110:53;:::i;:::-;4100:63;;4056:117;4212:2;4238:53;4283:7;4274:6;4263:9;4259:22;4238:53;:::i;:::-;4228:63;;4183:118;3834:474;;;;;:::o;4314:619::-;4391:6;4399;4407;4456:2;4444:9;4435:7;4431:23;4427:32;4424:119;;;4462:79;;:::i;:::-;4424:119;4582:1;4607:53;4652:7;4643:6;4632:9;4628:22;4607:53;:::i;:::-;4597:63;;4553:117;4709:2;4735:53;4780:7;4771:6;4760:9;4756:22;4735:53;:::i;:::-;4725:63;;4680:118;4837:2;4863:53;4908:7;4899:6;4888:9;4884:22;4863:53;:::i;:::-;4853:63;;4808:118;4314:619;;;;;:::o;4939:943::-;5034:6;5042;5050;5058;5107:3;5095:9;5086:7;5082:23;5078:33;5075:120;;;5114:79;;:::i;:::-;5075:120;5234:1;5259:53;5304:7;5295:6;5284:9;5280:22;5259:53;:::i;:::-;5249:63;;5205:117;5361:2;5387:53;5432:7;5423:6;5412:9;5408:22;5387:53;:::i;:::-;5377:63;;5332:118;5489:2;5515:53;5560:7;5551:6;5540:9;5536:22;5515:53;:::i;:::-;5505:63;;5460:118;5645:2;5634:9;5630:18;5617:32;5676:18;5668:6;5665:30;5662:117;;;5698:79;;:::i;:::-;5662:117;5803:62;5857:7;5848:6;5837:9;5833:22;5803:62;:::i;:::-;5793:72;;5588:287;4939:943;;;;;;;:::o;5888:468::-;5953:6;5961;6010:2;5998:9;5989:7;5985:23;5981:32;5978:119;;;6016:79;;:::i;:::-;5978:119;6136:1;6161:53;6206:7;6197:6;6186:9;6182:22;6161:53;:::i;:::-;6151:63;;6107:117;6263:2;6289:50;6331:7;6322:6;6311:9;6307:22;6289:50;:::i;:::-;6279:60;;6234:115;5888:468;;;;;:::o;6362:474::-;6430:6;6438;6487:2;6475:9;6466:7;6462:23;6458:32;6455:119;;;6493:79;;:::i;:::-;6455:119;6613:1;6638:53;6683:7;6674:6;6663:9;6659:22;6638:53;:::i;:::-;6628:63;;6584:117;6740:2;6766:53;6811:7;6802:6;6791:9;6787:22;6766:53;:::i;:::-;6756:63;;6711:118;6362:474;;;;;:::o;6842:817::-;6930:6;6938;6946;6954;7003:2;6991:9;6982:7;6978:23;6974:32;6971:119;;;7009:79;;:::i;:::-;6971:119;7129:1;7154:53;7199:7;7190:6;7179:9;7175:22;7154:53;:::i;:::-;7144:63;;7100:117;7256:2;7282:53;7327:7;7318:6;7307:9;7303:22;7282:53;:::i;:::-;7272:63;;7227:118;7412:2;7401:9;7397:18;7384:32;7443:18;7435:6;7432:30;7429:117;;;7465:79;;:::i;:::-;7429:117;7578:64;7634:7;7625:6;7614:9;7610:22;7578:64;:::i;:::-;7560:82;;;;7355:297;6842:817;;;;;;;:::o;7665:963::-;7762:6;7770;7778;7786;7794;7843:3;7831:9;7822:7;7818:23;7814:33;7811:120;;;7850:79;;:::i;:::-;7811:120;7970:1;7995:53;8040:7;8031:6;8020:9;8016:22;7995:53;:::i;:::-;7985:63;;7941:117;8097:2;8123:53;8168:7;8159:6;8148:9;8144:22;8123:53;:::i;:::-;8113:63;;8068:118;8225:2;8251:53;8296:7;8287:6;8276:9;8272:22;8251:53;:::i;:::-;8241:63;;8196:118;8381:2;8370:9;8366:18;8353:32;8412:18;8404:6;8401:30;8398:117;;;8434:79;;:::i;:::-;8398:117;8547:64;8603:7;8594:6;8583:9;8579:22;8547:64;:::i;:::-;8529:82;;;;8324:297;7665:963;;;;;;;;:::o;8634:329::-;8693:6;8742:2;8730:9;8721:7;8717:23;8713:32;8710:119;;;8748:79;;:::i;:::-;8710:119;8868:1;8893:53;8938:7;8929:6;8918:9;8914:22;8893:53;:::i;:::-;8883:63;;8839:117;8634:329;;;;:::o;8969:474::-;9037:6;9045;9094:2;9082:9;9073:7;9069:23;9065:32;9062:119;;;9100:79;;:::i;:::-;9062:119;9220:1;9245:53;9290:7;9281:6;9270:9;9266:22;9245:53;:::i;:::-;9235:63;;9191:117;9347:2;9373:53;9418:7;9409:6;9398:9;9394:22;9373:53;:::i;:::-;9363:63;;9318:118;8969:474;;;;;:::o;9449:327::-;9507:6;9556:2;9544:9;9535:7;9531:23;9527:32;9524:119;;;9562:79;;:::i;:::-;9524:119;9682:1;9707:52;9751:7;9742:6;9731:9;9727:22;9707:52;:::i;:::-;9697:62;;9653:116;9449:327;;;;:::o;9782:349::-;9851:6;9900:2;9888:9;9879:7;9875:23;9871:32;9868:119;;;9906:79;;:::i;:::-;9868:119;10026:1;10051:63;10106:7;10097:6;10086:9;10082:22;10051:63;:::i;:::-;10041:73;;9997:127;9782:349;;;;:::o;10137:509::-;10206:6;10255:2;10243:9;10234:7;10230:23;10226:32;10223:119;;;10261:79;;:::i;:::-;10223:119;10409:1;10398:9;10394:17;10381:31;10439:18;10431:6;10428:30;10425:117;;;10461:79;;:::i;:::-;10425:117;10566:63;10621:7;10612:6;10601:9;10597:22;10566:63;:::i;:::-;10556:73;;10352:287;10137:509;;;;:::o;10652:329::-;10711:6;10760:2;10748:9;10739:7;10735:23;10731:32;10728:119;;;10766:79;;:::i;:::-;10728:119;10886:1;10911:53;10956:7;10947:6;10936:9;10932:22;10911:53;:::i;:::-;10901:63;;10857:117;10652:329;;;;:::o;10987:179::-;11056:10;11077:46;11119:3;11111:6;11077:46;:::i;:::-;11155:4;11150:3;11146:14;11132:28;;10987:179;;;;:::o;11172:::-;11241:10;11262:46;11304:3;11296:6;11262:46;:::i;:::-;11340:4;11335:3;11331:14;11317:28;;11172:179;;;;:::o;11357:108::-;11434:24;11452:5;11434:24;:::i;:::-;11429:3;11422:37;11357:108;;:::o;11471:118::-;11558:24;11576:5;11558:24;:::i;:::-;11553:3;11546:37;11471:118;;:::o;11625:732::-;11744:3;11773:54;11821:5;11773:54;:::i;:::-;11843:86;11922:6;11917:3;11843:86;:::i;:::-;11836:93;;11953:56;12003:5;11953:56;:::i;:::-;12032:7;12063:1;12048:284;12073:6;12070:1;12067:13;12048:284;;;12149:6;12143:13;12176:63;12235:3;12220:13;12176:63;:::i;:::-;12169:70;;12262:60;12315:6;12262:60;:::i;:::-;12252:70;;12108:224;12095:1;12092;12088:9;12083:14;;12048:284;;;12052:14;12348:3;12341:10;;11749:608;;;11625:732;;;;:::o;12393:::-;12512:3;12541:54;12589:5;12541:54;:::i;:::-;12611:86;12690:6;12685:3;12611:86;:::i;:::-;12604:93;;12721:56;12771:5;12721:56;:::i;:::-;12800:7;12831:1;12816:284;12841:6;12838:1;12835:13;12816:284;;;12917:6;12911:13;12944:63;13003:3;12988:13;12944:63;:::i;:::-;12937:70;;13030:60;13083:6;13030:60;:::i;:::-;13020:70;;12876:224;12863:1;12860;12856:9;12851:14;;12816:284;;;12820:14;13116:3;13109:10;;12517:608;;;12393:732;;;;:::o;13131:109::-;13212:21;13227:5;13212:21;:::i;:::-;13207:3;13200:34;13131:109;;:::o;13246:118::-;13333:24;13351:5;13333:24;:::i;:::-;13328:3;13321:37;13246:118;;:::o;13370:157::-;13475:45;13495:24;13513:5;13495:24;:::i;:::-;13475:45;:::i;:::-;13470:3;13463:58;13370:157;;:::o;13533:360::-;13619:3;13647:38;13679:5;13647:38;:::i;:::-;13701:70;13764:6;13759:3;13701:70;:::i;:::-;13694:77;;13780:52;13825:6;13820:3;13813:4;13806:5;13802:16;13780:52;:::i;:::-;13857:29;13879:6;13857:29;:::i;:::-;13852:3;13848:39;13841:46;;13623:270;13533:360;;;;:::o;13899:364::-;13987:3;14015:39;14048:5;14015:39;:::i;:::-;14070:71;14134:6;14129:3;14070:71;:::i;:::-;14063:78;;14150:52;14195:6;14190:3;14183:4;14176:5;14172:16;14150:52;:::i;:::-;14227:29;14249:6;14227:29;:::i;:::-;14222:3;14218:39;14211:46;;13991:272;13899:364;;;;:::o;14269:377::-;14375:3;14403:39;14436:5;14403:39;:::i;:::-;14458:89;14540:6;14535:3;14458:89;:::i;:::-;14451:96;;14556:52;14601:6;14596:3;14589:4;14582:5;14578:16;14556:52;:::i;:::-;14633:6;14628:3;14624:16;14617:23;;14379:267;14269:377;;;;:::o;14652:366::-;14794:3;14815:67;14879:2;14874:3;14815:67;:::i;:::-;14808:74;;14891:93;14980:3;14891:93;:::i;:::-;15009:2;15004:3;15000:12;14993:19;;14652:366;;;:::o;15024:::-;15166:3;15187:67;15251:2;15246:3;15187:67;:::i;:::-;15180:74;;15263:93;15352:3;15263:93;:::i;:::-;15381:2;15376:3;15372:12;15365:19;;15024:366;;;:::o;15396:::-;15538:3;15559:67;15623:2;15618:3;15559:67;:::i;:::-;15552:74;;15635:93;15724:3;15635:93;:::i;:::-;15753:2;15748:3;15744:12;15737:19;;15396:366;;;:::o;15768:::-;15910:3;15931:67;15995:2;15990:3;15931:67;:::i;:::-;15924:74;;16007:93;16096:3;16007:93;:::i;:::-;16125:2;16120:3;16116:12;16109:19;;15768:366;;;:::o;16140:::-;16282:3;16303:67;16367:2;16362:3;16303:67;:::i;:::-;16296:74;;16379:93;16468:3;16379:93;:::i;:::-;16497:2;16492:3;16488:12;16481:19;;16140:366;;;:::o;16512:::-;16654:3;16675:67;16739:2;16734:3;16675:67;:::i;:::-;16668:74;;16751:93;16840:3;16751:93;:::i;:::-;16869:2;16864:3;16860:12;16853:19;;16512:366;;;:::o;16884:::-;17026:3;17047:67;17111:2;17106:3;17047:67;:::i;:::-;17040:74;;17123:93;17212:3;17123:93;:::i;:::-;17241:2;17236:3;17232:12;17225:19;;16884:366;;;:::o;17256:400::-;17416:3;17437:84;17519:1;17514:3;17437:84;:::i;:::-;17430:91;;17530:93;17619:3;17530:93;:::i;:::-;17648:1;17643:3;17639:11;17632:18;;17256:400;;;:::o;17662:366::-;17804:3;17825:67;17889:2;17884:3;17825:67;:::i;:::-;17818:74;;17901:93;17990:3;17901:93;:::i;:::-;18019:2;18014:3;18010:12;18003:19;;17662:366;;;:::o;18034:::-;18176:3;18197:67;18261:2;18256:3;18197:67;:::i;:::-;18190:74;;18273:93;18362:3;18273:93;:::i;:::-;18391:2;18386:3;18382:12;18375:19;;18034:366;;;:::o;18406:::-;18548:3;18569:67;18633:2;18628:3;18569:67;:::i;:::-;18562:74;;18645:93;18734:3;18645:93;:::i;:::-;18763:2;18758:3;18754:12;18747:19;;18406:366;;;:::o;18778:::-;18920:3;18941:67;19005:2;19000:3;18941:67;:::i;:::-;18934:74;;19017:93;19106:3;19017:93;:::i;:::-;19135:2;19130:3;19126:12;19119:19;;18778:366;;;:::o;19150:::-;19292:3;19313:67;19377:2;19372:3;19313:67;:::i;:::-;19306:74;;19389:93;19478:3;19389:93;:::i;:::-;19507:2;19502:3;19498:12;19491:19;;19150:366;;;:::o;19522:::-;19664:3;19685:67;19749:2;19744:3;19685:67;:::i;:::-;19678:74;;19761:93;19850:3;19761:93;:::i;:::-;19879:2;19874:3;19870:12;19863:19;;19522:366;;;:::o;19894:::-;20036:3;20057:67;20121:2;20116:3;20057:67;:::i;:::-;20050:74;;20133:93;20222:3;20133:93;:::i;:::-;20251:2;20246:3;20242:12;20235:19;;19894:366;;;:::o;20266:::-;20408:3;20429:67;20493:2;20488:3;20429:67;:::i;:::-;20422:74;;20505:93;20594:3;20505:93;:::i;:::-;20623:2;20618:3;20614:12;20607:19;;20266:366;;;:::o;20638:::-;20780:3;20801:67;20865:2;20860:3;20801:67;:::i;:::-;20794:74;;20877:93;20966:3;20877:93;:::i;:::-;20995:2;20990:3;20986:12;20979:19;;20638:366;;;:::o;21010:::-;21152:3;21173:67;21237:2;21232:3;21173:67;:::i;:::-;21166:74;;21249:93;21338:3;21249:93;:::i;:::-;21367:2;21362:3;21358:12;21351:19;;21010:366;;;:::o;21382:::-;21524:3;21545:67;21609:2;21604:3;21545:67;:::i;:::-;21538:74;;21621:93;21710:3;21621:93;:::i;:::-;21739:2;21734:3;21730:12;21723:19;;21382:366;;;:::o;21754:::-;21896:3;21917:67;21981:2;21976:3;21917:67;:::i;:::-;21910:74;;21993:93;22082:3;21993:93;:::i;:::-;22111:2;22106:3;22102:12;22095:19;;21754:366;;;:::o;22126:::-;22268:3;22289:67;22353:2;22348:3;22289:67;:::i;:::-;22282:74;;22365:93;22454:3;22365:93;:::i;:::-;22483:2;22478:3;22474:12;22467:19;;22126:366;;;:::o;22498:::-;22640:3;22661:67;22725:2;22720:3;22661:67;:::i;:::-;22654:74;;22737:93;22826:3;22737:93;:::i;:::-;22855:2;22850:3;22846:12;22839:19;;22498:366;;;:::o;22870:::-;23012:3;23033:67;23097:2;23092:3;23033:67;:::i;:::-;23026:74;;23109:93;23198:3;23109:93;:::i;:::-;23227:2;23222:3;23218:12;23211:19;;22870:366;;;:::o;23242:::-;23384:3;23405:67;23469:2;23464:3;23405:67;:::i;:::-;23398:74;;23481:93;23570:3;23481:93;:::i;:::-;23599:2;23594:3;23590:12;23583:19;;23242:366;;;:::o;23614:402::-;23774:3;23795:85;23877:2;23872:3;23795:85;:::i;:::-;23788:92;;23889:93;23978:3;23889:93;:::i;:::-;24007:2;24002:3;23998:12;23991:19;;23614:402;;;:::o;24022:366::-;24164:3;24185:67;24249:2;24244:3;24185:67;:::i;:::-;24178:74;;24261:93;24350:3;24261:93;:::i;:::-;24379:2;24374:3;24370:12;24363:19;;24022:366;;;:::o;24394:402::-;24554:3;24575:85;24657:2;24652:3;24575:85;:::i;:::-;24568:92;;24669:93;24758:3;24669:93;:::i;:::-;24787:2;24782:3;24778:12;24771:19;;24394:402;;;:::o;24802:366::-;24944:3;24965:67;25029:2;25024:3;24965:67;:::i;:::-;24958:74;;25041:93;25130:3;25041:93;:::i;:::-;25159:2;25154:3;25150:12;25143:19;;24802:366;;;:::o;25174:108::-;25251:24;25269:5;25251:24;:::i;:::-;25246:3;25239:37;25174:108;;:::o;25288:118::-;25375:24;25393:5;25375:24;:::i;:::-;25370:3;25363:37;25288:118;;:::o;25412:112::-;25495:22;25511:5;25495:22;:::i;:::-;25490:3;25483:35;25412:112;;:::o;25530:435::-;25710:3;25732:95;25823:3;25814:6;25732:95;:::i;:::-;25725:102;;25844:95;25935:3;25926:6;25844:95;:::i;:::-;25837:102;;25956:3;25949:10;;25530:435;;;;;:::o;25971:663::-;26212:3;26234:148;26378:3;26234:148;:::i;:::-;26227:155;;26392:75;26463:3;26454:6;26392:75;:::i;:::-;26492:2;26487:3;26483:12;26476:19;;26505:75;26576:3;26567:6;26505:75;:::i;:::-;26605:2;26600:3;26596:12;26589:19;;26625:3;26618:10;;25971:663;;;;;:::o;26640:967::-;27022:3;27044:148;27188:3;27044:148;:::i;:::-;27037:155;;27209:95;27300:3;27291:6;27209:95;:::i;:::-;27202:102;;27321:148;27465:3;27321:148;:::i;:::-;27314:155;;27486:95;27577:3;27568:6;27486:95;:::i;:::-;27479:102;;27598:3;27591:10;;26640:967;;;;;:::o;27613:222::-;27706:4;27744:2;27733:9;27729:18;27721:26;;27757:71;27825:1;27814:9;27810:17;27801:6;27757:71;:::i;:::-;27613:222;;;;:::o;27841:640::-;28036:4;28074:3;28063:9;28059:19;28051:27;;28088:71;28156:1;28145:9;28141:17;28132:6;28088:71;:::i;:::-;28169:72;28237:2;28226:9;28222:18;28213:6;28169:72;:::i;:::-;28251;28319:2;28308:9;28304:18;28295:6;28251:72;:::i;:::-;28370:9;28364:4;28360:20;28355:2;28344:9;28340:18;28333:48;28398:76;28469:4;28460:6;28398:76;:::i;:::-;28390:84;;27841:640;;;;;;;:::o;28487:373::-;28630:4;28668:2;28657:9;28653:18;28645:26;;28717:9;28711:4;28707:20;28703:1;28692:9;28688:17;28681:47;28745:108;28848:4;28839:6;28745:108;:::i;:::-;28737:116;;28487:373;;;;:::o;28866:::-;29009:4;29047:2;29036:9;29032:18;29024:26;;29096:9;29090:4;29086:20;29082:1;29071:9;29067:17;29060:47;29124:108;29227:4;29218:6;29124:108;:::i;:::-;29116:116;;28866:373;;;;:::o;29245:210::-;29332:4;29370:2;29359:9;29355:18;29347:26;;29383:65;29445:1;29434:9;29430:17;29421:6;29383:65;:::i;:::-;29245:210;;;;:::o;29461:222::-;29554:4;29592:2;29581:9;29577:18;29569:26;;29605:71;29673:1;29662:9;29658:17;29649:6;29605:71;:::i;:::-;29461:222;;;;:::o;29689:442::-;29838:4;29876:2;29865:9;29861:18;29853:26;;29889:71;29957:1;29946:9;29942:17;29933:6;29889:71;:::i;:::-;29970:72;30038:2;30027:9;30023:18;30014:6;29970:72;:::i;:::-;30052;30120:2;30109:9;30105:18;30096:6;30052:72;:::i;:::-;29689:442;;;;;;:::o;30137:664::-;30342:4;30380:3;30369:9;30365:19;30357:27;;30394:71;30462:1;30451:9;30447:17;30438:6;30394:71;:::i;:::-;30475:72;30543:2;30532:9;30528:18;30519:6;30475:72;:::i;:::-;30557;30625:2;30614:9;30610:18;30601:6;30557:72;:::i;:::-;30639;30707:2;30696:9;30692:18;30683:6;30639:72;:::i;:::-;30721:73;30789:3;30778:9;30774:19;30765:6;30721:73;:::i;:::-;30137:664;;;;;;;;:::o;30807:545::-;30980:4;31018:3;31007:9;31003:19;30995:27;;31032:71;31100:1;31089:9;31085:17;31076:6;31032:71;:::i;:::-;31113:68;31177:2;31166:9;31162:18;31153:6;31113:68;:::i;:::-;31191:72;31259:2;31248:9;31244:18;31235:6;31191:72;:::i;:::-;31273;31341:2;31330:9;31326:18;31317:6;31273:72;:::i;:::-;30807:545;;;;;;;:::o;31358:313::-;31471:4;31509:2;31498:9;31494:18;31486:26;;31558:9;31552:4;31548:20;31544:1;31533:9;31529:17;31522:47;31586:78;31659:4;31650:6;31586:78;:::i;:::-;31578:86;;31358:313;;;;:::o;31677:419::-;31843:4;31881:2;31870:9;31866:18;31858:26;;31930:9;31924:4;31920:20;31916:1;31905:9;31901:17;31894:47;31958:131;32084:4;31958:131;:::i;:::-;31950:139;;31677:419;;;:::o;32102:::-;32268:4;32306:2;32295:9;32291:18;32283:26;;32355:9;32349:4;32345:20;32341:1;32330:9;32326:17;32319:47;32383:131;32509:4;32383:131;:::i;:::-;32375:139;;32102:419;;;:::o;32527:::-;32693:4;32731:2;32720:9;32716:18;32708:26;;32780:9;32774:4;32770:20;32766:1;32755:9;32751:17;32744:47;32808:131;32934:4;32808:131;:::i;:::-;32800:139;;32527:419;;;:::o;32952:::-;33118:4;33156:2;33145:9;33141:18;33133:26;;33205:9;33199:4;33195:20;33191:1;33180:9;33176:17;33169:47;33233:131;33359:4;33233:131;:::i;:::-;33225:139;;32952:419;;;:::o;33377:::-;33543:4;33581:2;33570:9;33566:18;33558:26;;33630:9;33624:4;33620:20;33616:1;33605:9;33601:17;33594:47;33658:131;33784:4;33658:131;:::i;:::-;33650:139;;33377:419;;;:::o;33802:::-;33968:4;34006:2;33995:9;33991:18;33983:26;;34055:9;34049:4;34045:20;34041:1;34030:9;34026:17;34019:47;34083:131;34209:4;34083:131;:::i;:::-;34075:139;;33802:419;;;:::o;34227:::-;34393:4;34431:2;34420:9;34416:18;34408:26;;34480:9;34474:4;34470:20;34466:1;34455:9;34451:17;34444:47;34508:131;34634:4;34508:131;:::i;:::-;34500:139;;34227:419;;;:::o;34652:::-;34818:4;34856:2;34845:9;34841:18;34833:26;;34905:9;34899:4;34895:20;34891:1;34880:9;34876:17;34869:47;34933:131;35059:4;34933:131;:::i;:::-;34925:139;;34652:419;;;:::o;35077:::-;35243:4;35281:2;35270:9;35266:18;35258:26;;35330:9;35324:4;35320:20;35316:1;35305:9;35301:17;35294:47;35358:131;35484:4;35358:131;:::i;:::-;35350:139;;35077:419;;;:::o;35502:::-;35668:4;35706:2;35695:9;35691:18;35683:26;;35755:9;35749:4;35745:20;35741:1;35730:9;35726:17;35719:47;35783:131;35909:4;35783:131;:::i;:::-;35775:139;;35502:419;;;:::o;35927:::-;36093:4;36131:2;36120:9;36116:18;36108:26;;36180:9;36174:4;36170:20;36166:1;36155:9;36151:17;36144:47;36208:131;36334:4;36208:131;:::i;:::-;36200:139;;35927:419;;;:::o;36352:::-;36518:4;36556:2;36545:9;36541:18;36533:26;;36605:9;36599:4;36595:20;36591:1;36580:9;36576:17;36569:47;36633:131;36759:4;36633:131;:::i;:::-;36625:139;;36352:419;;;:::o;36777:::-;36943:4;36981:2;36970:9;36966:18;36958:26;;37030:9;37024:4;37020:20;37016:1;37005:9;37001:17;36994:47;37058:131;37184:4;37058:131;:::i;:::-;37050:139;;36777:419;;;:::o;37202:::-;37368:4;37406:2;37395:9;37391:18;37383:26;;37455:9;37449:4;37445:20;37441:1;37430:9;37426:17;37419:47;37483:131;37609:4;37483:131;:::i;:::-;37475:139;;37202:419;;;:::o;37627:::-;37793:4;37831:2;37820:9;37816:18;37808:26;;37880:9;37874:4;37870:20;37866:1;37855:9;37851:17;37844:47;37908:131;38034:4;37908:131;:::i;:::-;37900:139;;37627:419;;;:::o;38052:::-;38218:4;38256:2;38245:9;38241:18;38233:26;;38305:9;38299:4;38295:20;38291:1;38280:9;38276:17;38269:47;38333:131;38459:4;38333:131;:::i;:::-;38325:139;;38052:419;;;:::o;38477:::-;38643:4;38681:2;38670:9;38666:18;38658:26;;38730:9;38724:4;38720:20;38716:1;38705:9;38701:17;38694:47;38758:131;38884:4;38758:131;:::i;:::-;38750:139;;38477:419;;;:::o;38902:::-;39068:4;39106:2;39095:9;39091:18;39083:26;;39155:9;39149:4;39145:20;39141:1;39130:9;39126:17;39119:47;39183:131;39309:4;39183:131;:::i;:::-;39175:139;;38902:419;;;:::o;39327:::-;39493:4;39531:2;39520:9;39516:18;39508:26;;39580:9;39574:4;39570:20;39566:1;39555:9;39551:17;39544:47;39608:131;39734:4;39608:131;:::i;:::-;39600:139;;39327:419;;;:::o;39752:::-;39918:4;39956:2;39945:9;39941:18;39933:26;;40005:9;39999:4;39995:20;39991:1;39980:9;39976:17;39969:47;40033:131;40159:4;40033:131;:::i;:::-;40025:139;;39752:419;;;:::o;40177:::-;40343:4;40381:2;40370:9;40366:18;40358:26;;40430:9;40424:4;40420:20;40416:1;40405:9;40401:17;40394:47;40458:131;40584:4;40458:131;:::i;:::-;40450:139;;40177:419;;;:::o;40602:::-;40768:4;40806:2;40795:9;40791:18;40783:26;;40855:9;40849:4;40845:20;40841:1;40830:9;40826:17;40819:47;40883:131;41009:4;40883:131;:::i;:::-;40875:139;;40602:419;;;:::o;41027:::-;41193:4;41231:2;41220:9;41216:18;41208:26;;41280:9;41274:4;41270:20;41266:1;41255:9;41251:17;41244:47;41308:131;41434:4;41308:131;:::i;:::-;41300:139;;41027:419;;;:::o;41452:::-;41618:4;41656:2;41645:9;41641:18;41633:26;;41705:9;41699:4;41695:20;41691:1;41680:9;41676:17;41669:47;41733:131;41859:4;41733:131;:::i;:::-;41725:139;;41452:419;;;:::o;41877:::-;42043:4;42081:2;42070:9;42066:18;42058:26;;42130:9;42124:4;42120:20;42116:1;42105:9;42101:17;42094:47;42158:131;42284:4;42158:131;:::i;:::-;42150:139;;41877:419;;;:::o;42302:222::-;42395:4;42433:2;42422:9;42418:18;42410:26;;42446:71;42514:1;42503:9;42499:17;42490:6;42446:71;:::i;:::-;42302:222;;;;:::o;42530:129::-;42564:6;42591:20;;:::i;:::-;42581:30;;42620:33;42648:4;42640:6;42620:33;:::i;:::-;42530:129;;;:::o;42665:75::-;42698:6;42731:2;42725:9;42715:19;;42665:75;:::o;42746:307::-;42807:4;42897:18;42889:6;42886:30;42883:56;;;42919:18;;:::i;:::-;42883:56;42957:29;42979:6;42957:29;:::i;:::-;42949:37;;43041:4;43035;43031:15;43023:23;;42746:307;;;:::o;43059:308::-;43121:4;43211:18;43203:6;43200:30;43197:56;;;43233:18;;:::i;:::-;43197:56;43271:29;43293:6;43271:29;:::i;:::-;43263:37;;43355:4;43349;43345:15;43337:23;;43059:308;;;:::o;43373:132::-;43440:4;43463:3;43455:11;;43493:4;43488:3;43484:14;43476:22;;43373:132;;;:::o;43511:::-;43578:4;43601:3;43593:11;;43631:4;43626:3;43622:14;43614:22;;43511:132;;;:::o;43649:114::-;43716:6;43750:5;43744:12;43734:22;;43649:114;;;:::o;43769:::-;43836:6;43870:5;43864:12;43854:22;;43769:114;;;:::o;43889:98::-;43940:6;43974:5;43968:12;43958:22;;43889:98;;;:::o;43993:99::-;44045:6;44079:5;44073:12;44063:22;;43993:99;;;:::o;44098:113::-;44168:4;44200;44195:3;44191:14;44183:22;;44098:113;;;:::o;44217:::-;44287:4;44319;44314:3;44310:14;44302:22;;44217:113;;;:::o;44336:184::-;44435:11;44469:6;44464:3;44457:19;44509:4;44504:3;44500:14;44485:29;;44336:184;;;;:::o;44526:::-;44625:11;44659:6;44654:3;44647:19;44699:4;44694:3;44690:14;44675:29;;44526:184;;;;:::o;44716:168::-;44799:11;44833:6;44828:3;44821:19;44873:4;44868:3;44864:14;44849:29;;44716:168;;;;:::o;44890:169::-;44974:11;45008:6;45003:3;44996:19;45048:4;45043:3;45039:14;45024:29;;44890:169;;;;:::o;45065:148::-;45167:11;45204:3;45189:18;;45065:148;;;;:::o;45219:305::-;45259:3;45278:20;45296:1;45278:20;:::i;:::-;45273:25;;45312:20;45330:1;45312:20;:::i;:::-;45307:25;;45466:1;45398:66;45394:74;45391:1;45388:81;45385:107;;;45472:18;;:::i;:::-;45385:107;45516:1;45513;45509:9;45502:16;;45219:305;;;;:::o;45530:185::-;45570:1;45587:20;45605:1;45587:20;:::i;:::-;45582:25;;45621:20;45639:1;45621:20;:::i;:::-;45616:25;;45660:1;45650:35;;45665:18;;:::i;:::-;45650:35;45707:1;45704;45700:9;45695:14;;45530:185;;;;:::o;45721:348::-;45761:7;45784:20;45802:1;45784:20;:::i;:::-;45779:25;;45818:20;45836:1;45818:20;:::i;:::-;45813:25;;46006:1;45938:66;45934:74;45931:1;45928:81;45923:1;45916:9;45909:17;45905:105;45902:131;;;46013:18;;:::i;:::-;45902:131;46061:1;46058;46054:9;46043:20;;45721:348;;;;:::o;46075:191::-;46115:4;46135:20;46153:1;46135:20;:::i;:::-;46130:25;;46169:20;46187:1;46169:20;:::i;:::-;46164:25;;46208:1;46205;46202:8;46199:34;;;46213:18;;:::i;:::-;46199:34;46258:1;46255;46251:9;46243:17;;46075:191;;;;:::o;46272:96::-;46309:7;46338:24;46356:5;46338:24;:::i;:::-;46327:35;;46272:96;;;:::o;46374:90::-;46408:7;46451:5;46444:13;46437:21;46426:32;;46374:90;;;:::o;46470:77::-;46507:7;46536:5;46525:16;;46470:77;;;:::o;46553:149::-;46589:7;46629:66;46622:5;46618:78;46607:89;;46553:149;;;:::o;46708:126::-;46745:7;46785:42;46778:5;46774:54;46763:65;;46708:126;;;:::o;46840:77::-;46877:7;46906:5;46895:16;;46840:77;;;:::o;46923:86::-;46958:7;46998:4;46991:5;46987:16;46976:27;;46923:86;;;:::o;47015:154::-;47099:6;47094:3;47089;47076:30;47161:1;47152:6;47147:3;47143:16;47136:27;47015:154;;;:::o;47175:307::-;47243:1;47253:113;47267:6;47264:1;47261:13;47253:113;;;47352:1;47347:3;47343:11;47337:18;47333:1;47328:3;47324:11;47317:39;47289:2;47286:1;47282:10;47277:15;;47253:113;;;47384:6;47381:1;47378:13;47375:101;;;47464:1;47455:6;47450:3;47446:16;47439:27;47375:101;47224:258;47175:307;;;:::o;47488:171::-;47527:3;47550:24;47568:5;47550:24;:::i;:::-;47541:33;;47596:4;47589:5;47586:15;47583:41;;;47604:18;;:::i;:::-;47583:41;47651:1;47644:5;47640:13;47633:20;;47488:171;;;:::o;47665:320::-;47709:6;47746:1;47740:4;47736:12;47726:22;;47793:1;47787:4;47783:12;47814:18;47804:81;;47870:4;47862:6;47858:17;47848:27;;47804:81;47932:2;47924:6;47921:14;47901:18;47898:38;47895:84;;;47951:18;;:::i;:::-;47895:84;47716:269;47665:320;;;:::o;47991:281::-;48074:27;48096:4;48074:27;:::i;:::-;48066:6;48062:40;48204:6;48192:10;48189:22;48168:18;48156:10;48153:34;48150:62;48147:88;;;48215:18;;:::i;:::-;48147:88;48255:10;48251:2;48244:22;48034:238;47991:281;;:::o;48278:233::-;48317:3;48340:24;48358:5;48340:24;:::i;:::-;48331:33;;48386:66;48379:5;48376:77;48373:103;;;48456:18;;:::i;:::-;48373:103;48503:1;48496:5;48492:13;48485:20;;48278:233;;;:::o;48517:79::-;48556:7;48585:5;48574:16;;48517:79;;;:::o;48602:176::-;48634:1;48651:20;48669:1;48651:20;:::i;:::-;48646:25;;48685:20;48703:1;48685:20;:::i;:::-;48680:25;;48724:1;48714:35;;48729:18;;:::i;:::-;48714:35;48770:1;48767;48763:9;48758:14;;48602:176;;;;:::o;48784:180::-;48832:77;48829:1;48822:88;48929:4;48926:1;48919:15;48953:4;48950:1;48943:15;48970:180;49018:77;49015:1;49008:88;49115:4;49112:1;49105:15;49139:4;49136:1;49129:15;49156:180;49204:77;49201:1;49194:88;49301:4;49298:1;49291:15;49325:4;49322:1;49315:15;49342:180;49390:77;49387:1;49380:88;49487:4;49484:1;49477:15;49511:4;49508:1;49501:15;49528:180;49576:77;49573:1;49566:88;49673:4;49670:1;49663:15;49697:4;49694:1;49687:15;49714:180;49762:77;49759:1;49752:88;49859:4;49856:1;49849:15;49883:4;49880:1;49873:15;49900:117;50009:1;50006;49999:12;50023:117;50132:1;50129;50122:12;50146:117;50255:1;50252;50245:12;50269:117;50378:1;50375;50368:12;50392:117;50501:1;50498;50491:12;50515:117;50624:1;50621;50614:12;50638:102;50679:6;50730:2;50726:7;50721:2;50714:5;50710:14;50706:28;50696:38;;50638:102;;;:::o;50746:174::-;50886:26;50882:1;50874:6;50870:14;50863:50;50746:174;:::o;50926:182::-;51066:34;51062:1;51054:6;51050:14;51043:58;50926:182;:::o;51114:230::-;51254:34;51250:1;51242:6;51238:14;51231:58;51323:13;51318:2;51310:6;51306:15;51299:38;51114:230;:::o;51350:181::-;51490:33;51486:1;51478:6;51474:14;51467:57;51350:181;:::o;51537:237::-;51677:34;51673:1;51665:6;51661:14;51654:58;51746:20;51741:2;51733:6;51729:15;51722:45;51537:237;:::o;51780:225::-;51920:34;51916:1;51908:6;51904:14;51897:58;51989:8;51984:2;51976:6;51972:15;51965:33;51780:225;:::o;52011:178::-;52151:30;52147:1;52139:6;52135:14;52128:54;52011:178;:::o;52195:214::-;52335:66;52331:1;52323:6;52319:14;52312:90;52195:214;:::o;52415:223::-;52555:34;52551:1;52543:6;52539:14;52532:58;52624:6;52619:2;52611:6;52607:15;52600:31;52415:223;:::o;52644:175::-;52784:27;52780:1;52772:6;52768:14;52761:51;52644:175;:::o;52825:167::-;52965:19;52961:1;52953:6;52949:14;52942:43;52825:167;:::o;52998:221::-;53138:34;53134:1;53126:6;53122:14;53115:58;53207:4;53202:2;53194:6;53190:15;53183:29;52998:221;:::o;53225:231::-;53365:34;53361:1;53353:6;53349:14;53342:58;53434:14;53429:2;53421:6;53417:15;53410:39;53225:231;:::o;53462:243::-;53602:34;53598:1;53590:6;53586:14;53579:58;53671:26;53666:2;53658:6;53654:15;53647:51;53462:243;:::o;53711:229::-;53851:34;53847:1;53839:6;53835:14;53828:58;53920:12;53915:2;53907:6;53903:15;53896:37;53711:229;:::o;53946:228::-;54086:34;54082:1;54074:6;54070:14;54063:58;54155:11;54150:2;54142:6;54138:15;54131:36;53946:228;:::o;54180:221::-;54320:34;54316:1;54308:6;54304:14;54297:58;54389:4;54384:2;54376:6;54372:15;54365:29;54180:221;:::o;54407:182::-;54547:34;54543:1;54535:6;54531:14;54524:58;54407:182;:::o;54595:231::-;54735:34;54731:1;54723:6;54719:14;54712:58;54804:14;54799:2;54791:6;54787:15;54780:39;54595:231;:::o;54832:182::-;54972:34;54968:1;54960:6;54956:14;54949:58;54832:182;:::o;55020:228::-;55160:34;55156:1;55148:6;55144:14;55137:58;55229:11;55224:2;55216:6;55212:15;55205:36;55020:228;:::o;55254:234::-;55394:34;55390:1;55382:6;55378:14;55371:58;55463:17;55458:2;55450:6;55446:15;55439:42;55254:234;:::o;55494:220::-;55634:34;55630:1;55622:6;55618:14;55611:58;55703:3;55698:2;55690:6;55686:15;55679:28;55494:220;:::o;55720:236::-;55860:34;55856:1;55848:6;55844:14;55837:58;55929:19;55924:2;55916:6;55912:15;55905:44;55720:236;:::o;55962:173::-;56102:25;56098:1;56090:6;56086:14;56079:49;55962:173;:::o;56141:235::-;56281:34;56277:1;56269:6;56265:14;56258:58;56350:18;56345:2;56337:6;56333:15;56326:43;56141:235;:::o;56382:167::-;56522:19;56518:1;56510:6;56506:14;56499:43;56382:167;:::o;56555:234::-;56695:34;56691:1;56683:6;56679:14;56672:58;56764:17;56759:2;56751:6;56747:15;56740:42;56555:234;:::o;56795:122::-;56868:24;56886:5;56868:24;:::i;:::-;56861:5;56858:35;56848:63;;56907:1;56904;56897:12;56848:63;56795:122;:::o;56923:116::-;56993:21;57008:5;56993:21;:::i;:::-;56986:5;56983:32;56973:60;;57029:1;57026;57019:12;56973:60;56923:116;:::o;57045:122::-;57118:24;57136:5;57118:24;:::i;:::-;57111:5;57108:35;57098:63;;57157:1;57154;57147:12;57098:63;57045:122;:::o;57173:120::-;57245:23;57262:5;57245:23;:::i;:::-;57238:5;57235:34;57225:62;;57283:1;57280;57273:12;57225:62;57173:120;:::o;57299:122::-;57372:24;57390:5;57372:24;:::i;:::-;57365:5;57362:35;57352:63;;57411:1;57408;57401:12;57352:63;57299:122;:::o
Swarm Source
ipfs://74f7d7a7e6840b3025a1acc34868657988846c4888e72b1d625a8f5bb9f0c6f0
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.