ERC-721
Overview
Max Total Supply
187 MNFT
Holders
59
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 MNFTLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MetNFT
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-03-29 */ // File: @openzeppelin/[email protected]/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/[email protected]/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/[email protected]/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/[email protected]/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/[email protected]/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (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 Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { 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/[email protected]/utils/Address.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/[email protected]/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/[email protected]/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/[email protected]/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/[email protected]/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/[email protected]/token/common/ERC2981.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File: @openzeppelin/[email protected]/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/[email protected]/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.8.2) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @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 _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such * that `ownerOf(tokenId)` is `a`. */ // solhint-disable-next-line func-name-mixedcase function __unsafe_increaseBalance(address account, uint256 amount) internal { _balances[account] += amount; } } // File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721URIStorage.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev See {ERC721-_burn}. This override additionally checks to see if a * token-specific URI was set for the token, and if so, it deletes the token URI from * the storage mapping. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev See {ERC721-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual override { super._beforeTokenTransfer(from, to, firstTokenId, batchSize); if (batchSize > 1) { // Will only trigger during construction. Batch transferring (minting) is not available afterwards. revert("ERC721Enumerable: consecutive transfers not supported"); } uint256 tokenId = firstTokenId; if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts/MetNFT.sol pragma solidity ^0.8.9; contract MetNFT is ERC721,ERC721Enumerable, ERC2981, Pausable, ERC721URIStorage, Ownable { // public uint balance[] = [1, 2, 3]; uint256[] public commonnft = [1,13,17,19,27,41,53,80,106,119,136,143,159,183,184,217,222,234,235,242,247,250,253,274,293,318,319,348,358,399,426,445,447,460,461,480,492,2,7,23,26,44,57,65,79,89,92,97,100,104,122,132,139,153,154,167,171,178,182,187,189,213,258,266,273,276,308,311,315,326,333,336,372,373,381,382,384,412,416,427,436,439,443,451,456,470,472,476,477,484,498,3,10,36,42,43,48,67,71,72,75,83,87,90,93,95,114,129,134,146,155,193,194,209,224,229,232,236,239,255,261,263,275,278,292,303,306,322,331,337,341,350,352,374,388,404,413,418,431,437,438,449,485,499,5,22,28,35,49,70,81,85,105,111,115,138,160,181,198,210,219,231,254,265,271,279,291,300,307,309,313,334,390,391,392,397,401,415,425,442,446,448,450,489,491,20,25,33,40,50,54,55,62,64,76,77,88,94,107,113,118,124,127,151,169,179,185,190,199,207,208,211,212,216,220,226,227,240,256,267,299,328,330,345,364,369,377,378,402,407,414,424,434,455,458,495]; uint256[] public lesscommonnft = [4,16,32,34,52,61,63,73,82,86,91,131,133,149,162,173,192,223,246,268,285,287,302,312,344,363,367,396,403,411,422,444,459,475,494,9,14,38,39,68,99,112,130,144,166,176,230,233,241,259,264,277,289,296,297,327,342,354,359,365,379,383,398,405,417,441,466,11,12,30,31,58,74,78,117,148,200,205,215,245,249,324,353,355,406,423,432,433,440,452,453,473,474,500,15,21,45,46,56,125,170,214,243,257,301,304,316,317,320,325,349,357,362,380,385,393,400,429,490,18,51,66,84,101,108,126,135,161,165,172,177,191,202,237,252,262,284,290,298,329,343,420,421,463,471,482,486]; uint256[] public rarenft = [6,69,98,120,140,141,147,150,168,186,195,201,251,288,332,419,457,465,469,496,24,47,103,157,158,175,203,218,228,286,295,314,356,361,368,371,376,386,409,488,29,102,110,116,156,163,174,180,206,283,310,323,339,346,360,366,395,454,462,487,37,60,142,145,204,221,238,260,269,280,370,375,408,410,435,464,467,479,497,96,128,137,152,164,188,196,248,282,294,305,335,338,340,347,351,389,428,481,493]; uint256[] public superrarenft = [8,121,244,272,281,478,59,109,123,197,225,270,321,387,394,430,468,483]; uint256 public cRate = 0.05 ether; uint256 public lcRate = 0.075 ether; uint256 public rRate = 0.1 ether; uint256 public srRate = 0.15 ether; string public baseURI = "https://metchain.tech/api/metajs/"; uint public MAX_SUPPLY = 500; string public contractURI; /*function contractURI() public pure returns (string memory) { return "https://api.npoint.io/91c61c485a95e8a3666c/"; }*/ constructor(string memory _name, string memory _symbol, uint96 _royaltyFeesInBips, string memory _contractURI) ERC721(_name, _symbol) { setRoyaltyInfo(msg.sender, _royaltyFeesInBips); contractURI = _contractURI; } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function tokenURI(uint256 tokenId) public view override (ERC721, ERC721URIStorage) returns (string memory) { _requireMinted(tokenId); string memory baseURI_ = _baseURI(); return bytes(baseURI_).length > 0 ? string(abi.encodePacked(baseURI_, Strings.toString(tokenId),".json")) : ""; } function _baseURI() internal view override returns (string memory) { return baseURI; } function ChangeBaseURI(string memory baseUri_)public onlyOwner{ baseURI = baseUri_; } function MinttheNft(address to, uint256 tokenId, uint256 pRate) internal { require(msg.value >= pRate , "Not Enough ether sent."); require(balanceOf(to) <= 1 , "You already have 2 NFT's"); //require(commonnft.length >= 1 , "NFT's are exhusted. Try others."); _safeMint(to, tokenId); } function MinttheNftAirDrop(address to, uint256 tokenId) internal { _safeMint(to, tokenId); } function safeMintCommon(address to) public payable { uint256 tokenId= commonnft[commonnft.length - 1]; MinttheNft(to,tokenId , cRate); commonnft.pop(); } function safeMintLessCommon(address to) public payable { uint256 tokenId= lesscommonnft[lesscommonnft.length - 1]; MinttheNft(to,tokenId , lcRate); lesscommonnft.pop(); } function safeMintRare(address to) public payable { uint256 tokenId= rarenft[rarenft.length - 1]; MinttheNft(to,tokenId , rRate); rarenft.pop(); } function safeMintSuperRare(address to) public payable { uint256 tokenId= superrarenft[superrarenft.length - 1]; MinttheNft(to,tokenId , srRate); superrarenft.pop(); } function BulkComonAirDrop(address[] calldata commonTo, uint256 [] calldata commonAmounts) public onlyOwner{ require(commonTo.length == commonAmounts.length, "Common NFT Receivers and Amount are diffrent"); /* Common NFT Air Drop */ for(uint256 i = 0; i < commonTo.length; i++){ for(uint j = 0; j < commonAmounts[i]; j++ ){ uint256 tokenId= commonnft[commonnft.length - 1]; MinttheNftAirDrop(commonTo[i],tokenId); commonnft.pop(); } } } function BulkAirDropNFT(address[] calldata lessCommonTo, uint256 [] calldata lessCommonAmounts,address[] calldata rareTo, uint256 [] calldata rareAmounts,address[] calldata superRareTo, uint256 [] calldata superRareAmounts)public onlyOwner{ // require(lessCommonTo.length == lessCommonAmounts.length, "Less Common NFT Receivers and Amount are diffrent"); require(rareTo.length == rareAmounts.length, "Rare Receivers NFT and Amount are diffrent"); require(superRareTo.length == superRareAmounts.length, "Super Rare NFT Receivers and Amount are diffrent"); /*Less Common NFT Air Drop */ for(uint256 i = 0; i < lessCommonTo.length; i++){ for(uint j = 0; j < lessCommonAmounts[i]; j++ ){ uint256 tokenId= lesscommonnft[lesscommonnft.length - 1]; MinttheNftAirDrop(lessCommonTo[i],tokenId); lesscommonnft.pop(); } } /*Rare NFT Air Drop */ for(uint256 i = 0; i < rareTo.length; i++){ for(uint j = 0; j < rareAmounts[i]; j++ ){ uint256 tokenId= rarenft[rarenft.length - 1]; MinttheNftAirDrop(rareTo[i],tokenId); rarenft.pop(); } } /*Super Rare NFT Air Drop */ for(uint256 i = 0; i < superRareTo.length; i++){ for(uint j = 0; j < superRareAmounts[i]; j++ ){ uint256 tokenId= superrarenft[superrarenft.length - 1]; MinttheNftAirDrop(superRareTo[i],tokenId); superrarenft.pop(); } } } function withdraw(address to) public onlyOwner { require(address(this).balance > 0, "Balance is 0"); payable(to).transfer(address(this).balance); } function _beforeTokenTransfer(address from, address to, uint256 tokenId, uint256 batchSize) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId, batchSize); } function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC2981, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } function setRoyaltyInfo(address _receiver, uint96 _royaltyFeesInBips) public onlyOwner { _setDefaultRoyalty(_receiver, _royaltyFeesInBips); } function setContractURI(string calldata _contractURI) public onlyOwner{ contractURI = _contractURI; } }
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":"uint96","name":"_royaltyFeesInBips","type":"uint96"},{"internalType":"string","name":"_contractURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address[]","name":"lessCommonTo","type":"address[]"},{"internalType":"uint256[]","name":"lessCommonAmounts","type":"uint256[]"},{"internalType":"address[]","name":"rareTo","type":"address[]"},{"internalType":"uint256[]","name":"rareAmounts","type":"uint256[]"},{"internalType":"address[]","name":"superRareTo","type":"address[]"},{"internalType":"uint256[]","name":"superRareAmounts","type":"uint256[]"}],"name":"BulkAirDropNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"commonTo","type":"address[]"},{"internalType":"uint256[]","name":"commonAmounts","type":"uint256[]"}],"name":"BulkComonAirDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseUri_","type":"string"}],"name":"ChangeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"commonnft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lcRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lesscommonnft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rarenft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMintCommon","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMintLessCommon","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMintRare","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMintSuperRare","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"_royaltyFeesInBips","type":"uint96"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"srRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"superrarenft","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
611e00604090815260016080908152600d60a0908152601160c052601360e0908152601b6101009081526029610120526035610140526050610160908152606a61018090815260776101a090815260886101c0908152608f6101e0908152609f6102005260b76102205260b86102405260d96102605260de6102805260ea6102a05260eb6102c05260f26102e05260f76103005260fa6103205260fd61034052610112610360526101256103805261013e6103a05261013f6103c05261015c6103e0526101666104005261018f610420526101aa610440526101bd610460526101bf610480526101cc6104a0526101cd6104c0526104e0526101ec61050052600261052052600761054052601761056052601a61058052602c6105a05260396105c05260416105e052604f61060052605961062052605c6106405260616106605260646106805260686106a052607a6106c05260846106e052608b61070052609961072052609a6107405260a76107605260ab6107805260b26107a05260b66107c05260bb6107e05260bd6108005260d5610820526101026108405261010a61086052610111610880526101146108a0526101346108c0526101376108e05261013b610900526101466109205261014d6109405261015061096052610174610980526101756109a05261017d6109c05261017e6109e052610a009290925261019c610a2052610a40526101ab610a60526101b4610a80526101b7610aa0526101bb610ac0526101c3610ae0526101c8610b00526101d6610b20526101d8610b40526101dc610b60526101dd610b80526101e4610ba0526101f2610bc0526003610be052600a610c00526024610c2052602a610c4052602b610c60526030610c80526043610ca0526047610cc0526048610ce052604b610d00526053610d20526057610d4052605a610d6052605d610d8052605f610da0526072610dc0526081610de0526086610e00526092610e2052609b610e405260c1610e605260c2610e805260d1610ea052610ec09390935260e5610ee05260e8610f005260ec610f2081905260ef610f405260ff610f6052610105610f8052610107610fa052610113610fc052610116610fe0526101246110005261012f61102052610132611040526101426110605261014b611080526101516110a0526101556110c05261015e6110e0526111009190915261017661112052610184611140526101946111605261019d611180526101a26111a0526101af6111c0526101b56111e0526101b6611200526101c1611220526101e5611240526101f36112605260056112805260166112a052601c6112c05260236112e052603161130052604661132052605161134052605561136052606961138052606f6113a05260736113c052608a6113e0526114009390935260b56114205260c66114405260d26114605260db6114805260e76114a05260fe6114c0526101096114e05261010f61150052610117611520526101236115405261012c61156052610133611580526101356115a0526101396115c05261014e6115e05261018661160052610187611620526101886116405261018d611660526101916116805261019f6116a0526101a96116c0526101ba6116e0526101be61170052611720919091526101c2611740526101e9611760526101eb6117805260146117a05260196117c05260216117e052602861180052603261182052603661184052603761186052603e611880526118a093909352604c6118c052604d6118e052605861190052605e61192052606b61194052607161196052607661198052607c6119a052607f6119c05260976119e05260a9611a005260b3611a205260b9611a405260be611a605260c7611a805260cf611aa05260d0611ac05260d3611ae05260d4611b005260d8611b205260dc611b405260e2611b605260e3611b805260f0611ba052611bc09290925261010b611be05261012b611c0052610148611c205261014a611c4052610159611c605261016c611c8052610171611ca052610179611cc05261017a611ce052610192611d0052610197611d205261019e611d40526101a8611d60526101b2611d80526101c7611da0526101ca611dc0526101ef611de0526200061691600f9190620011e0565b5060408051611260810182526004815260106020808301829052928201929092526022606082015260346080820152603d60a0820152603f60c080830191909152604960e083015260526101008301526056610120830152605b610140808401919091526083610160840152608561018084015260956101a084015260a26101c084015260ad6101e084015261020083019190915260df61022083015260f661024083015261010c61026083015261011d61028083015261011f6102a083015261012e6102c08301526101386102e083015261015861030083015261016b61032083015261016f61034083015261018c61036083015261019361038083015261019b6103a08301526101a66103c08301526101bc6103e08301526101cb6104008301526101db6104208301526101ee6104408301526009610460830152600e61048083015260266104a083015260276104c083015260446104e0830152606361050083015260706105208301526082610540830152609061056083015260a661058083015260b06105a083015260e66105c083015260e96105e083015260f16106008301526101036106208301526101086106408301526101156106608301526101216106808301526101286106a08301526101296106c08301526101476106e083015261015661070083015261016261072083015261016761074083015261016d61076083015261017b61078083015261017f6107a083015261018e6107c08301526101956107e08301526101a16108008301526101b96108208301526101d2610840830152600b610860830152600c610880830152601e6108a0830152601f6108c0830152603a6108e0830152604a610900830152604e6109208301526075610940830152609461096083015260c861098083015260cd6109a083015260d76109c083015260f56109e083015260f9610a00830152610144610a20830152610161610a40830152610163610a60830152610196610a808301526101a7610aa08301526101b0610ac08301526101b1610ae08301526101b8610b008301526101c4610b208301526101c5610b408301526101d9610b608301526101da610b808301526101f4610ba0830152600f610bc08301526015610be0830152602d610c00830152602e610c208301526038610c40830152607d610c6083015260aa610c8083015260d6610ca083015260f3610cc0830152610101610ce083015261012d610d00830152610130610d2083015261013c610d4083015261013d610d60830152610d80820152610145610da082015261015d610dc0820152610165610de082015261016a610e0082015261017c610e20820152610181610e40820152610189610e60820152610190610e808201526101ad610ea08201526101ea610ec08201526012610ee08201526033610f008201526042610f208201526054610f408201526065610f60820152606c610f80820152607e610fa08201526087610fc082015260a1610fe082015260a561100082015260ac61102082015260b161104082015260bf61106082015260ca61108082015260ed6110a082015260fc6110c08201526101066110e082015261011c61110082015261012261112082015261012a6111408201526101496111608201526101576111808201526101a46111a08201526101a56111c08201526101cf6111e08201526101d76112008201526101e26112208201526101e661124082015262000b1191906093620011e0565b5060408051610c608101825260068152604560208201526062918101919091526078606080830191909152608c608080840191909152608d60a0840152609360c0840152609660e084015260a861010084015260ba6101208085019190915260c361014085015260c961016085015260fb6101808501526101a084015261014c6101c08401526101a36101e08401526101c96102008401526101d16102208401526101d56102408401526101f06102608401526018610280840152602f6102a084015260676102c0840152609d6102e0840152609e61030084015260af61032084015260cb61034084015260da61036084015260e461038084015261011e6103a08401526101276103c084015261013a6103e08401526101646104008401526101696104208401526101706104408401526101736104608401526101786104808401526101826104a08401526101996104c08401526101e86104e0840152601d6105008401526066610520840152606e6105408401526074610560840152609c61058084015260a36105a084015260ae6105c084015260b46105e084015260ce61060084015261011b61062084015261013661064084015261014361066084015261015361068084015261015a6106a08401526101686106c084015261016e6106e084015261018b6107008401526101c66107208401526101ce6107408401526101e76107608401526025610780840152603c6107a0840152608e6107c084015260916107e084015260cc61080084015260dd61082084015260ee61084084015261010461086084015261010d6108808401526101186108a08401526101726108c08401526101776108e084015261019861090084015261019a6109208401526101b36109408401526101d06109608401526101d36109808401526101df6109a08401526101f16109c08401526109e0830191909152610a008201526089610a208201526098610a4082015260a4610a6082015260bc610a8082015260c4610aa082015260f8610ac082015261011a610ae0820152610126610b00820152610131610b2082015261014f610b40820152610152610b60820152610154610b8082015261015b610ba082015261015f610bc0820152610185610be08201526101ac610c008201526101e1610c208201526101ed610c4082015262000e79906011906063620011e0565b506040805161024081018252600881526079602082015260f491810191909152610110606082015261011960808201526101de60a0820152603b60c0820152606d60e0820152607b61010082015260c561012082015260e161014082015261010e6101608201526101416101808201526101836101a082015261018a6101c08201526101ae6101e08201526101d46102008201526101e361022082015262000f259060129081620011e0565b5066b1a2bc2ec5000060135567010a741a4627800060145567016345785d8a0000601555670214e8348c4f0000601655604051806060016040528060218152602001620044326021913960179062000f7e9082620012f2565b506101f460185534801562000f9257600080fd5b50604051620044533803806200445383398101604081905262000fb5916200146d565b8383600062000fc58382620012f2565b50600162000fd48282620012f2565b5050600c805460ff191690555062000fec3362001011565b62000ff8338362001063565b6019620010068282620012f2565b505050505062001520565b600e80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200106d6200107d565b620010798282620010df565b5050565b600e546001600160a01b03163314620010dd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b565b6127106001600160601b03821611156200114f5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401620010d4565b6001600160a01b038216620011a75760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401620010d4565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b82805482825590600052602060002090810192821562001224579160200282015b8281111562001224578251829061ffff1690559160200191906001019062001201565b506200123292915062001236565b5090565b5b8082111562001232576000815560010162001237565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200127857607f821691505b6020821081036200129957634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620012ed57600081815260208120601f850160051c81016020861015620012c85750805b601f850160051c820191505b81811015620012e957828155600101620012d4565b5050505b505050565b81516001600160401b038111156200130e576200130e6200124d565b62001326816200131f845462001263565b846200129f565b602080601f8311600181146200135e5760008415620013455750858301515b600019600386901b1c1916600185901b178555620012e9565b600085815260208120601f198616915b828110156200138f578886015182559484019460019091019084016200136e565b5085821015620013ae5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600082601f830112620013d057600080fd5b81516001600160401b0380821115620013ed57620013ed6200124d565b604051601f8301601f19908116603f011681019082821181831017156200141857620014186200124d565b816040528381526020925086838588010111156200143557600080fd5b600091505b838210156200145957858201830151818301840152908201906200143a565b600093810190920192909252949350505050565b600080600080608085870312156200148457600080fd5b84516001600160401b03808211156200149c57600080fd5b620014aa88838901620013be565b95506020870151915080821115620014c157600080fd5b620014cf88838901620013be565b604088015190955091506001600160601b0382168214620014ef57600080fd5b6060870151919350808211156200150557600080fd5b506200151487828801620013be565b91505092959194509250565b612f0280620015306000396000f3fe6080604052600436106102675760003560e01c80638456cb5911610144578063b88d4fde116100b6578063d11c064f1161007a578063d11c064f146106e1578063e33d3f0214610701578063e8a3d48514610721578063e985e9c514610736578063efcd0c531461077f578063f2fde38b1461079257600080fd5b8063b88d4fde14610655578063c3ea2cd214610675578063c86b340a14610695578063c87b56dd146106ab578063cc9d1a71146106cb57600080fd5b8063938e3d7b11610108578063938e3d7b146105ad57806395d89b41146105cd5780639919ddaa146105e2578063a22cb46514610602578063ac6fa27414610622578063b659692e1461063557600080fd5b80638456cb591461052e57806387cb31301461054357806388232a59146105595780638a274cdd1461056f5780638da5cb5b1461058f57600080fd5b806342842e0e116101dd5780635c975abb116101a15780635c975abb1461048c5780636352211e146104a45780636c0360eb146104c457806370a08231146104d9578063715018a6146104f95780637fdc86b71461050e57600080fd5b806342842e0e14610406578063447618d9146104265780634f6ccce7146104395780634f883f351461045957806351cff8d91461046c57600080fd5b806318160ddd1161022f57806318160ddd1461033d57806323b872dd1461035c5780632a55205a1461037c5780632f745c59146103bb57806332cb6b0c146103db5780633f4ba83a146103f157600080fd5b806301ffc9a71461026c57806302fa7c47146102a157806306fdde03146102c3578063081812fc146102e5578063095ea7b31461031d575b600080fd5b34801561027857600080fd5b5061028c6102873660046124f8565b6107b2565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b506102c16102bc366004612531565b6107c3565b005b3480156102cf57600080fd5b506102d86107d9565b60405161029891906125c4565b3480156102f157600080fd5b506103056103003660046125d7565b61086b565b6040516001600160a01b039091168152602001610298565b34801561032957600080fd5b506102c16103383660046125f0565b610892565b34801561034957600080fd5b506008545b604051908152602001610298565b34801561036857600080fd5b506102c161037736600461261a565b6109ac565b34801561038857600080fd5b5061039c610397366004612656565b6109dd565b604080516001600160a01b039093168352602083019190915201610298565b3480156103c757600080fd5b5061034e6103d63660046125f0565b610a8b565b3480156103e757600080fd5b5061034e60185481565b3480156103fd57600080fd5b506102c1610b21565b34801561041257600080fd5b506102c161042136600461261a565b610b33565b6102c1610434366004612678565b610b4e565b34801561044557600080fd5b5061034e6104543660046125d7565b610bb7565b6102c1610467366004612678565b610c4a565b34801561047857600080fd5b506102c1610487366004612678565b610c99565b34801561049857600080fd5b50600c5460ff1661028c565b3480156104b057600080fd5b506103056104bf3660046125d7565b610d15565b3480156104d057600080fd5b506102d8610d75565b3480156104e557600080fd5b5061034e6104f4366004612678565b610e03565b34801561050557600080fd5b506102c1610e89565b34801561051a57600080fd5b506102c16105293660046126d7565b610e9b565b34801561053a57600080fd5b506102c1610feb565b34801561054f57600080fd5b5061034e60135481565b34801561056557600080fd5b5061034e60145481565b34801561057b57600080fd5b506102c161058a3660046127cd565b610ffb565b34801561059b57600080fd5b50600e546001600160a01b0316610305565b3480156105b957600080fd5b506102c16105c8366004612815565b61100f565b3480156105d957600080fd5b506102d8611024565b3480156105ee57600080fd5b5061034e6105fd3660046125d7565b611033565b34801561060e57600080fd5b506102c161061d366004612886565b611054565b6102c1610630366004612678565b61105f565b34801561064157600080fd5b5061034e6106503660046125d7565b6110ae565b34801561066157600080fd5b506102c16106703660046128b7565b6110be565b34801561068157600080fd5b5061034e6106903660046125d7565b6110f6565b3480156106a157600080fd5b5061034e60155481565b3480156106b757600080fd5b506102d86106c63660046125d7565b611106565b3480156106d757600080fd5b5061034e60165481565b3480156106ed57600080fd5b5061034e6106fc3660046125d7565b61116d565b34801561070d57600080fd5b506102c161071c366004612932565b61117d565b34801561072d57600080fd5b506102d861150f565b34801561074257600080fd5b5061028c610751366004612a6f565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6102c161078d366004612678565b61151c565b34801561079e57600080fd5b506102c16107ad366004612678565b61156b565b60006107bd826115e4565b92915050565b6107cb611609565b6107d58282611663565b5050565b6060600080546107e890612aa2565b80601f016020809104026020016040519081016040528092919081815260200182805461081490612aa2565b80156108615780601f1061083657610100808354040283529160200191610861565b820191906000526020600020905b81548152906001019060200180831161084457829003601f168201915b5050505050905090565b600061087682611760565b506000908152600460205260409020546001600160a01b031690565b600061089d82610d15565b9050806001600160a01b0316836001600160a01b03160361090f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b038216148061092b575061092b8133610751565b61099d5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610906565b6109a783836117bf565b505050565b6109b6338261182d565b6109d25760405162461bcd60e51b815260040161090690612adc565b6109a78383836118ac565b6000828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610a52575060408051808201909152600a546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610a71906001600160601b031687612b3f565b610a7b9190612b56565b91519350909150505b9250929050565b6000610a9683610e03565b8210610af85760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610906565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610b29611609565b610b31611a1d565b565b6109a7838383604051806020016040528060008152506110be565b600f805460009190610b6290600190612b78565b81548110610b7257610b72612b8b565b90600052602060002001549050610b8c8282601354611a6f565b600f805480610b9d57610b9d612ba1565b600190038181906000526020600020016000905590555050565b6000610bc260085490565b8210610c255760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610906565b60088281548110610c3857610c38612b8b565b90600052602060002001549050919050565b6010805460009190610c5e90600190612b78565b81548110610c6e57610c6e612b8b565b90600052602060002001549050610c888282601454611a6f565b6010805480610b9d57610b9d612ba1565b610ca1611609565b60004711610ce05760405162461bcd60e51b815260206004820152600c60248201526b042616c616e636520697320360a41b6044820152606401610906565b6040516001600160a01b038216904780156108fc02916000818181858888f193505050501580156107d5573d6000803e3d6000fd5b6000818152600260205260408120546001600160a01b0316806107bd5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610906565b60178054610d8290612aa2565b80601f0160208091040260200160405190810160405280929190818152602001828054610dae90612aa2565b8015610dfb5780601f10610dd057610100808354040283529160200191610dfb565b820191906000526020600020905b815481529060010190602001808311610dde57829003601f168201915b505050505081565b60006001600160a01b038216610e6d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610906565b506001600160a01b031660009081526003602052604090205490565b610e91611609565b610b316000611b1b565b610ea3611609565b828114610f075760405162461bcd60e51b815260206004820152602c60248201527f436f6d6d6f6e204e46542052656365697665727320616e6420416d6f756e742060448201526b185c9948191a59999c995b9d60a21b6064820152608401610906565b60005b83811015610fe45760005b838383818110610f2757610f27612b8b565b90506020020135811015610fd157600f805460009190610f4990600190612b78565b81548110610f5957610f59612b8b565b90600052602060002001549050610f96878785818110610f7b57610f7b612b8b565b9050602002016020810190610f909190612678565b82611b6d565b600f805480610fa757610fa7612ba1565b60019003818190600052602060002001600090559055508080610fc990612bb7565b915050610f15565b5080610fdc81612bb7565b915050610f0a565b5050505050565b610ff3611609565b610b31611b77565b611003611609565b60176107d58282612c1e565b611017611609565b60196109a7828483612cdd565b6060600180546107e890612aa2565b6010818154811061104357600080fd5b600091825260209091200154905081565b6107d5338383611bb4565b601180546000919061107390600190612b78565b8154811061108357611083612b8b565b9060005260206000200154905061109d8282601554611a6f565b6011805480610b9d57610b9d612ba1565b6012818154811061104357600080fd5b6110c8338361182d565b6110e45760405162461bcd60e51b815260040161090690612adc565b6110f084848484611c82565b50505050565b600f818154811061104357600080fd5b606061111182611760565b600061111b611cb5565b9050600081511161113b5760405180602001604052806000815250611166565b8061114584611cc4565b604051602001611156929190612d9c565b6040516020818303038152906040525b9392505050565b6011818154811061104357600080fd5b611185611609565b8a89146111ee5760405162461bcd60e51b815260206004820152603160248201527f4c65737320436f6d6d6f6e204e46542052656365697665727320616e6420416d6044820152701bdd5b9d08185c9948191a59999c995b9d607a1b6064820152608401610906565b8685146112505760405162461bcd60e51b815260206004820152602a60248201527f5261726520526563656976657273204e465420616e6420416d6f756e742061726044820152691948191a59999c995b9d60b21b6064820152608401610906565b8281146112b85760405162461bcd60e51b815260206004820152603060248201527f53757065722052617265204e46542052656365697665727320616e6420416d6f60448201526f1d5b9d08185c9948191a59999c995b9d60821b6064820152608401610906565b60005b8b81101561137a5760005b8b8b838181106112d8576112d8612b8b565b905060200201358110156113675760108054600091906112fa90600190612b78565b8154811061130a5761130a612b8b565b9060005260206000200154905061132c8f8f85818110610f7b57610f7b612b8b565b601080548061133d5761133d612ba1565b6001900381819060005260206000200160009055905550808061135f90612bb7565b9150506112c6565b508061137281612bb7565b9150506112bb565b5060005b8781101561143d5760005b87878381811061139b5761139b612b8b565b9050602002013581101561142a5760118054600091906113bd90600190612b78565b815481106113cd576113cd612b8b565b906000526020600020015490506113ef8b8b85818110610f7b57610f7b612b8b565b601180548061140057611400612ba1565b6001900381819060005260206000200160009055905550808061142290612bb7565b915050611389565b508061143581612bb7565b91505061137e565b5060005b838110156115005760005b83838381811061145e5761145e612b8b565b905060200201358110156114ed57601280546000919061148090600190612b78565b8154811061149057611490612b8b565b906000526020600020015490506114b2878785818110610f7b57610f7b612b8b565b60128054806114c3576114c3612ba1565b600190038181906000526020600020016000905590555080806114e590612bb7565b91505061144c565b50806114f881612bb7565b915050611441565b50505050505050505050505050565b60198054610d8290612aa2565b601280546000919061153090600190612b78565b8154811061154057611540612b8b565b9060005260206000200154905061155a8282601654611a6f565b6012805480610b9d57610b9d612ba1565b611573611609565b6001600160a01b0381166115d85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610906565b6115e181611b1b565b50565b60006001600160e01b0319821663152a902d60e11b14806107bd57506107bd82611d56565b600e546001600160a01b03163314610b315760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610906565b6127106001600160601b03821611156116d15760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610906565b6001600160a01b0382166117275760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610906565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b6000818152600260205260409020546001600160a01b03166115e15760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610906565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906117f482610d15565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061183983610d15565b9050806001600160a01b0316846001600160a01b0316148061188057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806118a45750836001600160a01b03166118998461086b565b6001600160a01b0316145b949350505050565b826001600160a01b03166118bf82610d15565b6001600160a01b0316146118e55760405162461bcd60e51b815260040161090690612ddb565b6001600160a01b0382166119475760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610906565b6119548383836001611d7b565b826001600160a01b031661196782610d15565b6001600160a01b03161461198d5760405162461bcd60e51b815260040161090690612ddb565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611a25611d87565b600c805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b80341015611ab85760405162461bcd60e51b81526020600482015260166024820152752737ba1022b737bab3b41032ba3432b91039b2b73a1760511b6044820152606401610906565b6001611ac384610e03565b1115611b115760405162461bcd60e51b815260206004820152601860248201527f596f7520616c726561647920686176652032204e4654277300000000000000006044820152606401610906565b6109a78383611dd0565b600e80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6107d58282611dd0565b611b7f611dea565b600c805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611a523390565b816001600160a01b0316836001600160a01b031603611c155760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610906565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611c8d8484846118ac565b611c9984848484611e30565b6110f05760405162461bcd60e51b815260040161090690612e20565b6060601780546107e890612aa2565b60606000611cd183611f31565b60010190506000816001600160401b03811115611cf057611cf0612742565b6040519080825280601f01601f191660200182016040528015611d1a576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611d2457509392505050565b60006001600160e01b0319821663780e9d6360e01b14806107bd57506107bd82612009565b6110f084848484612059565b600c5460ff16610b315760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610906565b6107d5828260405180602001604052806000815250612186565b600c5460ff1615610b315760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610906565b60006001600160a01b0384163b15611f2657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611e74903390899088908890600401612e72565b6020604051808303816000875af1925050508015611eaf575060408051601f3d908101601f19168201909252611eac91810190612eaf565b60015b611f0c573d808015611edd576040519150601f19603f3d011682016040523d82523d6000602084013e611ee2565b606091505b508051600003611f045760405162461bcd60e51b815260040161090690612e20565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506118a4565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611f705772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611f9c576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611fba57662386f26fc10000830492506010015b6305f5e1008310611fd2576305f5e100830492506008015b6127108310611fe657612710830492506004015b60648310611ff8576064830492506002015b600a83106107bd5760010192915050565b60006001600160e01b031982166380ac58cd60e01b148061203a57506001600160e01b03198216635b5e139f60e01b145b806107bd57506301ffc9a760e01b6001600160e01b03198316146107bd565b60018111156120c85760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610906565b816001600160a01b0385166121245761211f81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612147565b836001600160a01b0316856001600160a01b0316146121475761214785826121b9565b6001600160a01b0384166121635761215e81612256565b610fe4565b846001600160a01b0316846001600160a01b031614610fe457610fe48482612305565b6121908383612349565b61219d6000848484611e30565b6109a75760405162461bcd60e51b815260040161090690612e20565b600060016121c684610e03565b6121d09190612b78565b600083815260076020526040902054909150808214612223576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061226890600190612b78565b6000838152600960205260408120546008805493945090928490811061229057612290612b8b565b9060005260206000200154905080600883815481106122b1576122b1612b8b565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806122e9576122e9612ba1565b6001900381819060005260206000200160009055905550505050565b600061231083610e03565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821661239f5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610906565b6000818152600260205260409020546001600160a01b0316156124045760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610906565b612412600083836001611d7b565b6000818152600260205260409020546001600160a01b0316156124775760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610906565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b0319811681146115e157600080fd5b60006020828403121561250a57600080fd5b8135611166816124e2565b80356001600160a01b038116811461252c57600080fd5b919050565b6000806040838503121561254457600080fd5b61254d83612515565b915060208301356001600160601b038116811461256957600080fd5b809150509250929050565b60005b8381101561258f578181015183820152602001612577565b50506000910152565b600081518084526125b0816020860160208601612574565b601f01601f19169290920160200192915050565b6020815260006111666020830184612598565b6000602082840312156125e957600080fd5b5035919050565b6000806040838503121561260357600080fd5b61260c83612515565b946020939093013593505050565b60008060006060848603121561262f57600080fd5b61263884612515565b925061264660208501612515565b9150604084013590509250925092565b6000806040838503121561266957600080fd5b50508035926020909101359150565b60006020828403121561268a57600080fd5b61116682612515565b60008083601f8401126126a557600080fd5b5081356001600160401b038111156126bc57600080fd5b6020830191508360208260051b8501011115610a8457600080fd5b600080600080604085870312156126ed57600080fd5b84356001600160401b038082111561270457600080fd5b61271088838901612693565b9096509450602087013591508082111561272957600080fd5b5061273687828801612693565b95989497509550505050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b038084111561277257612772612742565b604051601f8501601f19908116603f0116810190828211818310171561279a5761279a612742565b816040528093508581528686860111156127b357600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156127df57600080fd5b81356001600160401b038111156127f557600080fd5b8201601f8101841361280657600080fd5b6118a484823560208401612758565b6000806020838503121561282857600080fd5b82356001600160401b038082111561283f57600080fd5b818501915085601f83011261285357600080fd5b81358181111561286257600080fd5b86602082850101111561287457600080fd5b60209290920196919550909350505050565b6000806040838503121561289957600080fd5b6128a283612515565b91506020830135801515811461256957600080fd5b600080600080608085870312156128cd57600080fd5b6128d685612515565b93506128e460208601612515565b92506040850135915060608501356001600160401b0381111561290657600080fd5b8501601f8101871361291757600080fd5b61292687823560208401612758565b91505092959194509250565b60008060008060008060008060008060008060c08d8f03121561295457600080fd5b6001600160401b038d35111561296957600080fd5b6129768e8e358f01612693565b909c509a506001600160401b0360208e0135111561299357600080fd5b6129a38e60208f01358f01612693565b909a5098506001600160401b0360408e013511156129c057600080fd5b6129d08e60408f01358f01612693565b90985096506001600160401b0360608e013511156129ed57600080fd5b6129fd8e60608f01358f01612693565b90965094506001600160401b0360808e01351115612a1a57600080fd5b612a2a8e60808f01358f01612693565b90945092506001600160401b0360a08e01351115612a4757600080fd5b612a578e60a08f01358f01612693565b81935080925050509295989b509295989b509295989b565b60008060408385031215612a8257600080fd5b612a8b83612515565b9150612a9960208401612515565b90509250929050565b600181811c90821680612ab657607f821691505b602082108103612ad657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176107bd576107bd612b29565b600082612b7357634e487b7160e01b600052601260045260246000fd5b500490565b818103818111156107bd576107bd612b29565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b600060018201612bc957612bc9612b29565b5060010190565b601f8211156109a757600081815260208120601f850160051c81016020861015612bf75750805b601f850160051c820191505b81811015612c1657828155600101612c03565b505050505050565b81516001600160401b03811115612c3757612c37612742565b612c4b81612c458454612aa2565b84612bd0565b602080601f831160018114612c805760008415612c685750858301515b600019600386901b1c1916600185901b178555612c16565b600085815260208120601f198616915b82811015612caf57888601518255948401946001909101908401612c90565b5085821015612ccd5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160401b03831115612cf457612cf4612742565b612d0883612d028354612aa2565b83612bd0565b6000601f841160018114612d3c5760008515612d245750838201355b600019600387901b1c1916600186901b178355610fe4565b600083815260209020601f19861690835b82811015612d6d5786850135825560209485019460019092019101612d4d565b5086821015612d8a5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60008351612dae818460208801612574565b835190830190612dc2818360208801612574565b64173539b7b760d91b9101908152600501949350505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612ea590830184612598565b9695505050505050565b600060208284031215612ec157600080fd5b8151611166816124e256fea26469706673582212207c456d185d04b14330cc8f06745799a5eac2c19d80e7d2b4a5f10b1eed6c590964736f6c6343000812003368747470733a2f2f6d6574636861696e2e746563682f6170692f6d6574616a732f000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012c000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000064d65744e4654000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d4e465400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002668747470733a2f2f6d6574636861696e2e746563682f6170692f726f79616c74792e6a736f6e0000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102675760003560e01c80638456cb5911610144578063b88d4fde116100b6578063d11c064f1161007a578063d11c064f146106e1578063e33d3f0214610701578063e8a3d48514610721578063e985e9c514610736578063efcd0c531461077f578063f2fde38b1461079257600080fd5b8063b88d4fde14610655578063c3ea2cd214610675578063c86b340a14610695578063c87b56dd146106ab578063cc9d1a71146106cb57600080fd5b8063938e3d7b11610108578063938e3d7b146105ad57806395d89b41146105cd5780639919ddaa146105e2578063a22cb46514610602578063ac6fa27414610622578063b659692e1461063557600080fd5b80638456cb591461052e57806387cb31301461054357806388232a59146105595780638a274cdd1461056f5780638da5cb5b1461058f57600080fd5b806342842e0e116101dd5780635c975abb116101a15780635c975abb1461048c5780636352211e146104a45780636c0360eb146104c457806370a08231146104d9578063715018a6146104f95780637fdc86b71461050e57600080fd5b806342842e0e14610406578063447618d9146104265780634f6ccce7146104395780634f883f351461045957806351cff8d91461046c57600080fd5b806318160ddd1161022f57806318160ddd1461033d57806323b872dd1461035c5780632a55205a1461037c5780632f745c59146103bb57806332cb6b0c146103db5780633f4ba83a146103f157600080fd5b806301ffc9a71461026c57806302fa7c47146102a157806306fdde03146102c3578063081812fc146102e5578063095ea7b31461031d575b600080fd5b34801561027857600080fd5b5061028c6102873660046124f8565b6107b2565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b506102c16102bc366004612531565b6107c3565b005b3480156102cf57600080fd5b506102d86107d9565b60405161029891906125c4565b3480156102f157600080fd5b506103056103003660046125d7565b61086b565b6040516001600160a01b039091168152602001610298565b34801561032957600080fd5b506102c16103383660046125f0565b610892565b34801561034957600080fd5b506008545b604051908152602001610298565b34801561036857600080fd5b506102c161037736600461261a565b6109ac565b34801561038857600080fd5b5061039c610397366004612656565b6109dd565b604080516001600160a01b039093168352602083019190915201610298565b3480156103c757600080fd5b5061034e6103d63660046125f0565b610a8b565b3480156103e757600080fd5b5061034e60185481565b3480156103fd57600080fd5b506102c1610b21565b34801561041257600080fd5b506102c161042136600461261a565b610b33565b6102c1610434366004612678565b610b4e565b34801561044557600080fd5b5061034e6104543660046125d7565b610bb7565b6102c1610467366004612678565b610c4a565b34801561047857600080fd5b506102c1610487366004612678565b610c99565b34801561049857600080fd5b50600c5460ff1661028c565b3480156104b057600080fd5b506103056104bf3660046125d7565b610d15565b3480156104d057600080fd5b506102d8610d75565b3480156104e557600080fd5b5061034e6104f4366004612678565b610e03565b34801561050557600080fd5b506102c1610e89565b34801561051a57600080fd5b506102c16105293660046126d7565b610e9b565b34801561053a57600080fd5b506102c1610feb565b34801561054f57600080fd5b5061034e60135481565b34801561056557600080fd5b5061034e60145481565b34801561057b57600080fd5b506102c161058a3660046127cd565b610ffb565b34801561059b57600080fd5b50600e546001600160a01b0316610305565b3480156105b957600080fd5b506102c16105c8366004612815565b61100f565b3480156105d957600080fd5b506102d8611024565b3480156105ee57600080fd5b5061034e6105fd3660046125d7565b611033565b34801561060e57600080fd5b506102c161061d366004612886565b611054565b6102c1610630366004612678565b61105f565b34801561064157600080fd5b5061034e6106503660046125d7565b6110ae565b34801561066157600080fd5b506102c16106703660046128b7565b6110be565b34801561068157600080fd5b5061034e6106903660046125d7565b6110f6565b3480156106a157600080fd5b5061034e60155481565b3480156106b757600080fd5b506102d86106c63660046125d7565b611106565b3480156106d757600080fd5b5061034e60165481565b3480156106ed57600080fd5b5061034e6106fc3660046125d7565b61116d565b34801561070d57600080fd5b506102c161071c366004612932565b61117d565b34801561072d57600080fd5b506102d861150f565b34801561074257600080fd5b5061028c610751366004612a6f565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6102c161078d366004612678565b61151c565b34801561079e57600080fd5b506102c16107ad366004612678565b61156b565b60006107bd826115e4565b92915050565b6107cb611609565b6107d58282611663565b5050565b6060600080546107e890612aa2565b80601f016020809104026020016040519081016040528092919081815260200182805461081490612aa2565b80156108615780601f1061083657610100808354040283529160200191610861565b820191906000526020600020905b81548152906001019060200180831161084457829003601f168201915b5050505050905090565b600061087682611760565b506000908152600460205260409020546001600160a01b031690565b600061089d82610d15565b9050806001600160a01b0316836001600160a01b03160361090f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b038216148061092b575061092b8133610751565b61099d5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610906565b6109a783836117bf565b505050565b6109b6338261182d565b6109d25760405162461bcd60e51b815260040161090690612adc565b6109a78383836118ac565b6000828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610a52575060408051808201909152600a546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610a71906001600160601b031687612b3f565b610a7b9190612b56565b91519350909150505b9250929050565b6000610a9683610e03565b8210610af85760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610906565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610b29611609565b610b31611a1d565b565b6109a7838383604051806020016040528060008152506110be565b600f805460009190610b6290600190612b78565b81548110610b7257610b72612b8b565b90600052602060002001549050610b8c8282601354611a6f565b600f805480610b9d57610b9d612ba1565b600190038181906000526020600020016000905590555050565b6000610bc260085490565b8210610c255760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610906565b60088281548110610c3857610c38612b8b565b90600052602060002001549050919050565b6010805460009190610c5e90600190612b78565b81548110610c6e57610c6e612b8b565b90600052602060002001549050610c888282601454611a6f565b6010805480610b9d57610b9d612ba1565b610ca1611609565b60004711610ce05760405162461bcd60e51b815260206004820152600c60248201526b042616c616e636520697320360a41b6044820152606401610906565b6040516001600160a01b038216904780156108fc02916000818181858888f193505050501580156107d5573d6000803e3d6000fd5b6000818152600260205260408120546001600160a01b0316806107bd5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610906565b60178054610d8290612aa2565b80601f0160208091040260200160405190810160405280929190818152602001828054610dae90612aa2565b8015610dfb5780601f10610dd057610100808354040283529160200191610dfb565b820191906000526020600020905b815481529060010190602001808311610dde57829003601f168201915b505050505081565b60006001600160a01b038216610e6d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610906565b506001600160a01b031660009081526003602052604090205490565b610e91611609565b610b316000611b1b565b610ea3611609565b828114610f075760405162461bcd60e51b815260206004820152602c60248201527f436f6d6d6f6e204e46542052656365697665727320616e6420416d6f756e742060448201526b185c9948191a59999c995b9d60a21b6064820152608401610906565b60005b83811015610fe45760005b838383818110610f2757610f27612b8b565b90506020020135811015610fd157600f805460009190610f4990600190612b78565b81548110610f5957610f59612b8b565b90600052602060002001549050610f96878785818110610f7b57610f7b612b8b565b9050602002016020810190610f909190612678565b82611b6d565b600f805480610fa757610fa7612ba1565b60019003818190600052602060002001600090559055508080610fc990612bb7565b915050610f15565b5080610fdc81612bb7565b915050610f0a565b5050505050565b610ff3611609565b610b31611b77565b611003611609565b60176107d58282612c1e565b611017611609565b60196109a7828483612cdd565b6060600180546107e890612aa2565b6010818154811061104357600080fd5b600091825260209091200154905081565b6107d5338383611bb4565b601180546000919061107390600190612b78565b8154811061108357611083612b8b565b9060005260206000200154905061109d8282601554611a6f565b6011805480610b9d57610b9d612ba1565b6012818154811061104357600080fd5b6110c8338361182d565b6110e45760405162461bcd60e51b815260040161090690612adc565b6110f084848484611c82565b50505050565b600f818154811061104357600080fd5b606061111182611760565b600061111b611cb5565b9050600081511161113b5760405180602001604052806000815250611166565b8061114584611cc4565b604051602001611156929190612d9c565b6040516020818303038152906040525b9392505050565b6011818154811061104357600080fd5b611185611609565b8a89146111ee5760405162461bcd60e51b815260206004820152603160248201527f4c65737320436f6d6d6f6e204e46542052656365697665727320616e6420416d6044820152701bdd5b9d08185c9948191a59999c995b9d607a1b6064820152608401610906565b8685146112505760405162461bcd60e51b815260206004820152602a60248201527f5261726520526563656976657273204e465420616e6420416d6f756e742061726044820152691948191a59999c995b9d60b21b6064820152608401610906565b8281146112b85760405162461bcd60e51b815260206004820152603060248201527f53757065722052617265204e46542052656365697665727320616e6420416d6f60448201526f1d5b9d08185c9948191a59999c995b9d60821b6064820152608401610906565b60005b8b81101561137a5760005b8b8b838181106112d8576112d8612b8b565b905060200201358110156113675760108054600091906112fa90600190612b78565b8154811061130a5761130a612b8b565b9060005260206000200154905061132c8f8f85818110610f7b57610f7b612b8b565b601080548061133d5761133d612ba1565b6001900381819060005260206000200160009055905550808061135f90612bb7565b9150506112c6565b508061137281612bb7565b9150506112bb565b5060005b8781101561143d5760005b87878381811061139b5761139b612b8b565b9050602002013581101561142a5760118054600091906113bd90600190612b78565b815481106113cd576113cd612b8b565b906000526020600020015490506113ef8b8b85818110610f7b57610f7b612b8b565b601180548061140057611400612ba1565b6001900381819060005260206000200160009055905550808061142290612bb7565b915050611389565b508061143581612bb7565b91505061137e565b5060005b838110156115005760005b83838381811061145e5761145e612b8b565b905060200201358110156114ed57601280546000919061148090600190612b78565b8154811061149057611490612b8b565b906000526020600020015490506114b2878785818110610f7b57610f7b612b8b565b60128054806114c3576114c3612ba1565b600190038181906000526020600020016000905590555080806114e590612bb7565b91505061144c565b50806114f881612bb7565b915050611441565b50505050505050505050505050565b60198054610d8290612aa2565b601280546000919061153090600190612b78565b8154811061154057611540612b8b565b9060005260206000200154905061155a8282601654611a6f565b6012805480610b9d57610b9d612ba1565b611573611609565b6001600160a01b0381166115d85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610906565b6115e181611b1b565b50565b60006001600160e01b0319821663152a902d60e11b14806107bd57506107bd82611d56565b600e546001600160a01b03163314610b315760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610906565b6127106001600160601b03821611156116d15760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610906565b6001600160a01b0382166117275760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610906565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b6000818152600260205260409020546001600160a01b03166115e15760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610906565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906117f482610d15565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061183983610d15565b9050806001600160a01b0316846001600160a01b0316148061188057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806118a45750836001600160a01b03166118998461086b565b6001600160a01b0316145b949350505050565b826001600160a01b03166118bf82610d15565b6001600160a01b0316146118e55760405162461bcd60e51b815260040161090690612ddb565b6001600160a01b0382166119475760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610906565b6119548383836001611d7b565b826001600160a01b031661196782610d15565b6001600160a01b03161461198d5760405162461bcd60e51b815260040161090690612ddb565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611a25611d87565b600c805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b80341015611ab85760405162461bcd60e51b81526020600482015260166024820152752737ba1022b737bab3b41032ba3432b91039b2b73a1760511b6044820152606401610906565b6001611ac384610e03565b1115611b115760405162461bcd60e51b815260206004820152601860248201527f596f7520616c726561647920686176652032204e4654277300000000000000006044820152606401610906565b6109a78383611dd0565b600e80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6107d58282611dd0565b611b7f611dea565b600c805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611a523390565b816001600160a01b0316836001600160a01b031603611c155760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610906565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611c8d8484846118ac565b611c9984848484611e30565b6110f05760405162461bcd60e51b815260040161090690612e20565b6060601780546107e890612aa2565b60606000611cd183611f31565b60010190506000816001600160401b03811115611cf057611cf0612742565b6040519080825280601f01601f191660200182016040528015611d1a576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611d2457509392505050565b60006001600160e01b0319821663780e9d6360e01b14806107bd57506107bd82612009565b6110f084848484612059565b600c5460ff16610b315760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610906565b6107d5828260405180602001604052806000815250612186565b600c5460ff1615610b315760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610906565b60006001600160a01b0384163b15611f2657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611e74903390899088908890600401612e72565b6020604051808303816000875af1925050508015611eaf575060408051601f3d908101601f19168201909252611eac91810190612eaf565b60015b611f0c573d808015611edd576040519150601f19603f3d011682016040523d82523d6000602084013e611ee2565b606091505b508051600003611f045760405162461bcd60e51b815260040161090690612e20565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506118a4565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611f705772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611f9c576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611fba57662386f26fc10000830492506010015b6305f5e1008310611fd2576305f5e100830492506008015b6127108310611fe657612710830492506004015b60648310611ff8576064830492506002015b600a83106107bd5760010192915050565b60006001600160e01b031982166380ac58cd60e01b148061203a57506001600160e01b03198216635b5e139f60e01b145b806107bd57506301ffc9a760e01b6001600160e01b03198316146107bd565b60018111156120c85760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610906565b816001600160a01b0385166121245761211f81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612147565b836001600160a01b0316856001600160a01b0316146121475761214785826121b9565b6001600160a01b0384166121635761215e81612256565b610fe4565b846001600160a01b0316846001600160a01b031614610fe457610fe48482612305565b6121908383612349565b61219d6000848484611e30565b6109a75760405162461bcd60e51b815260040161090690612e20565b600060016121c684610e03565b6121d09190612b78565b600083815260076020526040902054909150808214612223576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061226890600190612b78565b6000838152600960205260408120546008805493945090928490811061229057612290612b8b565b9060005260206000200154905080600883815481106122b1576122b1612b8b565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806122e9576122e9612ba1565b6001900381819060005260206000200160009055905550505050565b600061231083610e03565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821661239f5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610906565b6000818152600260205260409020546001600160a01b0316156124045760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610906565b612412600083836001611d7b565b6000818152600260205260409020546001600160a01b0316156124775760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610906565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b0319811681146115e157600080fd5b60006020828403121561250a57600080fd5b8135611166816124e2565b80356001600160a01b038116811461252c57600080fd5b919050565b6000806040838503121561254457600080fd5b61254d83612515565b915060208301356001600160601b038116811461256957600080fd5b809150509250929050565b60005b8381101561258f578181015183820152602001612577565b50506000910152565b600081518084526125b0816020860160208601612574565b601f01601f19169290920160200192915050565b6020815260006111666020830184612598565b6000602082840312156125e957600080fd5b5035919050565b6000806040838503121561260357600080fd5b61260c83612515565b946020939093013593505050565b60008060006060848603121561262f57600080fd5b61263884612515565b925061264660208501612515565b9150604084013590509250925092565b6000806040838503121561266957600080fd5b50508035926020909101359150565b60006020828403121561268a57600080fd5b61116682612515565b60008083601f8401126126a557600080fd5b5081356001600160401b038111156126bc57600080fd5b6020830191508360208260051b8501011115610a8457600080fd5b600080600080604085870312156126ed57600080fd5b84356001600160401b038082111561270457600080fd5b61271088838901612693565b9096509450602087013591508082111561272957600080fd5b5061273687828801612693565b95989497509550505050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b038084111561277257612772612742565b604051601f8501601f19908116603f0116810190828211818310171561279a5761279a612742565b816040528093508581528686860111156127b357600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156127df57600080fd5b81356001600160401b038111156127f557600080fd5b8201601f8101841361280657600080fd5b6118a484823560208401612758565b6000806020838503121561282857600080fd5b82356001600160401b038082111561283f57600080fd5b818501915085601f83011261285357600080fd5b81358181111561286257600080fd5b86602082850101111561287457600080fd5b60209290920196919550909350505050565b6000806040838503121561289957600080fd5b6128a283612515565b91506020830135801515811461256957600080fd5b600080600080608085870312156128cd57600080fd5b6128d685612515565b93506128e460208601612515565b92506040850135915060608501356001600160401b0381111561290657600080fd5b8501601f8101871361291757600080fd5b61292687823560208401612758565b91505092959194509250565b60008060008060008060008060008060008060c08d8f03121561295457600080fd5b6001600160401b038d35111561296957600080fd5b6129768e8e358f01612693565b909c509a506001600160401b0360208e0135111561299357600080fd5b6129a38e60208f01358f01612693565b909a5098506001600160401b0360408e013511156129c057600080fd5b6129d08e60408f01358f01612693565b90985096506001600160401b0360608e013511156129ed57600080fd5b6129fd8e60608f01358f01612693565b90965094506001600160401b0360808e01351115612a1a57600080fd5b612a2a8e60808f01358f01612693565b90945092506001600160401b0360a08e01351115612a4757600080fd5b612a578e60a08f01358f01612693565b81935080925050509295989b509295989b509295989b565b60008060408385031215612a8257600080fd5b612a8b83612515565b9150612a9960208401612515565b90509250929050565b600181811c90821680612ab657607f821691505b602082108103612ad657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176107bd576107bd612b29565b600082612b7357634e487b7160e01b600052601260045260246000fd5b500490565b818103818111156107bd576107bd612b29565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b600060018201612bc957612bc9612b29565b5060010190565b601f8211156109a757600081815260208120601f850160051c81016020861015612bf75750805b601f850160051c820191505b81811015612c1657828155600101612c03565b505050505050565b81516001600160401b03811115612c3757612c37612742565b612c4b81612c458454612aa2565b84612bd0565b602080601f831160018114612c805760008415612c685750858301515b600019600386901b1c1916600185901b178555612c16565b600085815260208120601f198616915b82811015612caf57888601518255948401946001909101908401612c90565b5085821015612ccd5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160401b03831115612cf457612cf4612742565b612d0883612d028354612aa2565b83612bd0565b6000601f841160018114612d3c5760008515612d245750838201355b600019600387901b1c1916600186901b178355610fe4565b600083815260209020601f19861690835b82811015612d6d5786850135825560209485019460019092019101612d4d565b5086821015612d8a5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60008351612dae818460208801612574565b835190830190612dc2818360208801612574565b64173539b7b760d91b9101908152600501949350505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612ea590830184612598565b9695505050505050565b600060208284031215612ec157600080fd5b8151611166816124e256fea26469706673582212207c456d185d04b14330cc8f06745799a5eac2c19d80e7d2b4a5f10b1eed6c590964736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012c000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000064d65744e4654000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d4e465400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002668747470733a2f2f6d6574636861696e2e746563682f6170692f726f79616c74792e6a736f6e0000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): MetNFT
Arg [1] : _symbol (string): MNFT
Arg [2] : _royaltyFeesInBips (uint96): 300
Arg [3] : _contractURI (string): https://metchain.tech/api/royalty.json
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 000000000000000000000000000000000000000000000000000000000000012c
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [5] : 4d65744e46540000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 4d4e465400000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000026
Arg [9] : 68747470733a2f2f6d6574636861696e2e746563682f6170692f726f79616c74
Arg [10] : 792e6a736f6e0000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
72623:8484:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80591:221;;;;;;;;;;-1:-1:-1;80591:221:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;80591:221:0;;;;;;;;80824:155;;;;;;;;;;-1:-1:-1;80824:155:0;;;;;:::i;:::-;;:::i;:::-;;48348:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;49860:171::-;;;;;;;;;;-1:-1:-1;49860:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2246:32:1;;;2228:51;;2216:2;2201:18;49860:171:0;2082:203:1;49378:416:0;;;;;;;;;;-1:-1:-1;49378:416:0;;;;;:::i;:::-;;:::i;67254:113::-;;;;;;;;;;-1:-1:-1;67342:10:0;:17;67254:113;;;2695:25:1;;;2683:2;2668:18;67254:113:0;2549:177:1;50560:335:0;;;;;;;;;;-1:-1:-1;50560:335:0;;;;;:::i;:::-;;:::i;36495:442::-;;;;;;;;;;-1:-1:-1;36495:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3509:32:1;;;3491:51;;3573:2;3558:18;;3551:34;;;;3464:18;36495:442:0;3317:274:1;66922:256:0;;;;;;;;;;-1:-1:-1;66922:256:0;;;;;:::i;:::-;;:::i;75037:28::-;;;;;;;;;;;;;;;;75555:65;;;;;;;;;;;;;:::i;50966:185::-;;;;;;;;;;-1:-1:-1;50966:185:0;;;;;:::i;:::-;;:::i;76631:205::-;;;;;;:::i;:::-;;:::i;67444:233::-;;;;;;;;;;-1:-1:-1;67444:233:0;;;;;:::i;:::-;;:::i;76842:212::-;;;;;;:::i;:::-;;:::i;80051:170::-;;;;;;;;;;-1:-1:-1;80051:170:0;;;;;:::i;:::-;;:::i;20495:86::-;;;;;;;;;;-1:-1:-1;20566:7:0;;;;20495:86;;48058:223;;;;;;;;;;-1:-1:-1;48058:223:0;;;;;:::i;:::-;;:::i;74971:59::-;;;;;;;;;;;;;:::i;47789:207::-;;;;;;;;;;-1:-1:-1;47789:207:0;;;;;:::i;:::-;;:::i;17999:103::-;;;;;;;;;;;;;:::i;77483:635::-;;;;;;;;;;-1:-1:-1;77483:635:0;;;;;:::i;:::-;;:::i;75486:61::-;;;;;;;;;;;;;:::i;74809:33::-;;;;;;;;;;;;;;;;74849:35;;;;;;;;;;;;;;;;76058:99;;;;;;;;;;-1:-1:-1;76058:99:0;;;;;:::i;:::-;;:::i;17351:87::-;;;;;;;;;;-1:-1:-1;17424:6:0;;-1:-1:-1;;;;;17424:6:0;17351:87;;80987:115;;;;;;;;;;-1:-1:-1;80987:115:0;;;;;:::i;:::-;;:::i;48517:104::-;;;;;;;;;;;;;:::i;73683:587::-;;;;;;;;;;-1:-1:-1;73683:587:0;;;;;:::i;:::-;;:::i;50103:155::-;;;;;;;;;;-1:-1:-1;50103:155:0;;;;;:::i;:::-;;:::i;77060:197::-;;;;;;:::i;:::-;;:::i;74700:102::-;;;;;;;;;;-1:-1:-1;74700:102:0;;;;;:::i;:::-;;:::i;51222:322::-;;;;;;;;;;-1:-1:-1;51222:322:0;;;;;:::i;:::-;;:::i;72761:914::-;;;;;;;;;;-1:-1:-1;72761:914:0;;;;;:::i;:::-;;:::i;74891:32::-;;;;;;;;;;;;;;;;75626:319;;;;;;;;;;-1:-1:-1;75626:319:0;;;;;:::i;:::-;;:::i;74930:34::-;;;;;;;;;;;;;;;;74278:414;;;;;;;;;;-1:-1:-1;74278:414:0;;;;;:::i;:::-;;:::i;78126:1899::-;;;;;;;;;;-1:-1:-1;78126:1899:0;;;;;:::i;:::-;;:::i;75072:25::-;;;;;;;;;;;;;:::i;50329:164::-;;;;;;;;;;-1:-1:-1;50329:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;50450:25:0;;;50426:4;50450:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;50329:164;77263:208;;;;;;:::i;:::-;;:::i;18257:201::-;;;;;;;;;;-1:-1:-1;18257:201:0;;;;;:::i;:::-;;:::i;80591:221::-;80739:4;80768:36;80792:11;80768:23;:36::i;:::-;80761:43;80591:221;-1:-1:-1;;80591:221:0:o;80824:155::-;17237:13;:11;:13::i;:::-;80922:49:::1;80941:9;80952:18;80922;:49::i;:::-;80824:155:::0;;:::o;48348:100::-;48402:13;48435:5;48428:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48348:100;:::o;49860:171::-;49936:7;49956:23;49971:7;49956:14;:23::i;:::-;-1:-1:-1;49999:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;49999:24:0;;49860:171::o;49378:416::-;49459:13;49475:23;49490:7;49475:14;:23::i;:::-;49459:39;;49523:5;-1:-1:-1;;;;;49517:11:0;:2;-1:-1:-1;;;;;49517:11:0;;49509:57;;;;-1:-1:-1;;;49509:57:0;;10688:2:1;49509:57:0;;;10670:21:1;10727:2;10707:18;;;10700:30;10766:34;10746:18;;;10739:62;-1:-1:-1;;;10817:18:1;;;10810:31;10858:19;;49509:57:0;;;;;;;;;15976:10;-1:-1:-1;;;;;49601:21:0;;;;:62;;-1:-1:-1;49626:37:0;49643:5;15976:10;50329:164;:::i;49626:37::-;49579:173;;;;-1:-1:-1;;;49579:173:0;;11090:2:1;49579:173:0;;;11072:21:1;11129:2;11109:18;;;11102:30;11168:34;11148:18;;;11141:62;11239:31;11219:18;;;11212:59;11288:19;;49579:173:0;10888:425:1;49579:173:0;49765:21;49774:2;49778:7;49765:8;:21::i;:::-;49448:346;49378:416;;:::o;50560:335::-;50755:41;15976:10;50788:7;50755:18;:41::i;:::-;50747:99;;;;-1:-1:-1;;;50747:99:0;;;;;;;:::i;:::-;50859:28;50869:4;50875:2;50879:7;50859:9;:28::i;36495:442::-;36592:7;36650:27;;;:17;:27;;;;;;;;36621:56;;;;;;;;;-1:-1:-1;;;;;36621:56:0;;;;;-1:-1:-1;;;36621:56:0;;;-1:-1:-1;;;;;36621:56:0;;;;;;;;36592:7;;36690:92;;-1:-1:-1;36741:29:0;;;;;;;;;36751:19;36741:29;-1:-1:-1;;;;;36741:29:0;;;;-1:-1:-1;;;36741:29:0;;-1:-1:-1;;;;;36741:29:0;;;;;36690:92;36832:23;;;;36794:21;;37303:5;;36819:36;;-1:-1:-1;;;;;36819:36:0;:10;:36;:::i;:::-;36818:58;;;;:::i;:::-;36897:16;;;-1:-1:-1;36794:82:0;;-1:-1:-1;;36495:442:0;;;;;;:::o;66922:256::-;67019:7;67055:23;67072:5;67055:16;:23::i;:::-;67047:5;:31;67039:87;;;;-1:-1:-1;;;67039:87:0;;12593:2:1;67039:87:0;;;12575:21:1;12632:2;12612:18;;;12605:30;12671:34;12651:18;;;12644:62;-1:-1:-1;;;12722:18:1;;;12715:41;12773:19;;67039:87:0;12391:407:1;67039:87:0;-1:-1:-1;;;;;;67144:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;66922:256::o;75555:65::-;17237:13;:11;:13::i;:::-;75602:10:::1;:8;:10::i;:::-;75555:65::o:0;50966:185::-;51104:39;51121:4;51127:2;51131:7;51104:39;;;;;;;;;;;;:16;:39::i;76631:205::-;76710:9;76720:16;;76693:15;;76710:9;76720:20;;76739:1;;76720:20;:::i;:::-;76710:31;;;;;;;;:::i;:::-;;;;;;;;;76693:48;;76762:30;76773:2;76776:7;76786:5;;76762:10;:30::i;:::-;76803:9;:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;76682:154;76631:205;:::o;67444:233::-;67519:7;67555:30;67342:10;:17;;67254:113;67555:30;67547:5;:38;67539:95;;;;-1:-1:-1;;;67539:95:0;;13402:2:1;67539:95:0;;;13384:21:1;13441:2;13421:18;;;13414:30;13480:34;13460:18;;;13453:62;-1:-1:-1;;;13531:18:1;;;13524:42;13583:19;;67539:95:0;13200:408:1;67539:95:0;67652:10;67663:5;67652:17;;;;;;;;:::i;:::-;;;;;;;;;67645:24;;67444:233;;;:::o;76842:212::-;76925:13;76939:20;;76908:15;;76925:13;76939:24;;76962:1;;76939:24;:::i;:::-;76925:39;;;;;;;;:::i;:::-;;;;;;;;;76908:56;;76985:31;76996:2;76999:7;77009:6;;76985:10;:31::i;:::-;77027:13;:19;;;;;;;:::i;80051:170::-;17237:13;:11;:13::i;:::-;80141:1:::1;80117:21;:25;80109:50;;;::::0;-1:-1:-1;;;80109:50:0;;13815:2:1;80109:50:0::1;::::0;::::1;13797:21:1::0;13854:2;13834:18;;;13827:30;-1:-1:-1;;;13873:18:1;;;13866:42;13925:18;;80109:50:0::1;13613:336:1::0;80109:50:0::1;80170:43;::::0;-1:-1:-1;;;;;80170:20:0;::::1;::::0;80191:21:::1;80170:43:::0;::::1;;;::::0;::::1;::::0;;;80191:21;80170:20;:43;::::1;;;;;;;;;;;;;::::0;::::1;;;;48058:223:::0;48130:7;52945:16;;;:7;:16;;;;;;-1:-1:-1;;;;;52945:16:0;;48194:56;;;;-1:-1:-1;;;48194:56:0;;14156:2:1;48194:56:0;;;14138:21:1;14195:2;14175:18;;;14168:30;-1:-1:-1;;;14214:18:1;;;14207:54;14278:18;;48194:56:0;13954:348:1;74971:59:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47789:207::-;47861:7;-1:-1:-1;;;;;47889:19:0;;47881:73;;;;-1:-1:-1;;;47881:73:0;;14509:2:1;47881:73:0;;;14491:21:1;14548:2;14528:18;;;14521:30;14587:34;14567:18;;;14560:62;-1:-1:-1;;;14638:18:1;;;14631:39;14687:19;;47881:73:0;14307:405:1;47881:73:0;-1:-1:-1;;;;;;47972:16:0;;;;;:9;:16;;;;;;;47789:207::o;17999:103::-;17237:13;:11;:13::i;:::-;18064:30:::1;18091:1;18064:18;:30::i;77483:635::-:0;17237:13;:11;:13::i;:::-;77608:39;;::::1;77600:96;;;::::0;-1:-1:-1;;;77600:96:0;;14919:2:1;77600:96:0::1;::::0;::::1;14901:21:1::0;14958:2;14938:18;;;14931:30;14997:34;14977:18;;;14970:62;-1:-1:-1;;;15048:18:1;;;15041:42;15100:19;;77600:96:0::1;14717:408:1::0;77600:96:0::1;77748:9;77744:367;77763:19:::0;;::::1;77744:367;;;77839:6;77835:237;77855:13;;77869:1;77855:16;;;;;;;:::i;:::-;;;;;;;77851:1;:20;77835:237;;;77918:9;77928:16:::0;;77901:15:::1;::::0;77918:9;77928:20:::1;::::0;77947:1:::1;::::0;77928:20:::1;:::i;:::-;77918:31;;;;;;;;:::i;:::-;;;;;;;;;77901:48;;77972:38;77990:8;;77999:1;77990:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;78002:7;77972:17;:38::i;:::-;78033:9;:15;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;77878:194;77873:3;;;;;:::i;:::-;;;;77835:237;;;-1:-1:-1::0;77784:3:0;::::1;::::0;::::1;:::i;:::-;;;;77744:367;;;;77483:635:::0;;;;:::o;75486:61::-;17237:13;:11;:13::i;:::-;75531:8:::1;:6;:8::i;76058:99::-:0;17237:13;:11;:13::i;:::-;76131:7:::1;:18;76141:8:::0;76131:7;:18:::1;:::i;80987:115::-:0;17237:13;:11;:13::i;:::-;81068:11:::1;:26;81082:12:::0;;81068:11;:26:::1;:::i;48517:104::-:0;48573:13;48606:7;48599:14;;;;;:::i;73683:587::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73683:587:0;:::o;50103:155::-;50198:52;15976:10;50231:8;50241;50198:18;:52::i;77060:197::-;77147:7;77155:14;;77130:15;;77147:7;77155:18;;77172:1;;77155:18;:::i;:::-;77147:27;;;;;;;;:::i;:::-;;;;;;;;;77130:44;;77195:30;77206:2;77209:7;77219:5;;77195:10;:30::i;:::-;77236:7;:13;;;;;;;:::i;74700:102::-;;;;;;;;;;;;51222:322;51396:41;15976:10;51429:7;51396:18;:41::i;:::-;51388:99;;;;-1:-1:-1;;;51388:99:0;;;;;;;:::i;:::-;51498:38;51512:4;51518:2;51522:7;51531:4;51498:13;:38::i;:::-;51222:322;;;;:::o;72761:914::-;;;;;;;;;;;;75626:319;75719:13;75745:23;75760:7;75745:14;:23::i;:::-;75781:22;75806:10;:8;:10::i;:::-;75781:35;;75859:1;75840:8;75834:22;:26;:103;;;;;;;;;;;;;;;;;75887:8;75897:25;75914:7;75897:16;:25::i;:::-;75870:61;;;;;;;;;:::i;:::-;;;;;;;;;;;;;75834:103;75827:110;75626:319;-1:-1:-1;;;75626:319:0:o;74278:414::-;;;;;;;;;;;;78126:1899;17237:13;:11;:13::i;:::-;78396:47;;::::1;78388:109;;;::::0;-1:-1:-1;;;78388:109:0;;19555:2:1;78388:109:0::1;::::0;::::1;19537:21:1::0;19594:2;19574:18;;;19567:30;19633:34;19613:18;;;19606:62;-1:-1:-1;;;19684:18:1;;;19677:47;19741:19;;78388:109:0::1;19353:413:1::0;78388:109:0::1;78516:35:::0;;::::1;78508:90;;;::::0;-1:-1:-1;;;78508:90:0;;19973:2:1;78508:90:0::1;::::0;::::1;19955:21:1::0;20012:2;19992:18;;;19985:30;20051:34;20031:18;;;20024:62;-1:-1:-1;;;20102:18:1;;;20095:40;20152:19;;78508:90:0::1;19771:406:1::0;78508:90:0::1;78617:45:::0;;::::1;78609:106;;;::::0;-1:-1:-1;;;78609:106:0;;20384:2:1;78609:106:0::1;::::0;::::1;20366:21:1::0;20423:2;20403:18;;;20396:30;20462:34;20442:18;;;20435:62;-1:-1:-1;;;20513:18:1;;;20506:46;20569:19;;78609:106:0::1;20182:412:1::0;78609:106:0::1;78788:9;78784:390;78803:23:::0;;::::1;78784:390;;;78883:6;78879:257;78899:17;;78917:1;78899:20;;;;;;;:::i;:::-;;;;;;;78895:1;:24;78879:257;;;78966:13;78980:20:::0;;78949:15:::1;::::0;78966:13;78980:24:::1;::::0;79003:1:::1;::::0;78980:24:::1;:::i;:::-;78966:39;;;;;;;;:::i;:::-;;;;;;;;;78949:56;;79028:42;79046:12;;79059:1;79046:15;;;;;;;:::i;79028:42::-;79093:13;:19;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;78926:210;78921:3;;;;;:::i;:::-;;;;78879:257;;;-1:-1:-1::0;78828:3:0;::::1;::::0;::::1;:::i;:::-;;;;78784:390;;;;79222:9;79218:355;79237:17:::0;;::::1;79218:355;;;79311:6;79307:227;79327:11;;79339:1;79327:14;;;;;;;:::i;:::-;;;;;;;79323:1;:18;79307:227;;;79388:7;79396:14:::0;;79371:15:::1;::::0;79388:7;79396:18:::1;::::0;79413:1:::1;::::0;79396:18:::1;:::i;:::-;79388:27;;;;;;;;:::i;:::-;;;;;;;;;79371:44;;79438:36;79456:6;;79463:1;79456:9;;;;;;;:::i;79438:36::-;79497:7;:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;79348:186;79343:3;;;;;:::i;:::-;;;;79307:227;;;-1:-1:-1::0;79256:3:0;::::1;::::0;::::1;:::i;:::-;;;;79218:355;;;;79627:9;79623:385;79642:22:::0;;::::1;79623:385;;;79721:6;79717:252;79737:16;;79754:1;79737:19;;;;;;;:::i;:::-;;;;;;;79733:1;:23;79717:252;;;79803:12;79816:19:::0;;79786:15:::1;::::0;79803:12;79816:23:::1;::::0;79838:1:::1;::::0;79816:23:::1;:::i;:::-;79803:37;;;;;;;;:::i;:::-;;;;;;;;;79786:54;;79863:41;79881:11;;79893:1;79881:14;;;;;;;:::i;79863:41::-;79927:12;:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;79763:206;79758:3;;;;;:::i;:::-;;;;79717:252;;;-1:-1:-1::0;79666:3:0;::::1;::::0;::::1;:::i;:::-;;;;79623:385;;;;78126:1899:::0;;;;;;;;;;;;:::o;75072:25::-;;;;;;;:::i;77263:208::-;77345:12;77358:19;;77328:15;;77345:12;77358:23;;77380:1;;77358:23;:::i;:::-;77345:37;;;;;;;;:::i;:::-;;;;;;;;;77328:54;;77403:31;77414:2;77417:7;77427:6;;77403:10;:31::i;:::-;77445:12;:18;;;;;;;:::i;18257:201::-;17237:13;:11;:13::i;:::-;-1:-1:-1;;;;;18346:22:0;::::1;18338:73;;;::::0;-1:-1:-1;;;18338:73:0;;20801:2:1;18338:73:0::1;::::0;::::1;20783:21:1::0;20840:2;20820:18;;;20813:30;20879:34;20859:18;;;20852:62;-1:-1:-1;;;20930:18:1;;;20923:36;20976:19;;18338:73:0::1;20599:402:1::0;18338:73:0::1;18422:28;18441:8;18422:18;:28::i;:::-;18257:201:::0;:::o;36225:215::-;36327:4;-1:-1:-1;;;;;;36351:41:0;;-1:-1:-1;;;36351:41:0;;:81;;;36396:36;36420:11;36396:23;:36::i;17516:132::-;17424:6;;-1:-1:-1;;;;;17424:6:0;15976:10;17580:23;17572:68;;;;-1:-1:-1;;;17572:68:0;;21208:2:1;17572:68:0;;;21190:21:1;;;21227:18;;;21220:30;21286:34;21266:18;;;21259:62;21338:18;;17572:68:0;21006:356:1;37587:332:0;37303:5;-1:-1:-1;;;;;37690:33:0;;;;37682:88;;;;-1:-1:-1;;;37682:88:0;;21569:2:1;37682:88:0;;;21551:21:1;21608:2;21588:18;;;21581:30;21647:34;21627:18;;;21620:62;-1:-1:-1;;;21698:18:1;;;21691:40;21748:19;;37682:88:0;21367:406:1;37682:88:0;-1:-1:-1;;;;;37789:22:0;;37781:60;;;;-1:-1:-1;;;37781:60:0;;21980:2:1;37781:60:0;;;21962:21:1;22019:2;21999:18;;;21992:30;22058:27;22038:18;;;22031:55;22103:18;;37781:60:0;21778:349:1;37781:60:0;37876:35;;;;;;;;;-1:-1:-1;;;;;37876:35:0;;;;;;-1:-1:-1;;;;;37876:35:0;;;;;;;;;;-1:-1:-1;;;37854:57:0;;;;:19;:57;37587:332::o;59679:135::-;53347:4;52945:16;;;:7;:16;;;;;;-1:-1:-1;;;;;52945:16:0;59753:53;;;;-1:-1:-1;;;59753:53:0;;14156:2:1;59753:53:0;;;14138:21:1;14195:2;14175:18;;;14168:30;-1:-1:-1;;;14214:18:1;;;14207:54;14278:18;;59753:53:0;13954:348:1;58958:174:0;59033:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;59033:29:0;-1:-1:-1;;;;;59033:29:0;;;;;;;;:24;;59087:23;59033:24;59087:14;:23::i;:::-;-1:-1:-1;;;;;59078:46:0;;;;;;;;;;;58958:174;;:::o;53577:264::-;53670:4;53687:13;53703:23;53718:7;53703:14;:23::i;:::-;53687:39;;53756:5;-1:-1:-1;;;;;53745:16:0;:7;-1:-1:-1;;;;;53745:16:0;;:52;;;-1:-1:-1;;;;;;50450:25:0;;;50426:4;50450:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;53765:32;53745:87;;;;53825:7;-1:-1:-1;;;;;53801:31:0;:20;53813:7;53801:11;:20::i;:::-;-1:-1:-1;;;;;53801:31:0;;53745:87;53737:96;53577:264;-1:-1:-1;;;;53577:264:0:o;57576:1263::-;57735:4;-1:-1:-1;;;;;57708:31:0;:23;57723:7;57708:14;:23::i;:::-;-1:-1:-1;;;;;57708:31:0;;57700:81;;;;-1:-1:-1;;;57700:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;57800:16:0;;57792:65;;;;-1:-1:-1;;;57792:65:0;;22740:2:1;57792:65:0;;;22722:21:1;22779:2;22759:18;;;22752:30;22818:34;22798:18;;;22791:62;-1:-1:-1;;;22869:18:1;;;22862:34;22913:19;;57792:65:0;22538:400:1;57792:65:0;57870:42;57891:4;57897:2;57901:7;57910:1;57870:20;:42::i;:::-;58042:4;-1:-1:-1;;;;;58015:31:0;:23;58030:7;58015:14;:23::i;:::-;-1:-1:-1;;;;;58015:31:0;;58007:81;;;;-1:-1:-1;;;58007:81:0;;;;;;;:::i;:::-;58160:24;;;;:15;:24;;;;;;;;58153:31;;-1:-1:-1;;;;;;58153:31:0;;;;;;-1:-1:-1;;;;;58636:15:0;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;58636:20:0;;;58671:13;;;;;;;;;:18;;58153:31;58671:18;;;58711:16;;;:7;:16;;;;;;:21;;;;;;;;;;58750:27;;58176:7;;58750:27;;;49448:346;49378:416;;:::o;21350:120::-;20359:16;:14;:16::i;:::-;21409:7:::1;:15:::0;;-1:-1:-1;;21409:15:0::1;::::0;;21440:22:::1;15976:10:::0;21449:12:::1;21440:22;::::0;-1:-1:-1;;;;;2246:32:1;;;2228:51;;2216:2;2201:18;21440:22:0::1;;;;;;;21350:120::o:0;76163:335::-;76268:5;76255:9;:18;;76247:54;;;;-1:-1:-1;;;76247:54:0;;23145:2:1;76247:54:0;;;23127:21:1;23184:2;23164:18;;;23157:30;-1:-1:-1;;;23203:18:1;;;23196:52;23265:18;;76247:54:0;22943:346:1;76247:54:0;76337:1;76320:13;76330:2;76320:9;:13::i;:::-;:18;;76312:56;;;;-1:-1:-1;;;76312:56:0;;23496:2:1;76312:56:0;;;23478:21:1;23535:2;23515:18;;;23508:30;23574:26;23554:18;;;23547:54;23618:18;;76312:56:0;23294:348:1;76312:56:0;76458:22;76468:2;76472:7;76458:9;:22::i;18618:191::-;18711:6;;;-1:-1:-1;;;;;18728:17:0;;;-1:-1:-1;;;;;;18728:17:0;;;;;;;18761:40;;18711:6;;;18728:17;18711:6;;18761:40;;18692:16;;18761:40;18681:128;18618:191;:::o;76504:116::-;76580:22;76590:2;76594:7;76580:9;:22::i;21091:118::-;20100:19;:17;:19::i;:::-;21151:7:::1;:14:::0;;-1:-1:-1;;21151:14:0::1;21161:4;21151:14;::::0;;21181:20:::1;21188:12;15976:10:::0;;15896:98;59275:315;59430:8;-1:-1:-1;;;;;59421:17:0;:5;-1:-1:-1;;;;;59421:17:0;;59413:55;;;;-1:-1:-1;;;59413:55:0;;23849:2:1;59413:55:0;;;23831:21:1;23888:2;23868:18;;;23861:30;23927:27;23907:18;;;23900:55;23972:18;;59413:55:0;23647:349:1;59413:55:0;-1:-1:-1;;;;;59479:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;59479:46:0;;;;;;;;;;59541:41;;540::1;;;59541::0;;513:18:1;59541:41:0;;;;;;;59275:315;;;:::o;52425:313::-;52581:28;52591:4;52597:2;52601:7;52581:9;:28::i;:::-;52628:47;52651:4;52657:2;52661:7;52670:4;52628:22;:47::i;:::-;52620:110;;;;-1:-1:-1;;;52620:110:0;;;;;;;:::i;75952:100::-;76004:13;76037:7;76030:14;;;;;:::i;13317:716::-;13373:13;13424:14;13441:17;13452:5;13441:10;:17::i;:::-;13461:1;13441:21;13424:38;;13477:20;13511:6;-1:-1:-1;;;;;13500:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13500:18:0;-1:-1:-1;13477:41:0;-1:-1:-1;13642:28:0;;;13658:2;13642:28;13699:288;-1:-1:-1;;13731:5:0;-1:-1:-1;;;13868:2:0;13857:14;;13852:30;13731:5;13839:44;13929:2;13920:11;;;-1:-1:-1;13950:21:0;13699:288;13950:21;-1:-1:-1;14008:6:0;13317:716;-1:-1:-1;;;13317:716:0:o;66614:224::-;66716:4;-1:-1:-1;;;;;;66740:50:0;;-1:-1:-1;;;66740:50:0;;:90;;;66794:36;66818:11;66794:23;:36::i;80227:234::-;80397:56;80424:4;80430:2;80434:7;80443:9;80397:26;:56::i;20839:108::-;20566:7;;;;20898:41;;;;-1:-1:-1;;;20898:41:0;;24622:2:1;20898:41:0;;;24604:21:1;24661:2;24641:18;;;24634:30;-1:-1:-1;;;24680:18:1;;;24673:50;24740:18;;20898:41:0;24420:344:1;54183:110:0;54259:26;54269:2;54273:7;54259:26;;;;;;;;;;;;:9;:26::i;20654:108::-;20566:7;;;;20724:9;20716:38;;;;-1:-1:-1;;;20716:38:0;;24971:2:1;20716:38:0;;;24953:21:1;25010:2;24990:18;;;24983:30;-1:-1:-1;;;25029:18:1;;;25022:46;25085:18;;20716:38:0;24769:340:1;60378:853:0;60532:4;-1:-1:-1;;;;;60553:13:0;;23011:19;:23;60549:675;;60589:71;;-1:-1:-1;;;60589:71:0;;-1:-1:-1;;;;;60589:36:0;;;;;:71;;15976:10;;60640:4;;60646:7;;60655:4;;60589:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60589:71:0;;;;;;;;-1:-1:-1;;60589:71:0;;;;;;;;;;;;:::i;:::-;;;60585:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60830:6;:13;60847:1;60830:18;60826:328;;60873:60;;-1:-1:-1;;;60873:60:0;;;;;;;:::i;60826:328::-;61104:6;61098:13;61089:6;61085:2;61081:15;61074:38;60585:584;-1:-1:-1;;;;;;60711:51:0;-1:-1:-1;;;60711:51:0;;-1:-1:-1;60704:58:0;;60549:675;-1:-1:-1;61208:4:0;60378:853;;;;;;:::o;10177:922::-;10230:7;;-1:-1:-1;;;10308:15:0;;10304:102;;-1:-1:-1;;;10344:15:0;;;-1:-1:-1;10388:2:0;10378:12;10304:102;10433:6;10424:5;:15;10420:102;;10469:6;10460:15;;;-1:-1:-1;10504:2:0;10494:12;10420:102;10549:6;10540:5;:15;10536:102;;10585:6;10576:15;;;-1:-1:-1;10620:2:0;10610:12;10536:102;10665:5;10656;:14;10652:99;;10700:5;10691:14;;;-1:-1:-1;10734:1:0;10724:11;10652:99;10778:5;10769;:14;10765:99;;10813:5;10804:14;;;-1:-1:-1;10847:1:0;10837:11;10765:99;10891:5;10882;:14;10878:99;;10926:5;10917:14;;;-1:-1:-1;10960:1:0;10950:11;10878:99;11004:5;10995;:14;10991:66;;11040:1;11030:11;11085:6;10177:922;-1:-1:-1;;10177:922:0:o;47420:305::-;47522:4;-1:-1:-1;;;;;;47559:40:0;;-1:-1:-1;;;47559:40:0;;:105;;-1:-1:-1;;;;;;;47616:48:0;;-1:-1:-1;;;47616:48:0;47559:105;:158;;;-1:-1:-1;;;;;;;;;;34778:40:0;;;47681:36;34669:157;67751:915;68018:1;68006:9;:13;68002:222;;;68149:63;;-1:-1:-1;;;68149:63:0;;26064:2:1;68149:63:0;;;26046:21:1;26103:2;26083:18;;;26076:30;26142:34;26122:18;;;26115:62;-1:-1:-1;;;26193:18:1;;;26186:51;26254:19;;68149:63:0;25862:417:1;68002:222:0;68254:12;-1:-1:-1;;;;;68283:18:0;;68279:187;;68318:40;68350:7;69493:10;:17;;69466:24;;;;:15;:24;;;;;:44;;;69521:24;;;;;;;;;;;;69389:164;68318:40;68279:187;;;68388:2;-1:-1:-1;;;;;68380:10:0;:4;-1:-1:-1;;;;;68380:10:0;;68376:90;;68407:47;68440:4;68446:7;68407:32;:47::i;:::-;-1:-1:-1;;;;;68480:16:0;;68476:183;;68513:45;68550:7;68513:36;:45::i;:::-;68476:183;;;68586:4;-1:-1:-1;;;;;68580:10:0;:2;-1:-1:-1;;;;;68580:10:0;;68576:83;;68607:40;68635:2;68639:7;68607:27;:40::i;54520:319::-;54649:18;54655:2;54659:7;54649:5;:18::i;:::-;54700:53;54731:1;54735:2;54739:7;54748:4;54700:22;:53::i;:::-;54678:153;;;;-1:-1:-1;;;54678:153:0;;;;;;;:::i;70180:988::-;70446:22;70496:1;70471:22;70488:4;70471:16;:22::i;:::-;:26;;;;:::i;:::-;70508:18;70529:26;;;:17;:26;;;;;;70446:51;;-1:-1:-1;70662:28:0;;;70658:328;;-1:-1:-1;;;;;70729:18:0;;70707:19;70729:18;;;:12;:18;;;;;;;;:34;;;;;;;;;70780:30;;;;;;:44;;;70897:30;;:17;:30;;;;;:43;;;70658:328;-1:-1:-1;71082:26:0;;;;:17;:26;;;;;;;;71075:33;;;-1:-1:-1;;;;;71126:18:0;;;;;:12;:18;;;;;:34;;;;;;;71119:41;70180:988::o;71463:1079::-;71741:10;:17;71716:22;;71741:21;;71761:1;;71741:21;:::i;:::-;71773:18;71794:24;;;:15;:24;;;;;;72167:10;:26;;71716:46;;-1:-1:-1;71794:24:0;;71716:46;;72167:26;;;;;;:::i;:::-;;;;;;;;;72145:48;;72231:11;72206:10;72217;72206:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;72311:28;;;:15;:28;;;;;;;:41;;;72483:24;;;;;72476:31;72518:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;71534:1008;;;71463:1079;:::o;68967:221::-;69052:14;69069:20;69086:2;69069:16;:20::i;:::-;-1:-1:-1;;;;;69100:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;69145:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;68967:221:0:o;55175:942::-;-1:-1:-1;;;;;55255:16:0;;55247:61;;;;-1:-1:-1;;;55247:61:0;;26486:2:1;55247:61:0;;;26468:21:1;;;26505:18;;;26498:30;26564:34;26544:18;;;26537:62;26616:18;;55247:61:0;26284:356:1;55247:61:0;53347:4;52945:16;;;:7;:16;;;;;;-1:-1:-1;;;;;52945:16:0;53371:31;55319:58;;;;-1:-1:-1;;;55319:58:0;;26847:2:1;55319:58:0;;;26829:21:1;26886:2;26866:18;;;26859:30;26925;26905:18;;;26898:58;26973:18;;55319:58:0;26645:352:1;55319:58:0;55390:48;55419:1;55423:2;55427:7;55436:1;55390:20;:48::i;:::-;53347:4;52945:16;;;:7;:16;;;;;;-1:-1:-1;;;;;52945:16:0;53371:31;55528:58;;;;-1:-1:-1;;;55528:58:0;;26847:2:1;55528:58:0;;;26829:21:1;26886:2;26866:18;;;26859:30;26925;26905:18;;;26898:58;26973:18;;55528:58:0;26645:352:1;55528:58:0;-1:-1:-1;;;;;55935:13:0;;;;;;:9;:13;;;;;;;;:18;;55952:1;55935:18;;;55977:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;55977:21:0;;;;;56016:33;55985:7;;55935:13;;56016:33;;55935:13;;56016:33;80824:155;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:173::-;660:20;;-1:-1:-1;;;;;709:31:1;;699:42;;689:70;;755:1;752;745:12;689:70;592:173;;;:::o;770:366::-;837:6;845;898:2;886:9;877:7;873:23;869:32;866:52;;;914:1;911;904:12;866:52;937:29;956:9;937:29;:::i;:::-;927:39;;1016:2;1005:9;1001:18;988:32;-1:-1:-1;;;;;1053:5:1;1049:38;1042:5;1039:49;1029:77;;1102:1;1099;1092:12;1029:77;1125:5;1115:15;;;770:366;;;;;:::o;1141:250::-;1226:1;1236:113;1250:6;1247:1;1244:13;1236:113;;;1326:11;;;1320:18;1307:11;;;1300:39;1272:2;1265:10;1236:113;;;-1:-1:-1;;1383:1:1;1365:16;;1358:27;1141:250::o;1396:271::-;1438:3;1476:5;1470:12;1503:6;1498:3;1491:19;1519:76;1588:6;1581:4;1576:3;1572:14;1565:4;1558:5;1554:16;1519:76;:::i;:::-;1649:2;1628:15;-1:-1:-1;;1624:29:1;1615:39;;;;1656:4;1611:50;;1396:271;-1:-1:-1;;1396:271:1:o;1672:220::-;1821:2;1810:9;1803:21;1784:4;1841:45;1882:2;1871:9;1867:18;1859:6;1841:45;:::i;1897:180::-;1956:6;2009:2;1997:9;1988:7;1984:23;1980:32;1977:52;;;2025:1;2022;2015:12;1977:52;-1:-1:-1;2048:23:1;;1897:180;-1:-1:-1;1897:180:1:o;2290:254::-;2358:6;2366;2419:2;2407:9;2398:7;2394:23;2390:32;2387:52;;;2435:1;2432;2425:12;2387:52;2458:29;2477:9;2458:29;:::i;:::-;2448:39;2534:2;2519:18;;;;2506:32;;-1:-1:-1;;;2290:254:1:o;2731:328::-;2808:6;2816;2824;2877:2;2865:9;2856:7;2852:23;2848:32;2845:52;;;2893:1;2890;2883:12;2845:52;2916:29;2935:9;2916:29;:::i;:::-;2906:39;;2964:38;2998:2;2987:9;2983:18;2964:38;:::i;:::-;2954:48;;3049:2;3038:9;3034:18;3021:32;3011:42;;2731:328;;;;;:::o;3064:248::-;3132:6;3140;3193:2;3181:9;3172:7;3168:23;3164:32;3161:52;;;3209:1;3206;3199:12;3161:52;-1:-1:-1;;3232:23:1;;;3302:2;3287:18;;;3274:32;;-1:-1:-1;3064:248:1:o;3596:186::-;3655:6;3708:2;3696:9;3687:7;3683:23;3679:32;3676:52;;;3724:1;3721;3714:12;3676:52;3747:29;3766:9;3747:29;:::i;3787:367::-;3850:8;3860:6;3914:3;3907:4;3899:6;3895:17;3891:27;3881:55;;3932:1;3929;3922:12;3881:55;-1:-1:-1;3955:20:1;;-1:-1:-1;;;;;3987:30:1;;3984:50;;;4030:1;4027;4020:12;3984:50;4067:4;4059:6;4055:17;4043:29;;4127:3;4120:4;4110:6;4107:1;4103:14;4095:6;4091:27;4087:38;4084:47;4081:67;;;4144:1;4141;4134:12;4159:773;4281:6;4289;4297;4305;4358:2;4346:9;4337:7;4333:23;4329:32;4326:52;;;4374:1;4371;4364:12;4326:52;4414:9;4401:23;-1:-1:-1;;;;;4484:2:1;4476:6;4473:14;4470:34;;;4500:1;4497;4490:12;4470:34;4539:70;4601:7;4592:6;4581:9;4577:22;4539:70;:::i;:::-;4628:8;;-1:-1:-1;4513:96:1;-1:-1:-1;4716:2:1;4701:18;;4688:32;;-1:-1:-1;4732:16:1;;;4729:36;;;4761:1;4758;4751:12;4729:36;;4800:72;4864:7;4853:8;4842:9;4838:24;4800:72;:::i;:::-;4159:773;;;;-1:-1:-1;4891:8:1;-1:-1:-1;;;;4159:773:1:o;4937:127::-;4998:10;4993:3;4989:20;4986:1;4979:31;5029:4;5026:1;5019:15;5053:4;5050:1;5043:15;5069:632;5134:5;-1:-1:-1;;;;;5205:2:1;5197:6;5194:14;5191:40;;;5211:18;;:::i;:::-;5286:2;5280:9;5254:2;5340:15;;-1:-1:-1;;5336:24:1;;;5362:2;5332:33;5328:42;5316:55;;;5386:18;;;5406:22;;;5383:46;5380:72;;;5432:18;;:::i;:::-;5472:10;5468:2;5461:22;5501:6;5492:15;;5531:6;5523;5516:22;5571:3;5562:6;5557:3;5553:16;5550:25;5547:45;;;5588:1;5585;5578:12;5547:45;5638:6;5633:3;5626:4;5618:6;5614:17;5601:44;5693:1;5686:4;5677:6;5669;5665:19;5661:30;5654:41;;;;5069:632;;;;;:::o;5706:451::-;5775:6;5828:2;5816:9;5807:7;5803:23;5799:32;5796:52;;;5844:1;5841;5834:12;5796:52;5884:9;5871:23;-1:-1:-1;;;;;5909:6:1;5906:30;5903:50;;;5949:1;5946;5939:12;5903:50;5972:22;;6025:4;6017:13;;6013:27;-1:-1:-1;6003:55:1;;6054:1;6051;6044:12;6003:55;6077:74;6143:7;6138:2;6125:16;6120:2;6116;6112:11;6077:74;:::i;6162:592::-;6233:6;6241;6294:2;6282:9;6273:7;6269:23;6265:32;6262:52;;;6310:1;6307;6300:12;6262:52;6350:9;6337:23;-1:-1:-1;;;;;6420:2:1;6412:6;6409:14;6406:34;;;6436:1;6433;6426:12;6406:34;6474:6;6463:9;6459:22;6449:32;;6519:7;6512:4;6508:2;6504:13;6500:27;6490:55;;6541:1;6538;6531:12;6490:55;6581:2;6568:16;6607:2;6599:6;6596:14;6593:34;;;6623:1;6620;6613:12;6593:34;6668:7;6663:2;6654:6;6650:2;6646:15;6642:24;6639:37;6636:57;;;6689:1;6686;6679:12;6636:57;6720:2;6712:11;;;;;6742:6;;-1:-1:-1;6162:592:1;;-1:-1:-1;;;;6162:592:1:o;6759:347::-;6824:6;6832;6885:2;6873:9;6864:7;6860:23;6856:32;6853:52;;;6901:1;6898;6891:12;6853:52;6924:29;6943:9;6924:29;:::i;:::-;6914:39;;7003:2;6992:9;6988:18;6975:32;7050:5;7043:13;7036:21;7029:5;7026:32;7016:60;;7072:1;7069;7062:12;7111:667;7206:6;7214;7222;7230;7283:3;7271:9;7262:7;7258:23;7254:33;7251:53;;;7300:1;7297;7290:12;7251:53;7323:29;7342:9;7323:29;:::i;:::-;7313:39;;7371:38;7405:2;7394:9;7390:18;7371:38;:::i;:::-;7361:48;;7456:2;7445:9;7441:18;7428:32;7418:42;;7511:2;7500:9;7496:18;7483:32;-1:-1:-1;;;;;7530:6:1;7527:30;7524:50;;;7570:1;7567;7560:12;7524:50;7593:22;;7646:4;7638:13;;7634:27;-1:-1:-1;7624:55:1;;7675:1;7672;7665:12;7624:55;7698:74;7764:7;7759:2;7746:16;7741:2;7737;7733:11;7698:74;:::i;:::-;7688:84;;;7111:667;;;;;;;:::o;7783:2048::-;8049:6;8057;8065;8073;8081;8089;8097;8105;8113;8121;8129:7;8138;8192:3;8180:9;8171:7;8167:23;8163:33;8160:53;;;8209:1;8206;8199:12;8160:53;-1:-1:-1;;;;;8241:9:1;8228:23;8225:47;8222:67;;;8285:1;8282;8275:12;8222:67;8324:87;8403:7;8390:9;8377:23;8366:9;8362:39;8324:87;:::i;:::-;8430:8;;-1:-1:-1;8457:8:1;-1:-1:-1;;;;;;8508:2:1;8493:18;;8480:32;8477:56;8474:76;;;8546:1;8543;8536:12;8474:76;8585:96;8673:7;8666:2;8655:9;8651:18;8638:32;8627:9;8623:48;8585:96;:::i;:::-;8700:8;;-1:-1:-1;8727:8:1;-1:-1:-1;;;;;;8778:2:1;8763:18;;8750:32;8747:56;8744:76;;;8816:1;8813;8806:12;8744:76;8855:96;8943:7;8936:2;8925:9;8921:18;8908:32;8897:9;8893:48;8855:96;:::i;:::-;8970:8;;-1:-1:-1;8997:8:1;-1:-1:-1;;;;;;9048:2:1;9033:18;;9020:32;9017:56;9014:76;;;9086:1;9083;9076:12;9014:76;9125:96;9213:7;9206:2;9195:9;9191:18;9178:32;9167:9;9163:48;9125:96;:::i;:::-;9240:8;;-1:-1:-1;9267:8:1;-1:-1:-1;;;;;;9318:3:1;9303:19;;9290:33;9287:57;9284:77;;;9357:1;9354;9347:12;9284:77;9396:97;9485:7;9477:3;9466:9;9462:19;9449:33;9438:9;9434:49;9396:97;:::i;:::-;9512:8;;-1:-1:-1;9539:8:1;-1:-1:-1;;;;;;9590:3:1;9575:19;;9562:33;9559:57;9556:77;;;9629:1;9626;9619:12;9556:77;9670:97;9759:7;9751:3;9740:9;9736:19;9723:33;9712:9;9708:49;9670:97;:::i;:::-;9787:9;9776:20;;9816:9;9805:20;;;;7783:2048;;;;;;;;;;;;;;:::o;9836:260::-;9904:6;9912;9965:2;9953:9;9944:7;9940:23;9936:32;9933:52;;;9981:1;9978;9971:12;9933:52;10004:29;10023:9;10004:29;:::i;:::-;9994:39;;10052:38;10086:2;10075:9;10071:18;10052:38;:::i;:::-;10042:48;;9836:260;;;;;:::o;10101:380::-;10180:1;10176:12;;;;10223;;;10244:61;;10298:4;10290:6;10286:17;10276:27;;10244:61;10351:2;10343:6;10340:14;10320:18;10317:38;10314:161;;10397:10;10392:3;10388:20;10385:1;10378:31;10432:4;10429:1;10422:15;10460:4;10457:1;10450:15;10314:161;;10101:380;;;:::o;11318:409::-;11520:2;11502:21;;;11559:2;11539:18;;;11532:30;11598:34;11593:2;11578:18;;11571:62;-1:-1:-1;;;11664:2:1;11649:18;;11642:43;11717:3;11702:19;;11318:409::o;11732:127::-;11793:10;11788:3;11784:20;11781:1;11774:31;11824:4;11821:1;11814:15;11848:4;11845:1;11838:15;11864:168;11937:9;;;11968;;11985:15;;;11979:22;;11965:37;11955:71;;12006:18;;:::i;12169:217::-;12209:1;12235;12225:132;;12279:10;12274:3;12270:20;12267:1;12260:31;12314:4;12311:1;12304:15;12342:4;12339:1;12332:15;12225:132;-1:-1:-1;12371:9:1;;12169:217::o;12803:128::-;12870:9;;;12891:11;;;12888:37;;;12905:18;;:::i;12936:127::-;12997:10;12992:3;12988:20;12985:1;12978:31;13028:4;13025:1;13018:15;13052:4;13049:1;13042:15;13068:127;13129:10;13124:3;13120:20;13117:1;13110:31;13160:4;13157:1;13150:15;13184:4;13181:1;13174:15;15130:135;15169:3;15190:17;;;15187:43;;15210:18;;:::i;:::-;-1:-1:-1;15257:1:1;15246:13;;15130:135::o;15396:545::-;15498:2;15493:3;15490:11;15487:448;;;15534:1;15559:5;15555:2;15548:17;15604:4;15600:2;15590:19;15674:2;15662:10;15658:19;15655:1;15651:27;15645:4;15641:38;15710:4;15698:10;15695:20;15692:47;;;-1:-1:-1;15733:4:1;15692:47;15788:2;15783:3;15779:12;15776:1;15772:20;15766:4;15762:31;15752:41;;15843:82;15861:2;15854:5;15851:13;15843:82;;;15906:17;;;15887:1;15876:13;15843:82;;;15847:3;;;15396:545;;;:::o;16117:1352::-;16243:3;16237:10;-1:-1:-1;;;;;16262:6:1;16259:30;16256:56;;;16292:18;;:::i;:::-;16321:97;16411:6;16371:38;16403:4;16397:11;16371:38;:::i;:::-;16365:4;16321:97;:::i;:::-;16473:4;;16537:2;16526:14;;16554:1;16549:663;;;;17256:1;17273:6;17270:89;;;-1:-1:-1;17325:19:1;;;17319:26;17270:89;-1:-1:-1;;16074:1:1;16070:11;;;16066:24;16062:29;16052:40;16098:1;16094:11;;;16049:57;17372:81;;16519:944;;16549:663;15343:1;15336:14;;;15380:4;15367:18;;-1:-1:-1;;16585:20:1;;;16703:236;16717:7;16714:1;16711:14;16703:236;;;16806:19;;;16800:26;16785:42;;16898:27;;;;16866:1;16854:14;;;;16733:19;;16703:236;;;16707:3;16967:6;16958:7;16955:19;16952:201;;;17028:19;;;17022:26;-1:-1:-1;;17111:1:1;17107:14;;;17123:3;17103:24;17099:37;17095:42;17080:58;17065:74;;16952:201;-1:-1:-1;;;;;17199:1:1;17183:14;;;17179:22;17166:36;;-1:-1:-1;16117:1352:1:o;17474:1206::-;-1:-1:-1;;;;;17593:3:1;17590:27;17587:53;;;17620:18;;:::i;:::-;17649:94;17739:3;17699:38;17731:4;17725:11;17699:38;:::i;:::-;17693:4;17649:94;:::i;:::-;17769:1;17794:2;17789:3;17786:11;17811:1;17806:616;;;;18466:1;18483:3;18480:93;;;-1:-1:-1;18539:19:1;;;18526:33;18480:93;-1:-1:-1;;16074:1:1;16070:11;;;16066:24;16062:29;16052:40;16098:1;16094:11;;;16049:57;18586:78;;17779:895;;17806:616;15343:1;15336:14;;;15380:4;15367:18;;-1:-1:-1;;17842:17:1;;;17943:9;17965:229;17979:7;17976:1;17973:14;17965:229;;;18068:19;;;18055:33;18040:49;;18175:4;18160:20;;;;18128:1;18116:14;;;;17995:12;17965:229;;;17969:3;18222;18213:7;18210:16;18207:159;;;18346:1;18342:6;18336:3;18330;18327:1;18323:11;18319:21;18315:34;18311:39;18298:9;18293:3;18289:19;18276:33;18272:79;18264:6;18257:95;18207:159;;;18409:1;18403:3;18400:1;18396:11;18392:19;18386:4;18379:33;17779:895;;17474:1206;;;:::o;18685:663::-;18965:3;19003:6;18997:13;19019:66;19078:6;19073:3;19066:4;19058:6;19054:17;19019:66;:::i;:::-;19148:13;;19107:16;;;;19170:70;19148:13;19107:16;19217:4;19205:17;;19170:70;:::i;:::-;-1:-1:-1;;;19262:20:1;;19291:22;;;19340:1;19329:13;;18685:663;-1:-1:-1;;;;18685:663:1:o;22132:401::-;22334:2;22316:21;;;22373:2;22353:18;;;22346:30;22412:34;22407:2;22392:18;;22385:62;-1:-1:-1;;;22478:2:1;22463:18;;22456:35;22523:3;22508:19;;22132:401::o;24001:414::-;24203:2;24185:21;;;24242:2;24222:18;;;24215:30;24281:34;24276:2;24261:18;;24254:62;-1:-1:-1;;;24347:2:1;24332:18;;24325:48;24405:3;24390:19;;24001:414::o;25114:489::-;-1:-1:-1;;;;;25383:15:1;;;25365:34;;25435:15;;25430:2;25415:18;;25408:43;25482:2;25467:18;;25460:34;;;25530:3;25525:2;25510:18;;25503:31;;;25308:4;;25551:46;;25577:19;;25569:6;25551:46;:::i;:::-;25543:54;25114:489;-1:-1:-1;;;;;;25114:489:1:o;25608:249::-;25677:6;25730:2;25718:9;25709:7;25705:23;25701:32;25698:52;;;25746:1;25743;25736:12;25698:52;25778:9;25772:16;25797:30;25821:5;25797:30;:::i
Swarm Source
ipfs://7c456d185d04b14330cc8f06745799a5eac2c19d80e7d2b4a5f10b1eed6c5909
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.