Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 71 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 17139294 | 510 days ago | IN | 0 ETH | 0.00196485 | ||||
Safe Transfer Fr... | 17121689 | 512 days ago | IN | 0 ETH | 0.00310375 | ||||
Withdraw | 17121666 | 512 days ago | IN | 0 ETH | 0.00126196 | ||||
Pause | 17090781 | 517 days ago | IN | 0 ETH | 0.00269576 | ||||
Mint | 17090744 | 517 days ago | IN | 0.033 ETH | 0.00740532 | ||||
Mint | 17090320 | 517 days ago | IN | 0.033 ETH | 0.00889499 | ||||
Mint | 17090313 | 517 days ago | IN | 0.033 ETH | 0.00952366 | ||||
Mint | 17090312 | 517 days ago | IN | 0.033 ETH | 0.00962116 | ||||
Mint | 17090295 | 517 days ago | IN | 0.033 ETH | 0.00989545 | ||||
Mint | 17090294 | 517 days ago | IN | 0.033 ETH | 0.00971288 | ||||
Set Approval For... | 17089381 | 517 days ago | IN | 0 ETH | 0.00383136 | ||||
Mint | 17089353 | 517 days ago | IN | 0.033 ETH | 0.00968669 | ||||
Mint | 17089351 | 517 days ago | IN | 0.033 ETH | 0.00959103 | ||||
Mint | 17089346 | 517 days ago | IN | 0.033 ETH | 0.01000995 | ||||
Mint | 17089346 | 517 days ago | IN | 0.033 ETH | 0.01000909 | ||||
Mint | 17089345 | 517 days ago | IN | 0.033 ETH | 0.0097648 | ||||
Set Approval For... | 17085199 | 517 days ago | IN | 0 ETH | 0.00346727 | ||||
Mint | 17084281 | 518 days ago | IN | 0.033 ETH | 0.00799295 | ||||
Mint | 17084273 | 518 days ago | IN | 0.033 ETH | 0.00778512 | ||||
Mint | 17084256 | 518 days ago | IN | 0.033 ETH | 0.00882345 | ||||
Mint | 17084241 | 518 days ago | IN | 0.033 ETH | 0.0088235 | ||||
Mint | 17084141 | 518 days ago | IN | 0.033 ETH | 0.00864374 | ||||
Mint | 17084085 | 518 days ago | IN | 0.033 ETH | 0.01056033 | ||||
Mint | 17084080 | 518 days ago | IN | 0.033 ETH | 0.00968199 | ||||
Mint | 17083197 | 518 days ago | IN | 0.033 ETH | 0.01178632 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
17121666 | 512 days ago | 1.881 ETH |
Loading...
Loading
Contract Name:
Asset
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-04-17 */ // SPDX-License-Identifier: MIT /* ██████████ ██████████ ██████████ ██████████ ██████████ ██████████ ██████████ ██████████ ██████████ ██████████ ██████████ ██████████ ██████████ ██████████ ██████████ ██████████ ██████████ ██████████ ██████████ ██████████ ██████████ ██████████████████████████████ ██████████████████████████████ ██████████████████████████████ ██████████████████████████████ ██████████████████████████████ ▐██████████ ███████████ ▐██████████ ███████████ ▐██████████ ███████████ ▐██████████ ███████████ ▐██████████ ███████████ ▐██████████ ███████████ ▐██████████ ███████████ */ // File: https://github.com/ProjectOpenSea/operator-filter-registry/blob/main/src/IOperatorFilterRegistry.sol pragma solidity ^0.8.13; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } // File: https://github.com/ProjectOpenSea/operator-filter-registry/blob/main/src/OperatorFilterer.sol pragma solidity ^0.8.13; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from == msg.sender) { _; return; } if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) { revert OperatorNotAllowed(msg.sender); } } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } _; } } // File: https://github.com/ProjectOpenSea/operator-filter-registry/blob/main/src/DefaultOperatorFilterer.sol pragma solidity ^0.8.13; /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {} } pragma solidity ^0.8.0; /// [MIT License] /// @title Base64 /// @notice Provides a function for encoding some bytes in base64 /// @author Brecht Devos <[email protected]> library Base64 { bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /// @notice Encodes some bytes to the base64 representation function encode(bytes memory data) internal pure returns (string memory) { uint256 len = data.length; if (len == 0) return ""; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((len + 2) / 3); // Add some extra buffer at the end bytes memory result = new bytes(encodedLen + 32); bytes memory table = TABLE; assembly { let tablePtr := add(table, 1) let resultPtr := add(result, 32) for { let i := 0 } lt(i, len) { } { i := add(i, 3) let input := and(mload(add(data, i)), 0xffffff) let out := mload(add(tablePtr, and(shr(18, input), 0x3F))) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF)) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF)) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF)) out := shl(224, out) mstore(resultPtr, out) resultPtr := add(resultPtr, 4) } switch mod(len, 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } mstore(result, encodedLen) } return string(result); } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } pragma solidity ^0.8.0; // File @openzeppelin/contracts/interfaces/[email protected] // OpenZeppelin Contracts (last updated v4.5.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 payed in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File @openzeppelin/contracts/token/common/[email protected] // OpenZeppelin Contracts (last updated v4.5.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) external 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: * * - `tokenId` must be already minted. * - `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]; } } pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } pragma solidity ^0.8.0; /** * @dev ERC721 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. */ abstract contract ERC721Pausable is ERC721, Ownable, Pausable { /** * @dev See {ERC721-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (_msgSender() != owner()) { require(!paused(), "ERC721Pausable: token transfer while paused"); } } } contract Asset is ERC721Enumerable, ReentrancyGuard, DefaultOperatorFilterer, Ownable, ERC2981, Pausable { uint256 public price = 33000000000000000; //0.033 ETH uint256 public constant MAX_SUPPLY = 10000; // Inspired by 0xff9c1b15b16263c61d017ee9f65c50e4ae0113d7 constructor() ERC721("Asset", "ASSET") { } string[] private firstnumber = [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" ]; string[] private secondnumber = [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" ]; string[] private thirdnumber = [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" ]; string[] private fourthnumber = [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" ]; string[] private fifthnumber = [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" ]; string[] private sixthnumber = [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" ]; string[] private seventhnumber = [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" ]; string[] private eighthnumber = [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" ]; function random(string memory input) internal pure returns (uint256) { return uint256(keccak256(abi.encodePacked(input))); } function getFirst(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "FIRSTNUMBER", firstnumber); } function getSecond(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "SECONDNUMBER", secondnumber); } function getThird(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "THIRDNUMBER", thirdnumber); } function getFourth(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "FOURTHNUMBER", fourthnumber); } function getFifth(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "FIFTHNUMBER", fifthnumber); } function getSixth(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "SIXTHNUMBER", sixthnumber); } function getSeventh(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "SEVENTHNUMBER", seventhnumber); } function getEighth(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "EIGHTHNUMBER", eighthnumber); } function pluck( uint256 tokenId, string memory keyPrefix, string[] memory sourceArray ) internal pure returns (string memory) { uint256 rand = random(string(abi.encodePacked(keyPrefix, toString(tokenId)))); string memory output = sourceArray[rand % sourceArray.length]; return output; } function tokenURI(uint256 tokenId) public view override returns (string memory) { string[17] memory parts; parts[ 0 ] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 700 700"><style>.base { fill: #000; font-family: sans-serif; font-size: 22px; font-weight: bold;}</style><rect width="100%" height="100%" fill="#cff000" /><g transform="translate(0.000000,700.000000) scale(0.020000,-0.020000)" fill="#000" stroke="none"> <path d="M15772 30192 c-447 -1269 -815 -2318 -819 -2330 l-5 -22 450 0 450 0 192 575 192 575 878 0 878 0 5 -22 c4 -13 90 -272 193 -575 l186 -553 449 0 c247 0 449 3 449 8 0 4 -369 1051 -819 2327 l-818 2320 -524 3 -525 2 -812 -2308z m1666 426 c172 -513 312 -936 312 -940 0 -5 -290 -8 -644 -8 l-645 0 284 848 c156 466 298 889 315 940 23 66 36 92 48 92 14 0 83 -195 330 -932z"/><path d="M30940 31760 l0 -420 -250 0 -250 0 0 -320 0 -320 249 0 250 0 4 -1062 c4 -1159 1 -1102 61 -1268 87 -239 281 -423 536 -512 171 -59 464 -85 665 -59 102 13 303 59 310 70 5 10 -124 623 -134 634 -4 4 -32 2 -62 -3 -30 -6 -103 -12 -164 -12 -116 -1 -183 13 -244 50 -40 24 -106 110 -123 160 -9 28 -13 269 -16 1020 l-3 982 346 0 345 0 0 320 0 320 -345 0 -345 0 0 420 0 420 -415 0 -415 0 0 -420z"/><path d="M20980 31370 c-381 -42 -695 -175 -904 -383 -129 -130 -207 -267 -248 -436 -32 -134 -29 -343 6 -480 78 -299 279 -506 625 -641 126 -49 254 -82 627 -160 404 -85 452 -98 566 -156 77 -39 161 -127 183 -193 80 -242 -105 -457 -444 -516 -216 -38 -455 -5 -613 84 -113 64 -217 197 -252 324 l-17 57 -37 -5 c-20 -3 -198 -21 -396 -40 -197 -19 -361 -36 -363 -39 -3 -3 7 -56 22 -118 111 -450 488 -762 1044 -863 199 -36 527 -46 711 -21 557 76 953 323 1127 704 58 128 77 225 77 397 0 134 -3 160 -28 245 -82 283 -283 477 -626 605 -144 53 -275 87 -663 170 -337 72 -437 100 -540 152 -142 71 -199 153 -205 293 -3 74 0 93 21 141 46 105 183 206 332 244 150 39 349 36 490 -6 172 -51 319 -187 380 -351 10 -27 20 -48 24 -48 3 0 170 18 371 40 201 22 368 40 371 40 14 0 -61 231 -100 310 -125 249 -354 450 -629 551 -59 22 -174 53 -257 69 -129 26 -180 31 -360 34 -115 3 -248 1 -295 -4z"/><path d="M24500 31370 c-381 -42 -695 -175 -904 -383 -129 -130 -207 -267 -248 -436 -32 -134 -29 -343 6 -480 78 -299 279 -506 625 -641 126 -49 254 -82 627 -160 404 -85 452 -98 566 -156 77 -39 161 -127 183 -193 80 -242 -105 -457 -444 -516 -216 -38 -455 -5 -613 84 -113 64 -217 197 -252 324 l-17 57 -37 -5 c-20 -3 -198 -21 -396 -40 -197 -19 -361 -36 -363 -39 -3 -3 7 -56 22 -118 111 -450 488 -762 1044 -863 199 -36 527 -46 711 -21 557 76 953 323 1127 704 58 128 77 225 77 397 0 134 -3 160 -28 245 -82 283 -283 477 -626 605 -144 53 -275 87 -663 170 -337 72 -437 100 -540 152 -142 71 -199 153 -205 293 -3 74 0 93 21 141 46 105 183 206 332 244 150 39 349 36 490 -6 172 -51 319 -187 380 -351 10 -27 20 -48 24 -48 3 0 170 18 371 40 201 22 368 40 371 40 14 0 -61 231 -100 310 -125 249 -354 450 -629 551 -59 22 -174 53 -257 69 -129 26 -180 31 -360 34 -115 3 -248 1 -295 -4z"/><path d="M28215 31371 c-756 -71 -1300 -611 -1436 -1426 -32 -188 -32 -581 0 -768 128 -760 593 -1254 1296 -1377 157 -27 472 -38 622 -21 643 74 1092 401 1250 911 12 41 19 77 15 80 -4 4 -160 24 -347 44 -187 21 -357 40 -377 43 l-37 5 -36 -73 c-116 -229 -335 -356 -645 -375 -435 -26 -763 186 -894 577 -29 86 -56 239 -56 317 l0 52 1222 0 1221 0 -7 234 c-13 443 -59 678 -186 941 -110 229 -262 416 -450 554 -168 124 -412 223 -655 267 -101 18 -376 26 -500 15z m419 -661 c110 -28 174 -59 268 -132 178 -138 289 -347 305 -575 l6 -83 -822 0 c-775 0 -821 1 -821 18 0 63 45 227 86 317 117 252 364 437 631 474 96 14 254 5 347 -19z"/></g> <text x="50" y="650" class="base">'; parts[1] = getFirst(tokenId); parts[2] = '</text><text x="100" y="650" class="base">'; parts[3] = getSecond(tokenId); parts[4] = '</text><text x="150" y="650" class="base">'; parts[5] = getThird(tokenId); parts[6] = '</text><text x="200" y="650" class="base">'; parts[7] = getFourth(tokenId); parts[8] = '</text><text x="250" y="650" class="base">'; parts[9] = getFifth(tokenId); parts[10] = '</text><text x="300" y="650" class="base">'; parts[11] = getSixth(tokenId); parts[12] = '</text><text x="350" y="650" class="base">'; parts[13] = getSeventh(tokenId); parts[14] = '</text><text x="400" y="650" class="base">'; parts[15] = getEighth(tokenId); parts[16] = '</text></svg>'; string memory output = string( abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7], parts[8]) ); output = string( abi.encodePacked( output, parts[9], parts[10], parts[11], parts[12], parts[13], parts[14], parts[15], parts[16] ) ); string memory json = Base64.encode( bytes( string( abi.encodePacked( '{"name": "Asset #', toString(tokenId), '", "description": "", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}' ) ) ) ); output = string(abi.encodePacked("data:application/json;base64,", json)); return output; } function mint(uint256 tokenId) public payable nonReentrant { require(tokenId > 0 && tokenId <= 10000, "Token ID invalid"); require(price <= msg.value, "Ether value sent is not correct"); require(!paused(), "Pausable: paused"); _safeMint(_msgSender(), tokenId); } function withdraw() public onlyOwner { payable(msg.sender).transfer(address(this).balance); } function setDefaultRoyalty(address receiver, uint96 feeNumerator) public onlyOwner { _setDefaultRoyalty(receiver, feeNumerator); } function pause(bool val) public onlyOwner { if (val == true) { _pause(); return; } _unpause(); } function supportsInterface( bytes4 interfaceId ) public view virtual override(ERC721Enumerable, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } // Operator Filter Registry https://github.com/ProjectOpenSea/operator-filter-registry function setApprovalForAll(address operator, bool approved) public override (ERC721, IERC721) onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public override (ERC721, IERC721) onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public override (ERC721, IERC721) onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public override (ERC721, IERC721) onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override (ERC721, IERC721) onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT license // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"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":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getEighth","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFifth","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFirst","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFourth","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSecond","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSeventh","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSixth","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getThird","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","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":"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":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
66753d533d968000600f5560016101c0818152603160f81b6101e0526080908152610200828152601960f91b6102205260a052610240828152603360f81b6102605260c052610280828152600d60fa1b6102a05260e0526102c0828152603560f81b6102e05261010052610300828152601b60f91b6103205261012052610340828152603760f81b6103605261014052610380828152600760fb1b6103a052610160526103c0828152603960f81b6103e05261018052610440604052610400918252600360fc1b610420526101a091909152620000e190601090600a62000acf565b50604080516101808101825260016101408201818152603160f81b610160840152825282518084018452818152601960f91b6020828101919091528084019190915283518085018552828152603360f81b818301528385015283518085018552828152600d60fa1b81830152606084015283518085018552828152603560f81b81830152608084015283518085018552828152601b60f91b8183015260a084015283518085018552828152603760f81b8183015260c084015283518085018552828152600760fb1b8183015260e084015283518085018552828152603960f81b818301526101008401528351808501909452908352600360fc1b90830152610120810191909152620001f890601190600a62000acf565b50604080516101808101825260016101408201818152603160f81b610160840152825282518084018452818152601960f91b6020828101919091528084019190915283518085018552828152603360f81b818301528385015283518085018552828152600d60fa1b81830152606084015283518085018552828152603560f81b81830152608084015283518085018552828152601b60f91b8183015260a084015283518085018552828152603760f81b8183015260c084015283518085018552828152600760fb1b8183015260e084015283518085018552828152603960f81b818301526101008401528351808501909452908352600360fc1b908301526101208101919091526200030f90601290600a62000acf565b50604080516101808101825260016101408201818152603160f81b610160840152825282518084018452818152601960f91b6020828101919091528084019190915283518085018552828152603360f81b818301528385015283518085018552828152600d60fa1b81830152606084015283518085018552828152603560f81b81830152608084015283518085018552828152601b60f91b8183015260a084015283518085018552828152603760f81b8183015260c084015283518085018552828152600760fb1b8183015260e084015283518085018552828152603960f81b818301526101008401528351808501909452908352600360fc1b908301526101208101919091526200042690601390600a62000acf565b50604080516101808101825260016101408201818152603160f81b610160840152825282518084018452818152601960f91b6020828101919091528084019190915283518085018552828152603360f81b818301528385015283518085018552828152600d60fa1b81830152606084015283518085018552828152603560f81b81830152608084015283518085018552828152601b60f91b8183015260a084015283518085018552828152603760f81b8183015260c084015283518085018552828152600760fb1b8183015260e084015283518085018552828152603960f81b818301526101008401528351808501909452908352600360fc1b908301526101208101919091526200053d90601490600a62000acf565b50604080516101808101825260016101408201818152603160f81b610160840152825282518084018452818152601960f91b6020828101919091528084019190915283518085018552828152603360f81b818301528385015283518085018552828152600d60fa1b81830152606084015283518085018552828152603560f81b81830152608084015283518085018552828152601b60f91b8183015260a084015283518085018552828152603760f81b8183015260c084015283518085018552828152600760fb1b8183015260e084015283518085018552828152603960f81b818301526101008401528351808501909452908352600360fc1b908301526101208101919091526200065490601590600a62000acf565b50604080516101808101825260016101408201818152603160f81b610160840152825282518084018452818152601960f91b6020828101919091528084019190915283518085018552828152603360f81b818301528385015283518085018552828152600d60fa1b81830152606084015283518085018552828152603560f81b81830152608084015283518085018552828152601b60f91b8183015260a084015283518085018552828152603760f81b8183015260c084015283518085018552828152600760fb1b8183015260e084015283518085018552828152603960f81b818301526101008401528351808501909452908352600360fc1b908301526101208101919091526200076b90601690600a62000acf565b50604080516101808101825260016101408201818152603160f81b610160840152825282518084018452818152601960f91b6020828101919091528084019190915283518085018552828152603360f81b818301528385015283518085018552828152600d60fa1b81830152606084015283518085018552828152603560f81b81830152608084015283518085018552828152601b60f91b8183015260a084015283518085018552828152603760f81b8183015260c084015283518085018552828152600760fb1b8183015260e084015283518085018552828152603960f81b818301526101008401528351808501909452908352600360fc1b908301526101208101919091526200088290601790600a62000acf565b503480156200089057600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb6600160405180604001604052806005815260200164105cdcd95d60da1b815250604051806040016040528060058152602001641054d4d15560da1b8152508160009080519060200190620008fc92919062000b33565b5080516200091290600190602084019062000b33565b50506001600a55506daaeb6d7670e522a718067333cd4e3b1562000a5f578015620009ad57604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200098e57600080fd5b505af1158015620009a3573d6000803e3d6000fd5b5050505062000a5f565b6001600160a01b03821615620009fe5760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af29039060440162000973565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b15801562000a4557600080fd5b505af115801562000a5a573d6000803e3d6000fd5b505050505b5062000a6d90503362000a7d565b600e805460ff1916905562000c74565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805482825590600052602060002090810192821562000b21579160200282015b8281111562000b21578251805162000b1091849160209091019062000b33565b509160200191906001019062000af0565b5062000b2f92915062000bbe565b5090565b82805462000b419062000c38565b90600052602060002090601f01602090048101928262000b65576000855562000bb0565b82601f1062000b8057805160ff191683800117855562000bb0565b8280016001018555821562000bb0579182015b8281111562000bb057825182559160200191906001019062000b93565b5062000b2f92915062000bdf565b8082111562000b2f57600062000bd5828262000bf6565b5060010162000bbe565b5b8082111562000b2f576000815560010162000be0565b50805462000c049062000c38565b6000825580601f1062000c15575050565b601f01602090049060005260206000209081019062000c35919062000bdf565b50565b600181811c9082168062000c4d57607f821691505b60208210810362000c6e57634e487b7160e01b600052602260045260246000fd5b50919050565b6142e08062000c846000396000f3fe60806040526004361061020f5760003560e01c80636352211e116101185780639ec29b82116100a0578063b88d4fde1161006f578063b88d4fde146105f9578063c87b56dd14610619578063e985e9c514610639578063f2fde38b14610682578063fa7f71b1146106a257600080fd5b80639ec29b8214610590578063a035b1fe146105b0578063a0712d68146105c6578063a22cb465146105d957600080fd5b80638aa001fc116100e75780638aa001fc146104fd5780638c921d061461051d5780638da5cb5b1461053d5780638e1c0a021461055b57806395d89b411461057b57600080fd5b80636352211e14610488578063667386f7146104a857806370a08231146104c8578063715018a6146104e857600080fd5b80632a55205a1161019b57806341f434341161016a57806341f43434146103ee57806342842e0e1461041057806342d9d876146104305780634f6ccce7146104505780635c975abb1461047057600080fd5b80632a55205a146103645780632f745c59146103a357806332cb6b0c146103c35780633ccfd60b146103d957600080fd5b8063081812fc116101e2578063081812fc146102ad578063095ea7b3146102e55780630b2503a61461030557806318160ddd1461032557806323b872dd1461034457600080fd5b806301ffc9a71461021457806302329a291461024957806304634d8d1461026b57806306fdde031461028b575b600080fd5b34801561022057600080fd5b5061023461022f366004612c42565b6106c2565b60405190151581526020015b60405180910390f35b34801561025557600080fd5b50610269610264366004612c74565b6106d3565b005b34801561027757600080fd5b50610269610286366004612cad565b6106f8565b34801561029757600080fd5b506102a061070e565b6040516102409190612d48565b3480156102b957600080fd5b506102cd6102c8366004612d5b565b6107a0565b6040516001600160a01b039091168152602001610240565b3480156102f157600080fd5b50610269610300366004612d74565b6107c7565b34801561031157600080fd5b506102a0610320366004612d5b565b610895565b34801561033157600080fd5b506008545b604051908152602001610240565b34801561035057600080fd5b5061026961035f366004612d9e565b610996565b34801561037057600080fd5b5061038461037f366004612dda565b610a6f565b604080516001600160a01b039093168352602083019190915201610240565b3480156103af57600080fd5b506103366103be366004612d74565b610b1b565b3480156103cf57600080fd5b5061033661271081565b3480156103e557600080fd5b50610269610bb1565b3480156103fa57600080fd5b506102cd6daaeb6d7670e522a718067333cd4e81565b34801561041c57600080fd5b5061026961042b366004612d9e565b610be5565b34801561043c57600080fd5b506102a061044b366004612d5b565b610cb3565b34801561045c57600080fd5b5061033661046b366004612d5b565b610dab565b34801561047c57600080fd5b50600e5460ff16610234565b34801561049457600080fd5b506102cd6104a3366004612d5b565b610e3e565b3480156104b457600080fd5b506102a06104c3366004612d5b565b610e9e565b3480156104d457600080fd5b506103366104e3366004612dfc565b610f96565b3480156104f457600080fd5b5061026961101c565b34801561050957600080fd5b506102a0610518366004612d5b565b611030565b34801561052957600080fd5b506102a0610538366004612d5b565b611129565b34801561054957600080fd5b50600b546001600160a01b03166102cd565b34801561056757600080fd5b506102a0610576366004612d5b565b611223565b34801561058757600080fd5b506102a061131c565b34801561059c57600080fd5b506102a06105ab366004612d5b565b61132b565b3480156105bc57600080fd5b50610336600f5481565b6102696105d4366004612d5b565b611424565b3480156105e557600080fd5b506102696105f4366004612e17565b611575565b34801561060557600080fd5b50610269610614366004612e59565b611639565b34801561062557600080fd5b506102a0610634366004612d5b565b611715565b34801561064557600080fd5b50610234610654366004612f35565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561068e57600080fd5b5061026961069d366004612dfc565b6119bf565b3480156106ae57600080fd5b506102a06106bd366004612d5b565b611a35565b60006106cd82611b2d565b92915050565b6106db611b52565b8015156001036106f0576106ed611bac565b50565b6106ed611c44565b610700611b52565b61070a8282611cbe565b5050565b60606000805461071d90612f68565b80601f016020809104026020016040519081016040528092919081815260200182805461074990612f68565b80156107965780601f1061076b57610100808354040283529160200191610796565b820191906000526020600020905b81548152906001019060200180831161077957829003601f168201915b5050505050905090565b60006107ab82611dbb565b506000908152600460205260409020546001600160a01b031690565b816daaeb6d7670e522a718067333cd4e3b1561088657604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610835573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108599190612fa2565b61088657604051633b79c77360e21b81526001600160a01b03821660048201526024015b60405180910390fd5b6108908383611e1a565b505050565b60606106cd826040518060400160405280600b81526020016a2324a32a24272aa6a122a960a91b8152506014805480602002602001604051908101604052809291908181526020016000905b8282101561098d57838290600052602060002001805461090090612f68565b80601f016020809104026020016040519081016040528092919081815260200182805461092c90612f68565b80156109795780601f1061094e57610100808354040283529160200191610979565b820191906000526020600020905b81548152906001019060200180831161095c57829003601f168201915b5050505050815260200190600101906108e1565b50505050611f2a565b826daaeb6d7670e522a718067333cd4e3b15610a5e57336001600160a01b038216036109cc576109c7848484611f98565b610a69565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610a1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3f9190612fa2565b610a5e57604051633b79c77360e21b815233600482015260240161087d565b610a69848484611f98565b50505050565b6000828152600d602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610ae4575060408051808201909152600c546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610b03906001600160601b031687612fd5565b610b0d919061300a565b915196919550909350505050565b6000610b2683610f96565b8210610b885760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161087d565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610bb9611b52565b60405133904780156108fc02916000818181858888f193505050501580156106ed573d6000803e3d6000fd5b826daaeb6d7670e522a718067333cd4e3b15610ca857336001600160a01b03821603610c16576109c7848484611fc9565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610c65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c899190612fa2565b610ca857604051633b79c77360e21b815233600482015260240161087d565b610a69848484611fc9565b60606106cd826040518060400160405280600b81526020016a29a4ac2a24272aa6a122a960a91b8152506015805480602002602001604051908101604052809291908181526020016000905b8282101561098d578382906000526020600020018054610d1e90612f68565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4a90612f68565b8015610d975780601f10610d6c57610100808354040283529160200191610d97565b820191906000526020600020905b815481529060010190602001808311610d7a57829003601f168201915b505050505081526020019060010190610cff565b6000610db660085490565b8210610e195760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161087d565b60088281548110610e2c57610e2c61301e565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806106cd5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161087d565b60606106cd826040518060400160405280600b81526020016a2324a929aa272aa6a122a960a91b8152506010805480602002602001604051908101604052809291908181526020016000905b8282101561098d578382906000526020600020018054610f0990612f68565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3590612f68565b8015610f825780601f10610f5757610100808354040283529160200191610f82565b820191906000526020600020905b815481529060010190602001808311610f6557829003601f168201915b505050505081526020019060010190610eea565b60006001600160a01b0382166110005760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b606482015260840161087d565b506001600160a01b031660009081526003602052604090205490565b611024611b52565b61102e6000611fe4565b565b60606106cd826040518060400160405280600c81526020016b29a2a1a7a722272aa6a122a960a11b8152506011805480602002602001604051908101604052809291908181526020016000905b8282101561098d57838290600052602060002001805461109c90612f68565b80601f01602080910402602001604051908101604052809291908181526020018280546110c890612f68565b80156111155780601f106110ea57610100808354040283529160200191611115565b820191906000526020600020905b8154815290600101906020018083116110f857829003601f168201915b50505050508152602001906001019061107d565b60606106cd826040518060400160405280600d81526020016c29a2ab22a72a24272aa6a122a960991b8152506016805480602002602001604051908101604052809291908181526020016000905b8282101561098d57838290600052602060002001805461119690612f68565b80601f01602080910402602001604051908101604052809291908181526020018280546111c290612f68565b801561120f5780601f106111e45761010080835404028352916020019161120f565b820191906000526020600020905b8154815290600101906020018083116111f257829003601f168201915b505050505081526020019060010190611177565b60606106cd826040518060400160405280600c81526020016b22a4a3a42a24272aa6a122a960a11b8152506017805480602002602001604051908101604052809291908181526020016000905b8282101561098d57838290600052602060002001805461128f90612f68565b80601f01602080910402602001604051908101604052809291908181526020018280546112bb90612f68565b80156113085780601f106112dd57610100808354040283529160200191611308565b820191906000526020600020905b8154815290600101906020018083116112eb57829003601f168201915b505050505081526020019060010190611270565b60606001805461071d90612f68565b60606106cd826040518060400160405280600c81526020016b2327aaa92a24272aa6a122a960a11b8152506013805480602002602001604051908101604052809291908181526020016000905b8282101561098d57838290600052602060002001805461139790612f68565b80601f01602080910402602001604051908101604052809291908181526020018280546113c390612f68565b80156114105780601f106113e557610100808354040283529160200191611410565b820191906000526020600020905b8154815290600101906020018083116113f357829003601f168201915b505050505081526020019060010190611378565b6002600a54036114765760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161087d565b6002600a55801580159061148c57506127108111155b6114cb5760405162461bcd60e51b815260206004820152601060248201526f151bdad95b881251081a5b9d985b1a5960821b604482015260640161087d565b34600f54111561151d5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604482015260640161087d565b600e5460ff16156115635760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161087d565b61156d3382612036565b506001600a55565b816daaeb6d7670e522a718067333cd4e3b1561162f57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156115e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116079190612fa2565b61162f57604051633b79c77360e21b81526001600160a01b038216600482015260240161087d565b6108908383612050565b836daaeb6d7670e522a718067333cd4e3b1561170257336001600160a01b038216036116705761166b8585858561205b565b61170e565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156116bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e39190612fa2565b61170257604051633b79c77360e21b815233600482015260240161087d565b61170e8585858561205b565b5050505050565b606061171f612c04565b60405180610de00160405280610da881526020016134af610da89139815261174683610e9e565b81600160200201819052506040518060600160405280602a815260200161339d602a9139604082015261177883611030565b606080830191909152604080519182019052602a8082526133c7602083013960808201526117a583611a35565b60a08201526040805160608101909152602a80825261341b602083013960c08201526117d08361132b565b60e08201526040805160608101909152602a80825261348560208301396101008201526117fc83610895565b6101208201526040805160608101909152602a8082526133f1602083013961014082015261182983610cb3565b6101608201526040805160608101909152602a808252614281602083013961018082015261185683611129565b6101a08201526040805160608101909152602a80825261425760208301396101c082015261188383611223565b6101e0820152604080518082018252600d81526c1e17ba32bc3a1f1e17b9bb339f60991b602080830191909152610200840191909152825181840151838501516060860151608087015160a088015160c089015160e08a01516101008b0151995160009a6118f39a909101613034565b60408051808303601f19018152908290526101208401516101408501516101608601516101808701516101a08801516101c08901516101e08a01516102008b0151979950611946988a9890602001613034565b604051602081830303815290604052905060006119936119658661208d565b61196e84612196565b60405160200161197f9291906130f5565b604051602081830303815290604052612196565b9050806040516020016119a691906131a0565b60408051601f1981840301815291905295945050505050565b6119c7611b52565b6001600160a01b038116611a2c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161087d565b6106ed81611fe4565b60606106cd826040518060400160405280600b81526020016a2a2424a922272aa6a122a960a91b8152506012805480602002602001604051908101604052809291908181526020016000905b8282101561098d578382906000526020600020018054611aa090612f68565b80601f0160208091040260200160405190810160405280929190818152602001828054611acc90612f68565b8015611b195780601f10611aee57610100808354040283529160200191611b19565b820191906000526020600020905b815481529060010190602001808311611afc57829003601f168201915b505050505081526020019060010190611a81565b60006001600160e01b0319821663152a902d60e11b14806106cd57506106cd82612300565b600b546001600160a01b0316331461102e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161087d565b600e5460ff1615611bf25760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161087d565b600e805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611c273390565b6040516001600160a01b03909116815260200160405180910390a1565b600e5460ff16611c8d5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161087d565b600e805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33611c27565b6127106001600160601b0382161115611d2c5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b606482015260840161087d565b6001600160a01b038216611d825760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640161087d565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600c55565b6000818152600260205260409020546001600160a01b03166106ed5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161087d565b6000611e2582610e3e565b9050806001600160a01b0316836001600160a01b031603611e925760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161087d565b336001600160a01b0382161480611eae5750611eae8133610654565b611f205760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000606482015260840161087d565b6108908383612325565b60606000611f6084611f3b8761208d565b604051602001611f4c9291906131e5565b604051602081830303815290604052612393565b9050600083845183611f729190613214565b81518110611f8257611f8261301e565b6020026020010151905080925050509392505050565b611fa233826123c4565b611fbe5760405162461bcd60e51b815260040161087d90613228565b610890838383612442565b61089083838360405180602001604052806000815250611639565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61070a8282604051806020016040528060008152506125e9565b61070a33838361261c565b61206533836123c4565b6120815760405162461bcd60e51b815260040161087d90613228565b610a69848484846126ea565b6060816000036120b45750506040805180820190915260018152600360fc1b602082015290565b8160005b81156120de57806120c881613276565b91506120d79050600a8361300a565b91506120b8565b60008167ffffffffffffffff8111156120f9576120f9612e43565b6040519080825280601f01601f191660200182016040528015612123576020820181803683370190505b5090505b841561218e5761213860018361328f565b9150612145600a86613214565b6121509060306132a6565b60f81b8183815181106121655761216561301e565b60200101906001600160f81b031916908160001a905350612187600a8661300a565b9450612127565b949350505050565b805160609060008190036121ba575050604080516020810190915260008152919050565b600060036121c98360026132a6565b6121d3919061300a565b6121de906004612fd5565b905060006121ed8260206132a6565b67ffffffffffffffff81111561220557612205612e43565b6040519080825280601f01601f19166020018201604052801561222f576020820181803683370190505b5090506000604051806060016040528060408152602001613445604091399050600181016020830160005b868110156122bb576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b83526004909201910161225a565b5060038606600181146122d557600281146122e6576122f2565b613d3d60f01b6001198301526122f2565b603d60f81b6000198301525b505050918152949350505050565b60006001600160e01b0319821663780e9d6360e01b14806106cd57506106cd8261271d565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061235a82610e3e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000816040516020016123a691906132be565b60408051601f19818403018152919052805160209091012092915050565b6000806123d083610e3e565b9050806001600160a01b0316846001600160a01b0316148061241757506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b8061218e5750836001600160a01b0316612430846107a0565b6001600160a01b031614949350505050565b826001600160a01b031661245582610e3e565b6001600160a01b0316146124b95760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b606482015260840161087d565b6001600160a01b03821661251b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161087d565b61252683838361276d565b612531600082612325565b6001600160a01b038316600090815260036020526040812080546001929061255a90849061328f565b90915550506001600160a01b03821660009081526003602052604081208054600192906125889084906132a6565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6125f38383612825565b6126006000848484612973565b6108905760405162461bcd60e51b815260040161087d906132da565b816001600160a01b0316836001600160a01b03160361267d5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161087d565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6126f5848484612442565b61270184848484612973565b610a695760405162461bcd60e51b815260040161087d906132da565b60006001600160e01b031982166380ac58cd60e01b148061274e57506001600160e01b03198216635b5e139f60e01b145b806106cd57506301ffc9a760e01b6001600160e01b03198316146106cd565b6001600160a01b0383166127c8576127c381600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6127eb565b816001600160a01b0316836001600160a01b0316146127eb576127eb8382612a74565b6001600160a01b0382166128025761089081612b11565b826001600160a01b0316826001600160a01b031614610890576108908282612bc0565b6001600160a01b03821661287b5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161087d565b6000818152600260205260409020546001600160a01b0316156128e05760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161087d565b6128ec6000838361276d565b6001600160a01b03821660009081526003602052604081208054600192906129159084906132a6565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b15612a6957604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906129b790339089908890889060040161332c565b6020604051808303816000875af19250505080156129f2575060408051601f3d908101601f191682019092526129ef91810190613369565b60015b612a4f573d808015612a20576040519150601f19603f3d011682016040523d82523d6000602084013e612a25565b606091505b508051600003612a475760405162461bcd60e51b815260040161087d906132da565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061218e565b506001949350505050565b60006001612a8184610f96565b612a8b919061328f565b600083815260076020526040902054909150808214612ade576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612b239060019061328f565b60008381526009602052604081205460088054939450909284908110612b4b57612b4b61301e565b906000526020600020015490508060088381548110612b6c57612b6c61301e565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612ba457612ba4613386565b6001900381819060005260206000200160009055905550505050565b6000612bcb83610f96565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6040518061022001604052806011905b6060815260200190600190039081612c145790505090565b6001600160e01b0319811681146106ed57600080fd5b600060208284031215612c5457600080fd5b8135612c5f81612c2c565b9392505050565b80151581146106ed57600080fd5b600060208284031215612c8657600080fd5b8135612c5f81612c66565b80356001600160a01b0381168114612ca857600080fd5b919050565b60008060408385031215612cc057600080fd5b612cc983612c91565b915060208301356001600160601b0381168114612ce557600080fd5b809150509250929050565b60005b83811015612d0b578181015183820152602001612cf3565b83811115610a695750506000910152565b60008151808452612d34816020860160208601612cf0565b601f01601f19169290920160200192915050565b602081526000612c5f6020830184612d1c565b600060208284031215612d6d57600080fd5b5035919050565b60008060408385031215612d8757600080fd5b612d9083612c91565b946020939093013593505050565b600080600060608486031215612db357600080fd5b612dbc84612c91565b9250612dca60208501612c91565b9150604084013590509250925092565b60008060408385031215612ded57600080fd5b50508035926020909101359150565b600060208284031215612e0e57600080fd5b612c5f82612c91565b60008060408385031215612e2a57600080fd5b612e3383612c91565b91506020830135612ce581612c66565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612e6f57600080fd5b612e7885612c91565b9350612e8660208601612c91565b925060408501359150606085013567ffffffffffffffff80821115612eaa57600080fd5b818701915087601f830112612ebe57600080fd5b813581811115612ed057612ed0612e43565b604051601f8201601f19908116603f01168101908382118183101715612ef857612ef8612e43565b816040528281528a6020848701011115612f1157600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215612f4857600080fd5b612f5183612c91565b9150612f5f60208401612c91565b90509250929050565b600181811c90821680612f7c57607f821691505b602082108103612f9c57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215612fb457600080fd5b8151612c5f81612c66565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615612fef57612fef612fbf565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261301957613019612ff4565b500490565b634e487b7160e01b600052603260045260246000fd5b60008a51613046818460208f01612cf0565b8a516130588183860160208f01612cf0565b8a51918401019061306d818360208e01612cf0565b895161307f8183850160208e01612cf0565b8951929091010190613095818360208c01612cf0565b87516130a78183850160208c01612cf0565b87519290910101906130bd818360208a01612cf0565b85516130cf8183850160208a01612cf0565b85519290910101906130e5818360208801612cf0565b019b9a5050505050505050505050565b707b226e616d65223a20224173736574202360781b81528251600090613122816011850160208801612cf0565b7f222c20226465736372697074696f6e223a2022222c2022696d616765223a20226011918401918201527f646174613a696d6167652f7376672b786d6c3b6261736536342c0000000000006031820152835161318581604b840160208801612cf0565b61227d60f01b604b9290910191820152604d01949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516131d881601d850160208701612cf0565b91909101601d0192915050565b600083516131f7818460208801612cf0565b83519083019061320b818360208801612cf0565b01949350505050565b60008261322357613223612ff4565b500690565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b60006001820161328857613288612fbf565b5060010190565b6000828210156132a1576132a1612fbf565b500390565b600082198211156132b9576132b9612fbf565b500190565b600082516132d0818460208701612cf0565b9190910192915050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061335f90830184612d1c565b9695505050505050565b60006020828403121561337b57600080fd5b8151612c5f81612c2c565b634e487b7160e01b600052603160045260246000fdfe3c2f746578743e3c7465787420783d223130302220793d223635302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d223135302220793d223635302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d223330302220793d223635302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d223230302220793d223635302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d223235302220793d223635302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302037303020373030223e3c7374796c653e2e62617365207b2066696c6c3a20233030303b20666f6e742d66616d696c793a2073616e732d73657269663b20666f6e742d73697a653a20323270783b20666f6e742d7765696768743a20626f6c643b7d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d222363666630303022202f3e3c67207472616e73666f726d3d227472616e736c61746528302e3030303030302c3730302e30303030303029207363616c6528302e3032303030302c2d302e30323030303029222066696c6c3d222330303022207374726f6b653d226e6f6e65223e203c7061746820643d224d313537373220333031393220632d343437202d31323639202d383135202d32333138202d383139202d32333330206c2d35202d3232203435302030203435302030203139322035373520313932203537352038373820302038373820302035202d3232206334202d3133203930202d32373220313933202d353735206c313836202d3535332034343920302063323437203020343439203320343439203820302034202d3336392031303531202d3831392032333237206c2d3831382032333230202d3532342033202d3532352032202d383132202d323330387a206d31363636203432362063313732202d35313320333132202d39333620333132202d3934302030202d35202d323930202d38202d363434202d38206c2d36343520302032383420383438206331353620343636203239382038383920333135203934302032332036362033362039322034382039322031342030203833202d31393520333330202d3933327a222f3e3c7061746820643d224d3330393430203331373630206c30202d343230202d3235302030202d32353020302030202d3332302030202d3332302032343920302032353020302034202d31303632206334202d313135392031202d31313032203631202d31323638203837202d32333920323831202d34323320353336202d35313220313731202d353920343634202d383520363635202d35392031303220313320333033203539203331302037302035203130202d31323420363233202d31333420363334202d342034202d33322032202d3632202d33202d3330202d36202d313033202d3132202d313634202d3132202d313136202d31202d313833203133202d323434203530202d3430203234202d31303620313130202d31323320313630202d39203238202d313320323639202d31362031303230206c2d3320393832203334362030203334352030203020333230203020333230202d3334352030202d3334352030203020343230203020343230202d3431352030202d34313520302030202d3432307a222f3e3c7061746820643d224d323039383020333133373020632d333831202d3432202d363935202d313735202d393034202d333833202d313239202d313330202d323037202d323637202d323438202d343336202d3332202d313334202d3239202d3334332036202d343830203738202d32393920323739202d35303620363235202d36343120313236202d343920323534202d383220363237202d31363020343034202d383520343532202d393820353636202d313536203737202d333920313631202d31323720313833202d313933203830202d323432202d313035202d343537202d343434202d353136202d323136202d3338202d343535202d35202d363133203834202d313133203634202d32313720313937202d32353220333234206c2d3137203537202d3337202d3520632d3230202d33202d313938202d3231202d333936202d3430202d313937202d3139202d333631202d3336202d333633202d3339202d33202d332037202d3536203232202d31313820313131202d34353020343838202d3736322031303434202d38363320313939202d333620353237202d343620373131202d3231203535372037362039353320333233203131323720373034203538203132382037372032323520373720333937203020313334202d3320313630202d323820323435202d383220323833202d32383320343737202d36323620363035202d313434203533202d323735203837202d36363320313730202d333337203732202d34333720313030202d35343020313532202d313432203731202d31393920313533202d32303520323933202d332037342030203933203231203134312034362031303520313833203230362033333220323434203135302033392033343920333620343930202d3620313732202d353120333139202d31383720333830202d333531203130202d3237203230202d3438203234202d34382033203020313730203138203337312034302032303120323220333638203430203337312034302031342030202d363120323331202d31303020333130202d31323520323439202d33353420343530202d36323920353531202d3539203232202d313734203533202d323537203639202d313239203236202d313830203331202d333630203334202d3131352033202d3234382031202d323935202d347a222f3e3c7061746820643d224d323435303020333133373020632d333831202d3432202d363935202d313735202d393034202d333833202d313239202d313330202d323037202d323637202d323438202d343336202d3332202d313334202d3239202d3334332036202d343830203738202d32393920323739202d35303620363235202d36343120313236202d343920323534202d383220363237202d31363020343034202d383520343532202d393820353636202d313536203737202d333920313631202d31323720313833202d313933203830202d323432202d313035202d343537202d343434202d353136202d323136202d3338202d343535202d35202d363133203834202d313133203634202d32313720313937202d32353220333234206c2d3137203537202d3337202d3520632d3230202d33202d313938202d3231202d333936202d3430202d313937202d3139202d333631202d3336202d333633202d3339202d33202d332037202d3536203232202d31313820313131202d34353020343838202d3736322031303434202d38363320313939202d333620353237202d343620373131202d3231203535372037362039353320333233203131323720373034203538203132382037372032323520373720333937203020313334202d3320313630202d323820323435202d383220323833202d32383320343737202d36323620363035202d313434203533202d323735203837202d36363320313730202d333337203732202d34333720313030202d35343020313532202d313432203731202d31393920313533202d32303520323933202d332037342030203933203231203134312034362031303520313833203230362033333220323434203135302033392033343920333620343930202d3620313732202d353120333139202d31383720333830202d333531203130202d3237203230202d3438203234202d34382033203020313730203138203337312034302032303120323220333638203430203337312034302031342030202d363120323331202d31303020333130202d31323520323439202d33353420343530202d36323920353531202d3539203232202d313734203533202d323537203639202d313239203236202d313830203331202d333630203334202d3131352033202d3234382031202d323935202d347a222f3e3c7061746820643d224d323832313520333133373120632d373536202d3731202d31333030202d363131202d31343336202d31343236202d3332202d313838202d3332202d3538312030202d37363820313238202d37363020353933202d313235342031323936202d3133373720313537202d323720343732202d333820363232202d323120363433203734203130393220343031203132353020393131203132203431203139203737203135203830202d342034202d313630203234202d333437203434202d313837203231202d333537203430202d333737203433206c2d33372035202d3336202d373320632d313136202d323239202d333335202d333536202d363435202d333735202d343335202d3236202d37363320313836202d38393420353737202d3239203836202d353620323339202d353620333137206c302035322031323232203020313232312030202d372032333420632d313320343433202d353920363738202d31383620393431202d31313020323239202d32363220343136202d34353020353534202d31363820313234202d34313220323233202d36353520323637202d313031203138202d333736203236202d3530302031357a206d343139202d3636312063313130202d323820313734202d353920323638202d31333220313738202d31333820323839202d33343720333035202d353735206c36202d3833202d383232203020632d3737352030202d3832312031202d3832312031382030203633203435203232372038362033313720313137203235322033363420343337203633312034373420393620313420323534203520333437202d31397a222f3e3c2f673e203c7465787420783d2235302220793d223635302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d223430302220793d223635302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d223335302220793d223635302220636c6173733d2262617365223ea264697066735822122051e1075efd55aca391e9a3975ff76cdc76b52cee565b1ee6ccbd5dbef76482fd64736f6c634300080d0033
Deployed Bytecode
0x60806040526004361061020f5760003560e01c80636352211e116101185780639ec29b82116100a0578063b88d4fde1161006f578063b88d4fde146105f9578063c87b56dd14610619578063e985e9c514610639578063f2fde38b14610682578063fa7f71b1146106a257600080fd5b80639ec29b8214610590578063a035b1fe146105b0578063a0712d68146105c6578063a22cb465146105d957600080fd5b80638aa001fc116100e75780638aa001fc146104fd5780638c921d061461051d5780638da5cb5b1461053d5780638e1c0a021461055b57806395d89b411461057b57600080fd5b80636352211e14610488578063667386f7146104a857806370a08231146104c8578063715018a6146104e857600080fd5b80632a55205a1161019b57806341f434341161016a57806341f43434146103ee57806342842e0e1461041057806342d9d876146104305780634f6ccce7146104505780635c975abb1461047057600080fd5b80632a55205a146103645780632f745c59146103a357806332cb6b0c146103c35780633ccfd60b146103d957600080fd5b8063081812fc116101e2578063081812fc146102ad578063095ea7b3146102e55780630b2503a61461030557806318160ddd1461032557806323b872dd1461034457600080fd5b806301ffc9a71461021457806302329a291461024957806304634d8d1461026b57806306fdde031461028b575b600080fd5b34801561022057600080fd5b5061023461022f366004612c42565b6106c2565b60405190151581526020015b60405180910390f35b34801561025557600080fd5b50610269610264366004612c74565b6106d3565b005b34801561027757600080fd5b50610269610286366004612cad565b6106f8565b34801561029757600080fd5b506102a061070e565b6040516102409190612d48565b3480156102b957600080fd5b506102cd6102c8366004612d5b565b6107a0565b6040516001600160a01b039091168152602001610240565b3480156102f157600080fd5b50610269610300366004612d74565b6107c7565b34801561031157600080fd5b506102a0610320366004612d5b565b610895565b34801561033157600080fd5b506008545b604051908152602001610240565b34801561035057600080fd5b5061026961035f366004612d9e565b610996565b34801561037057600080fd5b5061038461037f366004612dda565b610a6f565b604080516001600160a01b039093168352602083019190915201610240565b3480156103af57600080fd5b506103366103be366004612d74565b610b1b565b3480156103cf57600080fd5b5061033661271081565b3480156103e557600080fd5b50610269610bb1565b3480156103fa57600080fd5b506102cd6daaeb6d7670e522a718067333cd4e81565b34801561041c57600080fd5b5061026961042b366004612d9e565b610be5565b34801561043c57600080fd5b506102a061044b366004612d5b565b610cb3565b34801561045c57600080fd5b5061033661046b366004612d5b565b610dab565b34801561047c57600080fd5b50600e5460ff16610234565b34801561049457600080fd5b506102cd6104a3366004612d5b565b610e3e565b3480156104b457600080fd5b506102a06104c3366004612d5b565b610e9e565b3480156104d457600080fd5b506103366104e3366004612dfc565b610f96565b3480156104f457600080fd5b5061026961101c565b34801561050957600080fd5b506102a0610518366004612d5b565b611030565b34801561052957600080fd5b506102a0610538366004612d5b565b611129565b34801561054957600080fd5b50600b546001600160a01b03166102cd565b34801561056757600080fd5b506102a0610576366004612d5b565b611223565b34801561058757600080fd5b506102a061131c565b34801561059c57600080fd5b506102a06105ab366004612d5b565b61132b565b3480156105bc57600080fd5b50610336600f5481565b6102696105d4366004612d5b565b611424565b3480156105e557600080fd5b506102696105f4366004612e17565b611575565b34801561060557600080fd5b50610269610614366004612e59565b611639565b34801561062557600080fd5b506102a0610634366004612d5b565b611715565b34801561064557600080fd5b50610234610654366004612f35565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561068e57600080fd5b5061026961069d366004612dfc565b6119bf565b3480156106ae57600080fd5b506102a06106bd366004612d5b565b611a35565b60006106cd82611b2d565b92915050565b6106db611b52565b8015156001036106f0576106ed611bac565b50565b6106ed611c44565b610700611b52565b61070a8282611cbe565b5050565b60606000805461071d90612f68565b80601f016020809104026020016040519081016040528092919081815260200182805461074990612f68565b80156107965780601f1061076b57610100808354040283529160200191610796565b820191906000526020600020905b81548152906001019060200180831161077957829003601f168201915b5050505050905090565b60006107ab82611dbb565b506000908152600460205260409020546001600160a01b031690565b816daaeb6d7670e522a718067333cd4e3b1561088657604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610835573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108599190612fa2565b61088657604051633b79c77360e21b81526001600160a01b03821660048201526024015b60405180910390fd5b6108908383611e1a565b505050565b60606106cd826040518060400160405280600b81526020016a2324a32a24272aa6a122a960a91b8152506014805480602002602001604051908101604052809291908181526020016000905b8282101561098d57838290600052602060002001805461090090612f68565b80601f016020809104026020016040519081016040528092919081815260200182805461092c90612f68565b80156109795780601f1061094e57610100808354040283529160200191610979565b820191906000526020600020905b81548152906001019060200180831161095c57829003601f168201915b5050505050815260200190600101906108e1565b50505050611f2a565b826daaeb6d7670e522a718067333cd4e3b15610a5e57336001600160a01b038216036109cc576109c7848484611f98565b610a69565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610a1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3f9190612fa2565b610a5e57604051633b79c77360e21b815233600482015260240161087d565b610a69848484611f98565b50505050565b6000828152600d602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610ae4575060408051808201909152600c546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610b03906001600160601b031687612fd5565b610b0d919061300a565b915196919550909350505050565b6000610b2683610f96565b8210610b885760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161087d565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610bb9611b52565b60405133904780156108fc02916000818181858888f193505050501580156106ed573d6000803e3d6000fd5b826daaeb6d7670e522a718067333cd4e3b15610ca857336001600160a01b03821603610c16576109c7848484611fc9565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610c65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c899190612fa2565b610ca857604051633b79c77360e21b815233600482015260240161087d565b610a69848484611fc9565b60606106cd826040518060400160405280600b81526020016a29a4ac2a24272aa6a122a960a91b8152506015805480602002602001604051908101604052809291908181526020016000905b8282101561098d578382906000526020600020018054610d1e90612f68565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4a90612f68565b8015610d975780601f10610d6c57610100808354040283529160200191610d97565b820191906000526020600020905b815481529060010190602001808311610d7a57829003601f168201915b505050505081526020019060010190610cff565b6000610db660085490565b8210610e195760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161087d565b60088281548110610e2c57610e2c61301e565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806106cd5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161087d565b60606106cd826040518060400160405280600b81526020016a2324a929aa272aa6a122a960a91b8152506010805480602002602001604051908101604052809291908181526020016000905b8282101561098d578382906000526020600020018054610f0990612f68565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3590612f68565b8015610f825780601f10610f5757610100808354040283529160200191610f82565b820191906000526020600020905b815481529060010190602001808311610f6557829003601f168201915b505050505081526020019060010190610eea565b60006001600160a01b0382166110005760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b606482015260840161087d565b506001600160a01b031660009081526003602052604090205490565b611024611b52565b61102e6000611fe4565b565b60606106cd826040518060400160405280600c81526020016b29a2a1a7a722272aa6a122a960a11b8152506011805480602002602001604051908101604052809291908181526020016000905b8282101561098d57838290600052602060002001805461109c90612f68565b80601f01602080910402602001604051908101604052809291908181526020018280546110c890612f68565b80156111155780601f106110ea57610100808354040283529160200191611115565b820191906000526020600020905b8154815290600101906020018083116110f857829003601f168201915b50505050508152602001906001019061107d565b60606106cd826040518060400160405280600d81526020016c29a2ab22a72a24272aa6a122a960991b8152506016805480602002602001604051908101604052809291908181526020016000905b8282101561098d57838290600052602060002001805461119690612f68565b80601f01602080910402602001604051908101604052809291908181526020018280546111c290612f68565b801561120f5780601f106111e45761010080835404028352916020019161120f565b820191906000526020600020905b8154815290600101906020018083116111f257829003601f168201915b505050505081526020019060010190611177565b60606106cd826040518060400160405280600c81526020016b22a4a3a42a24272aa6a122a960a11b8152506017805480602002602001604051908101604052809291908181526020016000905b8282101561098d57838290600052602060002001805461128f90612f68565b80601f01602080910402602001604051908101604052809291908181526020018280546112bb90612f68565b80156113085780601f106112dd57610100808354040283529160200191611308565b820191906000526020600020905b8154815290600101906020018083116112eb57829003601f168201915b505050505081526020019060010190611270565b60606001805461071d90612f68565b60606106cd826040518060400160405280600c81526020016b2327aaa92a24272aa6a122a960a11b8152506013805480602002602001604051908101604052809291908181526020016000905b8282101561098d57838290600052602060002001805461139790612f68565b80601f01602080910402602001604051908101604052809291908181526020018280546113c390612f68565b80156114105780601f106113e557610100808354040283529160200191611410565b820191906000526020600020905b8154815290600101906020018083116113f357829003601f168201915b505050505081526020019060010190611378565b6002600a54036114765760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161087d565b6002600a55801580159061148c57506127108111155b6114cb5760405162461bcd60e51b815260206004820152601060248201526f151bdad95b881251081a5b9d985b1a5960821b604482015260640161087d565b34600f54111561151d5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604482015260640161087d565b600e5460ff16156115635760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161087d565b61156d3382612036565b506001600a55565b816daaeb6d7670e522a718067333cd4e3b1561162f57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156115e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116079190612fa2565b61162f57604051633b79c77360e21b81526001600160a01b038216600482015260240161087d565b6108908383612050565b836daaeb6d7670e522a718067333cd4e3b1561170257336001600160a01b038216036116705761166b8585858561205b565b61170e565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156116bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e39190612fa2565b61170257604051633b79c77360e21b815233600482015260240161087d565b61170e8585858561205b565b5050505050565b606061171f612c04565b60405180610de00160405280610da881526020016134af610da89139815261174683610e9e565b81600160200201819052506040518060600160405280602a815260200161339d602a9139604082015261177883611030565b606080830191909152604080519182019052602a8082526133c7602083013960808201526117a583611a35565b60a08201526040805160608101909152602a80825261341b602083013960c08201526117d08361132b565b60e08201526040805160608101909152602a80825261348560208301396101008201526117fc83610895565b6101208201526040805160608101909152602a8082526133f1602083013961014082015261182983610cb3565b6101608201526040805160608101909152602a808252614281602083013961018082015261185683611129565b6101a08201526040805160608101909152602a80825261425760208301396101c082015261188383611223565b6101e0820152604080518082018252600d81526c1e17ba32bc3a1f1e17b9bb339f60991b602080830191909152610200840191909152825181840151838501516060860151608087015160a088015160c089015160e08a01516101008b0151995160009a6118f39a909101613034565b60408051808303601f19018152908290526101208401516101408501516101608601516101808701516101a08801516101c08901516101e08a01516102008b0151979950611946988a9890602001613034565b604051602081830303815290604052905060006119936119658661208d565b61196e84612196565b60405160200161197f9291906130f5565b604051602081830303815290604052612196565b9050806040516020016119a691906131a0565b60408051601f1981840301815291905295945050505050565b6119c7611b52565b6001600160a01b038116611a2c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161087d565b6106ed81611fe4565b60606106cd826040518060400160405280600b81526020016a2a2424a922272aa6a122a960a91b8152506012805480602002602001604051908101604052809291908181526020016000905b8282101561098d578382906000526020600020018054611aa090612f68565b80601f0160208091040260200160405190810160405280929190818152602001828054611acc90612f68565b8015611b195780601f10611aee57610100808354040283529160200191611b19565b820191906000526020600020905b815481529060010190602001808311611afc57829003601f168201915b505050505081526020019060010190611a81565b60006001600160e01b0319821663152a902d60e11b14806106cd57506106cd82612300565b600b546001600160a01b0316331461102e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161087d565b600e5460ff1615611bf25760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161087d565b600e805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611c273390565b6040516001600160a01b03909116815260200160405180910390a1565b600e5460ff16611c8d5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161087d565b600e805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33611c27565b6127106001600160601b0382161115611d2c5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b606482015260840161087d565b6001600160a01b038216611d825760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640161087d565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600c55565b6000818152600260205260409020546001600160a01b03166106ed5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161087d565b6000611e2582610e3e565b9050806001600160a01b0316836001600160a01b031603611e925760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161087d565b336001600160a01b0382161480611eae5750611eae8133610654565b611f205760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000606482015260840161087d565b6108908383612325565b60606000611f6084611f3b8761208d565b604051602001611f4c9291906131e5565b604051602081830303815290604052612393565b9050600083845183611f729190613214565b81518110611f8257611f8261301e565b6020026020010151905080925050509392505050565b611fa233826123c4565b611fbe5760405162461bcd60e51b815260040161087d90613228565b610890838383612442565b61089083838360405180602001604052806000815250611639565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61070a8282604051806020016040528060008152506125e9565b61070a33838361261c565b61206533836123c4565b6120815760405162461bcd60e51b815260040161087d90613228565b610a69848484846126ea565b6060816000036120b45750506040805180820190915260018152600360fc1b602082015290565b8160005b81156120de57806120c881613276565b91506120d79050600a8361300a565b91506120b8565b60008167ffffffffffffffff8111156120f9576120f9612e43565b6040519080825280601f01601f191660200182016040528015612123576020820181803683370190505b5090505b841561218e5761213860018361328f565b9150612145600a86613214565b6121509060306132a6565b60f81b8183815181106121655761216561301e565b60200101906001600160f81b031916908160001a905350612187600a8661300a565b9450612127565b949350505050565b805160609060008190036121ba575050604080516020810190915260008152919050565b600060036121c98360026132a6565b6121d3919061300a565b6121de906004612fd5565b905060006121ed8260206132a6565b67ffffffffffffffff81111561220557612205612e43565b6040519080825280601f01601f19166020018201604052801561222f576020820181803683370190505b5090506000604051806060016040528060408152602001613445604091399050600181016020830160005b868110156122bb576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b83526004909201910161225a565b5060038606600181146122d557600281146122e6576122f2565b613d3d60f01b6001198301526122f2565b603d60f81b6000198301525b505050918152949350505050565b60006001600160e01b0319821663780e9d6360e01b14806106cd57506106cd8261271d565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061235a82610e3e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000816040516020016123a691906132be565b60408051601f19818403018152919052805160209091012092915050565b6000806123d083610e3e565b9050806001600160a01b0316846001600160a01b0316148061241757506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b8061218e5750836001600160a01b0316612430846107a0565b6001600160a01b031614949350505050565b826001600160a01b031661245582610e3e565b6001600160a01b0316146124b95760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b606482015260840161087d565b6001600160a01b03821661251b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161087d565b61252683838361276d565b612531600082612325565b6001600160a01b038316600090815260036020526040812080546001929061255a90849061328f565b90915550506001600160a01b03821660009081526003602052604081208054600192906125889084906132a6565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6125f38383612825565b6126006000848484612973565b6108905760405162461bcd60e51b815260040161087d906132da565b816001600160a01b0316836001600160a01b03160361267d5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161087d565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6126f5848484612442565b61270184848484612973565b610a695760405162461bcd60e51b815260040161087d906132da565b60006001600160e01b031982166380ac58cd60e01b148061274e57506001600160e01b03198216635b5e139f60e01b145b806106cd57506301ffc9a760e01b6001600160e01b03198316146106cd565b6001600160a01b0383166127c8576127c381600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6127eb565b816001600160a01b0316836001600160a01b0316146127eb576127eb8382612a74565b6001600160a01b0382166128025761089081612b11565b826001600160a01b0316826001600160a01b031614610890576108908282612bc0565b6001600160a01b03821661287b5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161087d565b6000818152600260205260409020546001600160a01b0316156128e05760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161087d565b6128ec6000838361276d565b6001600160a01b03821660009081526003602052604081208054600192906129159084906132a6565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b15612a6957604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906129b790339089908890889060040161332c565b6020604051808303816000875af19250505080156129f2575060408051601f3d908101601f191682019092526129ef91810190613369565b60015b612a4f573d808015612a20576040519150601f19603f3d011682016040523d82523d6000602084013e612a25565b606091505b508051600003612a475760405162461bcd60e51b815260040161087d906132da565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061218e565b506001949350505050565b60006001612a8184610f96565b612a8b919061328f565b600083815260076020526040902054909150808214612ade576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612b239060019061328f565b60008381526009602052604081205460088054939450909284908110612b4b57612b4b61301e565b906000526020600020015490508060088381548110612b6c57612b6c61301e565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612ba457612ba4613386565b6001900381819060005260206000200160009055905550505050565b6000612bcb83610f96565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6040518061022001604052806011905b6060815260200190600190039081612c145790505090565b6001600160e01b0319811681146106ed57600080fd5b600060208284031215612c5457600080fd5b8135612c5f81612c2c565b9392505050565b80151581146106ed57600080fd5b600060208284031215612c8657600080fd5b8135612c5f81612c66565b80356001600160a01b0381168114612ca857600080fd5b919050565b60008060408385031215612cc057600080fd5b612cc983612c91565b915060208301356001600160601b0381168114612ce557600080fd5b809150509250929050565b60005b83811015612d0b578181015183820152602001612cf3565b83811115610a695750506000910152565b60008151808452612d34816020860160208601612cf0565b601f01601f19169290920160200192915050565b602081526000612c5f6020830184612d1c565b600060208284031215612d6d57600080fd5b5035919050565b60008060408385031215612d8757600080fd5b612d9083612c91565b946020939093013593505050565b600080600060608486031215612db357600080fd5b612dbc84612c91565b9250612dca60208501612c91565b9150604084013590509250925092565b60008060408385031215612ded57600080fd5b50508035926020909101359150565b600060208284031215612e0e57600080fd5b612c5f82612c91565b60008060408385031215612e2a57600080fd5b612e3383612c91565b91506020830135612ce581612c66565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215612e6f57600080fd5b612e7885612c91565b9350612e8660208601612c91565b925060408501359150606085013567ffffffffffffffff80821115612eaa57600080fd5b818701915087601f830112612ebe57600080fd5b813581811115612ed057612ed0612e43565b604051601f8201601f19908116603f01168101908382118183101715612ef857612ef8612e43565b816040528281528a6020848701011115612f1157600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215612f4857600080fd5b612f5183612c91565b9150612f5f60208401612c91565b90509250929050565b600181811c90821680612f7c57607f821691505b602082108103612f9c57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215612fb457600080fd5b8151612c5f81612c66565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615612fef57612fef612fbf565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261301957613019612ff4565b500490565b634e487b7160e01b600052603260045260246000fd5b60008a51613046818460208f01612cf0565b8a516130588183860160208f01612cf0565b8a51918401019061306d818360208e01612cf0565b895161307f8183850160208e01612cf0565b8951929091010190613095818360208c01612cf0565b87516130a78183850160208c01612cf0565b87519290910101906130bd818360208a01612cf0565b85516130cf8183850160208a01612cf0565b85519290910101906130e5818360208801612cf0565b019b9a5050505050505050505050565b707b226e616d65223a20224173736574202360781b81528251600090613122816011850160208801612cf0565b7f222c20226465736372697074696f6e223a2022222c2022696d616765223a20226011918401918201527f646174613a696d6167652f7376672b786d6c3b6261736536342c0000000000006031820152835161318581604b840160208801612cf0565b61227d60f01b604b9290910191820152604d01949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516131d881601d850160208701612cf0565b91909101601d0192915050565b600083516131f7818460208801612cf0565b83519083019061320b818360208801612cf0565b01949350505050565b60008261322357613223612ff4565b500690565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b60006001820161328857613288612fbf565b5060010190565b6000828210156132a1576132a1612fbf565b500390565b600082198211156132b9576132b9612fbf565b500190565b600082516132d0818460208701612cf0565b9190910192915050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061335f90830184612d1c565b9695505050505050565b60006020828403121561337b57600080fd5b8151612c5f81612c2c565b634e487b7160e01b600052603160045260246000fdfe3c2f746578743e3c7465787420783d223130302220793d223635302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d223135302220793d223635302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d223330302220793d223635302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d223230302220793d223635302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d223235302220793d223635302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302037303020373030223e3c7374796c653e2e62617365207b2066696c6c3a20233030303b20666f6e742d66616d696c793a2073616e732d73657269663b20666f6e742d73697a653a20323270783b20666f6e742d7765696768743a20626f6c643b7d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d222363666630303022202f3e3c67207472616e73666f726d3d227472616e736c61746528302e3030303030302c3730302e30303030303029207363616c6528302e3032303030302c2d302e30323030303029222066696c6c3d222330303022207374726f6b653d226e6f6e65223e203c7061746820643d224d313537373220333031393220632d343437202d31323639202d383135202d32333138202d383139202d32333330206c2d35202d3232203435302030203435302030203139322035373520313932203537352038373820302038373820302035202d3232206334202d3133203930202d32373220313933202d353735206c313836202d3535332034343920302063323437203020343439203320343439203820302034202d3336392031303531202d3831392032333237206c2d3831382032333230202d3532342033202d3532352032202d383132202d323330387a206d31363636203432362063313732202d35313320333132202d39333620333132202d3934302030202d35202d323930202d38202d363434202d38206c2d36343520302032383420383438206331353620343636203239382038383920333135203934302032332036362033362039322034382039322031342030203833202d31393520333330202d3933327a222f3e3c7061746820643d224d3330393430203331373630206c30202d343230202d3235302030202d32353020302030202d3332302030202d3332302032343920302032353020302034202d31303632206334202d313135392031202d31313032203631202d31323638203837202d32333920323831202d34323320353336202d35313220313731202d353920343634202d383520363635202d35392031303220313320333033203539203331302037302035203130202d31323420363233202d31333420363334202d342034202d33322032202d3632202d33202d3330202d36202d313033202d3132202d313634202d3132202d313136202d31202d313833203133202d323434203530202d3430203234202d31303620313130202d31323320313630202d39203238202d313320323639202d31362031303230206c2d3320393832203334362030203334352030203020333230203020333230202d3334352030202d3334352030203020343230203020343230202d3431352030202d34313520302030202d3432307a222f3e3c7061746820643d224d323039383020333133373020632d333831202d3432202d363935202d313735202d393034202d333833202d313239202d313330202d323037202d323637202d323438202d343336202d3332202d313334202d3239202d3334332036202d343830203738202d32393920323739202d35303620363235202d36343120313236202d343920323534202d383220363237202d31363020343034202d383520343532202d393820353636202d313536203737202d333920313631202d31323720313833202d313933203830202d323432202d313035202d343537202d343434202d353136202d323136202d3338202d343535202d35202d363133203834202d313133203634202d32313720313937202d32353220333234206c2d3137203537202d3337202d3520632d3230202d33202d313938202d3231202d333936202d3430202d313937202d3139202d333631202d3336202d333633202d3339202d33202d332037202d3536203232202d31313820313131202d34353020343838202d3736322031303434202d38363320313939202d333620353237202d343620373131202d3231203535372037362039353320333233203131323720373034203538203132382037372032323520373720333937203020313334202d3320313630202d323820323435202d383220323833202d32383320343737202d36323620363035202d313434203533202d323735203837202d36363320313730202d333337203732202d34333720313030202d35343020313532202d313432203731202d31393920313533202d32303520323933202d332037342030203933203231203134312034362031303520313833203230362033333220323434203135302033392033343920333620343930202d3620313732202d353120333139202d31383720333830202d333531203130202d3237203230202d3438203234202d34382033203020313730203138203337312034302032303120323220333638203430203337312034302031342030202d363120323331202d31303020333130202d31323520323439202d33353420343530202d36323920353531202d3539203232202d313734203533202d323537203639202d313239203236202d313830203331202d333630203334202d3131352033202d3234382031202d323935202d347a222f3e3c7061746820643d224d323435303020333133373020632d333831202d3432202d363935202d313735202d393034202d333833202d313239202d313330202d323037202d323637202d323438202d343336202d3332202d313334202d3239202d3334332036202d343830203738202d32393920323739202d35303620363235202d36343120313236202d343920323534202d383220363237202d31363020343034202d383520343532202d393820353636202d313536203737202d333920313631202d31323720313833202d313933203830202d323432202d313035202d343537202d343434202d353136202d323136202d3338202d343535202d35202d363133203834202d313133203634202d32313720313937202d32353220333234206c2d3137203537202d3337202d3520632d3230202d33202d313938202d3231202d333936202d3430202d313937202d3139202d333631202d3336202d333633202d3339202d33202d332037202d3536203232202d31313820313131202d34353020343838202d3736322031303434202d38363320313939202d333620353237202d343620373131202d3231203535372037362039353320333233203131323720373034203538203132382037372032323520373720333937203020313334202d3320313630202d323820323435202d383220323833202d32383320343737202d36323620363035202d313434203533202d323735203837202d36363320313730202d333337203732202d34333720313030202d35343020313532202d313432203731202d31393920313533202d32303520323933202d332037342030203933203231203134312034362031303520313833203230362033333220323434203135302033392033343920333620343930202d3620313732202d353120333139202d31383720333830202d333531203130202d3237203230202d3438203234202d34382033203020313730203138203337312034302032303120323220333638203430203337312034302031342030202d363120323331202d31303020333130202d31323520323439202d33353420343530202d36323920353531202d3539203232202d313734203533202d323537203639202d313239203236202d313830203331202d333630203334202d3131352033202d3234382031202d323935202d347a222f3e3c7061746820643d224d323832313520333133373120632d373536202d3731202d31333030202d363131202d31343336202d31343236202d3332202d313838202d3332202d3538312030202d37363820313238202d37363020353933202d313235342031323936202d3133373720313537202d323720343732202d333820363232202d323120363433203734203130393220343031203132353020393131203132203431203139203737203135203830202d342034202d313630203234202d333437203434202d313837203231202d333537203430202d333737203433206c2d33372035202d3336202d373320632d313136202d323239202d333335202d333536202d363435202d333735202d343335202d3236202d37363320313836202d38393420353737202d3239203836202d353620323339202d353620333137206c302035322031323232203020313232312030202d372032333420632d313320343433202d353920363738202d31383620393431202d31313020323239202d32363220343136202d34353020353534202d31363820313234202d34313220323233202d36353520323637202d313031203138202d333736203236202d3530302031357a206d343139202d3636312063313130202d323820313734202d353920323638202d31333220313738202d31333820323839202d33343720333035202d353735206c36202d3833202d383232203020632d3737352030202d3832312031202d3832312031382030203633203435203232372038362033313720313137203235322033363420343337203633312034373420393620313420323534203520333437202d31397a222f3e3c2f673e203c7465787420783d2235302220793d223635302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d223430302220793d223635302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d223335302220793d223635302220636c6173733d2262617365223ea264697066735822122051e1075efd55aca391e9a3975ff76cdc76b52cee565b1ee6ccbd5dbef76482fd64736f6c634300080d0033
Deployed Bytecode Sourcemap
66904:11373:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76229:196;;;;;;;;;;-1:-1:-1;76229:196:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;76229:196:0;;;;;;;;76063:154;;;;;;;;;;-1:-1:-1;76063:154:0;;;;;:::i;:::-;;:::i;:::-;;75909:146;;;;;;;;;;-1:-1:-1;75909:146:0;;;;;:::i;:::-;;:::i;38707:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;40220:171::-;;;;;;;;;;-1:-1:-1;40220:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2610:32:1;;;2592:51;;2580:2;2565:18;40220:171:0;2446:203:1;76729:175:0;;;;;;;;;;-1:-1:-1;76729:175:0;;;;;:::i;:::-;;:::i;68867:139::-;;;;;;;;;;-1:-1:-1;68867:139:0;;;;;:::i;:::-;;:::i;53153:113::-;;;;;;;;;;-1:-1:-1;53241:10:0;:17;53153:113;;;3059:25:1;;;3047:2;3032:18;53153:113:0;2913:177:1;76912:181:0;;;;;;;;;;-1:-1:-1;76912:181:0;;;;;:::i;:::-;;:::i;61255:494::-;;;;;;;;;;-1:-1:-1;61255:494:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3873:32:1;;;3855:51;;3937:2;3922:18;;3915:34;;;;3828:18;61255:494:0;3681:274:1;52821:256:0;;;;;;;;;;-1:-1:-1;52821:256:0;;;;;:::i;:::-;;:::i;67081:42::-;;;;;;;;;;;;67118:5;67081:42;;75782:119;;;;;;;;;;;;;:::i;5693:143::-;;;;;;;;;;;;5793:42;5693:143;;77101:189;;;;;;;;;;-1:-1:-1;77101:189:0;;;;;:::i;:::-;;:::i;69014:139::-;;;;;;;;;;-1:-1:-1;69014:139:0;;;;;:::i;:::-;;:::i;53343:233::-;;;;;;;;;;-1:-1:-1;53343:233:0;;;;;:::i;:::-;;:::i;64858:86::-;;;;;;;;;;-1:-1:-1;64929:7:0;;;;64858:86;;38418:222;;;;;;;;;;-1:-1:-1;38418:222:0;;;;;:::i;:::-;;:::i;68273:139::-;;;;;;;;;;-1:-1:-1;68273:139:0;;;;;:::i;:::-;;:::i;38149:207::-;;;;;;;;;;-1:-1:-1;38149:207:0;;;;;:::i;:::-;;:::i;15728:103::-;;;;;;;;;;;;;:::i;68420:142::-;;;;;;;;;;-1:-1:-1;68420:142:0;;;;;:::i;:::-;;:::i;69161:145::-;;;;;;;;;;-1:-1:-1;69161:145:0;;;;;:::i;:::-;;:::i;15080:87::-;;;;;;;;;;-1:-1:-1;15153:6:0;;-1:-1:-1;;;;;15153:6:0;15080:87;;69314:142;;;;;;;;;;-1:-1:-1;69314:142:0;;;;;:::i;:::-;;:::i;38876:104::-;;;;;;;;;;;;;:::i;68717:142::-;;;;;;;;;;-1:-1:-1;68717:142:0;;;;;:::i;:::-;;:::i;67022:40::-;;;;;;;;;;;;;;;;75467:303;;;;;;:::i;:::-;;:::i;76527:194::-;;;;;;;;;;-1:-1:-1;76527:194:0;;;;;:::i;:::-;;:::i;77298:247::-;;;;;;;;;;-1:-1:-1;77298:247:0;;;;;:::i;:::-;;:::i;69824:5629::-;;;;;;;;;;-1:-1:-1;69824:5629:0;;;;;:::i;:::-;;:::i;40689:164::-;;;;;;;;;;-1:-1:-1;40689:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;40810:25:0;;;40786:4;40810:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;40689:164;15986:201;;;;;;;;;;-1:-1:-1;15986:201:0;;;;;:::i;:::-;;:::i;68570:139::-;;;;;;;;;;-1:-1:-1;68570:139:0;;;;;:::i;:::-;;:::i;76229:196::-;76357:4;76381:36;76405:11;76381:23;:36::i;:::-;76374:43;76229:196;-1:-1:-1;;76229:196:0:o;76063:154::-;14966:13;:11;:13::i;:::-;76120:11;::::1;;76127:4;76120:11:::0;76116:73:::1;;76148:8;:6;:8::i;:::-;76063:154:::0;:::o;76116:73::-:1;76199:10;:8;:10::i;75909:146::-:0;14966:13;:11;:13::i;:::-;76003:42:::1;76022:8;76032:12;76003:18;:42::i;:::-;75909:146:::0;;:::o;38707:100::-;38761:13;38794:5;38787:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38707:100;:::o;40220:171::-;40296:7;40316:23;40331:7;40316:14;:23::i;:::-;-1:-1:-1;40359:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;40359:24:0;;40220:171::o;76729:175::-;76843:8;5793:42;7687:45;:49;7683:225;;7758:67;;-1:-1:-1;;;7758:67:0;;7809:4;7758:67;;;6847:34:1;-1:-1:-1;;;;;6917:15:1;;6897:18;;;6890:43;5793:42:0;;7758;;6782:18:1;;7758:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7753:144;;7853:28;;-1:-1:-1;;;7853:28:0;;-1:-1:-1;;;;;2610:32:1;;7853:28:0;;;2592:51:1;2565:18;;7853:28:0;;;;;;;;7753:144;76864:32:::1;76878:8;76888:7;76864:13;:32::i;:::-;76729:175:::0;;;:::o;68867:139::-;68923:13;68956:42;68962:7;68956:42;;;;;;;;;;;;;-1:-1:-1;;;68956:42:0;;;68986:11;68956:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:42::i;76912:181::-;77031:4;5793:42;6941:45;:49;6937:539;;7230:10;-1:-1:-1;;;;;7222:18:0;;;7218:85;;77048:37:::1;77067:4;77073:2;77077:7;77048:18;:37::i;:::-;7281:7:::0;;7218:85;7322:69;;-1:-1:-1;;;7322:69:0;;7373:4;7322:69;;;6847:34:1;7380:10:0;6897:18:1;;;6890:43;5793:42:0;;7322;;6782:18:1;;7322:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7317:148;;7419:30;;-1:-1:-1;;;7419:30:0;;7438:10;7419:30;;;2592:51:1;2565:18;;7419:30:0;2446:203:1;7317:148:0;77048:37:::1;77067:4;77073:2;77077:7;77048:18;:37::i;:::-;76912:181:::0;;;;:::o;61255:494::-;61399:7;61462:27;;;:17;:27;;;;;;;;61433:56;;;;;;;;;-1:-1:-1;;;;;61433:56:0;;;;;-1:-1:-1;;;61433:56:0;;;-1:-1:-1;;;;;61433:56:0;;;;;;;;61399:7;;61502:92;;-1:-1:-1;61553:29:0;;;;;;;;;61563:19;61553:29;-1:-1:-1;;;;;61553:29:0;;;;-1:-1:-1;;;61553:29:0;;-1:-1:-1;;;;;61553:29:0;;;;;61502:92;61644:23;;;;61606:21;;62115:5;;61631:36;;-1:-1:-1;;;;;61631:36:0;:10;:36;:::i;:::-;61630:58;;;;:::i;:::-;61709:16;;;;;-1:-1:-1;61255:494:0;;-1:-1:-1;;;;61255:494:0:o;52821:256::-;52918:7;52954:23;52971:5;52954:16;:23::i;:::-;52946:5;:31;52938:87;;;;-1:-1:-1;;;52938:87:0;;7958:2:1;52938:87:0;;;7940:21:1;7997:2;7977:18;;;7970:30;8036:34;8016:18;;;8009:62;-1:-1:-1;;;8087:18:1;;;8080:41;8138:19;;52938:87:0;7756:407:1;52938:87:0;-1:-1:-1;;;;;;53043:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;52821:256::o;75782:119::-;14966:13;:11;:13::i;:::-;75830:51:::1;::::0;75838:10:::1;::::0;75859:21:::1;75830:51:::0;::::1;;;::::0;::::1;::::0;;;75859:21;75838:10;75830:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;77101:189:::0;77224:4;5793:42;6941:45;:49;6937:539;;7230:10;-1:-1:-1;;;;;7222:18:0;;;7218:85;;77241:41:::1;77264:4;77270:2;77274:7;77241:22;:41::i;7218:85::-:0;7322:69;;-1:-1:-1;;;7322:69:0;;7373:4;7322:69;;;6847:34:1;7380:10:0;6897:18:1;;;6890:43;5793:42:0;;7322;;6782:18:1;;7322:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7317:148;;7419:30;;-1:-1:-1;;;7419:30:0;;7438:10;7419:30;;;2592:51:1;2565:18;;7419:30:0;2446:203:1;7317:148:0;77241:41:::1;77264:4;77270:2;77274:7;77241:22;:41::i;69014:139::-:0;69070:13;69103:42;69109:7;69103:42;;;;;;;;;;;;;-1:-1:-1;;;69103:42:0;;;69133:11;69103:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53343:233;53418:7;53454:30;53241:10;:17;;53153:113;53454:30;53446:5;:38;53438:95;;;;-1:-1:-1;;;53438:95:0;;8370:2:1;53438:95:0;;;8352:21:1;8409:2;8389:18;;;8382:30;8448:34;8428:18;;;8421:62;-1:-1:-1;;;8499:18:1;;;8492:42;8551:19;;53438:95:0;8168:408:1;53438:95:0;53551:10;53562:5;53551:17;;;;;;;;:::i;:::-;;;;;;;;;53544:24;;53343:233;;;:::o;38418:222::-;38490:7;38526:16;;;:7;:16;;;;;;-1:-1:-1;;;;;38526:16:0;;38553:56;;;;-1:-1:-1;;;38553:56:0;;8915:2:1;38553:56:0;;;8897:21:1;8954:2;8934:18;;;8927:30;-1:-1:-1;;;8973:18:1;;;8966:54;9037:18;;38553:56:0;8713:348:1;68273:139:0;68329:13;68362:42;68368:7;68362:42;;;;;;;;;;;;;-1:-1:-1;;;68362:42:0;;;68392:11;68362:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38149:207;38221:7;-1:-1:-1;;;;;38249:19:0;;38241:73;;;;-1:-1:-1;;;38241:73:0;;9268:2:1;38241:73:0;;;9250:21:1;9307:2;9287:18;;;9280:30;9346:34;9326:18;;;9319:62;-1:-1:-1;;;9397:18:1;;;9390:39;9446:19;;38241:73:0;9066:405:1;38241:73:0;-1:-1:-1;;;;;;38332:16:0;;;;;:9;:16;;;;;;;38149:207::o;15728:103::-;14966:13;:11;:13::i;:::-;15793:30:::1;15820:1;15793:18;:30::i;:::-;15728:103::o:0;68420:142::-;68477:13;68510:44;68516:7;68510:44;;;;;;;;;;;;;-1:-1:-1;;;68510:44:0;;;68541:12;68510:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69161:145;69219:13;69252:46;69258:7;69252:46;;;;;;;;;;;;;-1:-1:-1;;;69252:46:0;;;69284:13;69252:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69314:142;69371:13;69404:44;69410:7;69404:44;;;;;;;;;;;;;-1:-1:-1;;;69404:44:0;;;69435:12;69404:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38876:104;38932:13;38965:7;38958:14;;;;;:::i;68717:142::-;68774:13;68807:44;68813:7;68807:44;;;;;;;;;;;;;-1:-1:-1;;;68807:44:0;;;68838:12;68807:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75467:303;18198:1;18794:7;;:19;18786:63;;;;-1:-1:-1;;;18786:63:0;;9678:2:1;18786:63:0;;;9660:21:1;9717:2;9697:18;;;9690:30;9756:33;9736:18;;;9729:61;9807:18;;18786:63:0;9476:355:1;18786:63:0;18198:1;18927:7;:18;75545:11;;;;;:31:::1;;;75571:5;75560:7;:16;;75545:31;75537:60;;;::::0;-1:-1:-1;;;75537:60:0;;10038:2:1;75537:60:0::1;::::0;::::1;10020:21:1::0;10077:2;10057:18;;;10050:30;-1:-1:-1;;;10096:18:1;;;10089:46;10152:18;;75537:60:0::1;9836:340:1::0;75537:60:0::1;75625:9;75616:5;;:18;;75608:62;;;::::0;-1:-1:-1;;;75608:62:0;;10383:2:1;75608:62:0::1;::::0;::::1;10365:21:1::0;10422:2;10402:18;;;10395:30;10461:33;10441:18;;;10434:61;10512:18;;75608:62:0::1;10181:355:1::0;75608:62:0::1;64929:7:::0;;;;75689:9:::1;75681:38;;;::::0;-1:-1:-1;;;75681:38:0;;10743:2:1;75681:38:0::1;::::0;::::1;10725:21:1::0;10782:2;10762:18;;;10755:30;-1:-1:-1;;;10801:18:1;;;10794:46;10857:18;;75681:38:0::1;10541:340:1::0;75681:38:0::1;75730:32;13711:10:::0;75754:7:::1;75730:9;:32::i;:::-;-1:-1:-1::0;18154:1:0;19106:7;:22;75467:303::o;76527:194::-;76649:8;5793:42;7687:45;:49;7683:225;;7758:67;;-1:-1:-1;;;7758:67:0;;7809:4;7758:67;;;6847:34:1;-1:-1:-1;;;;;6917:15:1;;6897:18;;;6890:43;5793:42:0;;7758;;6782:18:1;;7758:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7753:144;;7853:28;;-1:-1:-1;;;7853:28:0;;-1:-1:-1;;;;;2610:32:1;;7853:28:0;;;2592:51:1;2565:18;;7853:28:0;2446:203:1;7753:144:0;76670:43:::1;76694:8;76704;76670:23;:43::i;77298:247::-:0;77468:4;5793:42;6941:45;:49;6937:539;;7230:10;-1:-1:-1;;;;;7222:18:0;;;7218:85;;77490:47:::1;77513:4;77519:2;77523:7;77532:4;77490:22;:47::i;:::-;7281:7:::0;;7218:85;7322:69;;-1:-1:-1;;;7322:69:0;;7373:4;7322:69;;;6847:34:1;7380:10:0;6897:18:1;;;6890:43;5793:42:0;;7322;;6782:18:1;;7322:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7317:148;;7419:30;;-1:-1:-1;;;7419:30:0;;7438:10;7419:30;;;2592:51:1;2565:18;;7419:30:0;2446:203:1;7317:148:0;77490:47:::1;77513:4;77519:2;77523:7;77532:4;77490:22;:47::i;:::-;77298:247:::0;;;;;:::o;69824:5629::-;69889:13;69915:23;;:::i;:::-;69949:3533;;;;;;;;;;;;;;;;;;;73506:17;73515:7;73506:8;:17::i;:::-;73495:5;73501:1;73495:8;;;:28;;;;73536:55;;;;;;;;;;;;;;;;;:8;;;:55;73615:18;73625:7;73615:9;:18::i;:::-;73604:8;;;;:29;;;;73646:55;;;;;;;;;;;;;73604:8;73646:55;;;:8;;;:55;73725:17;73734:7;73725:8;:17::i;:::-;73714:8;;;:28;73755:55;;;;;;;;;;;;;;73714:8;73755:55;;;:8;;;:55;73834:18;73844:7;73834:9;:18::i;:::-;73823:8;;;:29;73865:55;;;;;;;;;;;;;;73823:8;73865:55;;;:8;;;:55;73944:17;73953:7;73944:8;:17::i;:::-;73933:8;;;:28;73974:56;;;;;;;;;;;;;;73933:8;73974:56;;;:9;;;:56;74063:17;74072:7;74063:8;:17::i;:::-;74051:9;;;:29;74093:56;;;;;;;;;;;;;;74051:9;74093:56;;;:9;;;:56;74174:19;74185:7;74174:10;:19::i;:::-;74162:9;;;:31;74206:56;;;;;;;;;;;;;;74162:9;74206:56;;;:9;;;:56;74295:18;74305:7;74295:9;:18::i;:::-;74283:9;;;:30;74326:27;;;;;;;;;;;-1:-1:-1;;;74283:9:0;74326:27;;;;;;;:9;;;:27;;;;74437:8;;74447;;;;74457;;;;74467;;;;74477;;;;74487;;;;74497;;;;74507;;;;74517;;;;74420:106;;-1:-1:-1;;74420:106:0;;74517:8;;74420:106;;:::i;:::-;;;;;;;-1:-1:-1;;74420:106:0;;;;;;;74638:8;;;;74665:9;;;;74693;;;;74721;;;;74749;;;;74777;;;;74805;;;;74833;;;;74420:106;;-1:-1:-1;74578:279:0;;74420:106;;74833:9;74638:8;74578:279;;:::i;:::-;;;;;;;;;;;;;74548:320;;74881:18;74902:428;75072:17;75081:7;75072:8;:17::i;:::-;75203:28;75223:6;75203:13;:28::i;:::-;74983:302;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74902:13;:428::i;:::-;74881:449;;75407:4;75357:55;;;;;;;;:::i;:::-;;;;-1:-1:-1;;75357:55:0;;;;;;;;;;69824:5629;-1:-1:-1;;;;;69824:5629:0:o;15986:201::-;14966:13;:11;:13::i;:::-;-1:-1:-1;;;;;16075:22:0;::::1;16067:73;;;::::0;-1:-1:-1;;;16067:73:0;;14396:2:1;16067:73:0::1;::::0;::::1;14378:21:1::0;14435:2;14415:18;;;14408:30;14474:34;14454:18;;;14447:62;-1:-1:-1;;;14525:18:1;;;14518:36;14571:19;;16067:73:0::1;14194:402:1::0;16067:73:0::1;16151:28;16170:8;16151:18;:28::i;68570:139::-:0;68626:13;68659:42;68665:7;68659:42;;;;;;;;;;;;;-1:-1:-1;;;68659:42:0;;;68689:11;68659:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60985:215;61087:4;-1:-1:-1;;;;;;61111:41:0;;-1:-1:-1;;;61111:41:0;;:81;;;61156:36;61180:11;61156:23;:36::i;15245:132::-;15153:6;;-1:-1:-1;;;;;15153:6:0;13711:10;15309:23;15301:68;;;;-1:-1:-1;;;15301:68:0;;14803:2:1;15301:68:0;;;14785:21:1;;;14822:18;;;14815:30;14881:34;14861:18;;;14854:62;14933:18;;15301:68:0;14601:356:1;65658:118:0;64929:7;;;;65183:9;65175:38;;;;-1:-1:-1;;;65175:38:0;;10743:2:1;65175:38:0;;;10725:21:1;10782:2;10762:18;;;10755:30;-1:-1:-1;;;10801:18:1;;;10794:46;10857:18;;65175:38:0;10541:340:1;65175:38:0;65718:7:::1;:14:::0;;-1:-1:-1;;65718:14:0::1;65728:4;65718:14;::::0;;65748:20:::1;65755:12;13711:10:::0;;13631:98;65755:12:::1;65748:20;::::0;-1:-1:-1;;;;;2610:32:1;;;2592:51;;2580:2;2565:18;65748:20:0::1;;;;;;;65658:118::o:0;65917:120::-;64929:7;;;;65453:41;;;;-1:-1:-1;;;65453:41:0;;15164:2:1;65453:41:0;;;15146:21:1;15203:2;15183:18;;;15176:30;-1:-1:-1;;;15222:18:1;;;15215:50;15282:18;;65453:41:0;14962:344:1;65453:41:0;65976:7:::1;:15:::0;;-1:-1:-1;;65976:15:0::1;::::0;;66007:22:::1;13711:10:::0;66016:12:::1;13631:98:::0;62399:332;62115:5;-1:-1:-1;;;;;62502:33:0;;;;62494:88;;;;-1:-1:-1;;;62494:88:0;;15513:2:1;62494:88:0;;;15495:21:1;15552:2;15532:18;;;15525:30;15591:34;15571:18;;;15564:62;-1:-1:-1;;;15642:18:1;;;15635:40;15692:19;;62494:88:0;15311:406:1;62494:88:0;-1:-1:-1;;;;;62601:22:0;;62593:60;;;;-1:-1:-1;;;62593:60:0;;15924:2:1;62593:60:0;;;15906:21:1;15963:2;15943:18;;;15936:30;16002:27;15982:18;;;15975:55;16047:18;;62593:60:0;15722:349:1;62593:60:0;62688:35;;;;;;;;;-1:-1:-1;;;;;62688:35:0;;;;;;-1:-1:-1;;;;;62688:35:0;;;;;;;;;;-1:-1:-1;;;62666:57:0;;;;:19;:57;62399:332::o;48195:135::-;43478:4;43502:16;;;:7;:16;;;;;;-1:-1:-1;;;;;43502:16:0;48269:53;;;;-1:-1:-1;;;48269:53:0;;8915:2:1;48269:53:0;;;8897:21:1;8954:2;8934:18;;;8927:30;-1:-1:-1;;;8973:18:1;;;8966:54;9037:18;;48269:53:0;8713:348:1;39737:417:0;39818:13;39834:23;39849:7;39834:14;:23::i;:::-;39818:39;;39882:5;-1:-1:-1;;;;;39876:11:0;:2;-1:-1:-1;;;;;39876:11:0;;39868:57;;;;-1:-1:-1;;;39868:57:0;;16278:2:1;39868:57:0;;;16260:21:1;16317:2;16297:18;;;16290:30;16356:34;16336:18;;;16329:62;-1:-1:-1;;;16407:18:1;;;16400:31;16448:19;;39868:57:0;16076:397:1;39868:57:0;13711:10;-1:-1:-1;;;;;39960:21:0;;;;:62;;-1:-1:-1;39985:37:0;40002:5;13711:10;40689:164;:::i;39985:37::-;39938:174;;;;-1:-1:-1;;;39938:174:0;;16680:2:1;39938:174:0;;;16662:21:1;16719:2;16699:18;;;16692:30;16758:34;16738:18;;;16731:62;16829:32;16809:18;;;16802:60;16879:19;;39938:174:0;16478:426:1;39938:174:0;40125:21;40134:2;40138:7;40125:8;:21::i;69466:350::-;69609:13;69635:12;69650:62;69681:9;69692:17;69701:7;69692:8;:17::i;:::-;69664:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69650:6;:62::i;:::-;69635:77;;69723:20;69746:11;69765;:18;69758:4;:25;;;;:::i;:::-;69746:38;;;;;;;;:::i;:::-;;;;;;;69723:61;;69802:6;69795:13;;;;69466:350;;;;;:::o;40920:336::-;41115:41;13711:10;41148:7;41115:18;:41::i;:::-;41107:100;;;;-1:-1:-1;;;41107:100:0;;;;;;;:::i;:::-;41220:28;41230:4;41236:2;41240:7;41220:9;:28::i;41327:185::-;41465:39;41482:4;41488:2;41492:7;41465:39;;;;;;;;;;;;:16;:39::i;16347:191::-;16440:6;;;-1:-1:-1;;;;;16457:17:0;;;-1:-1:-1;;;;;;16457:17:0;;;;;;;16490:40;;16440:6;;;16457:17;16440:6;;16490:40;;16421:16;;16490:40;16410:128;16347:191;:::o;44313:110::-;44389:26;44399:2;44403:7;44389:26;;;;;;;;;;;;:9;:26::i;40463:155::-;40558:52;13711:10;40591:8;40601;40558:18;:52::i;41583:323::-;41757:41;13711:10;41790:7;41757:18;:41::i;:::-;41749:100;;;;-1:-1:-1;;;41749:100:0;;;;;;;:::i;:::-;41860:38;41874:4;41880:2;41884:7;41893:4;41860:13;:38::i;77553:715::-;77609:13;77822:5;77831:1;77822:10;77818:53;;-1:-1:-1;;77849:10:0;;;;;;;;;;;;-1:-1:-1;;;77849:10:0;;;;;77553:715::o;77818:53::-;77896:5;77881:12;77937:78;77944:9;;77937:78;;77970:8;;;;:::i;:::-;;-1:-1:-1;77993:10:0;;-1:-1:-1;78001:2:0;77993:10;;:::i;:::-;;;77937:78;;;78025:19;78057:6;78047:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;78047:17:0;;78025:39;;78075:154;78082:10;;78075:154;;78109:11;78119:1;78109:11;;:::i;:::-;;-1:-1:-1;78178:10:0;78186:2;78178:5;:10;:::i;:::-;78165:24;;:2;:24;:::i;:::-;78152:39;;78135:6;78142;78135:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;78135:56:0;;;;;;;;-1:-1:-1;78206:11:0;78215:2;78206:11;;:::i;:::-;;;78075:154;;;78253:6;77553:715;-1:-1:-1;;;;77553:715:0:o;8839:1607::-;8937:11;;8897:13;;8923:11;8963:8;;;8959:23;;-1:-1:-1;;8973:9:0;;;;;;;;;-1:-1:-1;8973:9:0;;;8839:1607;-1:-1:-1;8839:1607:0:o;8959:23::-;9034:18;9072:1;9061:7;:3;9067:1;9061:7;:::i;:::-;9060:13;;;;:::i;:::-;9055:19;;:1;:19;:::i;:::-;9034:40;-1:-1:-1;9132:19:0;9164:15;9034:40;9177:2;9164:15;:::i;:::-;9154:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9154:26:0;;9132:48;;9193:18;9214:5;;;;;;;;;;;;;;;;;9193:26;;9283:1;9276:5;9272:13;9328:2;9320:6;9316:15;9379:1;9347:777;9402:3;9399:1;9396:10;9347:777;;;9457:1;9500:12;;;;;9494:19;9595:4;9583:2;9579:14;;;;;9561:40;;9555:47;9704:2;9700:14;;;9696:25;;9682:40;;9676:47;9833:1;9829:13;;;9825:24;;9811:39;;9805:46;9953:16;;;;9939:31;;9933:38;9631:1;9627:11;;;9725:4;9672:58;;;9663:68;9756:11;;9801:57;;;9792:67;;;;9884:11;;9929:49;;9920:59;10008:3;10004:13;10037:22;;10107:1;10092:17;;;;9450:9;9347:777;;;9351:44;10156:1;10151:3;10147:11;10177:1;10172:84;;;;10275:1;10270:82;;;;10140:212;;10172:84;-1:-1:-1;;;;;10205:17:0;;10198:43;10172:84;;10270:82;-1:-1:-1;;;;;10303:17:0;;10296:41;10140:212;-1:-1:-1;;;10368:26:0;;;10375:6;8839:1607;-1:-1:-1;;;;8839:1607:0:o;52513:224::-;52615:4;-1:-1:-1;;;;;;52639:50:0;;-1:-1:-1;;;52639:50:0;;:90;;;52693:36;52717:11;52693:23;:36::i;47474:174::-;47549:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;47549:29:0;-1:-1:-1;;;;;47549:29:0;;;;;;;;:24;;47603:23;47549:24;47603:14;:23::i;:::-;-1:-1:-1;;;;;47594:46:0;;;;;;;;;;;47474:174;;:::o;68127:138::-;68187:7;68249:5;68232:23;;;;;;;;:::i;:::-;;;;-1:-1:-1;;68232:23:0;;;;;;;;;68222:34;;68232:23;68222:34;;;;;68127:138;-1:-1:-1;;68127:138:0:o;43707:264::-;43800:4;43817:13;43833:23;43848:7;43833:14;:23::i;:::-;43817:39;;43886:5;-1:-1:-1;;;;;43875:16:0;:7;-1:-1:-1;;;;;43875:16:0;;:52;;;-1:-1:-1;;;;;;40810:25:0;;;40786:4;40810:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;43895:32;43875:87;;;;43955:7;-1:-1:-1;;;;;43931:31:0;:20;43943:7;43931:11;:20::i;:::-;-1:-1:-1;;;;;43931:31:0;;43867:96;43707:264;-1:-1:-1;;;;43707:264:0:o;46730:625::-;46889:4;-1:-1:-1;;;;;46862:31:0;:23;46877:7;46862:14;:23::i;:::-;-1:-1:-1;;;;;46862:31:0;;46854:81;;;;-1:-1:-1;;;46854:81:0;;18802:2:1;46854:81:0;;;18784:21:1;18841:2;18821:18;;;18814:30;18880:34;18860:18;;;18853:62;-1:-1:-1;;;18931:18:1;;;18924:35;18976:19;;46854:81:0;18600:401:1;46854:81:0;-1:-1:-1;;;;;46954:16:0;;46946:65;;;;-1:-1:-1;;;46946:65:0;;19208:2:1;46946:65:0;;;19190:21:1;19247:2;19227:18;;;19220:30;19286:34;19266:18;;;19259:62;-1:-1:-1;;;19337:18:1;;;19330:34;19381:19;;46946:65:0;19006:400:1;46946:65:0;47024:39;47045:4;47051:2;47055:7;47024:20;:39::i;:::-;47128:29;47145:1;47149:7;47128:8;:29::i;:::-;-1:-1:-1;;;;;47170:15:0;;;;;;:9;:15;;;;;:20;;47189:1;;47170:15;:20;;47189:1;;47170:20;:::i;:::-;;;;-1:-1:-1;;;;;;;47201:13:0;;;;;;:9;:13;;;;;:18;;47218:1;;47201:13;:18;;47218:1;;47201:18;:::i;:::-;;;;-1:-1:-1;;47230:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;47230:21:0;-1:-1:-1;;;;;47230:21:0;;;;;;;;;47269:27;;47230:16;;47269:27;;;;;;;76729:175;;;:::o;44650:319::-;44779:18;44785:2;44789:7;44779:5;:18::i;:::-;44830:53;44861:1;44865:2;44869:7;44878:4;44830:22;:53::i;:::-;44808:153;;;;-1:-1:-1;;;44808:153:0;;;;;;;:::i;47791:315::-;47946:8;-1:-1:-1;;;;;47937:17:0;:5;-1:-1:-1;;;;;47937:17:0;;47929:55;;;;-1:-1:-1;;;47929:55:0;;20032:2:1;47929:55:0;;;20014:21:1;20071:2;20051:18;;;20044:30;20110:27;20090:18;;;20083:55;20155:18;;47929:55:0;19830:349:1;47929:55:0;-1:-1:-1;;;;;47995:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;47995:46:0;;;;;;;;;;48057:41;;540::1;;;48057::0;;513:18:1;48057:41:0;;;;;;;47791:315;;;:::o;42787:313::-;42943:28;42953:4;42959:2;42963:7;42943:9;:28::i;:::-;42990:47;43013:4;43019:2;43023:7;43032:4;42990:22;:47::i;:::-;42982:110;;;;-1:-1:-1;;;42982:110:0;;;;;;;:::i;37780:305::-;37882:4;-1:-1:-1;;;;;;37919:40:0;;-1:-1:-1;;;37919:40:0;;:105;;-1:-1:-1;;;;;;;37976:48:0;;-1:-1:-1;;;37976:48:0;37919:105;:158;;;-1:-1:-1;;;;;;;;;;30645:40:0;;;38041:36;30536:157;54189:589;-1:-1:-1;;;;;54395:18:0;;54391:187;;54430:40;54462:7;55605:10;:17;;55578:24;;;;:15;:24;;;;;:44;;;55633:24;;;;;;;;;;;;55501:164;54430:40;54391:187;;;54500:2;-1:-1:-1;;;;;54492:10:0;:4;-1:-1:-1;;;;;54492:10:0;;54488:90;;54519:47;54552:4;54558:7;54519:32;:47::i;:::-;-1:-1:-1;;;;;54592:16:0;;54588:183;;54625:45;54662:7;54625:36;:45::i;54588:183::-;54698:4;-1:-1:-1;;;;;54692:10:0;:2;-1:-1:-1;;;;;54692:10:0;;54688:83;;54719:40;54747:2;54751:7;54719:27;:40::i;45305:439::-;-1:-1:-1;;;;;45385:16:0;;45377:61;;;;-1:-1:-1;;;45377:61:0;;20386:2:1;45377:61:0;;;20368:21:1;;;20405:18;;;20398:30;20464:34;20444:18;;;20437:62;20516:18;;45377:61:0;20184:356:1;45377:61:0;43478:4;43502:16;;;:7;:16;;;;;;-1:-1:-1;;;;;43502:16:0;:30;45449:58;;;;-1:-1:-1;;;45449:58:0;;20747:2:1;45449:58:0;;;20729:21:1;20786:2;20766:18;;;20759:30;20825;20805:18;;;20798:58;20873:18;;45449:58:0;20545:352:1;45449:58:0;45520:45;45549:1;45553:2;45557:7;45520:20;:45::i;:::-;-1:-1:-1;;;;;45578:13:0;;;;;;:9;:13;;;;;:18;;45595:1;;45578:13;:18;;45595:1;;45578:18;:::i;:::-;;;;-1:-1:-1;;45607:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;45607:21:0;-1:-1:-1;;;;;45607:21:0;;;;;;;;45646:33;;45607:16;;;45646:33;;45607:16;;45646:33;75909:146;;:::o;48894:853::-;49048:4;-1:-1:-1;;;;;49069:13:0;;20675:19;:23;49065:675;;49105:71;;-1:-1:-1;;;49105:71:0;;-1:-1:-1;;;;;49105:36:0;;;;;:71;;13711:10;;49156:4;;49162:7;;49171:4;;49105:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49105:71:0;;;;;;;;-1:-1:-1;;49105:71:0;;;;;;;;;;;;:::i;:::-;;;49101:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49346:6;:13;49363:1;49346:18;49342:328;;49389:60;;-1:-1:-1;;;49389:60:0;;;;;;;:::i;49342:328::-;49620:6;49614:13;49605:6;49601:2;49597:15;49590:38;49101:584;-1:-1:-1;;;;;;49227:51:0;-1:-1:-1;;;49227:51:0;;-1:-1:-1;49220:58:0;;49065:675;-1:-1:-1;49724:4:0;48894:853;;;;;;:::o;56292:988::-;56558:22;56608:1;56583:22;56600:4;56583:16;:22::i;:::-;:26;;;;:::i;:::-;56620:18;56641:26;;;:17;:26;;;;;;56558:51;;-1:-1:-1;56774:28:0;;;56770:328;;-1:-1:-1;;;;;56841:18:0;;56819:19;56841:18;;;:12;:18;;;;;;;;:34;;;;;;;;;56892:30;;;;;;:44;;;57009:30;;:17;:30;;;;;:43;;;56770:328;-1:-1:-1;57194:26:0;;;;:17;:26;;;;;;;;57187:33;;;-1:-1:-1;;;;;57238:18:0;;;;;:12;:18;;;;;:34;;;;;;;57231:41;56292:988::o;57575:1079::-;57853:10;:17;57828:22;;57853:21;;57873:1;;57853:21;:::i;:::-;57885:18;57906:24;;;:15;:24;;;;;;58279:10;:26;;57828:46;;-1:-1:-1;57906:24:0;;57828:46;;58279:26;;;;;;:::i;:::-;;;;;;;;;58257:48;;58343:11;58318:10;58329;58318:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;58423:28;;;:15;:28;;;;;;;:41;;;58595:24;;;;;58588:31;58630:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;57646:1008;;;57575:1079;:::o;55079:221::-;55164:14;55181:20;55198:2;55181:16;:20::i;:::-;-1:-1:-1;;;;;55212:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;55257:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;55079:221:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:118::-;678:5;671:13;664:21;657:5;654:32;644:60;;700:1;697;690:12;715:241;771:6;824:2;812:9;803:7;799:23;795:32;792:52;;;840:1;837;830:12;792:52;879:9;866:23;898:28;920:5;898:28;:::i;961:173::-;1029:20;;-1:-1:-1;;;;;1078:31:1;;1068:42;;1058:70;;1124:1;1121;1114:12;1058:70;961:173;;;:::o;1139:366::-;1206:6;1214;1267:2;1255:9;1246:7;1242:23;1238:32;1235:52;;;1283:1;1280;1273:12;1235:52;1306:29;1325:9;1306:29;:::i;:::-;1296:39;;1385:2;1374:9;1370:18;1357:32;-1:-1:-1;;;;;1422:5:1;1418:38;1411:5;1408:49;1398:77;;1471:1;1468;1461:12;1398:77;1494:5;1484:15;;;1139:366;;;;;:::o;1510:258::-;1582:1;1592:113;1606:6;1603:1;1600:13;1592:113;;;1682:11;;;1676:18;1663:11;;;1656:39;1628:2;1621:10;1592:113;;;1723:6;1720:1;1717:13;1714:48;;;-1:-1:-1;;1758:1:1;1740:16;;1733:27;1510:258::o;1773:::-;1815:3;1853:5;1847:12;1880:6;1875:3;1868:19;1896:63;1952:6;1945:4;1940:3;1936:14;1929:4;1922:5;1918:16;1896:63;:::i;:::-;2013:2;1992:15;-1:-1:-1;;1988:29:1;1979:39;;;;2020:4;1975:50;;1773:258;-1:-1:-1;;1773:258:1:o;2036:220::-;2185:2;2174:9;2167:21;2148:4;2205:45;2246:2;2235:9;2231:18;2223:6;2205:45;:::i;2261:180::-;2320:6;2373:2;2361:9;2352:7;2348:23;2344:32;2341:52;;;2389:1;2386;2379:12;2341:52;-1:-1:-1;2412:23:1;;2261:180;-1:-1:-1;2261:180:1:o;2654:254::-;2722:6;2730;2783:2;2771:9;2762:7;2758:23;2754:32;2751:52;;;2799:1;2796;2789:12;2751:52;2822:29;2841:9;2822:29;:::i;:::-;2812:39;2898:2;2883:18;;;;2870:32;;-1:-1:-1;;;2654:254:1:o;3095:328::-;3172:6;3180;3188;3241:2;3229:9;3220:7;3216:23;3212:32;3209:52;;;3257:1;3254;3247:12;3209:52;3280:29;3299:9;3280:29;:::i;:::-;3270:39;;3328:38;3362:2;3351:9;3347:18;3328:38;:::i;:::-;3318:48;;3413:2;3402:9;3398:18;3385:32;3375:42;;3095:328;;;;;:::o;3428:248::-;3496:6;3504;3557:2;3545:9;3536:7;3532:23;3528:32;3525:52;;;3573:1;3570;3563:12;3525:52;-1:-1:-1;;3596:23:1;;;3666:2;3651:18;;;3638:32;;-1:-1:-1;3428:248:1:o;4199:186::-;4258:6;4311:2;4299:9;4290:7;4286:23;4282:32;4279:52;;;4327:1;4324;4317:12;4279:52;4350:29;4369:9;4350:29;:::i;4390:315::-;4455:6;4463;4516:2;4504:9;4495:7;4491:23;4487:32;4484:52;;;4532:1;4529;4522:12;4484:52;4555:29;4574:9;4555:29;:::i;:::-;4545:39;;4634:2;4623:9;4619:18;4606:32;4647:28;4669:5;4647:28;:::i;4710:127::-;4771:10;4766:3;4762:20;4759:1;4752:31;4802:4;4799:1;4792:15;4826:4;4823:1;4816:15;4842:1138;4937:6;4945;4953;4961;5014:3;5002:9;4993:7;4989:23;4985:33;4982:53;;;5031:1;5028;5021:12;4982:53;5054:29;5073:9;5054:29;:::i;:::-;5044:39;;5102:38;5136:2;5125:9;5121:18;5102:38;:::i;:::-;5092:48;;5187:2;5176:9;5172:18;5159:32;5149:42;;5242:2;5231:9;5227:18;5214:32;5265:18;5306:2;5298:6;5295:14;5292:34;;;5322:1;5319;5312:12;5292:34;5360:6;5349:9;5345:22;5335:32;;5405:7;5398:4;5394:2;5390:13;5386:27;5376:55;;5427:1;5424;5417:12;5376:55;5463:2;5450:16;5485:2;5481;5478:10;5475:36;;;5491:18;;:::i;:::-;5566:2;5560:9;5534:2;5620:13;;-1:-1:-1;;5616:22:1;;;5640:2;5612:31;5608:40;5596:53;;;5664:18;;;5684:22;;;5661:46;5658:72;;;5710:18;;:::i;:::-;5750:10;5746:2;5739:22;5785:2;5777:6;5770:18;5825:7;5820:2;5815;5811;5807:11;5803:20;5800:33;5797:53;;;5846:1;5843;5836:12;5797:53;5902:2;5897;5893;5889:11;5884:2;5876:6;5872:15;5859:46;5947:1;5942:2;5937;5929:6;5925:15;5921:24;5914:35;5968:6;5958:16;;;;;;;4842:1138;;;;;;;:::o;5985:260::-;6053:6;6061;6114:2;6102:9;6093:7;6089:23;6085:32;6082:52;;;6130:1;6127;6120:12;6082:52;6153:29;6172:9;6153:29;:::i;:::-;6143:39;;6201:38;6235:2;6224:9;6220:18;6201:38;:::i;:::-;6191:48;;5985:260;;;;;:::o;6250:380::-;6329:1;6325:12;;;;6372;;;6393:61;;6447:4;6439:6;6435:17;6425:27;;6393:61;6500:2;6492:6;6489:14;6469:18;6466:38;6463:161;;6546:10;6541:3;6537:20;6534:1;6527:31;6581:4;6578:1;6571:15;6609:4;6606:1;6599:15;6463:161;;6250:380;;;:::o;6944:245::-;7011:6;7064:2;7052:9;7043:7;7039:23;7035:32;7032:52;;;7080:1;7077;7070:12;7032:52;7112:9;7106:16;7131:28;7153:5;7131:28;:::i;7194:127::-;7255:10;7250:3;7246:20;7243:1;7236:31;7286:4;7283:1;7276:15;7310:4;7307:1;7300:15;7326:168;7366:7;7432:1;7428;7424:6;7420:14;7417:1;7414:21;7409:1;7402:9;7395:17;7391:45;7388:71;;;7439:18;;:::i;:::-;-1:-1:-1;7479:9:1;;7326:168::o;7499:127::-;7560:10;7555:3;7551:20;7548:1;7541:31;7591:4;7588:1;7581:15;7615:4;7612:1;7605:15;7631:120;7671:1;7697;7687:35;;7702:18;;:::i;:::-;-1:-1:-1;7736:9:1;;7631:120::o;8581:127::-;8642:10;8637:3;8633:20;8630:1;8623:31;8673:4;8670:1;8663:15;8697:4;8694:1;8687:15;10886:1767;11401:3;11439:6;11433:13;11455:53;11501:6;11496:3;11489:4;11481:6;11477:17;11455:53;:::i;:::-;11539:6;11533:13;11555:68;11614:8;11605:6;11600:3;11596:16;11589:4;11581:6;11577:17;11555:68;:::i;:::-;11701:13;;11649:16;;;11645:31;;11723:57;11701:13;11645:31;11757:4;11745:17;;11723:57;:::i;:::-;11811:6;11805:13;11827:72;11890:8;11879;11872:5;11868:20;11861:4;11853:6;11849:17;11827:72;:::i;:::-;11981:13;;11925:20;;;;11921:35;;12003:57;11981:13;11921:35;12037:4;12025:17;;12003:57;:::i;:::-;12091:6;12085:13;12107:72;12170:8;12159;12152:5;12148:20;12141:4;12133:6;12129:17;12107:72;:::i;:::-;12261:13;;12205:20;;;;12201:35;;12283:57;12261:13;12201:35;12317:4;12305:17;;12283:57;:::i;:::-;12371:6;12365:13;12387:72;12450:8;12439;12432:5;12428:20;12421:4;12413:6;12409:17;12387:72;:::i;:::-;12538:13;;12482:20;;;;12478:35;;12560:54;12538:13;12478:35;12594:4;12582:17;;12560:54;:::i;:::-;12630:17;;10886:1767;-1:-1:-1;;;;;;;;;;;10886:1767:1:o;12658:1078::-;-1:-1:-1;;;13158:59:1;;13240:13;;13140:3;;13262:62;13240:13;13312:2;13303:12;;13296:4;13284:17;;13262:62;:::i;:::-;13388:66;13383:2;13343:16;;;13375:11;;;13368:87;13484:28;13479:2;13471:11;;13464:49;13538:13;;13560:63;13538:13;13609:2;13601:11;;13594:4;13582:17;;13560:63;:::i;:::-;-1:-1:-1;;;13683:2:1;13642:17;;;;13675:11;;;13668:35;13727:2;13719:11;;12658:1078;-1:-1:-1;;;;12658:1078:1:o;13741:448::-;14003:31;13998:3;13991:44;13973:3;14064:6;14058:13;14080:62;14135:6;14130:2;14125:3;14121:12;14114:4;14106:6;14102:17;14080:62;:::i;:::-;14162:16;;;;14180:2;14158:25;;13741:448;-1:-1:-1;;13741:448:1:o;16909:470::-;17088:3;17126:6;17120:13;17142:53;17188:6;17183:3;17176:4;17168:6;17164:17;17142:53;:::i;:::-;17258:13;;17217:16;;;;17280:57;17258:13;17217:16;17314:4;17302:17;;17280:57;:::i;:::-;17353:20;;16909:470;-1:-1:-1;;;;16909:470:1:o;17384:112::-;17416:1;17442;17432:35;;17447:18;;:::i;:::-;-1:-1:-1;17481:9:1;;17384:112::o;17501:410::-;17703:2;17685:21;;;17742:2;17722:18;;;17715:30;17781:34;17776:2;17761:18;;17754:62;-1:-1:-1;;;17847:2:1;17832:18;;17825:44;17901:3;17886:19;;17501:410::o;17916:135::-;17955:3;17976:17;;;17973:43;;17996:18;;:::i;:::-;-1:-1:-1;18043:1:1;18032:13;;17916:135::o;18056:125::-;18096:4;18124:1;18121;18118:8;18115:34;;;18129:18;;:::i;:::-;-1:-1:-1;18166:9:1;;18056:125::o;18186:128::-;18226:3;18257:1;18253:6;18250:1;18247:13;18244:39;;;18263:18;;:::i;:::-;-1:-1:-1;18299:9:1;;18186:128::o;18319:276::-;18450:3;18488:6;18482:13;18504:53;18550:6;18545:3;18538:4;18530:6;18526:17;18504:53;:::i;:::-;18573:16;;;;;18319:276;-1:-1:-1;;18319:276:1:o;19411:414::-;19613:2;19595:21;;;19652:2;19632:18;;;19625:30;19691:34;19686:2;19671:18;;19664:62;-1:-1:-1;;;19757:2:1;19742:18;;19735:48;19815:3;19800:19;;19411:414::o;20902:489::-;-1:-1:-1;;;;;21171:15:1;;;21153:34;;21223:15;;21218:2;21203:18;;21196:43;21270:2;21255:18;;21248:34;;;21318:3;21313:2;21298:18;;21291:31;;;21096:4;;21339:46;;21365:19;;21357:6;21339:46;:::i;:::-;21331:54;20902:489;-1:-1:-1;;;;;;20902:489:1:o;21396:249::-;21465:6;21518:2;21506:9;21497:7;21493:23;21489:32;21486:52;;;21534:1;21531;21524:12;21486:52;21566:9;21560:16;21585:30;21609:5;21585:30;:::i;21650:127::-;21711:10;21706:3;21702:20;21699:1;21692:31;21742:4;21739:1;21732:15;21766:4;21763:1;21756:15
Swarm Source
ipfs://51e1075efd55aca391e9a3975ff76cdc76b52cee565b1ee6ccbd5dbef76482fd
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.