ERC-1155
Overview
Max Total Supply
1,674
Holders
1,645
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
NftNowPodcast
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-09-08 */ // File: @openzeppelin/contracts/utils/math/SignedMath.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 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 256, 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 << 3) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @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 Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV // Deprecated in v4.8 } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) { // 32 is the length in bytes of hash, // enforced by the type signature above /// @solidity memory-safe-assembly assembly { mstore(0x00, "\x19Ethereum Signed Message:\n32") mstore(0x1c, hash) message := keccak256(0x00, 0x3c) } } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, "\x19\x01") mstore(add(ptr, 0x02), domainSeparator) mstore(add(ptr, 0x22), structHash) data := keccak256(ptr, 0x42) } } /** * @dev Returns an Ethereum Signed Data with intended validator, created from a * `validator` and `data` according to the version 0 of EIP-191. * * See {recover}. */ function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x00", validator, data)); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [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://consensys.net/diligence/blog/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.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch( address[] calldata accounts, uint256[] calldata ids ) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: address zero is not a valid owner"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch( address[] memory accounts, uint256[] memory ids ) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner or approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint(address to, uint256 id, uint256 amount, bytes memory data) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Emits a {TransferSingle} event. * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn(address from, uint256 id, uint256 amount) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch(address from, uint256[] memory ids, uint256[] memory amounts) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @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, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `ids` and `amounts` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non-ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } // File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol) pragma solidity ^0.8.0; /** * @dev Extension of ERC1155 that adds tracking of total supply per id. * * Useful for scenarios where Fungible and Non-fungible tokens have to be * clearly identified. Note: While a totalSupply of 1 might mean the * corresponding is an NFT, there is no guarantees that no other token with the * same id are not going to be minted. */ abstract contract ERC1155Supply is ERC1155 { mapping(uint256 => uint256) private _totalSupply; /** * @dev Total amount of tokens in with a given id. */ function totalSupply(uint256 id) public view virtual returns (uint256) { return _totalSupply[id]; } /** * @dev Indicates whether any token exist with a given id, or not. */ function exists(uint256 id) public view virtual returns (bool) { return ERC1155Supply.totalSupply(id) > 0; } /** * @dev See {ERC1155-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); if (from == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { _totalSupply[ids[i]] += amounts[i]; } } if (to == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 supply = _totalSupply[id]; require(supply >= amount, "ERC1155: burn amount exceeds totalSupply"); unchecked { _totalSupply[id] = supply - amount; } } } } } // File: contracts/NftNowPodcast.sol pragma solidity ^0.8.15; contract NftNowPodcast is ERC1155, Ownable, ERC1155Supply { using ECDSA for bytes32; using Strings for uint256; // Define struct for TokenInfo struct TokenInfo { bool exists; bool mintable; bool claimable; bool hasAllowlist; uint256 publicCost; uint256 maxAmount; uint256 maxPerUser; string metadataUrl; } // Define struct for publication description struct Podcast { string season; string title; string guest; string description; uint timestamp; } Podcast[] public podcasts; //*****Variables string public name; bool paused = true; address private _signerAddress; //*****MAPPINGS // Mapping from token id to token info mapping(uint256 => TokenInfo) public tokenInfos; //Mapping who has claimed 1 free per tokenId mapping(uint => mapping(address => bool)) public alreadyClaimed; //Mapping for max mint per user mapping(uint => mapping(address => uint)) public addressMintedBalance; //*****EVENTS // Define event for when a new podcast is created event PodcastCreated(uint podcastId, string title, string guest, uint timestamp); // Define event for when a new podcast is minted event PodcastMinted(uint podcastId, uint timestamp); // Define event for when a podcast is updated event PodcastUpdated(uint podcastId, uint timestamp, string metadataUrl); //Define event for airdropping tokens event PodcastAirdropped(uint podcastId, uint timestamp); constructor(string memory _name) ERC1155("NftNowPodcast") payable { name = _name; } //******************************************************************************************* //******************************************************************************************* //*****Creator function // Function to create a new podcast function createPodcast(string memory _season, string memory _title, string memory _guest, string memory _description, uint256 _tokenId, uint _publicCost, uint _maxAmount, uint _maxPerUser, string memory _metadataUrl, uint _reserveAmount, address _reserveAddy) public onlyOwner { // Add new podcast to podcast array podcasts.push(Podcast(_season, _title, _guest, _description, block.timestamp)); //Add tokenId to array for 1155s add(_tokenId, _publicCost, _maxAmount, _maxPerUser, _metadataUrl); //Optionally mint some to specified wallet if (_reserveAmount > 0) { _mint(_reserveAddy, _tokenId, _reserveAmount, ""); } // Emit PodcastCreated event emit PodcastCreated(podcasts.length - 1, _title, _guest, block.timestamp); } //******************************************************************************************* //******************************************************************************************* //*****Distribution functions function mint(uint256 tokenId, uint256 amount) public payable { // Get token information for token id TokenInfo memory tokenInfo = tokenInfos[tokenId]; // Get amount of already minted tokens for this tokenId uint256 minted = super.totalSupply(tokenId); //Require contract is not paused require(paused == false, "contract is currently paused"); // Ensure token id exists require(tokenInfo.exists, "Token with given id does not exists"); // Ensure tokenId is mintable require(tokenInfo.mintable == true, "Token not mintable"); // Ensure tokenId allowlist time elapsed require(tokenInfo.hasAllowlist == false, "Allowlist only"); // Prevent minting more than allowed by the contract require((minted + amount) < tokenInfo.maxAmount + 1, "Too many tokens"); //Max amount to mint per wallet require((balanceOf(msg.sender,tokenId) + amount) < tokenInfo.maxPerUser + 1 ,"Too many tokens per User"); //Number of already minted by user require(addressMintedBalance[tokenId][msg.sender] + amount < tokenInfo.maxPerUser + 1, "You have exceed maxMintAmount"); //Require eth sent require(tokenInfos[tokenId].publicCost * amount <= msg.value, "Not Enough ETH sent"); addressMintedBalance[tokenId][msg.sender] += amount; // Mint token _mint(msg.sender, tokenId, amount, ""); // Emit PodcastMinted event emit PodcastMinted(tokenId, block.timestamp); } //Allowlist Mint function allowlistMint(uint256 tokenId, uint256 amount, bytes calldata signature) public payable { // Get token information for token id TokenInfo memory tokenInfo = tokenInfos[tokenId]; // Get amount of already minted tokens for this tokenId uint256 minted = super.totalSupply(tokenId); //Require contract is not paused require(paused == false, "contract is currently paused"); // Ensure tokenId is mintable require(tokenInfo.mintable == true, "Token not mintable"); // Ensure tokenId has allowlist require(tokenInfo.hasAllowlist == true, "Token not allowed"); // Require Token Exists require(tokenInfo.exists, "Token with given id does not exists"); // Prevent minting more than allowed require((minted + amount) < tokenInfo.maxAmount + 1, "Too many tokens"); //Max amount to mint per wallet require((balanceOf(msg.sender,tokenId) + amount) < tokenInfo.maxPerUser + 1 ,"Too many tokens per User"); //Number of already minted by user require(addressMintedBalance[tokenId][msg.sender] + amount < tokenInfo.maxPerUser + 1, "You have exceed maxMintAmount"); //Verify ECDSA require(_signerAddress == keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", bytes32(uint256(uint160(msg.sender))) ) ).recover(signature), "Signer address mismatch."); //Require eth sent require(tokenInfos[tokenId].publicCost * amount <= msg.value, "Not Enough ETH sent"); addressMintedBalance[tokenId][msg.sender] += amount; // Mint token _mint(msg.sender,tokenId, amount, ""); emit PodcastMinted(tokenId, block.timestamp); } //Allows user to claim 1 free tokenId based on ECDSA signature function claim(uint256 tokenId, bytes calldata signature) public payable { // Get token information for token id TokenInfo memory tokenInfo = tokenInfos[tokenId]; // Get amount of already minted tokens for this tokenId uint256 minted = super.totalSupply(tokenId); //Require contract is not paused require(paused == false, "Contract is currently paused"); // Require Token Exists require(tokenInfo.exists, "Token with given id does not exists"); //Require token is claimable require(tokenInfo.claimable == true, "Not claimable"); // Prevent minting more than allowed require((minted + 1) < tokenInfo.maxAmount + 1, "Too many tokens"); //Require 1 per user signature require(alreadyClaimed[tokenId][msg.sender] == false, "ONLY 1 PER FREE CLAIM"); //Verify ECDSA require(_signerAddress == keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", bytes32(uint256(uint160(msg.sender))) ) ).recover(signature), "Signer address mismatch."); alreadyClaimed[tokenId][msg.sender] = true; _mint(msg.sender,tokenId, 1, ""); emit PodcastMinted(tokenId, block.timestamp); } function testBytesReturn() external view returns (bytes32) { return bytes32(uint256(uint160(msg.sender))); } function testSignerRecovery(bytes calldata signature) external view returns (address) { return keccak256( abi.encodePacked( "\x19Ethereum Signed Message:\n32", bytes32(uint256(uint160(msg.sender))) ) ).recover(signature); } //Allows owner to airdrop token to multiple users //WARNING for onlyOwner: No checks performed. Use with caution. function bulkDrop(address[] calldata users, uint tokenId) external onlyOwner{ for (uint256 i; i < users.length; i++) { _mint(users[i], tokenId, 1, ""); } emit PodcastAirdropped(tokenId, block.timestamp); } //******************************************************************************************* //******************************************************************************************* //*****Data functions // Token level metadata function uri(uint256 tokenId) public view override returns (string memory) { return tokenInfos[tokenId].metadataUrl; } // Function to get all podcasts function getAllPodcasts() public view returns (Podcast[] memory) { return podcasts; } // Function to get a podcast by ID function getPodcastById(uint _podcastId) public view returns (Podcast memory) { return podcasts[_podcastId]; } //******************************************************************************************* //******************************************************************************************* //*****Internal functions function add(uint256 tokenId, uint256 publicCost, uint256 maxAmountAllowed, uint256 maxPerUser, string memory metadataUrl) internal { // Ensure we can only add and not override require(!tokenInfos[tokenId].exists, "Token with given id already exists"); // Add token informations for token id tokenInfos[tokenId] = TokenInfo(true, false, false, false, publicCost, maxAmountAllowed, maxPerUser, metadataUrl); } //******************************************************************************************* //******************************************************************************************* //*****OnlyOwner functions //withdraws all remaining funds from the smart contract //send ZERO value to when calling function withdraw() public payable onlyOwner { (bool success, ) = payable(msg.sender).call{value: address(this).balance}(""); require(success); } //Pause the entire contract function pause(bool _state) public onlyOwner(){ paused = _state; } //Update signature required for ECDSA claims function newSigner(address _newSigner) public onlyOwner{ _signerAddress = _newSigner; } // Update token metadataURI for token id to allow edits function editURI(uint tokenId, string memory _metadataUrl) public onlyOwner{ require(tokenInfos[tokenId].exists, "Token with given id does not exist"); tokenInfos[tokenId].metadataUrl = _metadataUrl; emit PodcastUpdated(tokenId, block.timestamp, _metadataUrl); } //Set mintable state for tokenId function setMintable(uint tokenId, bool _state) public onlyOwner{ tokenInfos[tokenId].mintable = _state; } //Set claimable state for tokenId function setClaimable(uint tokenId, bool _state) public onlyOwner{ tokenInfos[tokenId].claimable = _state; } //Set allowlist state for tokenId function setAllowlist(uint tokenId, bool _state) public onlyOwner{ tokenInfos[tokenId].hasAllowlist = _state; } //Set paused state for contract function isPaused() public view returns(bool){ return paused; } //******************************************************************************************* //******************************************************************************************* //*****Aux functions function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal override(ERC1155, ERC1155Supply) { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"podcastId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"PodcastAirdropped","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"podcastId","type":"uint256"},{"indexed":false,"internalType":"string","name":"title","type":"string"},{"indexed":false,"internalType":"string","name":"guest","type":"string"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"PodcastCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"podcastId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"PodcastMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"podcastId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"string","name":"metadataUrl","type":"string"}],"name":"PodcastUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"allowlistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"alreadyClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"bulkDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_season","type":"string"},{"internalType":"string","name":"_title","type":"string"},{"internalType":"string","name":"_guest","type":"string"},{"internalType":"string","name":"_description","type":"string"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_publicCost","type":"uint256"},{"internalType":"uint256","name":"_maxAmount","type":"uint256"},{"internalType":"uint256","name":"_maxPerUser","type":"uint256"},{"internalType":"string","name":"_metadataUrl","type":"string"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"},{"internalType":"address","name":"_reserveAddy","type":"address"}],"name":"createPodcast","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_metadataUrl","type":"string"}],"name":"editURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllPodcasts","outputs":[{"components":[{"internalType":"string","name":"season","type":"string"},{"internalType":"string","name":"title","type":"string"},{"internalType":"string","name":"guest","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct NftNowPodcast.Podcast[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_podcastId","type":"uint256"}],"name":"getPodcastById","outputs":[{"components":[{"internalType":"string","name":"season","type":"string"},{"internalType":"string","name":"title","type":"string"},{"internalType":"string","name":"guest","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct NftNowPodcast.Podcast","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newSigner","type":"address"}],"name":"newSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"podcasts","outputs":[{"internalType":"string","name":"season","type":"string"},{"internalType":"string","name":"title","type":"string"},{"internalType":"string","name":"guest","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"_state","type":"bool"}],"name":"setAllowlist","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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"_state","type":"bool"}],"name":"setClaimable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"_state","type":"bool"}],"name":"setMintable","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":"testBytesReturn","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"testSignerRecovery","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenInfos","outputs":[{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"bool","name":"mintable","type":"bool"},{"internalType":"bool","name":"claimable","type":"bool"},{"internalType":"bool","name":"hasAllowlist","type":"bool"},{"internalType":"uint256","name":"publicCost","type":"uint256"},{"internalType":"uint256","name":"maxAmount","type":"uint256"},{"internalType":"uint256","name":"maxPerUser","type":"uint256"},{"internalType":"string","name":"metadataUrl","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
608060408190526007805460ff19166001179055620049fd388190039081908339810160408190526200003291620000fd565b60408051808201909152600d81526c13999d139bddd41bd918d85cdd609a1b6020820152620000618162000083565b506200006d3362000095565b60066200007b828262000261565b50506200032d565b600262000091828262000261565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600060208083850312156200011157600080fd5b82516001600160401b03808211156200012957600080fd5b818501915085601f8301126200013e57600080fd5b815181811115620001535762000153620000e7565b604051601f8201601f19908116603f011681019083821181831017156200017e576200017e620000e7565b8160405282815288868487010111156200019757600080fd5b600093505b82841015620001bb57848401860151818501870152928501926200019c565b600086848301015280965050505050505092915050565b600181811c90821680620001e757607f821691505b6020821081036200020857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200025c57600081815260208120601f850160051c81016020861015620002375750805b601f850160051c820191505b81811015620002585782815560010162000243565b5050505b505050565b81516001600160401b038111156200027d576200027d620000e7565b62000295816200028e8454620001d2565b846200020e565b602080601f831160018114620002cd5760008415620002b45750858301515b600019600386901b1c1916600185901b17855562000258565b600085815260208120601f198616915b82811015620002fe57888601518255948401946001909101908401620002dd565b50858210156200031d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6146c0806200033d6000396000f3fe6080604052600436106102335760003560e01c8063715018a611610138578063bd85b039116100b0578063ddc156a31161007f578063f076aa4311610064578063f076aa43146106cb578063f242432a146106eb578063f2fde38b1461070b57600080fd5b8063ddc156a31461066f578063e985e9c51461068257600080fd5b8063bd85b039146105e0578063c83066ac1461060d578063cbf1b53e1461062f578063d2c0a6ea1461064f57600080fd5b80638c04f6a211610107578063a22cb465116100ec578063a22cb46514610588578063a50e33d0146105a8578063b187bd26146105c857600080fd5b80638c04f6a2146105365780638da5cb5b1461055657600080fd5b8063715018a6146104a257806372c7be6d146104b757806379b655d4146104ef5780637c13774b1461050257600080fd5b80632abebe36116101cb5780633ccfd60b1161019a5780634e1273f41161017f5780634e1273f4146104195780634f558e791461044657806363f141831461047557600080fd5b80633ccfd60b146103f15780633dc2a843146103f957600080fd5b80632abebe361461037e5780632eb2c2d61461039e5780633450ea3c146103be57806338926b6d146103de57600080fd5b80630e89341c116102075780630e89341c146102df57806311017721146102ff5780631b2ef1ca1461033a5780632788072d1461034d57600080fd5b8062fdd58e1461023857806301ffc9a71461026b57806302329a291461029b57806306fdde03146102bd575b600080fd5b34801561024457600080fd5b506102586102533660046138d9565b61072b565b6040519081526020015b60405180910390f35b34801561027757600080fd5b5061028b610286366004613919565b6107d7565b6040519015158152602001610262565b3480156102a757600080fd5b506102bb6102b6366004613946565b610872565b005b3480156102c957600080fd5b506102d261088d565b60405161026291906139a7565b3480156102eb57600080fd5b506102d26102fa3660046139ba565b61091b565b34801561030b57600080fd5b5061028b61031a3660046139d3565b600960209081526000928352604080842090915290825290205460ff1681565b6102bb6103483660046139ff565b6109c0565b34801561035957600080fd5b5061036d6103683660046139ba565b610e81565b604051610262959493929190613a21565b34801561038a57600080fd5b506102bb610399366004613a81565b6110e7565b3480156103aa57600080fd5b506102bb6103b9366004613bf0565b611116565b3480156103ca57600080fd5b506102bb6103d9366004613c9a565b6111b8565b6102bb6103ec366004613df6565b6112fc565b6102bb611764565b34801561040557600080fd5b506102bb610414366004613e42565b6117c4565b34801561042557600080fd5b50610439610434366004613e5d565b61180b565b6040516102629190613f63565b34801561045257600080fd5b5061028b6104613660046139ba565b600090815260046020526040902054151590565b34801561048157600080fd5b506104956104903660046139ba565b611949565b6040516102629190613fef565b3480156104ae57600080fd5b506102bb611c00565b3480156104c357600080fd5b506102586104d23660046139d3565b600a60209081526000928352604080842090915290825290205481565b6102bb6104fd366004614002565b611c14565b34801561050e57600080fd5b5061052261051d3660046139ba565b6121af565b604051610262989796959493929190614055565b34801561054257600080fd5b506102bb6105513660046140aa565b61228c565b34801561056257600080fd5b506003546001600160a01b03165b6040516001600160a01b039091168152602001610262565b34801561059457600080fd5b506102bb6105a3366004614125565b612331565b3480156105b457600080fd5b506102bb6105c3366004613a81565b612340565b3480156105d457600080fd5b5060075460ff1661028b565b3480156105ec57600080fd5b506102586105fb3660046139ba565b60009081526004602052604090205490565b34801561061957600080fd5b50610622612373565b604051610262919061414f565b34801561063b57600080fd5b5061057061064a3660046141b1565b612624565b34801561065b57600080fd5b506102bb61066a3660046141f3565b61269f565b34801561067b57600080fd5b5033610258565b34801561068e57600080fd5b5061028b61069d366004614230565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b3480156106d757600080fd5b506102bb6106e6366004613a81565b612786565b3480156106f757600080fd5b506102bb61070636600461425a565b6127b7565b34801561071757600080fd5b506102bb610726366004613e42565b612852565b60006001600160a01b0383166107ae5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201527f616c6964206f776e65720000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b031982167fd9b67a2600000000000000000000000000000000000000000000000000000000148061083a57506001600160e01b031982167f0e89341c00000000000000000000000000000000000000000000000000000000145b806107d157507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316146107d1565b61087a6128df565b6007805460ff1916911515919091179055565b6006805461089a906142bf565b80601f01602080910402602001604051908101604052809291908181526020018280546108c6906142bf565b80156109135780601f106108e857610100808354040283529160200191610913565b820191906000526020600020905b8154815290600101906020018083116108f657829003601f168201915b505050505081565b600081815260086020526040902060040180546060919061093b906142bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610967906142bf565b80156109b45780601f10610989576101008083540402835291602001916109b4565b820191906000526020600020905b81548152906001019060200180831161099757829003601f168201915b50505050509050919050565b600082815260086020908152604080832081516101008082018452825460ff808216151584529181048216151595830195909552620100008504811615159382019390935263010000009093049091161515606083015260018101546080830152600281015460a0830152600381015460c083015260048101805460e084019190610a4a906142bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610a76906142bf565b8015610ac35780601f10610a9857610100808354040283529160200191610ac3565b820191906000526020600020905b815481529060010190602001808311610aa657829003601f168201915b50505050508152505090506000610ae68460009081526004602052604090205490565b60075490915060ff1615610b3c5760405162461bcd60e51b815260206004820152601c60248201527f636f6e74726163742069732063757272656e746c79207061757365640000000060448201526064016107a5565b8151610b965760405162461bcd60e51b815260206004820152602360248201527f546f6b656e207769746820676976656e20696420646f6573206e6f742065786960448201526273747360e81b60648201526084016107a5565b60208201511515600114610bec5760405162461bcd60e51b815260206004820152601260248201527f546f6b656e206e6f74206d696e7461626c65000000000000000000000000000060448201526064016107a5565b606082015115610c3e5760405162461bcd60e51b815260206004820152600e60248201527f416c6c6f776c697374206f6e6c7900000000000000000000000000000000000060448201526064016107a5565b60a0820151610c4e90600161430f565b610c58848361430f565b10610c975760405162461bcd60e51b815260206004820152600f60248201526e546f6f206d616e7920746f6b656e7360881b60448201526064016107a5565b60c0820151610ca790600161430f565b83610cb2338761072b565b610cbc919061430f565b10610d095760405162461bcd60e51b815260206004820152601860248201527f546f6f206d616e7920746f6b656e73207065722055736572000000000000000060448201526064016107a5565b60c0820151610d1990600161430f565b6000858152600a60209081526040808320338452909152902054610d3e90859061430f565b10610d8b5760405162461bcd60e51b815260206004820152601d60248201527f596f75206861766520657863656564206d61784d696e74416d6f756e7400000060448201526064016107a5565b6000848152600860205260409020600101543490610daa908590614322565b1115610df85760405162461bcd60e51b815260206004820152601360248201527f4e6f7420456e6f756768204554482073656e740000000000000000000000000060448201526064016107a5565b6000848152600a6020908152604080832033845290915281208054859290610e2190849061430f565b92505081905550610e4333858560405180602001604052806000815250612939565b604080518581524260208201527f379e48b95d7f82abeb70d342a8423361588c68431865595583e7dafd0ec5b91c910160405180910390a150505050565b60058181548110610e9157600080fd5b9060005260206000209060050201600091509050806000018054610eb4906142bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610ee0906142bf565b8015610f2d5780601f10610f0257610100808354040283529160200191610f2d565b820191906000526020600020905b815481529060010190602001808311610f1057829003601f168201915b505050505090806001018054610f42906142bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6e906142bf565b8015610fbb5780601f10610f9057610100808354040283529160200191610fbb565b820191906000526020600020905b815481529060010190602001808311610f9e57829003601f168201915b505050505090806002018054610fd0906142bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610ffc906142bf565b80156110495780601f1061101e57610100808354040283529160200191611049565b820191906000526020600020905b81548152906001019060200180831161102c57829003601f168201915b50505050509080600301805461105e906142bf565b80601f016020809104026020016040519081016040528092919081815260200182805461108a906142bf565b80156110d75780601f106110ac576101008083540402835291602001916110d7565b820191906000526020600020905b8154815290600101906020018083116110ba57829003601f168201915b5050505050908060040154905085565b6110ef6128df565b60009182526008602052604090912080549115156101000261ff0019909216919091179055565b6001600160a01b0385163314806111325750611132853361069d565b6111a45760405162461bcd60e51b815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f76656400000000000000000000000000000000000060648201526084016107a5565b6111b18585858585612a78565b5050505050565b6111c06128df565b6040805160a0810182528c8152602081018c90529081018a905260608101899052426080820152600580546001810182556000829052825191027f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0019081906112299082614384565b506020820151600182019061123e9082614384565b50604082015160028201906112539082614384565b50606082015160038201906112689082614384565b506080820151816004015550506112828787878787612cf9565b81156112a3576112a381888460405180602001604052806000815250612939565b6005547fec2102c9ff66ba13845fc6c40ab79c3947626792e99ddfba523629856c7c07c5906112d490600190614444565b8b8b426040516112e79493929190614457565b60405180910390a15050505050505050505050565b600083815260086020908152604080832081516101008082018452825460ff808216151584529181048216151595830195909552620100008504811615159382019390935263010000009093049091161515606083015260018101546080830152600281015460a0830152600381015460c083015260048101805460e084019190611386906142bf565b80601f01602080910402602001604051908101604052809291908181526020018280546113b2906142bf565b80156113ff5780601f106113d4576101008083540402835291602001916113ff565b820191906000526020600020905b8154815290600101906020018083116113e257829003601f168201915b505050505081525050905060006114228560009081526004602052604090205490565b60075490915060ff16156114785760405162461bcd60e51b815260206004820152601c60248201527f436f6e74726163742069732063757272656e746c79207061757365640000000060448201526064016107a5565b81516114d25760405162461bcd60e51b815260206004820152602360248201527f546f6b656e207769746820676976656e20696420646f6573206e6f742065786960448201526273747360e81b60648201526084016107a5565b604082015115156001146115285760405162461bcd60e51b815260206004820152600d60248201527f4e6f7420636c61696d61626c650000000000000000000000000000000000000060448201526064016107a5565b60a082015161153890600161430f565b61154382600161430f565b106115825760405162461bcd60e51b815260206004820152600f60248201526e546f6f206d616e7920746f6b656e7360881b60448201526064016107a5565b600085815260096020908152604080832033845290915290205460ff16156115ec5760405162461bcd60e51b815260206004820152601560248201527f4f4e4c59203120504552204652454520434c41494d000000000000000000000060448201526064016107a5565b61168284848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602082015233603c820152605c01915061165e9050565b60405160208183030381529060405280519060200120612e9490919063ffffffff16565b60075461010090046001600160a01b039081169116146116e45760405162461bcd60e51b815260206004820152601860248201527f5369676e65722061646472657373206d69736d617463682e000000000000000060448201526064016107a5565b600085815260096020908152604080832033808552908352818420805460ff1916600190811790915582519384019092529282526117259291889190612939565b604080518681524260208201527f379e48b95d7f82abeb70d342a8423361588c68431865595583e7dafd0ec5b91c910160405180910390a15050505050565b61176c6128df565b604051600090339047908381818185875af1925050503d80600081146117ae576040519150601f19603f3d011682016040523d82523d6000602084013e6117b3565b606091505b50509050806117c157600080fd5b50565b6117cc6128df565b600780546001600160a01b03909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b606081518351146118845760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d61746368000000000000000000000000000000000000000000000060648201526084016107a5565b6000835167ffffffffffffffff8111156118a0576118a0613aa4565b6040519080825280602002602001820160405280156118c9578160200160208202803683370190505b50905060005b8451811015611941576119148582815181106118ed576118ed614494565b602002602001015185838151811061190757611907614494565b602002602001015161072b565b82828151811061192657611926614494565b602090810291909101015261193a816144aa565b90506118cf565b509392505050565b61197b6040518060a0016040528060608152602001606081526020016060815260200160608152602001600081525090565b6005828154811061198e5761198e614494565b90600052602060002090600502016040518060a00160405290816000820180546119b7906142bf565b80601f01602080910402602001604051908101604052809291908181526020018280546119e3906142bf565b8015611a305780601f10611a0557610100808354040283529160200191611a30565b820191906000526020600020905b815481529060010190602001808311611a1357829003601f168201915b50505050508152602001600182018054611a49906142bf565b80601f0160208091040260200160405190810160405280929190818152602001828054611a75906142bf565b8015611ac25780601f10611a9757610100808354040283529160200191611ac2565b820191906000526020600020905b815481529060010190602001808311611aa557829003601f168201915b50505050508152602001600282018054611adb906142bf565b80601f0160208091040260200160405190810160405280929190818152602001828054611b07906142bf565b8015611b545780601f10611b2957610100808354040283529160200191611b54565b820191906000526020600020905b815481529060010190602001808311611b3757829003601f168201915b50505050508152602001600382018054611b6d906142bf565b80601f0160208091040260200160405190810160405280929190818152602001828054611b99906142bf565b8015611be65780601f10611bbb57610100808354040283529160200191611be6565b820191906000526020600020905b815481529060010190602001808311611bc957829003601f168201915b505050505081526020016004820154815250509050919050565b611c086128df565b611c126000612eb0565b565b600084815260086020908152604080832081516101008082018452825460ff808216151584529181048216151595830195909552620100008504811615159382019390935263010000009093049091161515606083015260018101546080830152600281015460a0830152600381015460c083015260048101805460e084019190611c9e906142bf565b80601f0160208091040260200160405190810160405280929190818152602001828054611cca906142bf565b8015611d175780601f10611cec57610100808354040283529160200191611d17565b820191906000526020600020905b815481529060010190602001808311611cfa57829003601f168201915b50505050508152505090506000611d3a8660009081526004602052604090205490565b60075490915060ff1615611d905760405162461bcd60e51b815260206004820152601c60248201527f636f6e74726163742069732063757272656e746c79207061757365640000000060448201526064016107a5565b60208201511515600114611de65760405162461bcd60e51b815260206004820152601260248201527f546f6b656e206e6f74206d696e7461626c65000000000000000000000000000060448201526064016107a5565b60608201511515600114611e3c5760405162461bcd60e51b815260206004820152601160248201527f546f6b656e206e6f7420616c6c6f77656400000000000000000000000000000060448201526064016107a5565b8151611e965760405162461bcd60e51b815260206004820152602360248201527f546f6b656e207769746820676976656e20696420646f6573206e6f742065786960448201526273747360e81b60648201526084016107a5565b60a0820151611ea690600161430f565b611eb0868361430f565b10611eef5760405162461bcd60e51b815260206004820152600f60248201526e546f6f206d616e7920746f6b656e7360881b60448201526064016107a5565b60c0820151611eff90600161430f565b85611f0a338961072b565b611f14919061430f565b10611f615760405162461bcd60e51b815260206004820152601860248201527f546f6f206d616e7920746f6b656e73207065722055736572000000000000000060448201526064016107a5565b60c0820151611f7190600161430f565b6000878152600a60209081526040808320338452909152902054611f9690879061430f565b10611fe35760405162461bcd60e51b815260206004820152601d60248201527f596f75206861766520657863656564206d61784d696e74416d6f756e7400000060448201526064016107a5565b61205584848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602082015233603c820152605c01915061165e9050565b60075461010090046001600160a01b039081169116146120b75760405162461bcd60e51b815260206004820152601860248201527f5369676e65722061646472657373206d69736d617463682e000000000000000060448201526064016107a5565b60008681526008602052604090206001015434906120d6908790614322565b11156121245760405162461bcd60e51b815260206004820152601360248201527f4e6f7420456e6f756768204554482073656e740000000000000000000000000060448201526064016107a5565b6000868152600a602090815260408083203384529091528120805487929061214d90849061430f565b9250508190555061216f33878760405180602001604052806000815250612939565b604080518781524260208201527f379e48b95d7f82abeb70d342a8423361588c68431865595583e7dafd0ec5b91c910160405180910390a1505050505050565b6008602052600090815260409020805460018201546002830154600384015460048501805460ff808716976101008804821697620100008104831697630100000090910490921695919491939192909190612209906142bf565b80601f0160208091040260200160405190810160405280929190818152602001828054612235906142bf565b80156122825780601f1061225757610100808354040283529160200191612282565b820191906000526020600020905b81548152906001019060200180831161226557829003601f168201915b5050505050905088565b6122946128df565b60005b828110156122f3576122e18484838181106122b4576122b4614494565b90506020020160208101906122c99190613e42565b83600160405180602001604052806000815250612939565b806122eb816144aa565b915050612297565b50604080518281524260208201527fa35529002179d39b8561d93a6b3d78d47976bdcf0562ac0db164988183fdb2ac910160405180910390a1505050565b61233c338383612f1a565b5050565b6123486128df565b600091825260086020526040909120805491151563010000000263ff00000019909216919091179055565b60606005805480602002602001604051908101604052809291908181526020016000905b8282101561261b57838290600052602060002090600502016040518060a00160405290816000820180546123ca906142bf565b80601f01602080910402602001604051908101604052809291908181526020018280546123f6906142bf565b80156124435780601f1061241857610100808354040283529160200191612443565b820191906000526020600020905b81548152906001019060200180831161242657829003601f168201915b5050505050815260200160018201805461245c906142bf565b80601f0160208091040260200160405190810160405280929190818152602001828054612488906142bf565b80156124d55780601f106124aa576101008083540402835291602001916124d5565b820191906000526020600020905b8154815290600101906020018083116124b857829003601f168201915b505050505081526020016002820180546124ee906142bf565b80601f016020809104026020016040519081016040528092919081815260200182805461251a906142bf565b80156125675780601f1061253c57610100808354040283529160200191612567565b820191906000526020600020905b81548152906001019060200180831161254a57829003601f168201915b50505050508152602001600382018054612580906142bf565b80601f01602080910402602001604051908101604052809291908181526020018280546125ac906142bf565b80156125f95780601f106125ce576101008083540402835291602001916125f9565b820191906000526020600020905b8154815290600101906020018083116125dc57829003601f168201915b5050505050815260200160048201548152505081526020019060010190612397565b50505050905090565b600061269883838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602082015233603c820152605c01915061165e9050565b9392505050565b6126a76128df565b60008281526008602052604090205460ff1661272b5760405162461bcd60e51b815260206004820152602260248201527f546f6b656e207769746820676976656e20696420646f6573206e6f742065786960448201527f737400000000000000000000000000000000000000000000000000000000000060648201526084016107a5565b60008281526008602052604090206004016127468282614384565b507ff8cd975dd45018385cc72a0f15bb8531af04b68841bdd965f55706e72b57121a82428360405161277a939291906144c3565b60405180910390a15050565b61278e6128df565b6000918252600860205260409091208054911515620100000262ff000019909216919091179055565b6001600160a01b0385163314806127d357506127d3853361069d565b6128455760405162461bcd60e51b815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f76656400000000000000000000000000000000000060648201526084016107a5565b6111b1858585858561300e565b61285a6128df565b6001600160a01b0381166128d65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107a5565b6117c181612eb0565b6003546001600160a01b03163314611c125760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107a5565b6001600160a01b0384166129b55760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016107a5565b3360006129c1856131c7565b905060006129ce856131c7565b90506129df83600089858589613212565b6000868152602081815260408083206001600160a01b038b16845290915281208054879290612a0f90849061430f565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612a6f83600089898989613220565b50505050505050565b8151835114612aef5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d6174636800000000000000000000000000000000000000000000000060648201526084016107a5565b6001600160a01b038416612b535760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016107a5565b33612b62818787878787613212565b60005b8451811015612c8b576000858281518110612b8257612b82614494565b602002602001015190506000858381518110612ba057612ba0614494565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015612c335760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b60648201526084016107a5565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290612c7090849061430f565b9250508190555050505080612c84906144aa565b9050612b65565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612cdb9291906144eb565b60405180910390a4612cf18187878787876133c5565b505050505050565b60008581526008602052604090205460ff1615612d7e5760405162461bcd60e51b815260206004820152602260248201527f546f6b656e207769746820676976656e20696420616c7265616479206578697360448201527f747300000000000000000000000000000000000000000000000000000000000060648201526084016107a5565b604051806101000160405280600115158152602001600015158152602001600015158152602001600015158152602001858152602001848152602001838152602001828152506008600087815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff02191690831515021790555060408201518160000160026101000a81548160ff02191690831515021790555060608201518160000160036101000a81548160ff0219169083151502179055506080820151816001015560a0820151816002015560c0820151816003015560e0820151816004019081612e8a9190614384565b5050505050505050565b6000806000612ea385856134c1565b9150915061194181613506565b600380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031603612fa15760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c66000000000000000000000000000000000000000000000060648201526084016107a5565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166130725760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016107a5565b33600061307e856131c7565b9050600061308b856131c7565b905061309b838989858589613212565b6000868152602081815260408083206001600160a01b038c1684529091529020548581101561311f5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b60648201526084016107a5565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a1682528120805488929061315c90849061430f565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46131bc848a8a8a8a8a613220565b505050505050505050565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061320157613201614494565b602090810291909101015292915050565b612cf186868686868661366b565b6001600160a01b0384163b15612cf15760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906132649089908990889088908890600401614510565b6020604051808303816000875af192505050801561329f575060408051601f3d908101601f1916820190925261329c91810190614553565b60015b613354576132ab614570565b806308c379a0036132e457506132bf61458c565b806132ca57506132e6565b8060405162461bcd60e51b81526004016107a591906139a7565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560448201527f526563656976657220696d706c656d656e74657200000000000000000000000060648201526084016107a5565b6001600160e01b0319811663f23a6e6160e01b14612a6f5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b60648201526084016107a5565b6001600160a01b0384163b15612cf15760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906134099089908990889088908890600401614616565b6020604051808303816000875af1925050508015613444575060408051601f3d908101601f1916820190925261344191810190614553565b60015b613450576132ab614570565b6001600160e01b0319811663bc197c8160e01b14612a6f5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b60648201526084016107a5565b60008082516041036134f75760208301516040840151606085015160001a6134eb878285856137f9565b945094505050506134ff565b506000905060025b9250929050565b600081600481111561351a5761351a614674565b036135225750565b600181600481111561353657613536614674565b036135835760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016107a5565b600281600481111561359757613597614674565b036135e45760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016107a5565b60038160048111156135f8576135f8614674565b036117c15760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016107a5565b6001600160a01b0385166136f25760005b83518110156136f05782818151811061369757613697614494565b6020026020010151600460008684815181106136b5576136b5614494565b6020026020010151815260200190815260200160002060008282546136da919061430f565b909155506136e99050816144aa565b905061367c565b505b6001600160a01b038416612cf15760005b8351811015612a6f57600084828151811061372057613720614494565b60200260200101519050600084838151811061373e5761373e614494565b60200260200101519050600060046000848152602001908152602001600020549050818110156137d65760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f7460448201527f616c537570706c7900000000000000000000000000000000000000000000000060648201526084016107a5565b600092835260046020526040909220910390556137f2816144aa565b9050613703565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561383057506000905060036138b4565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613884573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166138ad576000600192509250506138b4565b9150600090505b94509492505050565b80356001600160a01b03811681146138d457600080fd5b919050565b600080604083850312156138ec57600080fd5b6138f5836138bd565b946020939093013593505050565b6001600160e01b0319811681146117c157600080fd5b60006020828403121561392b57600080fd5b813561269881613903565b803580151581146138d457600080fd5b60006020828403121561395857600080fd5b61269882613936565b6000815180845260005b818110156139875760208185018101518683018201520161396b565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006126986020830184613961565b6000602082840312156139cc57600080fd5b5035919050565b600080604083850312156139e657600080fd5b823591506139f6602084016138bd565b90509250929050565b60008060408385031215613a1257600080fd5b50508035926020909101359150565b60a081526000613a3460a0830188613961565b8281036020840152613a468188613961565b90508281036040840152613a5a8187613961565b90508281036060840152613a6e8186613961565b9150508260808301529695505050505050565b60008060408385031215613a9457600080fd5b823591506139f660208401613936565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff81118282101715613ae057613ae0613aa4565b6040525050565b600067ffffffffffffffff821115613b0157613b01613aa4565b5060051b60200190565b600082601f830112613b1c57600080fd5b81356020613b2982613ae7565b604051613b368282613aba565b83815260059390931b8501820192828101915086841115613b5657600080fd5b8286015b84811015613b715780358352918301918301613b5a565b509695505050505050565b600082601f830112613b8d57600080fd5b813567ffffffffffffffff811115613ba757613ba7613aa4565b604051613bbe601f8301601f191660200182613aba565b818152846020838601011115613bd357600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215613c0857600080fd5b613c11866138bd565b9450613c1f602087016138bd565b9350604086013567ffffffffffffffff80821115613c3c57600080fd5b613c4889838a01613b0b565b94506060880135915080821115613c5e57600080fd5b613c6a89838a01613b0b565b93506080880135915080821115613c8057600080fd5b50613c8d88828901613b7c565b9150509295509295909350565b60008060008060008060008060008060006101608c8e031215613cbc57600080fd5b67ffffffffffffffff808d351115613cd357600080fd5b613ce08e8e358f01613b7c565b9b508060208e01351115613cf357600080fd5b613d038e60208f01358f01613b7c565b9a508060408e01351115613d1657600080fd5b613d268e60408f01358f01613b7c565b99508060608e01351115613d3957600080fd5b613d498e60608f01358f01613b7c565b985060808d0135975060a08d0135965060c08d0135955060e08d01359450806101008e01351115613d7957600080fd5b50613d8b8d6101008e01358e01613b7c565b92506101208c01359150613da26101408d016138bd565b90509295989b509295989b9093969950565b60008083601f840112613dc657600080fd5b50813567ffffffffffffffff811115613dde57600080fd5b6020830191508360208285010111156134ff57600080fd5b600080600060408486031215613e0b57600080fd5b83359250602084013567ffffffffffffffff811115613e2957600080fd5b613e3586828701613db4565b9497909650939450505050565b600060208284031215613e5457600080fd5b612698826138bd565b60008060408385031215613e7057600080fd5b823567ffffffffffffffff80821115613e8857600080fd5b818501915085601f830112613e9c57600080fd5b81356020613ea982613ae7565b604051613eb68282613aba565b83815260059390931b8501820192828101915089841115613ed657600080fd5b948201945b83861015613efb57613eec866138bd565b82529482019490820190613edb565b96505086013592505080821115613f1157600080fd5b50613f1e85828601613b0b565b9150509250929050565b600081518084526020808501945080840160005b83811015613f5857815187529582019590820190600101613f3c565b509495945050505050565b6020815260006126986020830184613f28565b6000815160a08452613f8b60a0850182613961565b905060208301518482036020860152613fa48282613961565b91505060408301518482036040860152613fbe8282613961565b91505060608301518482036060860152613fd88282613961565b915050608083015160808501528091505092915050565b6020815260006126986020830184613f76565b6000806000806060858703121561401857600080fd5b8435935060208501359250604085013567ffffffffffffffff81111561403d57600080fd5b61404987828801613db4565b95989497509550505050565b60006101008a151583528915156020840152881515604084015287151560608401528660808401528560a08401528460c08401528060e084015261409b81840185613961565b9b9a5050505050505050505050565b6000806000604084860312156140bf57600080fd5b833567ffffffffffffffff808211156140d757600080fd5b818601915086601f8301126140eb57600080fd5b8135818111156140fa57600080fd5b8760208260051b850101111561410f57600080fd5b6020928301989097509590910135949350505050565b6000806040838503121561413857600080fd5b614141836138bd565b91506139f660208401613936565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156141a457603f19888603018452614192858351613f76565b94509285019290850190600101614176565b5092979650505050505050565b600080602083850312156141c457600080fd5b823567ffffffffffffffff8111156141db57600080fd5b6141e785828601613db4565b90969095509350505050565b6000806040838503121561420657600080fd5b82359150602083013567ffffffffffffffff81111561422457600080fd5b613f1e85828601613b7c565b6000806040838503121561424357600080fd5b61424c836138bd565b91506139f6602084016138bd565b600080600080600060a0868803121561427257600080fd5b61427b866138bd565b9450614289602087016138bd565b93506040860135925060608601359150608086013567ffffffffffffffff8111156142b357600080fd5b613c8d88828901613b7c565b600181811c908216806142d357607f821691505b6020821081036142f357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156107d1576107d16142f9565b80820281158282048414176107d1576107d16142f9565b601f82111561437f57600081815260208120601f850160051c810160208610156143605750805b601f850160051c820191505b81811015612cf15782815560010161436c565b505050565b815167ffffffffffffffff81111561439e5761439e613aa4565b6143b2816143ac84546142bf565b84614339565b602080601f8311600181146143e757600084156143cf5750858301515b600019600386901b1c1916600185901b178555612cf1565b600085815260208120601f198616915b82811015614416578886015182559484019460019091019084016143f7565b50858210156144345787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b818103818111156107d1576107d16142f9565b8481526080602082015260006144706080830186613961565b82810360408401526144828186613961565b91505082606083015295945050505050565b634e487b7160e01b600052603260045260246000fd5b6000600182016144bc576144bc6142f9565b5060010190565b8381528260208201526060604082015260006144e26060830184613961565b95945050505050565b6040815260006144fe6040830185613f28565b82810360208401526144e28185613f28565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261454860a0830184613961565b979650505050505050565b60006020828403121561456557600080fd5b815161269881613903565b600060033d11156145895760046000803e5060005160e01c5b90565b600060443d101561459a5790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156145ca57505050505090565b82850191508151818111156145e25750505050505090565b843d87010160208285010111156145fc5750505050505090565b61460b60208286010187613aba565b509095945050505050565b60006001600160a01b03808816835280871660208401525060a0604083015261464260a0830186613f28565b82810360608401526146548186613f28565b905082810360808401526146688185613961565b98975050505050505050565b634e487b7160e01b600052602160045260246000fdfea264697066735822122051d914354eb9895f08a5e9f1fdba67a3035b608a1a35312f349ade8b2e0cc13a64736f6c634300081200330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000d4e66744e6f77506f646361737400000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102335760003560e01c8063715018a611610138578063bd85b039116100b0578063ddc156a31161007f578063f076aa4311610064578063f076aa43146106cb578063f242432a146106eb578063f2fde38b1461070b57600080fd5b8063ddc156a31461066f578063e985e9c51461068257600080fd5b8063bd85b039146105e0578063c83066ac1461060d578063cbf1b53e1461062f578063d2c0a6ea1461064f57600080fd5b80638c04f6a211610107578063a22cb465116100ec578063a22cb46514610588578063a50e33d0146105a8578063b187bd26146105c857600080fd5b80638c04f6a2146105365780638da5cb5b1461055657600080fd5b8063715018a6146104a257806372c7be6d146104b757806379b655d4146104ef5780637c13774b1461050257600080fd5b80632abebe36116101cb5780633ccfd60b1161019a5780634e1273f41161017f5780634e1273f4146104195780634f558e791461044657806363f141831461047557600080fd5b80633ccfd60b146103f15780633dc2a843146103f957600080fd5b80632abebe361461037e5780632eb2c2d61461039e5780633450ea3c146103be57806338926b6d146103de57600080fd5b80630e89341c116102075780630e89341c146102df57806311017721146102ff5780631b2ef1ca1461033a5780632788072d1461034d57600080fd5b8062fdd58e1461023857806301ffc9a71461026b57806302329a291461029b57806306fdde03146102bd575b600080fd5b34801561024457600080fd5b506102586102533660046138d9565b61072b565b6040519081526020015b60405180910390f35b34801561027757600080fd5b5061028b610286366004613919565b6107d7565b6040519015158152602001610262565b3480156102a757600080fd5b506102bb6102b6366004613946565b610872565b005b3480156102c957600080fd5b506102d261088d565b60405161026291906139a7565b3480156102eb57600080fd5b506102d26102fa3660046139ba565b61091b565b34801561030b57600080fd5b5061028b61031a3660046139d3565b600960209081526000928352604080842090915290825290205460ff1681565b6102bb6103483660046139ff565b6109c0565b34801561035957600080fd5b5061036d6103683660046139ba565b610e81565b604051610262959493929190613a21565b34801561038a57600080fd5b506102bb610399366004613a81565b6110e7565b3480156103aa57600080fd5b506102bb6103b9366004613bf0565b611116565b3480156103ca57600080fd5b506102bb6103d9366004613c9a565b6111b8565b6102bb6103ec366004613df6565b6112fc565b6102bb611764565b34801561040557600080fd5b506102bb610414366004613e42565b6117c4565b34801561042557600080fd5b50610439610434366004613e5d565b61180b565b6040516102629190613f63565b34801561045257600080fd5b5061028b6104613660046139ba565b600090815260046020526040902054151590565b34801561048157600080fd5b506104956104903660046139ba565b611949565b6040516102629190613fef565b3480156104ae57600080fd5b506102bb611c00565b3480156104c357600080fd5b506102586104d23660046139d3565b600a60209081526000928352604080842090915290825290205481565b6102bb6104fd366004614002565b611c14565b34801561050e57600080fd5b5061052261051d3660046139ba565b6121af565b604051610262989796959493929190614055565b34801561054257600080fd5b506102bb6105513660046140aa565b61228c565b34801561056257600080fd5b506003546001600160a01b03165b6040516001600160a01b039091168152602001610262565b34801561059457600080fd5b506102bb6105a3366004614125565b612331565b3480156105b457600080fd5b506102bb6105c3366004613a81565b612340565b3480156105d457600080fd5b5060075460ff1661028b565b3480156105ec57600080fd5b506102586105fb3660046139ba565b60009081526004602052604090205490565b34801561061957600080fd5b50610622612373565b604051610262919061414f565b34801561063b57600080fd5b5061057061064a3660046141b1565b612624565b34801561065b57600080fd5b506102bb61066a3660046141f3565b61269f565b34801561067b57600080fd5b5033610258565b34801561068e57600080fd5b5061028b61069d366004614230565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b3480156106d757600080fd5b506102bb6106e6366004613a81565b612786565b3480156106f757600080fd5b506102bb61070636600461425a565b6127b7565b34801561071757600080fd5b506102bb610726366004613e42565b612852565b60006001600160a01b0383166107ae5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201527f616c6964206f776e65720000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b031982167fd9b67a2600000000000000000000000000000000000000000000000000000000148061083a57506001600160e01b031982167f0e89341c00000000000000000000000000000000000000000000000000000000145b806107d157507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316146107d1565b61087a6128df565b6007805460ff1916911515919091179055565b6006805461089a906142bf565b80601f01602080910402602001604051908101604052809291908181526020018280546108c6906142bf565b80156109135780601f106108e857610100808354040283529160200191610913565b820191906000526020600020905b8154815290600101906020018083116108f657829003601f168201915b505050505081565b600081815260086020526040902060040180546060919061093b906142bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610967906142bf565b80156109b45780601f10610989576101008083540402835291602001916109b4565b820191906000526020600020905b81548152906001019060200180831161099757829003601f168201915b50505050509050919050565b600082815260086020908152604080832081516101008082018452825460ff808216151584529181048216151595830195909552620100008504811615159382019390935263010000009093049091161515606083015260018101546080830152600281015460a0830152600381015460c083015260048101805460e084019190610a4a906142bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610a76906142bf565b8015610ac35780601f10610a9857610100808354040283529160200191610ac3565b820191906000526020600020905b815481529060010190602001808311610aa657829003601f168201915b50505050508152505090506000610ae68460009081526004602052604090205490565b60075490915060ff1615610b3c5760405162461bcd60e51b815260206004820152601c60248201527f636f6e74726163742069732063757272656e746c79207061757365640000000060448201526064016107a5565b8151610b965760405162461bcd60e51b815260206004820152602360248201527f546f6b656e207769746820676976656e20696420646f6573206e6f742065786960448201526273747360e81b60648201526084016107a5565b60208201511515600114610bec5760405162461bcd60e51b815260206004820152601260248201527f546f6b656e206e6f74206d696e7461626c65000000000000000000000000000060448201526064016107a5565b606082015115610c3e5760405162461bcd60e51b815260206004820152600e60248201527f416c6c6f776c697374206f6e6c7900000000000000000000000000000000000060448201526064016107a5565b60a0820151610c4e90600161430f565b610c58848361430f565b10610c975760405162461bcd60e51b815260206004820152600f60248201526e546f6f206d616e7920746f6b656e7360881b60448201526064016107a5565b60c0820151610ca790600161430f565b83610cb2338761072b565b610cbc919061430f565b10610d095760405162461bcd60e51b815260206004820152601860248201527f546f6f206d616e7920746f6b656e73207065722055736572000000000000000060448201526064016107a5565b60c0820151610d1990600161430f565b6000858152600a60209081526040808320338452909152902054610d3e90859061430f565b10610d8b5760405162461bcd60e51b815260206004820152601d60248201527f596f75206861766520657863656564206d61784d696e74416d6f756e7400000060448201526064016107a5565b6000848152600860205260409020600101543490610daa908590614322565b1115610df85760405162461bcd60e51b815260206004820152601360248201527f4e6f7420456e6f756768204554482073656e740000000000000000000000000060448201526064016107a5565b6000848152600a6020908152604080832033845290915281208054859290610e2190849061430f565b92505081905550610e4333858560405180602001604052806000815250612939565b604080518581524260208201527f379e48b95d7f82abeb70d342a8423361588c68431865595583e7dafd0ec5b91c910160405180910390a150505050565b60058181548110610e9157600080fd5b9060005260206000209060050201600091509050806000018054610eb4906142bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610ee0906142bf565b8015610f2d5780601f10610f0257610100808354040283529160200191610f2d565b820191906000526020600020905b815481529060010190602001808311610f1057829003601f168201915b505050505090806001018054610f42906142bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6e906142bf565b8015610fbb5780601f10610f9057610100808354040283529160200191610fbb565b820191906000526020600020905b815481529060010190602001808311610f9e57829003601f168201915b505050505090806002018054610fd0906142bf565b80601f0160208091040260200160405190810160405280929190818152602001828054610ffc906142bf565b80156110495780601f1061101e57610100808354040283529160200191611049565b820191906000526020600020905b81548152906001019060200180831161102c57829003601f168201915b50505050509080600301805461105e906142bf565b80601f016020809104026020016040519081016040528092919081815260200182805461108a906142bf565b80156110d75780601f106110ac576101008083540402835291602001916110d7565b820191906000526020600020905b8154815290600101906020018083116110ba57829003601f168201915b5050505050908060040154905085565b6110ef6128df565b60009182526008602052604090912080549115156101000261ff0019909216919091179055565b6001600160a01b0385163314806111325750611132853361069d565b6111a45760405162461bcd60e51b815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f76656400000000000000000000000000000000000060648201526084016107a5565b6111b18585858585612a78565b5050505050565b6111c06128df565b6040805160a0810182528c8152602081018c90529081018a905260608101899052426080820152600580546001810182556000829052825191027f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0019081906112299082614384565b506020820151600182019061123e9082614384565b50604082015160028201906112539082614384565b50606082015160038201906112689082614384565b506080820151816004015550506112828787878787612cf9565b81156112a3576112a381888460405180602001604052806000815250612939565b6005547fec2102c9ff66ba13845fc6c40ab79c3947626792e99ddfba523629856c7c07c5906112d490600190614444565b8b8b426040516112e79493929190614457565b60405180910390a15050505050505050505050565b600083815260086020908152604080832081516101008082018452825460ff808216151584529181048216151595830195909552620100008504811615159382019390935263010000009093049091161515606083015260018101546080830152600281015460a0830152600381015460c083015260048101805460e084019190611386906142bf565b80601f01602080910402602001604051908101604052809291908181526020018280546113b2906142bf565b80156113ff5780601f106113d4576101008083540402835291602001916113ff565b820191906000526020600020905b8154815290600101906020018083116113e257829003601f168201915b505050505081525050905060006114228560009081526004602052604090205490565b60075490915060ff16156114785760405162461bcd60e51b815260206004820152601c60248201527f436f6e74726163742069732063757272656e746c79207061757365640000000060448201526064016107a5565b81516114d25760405162461bcd60e51b815260206004820152602360248201527f546f6b656e207769746820676976656e20696420646f6573206e6f742065786960448201526273747360e81b60648201526084016107a5565b604082015115156001146115285760405162461bcd60e51b815260206004820152600d60248201527f4e6f7420636c61696d61626c650000000000000000000000000000000000000060448201526064016107a5565b60a082015161153890600161430f565b61154382600161430f565b106115825760405162461bcd60e51b815260206004820152600f60248201526e546f6f206d616e7920746f6b656e7360881b60448201526064016107a5565b600085815260096020908152604080832033845290915290205460ff16156115ec5760405162461bcd60e51b815260206004820152601560248201527f4f4e4c59203120504552204652454520434c41494d000000000000000000000060448201526064016107a5565b61168284848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602082015233603c820152605c01915061165e9050565b60405160208183030381529060405280519060200120612e9490919063ffffffff16565b60075461010090046001600160a01b039081169116146116e45760405162461bcd60e51b815260206004820152601860248201527f5369676e65722061646472657373206d69736d617463682e000000000000000060448201526064016107a5565b600085815260096020908152604080832033808552908352818420805460ff1916600190811790915582519384019092529282526117259291889190612939565b604080518681524260208201527f379e48b95d7f82abeb70d342a8423361588c68431865595583e7dafd0ec5b91c910160405180910390a15050505050565b61176c6128df565b604051600090339047908381818185875af1925050503d80600081146117ae576040519150601f19603f3d011682016040523d82523d6000602084013e6117b3565b606091505b50509050806117c157600080fd5b50565b6117cc6128df565b600780546001600160a01b03909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b606081518351146118845760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d61746368000000000000000000000000000000000000000000000060648201526084016107a5565b6000835167ffffffffffffffff8111156118a0576118a0613aa4565b6040519080825280602002602001820160405280156118c9578160200160208202803683370190505b50905060005b8451811015611941576119148582815181106118ed576118ed614494565b602002602001015185838151811061190757611907614494565b602002602001015161072b565b82828151811061192657611926614494565b602090810291909101015261193a816144aa565b90506118cf565b509392505050565b61197b6040518060a0016040528060608152602001606081526020016060815260200160608152602001600081525090565b6005828154811061198e5761198e614494565b90600052602060002090600502016040518060a00160405290816000820180546119b7906142bf565b80601f01602080910402602001604051908101604052809291908181526020018280546119e3906142bf565b8015611a305780601f10611a0557610100808354040283529160200191611a30565b820191906000526020600020905b815481529060010190602001808311611a1357829003601f168201915b50505050508152602001600182018054611a49906142bf565b80601f0160208091040260200160405190810160405280929190818152602001828054611a75906142bf565b8015611ac25780601f10611a9757610100808354040283529160200191611ac2565b820191906000526020600020905b815481529060010190602001808311611aa557829003601f168201915b50505050508152602001600282018054611adb906142bf565b80601f0160208091040260200160405190810160405280929190818152602001828054611b07906142bf565b8015611b545780601f10611b2957610100808354040283529160200191611b54565b820191906000526020600020905b815481529060010190602001808311611b3757829003601f168201915b50505050508152602001600382018054611b6d906142bf565b80601f0160208091040260200160405190810160405280929190818152602001828054611b99906142bf565b8015611be65780601f10611bbb57610100808354040283529160200191611be6565b820191906000526020600020905b815481529060010190602001808311611bc957829003601f168201915b505050505081526020016004820154815250509050919050565b611c086128df565b611c126000612eb0565b565b600084815260086020908152604080832081516101008082018452825460ff808216151584529181048216151595830195909552620100008504811615159382019390935263010000009093049091161515606083015260018101546080830152600281015460a0830152600381015460c083015260048101805460e084019190611c9e906142bf565b80601f0160208091040260200160405190810160405280929190818152602001828054611cca906142bf565b8015611d175780601f10611cec57610100808354040283529160200191611d17565b820191906000526020600020905b815481529060010190602001808311611cfa57829003601f168201915b50505050508152505090506000611d3a8660009081526004602052604090205490565b60075490915060ff1615611d905760405162461bcd60e51b815260206004820152601c60248201527f636f6e74726163742069732063757272656e746c79207061757365640000000060448201526064016107a5565b60208201511515600114611de65760405162461bcd60e51b815260206004820152601260248201527f546f6b656e206e6f74206d696e7461626c65000000000000000000000000000060448201526064016107a5565b60608201511515600114611e3c5760405162461bcd60e51b815260206004820152601160248201527f546f6b656e206e6f7420616c6c6f77656400000000000000000000000000000060448201526064016107a5565b8151611e965760405162461bcd60e51b815260206004820152602360248201527f546f6b656e207769746820676976656e20696420646f6573206e6f742065786960448201526273747360e81b60648201526084016107a5565b60a0820151611ea690600161430f565b611eb0868361430f565b10611eef5760405162461bcd60e51b815260206004820152600f60248201526e546f6f206d616e7920746f6b656e7360881b60448201526064016107a5565b60c0820151611eff90600161430f565b85611f0a338961072b565b611f14919061430f565b10611f615760405162461bcd60e51b815260206004820152601860248201527f546f6f206d616e7920746f6b656e73207065722055736572000000000000000060448201526064016107a5565b60c0820151611f7190600161430f565b6000878152600a60209081526040808320338452909152902054611f9690879061430f565b10611fe35760405162461bcd60e51b815260206004820152601d60248201527f596f75206861766520657863656564206d61784d696e74416d6f756e7400000060448201526064016107a5565b61205584848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602082015233603c820152605c01915061165e9050565b60075461010090046001600160a01b039081169116146120b75760405162461bcd60e51b815260206004820152601860248201527f5369676e65722061646472657373206d69736d617463682e000000000000000060448201526064016107a5565b60008681526008602052604090206001015434906120d6908790614322565b11156121245760405162461bcd60e51b815260206004820152601360248201527f4e6f7420456e6f756768204554482073656e740000000000000000000000000060448201526064016107a5565b6000868152600a602090815260408083203384529091528120805487929061214d90849061430f565b9250508190555061216f33878760405180602001604052806000815250612939565b604080518781524260208201527f379e48b95d7f82abeb70d342a8423361588c68431865595583e7dafd0ec5b91c910160405180910390a1505050505050565b6008602052600090815260409020805460018201546002830154600384015460048501805460ff808716976101008804821697620100008104831697630100000090910490921695919491939192909190612209906142bf565b80601f0160208091040260200160405190810160405280929190818152602001828054612235906142bf565b80156122825780601f1061225757610100808354040283529160200191612282565b820191906000526020600020905b81548152906001019060200180831161226557829003601f168201915b5050505050905088565b6122946128df565b60005b828110156122f3576122e18484838181106122b4576122b4614494565b90506020020160208101906122c99190613e42565b83600160405180602001604052806000815250612939565b806122eb816144aa565b915050612297565b50604080518281524260208201527fa35529002179d39b8561d93a6b3d78d47976bdcf0562ac0db164988183fdb2ac910160405180910390a1505050565b61233c338383612f1a565b5050565b6123486128df565b600091825260086020526040909120805491151563010000000263ff00000019909216919091179055565b60606005805480602002602001604051908101604052809291908181526020016000905b8282101561261b57838290600052602060002090600502016040518060a00160405290816000820180546123ca906142bf565b80601f01602080910402602001604051908101604052809291908181526020018280546123f6906142bf565b80156124435780601f1061241857610100808354040283529160200191612443565b820191906000526020600020905b81548152906001019060200180831161242657829003601f168201915b5050505050815260200160018201805461245c906142bf565b80601f0160208091040260200160405190810160405280929190818152602001828054612488906142bf565b80156124d55780601f106124aa576101008083540402835291602001916124d5565b820191906000526020600020905b8154815290600101906020018083116124b857829003601f168201915b505050505081526020016002820180546124ee906142bf565b80601f016020809104026020016040519081016040528092919081815260200182805461251a906142bf565b80156125675780601f1061253c57610100808354040283529160200191612567565b820191906000526020600020905b81548152906001019060200180831161254a57829003601f168201915b50505050508152602001600382018054612580906142bf565b80601f01602080910402602001604051908101604052809291908181526020018280546125ac906142bf565b80156125f95780601f106125ce576101008083540402835291602001916125f9565b820191906000526020600020905b8154815290600101906020018083116125dc57829003601f168201915b5050505050815260200160048201548152505081526020019060010190612397565b50505050905090565b600061269883838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602082015233603c820152605c01915061165e9050565b9392505050565b6126a76128df565b60008281526008602052604090205460ff1661272b5760405162461bcd60e51b815260206004820152602260248201527f546f6b656e207769746820676976656e20696420646f6573206e6f742065786960448201527f737400000000000000000000000000000000000000000000000000000000000060648201526084016107a5565b60008281526008602052604090206004016127468282614384565b507ff8cd975dd45018385cc72a0f15bb8531af04b68841bdd965f55706e72b57121a82428360405161277a939291906144c3565b60405180910390a15050565b61278e6128df565b6000918252600860205260409091208054911515620100000262ff000019909216919091179055565b6001600160a01b0385163314806127d357506127d3853361069d565b6128455760405162461bcd60e51b815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f76656400000000000000000000000000000000000060648201526084016107a5565b6111b1858585858561300e565b61285a6128df565b6001600160a01b0381166128d65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107a5565b6117c181612eb0565b6003546001600160a01b03163314611c125760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107a5565b6001600160a01b0384166129b55760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016107a5565b3360006129c1856131c7565b905060006129ce856131c7565b90506129df83600089858589613212565b6000868152602081815260408083206001600160a01b038b16845290915281208054879290612a0f90849061430f565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612a6f83600089898989613220565b50505050505050565b8151835114612aef5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d6174636800000000000000000000000000000000000000000000000060648201526084016107a5565b6001600160a01b038416612b535760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016107a5565b33612b62818787878787613212565b60005b8451811015612c8b576000858281518110612b8257612b82614494565b602002602001015190506000858381518110612ba057612ba0614494565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015612c335760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b60648201526084016107a5565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290612c7090849061430f565b9250508190555050505080612c84906144aa565b9050612b65565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612cdb9291906144eb565b60405180910390a4612cf18187878787876133c5565b505050505050565b60008581526008602052604090205460ff1615612d7e5760405162461bcd60e51b815260206004820152602260248201527f546f6b656e207769746820676976656e20696420616c7265616479206578697360448201527f747300000000000000000000000000000000000000000000000000000000000060648201526084016107a5565b604051806101000160405280600115158152602001600015158152602001600015158152602001600015158152602001858152602001848152602001838152602001828152506008600087815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff02191690831515021790555060408201518160000160026101000a81548160ff02191690831515021790555060608201518160000160036101000a81548160ff0219169083151502179055506080820151816001015560a0820151816002015560c0820151816003015560e0820151816004019081612e8a9190614384565b5050505050505050565b6000806000612ea385856134c1565b9150915061194181613506565b600380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031603612fa15760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c66000000000000000000000000000000000000000000000060648201526084016107a5565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166130725760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016107a5565b33600061307e856131c7565b9050600061308b856131c7565b905061309b838989858589613212565b6000868152602081815260408083206001600160a01b038c1684529091529020548581101561311f5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b60648201526084016107a5565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a1682528120805488929061315c90849061430f565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46131bc848a8a8a8a8a613220565b505050505050505050565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061320157613201614494565b602090810291909101015292915050565b612cf186868686868661366b565b6001600160a01b0384163b15612cf15760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906132649089908990889088908890600401614510565b6020604051808303816000875af192505050801561329f575060408051601f3d908101601f1916820190925261329c91810190614553565b60015b613354576132ab614570565b806308c379a0036132e457506132bf61458c565b806132ca57506132e6565b8060405162461bcd60e51b81526004016107a591906139a7565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560448201527f526563656976657220696d706c656d656e74657200000000000000000000000060648201526084016107a5565b6001600160e01b0319811663f23a6e6160e01b14612a6f5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b60648201526084016107a5565b6001600160a01b0384163b15612cf15760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906134099089908990889088908890600401614616565b6020604051808303816000875af1925050508015613444575060408051601f3d908101601f1916820190925261344191810190614553565b60015b613450576132ab614570565b6001600160e01b0319811663bc197c8160e01b14612a6f5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b60648201526084016107a5565b60008082516041036134f75760208301516040840151606085015160001a6134eb878285856137f9565b945094505050506134ff565b506000905060025b9250929050565b600081600481111561351a5761351a614674565b036135225750565b600181600481111561353657613536614674565b036135835760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016107a5565b600281600481111561359757613597614674565b036135e45760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016107a5565b60038160048111156135f8576135f8614674565b036117c15760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016107a5565b6001600160a01b0385166136f25760005b83518110156136f05782818151811061369757613697614494565b6020026020010151600460008684815181106136b5576136b5614494565b6020026020010151815260200190815260200160002060008282546136da919061430f565b909155506136e99050816144aa565b905061367c565b505b6001600160a01b038416612cf15760005b8351811015612a6f57600084828151811061372057613720614494565b60200260200101519050600084838151811061373e5761373e614494565b60200260200101519050600060046000848152602001908152602001600020549050818110156137d65760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f7460448201527f616c537570706c7900000000000000000000000000000000000000000000000060648201526084016107a5565b600092835260046020526040909220910390556137f2816144aa565b9050613703565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561383057506000905060036138b4565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613884573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166138ad576000600192509250506138b4565b9150600090505b94509492505050565b80356001600160a01b03811681146138d457600080fd5b919050565b600080604083850312156138ec57600080fd5b6138f5836138bd565b946020939093013593505050565b6001600160e01b0319811681146117c157600080fd5b60006020828403121561392b57600080fd5b813561269881613903565b803580151581146138d457600080fd5b60006020828403121561395857600080fd5b61269882613936565b6000815180845260005b818110156139875760208185018101518683018201520161396b565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006126986020830184613961565b6000602082840312156139cc57600080fd5b5035919050565b600080604083850312156139e657600080fd5b823591506139f6602084016138bd565b90509250929050565b60008060408385031215613a1257600080fd5b50508035926020909101359150565b60a081526000613a3460a0830188613961565b8281036020840152613a468188613961565b90508281036040840152613a5a8187613961565b90508281036060840152613a6e8186613961565b9150508260808301529695505050505050565b60008060408385031215613a9457600080fd5b823591506139f660208401613936565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff81118282101715613ae057613ae0613aa4565b6040525050565b600067ffffffffffffffff821115613b0157613b01613aa4565b5060051b60200190565b600082601f830112613b1c57600080fd5b81356020613b2982613ae7565b604051613b368282613aba565b83815260059390931b8501820192828101915086841115613b5657600080fd5b8286015b84811015613b715780358352918301918301613b5a565b509695505050505050565b600082601f830112613b8d57600080fd5b813567ffffffffffffffff811115613ba757613ba7613aa4565b604051613bbe601f8301601f191660200182613aba565b818152846020838601011115613bd357600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215613c0857600080fd5b613c11866138bd565b9450613c1f602087016138bd565b9350604086013567ffffffffffffffff80821115613c3c57600080fd5b613c4889838a01613b0b565b94506060880135915080821115613c5e57600080fd5b613c6a89838a01613b0b565b93506080880135915080821115613c8057600080fd5b50613c8d88828901613b7c565b9150509295509295909350565b60008060008060008060008060008060006101608c8e031215613cbc57600080fd5b67ffffffffffffffff808d351115613cd357600080fd5b613ce08e8e358f01613b7c565b9b508060208e01351115613cf357600080fd5b613d038e60208f01358f01613b7c565b9a508060408e01351115613d1657600080fd5b613d268e60408f01358f01613b7c565b99508060608e01351115613d3957600080fd5b613d498e60608f01358f01613b7c565b985060808d0135975060a08d0135965060c08d0135955060e08d01359450806101008e01351115613d7957600080fd5b50613d8b8d6101008e01358e01613b7c565b92506101208c01359150613da26101408d016138bd565b90509295989b509295989b9093969950565b60008083601f840112613dc657600080fd5b50813567ffffffffffffffff811115613dde57600080fd5b6020830191508360208285010111156134ff57600080fd5b600080600060408486031215613e0b57600080fd5b83359250602084013567ffffffffffffffff811115613e2957600080fd5b613e3586828701613db4565b9497909650939450505050565b600060208284031215613e5457600080fd5b612698826138bd565b60008060408385031215613e7057600080fd5b823567ffffffffffffffff80821115613e8857600080fd5b818501915085601f830112613e9c57600080fd5b81356020613ea982613ae7565b604051613eb68282613aba565b83815260059390931b8501820192828101915089841115613ed657600080fd5b948201945b83861015613efb57613eec866138bd565b82529482019490820190613edb565b96505086013592505080821115613f1157600080fd5b50613f1e85828601613b0b565b9150509250929050565b600081518084526020808501945080840160005b83811015613f5857815187529582019590820190600101613f3c565b509495945050505050565b6020815260006126986020830184613f28565b6000815160a08452613f8b60a0850182613961565b905060208301518482036020860152613fa48282613961565b91505060408301518482036040860152613fbe8282613961565b91505060608301518482036060860152613fd88282613961565b915050608083015160808501528091505092915050565b6020815260006126986020830184613f76565b6000806000806060858703121561401857600080fd5b8435935060208501359250604085013567ffffffffffffffff81111561403d57600080fd5b61404987828801613db4565b95989497509550505050565b60006101008a151583528915156020840152881515604084015287151560608401528660808401528560a08401528460c08401528060e084015261409b81840185613961565b9b9a5050505050505050505050565b6000806000604084860312156140bf57600080fd5b833567ffffffffffffffff808211156140d757600080fd5b818601915086601f8301126140eb57600080fd5b8135818111156140fa57600080fd5b8760208260051b850101111561410f57600080fd5b6020928301989097509590910135949350505050565b6000806040838503121561413857600080fd5b614141836138bd565b91506139f660208401613936565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156141a457603f19888603018452614192858351613f76565b94509285019290850190600101614176565b5092979650505050505050565b600080602083850312156141c457600080fd5b823567ffffffffffffffff8111156141db57600080fd5b6141e785828601613db4565b90969095509350505050565b6000806040838503121561420657600080fd5b82359150602083013567ffffffffffffffff81111561422457600080fd5b613f1e85828601613b7c565b6000806040838503121561424357600080fd5b61424c836138bd565b91506139f6602084016138bd565b600080600080600060a0868803121561427257600080fd5b61427b866138bd565b9450614289602087016138bd565b93506040860135925060608601359150608086013567ffffffffffffffff8111156142b357600080fd5b613c8d88828901613b7c565b600181811c908216806142d357607f821691505b6020821081036142f357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156107d1576107d16142f9565b80820281158282048414176107d1576107d16142f9565b601f82111561437f57600081815260208120601f850160051c810160208610156143605750805b601f850160051c820191505b81811015612cf15782815560010161436c565b505050565b815167ffffffffffffffff81111561439e5761439e613aa4565b6143b2816143ac84546142bf565b84614339565b602080601f8311600181146143e757600084156143cf5750858301515b600019600386901b1c1916600185901b178555612cf1565b600085815260208120601f198616915b82811015614416578886015182559484019460019091019084016143f7565b50858210156144345787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b818103818111156107d1576107d16142f9565b8481526080602082015260006144706080830186613961565b82810360408401526144828186613961565b91505082606083015295945050505050565b634e487b7160e01b600052603260045260246000fd5b6000600182016144bc576144bc6142f9565b5060010190565b8381528260208201526060604082015260006144e26060830184613961565b95945050505050565b6040815260006144fe6040830185613f28565b82810360208401526144e28185613f28565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261454860a0830184613961565b979650505050505050565b60006020828403121561456557600080fd5b815161269881613903565b600060033d11156145895760046000803e5060005160e01c5b90565b600060443d101561459a5790565b6040516003193d81016004833e81513d67ffffffffffffffff81602484011181841117156145ca57505050505090565b82850191508151818111156145e25750505050505090565b843d87010160208285010111156145fc5750505050505090565b61460b60208286010187613aba565b509095945050505050565b60006001600160a01b03808816835280871660208401525060a0604083015261464260a0830186613f28565b82810360608401526146548186613f28565b905082810360808401526146688185613961565b98975050505050505050565b634e487b7160e01b600052602160045260246000fdfea264697066735822122051d914354eb9895f08a5e9f1fdba67a3035b608a1a35312f349ade8b2e0cc13a64736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000d4e66744e6f77506f646361737400000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): NftNowPodcast
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [2] : 4e66744e6f77506f646361737400000000000000000000000000000000000000
Deployed Bytecode Sourcemap
68846:12736:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51323:230;;;;;;;;;;-1:-1:-1;51323:230:0;;;;;:::i;:::-;;:::i;:::-;;;620:25:1;;;608:2;593:18;51323:230:0;;;;;;;;50346:310;;;;;;;;;;-1:-1:-1;50346:310:0;;;;;:::i;:::-;;:::i;:::-;;;1253:14:1;;1246:22;1228:41;;1216:2;1201:18;50346:310:0;1088:187:1;79784:80:0;;;;;;;;;;-1:-1:-1;79784:80:0;;;;;:::i;:::-;;:::i;:::-;;69534:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;78075:132::-;;;;;;;;;;-1:-1:-1;78075:132:0;;;;;:::i;:::-;;:::i;69807:63::-;;;;;;;;;;-1:-1:-1;69807:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;72011:1672;;;;;;:::i;:::-;;:::i;69477:25::-;;;;;;;;;;-1:-1:-1;69477:25:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;80435:120::-;;;;;;;;;;-1:-1:-1;80435:120:0;;;;;:::i;:::-;;:::i;53241:438::-;;;;;;;;;;-1:-1:-1;53241:438:0;;;;;:::i;:::-;;:::i;70892:875::-;;;;;;;;;;-1:-1:-1;70892:875:0;;;;;:::i;:::-;;:::i;75639:1327::-;;;;;;:::i;:::-;;:::i;79575:168::-;;;:::i;79922:101::-;;;;;;;;;;-1:-1:-1;79922:101:0;;;;;:::i;:::-;;:::i;51719:499::-;;;;;;;;;;-1:-1:-1;51719:499:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;67629:122::-;;;;;;;;;;-1:-1:-1;67629:122:0;;;;;:::i;:::-;67686:4;67507:16;;;:12;:16;;;;;;-1:-1:-1;;;67629:122:0;78407:124;;;;;;;;;;-1:-1:-1;78407:124:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;29449:103::-;;;;;;;;;;;;;:::i;69917:69::-;;;;;;;;;;-1:-1:-1;69917:69:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;73713:1848;;;;;;:::i;:::-;;:::i;69692:47::-;;;;;;;;;;-1:-1:-1;69692:47:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;77549:261::-;;;;;;;;;;-1:-1:-1;77549:261:0;;;;;:::i;:::-;;:::i;28808:87::-;;;;;;;;;;-1:-1:-1;28881:6:0;;-1:-1:-1;;;;;28881:6:0;28808:87;;;-1:-1:-1;;;;;14592:55:1;;;14574:74;;14562:2;14547:18;28808:87:0;14428:226:1;52291:155:0;;;;;;;;;;-1:-1:-1;52291:155:0;;;;;:::i;:::-;;:::i;80771:125::-;;;;;;;;;;-1:-1:-1;80771:125:0;;;;;:::i;:::-;;:::i;80941:77::-;;;;;;;;;;-1:-1:-1;81004:6:0;;;;80941:77;;67418:113;;;;;;;;;;-1:-1:-1;67418:113:0;;;;;:::i;:::-;67480:7;67507:16;;;:12;:16;;;;;;;67418:113;78256:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;77104:306::-;;;;;;;;;;-1:-1:-1;77104:306:0;;;;;:::i;:::-;;:::i;80092:297::-;;;;;;;;;;-1:-1:-1;80092:297:0;;;;;:::i;:::-;;:::i;76974:122::-;;;;;;;;;;-1:-1:-1;77075:10:0;76974:122;;52518:168;;;;;;;;;;-1:-1:-1;52518:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;52641:27:0;;;52617:4;52641:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;52518:168;80602:122;;;;;;;;;;-1:-1:-1;80602:122:0;;;;;:::i;:::-;;:::i;52758:406::-;;;;;;;;;;-1:-1:-1;52758:406:0;;;;;:::i;:::-;;:::i;29707:201::-;;;;;;;;;;-1:-1:-1;29707:201:0;;;;;:::i;:::-;;:::i;51323:230::-;51409:7;-1:-1:-1;;;;;51437:21:0;;51429:76;;;;-1:-1:-1;;;51429:76:0;;17832:2:1;51429:76:0;;;17814:21:1;17871:2;17851:18;;;17844:30;17910:34;17890:18;;;17883:62;17981:12;17961:18;;;17954:40;18011:19;;51429:76:0;;;;;;;;;-1:-1:-1;51523:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;51523:22:0;;;;;;;;;;51323:230;;;;;:::o;50346:310::-;50448:4;-1:-1:-1;;;;;;50485:41:0;;50500:26;50485:41;;:110;;-1:-1:-1;;;;;;;50543:52:0;;50558:37;50543:52;50485:110;:163;;;-1:-1:-1;41805:25:0;-1:-1:-1;;;;;;41790:40:0;;;50612:36;41681:157;79784:80;28694:13;:11;:13::i;:::-;79841:6:::1;:15:::0;;-1:-1:-1;;79841:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;79784:80::o;69534:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;78075:132::-;78168:19;;;;:10;:19;;;;;:31;;78161:38;;78135:13;;78168:31;78161:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78075:132;;;:::o;72011:1672::-;72141:26;72170:19;;;:10;:19;;;;;;;;72141:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72271:14;72288:26;72306:7;67480;67507:16;;;:12;:16;;;;;;;67418:113;72288:26;72377:6;;72271:43;;-1:-1:-1;72377:6:0;;:15;72369:56;;;;-1:-1:-1;;;72369:56:0;;18685:2:1;72369:56:0;;;18667:21:1;18724:2;18704:18;;;18697:30;18763;18743:18;;;18736:58;18811:18;;72369:56:0;18483:352:1;72369:56:0;72490:16;;72482:64;;;;-1:-1:-1;;;72482:64:0;;19042:2:1;72482:64:0;;;19024:21:1;19081:2;19061:18;;;19054:30;19120:34;19100:18;;;19093:62;-1:-1:-1;;;19171:18:1;;;19164:33;19214:19;;72482:64:0;18840:399:1;72482:64:0;72606:18;;;;:26;;72628:4;72606:26;72598:57;;;;-1:-1:-1;;;72598:57:0;;19446:2:1;72598:57:0;;;19428:21:1;19485:2;19465:18;;;19458:30;19524:20;19504:18;;;19497:48;19562:18;;72598:57:0;19244:342:1;72598:57:0;72726:22;;;;:31;72718:58;;;;-1:-1:-1;;;72718:58:0;;19793:2:1;72718:58:0;;;19775:21:1;19832:2;19812:18;;;19805:30;19871:16;19851:18;;;19844:44;19905:18;;72718:58:0;19591:338:1;72718:58:0;72888:19;;;;:23;;72910:1;72888:23;:::i;:::-;72869:15;72878:6;72869;:15;:::i;:::-;72868:43;72860:71;;;;-1:-1:-1;;;72860:71:0;;20455:2:1;72860:71:0;;;20437:21:1;20494:2;20474:18;;;20467:30;-1:-1:-1;;;20513:18:1;;;20506:45;20568:18;;72860:71:0;20253:339:1;72860:71:0;73044:20;;;;:24;;73067:1;73044:24;:::i;:::-;73034:6;73002:29;73012:10;73023:7;73002:9;:29::i;:::-;:38;;;;:::i;:::-;73001:67;72993:104;;;;-1:-1:-1;;;72993:104:0;;20799:2:1;72993:104:0;;;20781:21:1;20838:2;20818:18;;;20811:30;20877:26;20857:18;;;20850:54;20921:18;;72993:104:0;20597:348:1;72993:104:0;73225:20;;;;:24;;73248:1;73225:24;:::i;:::-;73172:29;;;;:20;:29;;;;;;;;73202:10;73172:41;;;;;;;;:50;;73216:6;;73172:50;:::i;:::-;:77;73164:119;;;;-1:-1:-1;;;73164:119:0;;21152:2:1;73164:119:0;;;21134:21:1;21191:2;21171:18;;;21164:30;21230:31;21210:18;;;21203:59;21279:18;;73164:119:0;20950:353:1;73164:119:0;73332:19;;;;:10;:19;;;;;:30;;;73375:9;;73332:39;;73365:6;;73332:39;:::i;:::-;:52;;73324:84;;;;-1:-1:-1;;;73324:84:0;;21683:2:1;73324:84:0;;;21665:21:1;21722:2;21702:18;;;21695:30;21761:21;21741:18;;;21734:49;21800:18;;73324:84:0;21481:343:1;73324:84:0;73429:29;;;;:20;:29;;;;;;;;73459:10;73429:41;;;;;;;:51;;73474:6;;73429:29;:51;;73474:6;;73429:51;:::i;:::-;;;;;;;;73524:38;73530:10;73542:7;73551:6;73524:38;;;;;;;;;;;;:5;:38::i;:::-;73625:39;;;22003:25:1;;;73648:15:0;22059:2:1;22044:18;;22037:34;73625:39:0;;21976:18:1;73625:39:0;;;;;;;72073:1610;;72011:1672;;:::o;69477:25::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;80435:120::-;28694:13;:11;:13::i;:::-;80510:19:::1;::::0;;;:10:::1;:19;::::0;;;;;:37;;;::::1;;;;-1:-1:-1::0;;80510:37:0;;::::1;::::0;;;::::1;::::0;;80435:120::o;53241:438::-;-1:-1:-1;;;;;53474:20:0;;27439:10;53474:20;;:60;;-1:-1:-1;53498:36:0;53515:4;27439:10;52518:168;:::i;53498:36::-;53452:156;;;;-1:-1:-1;;;53452:156:0;;22284:2:1;53452:156:0;;;22266:21:1;22323:2;22303:18;;;22296:30;22362:34;22342:18;;;22335:62;22433:16;22413:18;;;22406:44;22467:19;;53452:156:0;22082:410:1;53452:156:0;53619:52;53642:4;53648:2;53652:3;53657:7;53666:4;53619:22;:52::i;:::-;53241:438;;;;;:::o;70892:875::-;28694:13;:11;:13::i;:::-;71249:63:::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;71296:15:::1;71249:63:::0;;;;71235:8:::1;:78:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;71235:78:0;;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;71235:78:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;71235:78:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;71235:78:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;;;;;;;;;;;;71376:65;71380:8;71390:11;71403:10;71415:11;71428:12;71376:3;:65::i;:::-;71518:18:::0;;71514:114:::1;;71553:49;71559:12;71573:8;71583:14;71553:49;;;;;;;;;;;::::0;:5:::1;:49::i;:::-;71706:8;:15:::0;71691:68:::1;::::0;71706:19:::1;::::0;71724:1:::1;::::0;71706:19:::1;:::i;:::-;71727:6;71735;71743:15;71691:68;;;;;;;;;:::i;:::-;;;;;;;;70892:875:::0;;;;;;;;;;;:::o;75639:1327::-;75780:26;75809:19;;;:10;:19;;;;;;;;75780:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75906:14;75923:26;75941:7;67480;67507:16;;;:12;:16;;;;;;;67418:113;75923:26;76013:6;;75906:43;;-1:-1:-1;76013:6:0;;:15;76005:56;;;;-1:-1:-1;;;76005:56:0;;25568:2:1;76005:56:0;;;25550:21:1;25607:2;25587:18;;;25580:30;25646;25626:18;;;25619:58;25694:18;;76005:56:0;25366:352:1;76005:56:0;76115:16;;76107:64;;;;-1:-1:-1;;;76107:64:0;;19042:2:1;76107:64:0;;;19024:21:1;19081:2;19061:18;;;19054:30;19120:34;19100:18;;;19093:62;-1:-1:-1;;;19171:18:1;;;19164:33;19214:19;;76107:64:0;18840:399:1;76107:64:0;76230:19;;;;:27;;76253:4;76230:27;76222:53;;;;-1:-1:-1;;;76222:53:0;;25925:2:1;76222:53:0;;;25907:21:1;25964:2;25944:18;;;25937:30;26003:15;25983:18;;;25976:43;26036:18;;76222:53:0;25723:337:1;76222:53:0;76365:19;;;;:23;;76387:1;76365:23;:::i;:::-;76351:10;:6;76360:1;76351:10;:::i;:::-;76350:38;76342:66;;;;-1:-1:-1;;;76342:66:0;;20455:2:1;76342:66:0;;;20437:21:1;20494:2;20474:18;;;20467:30;-1:-1:-1;;;20513:18:1;;;20506:45;20568:18;;76342:66:0;20253:339:1;76342:66:0;76469:23;;;;:14;:23;;;;;;;;76493:10;76469:35;;;;;;;;;;:44;76461:78;;;;-1:-1:-1;;;76461:78:0;;26267:2:1;76461:78:0;;;26249:21:1;26306:2;26286:18;;;26279:30;26345:23;26325:18;;;26318:51;26386:18;;76461:78:0;26065:345:1;76461:78:0;76610:145;76745:9;;76610:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;76620:105:0;;26657:66:1;76620:105:0;;;26645:79:1;76697:10:0;26740:12:1;;;26733:28;26777:12;;;-1:-1:-1;76620:105:0;;-1:-1:-1;26415:380:1;76620:105:0;;;;;;;;;;;;;76610:126;;;;;;:134;;:145;;;;:::i;:::-;76592:14;;;;;-1:-1:-1;;;;;76592:14:0;;;:163;;;76584:200;;;;-1:-1:-1;;;76584:200:0;;27002:2:1;76584:200:0;;;26984:21:1;27041:2;27021:18;;;27014:30;27080:26;27060:18;;;27053:54;27124:18;;76584:200:0;26800:348:1;76584:200:0;76797:23;;;;:14;:23;;;;;;;;76821:10;76797:35;;;;;;;;;:42;;-1:-1:-1;;76797:42:0;76835:4;76797:42;;;;;;76850:32;;;;;;;;;;;;;76821:10;76812:7;;76835:4;76850:5;:32::i;:::-;76919:39;;;22003:25:1;;;76942:15:0;22059:2:1;22044:18;;22037:34;76919:39:0;;21976:18:1;76919:39:0;;;;;;;75712:1254;;75639:1327;;;:::o;79575:168::-;28694:13;:11;:13::i;:::-;79650:58:::1;::::0;79632:12:::1;::::0;79658:10:::1;::::0;79682:21:::1;::::0;79632:12;79650:58;79632:12;79650:58;79682:21;79658:10;79650:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79631:77;;;79727:7;79719:16;;;::::0;::::1;;79620:123;79575:168::o:0;79922:101::-;28694:13;:11;:13::i;:::-;79988:14:::1;:27:::0;;-1:-1:-1;;;;;79988:27:0;;::::1;;;::::0;;;::::1;::::0;;;::::1;::::0;;79922:101::o;51719:499::-;51855:16;51911:3;:10;51892:8;:15;:29;51884:83;;;;-1:-1:-1;;;51884:83:0;;27565:2:1;51884:83:0;;;27547:21:1;27604:2;27584:18;;;27577:30;27643:34;27623:18;;;27616:62;27714:11;27694:18;;;27687:39;27743:19;;51884:83:0;27363:405:1;51884:83:0;51980:30;52027:8;:15;52013:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52013:30:0;;51980:63;;52061:9;52056:122;52080:8;:15;52076:1;:19;52056:122;;;52136:30;52146:8;52155:1;52146:11;;;;;;;;:::i;:::-;;;;;;;52159:3;52163:1;52159:6;;;;;;;;:::i;:::-;;;;;;;52136:9;:30::i;:::-;52117:13;52131:1;52117:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;52097:3;;;:::i;:::-;;;52056:122;;;-1:-1:-1;52197:13:0;51719:499;-1:-1:-1;;;51719:499:0:o;78407:124::-;78469:14;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78469:14:0;78503:8;78512:10;78503:20;;;;;;;;:::i;:::-;;;;;;;;;;;78496:27;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78407:124;;;:::o;29449:103::-;28694:13;:11;:13::i;:::-;29514:30:::1;29541:1;29514:18;:30::i;:::-;29449:103::o:0;73713:1848::-;73878:26;73907:19;;;:10;:19;;;;;;;;73878:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74004:14;74021:26;74039:7;67480;67507:16;;;:12;:16;;;;;;;67418:113;74021:26;74110:6;;74004:43;;-1:-1:-1;74110:6:0;;:15;74102:56;;;;-1:-1:-1;;;74102:56:0;;18685:2:1;74102:56:0;;;18667:21:1;18724:2;18704:18;;;18697:30;18763;18743:18;;;18736:58;18811:18;;74102:56:0;18483:352:1;74102:56:0;74218:18;;;;:26;;74240:4;74218:26;74210:57;;;;-1:-1:-1;;;74210:57:0;;19446:2:1;74210:57:0;;;19428:21:1;19485:2;19465:18;;;19458:30;19524:20;19504:18;;;19497:48;19562:18;;74210:57:0;19244:342:1;74210:57:0;74329:22;;;;:30;;74355:4;74329:30;74321:60;;;;-1:-1:-1;;;74321:60:0;;28304:2:1;74321:60:0;;;28286:21:1;28343:2;28323:18;;;28316:30;28382:19;28362:18;;;28355:47;28419:18;;74321:60:0;28102:341:1;74321:60:0;74443:16;;74435:64;;;;-1:-1:-1;;;74435:64:0;;19042:2:1;74435:64:0;;;19024:21:1;19081:2;19061:18;;;19054:30;19120:34;19100:18;;;19093:62;-1:-1:-1;;;19171:18:1;;;19164:33;19214:19;;74435:64:0;18840:399:1;74435:64:0;74594:19;;;;:23;;74616:1;74594:23;:::i;:::-;74575:15;74584:6;74575;:15;:::i;:::-;74574:43;74566:71;;;;-1:-1:-1;;;74566:71:0;;20455:2:1;74566:71:0;;;20437:21:1;20494:2;20474:18;;;20467:30;-1:-1:-1;;;20513:18:1;;;20506:45;20568:18;;74566:71:0;20253:339:1;74566:71:0;74750:20;;;;:24;;74773:1;74750:24;:::i;:::-;74740:6;74708:29;74718:10;74729:7;74708:9;:29::i;:::-;:38;;;;:::i;:::-;74707:67;74699:104;;;;-1:-1:-1;;;74699:104:0;;20799:2:1;74699:104:0;;;20781:21:1;20838:2;20818:18;;;20811:30;20877:26;20857:18;;;20850:54;20921:18;;74699:104:0;20597:348:1;74699:104:0;74923:20;;;;:24;;74946:1;74923:24;:::i;:::-;74870:29;;;;:20;:29;;;;;;;;74900:10;74870:41;;;;;;;;:50;;74914:6;;74870:50;:::i;:::-;:77;74862:119;;;;-1:-1:-1;;;74862:119:0;;21152:2:1;74862:119:0;;;21134:21:1;21191:2;21171:18;;;21164:30;21230:31;21210:18;;;21203:59;21279:18;;74862:119:0;20950:353:1;74862:119:0;75044:145;75179:9;;75044:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;75054:105:0;;26657:66:1;75054:105:0;;;26645:79:1;75131:10:0;26740:12:1;;;26733:28;26777:12;;;-1:-1:-1;75054:105:0;;-1:-1:-1;26415:380:1;75044:145:0;75026:14;;;;;-1:-1:-1;;;;;75026:14:0;;;:163;;;75018:200;;;;-1:-1:-1;;;75018:200:0;;27002:2:1;75018:200:0;;;26984:21:1;27041:2;27021:18;;;27014:30;27080:26;27060:18;;;27053:54;27124:18;;75018:200:0;26800:348:1;75018:200:0;75267:19;;;;:10;:19;;;;;:30;;;75310:9;;75267:39;;75300:6;;75267:39;:::i;:::-;:52;;75259:84;;;;-1:-1:-1;;;75259:84:0;;21683:2:1;75259:84:0;;;21665:21:1;21722:2;21702:18;;;21695:30;21761:21;21741:18;;;21734:49;21800:18;;75259:84:0;21481:343:1;75259:84:0;75356:29;;;;:20;:29;;;;;;;;75386:10;75356:41;;;;;;;:51;;75401:6;;75356:29;:51;;75401:6;;75356:51;:::i;:::-;;;;;;;;75451:37;75457:10;75468:7;75477:6;75451:37;;;;;;;;;;;;:5;:37::i;:::-;75514:39;;;22003:25:1;;;75537:15:0;22059:2:1;22044:18;;22037:34;75514:39:0;;21976:18:1;75514:39:0;;;;;;;73810:1751;;73713:1848;;;;:::o;69692:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;77549:261::-;28694:13;:11;:13::i;:::-;77641:9:::1;77636:98;77652:16:::0;;::::1;77636:98;;;77690:31;77696:5;;77702:1;77696:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;77706:7;77715:1;77690:31;;;;;;;;;;;::::0;:5:::1;:31::i;:::-;77670:3:::0;::::1;::::0;::::1;:::i;:::-;;;;77636:98;;;-1:-1:-1::0;77759:43:0::1;::::0;;22003:25:1;;;77786:15:0::1;22059:2:1::0;22044:18;;22037:34;77759:43:0::1;::::0;21976:18:1;77759:43:0::1;;;;;;;77549:261:::0;;;:::o;52291:155::-;52386:52;27439:10;52419:8;52429;52386:18;:52::i;:::-;52291:155;;:::o;80771:125::-;28694:13;:11;:13::i;:::-;80847:19:::1;::::0;;;:10:::1;:19;::::0;;;;;:41;;;::::1;;::::0;::::1;-1:-1:-1::0;;80847:41:0;;::::1;::::0;;;::::1;::::0;;80771:125::o;78256:99::-;78303:16;78339:8;78332:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78256:99;:::o;77104:306::-;77181:7;77208:194;77392:9;;77208:194;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;77232:140:0;;26657:66:1;77232:140:0;;;26645:79:1;77344:10:0;26740:12:1;;;26733:28;26777:12;;;-1:-1:-1;77232:140:0;;-1:-1:-1;26415:380:1;77208:194:0;77201:201;77104:306;-1:-1:-1;;;77104:306:0:o;80092:297::-;28694:13;:11;:13::i;:::-;80186:19:::1;::::0;;;:10:::1;:19;::::0;;;;:26;::::1;;80178:73;;;::::0;-1:-1:-1;;;80178:73:0;;28650:2:1;80178:73:0::1;::::0;::::1;28632:21:1::0;28689:2;28669:18;;;28662:30;28728:34;28708:18;;;28701:62;28799:4;28779:18;;;28772:32;28821:19;;80178:73:0::1;28448:398:1::0;80178:73:0::1;80263:19;::::0;;;:10:::1;:19;::::0;;;;:31:::1;;:46;80297:12:::0;80263:31;:46:::1;:::i;:::-;;80327:54;80342:7;80351:15;80368:12;80327:54;;;;;;;;:::i;:::-;;;;;;;;80092:297:::0;;:::o;80602:122::-;28694:13;:11;:13::i;:::-;80678:19:::1;::::0;;;:10:::1;:19;::::0;;;;;:38;;;::::1;;::::0;::::1;-1:-1:-1::0;;80678:38:0;;::::1;::::0;;;::::1;::::0;;80602:122::o;52758:406::-;-1:-1:-1;;;;;52966:20:0;;27439:10;52966:20;;:60;;-1:-1:-1;52990:36:0;53007:4;27439:10;52518:168;:::i;52990:36::-;52944:156;;;;-1:-1:-1;;;52944:156:0;;22284:2:1;52944:156:0;;;22266:21:1;22323:2;22303:18;;;22296:30;22362:34;22342:18;;;22335:62;22433:16;22413:18;;;22406:44;22467:19;;52944:156:0;22082:410:1;52944:156:0;53111:45;53129:4;53135:2;53139;53143:6;53151:4;53111:17;:45::i;29707:201::-;28694:13;:11;:13::i;:::-;-1:-1:-1;;;;;29796:22:0;::::1;29788:73;;;::::0;-1:-1:-1;;;29788:73:0;;29420:2:1;29788:73:0::1;::::0;::::1;29402:21:1::0;29459:2;29439:18;;;29432:30;29498:34;29478:18;;;29471:62;29569:8;29549:18;;;29542:36;29595:19;;29788:73:0::1;29218:402:1::0;29788:73:0::1;29872:28;29891:8;29872:18;:28::i;28973:132::-:0;28881:6;;-1:-1:-1;;;;;28881:6:0;27439:10;29037:23;29029:68;;;;-1:-1:-1;;;29029:68:0;;29827:2:1;29029:68:0;;;29809:21:1;;;29846:18;;;29839:30;29905:34;29885:18;;;29878:62;29957:18;;29029:68:0;29625:356:1;57939:686:0;-1:-1:-1;;;;;58049:16:0;;58041:62;;;;-1:-1:-1;;;58041:62:0;;30188:2:1;58041:62:0;;;30170:21:1;30227:2;30207:18;;;30200:30;30266:34;30246:18;;;30239:62;30337:3;30317:18;;;30310:31;30358:19;;58041:62:0;29986:397:1;58041:62:0;27439:10;58116:16;58181:21;58199:2;58181:17;:21::i;:::-;58158:44;;58213:24;58240:25;58258:6;58240:17;:25::i;:::-;58213:52;;58278:66;58299:8;58317:1;58321:2;58325:3;58330:7;58339:4;58278:20;:66::i;:::-;58357:9;:13;;;;;;;;;;;-1:-1:-1;;;;;58357:17:0;;;;;;;;;:27;;58378:6;;58357:9;:27;;58378:6;;58357:27;:::i;:::-;;;;-1:-1:-1;;58400:52:0;;;22003:25:1;;;22059:2;22044:18;;22037:34;;;-1:-1:-1;;;;;58400:52:0;;;;58433:1;;58400:52;;;;;;21976:18:1;58400:52:0;;;;;;;58543:74;58574:8;58592:1;58596:2;58600;58604:6;58612:4;58543:30;:74::i;:::-;58030:595;;;57939:686;;;;:::o;55475:1146::-;55702:7;:14;55688:3;:10;:28;55680:81;;;;-1:-1:-1;;;55680:81:0;;30590:2:1;55680:81:0;;;30572:21:1;30629:2;30609:18;;;30602:30;30668:34;30648:18;;;30641:62;30739:10;30719:18;;;30712:38;30767:19;;55680:81:0;30388:404:1;55680:81:0;-1:-1:-1;;;;;55780:16:0;;55772:66;;;;-1:-1:-1;;;55772:66:0;;30999:2:1;55772:66:0;;;30981:21:1;31038:2;31018:18;;;31011:30;31077:34;31057:18;;;31050:62;-1:-1:-1;;;31128:18:1;;;31121:35;31173:19;;55772:66:0;30797:401:1;55772:66:0;27439:10;55895:60;27439:10;55926:4;55932:2;55936:3;55941:7;55950:4;55895:20;:60::i;:::-;55973:9;55968:421;55992:3;:10;55988:1;:14;55968:421;;;56024:10;56037:3;56041:1;56037:6;;;;;;;;:::i;:::-;;;;;;;56024:19;;56058:14;56075:7;56083:1;56075:10;;;;;;;;:::i;:::-;;;;;;;;;;;;56102:19;56124:13;;;;;;;;;;-1:-1:-1;;;;;56124:19:0;;;;;;;;;;;;56075:10;;-1:-1:-1;56166:21:0;;;;56158:76;;;;-1:-1:-1;;;56158:76:0;;31405:2:1;56158:76:0;;;31387:21:1;31444:2;31424:18;;;31417:30;31483:34;31463:18;;;31456:62;-1:-1:-1;;;31534:18:1;;;31527:40;31584:19;;56158:76:0;31203:406:1;56158:76:0;56278:9;:13;;;;;;;;;;;-1:-1:-1;;;;;56278:19:0;;;;;;;;;;56300:20;;;56278:42;;56350:17;;;;;;;:27;;56300:20;;56278:9;56350:27;;56300:20;;56350:27;:::i;:::-;;;;;;;;56009:380;;;56004:3;;;;:::i;:::-;;;55968:421;;;;56436:2;-1:-1:-1;;;;;56406:47:0;56430:4;-1:-1:-1;;;;;56406:47:0;56420:8;-1:-1:-1;;;;;56406:47:0;;56440:3;56445:7;56406:47;;;;;;;:::i;:::-;;;;;;;;56538:75;56574:8;56584:4;56590:2;56594:3;56599:7;56608:4;56538:35;:75::i;:::-;55669:952;55475:1146;;;;;:::o;78774:461::-;78978:19;;;;:10;:19;;;;;:26;;;78977:27;78969:74;;;;-1:-1:-1;;;78969:74:0;;32286:2:1;78969:74:0;;;32268:21:1;32325:2;32305:18;;;32298:30;32364:34;32344:18;;;32337:62;32435:4;32415:18;;;32408:32;32457:19;;78969:74:0;32084:398:1;78969:74:0;79135:91;;;;;;;;79145:4;79135:91;;;;;;79151:5;79135:91;;;;;;79158:5;79135:91;;;;;;79165:5;79135:91;;;;;;79172:10;79135:91;;;;79184:16;79135:91;;;;79202:10;79135:91;;;;79214:11;79135:91;;;79113:10;:19;79124:7;79113:19;;;;;;;;;;;:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;78774:461:0:o;21078:231::-;21156:7;21177:17;21196:18;21218:27;21229:4;21235:9;21218:10;:27::i;:::-;21176:69;;;;21256:18;21268:5;21256:11;:18::i;30068:191::-;30161:6;;;-1:-1:-1;;;;;30178:17:0;;;;;;;;;;;30211:40;;30161:6;;;30178:17;30161:6;;30211:40;;30142:16;;30211:40;30131:128;30068:191;:::o;62241:297::-;62362:8;-1:-1:-1;;;;;62353:17:0;:5;-1:-1:-1;;;;;62353:17:0;;62345:71;;;;-1:-1:-1;;;62345:71:0;;32689:2:1;62345:71:0;;;32671:21:1;32728:2;32708:18;;;32701:30;32767:34;32747:18;;;32740:62;32838:11;32818:18;;;32811:39;32867:19;;62345:71:0;32487:405:1;62345:71:0;-1:-1:-1;;;;;62427:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;62427:46:0;;;;;;;;;;62489:41;;1228::1;;;62489::0;;1201:18:1;62489:41:0;;;;;;;62241:297;;;:::o;54143:974::-;-1:-1:-1;;;;;54331:16:0;;54323:66;;;;-1:-1:-1;;;54323:66:0;;30999:2:1;54323:66:0;;;30981:21:1;31038:2;31018:18;;;31011:30;31077:34;31057:18;;;31050:62;-1:-1:-1;;;31128:18:1;;;31121:35;31173:19;;54323:66:0;30797:401:1;54323:66:0;27439:10;54402:16;54467:21;54485:2;54467:17;:21::i;:::-;54444:44;;54499:24;54526:25;54544:6;54526:17;:25::i;:::-;54499:52;;54564:60;54585:8;54595:4;54601:2;54605:3;54610:7;54619:4;54564:20;:60::i;:::-;54637:19;54659:13;;;;;;;;;;;-1:-1:-1;;;;;54659:19:0;;;;;;;;;;54697:21;;;;54689:76;;;;-1:-1:-1;;;54689:76:0;;31405:2:1;54689:76:0;;;31387:21:1;31444:2;31424:18;;;31417:30;31483:34;31463:18;;;31456:62;-1:-1:-1;;;31534:18:1;;;31527:40;31584:19;;54689:76:0;31203:406:1;54689:76:0;54801:9;:13;;;;;;;;;;;-1:-1:-1;;;;;54801:19:0;;;;;;;;;;54823:20;;;54801:42;;54865:17;;;;;;;:27;;54823:20;;54801:9;54865:27;;54823:20;;54865:27;:::i;:::-;;;;-1:-1:-1;;54910:46:0;;;22003:25:1;;;22059:2;22044:18;;22037:34;;;-1:-1:-1;;;;;54910:46:0;;;;;;;;;;;;;;21976:18:1;54910:46:0;;;;;;;55041:68;55072:8;55082:4;55088:2;55092;55096:6;55104:4;55041:30;:68::i;:::-;54312:805;;;;54143:974;;;;;:::o;66473:198::-;66593:16;;;66607:1;66593:16;;;;;;;;;66539;;66568:22;;66593:16;;;;;;;;;;;;-1:-1:-1;66593:16:0;66568:41;;66631:7;66620:5;66626:1;66620:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;66658:5;66473:198;-1:-1:-1;;66473:198:0:o;81250:329::-;81505:66;81532:8;81542:4;81548:2;81552:3;81557:7;81566:4;81505:26;:66::i;64900:744::-;-1:-1:-1;;;;;65115:13:0;;32035:19;:23;65111:526;;65151:72;;-1:-1:-1;;;65151:72:0;;-1:-1:-1;;;;;65151:38:0;;;;;:72;;65190:8;;65200:4;;65206:2;;65210:6;;65218:4;;65151:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65151:72:0;;;;;;;;-1:-1:-1;;65151:72:0;;;;;;;;;;;;:::i;:::-;;;65147:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;65499:6;65492:14;;-1:-1:-1;;;65492:14:0;;;;;;;;:::i;65147:479::-;;;65548:62;;-1:-1:-1;;;65548:62:0;;34802:2:1;65548:62:0;;;34784:21:1;34841:2;34821:18;;;34814:30;34880:34;34860:18;;;34853:62;34951:22;34931:18;;;34924:50;34991:19;;65548:62:0;34600:416:1;65147:479:0;-1:-1:-1;;;;;;65273:55:0;;-1:-1:-1;;;65273:55:0;65269:154;;65353:50;;-1:-1:-1;;;65353:50:0;;35223:2:1;65353:50:0;;;35205:21:1;35262:2;35242:18;;;35235:30;35301:34;35281:18;;;35274:62;-1:-1:-1;;;35352:18:1;;;35345:38;35400:19;;65353:50:0;35021:404:1;65652:813:0;-1:-1:-1;;;;;65892:13:0;;32035:19;:23;65888:570;;65928:79;;-1:-1:-1;;;65928:79:0;;-1:-1:-1;;;;;65928:43:0;;;;;:79;;65972:8;;65982:4;;65988:3;;65993:7;;66002:4;;65928:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65928:79:0;;;;;;;;-1:-1:-1;;65928:79:0;;;;;;;;;;;;:::i;:::-;;;65924:523;;;;:::i;:::-;-1:-1:-1;;;;;;66089:60:0;;-1:-1:-1;;;66089:60:0;66085:159;;66174:50;;-1:-1:-1;;;66174:50:0;;35223:2:1;66174:50:0;;;35205:21:1;35262:2;35242:18;;;35235:30;35301:34;35281:18;;;35274:62;-1:-1:-1;;;35352:18:1;;;35345:38;35400:19;;66174:50:0;35021:404:1;19529:747:0;19610:7;19619:12;19648:9;:16;19668:2;19648:22;19644:625;;19992:4;19977:20;;19971:27;20042:4;20027:20;;20021:27;20100:4;20085:20;;20079:27;19687:9;20071:36;20143:25;20154:4;20071:36;19971:27;20021;20143:10;:25::i;:::-;20136:32;;;;;;;;;19644:625;-1:-1:-1;20217:1:0;;-1:-1:-1;20221:35:0;19644:625;19529:747;;;;;:::o;17922:521::-;18000:20;17991:5;:29;;;;;;;;:::i;:::-;;17987:449;;17922:521;:::o;17987:449::-;18098:29;18089:5;:38;;;;;;;;:::i;:::-;;18085:351;;18144:34;;-1:-1:-1;;;18144:34:0;;36676:2:1;18144:34:0;;;36658:21:1;36715:2;36695:18;;;36688:30;36754:26;36734:18;;;36727:54;36798:18;;18144:34:0;36474:348:1;18085:351:0;18209:35;18200:5;:44;;;;;;;;:::i;:::-;;18196:240;;18261:41;;-1:-1:-1;;;18261:41:0;;37029:2:1;18261:41:0;;;37011:21:1;37068:2;37048:18;;;37041:30;37107:33;37087:18;;;37080:61;37158:18;;18261:41:0;36827:355:1;18196:240:0;18333:30;18324:5;:39;;;;;;;;:::i;:::-;;18320:116;;18380:44;;-1:-1:-1;;;18380:44:0;;37389:2:1;18380:44:0;;;37371:21:1;37428:2;37408:18;;;37401:30;37467:34;37447:18;;;37440:62;37538:4;37518:18;;;37511:32;37560:19;;18380:44:0;37187:398:1;67826:931:0;-1:-1:-1;;;;;68148:18:0;;68144:160;;68188:9;68183:110;68207:3;:10;68203:1;:14;68183:110;;;68267:7;68275:1;68267:10;;;;;;;;:::i;:::-;;;;;;;68243:12;:20;68256:3;68260:1;68256:6;;;;;;;;:::i;:::-;;;;;;;68243:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;68219:3:0;;-1:-1:-1;68219:3:0;;:::i;:::-;;;68183:110;;;;68144:160;-1:-1:-1;;;;;68320:16:0;;68316:434;;68358:9;68353:386;68377:3;:10;68373:1;:14;68353:386;;;68413:10;68426:3;68430:1;68426:6;;;;;;;;:::i;:::-;;;;;;;68413:19;;68451:14;68468:7;68476:1;68468:10;;;;;;;;:::i;:::-;;;;;;;68451:27;;68497:14;68514:12;:16;68527:2;68514:16;;;;;;;;;;;;68497:33;;68567:6;68557;:16;;68549:69;;;;-1:-1:-1;;;68549:69:0;;37792:2:1;68549:69:0;;;37774:21:1;37831:2;37811:18;;;37804:30;37870:34;37850:18;;;37843:62;37941:10;37921:18;;;37914:38;37969:19;;68549:69:0;37590:404:1;68549:69:0;68670:16;;;;:12;:16;;;;;;68689:15;;68670:34;;68389:3;;;:::i;:::-;;;68353:386;;22462:1477;22550:7;;23484:66;23471:79;;23467:163;;;-1:-1:-1;23583:1:0;;-1:-1:-1;23587:30:0;23567:51;;23467:163;23744:24;;;23727:14;23744:24;;;;;;;;;38226:25:1;;;38299:4;38287:17;;38267:18;;;38260:45;;;;38321:18;;;38314:34;;;38364:18;;;38357:34;;;23744:24:0;;38198:19:1;;23744:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23744:24:0;;-1:-1:-1;;23744:24:0;;;-1:-1:-1;;;;;;;23783:20:0;;23779:103;;23836:1;23840:29;23820:50;;;;;;;23779:103;23902:6;-1:-1:-1;23910:20:0;;-1:-1:-1;22462:1477:0;;;;;;;;:::o;14:196:1:-;82:20;;-1:-1:-1;;;;;131:54:1;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:254::-;283:6;291;344:2;332:9;323:7;319:23;315:32;312:52;;;360:1;357;350:12;312:52;383:29;402:9;383:29;:::i;:::-;373:39;459:2;444:18;;;;431:32;;-1:-1:-1;;;215:254:1:o;656:177::-;-1:-1:-1;;;;;;734:5:1;730:78;723:5;720:89;710:117;;823:1;820;813:12;838:245;896:6;949:2;937:9;928:7;924:23;920:32;917:52;;;965:1;962;955:12;917:52;1004:9;991:23;1023:30;1047:5;1023:30;:::i;1280:160::-;1345:20;;1401:13;;1394:21;1384:32;;1374:60;;1430:1;1427;1420:12;1445:180;1501:6;1554:2;1542:9;1533:7;1529:23;1525:32;1522:52;;;1570:1;1567;1560:12;1522:52;1593:26;1609:9;1593:26;:::i;1630:423::-;1672:3;1710:5;1704:12;1737:6;1732:3;1725:19;1762:1;1772:162;1786:6;1783:1;1780:13;1772:162;;;1848:4;1904:13;;;1900:22;;1894:29;1876:11;;;1872:20;;1865:59;1801:12;1772:162;;;1776:3;1979:1;1972:4;1963:6;1958:3;1954:16;1950:27;1943:38;2042:4;2035:2;2031:7;2026:2;2018:6;2014:15;2010:29;2005:3;2001:39;1997:50;1990:57;;;1630:423;;;;:::o;2058:220::-;2207:2;2196:9;2189:21;2170:4;2227:45;2268:2;2257:9;2253:18;2245:6;2227:45;:::i;2283:180::-;2342:6;2395:2;2383:9;2374:7;2370:23;2366:32;2363:52;;;2411:1;2408;2401:12;2363:52;-1:-1:-1;2434:23:1;;2283:180;-1:-1:-1;2283:180:1:o;2468:254::-;2536:6;2544;2597:2;2585:9;2576:7;2572:23;2568:32;2565:52;;;2613:1;2610;2603:12;2565:52;2649:9;2636:23;2626:33;;2678:38;2712:2;2701:9;2697:18;2678:38;:::i;:::-;2668:48;;2468:254;;;;;:::o;2727:248::-;2795:6;2803;2856:2;2844:9;2835:7;2831:23;2827:32;2824:52;;;2872:1;2869;2862:12;2824:52;-1:-1:-1;;2895:23:1;;;2965:2;2950:18;;;2937:32;;-1:-1:-1;2727:248:1:o;2980:783::-;3301:3;3290:9;3283:22;3264:4;3328:46;3369:3;3358:9;3354:19;3346:6;3328:46;:::i;:::-;3422:9;3414:6;3410:22;3405:2;3394:9;3390:18;3383:50;3456:33;3482:6;3474;3456:33;:::i;:::-;3442:47;;3537:9;3529:6;3525:22;3520:2;3509:9;3505:18;3498:50;3571:33;3597:6;3589;3571:33;:::i;:::-;3557:47;;3652:9;3644:6;3640:22;3635:2;3624:9;3620:18;3613:50;3680:33;3706:6;3698;3680:33;:::i;:::-;3672:41;;;3750:6;3744:3;3733:9;3729:19;3722:35;2980:783;;;;;;;;:::o;3768:248::-;3833:6;3841;3894:2;3882:9;3873:7;3869:23;3865:32;3862:52;;;3910:1;3907;3900:12;3862:52;3946:9;3933:23;3923:33;;3975:35;4006:2;3995:9;3991:18;3975:35;:::i;4021:184::-;-1:-1:-1;;;4070:1:1;4063:88;4170:4;4167:1;4160:15;4194:4;4191:1;4184:15;4210:249;4320:2;4301:13;;-1:-1:-1;;4297:27:1;4285:40;;4355:18;4340:34;;4376:22;;;4337:62;4334:88;;;4402:18;;:::i;:::-;4438:2;4431:22;-1:-1:-1;;4210:249:1:o;4464:183::-;4524:4;4557:18;4549:6;4546:30;4543:56;;;4579:18;;:::i;:::-;-1:-1:-1;4624:1:1;4620:14;4636:4;4616:25;;4464:183::o;4652:724::-;4706:5;4759:3;4752:4;4744:6;4740:17;4736:27;4726:55;;4777:1;4774;4767:12;4726:55;4813:6;4800:20;4839:4;4862:43;4902:2;4862:43;:::i;:::-;4934:2;4928:9;4946:31;4974:2;4966:6;4946:31;:::i;:::-;5012:18;;;5104:1;5100:10;;;;5088:23;;5084:32;;;5046:15;;;;-1:-1:-1;5128:15:1;;;5125:35;;;5156:1;5153;5146:12;5125:35;5192:2;5184:6;5180:15;5204:142;5220:6;5215:3;5212:15;5204:142;;;5286:17;;5274:30;;5324:12;;;;5237;;5204:142;;;-1:-1:-1;5364:6:1;4652:724;-1:-1:-1;;;;;;4652:724:1:o;5381:555::-;5423:5;5476:3;5469:4;5461:6;5457:17;5453:27;5443:55;;5494:1;5491;5484:12;5443:55;5530:6;5517:20;5556:18;5552:2;5549:26;5546:52;;;5578:18;;:::i;:::-;5627:2;5621:9;5639:67;5694:2;5675:13;;-1:-1:-1;;5671:27:1;5700:4;5667:38;5621:9;5639:67;:::i;:::-;5730:2;5722:6;5715:18;5776:3;5769:4;5764:2;5756:6;5752:15;5748:26;5745:35;5742:55;;;5793:1;5790;5783:12;5742:55;5857:2;5850:4;5842:6;5838:17;5831:4;5823:6;5819:17;5806:54;5904:1;5880:15;;;5897:4;5876:26;5869:37;;;;5884:6;5381:555;-1:-1:-1;;;5381:555:1:o;5941:943::-;6095:6;6103;6111;6119;6127;6180:3;6168:9;6159:7;6155:23;6151:33;6148:53;;;6197:1;6194;6187:12;6148:53;6220:29;6239:9;6220:29;:::i;:::-;6210:39;;6268:38;6302:2;6291:9;6287:18;6268:38;:::i;:::-;6258:48;;6357:2;6346:9;6342:18;6329:32;6380:18;6421:2;6413:6;6410:14;6407:34;;;6437:1;6434;6427:12;6407:34;6460:61;6513:7;6504:6;6493:9;6489:22;6460:61;:::i;:::-;6450:71;;6574:2;6563:9;6559:18;6546:32;6530:48;;6603:2;6593:8;6590:16;6587:36;;;6619:1;6616;6609:12;6587:36;6642:63;6697:7;6686:8;6675:9;6671:24;6642:63;:::i;:::-;6632:73;;6758:3;6747:9;6743:19;6730:33;6714:49;;6788:2;6778:8;6775:16;6772:36;;;6804:1;6801;6794:12;6772:36;;6827:51;6870:7;6859:8;6848:9;6844:24;6827:51;:::i;:::-;6817:61;;;5941:943;;;;;;;;:::o;6889:1515::-;7088:6;7096;7104;7112;7120;7128;7136;7144;7152;7160;7168:7;7222:3;7210:9;7201:7;7197:23;7193:33;7190:53;;;7239:1;7236;7229:12;7190:53;7262:18;7320:2;7308:9;7295:23;7292:31;7289:51;;;7336:1;7333;7326:12;7289:51;7359:66;7417:7;7404:9;7391:23;7380:9;7376:39;7359:66;:::i;:::-;7349:76;;7474:2;7468;7457:9;7453:18;7440:32;7437:40;7434:60;;;7490:1;7487;7480:12;7434:60;7513:75;7580:7;7573:2;7562:9;7558:18;7545:32;7534:9;7530:48;7513:75;:::i;:::-;7503:85;;7637:2;7631;7620:9;7616:18;7603:32;7600:40;7597:60;;;7653:1;7650;7643:12;7597:60;7676:75;7743:7;7736:2;7725:9;7721:18;7708:32;7697:9;7693:48;7676:75;:::i;:::-;7666:85;;7800:2;7794;7783:9;7779:18;7766:32;7763:40;7760:60;;;7816:1;7813;7806:12;7760:60;7839:75;7906:7;7899:2;7888:9;7884:18;7871:32;7860:9;7856:48;7839:75;:::i;:::-;7829:85;;7961:3;7950:9;7946:19;7933:33;7923:43;;8013:3;8002:9;7998:19;7985:33;7975:43;;8065:3;8054:9;8050:19;8037:33;8027:43;;8117:3;8106:9;8102:19;8089:33;8079:43;;8172:2;8165:3;8154:9;8150:19;8137:33;8134:41;8131:61;;;8188:1;8185;8178:12;8131:61;;8211:76;8279:7;8271:3;8260:9;8256:19;8243:33;8232:9;8228:49;8211:76;:::i;:::-;8201:86;;8334:3;8323:9;8319:19;8306:33;8296:43;;8359:39;8393:3;8382:9;8378:19;8359:39;:::i;:::-;8348:50;;6889:1515;;;;;;;;;;;;;;:::o;8409:347::-;8460:8;8470:6;8524:3;8517:4;8509:6;8505:17;8501:27;8491:55;;8542:1;8539;8532:12;8491:55;-1:-1:-1;8565:20:1;;8608:18;8597:30;;8594:50;;;8640:1;8637;8630:12;8594:50;8677:4;8669:6;8665:17;8653:29;;8729:3;8722:4;8713:6;8705;8701:19;8697:30;8694:39;8691:59;;;8746:1;8743;8736:12;8761:477;8840:6;8848;8856;8909:2;8897:9;8888:7;8884:23;8880:32;8877:52;;;8925:1;8922;8915:12;8877:52;8961:9;8948:23;8938:33;;9022:2;9011:9;9007:18;8994:32;9049:18;9041:6;9038:30;9035:50;;;9081:1;9078;9071:12;9035:50;9120:58;9170:7;9161:6;9150:9;9146:22;9120:58;:::i;:::-;8761:477;;9197:8;;-1:-1:-1;9094:84:1;;-1:-1:-1;;;;8761:477:1:o;9243:186::-;9302:6;9355:2;9343:9;9334:7;9330:23;9326:32;9323:52;;;9371:1;9368;9361:12;9323:52;9394:29;9413:9;9394:29;:::i;9434:1208::-;9552:6;9560;9613:2;9601:9;9592:7;9588:23;9584:32;9581:52;;;9629:1;9626;9619:12;9581:52;9669:9;9656:23;9698:18;9739:2;9731:6;9728:14;9725:34;;;9755:1;9752;9745:12;9725:34;9793:6;9782:9;9778:22;9768:32;;9838:7;9831:4;9827:2;9823:13;9819:27;9809:55;;9860:1;9857;9850:12;9809:55;9896:2;9883:16;9918:4;9941:43;9981:2;9941:43;:::i;:::-;10013:2;10007:9;10025:31;10053:2;10045:6;10025:31;:::i;:::-;10091:18;;;10179:1;10175:10;;;;10167:19;;10163:28;;;10125:15;;;;-1:-1:-1;10203:19:1;;;10200:39;;;10235:1;10232;10225:12;10200:39;10259:11;;;;10279:148;10295:6;10290:3;10287:15;10279:148;;;10361:23;10380:3;10361:23;:::i;:::-;10349:36;;10312:12;;;;10405;;;;10279:148;;;10446:6;-1:-1:-1;;10490:18:1;;10477:32;;-1:-1:-1;;10521:16:1;;;10518:36;;;10550:1;10547;10540:12;10518:36;;10573:63;10628:7;10617:8;10606:9;10602:24;10573:63;:::i;:::-;10563:73;;;9434:1208;;;;;:::o;10647:435::-;10700:3;10738:5;10732:12;10765:6;10760:3;10753:19;10791:4;10820:2;10815:3;10811:12;10804:19;;10857:2;10850:5;10846:14;10878:1;10888:169;10902:6;10899:1;10896:13;10888:169;;;10963:13;;10951:26;;10997:12;;;;11032:15;;;;10924:1;10917:9;10888:169;;;-1:-1:-1;11073:3:1;;10647:435;-1:-1:-1;;;;;10647:435:1:o;11087:261::-;11266:2;11255:9;11248:21;11229:4;11286:56;11338:2;11327:9;11323:18;11315:6;11286:56;:::i;11353:775::-;11403:3;11447:5;11441:12;11474:4;11469:3;11462:17;11500:47;11541:4;11536:3;11532:14;11518:12;11500:47;:::i;:::-;11488:59;;11595:4;11588:5;11584:16;11578:23;11643:3;11637:4;11633:14;11626:4;11621:3;11617:14;11610:38;11671:39;11705:4;11689:14;11671:39;:::i;:::-;11657:53;;;11758:4;11751:5;11747:16;11741:23;11808:3;11800:6;11796:16;11789:4;11784:3;11780:14;11773:40;11836:41;11870:6;11854:14;11836:41;:::i;:::-;11822:55;;;11925:4;11918:5;11914:16;11908:23;11975:3;11967:6;11963:16;11956:4;11951:3;11947:14;11940:40;12003:41;12037:6;12021:14;12003:41;:::i;:::-;11989:55;;;12093:4;12086:5;12082:16;12076:23;12069:4;12064:3;12060:14;12053:47;12116:6;12109:13;;;11353:775;;;;:::o;12133:258::-;12312:2;12301:9;12294:21;12275:4;12332:53;12381:2;12370:9;12366:18;12358:6;12332:53;:::i;12396:545::-;12484:6;12492;12500;12508;12561:2;12549:9;12540:7;12536:23;12532:32;12529:52;;;12577:1;12574;12567:12;12529:52;12613:9;12600:23;12590:33;;12670:2;12659:9;12655:18;12642:32;12632:42;;12725:2;12714:9;12710:18;12697:32;12752:18;12744:6;12741:30;12738:50;;;12784:1;12781;12774:12;12738:50;12823:58;12873:7;12864:6;12853:9;12849:22;12823:58;:::i;:::-;12396:545;;;;-1:-1:-1;12900:8:1;-1:-1:-1;;;;12396:545:1:o;12946:783::-;13230:4;13259:3;13303:6;13296:14;13289:22;13278:9;13271:41;13362:6;13355:14;13348:22;13343:2;13332:9;13328:18;13321:50;13421:6;13414:14;13407:22;13402:2;13391:9;13387:18;13380:50;13480:6;13473:14;13466:22;13461:2;13450:9;13446:18;13439:50;13526:6;13520:3;13509:9;13505:19;13498:35;13570:6;13564:3;13553:9;13549:19;13542:35;13614:6;13608:3;13597:9;13593:19;13586:35;13658:2;13652:3;13641:9;13637:19;13630:31;13678:45;13719:2;13708:9;13704:18;13696:6;13678:45;:::i;:::-;13670:53;12946:783;-1:-1:-1;;;;;;;;;;;12946:783:1:o;13734:689::-;13829:6;13837;13845;13898:2;13886:9;13877:7;13873:23;13869:32;13866:52;;;13914:1;13911;13904:12;13866:52;13954:9;13941:23;13983:18;14024:2;14016:6;14013:14;14010:34;;;14040:1;14037;14030:12;14010:34;14078:6;14067:9;14063:22;14053:32;;14123:7;14116:4;14112:2;14108:13;14104:27;14094:55;;14145:1;14142;14135:12;14094:55;14185:2;14172:16;14211:2;14203:6;14200:14;14197:34;;;14227:1;14224;14217:12;14197:34;14282:7;14275:4;14265:6;14262:1;14258:14;14254:2;14250:23;14246:34;14243:47;14240:67;;;14303:1;14300;14293:12;14240:67;14334:4;14326:13;;;;14358:6;;-1:-1:-1;14396:20:1;;;;14383:34;;13734:689;-1:-1:-1;;;;13734:689:1:o;14659:254::-;14724:6;14732;14785:2;14773:9;14764:7;14760:23;14756:32;14753:52;;;14801:1;14798;14791:12;14753:52;14824:29;14843:9;14824:29;:::i;:::-;14814:39;;14872:35;14903:2;14892:9;14888:18;14872:35;:::i;14918:841::-;15110:4;15139:2;15179;15168:9;15164:18;15209:2;15198:9;15191:21;15232:6;15267;15261:13;15298:6;15290;15283:22;15336:2;15325:9;15321:18;15314:25;;15398:2;15388:6;15385:1;15381:14;15370:9;15366:30;15362:39;15348:53;;15436:2;15428:6;15424:15;15457:1;15467:263;15481:6;15478:1;15475:13;15467:263;;;15574:2;15570:7;15558:9;15550:6;15546:22;15542:36;15537:3;15530:49;15602:48;15643:6;15634;15628:13;15602:48;:::i;:::-;15592:58;-1:-1:-1;15708:12:1;;;;15673:15;;;;15503:1;15496:9;15467:263;;;-1:-1:-1;15747:6:1;;14918:841;-1:-1:-1;;;;;;;14918:841:1:o;15764:409::-;15834:6;15842;15895:2;15883:9;15874:7;15870:23;15866:32;15863:52;;;15911:1;15908;15901:12;15863:52;15951:9;15938:23;15984:18;15976:6;15973:30;15970:50;;;16016:1;16013;16006:12;15970:50;16055:58;16105:7;16096:6;16085:9;16081:22;16055:58;:::i;:::-;16132:8;;16029:84;;-1:-1:-1;15764:409:1;-1:-1:-1;;;;15764:409:1:o;16178:389::-;16256:6;16264;16317:2;16305:9;16296:7;16292:23;16288:32;16285:52;;;16333:1;16330;16323:12;16285:52;16369:9;16356:23;16346:33;;16430:2;16419:9;16415:18;16402:32;16457:18;16449:6;16446:30;16443:50;;;16489:1;16486;16479:12;16443:50;16512:49;16553:7;16544:6;16533:9;16529:22;16512:49;:::i;16754:260::-;16822:6;16830;16883:2;16871:9;16862:7;16858:23;16854:32;16851:52;;;16899:1;16896;16889:12;16851:52;16922:29;16941:9;16922:29;:::i;:::-;16912:39;;16970:38;17004:2;16993:9;16989:18;16970:38;:::i;17019:606::-;17123:6;17131;17139;17147;17155;17208:3;17196:9;17187:7;17183:23;17179:33;17176:53;;;17225:1;17222;17215:12;17176:53;17248:29;17267:9;17248:29;:::i;:::-;17238:39;;17296:38;17330:2;17319:9;17315:18;17296:38;:::i;:::-;17286:48;;17381:2;17370:9;17366:18;17353:32;17343:42;;17432:2;17421:9;17417:18;17404:32;17394:42;;17487:3;17476:9;17472:19;17459:33;17515:18;17507:6;17504:30;17501:50;;;17547:1;17544;17537:12;17501:50;17570:49;17611:7;17602:6;17591:9;17587:22;17570:49;:::i;18041:437::-;18120:1;18116:12;;;;18163;;;18184:61;;18238:4;18230:6;18226:17;18216:27;;18184:61;18291:2;18283:6;18280:14;18260:18;18257:38;18254:218;;-1:-1:-1;;;18325:1:1;18318:88;18429:4;18426:1;18419:15;18457:4;18454:1;18447:15;18254:218;;18041:437;;;:::o;19934:184::-;-1:-1:-1;;;19983:1:1;19976:88;20083:4;20080:1;20073:15;20107:4;20104:1;20097:15;20123:125;20188:9;;;20209:10;;;20206:36;;;20222:18;;:::i;21308:168::-;21381:9;;;21412;;21429:15;;;21423:22;;21409:37;21399:71;;21450:18;;:::i;22623:545::-;22725:2;22720:3;22717:11;22714:448;;;22761:1;22786:5;22782:2;22775:17;22831:4;22827:2;22817:19;22901:2;22889:10;22885:19;22882:1;22878:27;22872:4;22868:38;22937:4;22925:10;22922:20;22919:47;;;-1:-1:-1;22960:4:1;22919:47;23015:2;23010:3;23006:12;23003:1;22999:20;22993:4;22989:31;22979:41;;23070:82;23088:2;23081:5;23078:13;23070:82;;;23133:17;;;23114:1;23103:13;23070:82;;22714:448;22623:545;;;:::o;23344:1352::-;23470:3;23464:10;23497:18;23489:6;23486:30;23483:56;;;23519:18;;:::i;:::-;23548:97;23638:6;23598:38;23630:4;23624:11;23598:38;:::i;:::-;23592:4;23548:97;:::i;:::-;23700:4;;23764:2;23753:14;;23781:1;23776:663;;;;24483:1;24500:6;24497:89;;;-1:-1:-1;24552:19:1;;;24546:26;24497:89;-1:-1:-1;;23301:1:1;23297:11;;;23293:24;23289:29;23279:40;23325:1;23321:11;;;23276:57;24599:81;;23746:944;;23776:663;22570:1;22563:14;;;22607:4;22594:18;;-1:-1:-1;;23812:20:1;;;23930:236;23944:7;23941:1;23938:14;23930:236;;;24033:19;;;24027:26;24012:42;;24125:27;;;;24093:1;24081:14;;;;23960:19;;23930:236;;;23934:3;24194:6;24185:7;24182:19;24179:201;;;24255:19;;;24249:26;-1:-1:-1;;24338:1:1;24334:14;;;24350:3;24330:24;24326:37;24322:42;24307:58;24292:74;;24179:201;-1:-1:-1;;;;;24426:1:1;24410:14;;;24406:22;24393:36;;-1:-1:-1;23344:1352:1:o;24701:128::-;24768:9;;;24789:11;;;24786:37;;;24803:18;;:::i;24834:527::-;25087:6;25076:9;25069:25;25130:3;25125:2;25114:9;25110:18;25103:31;25050:4;25157:46;25198:3;25187:9;25183:19;25175:6;25157:46;:::i;:::-;25251:9;25243:6;25239:22;25234:2;25223:9;25219:18;25212:50;25279:33;25305:6;25297;25279:33;:::i;:::-;25271:41;;;25348:6;25343:2;25332:9;25328:18;25321:34;24834:527;;;;;;;:::o;27773:184::-;-1:-1:-1;;;27822:1:1;27815:88;27922:4;27919:1;27912:15;27946:4;27943:1;27936:15;27962:135;28001:3;28022:17;;;28019:43;;28042:18;;:::i;:::-;-1:-1:-1;28089:1:1;28078:13;;27962:135::o;28851:362::-;29056:6;29045:9;29038:25;29099:6;29094:2;29083:9;29079:18;29072:34;29142:2;29137;29126:9;29122:18;29115:30;29019:4;29162:45;29203:2;29192:9;29188:18;29180:6;29162:45;:::i;:::-;29154:53;28851:362;-1:-1:-1;;;;;28851:362:1:o;31614:465::-;31871:2;31860:9;31853:21;31834:4;31897:56;31949:2;31938:9;31934:18;31926:6;31897:56;:::i;:::-;32001:9;31993:6;31989:22;31984:2;31973:9;31969:18;31962:50;32029:44;32066:6;32058;32029:44;:::i;32897:584::-;33119:4;-1:-1:-1;;;;;33229:2:1;33221:6;33217:15;33206:9;33199:34;33281:2;33273:6;33269:15;33264:2;33253:9;33249:18;33242:43;;33321:6;33316:2;33305:9;33301:18;33294:34;33364:6;33359:2;33348:9;33344:18;33337:34;33408:3;33402;33391:9;33387:19;33380:32;33429:46;33470:3;33459:9;33455:19;33447:6;33429:46;:::i;:::-;33421:54;32897:584;-1:-1:-1;;;;;;;32897:584:1:o;33486:249::-;33555:6;33608:2;33596:9;33587:7;33583:23;33579:32;33576:52;;;33624:1;33621;33614:12;33576:52;33656:9;33650:16;33675:30;33699:5;33675:30;:::i;33740:179::-;33775:3;33817:1;33799:16;33796:23;33793:120;;;33863:1;33860;33857;33842:23;-1:-1:-1;33900:1:1;33894:8;33889:3;33885:18;33793:120;33740:179;:::o;33924:671::-;33963:3;34005:4;33987:16;33984:26;33981:39;;;33924:671;:::o;33981:39::-;34047:2;34041:9;-1:-1:-1;;34112:16:1;34108:25;;34105:1;34041:9;34084:50;34163:4;34157:11;34187:16;34222:18;34293:2;34286:4;34278:6;34274:17;34271:25;34266:2;34258:6;34255:14;34252:45;34249:58;;;34300:5;;;;;33924:671;:::o;34249:58::-;34337:6;34331:4;34327:17;34316:28;;34373:3;34367:10;34400:2;34392:6;34389:14;34386:27;;;34406:5;;;;;;33924:671;:::o;34386:27::-;34490:2;34471:16;34465:4;34461:27;34457:36;34450:4;34441:6;34436:3;34432:16;34428:27;34425:69;34422:82;;;34497:5;;;;;;33924:671;:::o;34422:82::-;34513:57;34564:4;34555:6;34547;34543:19;34539:30;34533:4;34513:57;:::i;:::-;-1:-1:-1;34586:3:1;;33924:671;-1:-1:-1;;;;;33924:671:1:o;35430:850::-;35752:4;-1:-1:-1;;;;;35862:2:1;35854:6;35850:15;35839:9;35832:34;35914:2;35906:6;35902:15;35897:2;35886:9;35882:18;35875:43;;35954:3;35949:2;35938:9;35934:18;35927:31;35981:57;36033:3;36022:9;36018:19;36010:6;35981:57;:::i;:::-;36086:9;36078:6;36074:22;36069:2;36058:9;36054:18;36047:50;36120:44;36157:6;36149;36120:44;:::i;:::-;36106:58;;36213:9;36205:6;36201:22;36195:3;36184:9;36180:19;36173:51;36241:33;36267:6;36259;36241:33;:::i;:::-;36233:41;35430:850;-1:-1:-1;;;;;;;;35430:850:1:o;36285:184::-;-1:-1:-1;;;36334:1:1;36327:88;36434:4;36431:1;36424:15;36458:4;36455:1;36448:15
Swarm Source
ipfs://51d914354eb9895f08a5e9f1fdba67a3035b608a1a35312f349ade8b2e0cc13a
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.