Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 5496082 | 206 days ago | IN | 0 ETH | 0.09706992 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
NFT_Token
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-03-16 */ // SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.20; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } /** * @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; } } /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } /** * @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); } /** * @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); } /** * @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; } } /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(account), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string internal _name; // Token symbol string internal _symbol; //Token totalsupply uint256 private _totalSupply; // 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(uint256 => string) private _tokenURI; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } function totalSupply() public view returns(uint256) { return _totalSupply; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); return _tokenURI[tokenId]; } // function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { // require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); // string memory baseURI = _baseURI; // return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; // } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId, string memory url) internal virtual { _safeMint(to, tokenId, "", url); } /** * @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, string memory url ) internal virtual { _mint(to, tokenId); _tokenURI[tokenId] = url; require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; _totalSupply++; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256, /* firstTokenId */ uint256 batchSize ) internal virtual { if (batchSize > 1) { if (from != address(0)) { _balances[from] -= batchSize; } if (to != address(0)) { _balances[to] += batchSize; } } } /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} } /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _burn(tokenId); } } contract NFT_Token is ERC721, Pausable, AccessControl, ERC721Burnable { bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bool public isInitilized; constructor(){} function initilize(string memory name_,string memory symbol_, address _owner) external { require(!isInitilized,"AI"); _name = name_; _symbol = symbol_; _grantRole(DEFAULT_ADMIN_ROLE, _owner); _grantRole(PAUSER_ROLE, _owner); _grantRole(MINTER_ROLE, _owner); } function pause() public onlyRole(PAUSER_ROLE) { _pause(); } function unpause() public onlyRole(PAUSER_ROLE) { _unpause(); } function safeMint(address to, uint256 tokenId, string memory url) external onlyRole(MINTER_ROLE) returns(bool) { _safeMint(to, tokenId, url); return true; } function _beforeTokenTransfer(address from, address to, uint256 tokenId, uint256 batchSize) internal whenNotPaused override { super._beforeTokenTransfer(from, to, tokenId, batchSize); } // The following functions are overrides required by Solidity. function supportsInterface(bytes4 interfaceId) public view override(ERC721, AccessControl) returns (bool) { return super.supportsInterface(interfaceId); } }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"address","name":"_owner","type":"address"}],"name":"initilize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isInitilized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"url","type":"string"}],"name":"safeMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561000f575f80fd5b506008805460ff19169055611e5e806100275f395ff3fe608060405234801561000f575f80fd5b50600436106101c6575f3560e01c806370a08231116100fe578063b88d4fde1161009e578063d53913931161006e578063d5391393146103a9578063d547741f146103d0578063e63ab1e9146103e3578063e985e9c5146103f7575f80fd5b8063b88d4fde1461035d578063c192a8c014610370578063c87b56dd14610383578063cd279c7c14610396575f80fd5b806395d89b41116100d957806395d89b411461032e578063a217fddf14610336578063a22cb4651461033d578063a9689e2714610350575f80fd5b806370a08231146103005780638456cb591461031357806391d148541461031b575f80fd5b80632f2ff15d1161016957806342842e0e1161014457806342842e0e146102bc57806342966c68146102cf5780635c975abb146102e25780636352211e146102ed575f80fd5b80632f2ff15d1461028e57806336568abe146102a15780633f4ba83a146102b4575f80fd5b8063095ea7b3116101a4578063095ea7b31461023257806318160ddd1461024757806323b872dd14610259578063248a9ca31461026c575f80fd5b806301ffc9a7146101ca57806306fdde03146101f2578063081812fc14610207575b5f80fd5b6101dd6101d83660046116f7565b610432565b60405190151581526020015b60405180910390f35b6101fa610442565b6040516101e9919061175f565b61021a610215366004611771565b6104d1565b6040516001600160a01b0390911681526020016101e9565b6102456102403660046117a3565b6104f6565b005b6002545b6040519081526020016101e9565b6102456102673660046117cb565b61060f565b61024b61027a366004611771565b5f9081526009602052604090206001015490565b61024561029c366004611804565b610641565b6102456102af366004611804565b610665565b6102456106e3565b6102456102ca3660046117cb565b610705565b6102456102dd366004611771565b61071f565b60085460ff166101dd565b61021a6102fb366004611771565b61074d565b61024b61030e36600461182e565b6107ac565b610245610830565b6101dd610329366004611804565b61084f565b6101fa610879565b61024b5f81565b61024561034b366004611847565b610888565b600a546101dd9060ff1681565b61024561036b366004611907565b610893565b61024561037e36600461199c565b6108cb565b6101fa610391366004611771565b610967565b6101dd6103a4366004611a0b565b610a0d565b61024b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6102456103de366004611804565b610a4e565b61024b5f80516020611e0983398151915281565b6101dd610405366004611a5e565b6001600160a01b039182165f90815260076020908152604080832093909416825291909152205460ff1690565b5f61043c82610a72565b92915050565b60605f805461045090611a86565b80601f016020809104026020016040519081016040528092919081815260200182805461047c90611a86565b80156104c75780601f1061049e576101008083540402835291602001916104c7565b820191905f5260205f20905b8154815290600101906020018083116104aa57829003601f168201915b5050505050905090565b5f6104db82610a96565b505f908152600560205260409020546001600160a01b031690565b5f6105008261074d565b9050806001600160a01b0316836001600160a01b0316036105725760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b038216148061058e575061058e8133610405565b6106005760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610569565b61060a8383610af4565b505050565b61061a335b82610b61565b6106365760405162461bcd60e51b815260040161056990611abe565b61060a838383610bde565b5f8281526009602052604090206001015461065b81610d4d565b61060a8383610d57565b6001600160a01b03811633146106d55760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610569565b6106df8282610ddc565b5050565b5f80516020611e098339815191526106fa81610d4d565b610702610e42565b50565b61060a83838360405180602001604052805f815250610893565b61072833610614565b6107445760405162461bcd60e51b815260040161056990611abe565b61070281610e94565b5f818152600360205260408120546001600160a01b03168061043c5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610569565b5f6001600160a01b0382166108155760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610569565b506001600160a01b03165f9081526004602052604090205490565b5f80516020611e0983398151915261084781610d4d565b610702610f33565b5f9182526009602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606001805461045090611a86565b6106df338383610f70565b61089d3383610b61565b6108b95760405162461bcd60e51b815260040161056990611abe565b6108c58484848461103d565b50505050565b600a5460ff16156109035760405162461bcd60e51b8152602060048201526002602482015261414960f01b6044820152606401610569565b5f61090e8482611b58565b50600161091b8382611b58565b506109265f82610d57565b61093d5f80516020611e0983398151915282610d57565b61060a7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a682610d57565b606061097282610a96565b5f828152600660205260409020805461098a90611a86565b80601f01602080910402602001604051908101604052809291908181526020018280546109b690611a86565b8015610a015780601f106109d857610100808354040283529160200191610a01565b820191905f5260205f20905b8154815290600101906020018083116109e457829003601f168201915b50505050509050919050565b5f7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610a3881610d4d565b610a43858585611070565b506001949350505050565b5f82815260096020526040902060010154610a6881610d4d565b61060a8383610ddc565b5f6001600160e01b03198216637965db0b60e01b148061043c575061043c8261108a565b5f818152600360205260409020546001600160a01b03166107025760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610569565b5f81815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610b288261074d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f80610b6c8361074d565b9050806001600160a01b0316846001600160a01b03161480610bb257506001600160a01b038082165f9081526007602090815260408083209388168352929052205460ff165b80610bd65750836001600160a01b0316610bcb846104d1565b6001600160a01b0316145b949350505050565b826001600160a01b0316610bf18261074d565b6001600160a01b031614610c175760405162461bcd60e51b815260040161056990611c14565b6001600160a01b038216610c795760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610569565b610c8683838360016110d9565b826001600160a01b0316610c998261074d565b6001600160a01b031614610cbf5760405162461bcd60e51b815260040161056990611c14565b5f81815260056020908152604080832080546001600160a01b03199081169091556001600160a01b038781168086526004855283862080545f1901905590871680865283862080546001019055868652600390945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61070281336110ed565b610d61828261084f565b6106df575f8281526009602090815260408083206001600160a01b03851684529091529020805460ff19166001179055610d983390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610de6828261084f565b156106df575f8281526009602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b610e4a611146565b6008805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b5f610e9e8261074d565b9050610ead815f8460016110d9565b610eb68261074d565b5f83815260056020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526004845282852080545f190190558785526003909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b610f3b611191565b6008805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610e773390565b816001600160a01b0316836001600160a01b031603610fd15760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610569565b6001600160a01b038381165f81815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611048848484610bde565b611054848484846111d7565b6108c55760405162461bcd60e51b815260040161056990611c59565b61060a838360405180602001604052805f815250846112c9565b5f6001600160e01b031982166380ac58cd60e01b14806110ba57506001600160e01b03198216635b5e139f60e01b145b8061043c57506301ffc9a760e01b6001600160e01b031983161461043c565b6110e1611191565b6108c5848484846112f7565b6110f7828261084f565b6106df576111048161137d565b61110f83602061138f565b604051602001611120929190611cab565b60408051601f198184030181529082905262461bcd60e51b82526105699160040161175f565b60085460ff1661118f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610569565b565b60085460ff161561118f5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610569565b5f6001600160a01b0384163b15610a4357604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061121a903390899088908890600401611d1f565b6020604051808303815f875af1925050508015611254575060408051601f3d908101601f1916820190925261125191810190611d5b565b60015b6112af573d808015611281576040519150601f19603f3d011682016040523d82523d5f602084013e611286565b606091505b5080515f036112a75760405162461bcd60e51b815260040161056990611c59565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610bd6565b6112d3848461152c565b5f8381526006602052604090206112ea8282611b58565b506110545f8585856111d7565b60018111156108c5576001600160a01b0384161561133c576001600160a01b0384165f9081526004602052604081208054839290611336908490611d8a565b90915550505b6001600160a01b038316156108c5576001600160a01b0383165f9081526004602052604081208054839290611372908490611d9d565b909155505050505050565b606061043c6001600160a01b03831660145b60605f61139d836002611db0565b6113a8906002611d9d565b67ffffffffffffffff8111156113c0576113c0611880565b6040519080825280601f01601f1916602001820160405280156113ea576020820181803683370190505b509050600360fc1b815f8151811061140457611404611dc7565b60200101906001600160f81b03191690815f1a905350600f60fb1b8160018151811061143257611432611dc7565b60200101906001600160f81b03191690815f1a9053505f611454846002611db0565b61145f906001611d9d565b90505b60018111156114d6576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061149357611493611dc7565b1a60f81b8282815181106114a9576114a9611dc7565b60200101906001600160f81b03191690815f1a90535060049490941c936114cf81611ddb565b9050611462565b5083156115255760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610569565b9392505050565b6001600160a01b0382166115825760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610569565b5f818152600360205260409020546001600160a01b0316156115e65760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610569565b6115f35f838360016110d9565b5f818152600360205260409020546001600160a01b0316156116575760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610569565b6001600160a01b0382165f818152600460209081526040808320805460010190558483526003909152812080546001600160a01b03191690921790915560028054916116a283611df0565b909155505060405181906001600160a01b038416905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b031981168114610702575f80fd5b5f60208284031215611707575f80fd5b8135611525816116e2565b5f5b8381101561172c578181015183820152602001611714565b50505f910152565b5f815180845261174b816020860160208601611712565b601f01601f19169290920160200192915050565b602081525f6115256020830184611734565b5f60208284031215611781575f80fd5b5035919050565b80356001600160a01b038116811461179e575f80fd5b919050565b5f80604083850312156117b4575f80fd5b6117bd83611788565b946020939093013593505050565b5f805f606084860312156117dd575f80fd5b6117e684611788565b92506117f460208501611788565b9150604084013590509250925092565b5f8060408385031215611815575f80fd5b8235915061182560208401611788565b90509250929050565b5f6020828403121561183e575f80fd5b61152582611788565b5f8060408385031215611858575f80fd5b61186183611788565b915060208301358015158114611875575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f67ffffffffffffffff808411156118ae576118ae611880565b604051601f8501601f19908116603f011681019082821181831017156118d6576118d6611880565b816040528093508581528686860111156118ee575f80fd5b858560208301375f602087830101525050509392505050565b5f805f806080858703121561191a575f80fd5b61192385611788565b935061193160208601611788565b925060408501359150606085013567ffffffffffffffff811115611953575f80fd5b8501601f81018713611963575f80fd5b61197287823560208401611894565b91505092959194509250565b5f82601f83011261198d575f80fd5b61152583833560208501611894565b5f805f606084860312156119ae575f80fd5b833567ffffffffffffffff808211156119c5575f80fd5b6119d18783880161197e565b945060208601359150808211156119e6575f80fd5b506119f38682870161197e565b925050611a0260408501611788565b90509250925092565b5f805f60608486031215611a1d575f80fd5b611a2684611788565b925060208401359150604084013567ffffffffffffffff811115611a48575f80fd5b611a548682870161197e565b9150509250925092565b5f8060408385031215611a6f575f80fd5b611a7883611788565b915061182560208401611788565b600181811c90821680611a9a57607f821691505b602082108103611ab857634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b601f82111561060a575f81815260208120601f850160051c81016020861015611b315750805b601f850160051c820191505b81811015611b5057828155600101611b3d565b505050505050565b815167ffffffffffffffff811115611b7257611b72611880565b611b8681611b808454611a86565b84611b0b565b602080601f831160018114611bb9575f8415611ba25750858301515b5f19600386901b1c1916600185901b178555611b50565b5f85815260208120601f198616915b82811015611be757888601518255948401946001909101908401611bc8565b5085821015611c0457878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f8351611ce2816017850160208801611712565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611d13816028840160208801611712565b01602801949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90611d5190830184611734565b9695505050505050565b5f60208284031215611d6b575f80fd5b8151611525816116e2565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561043c5761043c611d76565b8082018082111561043c5761043c611d76565b808202811582820484141761043c5761043c611d76565b634e487b7160e01b5f52603260045260245ffd5b5f81611de957611de9611d76565b505f190190565b5f60018201611e0157611e01611d76565b506001019056fe65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862aa26469706673582212202daa4fffc71562ee0804515bc468317a7db97e5328cb2b667f20cea56a563d9e64736f6c63430008140033
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106101c6575f3560e01c806370a08231116100fe578063b88d4fde1161009e578063d53913931161006e578063d5391393146103a9578063d547741f146103d0578063e63ab1e9146103e3578063e985e9c5146103f7575f80fd5b8063b88d4fde1461035d578063c192a8c014610370578063c87b56dd14610383578063cd279c7c14610396575f80fd5b806395d89b41116100d957806395d89b411461032e578063a217fddf14610336578063a22cb4651461033d578063a9689e2714610350575f80fd5b806370a08231146103005780638456cb591461031357806391d148541461031b575f80fd5b80632f2ff15d1161016957806342842e0e1161014457806342842e0e146102bc57806342966c68146102cf5780635c975abb146102e25780636352211e146102ed575f80fd5b80632f2ff15d1461028e57806336568abe146102a15780633f4ba83a146102b4575f80fd5b8063095ea7b3116101a4578063095ea7b31461023257806318160ddd1461024757806323b872dd14610259578063248a9ca31461026c575f80fd5b806301ffc9a7146101ca57806306fdde03146101f2578063081812fc14610207575b5f80fd5b6101dd6101d83660046116f7565b610432565b60405190151581526020015b60405180910390f35b6101fa610442565b6040516101e9919061175f565b61021a610215366004611771565b6104d1565b6040516001600160a01b0390911681526020016101e9565b6102456102403660046117a3565b6104f6565b005b6002545b6040519081526020016101e9565b6102456102673660046117cb565b61060f565b61024b61027a366004611771565b5f9081526009602052604090206001015490565b61024561029c366004611804565b610641565b6102456102af366004611804565b610665565b6102456106e3565b6102456102ca3660046117cb565b610705565b6102456102dd366004611771565b61071f565b60085460ff166101dd565b61021a6102fb366004611771565b61074d565b61024b61030e36600461182e565b6107ac565b610245610830565b6101dd610329366004611804565b61084f565b6101fa610879565b61024b5f81565b61024561034b366004611847565b610888565b600a546101dd9060ff1681565b61024561036b366004611907565b610893565b61024561037e36600461199c565b6108cb565b6101fa610391366004611771565b610967565b6101dd6103a4366004611a0b565b610a0d565b61024b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6102456103de366004611804565b610a4e565b61024b5f80516020611e0983398151915281565b6101dd610405366004611a5e565b6001600160a01b039182165f90815260076020908152604080832093909416825291909152205460ff1690565b5f61043c82610a72565b92915050565b60605f805461045090611a86565b80601f016020809104026020016040519081016040528092919081815260200182805461047c90611a86565b80156104c75780601f1061049e576101008083540402835291602001916104c7565b820191905f5260205f20905b8154815290600101906020018083116104aa57829003601f168201915b5050505050905090565b5f6104db82610a96565b505f908152600560205260409020546001600160a01b031690565b5f6105008261074d565b9050806001600160a01b0316836001600160a01b0316036105725760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b038216148061058e575061058e8133610405565b6106005760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610569565b61060a8383610af4565b505050565b61061a335b82610b61565b6106365760405162461bcd60e51b815260040161056990611abe565b61060a838383610bde565b5f8281526009602052604090206001015461065b81610d4d565b61060a8383610d57565b6001600160a01b03811633146106d55760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610569565b6106df8282610ddc565b5050565b5f80516020611e098339815191526106fa81610d4d565b610702610e42565b50565b61060a83838360405180602001604052805f815250610893565b61072833610614565b6107445760405162461bcd60e51b815260040161056990611abe565b61070281610e94565b5f818152600360205260408120546001600160a01b03168061043c5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610569565b5f6001600160a01b0382166108155760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610569565b506001600160a01b03165f9081526004602052604090205490565b5f80516020611e0983398151915261084781610d4d565b610702610f33565b5f9182526009602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606001805461045090611a86565b6106df338383610f70565b61089d3383610b61565b6108b95760405162461bcd60e51b815260040161056990611abe565b6108c58484848461103d565b50505050565b600a5460ff16156109035760405162461bcd60e51b8152602060048201526002602482015261414960f01b6044820152606401610569565b5f61090e8482611b58565b50600161091b8382611b58565b506109265f82610d57565b61093d5f80516020611e0983398151915282610d57565b61060a7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a682610d57565b606061097282610a96565b5f828152600660205260409020805461098a90611a86565b80601f01602080910402602001604051908101604052809291908181526020018280546109b690611a86565b8015610a015780601f106109d857610100808354040283529160200191610a01565b820191905f5260205f20905b8154815290600101906020018083116109e457829003601f168201915b50505050509050919050565b5f7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610a3881610d4d565b610a43858585611070565b506001949350505050565b5f82815260096020526040902060010154610a6881610d4d565b61060a8383610ddc565b5f6001600160e01b03198216637965db0b60e01b148061043c575061043c8261108a565b5f818152600360205260409020546001600160a01b03166107025760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610569565b5f81815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610b288261074d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f80610b6c8361074d565b9050806001600160a01b0316846001600160a01b03161480610bb257506001600160a01b038082165f9081526007602090815260408083209388168352929052205460ff165b80610bd65750836001600160a01b0316610bcb846104d1565b6001600160a01b0316145b949350505050565b826001600160a01b0316610bf18261074d565b6001600160a01b031614610c175760405162461bcd60e51b815260040161056990611c14565b6001600160a01b038216610c795760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610569565b610c8683838360016110d9565b826001600160a01b0316610c998261074d565b6001600160a01b031614610cbf5760405162461bcd60e51b815260040161056990611c14565b5f81815260056020908152604080832080546001600160a01b03199081169091556001600160a01b038781168086526004855283862080545f1901905590871680865283862080546001019055868652600390945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61070281336110ed565b610d61828261084f565b6106df575f8281526009602090815260408083206001600160a01b03851684529091529020805460ff19166001179055610d983390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610de6828261084f565b156106df575f8281526009602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b610e4a611146565b6008805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b5f610e9e8261074d565b9050610ead815f8460016110d9565b610eb68261074d565b5f83815260056020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526004845282852080545f190190558785526003909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b610f3b611191565b6008805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610e773390565b816001600160a01b0316836001600160a01b031603610fd15760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610569565b6001600160a01b038381165f81815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611048848484610bde565b611054848484846111d7565b6108c55760405162461bcd60e51b815260040161056990611c59565b61060a838360405180602001604052805f815250846112c9565b5f6001600160e01b031982166380ac58cd60e01b14806110ba57506001600160e01b03198216635b5e139f60e01b145b8061043c57506301ffc9a760e01b6001600160e01b031983161461043c565b6110e1611191565b6108c5848484846112f7565b6110f7828261084f565b6106df576111048161137d565b61110f83602061138f565b604051602001611120929190611cab565b60408051601f198184030181529082905262461bcd60e51b82526105699160040161175f565b60085460ff1661118f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610569565b565b60085460ff161561118f5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610569565b5f6001600160a01b0384163b15610a4357604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061121a903390899088908890600401611d1f565b6020604051808303815f875af1925050508015611254575060408051601f3d908101601f1916820190925261125191810190611d5b565b60015b6112af573d808015611281576040519150601f19603f3d011682016040523d82523d5f602084013e611286565b606091505b5080515f036112a75760405162461bcd60e51b815260040161056990611c59565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610bd6565b6112d3848461152c565b5f8381526006602052604090206112ea8282611b58565b506110545f8585856111d7565b60018111156108c5576001600160a01b0384161561133c576001600160a01b0384165f9081526004602052604081208054839290611336908490611d8a565b90915550505b6001600160a01b038316156108c5576001600160a01b0383165f9081526004602052604081208054839290611372908490611d9d565b909155505050505050565b606061043c6001600160a01b03831660145b60605f61139d836002611db0565b6113a8906002611d9d565b67ffffffffffffffff8111156113c0576113c0611880565b6040519080825280601f01601f1916602001820160405280156113ea576020820181803683370190505b509050600360fc1b815f8151811061140457611404611dc7565b60200101906001600160f81b03191690815f1a905350600f60fb1b8160018151811061143257611432611dc7565b60200101906001600160f81b03191690815f1a9053505f611454846002611db0565b61145f906001611d9d565b90505b60018111156114d6576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061149357611493611dc7565b1a60f81b8282815181106114a9576114a9611dc7565b60200101906001600160f81b03191690815f1a90535060049490941c936114cf81611ddb565b9050611462565b5083156115255760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610569565b9392505050565b6001600160a01b0382166115825760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610569565b5f818152600360205260409020546001600160a01b0316156115e65760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610569565b6115f35f838360016110d9565b5f818152600360205260409020546001600160a01b0316156116575760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610569565b6001600160a01b0382165f818152600460209081526040808320805460010190558483526003909152812080546001600160a01b03191690921790915560028054916116a283611df0565b909155505060405181906001600160a01b038416905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b031981168114610702575f80fd5b5f60208284031215611707575f80fd5b8135611525816116e2565b5f5b8381101561172c578181015183820152602001611714565b50505f910152565b5f815180845261174b816020860160208601611712565b601f01601f19169290920160200192915050565b602081525f6115256020830184611734565b5f60208284031215611781575f80fd5b5035919050565b80356001600160a01b038116811461179e575f80fd5b919050565b5f80604083850312156117b4575f80fd5b6117bd83611788565b946020939093013593505050565b5f805f606084860312156117dd575f80fd5b6117e684611788565b92506117f460208501611788565b9150604084013590509250925092565b5f8060408385031215611815575f80fd5b8235915061182560208401611788565b90509250929050565b5f6020828403121561183e575f80fd5b61152582611788565b5f8060408385031215611858575f80fd5b61186183611788565b915060208301358015158114611875575f80fd5b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f67ffffffffffffffff808411156118ae576118ae611880565b604051601f8501601f19908116603f011681019082821181831017156118d6576118d6611880565b816040528093508581528686860111156118ee575f80fd5b858560208301375f602087830101525050509392505050565b5f805f806080858703121561191a575f80fd5b61192385611788565b935061193160208601611788565b925060408501359150606085013567ffffffffffffffff811115611953575f80fd5b8501601f81018713611963575f80fd5b61197287823560208401611894565b91505092959194509250565b5f82601f83011261198d575f80fd5b61152583833560208501611894565b5f805f606084860312156119ae575f80fd5b833567ffffffffffffffff808211156119c5575f80fd5b6119d18783880161197e565b945060208601359150808211156119e6575f80fd5b506119f38682870161197e565b925050611a0260408501611788565b90509250925092565b5f805f60608486031215611a1d575f80fd5b611a2684611788565b925060208401359150604084013567ffffffffffffffff811115611a48575f80fd5b611a548682870161197e565b9150509250925092565b5f8060408385031215611a6f575f80fd5b611a7883611788565b915061182560208401611788565b600181811c90821680611a9a57607f821691505b602082108103611ab857634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b601f82111561060a575f81815260208120601f850160051c81016020861015611b315750805b601f850160051c820191505b81811015611b5057828155600101611b3d565b505050505050565b815167ffffffffffffffff811115611b7257611b72611880565b611b8681611b808454611a86565b84611b0b565b602080601f831160018114611bb9575f8415611ba25750858301515b5f19600386901b1c1916600185901b178555611b50565b5f85815260208120601f198616915b82811015611be757888601518255948401946001909101908401611bc8565b5085821015611c0457878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f8351611ce2816017850160208801611712565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611d13816028840160208801611712565b01602801949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90611d5190830184611734565b9695505050505050565b5f60208284031215611d6b575f80fd5b8151611525816116e2565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561043c5761043c611d76565b8082018082111561043c5761043c611d76565b808202811582820484141761043c5761043c611d76565b634e487b7160e01b5f52603260045260245ffd5b5f81611de957611de9611d76565b505f190190565b5f60018201611e0157611e01611d76565b506001019056fe65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862aa26469706673582212202daa4fffc71562ee0804515bc468317a7db97e5328cb2b667f20cea56a563d9e64736f6c63430008140033
Deployed Bytecode Sourcemap
64099:1471:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65356:209;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;65356:209:0;;;;;;;;48495:100;;;:::i;:::-;;;;;;;:::i;50002:171::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;50002:171:0;1533:203:1;49520:416:0;;;;;;:::i;:::-;;:::i;:::-;;48776:90;48846:12;;48776:90;;;2324:25:1;;;2312:2;2297:18;48776:90:0;2178:177:1;50702:335:0;;;;;;:::i;:::-;;:::i;37063:131::-;;;;;;:::i;:::-;37137:7;37164:12;;;:6;:12;;;;;:22;;;;37063:131;37504:147;;;;;;:::i;:::-;;:::i;38648:218::-;;;;;;:::i;:::-;;:::i;64777:77::-;;;:::i;51108:185::-;;;;;;:::i;:::-;;:::i;63850:242::-;;;;;;:::i;:::-;;:::i;20101:86::-;20172:7;;;;20101:86;;48205:223;;;;;;:::i;:::-;;:::i;47936:207::-;;;;;;:::i;:::-;;:::i;64696:73::-;;;:::i;35536:147::-;;;;;;:::i;:::-;;:::i;48664:104::-;;;:::i;34641:49::-;;34686:4;34641:49;;50245:155;;;;;;:::i;:::-;;:::i;64314:24::-;;;;;;;;;51364:322;;;;;;:::i;:::-;;:::i;64370:318::-;;;;;;:::i;:::-;;:::i;48937:168::-;;;;;;:::i;:::-;;:::i;64862:179::-;;;;;;:::i;:::-;;:::i;64245:62::-;;64283:24;64245:62;;37944:149;;;;;;:::i;:::-;;:::i;64176:62::-;;-1:-1:-1;;;;;;;;;;;64176:62:0;;50471:164;;;;;;:::i;:::-;-1:-1:-1;;;;;50592:25:0;;;50568:4;50592:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;50471:164;65356:209;65492:4;65521:36;65545:11;65521:23;:36::i;:::-;65514:43;65356:209;-1:-1:-1;;65356:209:0:o;48495:100::-;48549:13;48582:5;48575:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48495:100;:::o;50002:171::-;50078:7;50098:23;50113:7;50098:14;:23::i;:::-;-1:-1:-1;50141:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;50141:24:0;;50002:171::o;49520:416::-;49601:13;49617:23;49632:7;49617:14;:23::i;:::-;49601:39;;49665:5;-1:-1:-1;;;;;49659:11:0;:2;-1:-1:-1;;;;;49659:11:0;;49651:57;;;;-1:-1:-1;;;49651:57:0;;7470:2:1;49651:57:0;;;7452:21:1;7509:2;7489:18;;;7482:30;7548:34;7528:18;;;7521:62;-1:-1:-1;;;7599:18:1;;;7592:31;7640:19;;49651:57:0;;;;;;;;;18458:10;-1:-1:-1;;;;;49743:21:0;;;;:62;;-1:-1:-1;49768:37:0;49785:5;18458:10;50471:164;:::i;49768:37::-;49721:173;;;;-1:-1:-1;;;49721:173:0;;7872:2:1;49721:173:0;;;7854:21:1;7911:2;7891:18;;;7884:30;7950:34;7930:18;;;7923:62;8021:31;8001:18;;;7994:59;8070:19;;49721:173:0;7670:425:1;49721:173:0;49907:21;49916:2;49920:7;49907:8;:21::i;:::-;49590:346;49520:416;;:::o;50702:335::-;50897:41;18458:10;50916:12;50930:7;50897:18;:41::i;:::-;50889:99;;;;-1:-1:-1;;;50889:99:0;;;;;;;:::i;:::-;51001:28;51011:4;51017:2;51021:7;51001:9;:28::i;37504:147::-;37137:7;37164:12;;;:6;:12;;;;;:22;;;35132:16;35143:4;35132:10;:16::i;:::-;37618:25:::1;37629:4;37635:7;37618:10;:25::i;38648:218::-:0;-1:-1:-1;;;;;38744:23:0;;18458:10;38744:23;38736:83;;;;-1:-1:-1;;;38736:83:0;;8716:2:1;38736:83:0;;;8698:21:1;8755:2;8735:18;;;8728:30;8794:34;8774:18;;;8767:62;-1:-1:-1;;;8845:18:1;;;8838:45;8900:19;;38736:83:0;8514:411:1;38736:83:0;38832:26;38844:4;38850:7;38832:11;:26::i;:::-;38648:218;;:::o;64777:77::-;-1:-1:-1;;;;;;;;;;;35132:16:0;35143:4;35132:10;:16::i;:::-;64836:10:::1;:8;:10::i;:::-;64777:77:::0;:::o;51108:185::-;51246:39;51263:4;51269:2;51273:7;51246:39;;;;;;;;;;;;:16;:39::i;63850:242::-;63968:41;18458:10;63987:12;18378:98;63968:41;63960:99;;;;-1:-1:-1;;;63960:99:0;;;;;;;:::i;:::-;64070:14;64076:7;64070:5;:14::i;48205:223::-;48277:7;53087:16;;;:7;:16;;;;;;-1:-1:-1;;;;;53087:16:0;;48341:56;;;;-1:-1:-1;;;48341:56:0;;9132:2:1;48341:56:0;;;9114:21:1;9171:2;9151:18;;;9144:30;-1:-1:-1;;;9190:18:1;;;9183:54;9254:18;;48341:56:0;8930:348:1;47936:207:0;48008:7;-1:-1:-1;;;;;48036:19:0;;48028:73;;;;-1:-1:-1;;;48028:73:0;;9485:2:1;48028:73:0;;;9467:21:1;9524:2;9504:18;;;9497:30;9563:34;9543:18;;;9536:62;-1:-1:-1;;;9614:18:1;;;9607:39;9663:19;;48028:73:0;9283:405:1;48028:73:0;-1:-1:-1;;;;;;48119:16:0;;;;;:9;:16;;;;;;;47936:207::o;64696:73::-;-1:-1:-1;;;;;;;;;;;35132:16:0;35143:4;35132:10;:16::i;:::-;64753:8:::1;:6;:8::i;35536:147::-:0;35622:4;35646:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;35646:29:0;;;;;;;;;;;;;;;35536:147::o;48664:104::-;48720:13;48753:7;48746:14;;;;;:::i;50245:155::-;50340:52;18458:10;50373:8;50383;50340:18;:52::i;51364:322::-;51538:41;18458:10;51571:7;51538:18;:41::i;:::-;51530:99;;;;-1:-1:-1;;;51530:99:0;;;;;;;:::i;:::-;51640:38;51654:4;51660:2;51664:7;51673:4;51640:13;:38::i;:::-;51364:322;;;;:::o;64370:318::-;64477:12;;;;64476:13;64468:27;;;;-1:-1:-1;;;64468:27:0;;9895:2:1;64468:27:0;;;9877:21:1;9934:1;9914:18;;;9907:29;-1:-1:-1;;;9952:18:1;;;9945:32;9994:18;;64468:27:0;9693:325:1;64468:27:0;64506:5;:13;64514:5;64506;:13;:::i;:::-;-1:-1:-1;64530:7:0;:17;64540:7;64530;:17;:::i;:::-;-1:-1:-1;64558:38:0;34686:4;64589:6;64558:10;:38::i;:::-;64607:31;-1:-1:-1;;;;;;;;;;;64631:6:0;64607:10;:31::i;:::-;64649;64283:24;64673:6;64649:10;:31::i;48937:168::-;49010:13;49036:23;49051:7;49036:14;:23::i;:::-;49079:18;;;;:9;:18;;;;;49072:25;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48937:168;;;:::o;64862:179::-;64967:4;64283:24;35132:16;35143:4;35132:10;:16::i;:::-;64984:27:::1;64994:2;64998:7;65007:3;64984:9;:27::i;:::-;-1:-1:-1::0;65029:4:0::1;::::0;64862:179;-1:-1:-1;;;;64862:179:0:o;37944:149::-;37137:7;37164:12;;;:6;:12;;;;;:22;;;35132:16;35143:4;35132:10;:16::i;:::-;38059:26:::1;38071:4;38077:7;38059:11;:26::i;35240:204::-:0;35325:4;-1:-1:-1;;;;;;35349:47:0;;-1:-1:-1;;;35349:47:0;;:87;;;35400:36;35424:11;35400:23;:36::i;59939:135::-;53489:4;53087:16;;;:7;:16;;;;;;-1:-1:-1;;;;;53087:16:0;60013:53;;;;-1:-1:-1;;;60013:53:0;;9132:2:1;60013:53:0;;;9114:21:1;9171:2;9151:18;;;9144:30;-1:-1:-1;;;9190:18:1;;;9183:54;9254:18;;60013:53:0;8930:348:1;59218:174:0;59293:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;59293:29:0;-1:-1:-1;;;;;59293:29:0;;;;;;;;:24;;59347:23;59293:24;59347:14;:23::i;:::-;-1:-1:-1;;;;;59338:46:0;;;;;;;;;;;59218:174;;:::o;53719:264::-;53812:4;53829:13;53845:23;53860:7;53845:14;:23::i;:::-;53829:39;;53898:5;-1:-1:-1;;;;;53887:16:0;:7;-1:-1:-1;;;;;53887:16:0;;:52;;;-1:-1:-1;;;;;;50592:25:0;;;50568:4;50592:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;53907:32;53887:87;;;;53967:7;-1:-1:-1;;;;;53943:31:0;:20;53955:7;53943:11;:20::i;:::-;-1:-1:-1;;;;;53943:31:0;;53887:87;53879:96;53719:264;-1:-1:-1;;;;53719:264:0:o;57836:1263::-;57995:4;-1:-1:-1;;;;;57968:31:0;:23;57983:7;57968:14;:23::i;:::-;-1:-1:-1;;;;;57968:31:0;;57960:81;;;;-1:-1:-1;;;57960:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;58060:16:0;;58052:65;;;;-1:-1:-1;;;58052:65:0;;12835:2:1;58052:65:0;;;12817:21:1;12874:2;12854:18;;;12847:30;12913:34;12893:18;;;12886:62;-1:-1:-1;;;12964:18:1;;;12957:34;13008:19;;58052:65:0;12633:400:1;58052:65:0;58130:42;58151:4;58157:2;58161:7;58170:1;58130:20;:42::i;:::-;58302:4;-1:-1:-1;;;;;58275:31:0;:23;58290:7;58275:14;:23::i;:::-;-1:-1:-1;;;;;58275:31:0;;58267:81;;;;-1:-1:-1;;;58267:81:0;;;;;;;:::i;:::-;58420:24;;;;:15;:24;;;;;;;;58413:31;;-1:-1:-1;;;;;;58413:31:0;;;;;;-1:-1:-1;;;;;58896:15:0;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;58896:20:0;;;58931:13;;;;;;;;;:18;;58413:31;58931:18;;;58971:16;;;:7;:16;;;;;;:21;;;;;;;;;;59010:27;;58436:7;;59010:27;;;49590:346;49520:416;;:::o;35987:105::-;36054:30;36065:4;18458:10;36054;:30::i;40245:238::-;40329:22;40337:4;40343:7;40329;:22::i;:::-;40324:152;;40368:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;40368:29:0;;;;;;;;;:36;;-1:-1:-1;;40368:36:0;40400:4;40368:36;;;40451:12;18458:10;;18378:98;40451:12;-1:-1:-1;;;;;40424:40:0;40442:7;-1:-1:-1;;;;;40424:40:0;40436:4;40424:40;;;;;;;;;;40245:238;;:::o;40663:239::-;40747:22;40755:4;40761:7;40747;:22::i;:::-;40743:152;;;40818:5;40786:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;40786:29:0;;;;;;;;;;:37;;-1:-1:-1;;40786:37:0;;;40843:40;18458:10;;40786:12;;40843:40;;40818:5;40843:40;40663:239;;:::o;20956:120::-;19965:16;:14;:16::i;:::-;21015:7:::1;:15:::0;;-1:-1:-1;;21015:15:0::1;::::0;;21046:22:::1;18458:10:::0;21055:12:::1;21046:22;::::0;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;21046:22:0::1;;;;;;;20956:120::o:0;56716:783::-;56776:13;56792:23;56807:7;56792:14;:23::i;:::-;56776:39;;56828:51;56849:5;56864:1;56868:7;56877:1;56828:20;:51::i;:::-;56992:23;57007:7;56992:14;:23::i;:::-;57063:24;;;;:15;:24;;;;;;;;57056:31;;-1:-1:-1;;;;;;57056:31:0;;;;;;-1:-1:-1;;;;;57308:16:0;;;;;:9;:16;;;;;:21;;-1:-1:-1;;57308:21:0;;;57358:16;;;:7;:16;;;;;;57351:23;;;;;;;57392:36;56984:31;;-1:-1:-1;57079:7:0;;57392:36;;57063:24;;57392:36;38648:218;;:::o;20697:118::-;19706:19;:17;:19::i;:::-;20757:7:::1;:14:::0;;-1:-1:-1;;20757:14:0::1;20767:4;20757:14;::::0;;20787:20:::1;20794:12;18458:10:::0;;18378:98;59535:315;59690:8;-1:-1:-1;;;;;59681:17:0;:5;-1:-1:-1;;;;;59681:17:0;;59673:55;;;;-1:-1:-1;;;59673:55:0;;13240:2:1;59673:55:0;;;13222:21:1;13279:2;13259:18;;;13252:30;13318:27;13298:18;;;13291:55;13363:18;;59673:55:0;13038:349:1;59673:55:0;-1:-1:-1;;;;;59739:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;59739:46:0;;;;;;;;;;59801:41;;540::1;;;59801::0;;513:18:1;59801:41:0;;;;;;;59535:315;;;:::o;52567:313::-;52723:28;52733:4;52739:2;52743:7;52723:9;:28::i;:::-;52770:47;52793:4;52799:2;52803:7;52812:4;52770:22;:47::i;:::-;52762:110;;;;-1:-1:-1;;;52762:110:0;;;;;;;:::i;54325:134::-;54420:31;54430:2;54434:7;54420:31;;;;;;;;;;;;54447:3;54420:9;:31::i;47567:305::-;47669:4;-1:-1:-1;;;;;;47706:40:0;;-1:-1:-1;;;47706:40:0;;:105;;-1:-1:-1;;;;;;;47763:48:0;;-1:-1:-1;;;47763:48:0;47706:105;:158;;;-1:-1:-1;;;;;;;;;;32784:40:0;;;47828:36;32675:157;65049:231;19706:19;:17;:19::i;:::-;65216:56:::1;65243:4;65249:2;65253:7;65262:9;65216:26;:56::i;36382:492::-:0;36471:22;36479:4;36485:7;36471;:22::i;:::-;36466:401;;36659:28;36679:7;36659:19;:28::i;:::-;36760:38;36788:4;36795:2;36760:19;:38::i;:::-;36564:257;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;36564:257:0;;;;;;;;;;-1:-1:-1;;;36510:345:0;;;;;;;:::i;20445:108::-;20172:7;;;;20504:41;;;;-1:-1:-1;;;20504:41:0;;14830:2:1;20504:41:0;;;14812:21:1;14869:2;14849:18;;;14842:30;-1:-1:-1;;;14888:18:1;;;14881:50;14948:18;;20504:41:0;14628:344:1;20504:41:0;20445:108::o;20260:::-;20172:7;;;;20330:9;20322:38;;;;-1:-1:-1;;;20322:38:0;;15179:2:1;20322:38:0;;;15161:21:1;15218:2;15198:18;;;15191:30;-1:-1:-1;;;15237:18:1;;;15230:46;15293:18;;20322:38:0;14977:340:1;60638:853:0;60792:4;-1:-1:-1;;;;;60813:13:0;;22457:19;:23;60809:675;;60849:71;;-1:-1:-1;;;60849:71:0;;-1:-1:-1;;;;;60849:36:0;;;;;:71;;18458:10;;60900:4;;60906:7;;60915:4;;60849:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60849:71:0;;;;;;;;-1:-1:-1;;60849:71:0;;;;;;;;;;;;:::i;:::-;;;60845:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61090:6;:13;61107:1;61090:18;61086:328;;61133:60;;-1:-1:-1;;;61133:60:0;;;;;;;:::i;61086:328::-;61364:6;61358:13;61349:6;61345:2;61341:15;61334:38;60845:584;-1:-1:-1;;;;;;60971:51:0;-1:-1:-1;;;60971:51:0;;-1:-1:-1;60964:58:0;;54686:382;54843:18;54849:2;54853:7;54843:5;:18::i;:::-;54872;;;;:9;:18;;;;;:24;54893:3;54872:18;:24;:::i;:::-;;54929:53;54960:1;54964:2;54968:7;54977:4;54929:22;:53::i;62223:410::-;62413:1;62401:9;:13;62397:229;;;-1:-1:-1;;;;;62435:18:0;;;62431:87;;-1:-1:-1;;;;;62474:15:0;;;;;;:9;:15;;;;;:28;;62493:9;;62474:15;:28;;62493:9;;62474:28;:::i;:::-;;;;-1:-1:-1;;62431:87:0;-1:-1:-1;;;;;62536:16:0;;;62532:83;;-1:-1:-1;;;;;62573:13:0;;;;;;:9;:13;;;;;:26;;62590:9;;62573:13;:26;;62590:9;;62573:26;:::i;:::-;;;;-1:-1:-1;;62223:410:0;;;;:::o;17680:151::-;17738:13;17771:52;-1:-1:-1;;;;;17783:22:0;;15835:2;17076:447;17151:13;17177:19;17209:10;17213:6;17209:1;:10;:::i;:::-;:14;;17222:1;17209:14;:::i;:::-;17199:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17199:25:0;;17177:47;;-1:-1:-1;;;17235:6:0;17242:1;17235:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;17235:15:0;;;;;;;;;-1:-1:-1;;;17261:6:0;17268:1;17261:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;17261:15:0;;;;;;;;-1:-1:-1;17292:9:0;17304:10;17308:6;17304:1;:10;:::i;:::-;:14;;17317:1;17304:14;:::i;:::-;17292:26;;17287:131;17324:1;17320;:5;17287:131;;;-1:-1:-1;;;17368:5:0;17376:3;17368:11;17359:21;;;;;;;:::i;:::-;;;;17347:6;17354:1;17347:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;17347:33:0;;;;;;;;-1:-1:-1;17405:1:0;17395:11;;;;;17327:3;;;:::i;:::-;;;17287:131;;;-1:-1:-1;17436:10:0;;17428:55;;;;-1:-1:-1;;;17428:55:0;;17113:2:1;17428:55:0;;;17095:21:1;;;17132:18;;;17125:30;17191:34;17171:18;;;17164:62;17243:18;;17428:55:0;16911:356:1;17428:55:0;17508:6;17076:447;-1:-1:-1;;;17076:447:0:o;55404:973::-;-1:-1:-1;;;;;55484:16:0;;55476:61;;;;-1:-1:-1;;;55476:61:0;;17474:2:1;55476:61:0;;;17456:21:1;;;17493:18;;;17486:30;17552:34;17532:18;;;17525:62;17604:18;;55476:61:0;17272:356:1;55476:61:0;53489:4;53087:16;;;:7;:16;;;;;;-1:-1:-1;;;;;53087:16:0;53513:31;55548:58;;;;-1:-1:-1;;;55548:58:0;;17835:2:1;55548:58:0;;;17817:21:1;17874:2;17854:18;;;17847:30;17913;17893:18;;;17886:58;17961:18;;55548:58:0;17633:352:1;55548:58:0;55627:48;55656:1;55660:2;55664:7;55673:1;55627:20;:48::i;:::-;53489:4;53087:16;;;:7;:16;;;;;;-1:-1:-1;;;;;53087:16:0;53513:31;55765:58;;;;-1:-1:-1;;;55765:58:0;;17835:2:1;55765:58:0;;;17817:21:1;17874:2;17854:18;;;17847:30;17913;17893:18;;;17886:58;17961:18;;55765:58:0;17633:352:1;55765:58:0;-1:-1:-1;;;;;56172:13:0;;;;;;:9;:13;;;;;;;;:18;;56189:1;56172:18;;;56214:16;;;:7;:16;;;;;:21;;-1:-1:-1;;;;;;56214:21:0;;;;;;;56246:12;:14;;;;;;:::i;:::-;;;;-1:-1:-1;;56276:33:0;;56301:7;;-1:-1:-1;;;;;56276:33:0;;;56293:1;;56276:33;;56293:1;;56276:33;38648:218;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2360:328::-;2437:6;2445;2453;2506:2;2494:9;2485:7;2481:23;2477:32;2474:52;;;2522:1;2519;2512:12;2474:52;2545:29;2564:9;2545:29;:::i;:::-;2535:39;;2593:38;2627:2;2616:9;2612:18;2593:38;:::i;:::-;2583:48;;2678:2;2667:9;2663:18;2650:32;2640:42;;2360:328;;;;;:::o;3060:254::-;3128:6;3136;3189:2;3177:9;3168:7;3164:23;3160:32;3157:52;;;3205:1;3202;3195:12;3157:52;3241:9;3228:23;3218:33;;3270:38;3304:2;3293:9;3289:18;3270:38;:::i;:::-;3260:48;;3060:254;;;;;:::o;3319:186::-;3378:6;3431:2;3419:9;3410:7;3406:23;3402:32;3399:52;;;3447:1;3444;3437:12;3399:52;3470:29;3489:9;3470:29;:::i;3510:347::-;3575:6;3583;3636:2;3624:9;3615:7;3611:23;3607:32;3604:52;;;3652:1;3649;3642:12;3604:52;3675:29;3694:9;3675:29;:::i;:::-;3665:39;;3754:2;3743:9;3739:18;3726:32;3801:5;3794:13;3787:21;3780:5;3777:32;3767:60;;3823:1;3820;3813:12;3767:60;3846:5;3836:15;;;3510:347;;;;;:::o;3862:127::-;3923:10;3918:3;3914:20;3911:1;3904:31;3954:4;3951:1;3944:15;3978:4;3975:1;3968:15;3994:631;4058:5;4088:18;4129:2;4121:6;4118:14;4115:40;;;4135:18;;:::i;:::-;4210:2;4204:9;4178:2;4264:15;;-1:-1:-1;;4260:24:1;;;4286:2;4256:33;4252:42;4240:55;;;4310:18;;;4330:22;;;4307:46;4304:72;;;4356:18;;:::i;:::-;4396:10;4392:2;4385:22;4425:6;4416:15;;4455:6;4447;4440:22;4495:3;4486:6;4481:3;4477:16;4474:25;4471:45;;;4512:1;4509;4502:12;4471:45;4562:6;4557:3;4550:4;4542:6;4538:17;4525:44;4617:1;4610:4;4601:6;4593;4589:19;4585:30;4578:41;;;;3994:631;;;;;:::o;4630:666::-;4725:6;4733;4741;4749;4802:3;4790:9;4781:7;4777:23;4773:33;4770:53;;;4819:1;4816;4809:12;4770:53;4842:29;4861:9;4842:29;:::i;:::-;4832:39;;4890:38;4924:2;4913:9;4909:18;4890:38;:::i;:::-;4880:48;;4975:2;4964:9;4960:18;4947:32;4937:42;;5030:2;5019:9;5015:18;5002:32;5057:18;5049:6;5046:30;5043:50;;;5089:1;5086;5079:12;5043:50;5112:22;;5165:4;5157:13;;5153:27;-1:-1:-1;5143:55:1;;5194:1;5191;5184:12;5143:55;5217:73;5282:7;5277:2;5264:16;5259:2;5255;5251:11;5217:73;:::i;:::-;5207:83;;;4630:666;;;;;;;:::o;5301:221::-;5344:5;5397:3;5390:4;5382:6;5378:17;5374:27;5364:55;;5415:1;5412;5405:12;5364:55;5437:79;5512:3;5503:6;5490:20;5483:4;5475:6;5471:17;5437:79;:::i;5527:617::-;5624:6;5632;5640;5693:2;5681:9;5672:7;5668:23;5664:32;5661:52;;;5709:1;5706;5699:12;5661:52;5749:9;5736:23;5778:18;5819:2;5811:6;5808:14;5805:34;;;5835:1;5832;5825:12;5805:34;5858:50;5900:7;5891:6;5880:9;5876:22;5858:50;:::i;:::-;5848:60;;5961:2;5950:9;5946:18;5933:32;5917:48;;5990:2;5980:8;5977:16;5974:36;;;6006:1;6003;5996:12;5974:36;;6029:52;6073:7;6062:8;6051:9;6047:24;6029:52;:::i;:::-;6019:62;;;6100:38;6134:2;6123:9;6119:18;6100:38;:::i;:::-;6090:48;;5527:617;;;;;:::o;6149:464::-;6236:6;6244;6252;6305:2;6293:9;6284:7;6280:23;6276:32;6273:52;;;6321:1;6318;6311:12;6273:52;6344:29;6363:9;6344:29;:::i;:::-;6334:39;;6420:2;6409:9;6405:18;6392:32;6382:42;;6475:2;6464:9;6460:18;6447:32;6502:18;6494:6;6491:30;6488:50;;;6534:1;6531;6524:12;6488:50;6557;6599:7;6590:6;6579:9;6575:22;6557:50;:::i;:::-;6547:60;;;6149:464;;;;;:::o;6618:260::-;6686:6;6694;6747:2;6735:9;6726:7;6722:23;6718:32;6715:52;;;6763:1;6760;6753:12;6715:52;6786:29;6805:9;6786:29;:::i;:::-;6776:39;;6834:38;6868:2;6857:9;6853:18;6834:38;:::i;6883:380::-;6962:1;6958:12;;;;7005;;;7026:61;;7080:4;7072:6;7068:17;7058:27;;7026:61;7133:2;7125:6;7122:14;7102:18;7099:38;7096:161;;7179:10;7174:3;7170:20;7167:1;7160:31;7214:4;7211:1;7204:15;7242:4;7239:1;7232:15;7096:161;;6883:380;;;:::o;8100:409::-;8302:2;8284:21;;;8341:2;8321:18;;;8314:30;8380:34;8375:2;8360:18;;8353:62;-1:-1:-1;;;8446:2:1;8431:18;;8424:43;8499:3;8484:19;;8100:409::o;10149:545::-;10251:2;10246:3;10243:11;10240:448;;;10287:1;10312:5;10308:2;10301:17;10357:4;10353:2;10343:19;10427:2;10415:10;10411:19;10408:1;10404:27;10398:4;10394:38;10463:4;10451:10;10448:20;10445:47;;;-1:-1:-1;10486:4:1;10445:47;10541:2;10536:3;10532:12;10529:1;10525:20;10519:4;10515:31;10505:41;;10596:82;10614:2;10607:5;10604:13;10596:82;;;10659:17;;;10640:1;10629:13;10596:82;;;10600:3;;;10149:545;;;:::o;10870:1352::-;10996:3;10990:10;11023:18;11015:6;11012:30;11009:56;;;11045:18;;:::i;:::-;11074:97;11164:6;11124:38;11156:4;11150:11;11124:38;:::i;:::-;11118:4;11074:97;:::i;:::-;11226:4;;11290:2;11279:14;;11307:1;11302:663;;;;12009:1;12026:6;12023:89;;;-1:-1:-1;12078:19:1;;;12072:26;12023:89;-1:-1:-1;;10827:1:1;10823:11;;;10819:24;10815:29;10805:40;10851:1;10847:11;;;10802:57;12125:81;;11272:944;;11302:663;10096:1;10089:14;;;10133:4;10120:18;;-1:-1:-1;;11338:20:1;;;11456:236;11470:7;11467:1;11464:14;11456:236;;;11559:19;;;11553:26;11538:42;;11651:27;;;;11619:1;11607:14;;;;11486:19;;11456:236;;;11460:3;11720:6;11711:7;11708:19;11705:201;;;11781:19;;;11775:26;-1:-1:-1;;11864:1:1;11860:14;;;11876:3;11856:24;11852:37;11848:42;11833:58;11818:74;;11705:201;-1:-1:-1;;;;;11952:1:1;11936:14;;;11932:22;11919:36;;-1:-1:-1;10870:1352:1:o;12227:401::-;12429:2;12411:21;;;12468:2;12448:18;;;12441:30;12507:34;12502:2;12487:18;;12480:62;-1:-1:-1;;;12573:2:1;12558:18;;12551:35;12618:3;12603:19;;12227:401::o;13392:414::-;13594:2;13576:21;;;13633:2;13613:18;;;13606:30;13672:34;13667:2;13652:18;;13645:62;-1:-1:-1;;;13738:2:1;13723:18;;13716:48;13796:3;13781:19;;13392:414::o;13811:812::-;14222:25;14217:3;14210:38;14192:3;14277:6;14271:13;14293:75;14361:6;14356:2;14351:3;14347:12;14340:4;14332:6;14328:17;14293:75;:::i;:::-;-1:-1:-1;;;14427:2:1;14387:16;;;14419:11;;;14412:40;14477:13;;14499:76;14477:13;14561:2;14553:11;;14546:4;14534:17;;14499:76;:::i;:::-;14595:17;14614:2;14591:26;;13811:812;-1:-1:-1;;;;13811:812:1:o;15322:489::-;-1:-1:-1;;;;;15591:15:1;;;15573:34;;15643:15;;15638:2;15623:18;;15616:43;15690:2;15675:18;;15668:34;;;15738:3;15733:2;15718:18;;15711:31;;;15516:4;;15759:46;;15785:19;;15777:6;15759:46;:::i;:::-;15751:54;15322:489;-1:-1:-1;;;;;;15322:489:1:o;15816:249::-;15885:6;15938:2;15926:9;15917:7;15913:23;15909:32;15906:52;;;15954:1;15951;15944:12;15906:52;15986:9;15980:16;16005:30;16029:5;16005:30;:::i;16070:127::-;16131:10;16126:3;16122:20;16119:1;16112:31;16162:4;16159:1;16152:15;16186:4;16183:1;16176:15;16202:128;16269:9;;;16290:11;;;16287:37;;;16304:18;;:::i;16335:125::-;16400:9;;;16421:10;;;16418:36;;;16434:18;;:::i;16465:168::-;16538:9;;;16569;;16586:15;;;16580:22;;16566:37;16556:71;;16607:18;;:::i;16638:127::-;16699:10;16694:3;16690:20;16687:1;16680:31;16730:4;16727:1;16720:15;16754:4;16751:1;16744:15;16770:136;16809:3;16837:5;16827:39;;16846:18;;:::i;:::-;-1:-1:-1;;;16882:18:1;;16770:136::o;17990:135::-;18029:3;18050:17;;;18047:43;;18070:18;;:::i;:::-;-1:-1:-1;18117:1:1;18106:13;;17990:135::o
Swarm Source
ipfs://2daa4fffc71562ee0804515bc468317a7db97e5328cb2b667f20cea56a563d9e
Loading...
Loading
[ 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.