ERC-721
Overview
Max Total Supply
248 Cabanes de bois parmi les oliviers et cyprès
Holders
162
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 Cabanes de bois parmi les oliviers et cyprèsLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Cabanes_de_bois_parmi_les_oliviers_et_cypres
Compiler Version
v0.8.22+commit.4fc1097e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-11-29 */ // File: @openzeppelin/contracts/utils/math/SignedMath.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.20; /** * @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 v5.0.0) (utils/math/Math.sol) pragma solidity ^0.8.20; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Muldiv operation overflow. */ error MathOverflowedMulDiv(); enum Rounding { Floor, // Toward negative infinity Ceil, // Toward positive infinity Trunc, // Toward zero Expand // Away from zero } /** * @dev Returns the addition of two unsigned integers, with an overflow flag. */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @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 towards infinity instead * of rounding towards zero. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { if (b == 0) { // Guarantee the same behavior as in a regular Solidity division. return a / b; } // (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 = x * y; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) 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. if (denominator <= prod1) { revert MathOverflowedMulDiv(); } /////////////////////////////////////////////// // 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. uint256 twos = denominator & (0 - denominator); 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 (unsignedRoundsUp(rounding) && 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 * towards zero. * * 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 + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2 of a positive value rounded towards zero. * 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 + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10 of a positive value rounded towards zero. * 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 + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256 of a positive value rounded towards zero. * 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 + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0); } } /** * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers. */ function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) { return uint8(rounding) % 2 == 1; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol) pragma solidity ^0.8.20; /** * @dev String operations. */ library Strings { bytes16 private constant HEX_DIGITS = "0123456789abcdef"; uint8 private constant ADDRESS_LENGTH = 20; /** * @dev The `value` string doesn't fit in the specified `length`. */ error StringsInsufficientHexLength(uint256 value, uint256 length); /** * @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), HEX_DIGITS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toStringSigned(int256 value) internal pure returns (string memory) { return string.concat(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) { uint256 localValue = value; bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = HEX_DIGITS[localValue & 0xf]; localValue >>= 4; } if (localValue != 0) { revert StringsInsufficientHexLength(value, length); } 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 bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b)); } } // File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.20; /** * @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 } /** * @dev The signature derives the `address(0)`. */ error ECDSAInvalidSignature(); /** * @dev The signature has an invalid length. */ error ECDSAInvalidSignatureLength(uint256 length); /** * @dev The signature has an S value that is in the upper half order. */ error ECDSAInvalidSignatureS(bytes32 s); /** * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not * return address(0) without also returning an error description. Errors are documented using an enum (error type) * and a bytes32 providing additional information about the error. * * If no error is returned, then the address can be used for verification purposes. * * The `ecrecover` EVM precompile 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 {MessageHashUtils-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] */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError, bytes32) { 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, bytes32(signature.length)); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM precompile 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 {MessageHashUtils-toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature); _throwError(error, errorArg); 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] */ function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError, bytes32) { unchecked { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); // We do not check for an overflow here since the shift operation results in 0 or 1. 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. */ function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) { (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs); _throwError(error, errorArg); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError, bytes32) { // 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, s); } // 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, bytes32(0)); } return (signer, RecoverError.NoError, bytes32(0)); } /** * @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, bytes32 errorArg) = tryRecover(hash, v, r, s); _throwError(error, errorArg); return recovered; } /** * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided. */ function _throwError(RecoverError error, bytes32 errorArg) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert ECDSAInvalidSignature(); } else if (error == RecoverError.InvalidSignatureLength) { revert ECDSAInvalidSignatureLength(uint256(errorArg)); } else if (error == RecoverError.InvalidSignatureS) { revert ECDSAInvalidSignatureS(errorArg); } } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @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 (last updated v5.0.0) (utils/introspection/ERC165.sol) pragma solidity ^0.8.20; /** * @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); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.20; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo( uint256 tokenId, uint256 salePrice ) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/contracts/token/common/ERC2981.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/common/ERC2981.sol) pragma solidity ^0.8.20; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 tokenId => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev The default royalty set is invalid (eg. (numerator / denominator) >= 1). */ error ERC2981InvalidDefaultRoyalty(uint256 numerator, uint256 denominator); /** * @dev The default royalty receiver is invalid. */ error ERC2981InvalidDefaultRoyaltyReceiver(address receiver); /** * @dev The royalty set for an specific `tokenId` is invalid (eg. (numerator / denominator) >= 1). */ error ERC2981InvalidTokenRoyalty(uint256 tokenId, uint256 numerator, uint256 denominator); /** * @dev The royalty receiver for `tokenId` is invalid. */ error ERC2981InvalidTokenRoyaltyReceiver(uint256 tokenId, address receiver); /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { uint256 denominator = _feeDenominator(); if (feeNumerator > denominator) { // Royalty fee will exceed the sale price revert ERC2981InvalidDefaultRoyalty(feeNumerator, denominator); } if (receiver == address(0)) { revert ERC2981InvalidDefaultRoyaltyReceiver(address(0)); } _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual { uint256 denominator = _feeDenominator(); if (feeNumerator > denominator) { // Royalty fee will exceed the sale price revert ERC2981InvalidTokenRoyalty(tokenId, feeNumerator, denominator); } if (receiver == address(0)) { revert ERC2981InvalidTokenRoyaltyReceiver(tokenId, address(0)); } _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol) pragma solidity ^0.8.20; /** * @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 v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.18; /** * @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. * * The initial owner is set to the address provided by the deployer. 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; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @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 { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _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: olivetrees.sol pragma solidity ^0.8.0; pragma solidity >=0.8.0; /** * @dev These functions deal with verification of Merkle trees (hash trees), */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } // Check if the computed hash (root) is equal to the provided root return computedHash == root; } } pragma solidity ^0.8.0; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer( uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to ); } /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 1; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or( owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags) ) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); ( uint256 approvedAddressSlot, address approvedAddress ) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if ( !_isSenderApprovedOrOwner( approvedAddress, from, _msgSenderERC721A() ) ) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received( _msgSenderERC721A(), from, tokenId, _data ) returns (bytes4 retval) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer( startTokenId, startTokenId + quantity - 1, address(0), to ); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if ( !_checkContractOnERC721Received( address(0), to, index++, _data ) ) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ""); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); ( uint256 approvedAddressSlot, address approvedAddress ) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if ( !_isSenderApprovedOrOwner( approvedAddress, from, _msgSenderERC721A() ) ) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } /// @notice Optimized and flexible operator filterer to abide to OpenSea's /// mandatory on-chain royalty enforcement in order for new collections to /// receive royalties. /// For more information, see: /// See: https://github.com/ProjectOpenSea/operator-filter-registry abstract contract OperatorFilterer { /// @dev The default OpenSea operator blocklist subscription. address internal constant _DEFAULT_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6; /// @dev The OpenSea operator filter registry. address internal constant _OPERATOR_FILTER_REGISTRY = 0x000000000000AAeB6D7670E522A718067333cd4E; /// @dev Registers the current contract to OpenSea's operator filter, /// and subscribe to the default OpenSea operator blocklist. /// Note: Will not revert nor update existing settings for repeated registration. function _registerForOperatorFiltering() internal virtual { _registerForOperatorFiltering(_DEFAULT_SUBSCRIPTION, true); } /// @dev Registers the current contract to OpenSea's operator filter. /// Note: Will not revert nor update existing settings for repeated registration. function _registerForOperatorFiltering( address subscriptionOrRegistrantToCopy, bool subscribe ) internal virtual { /// @solidity memory-safe-assembly assembly { let functionSelector := 0x7d3e3dbe // `registerAndSubscribe(address,address)`. // Clean the upper 96 bits of `subscriptionOrRegistrantToCopy` in case they are dirty. subscriptionOrRegistrantToCopy := shr( 96, shl(96, subscriptionOrRegistrantToCopy) ) // prettier-ignore for {} iszero(subscribe) {} { if iszero(subscriptionOrRegistrantToCopy) { functionSelector := 0x4420e486 // `register(address)`. break } functionSelector := 0xa0af2903 // `registerAndCopyEntries(address,address)`. break } // Store the function selector. mstore(0x00, shl(224, functionSelector)) // Store the `address(this)`. mstore(0x04, address()) // Store the `subscriptionOrRegistrantToCopy`. mstore(0x24, subscriptionOrRegistrantToCopy) // Register into the registry. pop( call( gas(), _OPERATOR_FILTER_REGISTRY, 0, 0x00, 0x44, 0x00, 0x00 ) ) // Restore the part of the free memory pointer that was overwritten, // which is guaranteed to be zero, because of Solidity's memory size limits. mstore(0x24, 0) } } /// @dev Modifier to guard a function and revert if `from` is a blocked operator. /// Can be turned on / off via `enabled`. /// For gas efficiency, you can use tight variable packing to efficiently read / write /// the boolean value for `enabled`. modifier onlyAllowedOperator(address from, bool enabled) virtual { /// @solidity memory-safe-assembly assembly { // This code prioritizes runtime gas costs on a chain with the registry. // As such, we will not use `extcodesize`, but rather abuse the behavior // of `staticcall` returning 1 when called on an empty / missing contract, // to avoid reverting when a chain does not have the registry. if enabled { // Check if `from` is not equal to `msg.sender`, // discarding the upper 96 bits of `from` in case they are dirty. if iszero(eq(shr(96, shl(96, from)), caller())) { // Store the function selector of `isOperatorAllowed(address,address)`, // shifted left by 6 bytes, which is enough for 8tb of memory. // We waste 6-3 = 3 bytes to save on 6 runtime gas (PUSH1 0x224 SHL). mstore(0x00, 0xc6171134001122334455) // Store the `address(this)`. mstore(0x1a, address()) // Store the `msg.sender`. mstore(0x3a, caller()) // `isOperatorAllowed` always returns true if it does not revert. if iszero( staticcall( gas(), _OPERATOR_FILTER_REGISTRY, 0x16, 0x44, 0x00, 0x00 ) ) { // Bubble up the revert if the staticcall reverts. returndatacopy(0x00, 0x00, returndatasize()) revert(0x00, returndatasize()) } // We'll skip checking if `from` is inside the blacklist. // Even though that can block transferring out of wrapper contracts, // we don't want tokens to be stuck. // Restore the part of the free memory pointer that was overwritten, // which is guaranteed to be zero, if less than 8tb of memory is used. mstore(0x3a, 0) } } } _; } /// @dev Modifier to guard a function from approving a blocked operator. /// Can be turned on / off via `enabled`. /// For efficiency, you can use tight variable packing to efficiently read / write /// the boolean value for `enabled`. modifier onlyAllowedOperatorApproval(address operator, bool enabled) virtual { /// @solidity memory-safe-assembly assembly { // For more information on the optimization techniques used, // see the comments in `onlyAllowedOperator`. if enabled { // Store the function selector of `isOperatorAllowed(address,address)`, mstore(0x00, 0xc6171134001122334455) // Store the `address(this)`. mstore(0x1a, address()) // Store the `operator`, discarding the upper 96 bits in case they are dirty. mstore(0x3a, shr(96, shl(96, operator))) // `isOperatorAllowed` always returns true if it does not revert. if iszero( staticcall( gas(), _OPERATOR_FILTER_REGISTRY, 0x16, 0x44, 0x00, 0x00 ) ) { // Bubble up the revert if the staticcall reverts. returndatacopy(0x00, 0x00, returndatasize()) revert(0x00, returndatasize()) } // Restore the part of the free memory pointer that was overwritten. mstore(0x3a, 0) } } _; } } error AlreadyReservedTokens(); error CallerNotOffsetter(); error FunctionLocked(); error InsufficientValue(); error InsufficientMints(); error InsufficientSupply(); error InvalidSignature(); error NoContractMinting(); error ProvenanceHashAlreadySet(); error ProvenanceHashNotSet(); error TokenOffsetAlreadySet(); error TokenOffsetNotSet(); error WithdrawFailed(); interface Offsetable { function setOffset(uint256 randomness) external; } contract Cabanes_de_bois_parmi_les_oliviers_et_cypres is ERC721A, ERC2981, OperatorFilterer, Ownable { using ECDSA for bytes32; string private _baseTokenURI; bytes32 public merkleRoot; string public baseExtension = ".json"; address public contractAddress1; address public contractAddress2; address public contractAddress3; uint256 public MAX_SUPPLY = 248; uint256 public constant RESERVED = 3; uint256 public SEC_RESERVED = 45; uint256 public PUBLIC_SUPPLY = 0; uint256 public WHITELIST_SUPPLY = 200; uint256 public mintPrice = 0.056 ether; uint256 public whiteListPrice = 0.056 ether; string public provenanceHash; bool public operatorFilteringEnabled; mapping(bytes4 => bool) public functionLocked; bool public publicSaleStatus = false; bool public whitelistSaleStatus = false; mapping(address => bool) public isUk; mapping(address => bool) public minter; mapping(address => uint256) public Claimed; uint256 public totalClaimed = 0; constructor( address _royaltyReceiver, uint96 _royaltyFraction, address initialOwner ) ERC721A(unicode"Cabanes de bois parmi les oliviers et cyprès", unicode"Cabanes de bois parmi les oliviers et cyprès") Ownable(initialOwner){ _registerForOperatorFiltering(); operatorFilteringEnabled = true; minter[0xa8C10eC49dF815e73A881ABbE0Aa7b210f39E2Df] = true; minter[0x79bB164367BB64742E993f381372961a945BF447] = true; minter[0xFd88229910A28D6B319E147b40c822FA5CF38a45] = true; minter[0x6b40a842e05D60081F5474046c713b294B4BbC63] = true; minter[0x8528fA2503c49893B704B981e0cBAC021E678789] = true; contractAddress1 = 0x1ad0e77B4b6b0284D094B699c125Bf4717546a07; contractAddress2 = 0x143E806442777D1496e629063D1dF3C7Bc5C4c55; contractAddress3 = 0x08094CDDBEDc9cae39d4F1b89CEdB16f2f564C19; _setDefaultRoyalty(_royaltyReceiver, _royaltyFraction); } /** * @notice Modifier applied to functions that will be disabled when they're no longer needed */ modifier lockable() { if (functionLocked[msg.sig]) revert FunctionLocked(); _; } modifier onlyMinter() { require(minter[msg.sender] == true, "You're not a minter"); _; } /** * @inheritdoc ERC721A */ function supportsInterface(bytes4 interfaceId) public view override(ERC721A, ERC2981) returns (bool) { return ERC721A.supportsInterface(interfaceId) || ERC2981.supportsInterface(interfaceId); } /** * @notice Override ERC721A _baseURI function to use base URI pattern */ function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string( abi.encodePacked( currentBaseURI, Strings.toString(tokenId), baseExtension ) ) : ""; } /** * @notice Return the number of tokens an address has minted * @param account Address to return the number of tokens minted for */ function numberMinted(address account) external view returns (uint256) { return _numberMinted(account); } /** * @notice Lock a function so that it can no longer be called * @dev WARNING: THIS CANNOT BE UNDONE * @param id Function signature */ function lockFunction(bytes4 id) external onlyOwner { functionLocked[id] = true; } function assignMinterRole(address _minter) external onlyOwner { require(minter[_minter] == false, "already a minter"); minter[_minter] = true; } function revokeMinterRole(address _minter) external onlyOwner { require(minter[_minter] == true, "minter doesn't exist"); minter[_minter] = false; } /** * @notice Set the state of the OpenSea operator filter * @param value Flag indicating if the operator filter should be applied to transfers and approvals */ function setOperatorFilteringEnabled(bool value) external lockable onlyOwner { operatorFilteringEnabled = value; } /** * @notice Set new royalties settings for the collection * @param receiver Address to receive royalties * @param royaltyFraction Royalty fee respective to fee denominator (10_000) */ function setRoyalties(address receiver, uint96 royaltyFraction) external onlyOwner { _setDefaultRoyalty(receiver, royaltyFraction); } /** * @notice Set token metadata base URI * @param _newBaseURI New base URI */ function setBaseURI(string calldata _newBaseURI) external lockable onlyOwner { _baseTokenURI = _newBaseURI; } /** * @notice Set provenance hash for the collection * @param _provenanceHash New hash of the metadata */ function setProvenanceHash(string calldata _provenanceHash) external lockable onlyOwner { if (bytes(provenanceHash).length != 0) revert ProvenanceHashAlreadySet(); provenanceHash = _provenanceHash; } function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner { merkleRoot = _merkleRoot; } /** * @notice Mint `RESERVED` amount of tokens to an address * @param to Address to send the reserved tokens */ function reserve(address to) external lockable onlyOwner { if (_totalMinted() >= RESERVED) revert AlreadyReservedTokens(); _mint(to, RESERVED); } function secondaryReserve(address to, uint256 quantity) external lockable onlyOwner { require( _totalMinted() + quantity <= MAX_SUPPLY, "Exceeds Maximum Supply" ); _mint(to, quantity); } function whiteListMint( address to, uint256 quantity, bool _isUk, bytes32[] calldata merkleProof ) external payable onlyMinter{ require(whitelistSaleStatus == true, "Minting is not yet open."); require(_totalMinted() + quantity <= MAX_SUPPLY , "Exceeds Maximum Supply" ); IERC721A whiteListContract1 = IERC721A(contractAddress1); IERC721A whiteListContract2 = IERC721A(contractAddress2); IERC721A whiteListContract3 = IERC721A(contractAddress3); require( Claimed[to] < whiteListContract1.balanceOf(to) + whiteListContract2.balanceOf(to) + whiteListContract3.balanceOf(to), "Invalid Whitelist Proof or Already Claimed" ); require( totalClaimed + quantity <= WHITELIST_SUPPLY, "All NFTs Claimed." ); bytes32 node = keccak256(abi.encodePacked(to, quantity)); require( MerkleProof.verify(merkleProof, merkleRoot, node), "Invalid Whitelist Proof." ); uint256 totalCost = quantity * whiteListPrice; require(msg.value >= totalCost, "Ether sent is not correct."); _mint(to, quantity); totalClaimed += quantity; Claimed[to] += quantity; isUk[to] = _isUk; if (msg.value > totalCost) { payable(msg.sender).transfer(msg.value - totalCost); } } function publicMint( address to, uint256 quantity, bool _isUk ) external payable onlyMinter{ require(publicSaleStatus == true, "Minting is not yet open."); require(quantity <= PUBLIC_SUPPLY, "NFT amount exceeds"); require(_totalMinted() + quantity <= MAX_SUPPLY , "Exceeds Maximum Supply" ); uint256 totalCost = quantity * mintPrice; require(msg.value >= totalCost, "Ether sent is not correct."); _mint(to, quantity); PUBLIC_SUPPLY -= quantity; isUk[to] = _isUk; if (msg.value > totalCost) { payable(msg.sender).transfer(msg.value - totalCost); } } function setPublicMintPrice(uint256 _newPrice) external onlyOwner { mintPrice = _newPrice; } function setWhiteListPrice(uint256 _newPrice) external onlyOwner { whiteListPrice = _newPrice; } function setWhiteListSupply(uint256 _newSupply) external onlyOwner { WHITELIST_SUPPLY = _newSupply; } function setPublicSupply(uint256 _newSupply) external onlyOwner { PUBLIC_SUPPLY = _newSupply; } function enablePublicMint() external onlyOwner { publicSaleStatus = true; } function enablePrivateMint() external onlyOwner { whitelistSaleStatus = true; } /** * @notice Withdraw all ETH sent to the contract */ function withdraw() external onlyOwner { (bool success, ) = payable(msg.sender).call{ value: address(this).balance }(""); if (!success) revert WithdrawFailed(); } /** * @notice Override to enforce OpenSea's operator filter requirement to receive collection royalties * @inheritdoc ERC721A */ function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator, operatorFilteringEnabled) { super.setApprovalForAll(operator, approved); } /** * @notice Override to enforce OpenSea's operator filter requirement to receive collection royalties * @inheritdoc ERC721A */ function approve(address operator, uint256 tokenId) public payable override onlyAllowedOperatorApproval(operator, operatorFilteringEnabled) { super.approve(operator, tokenId); } /** * @notice Override to enforce OpenSea's operator filter requirement to receive collection royalties * @inheritdoc ERC721A */ function transferFrom( address from, address to, uint256 tokenId ) public payable override onlyAllowedOperator(from, operatorFilteringEnabled) { super.transferFrom(from, to, tokenId); } /** * @notice Override to enforce OpenSea's operator filter requirement to receive collection royalties * @inheritdoc ERC721A */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable override onlyAllowedOperator(from, operatorFilteringEnabled) { super.safeTransferFrom(from, to, tokenId); } /** * @notice Override to enforce OpenSea's operator filter requirement to receive collection royalties * @inheritdoc ERC721A */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public payable override onlyAllowedOperator(from, operatorFilteringEnabled) { super.safeTransferFrom(from, to, tokenId, data); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_royaltyReceiver","type":"address"},{"internalType":"uint96","name":"_royaltyFraction","type":"uint96"},{"internalType":"address","name":"initialOwner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyReservedTokens","type":"error"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidDefaultRoyalty","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidDefaultRoyaltyReceiver","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidTokenRoyalty","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidTokenRoyaltyReceiver","type":"error"},{"inputs":[],"name":"FunctionLocked","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"ProvenanceHashAlreadySet","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"WithdrawFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"Claimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SEC_RESERVED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"assignMinterRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractAddress1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractAddress2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractAddress3","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enablePrivateMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enablePublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"name":"functionLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isUk","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"id","type":"bytes4"}],"name":"lockFunction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilteringEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provenanceHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bool","name":"_isUk","type":"bool"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"revokeMinterRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"secondaryReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setOperatorFilteringEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPublicMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSupply","type":"uint256"}],"name":"setPublicSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"royaltyFraction","type":"uint96"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setWhiteListPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSupply","type":"uint256"}],"name":"setWhiteListSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bool","name":"_isUk","type":"bool"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"whiteListMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whiteListPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistSaleStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d90816200004a919062000a88565b5060f8601155602d6012555f60135560c860145566c6f3b40b6c000060155566c6f3b40b6c00006016555f601a5f6101000a81548160ff0219169083151502179055505f601a60016101000a81548160ff0219169083151502179055505f601e55348015620000b7575f80fd5b50604051620061b3380380620061b38339818101604052810190620000dd919062000c17565b806040518060600160405280602e815260200162006185602e91396040518060600160405280602e815260200162006185602e9139816002908162000123919062000a88565b50806003908162000135919062000a88565b50620001466200052060201b60201c565b5f8190555050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620001c0575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620001b7919062000c81565b60405180910390fd5b620001d1816200052860201b60201c565b50620001e2620005eb60201b60201c565b600160185f6101000a81548160ff0219169083151502179055506001601c5f73a8c10ec49df815e73a881abbe0aa7b210f39e2df73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001601c5f7379bb164367bb64742e993f381372961a945bf44773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001601c5f73fd88229910a28d6b319e147b40c822fa5cf38a4573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001601c5f736b40a842e05d60081f5474046c713b294b4bbc6373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001601c5f738528fa2503c49893b704b981e0cbac021e67878973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550731ad0e77b4b6b0284d094b699c125bf4717546a07600e5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073143e806442777d1496e629063d1df3c7bc5c4c55600f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507308094cddbedc9cae39d4f1b89cedb16f2f564c1960105f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200051783836200061460201b60201c565b50505062000d10565b5f6001905090565b5f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000612733cc6cdda760b79bafa08df41ecfa224f810dceb66001620007bd60201b60201c565b565b5f620006256200081b60201b60201c565b6bffffffffffffffffffffffff16905080826bffffffffffffffffffffffff1611156200068d5781816040517f6f483d090000000000000000000000000000000000000000000000000000000081526004016200068492919062000ce5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362000700575f6040517fb6d9900a000000000000000000000000000000000000000000000000000000008152600401620006f7919062000c81565b60405180910390fd5b60405180604001604052808473ffffffffffffffffffffffffffffffffffffffff168152602001836bffffffffffffffffffffffff1681525060085f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151815f0160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550905050505050565b637d3e3dbe8260601b60601c925081620007ec5782620007e457634420e4869050620007ec565b63a0af290390505b8060e01b5f5230600452826024525f8060445f806daaeb6d7670e522a718067333cd4e5af1505f602452505050565b5f612710905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620008a057607f821691505b602082108103620008b657620008b56200085b565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200091a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620008dd565b620009268683620008dd565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620009706200096a62000964846200093e565b62000947565b6200093e565b9050919050565b5f819050919050565b6200098b8362000950565b620009a36200099a8262000977565b848454620008e9565b825550505050565b5f90565b620009b9620009ab565b620009c681848462000980565b505050565b5b81811015620009ed57620009e15f82620009af565b600181019050620009cc565b5050565b601f82111562000a3c5762000a0681620008bc565b62000a1184620008ce565b8101602085101562000a21578190505b62000a3962000a3085620008ce565b830182620009cb565b50505b505050565b5f82821c905092915050565b5f62000a5e5f198460080262000a41565b1980831691505092915050565b5f62000a78838362000a4d565b9150826002028217905092915050565b62000a938262000824565b67ffffffffffffffff81111562000aaf5762000aae6200082e565b5b62000abb825462000888565b62000ac8828285620009f1565b5f60209050601f83116001811462000afe575f841562000ae9578287015190505b62000af5858262000a6b565b86555062000b64565b601f19841662000b0e86620008bc565b5f5b8281101562000b375784890151825560018201915060208501945060208101905062000b10565b8683101562000b57578489015162000b53601f89168262000a4d565b8355505b6001600288020188555050505b505050505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000b9b8262000b70565b9050919050565b62000bad8162000b8f565b811462000bb8575f80fd5b50565b5f8151905062000bcb8162000ba2565b92915050565b5f6bffffffffffffffffffffffff82169050919050565b62000bf38162000bd1565b811462000bfe575f80fd5b50565b5f8151905062000c118162000be8565b92915050565b5f805f6060848603121562000c315762000c3062000b6c565b5b5f62000c408682870162000bbb565b935050602062000c538682870162000c01565b925050604062000c668682870162000bbb565b9150509250925092565b62000c7b8162000b8f565b82525050565b5f60208201905062000c965f83018462000c70565b92915050565b5f62000cbc62000cb662000cb08462000bd1565b62000947565b6200093e565b9050919050565b62000cce8162000c9c565b82525050565b62000cdf816200093e565b82525050565b5f60408201905062000cfa5f83018562000cc3565b62000d09602083018462000cd4565b9392505050565b6154678062000d1e5f395ff3fe608060405260043610610396575f3560e01c80637bc02806116101db578063bc1ac5c111610101578063d62f3b1c1161009f578063e985e9c51161006e578063e985e9c514610ce1578063f2fde38b14610d1d578063f3237dec14610d45578063fb796e6c14610d5b57610396565b8063d62f3b1c14610c3f578063da3ef23f14610c55578063dc33e68114610c7d578063e75179a414610cb957610396565b8063c6682862116100db578063c668286214610b85578063c6ab67a314610baf578063c87b56dd14610bd9578063d54ad2a114610c1557610396565b8063bc1ac5c114610b0b578063beafc89b14610b35578063c21b471b14610b5d57610396565b8063aa592f2511610179578063b6c693e511610148578063b6c693e514610a61578063b7c0b8e814610a8b578063b88d4fde14610ab3578063bbadfe7614610acf57610396565b8063aa592f2514610997578063b366d613146109c1578063b449c24d146109e9578063b629f19214610a2557610396565b80638342083a116101b55780638342083a146108f15780638da5cb5b1461091b57806395d89b4114610945578063a22cb4651461096f57610396565b80637bc02806146108755780637cb647591461089f5780637ec9e156146108c757610396565b80633dd08c38116102c05780636817c76c1161025e57806370a082311161022d57806370a08231146107df578063715018a61461081b57806374d0101d1461083157806378bfbdbb1461085957610396565b80636817c76c14610739578063685756851461076357806369e2f0fb1461078d5780636e56539b146107b557610396565b806355f804b31161029a57806355f804b3146106835780635d82cf6e146106ab578063601e5e77146106d35780636352211e146106fd57610396565b80633dd08c381461060f578063402c38561461064b57806342842e0e1461066757610396565b806323b872dd1161033857806332cb6b0c1161030757806332cb6b0c1461057f57806334531828146105a9578063381a3506146105d15780633ccfd60b146105f957610396565b806323b872dd146104d457806326aa420a146104f05780632a55205a146105185780632eb4a7ab1461055557610396565b8063081812fc11610374578063081812fc1461042a578063095ea7b314610466578063109695231461048257806318160ddd146104aa57610396565b806301684b061461039a57806301ffc9a7146103c457806306fdde0314610400575b5f80fd5b3480156103a5575f80fd5b506103ae610d85565b6040516103bb9190613d6b565b60405180910390f35b3480156103cf575f80fd5b506103ea60048036038101906103e59190613dea565b610daa565b6040516103f79190613e2f565b60405180910390f35b34801561040b575f80fd5b50610414610dcb565b6040516104219190613ed2565b60405180910390f35b348015610435575f80fd5b50610450600480360381019061044b9190613f25565b610e5b565b60405161045d9190613d6b565b60405180910390f35b610480600480360381019061047b9190613f7a565b610ed5565b005b34801561048d575f80fd5b506104a860048036038101906104a39190614019565b610f3e565b005b3480156104b5575f80fd5b506104be611059565b6040516104cb9190614073565b60405180910390f35b6104ee60048036038101906104e9919061408c565b61106e565b005b3480156104fb575f80fd5b5061051660048036038101906105119190613f25565b6110e1565b005b348015610523575f80fd5b5061053e600480360381019061053991906140dc565b6110f3565b60405161054c92919061411a565b60405180910390f35b348015610560575f80fd5b506105696112cf565b6040516105769190614159565b60405180910390f35b34801561058a575f80fd5b506105936112d5565b6040516105a09190614073565b60405180910390f35b3480156105b4575f80fd5b506105cf60048036038101906105ca9190613dea565b6112db565b005b3480156105dc575f80fd5b506105f760048036038101906105f29190613f25565b61134d565b005b348015610604575f80fd5b5061060d61135f565b005b34801561061a575f80fd5b5061063560048036038101906106309190614172565b611409565b6040516106429190613e2f565b60405180910390f35b610665600480360381019061066091906141c7565b611426565b005b610681600480360381019061067c919061408c565b6116cf565b005b34801561068e575f80fd5b506106a960048036038101906106a49190614019565b611742565b005b3480156106b6575f80fd5b506106d160048036038101906106cc9190613f25565b611816565b005b3480156106de575f80fd5b506106e7611828565b6040516106f49190614073565b60405180910390f35b348015610708575f80fd5b50610723600480360381019061071e9190613f25565b61182e565b6040516107309190613d6b565b60405180910390f35b348015610744575f80fd5b5061074d61183f565b60405161075a9190614073565b60405180910390f35b34801561076e575f80fd5b50610777611845565b6040516107849190614073565b60405180910390f35b348015610798575f80fd5b506107b360048036038101906107ae9190614172565b61184b565b005b3480156107c0575f80fd5b506107c961193a565b6040516107d69190614073565b60405180910390f35b3480156107ea575f80fd5b5061080560048036038101906108009190614172565b611940565b6040516108129190614073565b60405180910390f35b348015610826575f80fd5b5061082f6119f5565b005b34801561083c575f80fd5b5061085760048036038101906108529190613f7a565b611a08565b005b610873600480360381019061086e919061426c565b611b2b565b005b348015610880575f80fd5b5061088961215c565b6040516108969190613d6b565b60405180910390f35b3480156108aa575f80fd5b506108c560048036038101906108c0919061431a565b612181565b005b3480156108d2575f80fd5b506108db612193565b6040516108e89190613d6b565b60405180910390f35b3480156108fc575f80fd5b506109056121b8565b6040516109129190614073565b60405180910390f35b348015610926575f80fd5b5061092f6121be565b60405161093c9190613d6b565b60405180910390f35b348015610950575f80fd5b506109596121e6565b6040516109669190613ed2565b60405180910390f35b34801561097a575f80fd5b5061099560048036038101906109909190614345565b612276565b005b3480156109a2575f80fd5b506109ab6122df565b6040516109b89190614073565b60405180910390f35b3480156109cc575f80fd5b506109e760048036038101906109e29190614172565b6122e4565b005b3480156109f4575f80fd5b50610a0f6004803603810190610a0a9190614172565b6123d3565b604051610a1c9190614073565b60405180910390f35b348015610a30575f80fd5b50610a4b6004803603810190610a469190614172565b6123e8565b604051610a589190613e2f565b60405180910390f35b348015610a6c575f80fd5b50610a75612405565b604051610a829190613e2f565b60405180910390f35b348015610a96575f80fd5b50610ab16004803603810190610aac9190614383565b612417565b005b610acd6004803603810190610ac891906144d6565b6124f1565b005b348015610ada575f80fd5b50610af56004803603810190610af09190613dea565b612566565b604051610b029190613e2f565b60405180910390f35b348015610b16575f80fd5b50610b1f612583565b604051610b2c9190613e2f565b60405180910390f35b348015610b40575f80fd5b50610b5b6004803603810190610b569190613f25565b612596565b005b348015610b68575f80fd5b50610b836004803603810190610b7e9190614597565b6125a8565b005b348015610b90575f80fd5b50610b996125be565b604051610ba69190613ed2565b60405180910390f35b348015610bba575f80fd5b50610bc361264a565b604051610bd09190613ed2565b60405180910390f35b348015610be4575f80fd5b50610bff6004803603810190610bfa9190613f25565b6126d6565b604051610c0c9190613ed2565b60405180910390f35b348015610c20575f80fd5b50610c2961277d565b604051610c369190614073565b60405180910390f35b348015610c4a575f80fd5b50610c53612783565b005b348015610c60575f80fd5b50610c7b6004803603810190610c769190614673565b6127a7565b005b348015610c88575f80fd5b50610ca36004803603810190610c9e9190614172565b6127c2565b604051610cb09190614073565b60405180910390f35b348015610cc4575f80fd5b50610cdf6004803603810190610cda9190614172565b6127d3565b005b348015610cec575f80fd5b50610d076004803603810190610d0291906146ba565b6128e0565b604051610d149190613e2f565b60405180910390f35b348015610d28575f80fd5b50610d436004803603810190610d3e9190614172565b61296e565b005b348015610d50575f80fd5b50610d596129f2565b005b348015610d66575f80fd5b50610d6f612a17565b604051610d7c9190613e2f565b60405180910390f35b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f610db482612a29565b80610dc45750610dc382612aba565b5b9050919050565b606060028054610dda90614725565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0690614725565b8015610e515780601f10610e2857610100808354040283529160200191610e51565b820191905f5260205f20905b815481529060010190602001808311610e3457829003601f168201915b5050505050905090565b5f610e6582612b33565b610e9b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160185f9054906101000a900460ff168015610f2e5769c61711340011223344555f5230601a528160601b60601c603a525f80604460166daaeb6d7670e522a718067333cd4e5afa610f29573d5f803e3d5ffd5b5f603a525b610f388484612b8d565b50505050565b60195f80357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020015f205f9054906101000a900460ff1615610ff4576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ffc612ccc565b5f6017805461100a90614725565b905014611043576040517f19e24c1100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181601791826110549291906148fc565b505050565b5f611062612d53565b6001545f540303905090565b8260185f9054906101000a900460ff1680156110cf57338260601b60601c146110ce5769c61711340011223344555f5230601a5233603a525f80604460166daaeb6d7670e522a718067333cd4e5afa6110c9573d5f803e3d5ffd5b5f603a525b5b6110da858585612d5b565b5050505050565b6110e9612ccc565b8060138190555050565b5f805f60095f8681526020019081526020015f206040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff160361127c5760086040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b5f611285613069565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16866112b191906149f6565b6112bb9190614a64565b9050815f0151819350935050509250929050565b600c5481565b60115481565b6112e3612ccc565b600160195f837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b611355612ccc565b8060148190555050565b611367612ccc565b5f3373ffffffffffffffffffffffffffffffffffffffff164760405161138c90614ac1565b5f6040518083038185875af1925050503d805f81146113c6576040519150601f19603f3d011682016040523d82523d5f602084013e6113cb565b606091505b5050905080611406576040517f750b219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b601c602052805f5260405f205f915054906101000a900460ff1681565b60011515601c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161515146114b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ad90614b1f565b60405180910390fd5b60011515601a5f9054906101000a900460ff1615151461150b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150290614b87565b60405180910390fd5b601354821115611550576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154790614bef565b60405180910390fd5b6011548261155c613072565b6115669190614c0d565b11156115a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159e90614c8a565b60405180910390fd5b5f601554836115b691906149f6565b9050803410156115fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f290614cf2565b60405180910390fd5b6116058484613083565b8260135f8282546116169190614d10565b9250508190555081601b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550803411156116c9573373ffffffffffffffffffffffffffffffffffffffff166108fc823461169f9190614d10565b90811502906040515f60405180830381858888f193505050501580156116c7573d5f803e3d5ffd5b505b50505050565b8260185f9054906101000a900460ff16801561173057338260601b60601c1461172f5769c61711340011223344555f5230601a5233603a525f80604460166daaeb6d7670e522a718067333cd4e5afa61172a573d5f803e3d5ffd5b5f603a525b5b61173b85858561322c565b5050505050565b60195f80357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020015f205f9054906101000a900460ff16156117f8576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611800612ccc565b8181600b91826118119291906148fc565b505050565b61181e612ccc565b8060158190555050565b60125481565b5f6118388261324b565b9050919050565b60155481565b60165481565b611853612ccc565b60011515601c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161515146118e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118da90614d8d565b60405180910390fd5b5f601c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b60145481565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119a6576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054169050919050565b6119fd612ccc565b611a065f61330e565b565b60195f80357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020015f205f9054906101000a900460ff1615611abe576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ac6612ccc565b60115481611ad2613072565b611adc9190614c0d565b1115611b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1490614c8a565b60405180910390fd5b611b278282613083565b5050565b60011515601c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151514611bbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb290614b1f565b60405180910390fd5b60011515601a60019054906101000a900460ff16151514611c11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0890614b87565b60405180910390fd5b60115484611c1d613072565b611c279190614c0d565b1115611c68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5f90614c8a565b60405180910390fd5b5f600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401611d109190613d6b565b602060405180830381865afa158015611d2b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d4f9190614dbf565b8273ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b8152600401611d889190613d6b565b602060405180830381865afa158015611da3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dc79190614dbf565b8473ffffffffffffffffffffffffffffffffffffffff166370a082318b6040518263ffffffff1660e01b8152600401611e009190613d6b565b602060405180830381865afa158015611e1b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e3f9190614dbf565b611e499190614c0d565b611e539190614c0d565b601d5f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410611ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec890614e5a565b60405180910390fd5b60145487601e54611ee29190614c0d565b1115611f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1a90614ec2565b60405180910390fd5b5f8888604051602001611f37929190614f45565b604051602081830303815290604052805190602001209050611f9c8686808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f82011690508083019250505050505050600c54836133d1565b611fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd290614fba565b60405180910390fd5b5f60165489611fea91906149f6565b90508034101561202f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202690614cf2565b60405180910390fd5b6120398a8a613083565b88601e5f82825461204a9190614c0d565b9250508190555088601d5f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461209d9190614c0d565b9250508190555087601b5f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555080341115612150573373ffffffffffffffffffffffffffffffffffffffff166108fc82346121269190614d10565b90811502906040515f60405180830381858888f1935050505015801561214e573d5f803e3d5ffd5b505b50505050505050505050565b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612189612ccc565b80600c8190555050565b600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60135481565b5f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546121f590614725565b80601f016020809104026020016040519081016040528092919081815260200182805461222190614725565b801561226c5780601f106122435761010080835404028352916020019161226c565b820191905f5260205f20905b81548152906001019060200180831161224f57829003601f168201915b5050505050905090565b8160185f9054906101000a900460ff1680156122cf5769c61711340011223344555f5230601a528160601b60601c603a525f80604460166daaeb6d7670e522a718067333cd4e5afa6122ca573d5f803e3d5ffd5b5f603a525b6122d9848461347e565b50505050565b600381565b6122ec612ccc565b5f1515601c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615151461237b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237290615022565b60405180910390fd5b6001601c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b601d602052805f5260405f205f915090505481565b601b602052805f5260405f205f915054906101000a900460ff1681565b601a5f9054906101000a900460ff1681565b60195f80357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020015f205f9054906101000a900460ff16156124cd576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124d5612ccc565b8060185f6101000a81548160ff02191690831515021790555050565b8360185f9054906101000a900460ff16801561255257338260601b60601c146125515769c61711340011223344555f5230601a5233603a525f80604460166daaeb6d7670e522a718067333cd4e5afa61254c573d5f803e3d5ffd5b5f603a525b5b61255e86868686613584565b505050505050565b6019602052805f5260405f205f915054906101000a900460ff1681565b601a60019054906101000a900460ff1681565b61259e612ccc565b8060168190555050565b6125b0612ccc565b6125ba82826135f6565b5050565b600d80546125cb90614725565b80601f01602080910402602001604051908101604052809291908181526020018280546125f790614725565b80156126425780601f1061261957610100808354040283529160200191612642565b820191905f5260205f20905b81548152906001019060200180831161262557829003601f168201915b505050505081565b6017805461265790614725565b80601f016020809104026020016040519081016040528092919081815260200182805461268390614725565b80156126ce5780601f106126a5576101008083540402835291602001916126ce565b820191905f5260205f20905b8154815290600101906020018083116126b157829003601f168201915b505050505081565b60606126e182612b33565b612720576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612717906150b0565b60405180910390fd5b5f612729613791565b90505f8151116127475760405180602001604052805f815250612775565b8061275184613821565b600d60405160200161276593929190615188565b6040516020818303038152906040525b915050919050565b601e5481565b61278b612ccc565b6001601a5f6101000a81548160ff021916908315150217905550565b6127af612ccc565b80600d90816127be91906151b8565b5050565b5f6127cc826138eb565b9050919050565b60195f80357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020015f205f9054906101000a900460ff1615612889576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612891612ccc565b600361289b613072565b106128d2576040517f1f0f14ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128dd816003613083565b50565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b612976612ccc565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036129e6575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016129dd9190613d6b565b60405180910390fd5b6129ef8161330e565b50565b6129fa612ccc565b6001601a60016101000a81548160ff021916908315150217905550565b60185f9054906101000a900460ff1681565b5f6301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a8357506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612ab35750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b5f7f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b2c5750612b2b8261393f565b5b9050919050565b5f81612b3d612d53565b11158015612b4b57505f5482105b8015612b8657505f7c010000000000000000000000000000000000000000000000000000000060045f8581526020019081526020015f205416145b9050919050565b5f612b978261182e565b90508073ffffffffffffffffffffffffffffffffffffffff16612bb86139a8565b73ffffffffffffffffffffffffffffffffffffffff1614612c1b57612be481612bdf6139a8565b6128e0565b612c1a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8260065f8481526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b612cd46139af565b73ffffffffffffffffffffffffffffffffffffffff16612cf26121be565b73ffffffffffffffffffffffffffffffffffffffff1614612d5157612d156139af565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401612d489190613d6b565b60405180910390fd5b565b5f6001905090565b5f612d658261324b565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612dcc576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80612dd7846139b6565b91509150612ded8187612de86139a8565b6139d9565b612e3957612e0286612dfd6139a8565b6128e0565b612e38576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612e9e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612eab8686866001613a1c565b8015612eb5575f82555b60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815460010191905081905550612f7d85612f59888887613a22565b7c020000000000000000000000000000000000000000000000000000000017613a49565b60045f8681526020019081526020015f20819055505f7c0200000000000000000000000000000000000000000000000000000000841603612ff9575f6001850190505f60045f8381526020019081526020015f205403612ff7575f548114612ff6578360045f8381526020019081526020015f20819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130618686866001613a73565b505050505050565b5f612710905090565b5f61307b612d53565b5f5403905090565b5f805490505f82036130c1576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6130cd5f848385613a1c565b600160406001901b17820260055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254019250508190555061313f836131305f865f613a22565b61313985613a79565b17613a49565b60045f8381526020019081526020015f20819055505f80838301905073ffffffffffffffffffffffffffffffffffffffff8516915082825f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600183015b8181146131d95780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a46001810190506131a0565b505f8203613213576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f8190555050506132275f848385613a73565b505050565b61324683838360405180602001604052805f8152506124f1565b505050565b5f8082905080613259612d53565b116132d7575f548110156132d6575f60045f8381526020019081526020015f205490505f7c01000000000000000000000000000000000000000000000000000000008216036132d4575b5f81036132ca5760045f836001900393508381526020019081526020015f205490506132a3565b8092505050613309565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f808290505f5b8551811015613470575f8682815181106133f5576133f4615287565b5b602002602001015190508083116134365782816040516020016134199291906152d4565b604051602081830303815290604052805190602001209250613462565b80836040516020016134499291906152d4565b6040516020818303038152906040528051906020012092505b5080806001019150506133d8565b508381149150509392505050565b8060075f61348a6139a8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166135336139a8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516135789190613e2f565b60405180910390a35050565b61358f84848461106e565b5f8373ffffffffffffffffffffffffffffffffffffffff163b146135f0576135b984848484613a88565b6135ef576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b5f6135ff613069565b6bffffffffffffffffffffffff16905080826bffffffffffffffffffffffff1611156136645781816040517f6f483d0900000000000000000000000000000000000000000000000000000000815260040161365b92919061532f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036136d4575f6040517fb6d9900a0000000000000000000000000000000000000000000000000000000081526004016136cb9190613d6b565b60405180910390fd5b60405180604001604052808473ffffffffffffffffffffffffffffffffffffffff168152602001836bffffffffffffffffffffffff1681525060085f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151815f0160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550905050505050565b6060600b80546137a090614725565b80601f01602080910402602001604051908101604052809291908181526020018280546137cc90614725565b80156138175780601f106137ee57610100808354040283529160200191613817565b820191905f5260205f20905b8154815290600101906020018083116137fa57829003601f168201915b5050505050905090565b60605f600161382f84613bd3565b0190505f8167ffffffffffffffff81111561384d5761384c6143b2565b5b6040519080825280601f01601f19166020018201604052801561387f5781602001600182028036833780820191505090505b5090505f82602001820190505b6001156138e0578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816138d5576138d4614a37565b5b0494505f850361388c575b819350505050919050565b5f67ffffffffffffffff604060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054901c169050919050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f33905090565b5f33905090565b5f805f60065f8581526020019081526020015f2090508092508254915050915091565b5f73ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b5f8060e883901c905060e8613a38868684613d24565b62ffffff16901b9150509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b5f6001821460e11b9050919050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613aad6139a8565b8786866040518563ffffffff1660e01b8152600401613acf94939291906153a8565b6020604051808303815f875af1925050508015613b0a57506040513d601f19601f82011682018060405250810190613b079190615406565b60015b613b80573d805f8114613b38576040519150601f19603f3d011682016040523d82523d5f602084013e613b3d565b606091505b505f815103613b78576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613c2f577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381613c2557613c24614a37565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613c6c576d04ee2d6d415b85acef81000000008381613c6257613c61614a37565b5b0492506020810190505b662386f26fc100008310613c9b57662386f26fc100008381613c9157613c90614a37565b5b0492506010810190505b6305f5e1008310613cc4576305f5e1008381613cba57613cb9614a37565b5b0492506008810190505b6127108310613ce9576127108381613cdf57613cde614a37565b5b0492506004810190505b60648310613d0c5760648381613d0257613d01614a37565b5b0492506002810190505b600a8310613d1b576001810190505b80915050919050565b5f9392505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613d5582613d2c565b9050919050565b613d6581613d4b565b82525050565b5f602082019050613d7e5f830184613d5c565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613dc981613d95565b8114613dd3575f80fd5b50565b5f81359050613de481613dc0565b92915050565b5f60208284031215613dff57613dfe613d8d565b5b5f613e0c84828501613dd6565b91505092915050565b5f8115159050919050565b613e2981613e15565b82525050565b5f602082019050613e425f830184613e20565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613e7f578082015181840152602081019050613e64565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613ea482613e48565b613eae8185613e52565b9350613ebe818560208601613e62565b613ec781613e8a565b840191505092915050565b5f6020820190508181035f830152613eea8184613e9a565b905092915050565b5f819050919050565b613f0481613ef2565b8114613f0e575f80fd5b50565b5f81359050613f1f81613efb565b92915050565b5f60208284031215613f3a57613f39613d8d565b5b5f613f4784828501613f11565b91505092915050565b613f5981613d4b565b8114613f63575f80fd5b50565b5f81359050613f7481613f50565b92915050565b5f8060408385031215613f9057613f8f613d8d565b5b5f613f9d85828601613f66565b9250506020613fae85828601613f11565b9150509250929050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112613fd957613fd8613fb8565b5b8235905067ffffffffffffffff811115613ff657613ff5613fbc565b5b60208301915083600182028301111561401257614011613fc0565b5b9250929050565b5f806020838503121561402f5761402e613d8d565b5b5f83013567ffffffffffffffff81111561404c5761404b613d91565b5b61405885828601613fc4565b92509250509250929050565b61406d81613ef2565b82525050565b5f6020820190506140865f830184614064565b92915050565b5f805f606084860312156140a3576140a2613d8d565b5b5f6140b086828701613f66565b93505060206140c186828701613f66565b92505060406140d286828701613f11565b9150509250925092565b5f80604083850312156140f2576140f1613d8d565b5b5f6140ff85828601613f11565b925050602061411085828601613f11565b9150509250929050565b5f60408201905061412d5f830185613d5c565b61413a6020830184614064565b9392505050565b5f819050919050565b61415381614141565b82525050565b5f60208201905061416c5f83018461414a565b92915050565b5f6020828403121561418757614186613d8d565b5b5f61419484828501613f66565b91505092915050565b6141a681613e15565b81146141b0575f80fd5b50565b5f813590506141c18161419d565b92915050565b5f805f606084860312156141de576141dd613d8d565b5b5f6141eb86828701613f66565b93505060206141fc86828701613f11565b925050604061420d868287016141b3565b9150509250925092565b5f8083601f84011261422c5761422b613fb8565b5b8235905067ffffffffffffffff81111561424957614248613fbc565b5b60208301915083602082028301111561426557614264613fc0565b5b9250929050565b5f805f805f6080868803121561428557614284613d8d565b5b5f61429288828901613f66565b95505060206142a388828901613f11565b94505060406142b4888289016141b3565b935050606086013567ffffffffffffffff8111156142d5576142d4613d91565b5b6142e188828901614217565b92509250509295509295909350565b6142f981614141565b8114614303575f80fd5b50565b5f81359050614314816142f0565b92915050565b5f6020828403121561432f5761432e613d8d565b5b5f61433c84828501614306565b91505092915050565b5f806040838503121561435b5761435a613d8d565b5b5f61436885828601613f66565b9250506020614379858286016141b3565b9150509250929050565b5f6020828403121561439857614397613d8d565b5b5f6143a5848285016141b3565b91505092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6143e882613e8a565b810181811067ffffffffffffffff82111715614407576144066143b2565b5b80604052505050565b5f614419613d84565b905061442582826143df565b919050565b5f67ffffffffffffffff821115614444576144436143b2565b5b61444d82613e8a565b9050602081019050919050565b828183375f83830152505050565b5f61447a6144758461442a565b614410565b905082815260208101848484011115614496576144956143ae565b5b6144a184828561445a565b509392505050565b5f82601f8301126144bd576144bc613fb8565b5b81356144cd848260208601614468565b91505092915050565b5f805f80608085870312156144ee576144ed613d8d565b5b5f6144fb87828801613f66565b945050602061450c87828801613f66565b935050604061451d87828801613f11565b925050606085013567ffffffffffffffff81111561453e5761453d613d91565b5b61454a878288016144a9565b91505092959194509250565b5f6bffffffffffffffffffffffff82169050919050565b61457681614556565b8114614580575f80fd5b50565b5f813590506145918161456d565b92915050565b5f80604083850312156145ad576145ac613d8d565b5b5f6145ba85828601613f66565b92505060206145cb85828601614583565b9150509250929050565b5f67ffffffffffffffff8211156145ef576145ee6143b2565b5b6145f882613e8a565b9050602081019050919050565b5f614617614612846145d5565b614410565b905082815260208101848484011115614633576146326143ae565b5b61463e84828561445a565b509392505050565b5f82601f83011261465a57614659613fb8565b5b813561466a848260208601614605565b91505092915050565b5f6020828403121561468857614687613d8d565b5b5f82013567ffffffffffffffff8111156146a5576146a4613d91565b5b6146b184828501614646565b91505092915050565b5f80604083850312156146d0576146cf613d8d565b5b5f6146dd85828601613f66565b92505060206146ee85828601613f66565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061473c57607f821691505b60208210810361474f5761474e6146f8565b5b50919050565b5f82905092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026147bb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614780565b6147c58683614780565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6148006147fb6147f684613ef2565b6147dd565b613ef2565b9050919050565b5f819050919050565b614819836147e6565b61482d61482582614807565b84845461478c565b825550505050565b5f90565b614841614835565b61484c818484614810565b505050565b5b8181101561486f576148645f82614839565b600181019050614852565b5050565b601f8211156148b4576148858161475f565b61488e84614771565b8101602085101561489d578190505b6148b16148a985614771565b830182614851565b50505b505050565b5f82821c905092915050565b5f6148d45f19846008026148b9565b1980831691505092915050565b5f6148ec83836148c5565b9150826002028217905092915050565b6149068383614755565b67ffffffffffffffff81111561491f5761491e6143b2565b5b6149298254614725565b614934828285614873565b5f601f831160018114614961575f841561494f578287013590505b61495985826148e1565b8655506149c0565b601f19841661496f8661475f565b5f5b8281101561499657848901358255600182019150602085019450602081019050614971565b868310156149b357848901356149af601f8916826148c5565b8355505b6001600288020188555050505b50505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614a0082613ef2565b9150614a0b83613ef2565b9250828202614a1981613ef2565b91508282048414831517614a3057614a2f6149c9565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614a6e82613ef2565b9150614a7983613ef2565b925082614a8957614a88614a37565b5b828204905092915050565b5f81905092915050565b50565b5f614aac5f83614a94565b9150614ab782614a9e565b5f82019050919050565b5f614acb82614aa1565b9150819050919050565b7f596f75277265206e6f742061206d696e746572000000000000000000000000005f82015250565b5f614b09601383613e52565b9150614b1482614ad5565b602082019050919050565b5f6020820190508181035f830152614b3681614afd565b9050919050565b7f4d696e74696e67206973206e6f7420796574206f70656e2e00000000000000005f82015250565b5f614b71601883613e52565b9150614b7c82614b3d565b602082019050919050565b5f6020820190508181035f830152614b9e81614b65565b9050919050565b7f4e465420616d6f756e74206578636565647300000000000000000000000000005f82015250565b5f614bd9601283613e52565b9150614be482614ba5565b602082019050919050565b5f6020820190508181035f830152614c0681614bcd565b9050919050565b5f614c1782613ef2565b9150614c2283613ef2565b9250828201905080821115614c3a57614c396149c9565b5b92915050565b7f45786365656473204d6178696d756d20537570706c79000000000000000000005f82015250565b5f614c74601683613e52565b9150614c7f82614c40565b602082019050919050565b5f6020820190508181035f830152614ca181614c68565b9050919050565b7f45746865722073656e74206973206e6f7420636f72726563742e0000000000005f82015250565b5f614cdc601a83613e52565b9150614ce782614ca8565b602082019050919050565b5f6020820190508181035f830152614d0981614cd0565b9050919050565b5f614d1a82613ef2565b9150614d2583613ef2565b9250828203905081811115614d3d57614d3c6149c9565b5b92915050565b7f6d696e74657220646f65736e27742065786973740000000000000000000000005f82015250565b5f614d77601483613e52565b9150614d8282614d43565b602082019050919050565b5f6020820190508181035f830152614da481614d6b565b9050919050565b5f81519050614db981613efb565b92915050565b5f60208284031215614dd457614dd3613d8d565b5b5f614de184828501614dab565b91505092915050565b7f496e76616c69642057686974656c6973742050726f6f66206f7220416c7265615f8201527f647920436c61696d656400000000000000000000000000000000000000000000602082015250565b5f614e44602a83613e52565b9150614e4f82614dea565b604082019050919050565b5f6020820190508181035f830152614e7181614e38565b9050919050565b7f416c6c204e46547320436c61696d65642e0000000000000000000000000000005f82015250565b5f614eac601183613e52565b9150614eb782614e78565b602082019050919050565b5f6020820190508181035f830152614ed981614ea0565b9050919050565b5f8160601b9050919050565b5f614ef682614ee0565b9050919050565b5f614f0782614eec565b9050919050565b614f1f614f1a82613d4b565b614efd565b82525050565b5f819050919050565b614f3f614f3a82613ef2565b614f25565b82525050565b5f614f508285614f0e565b601482019150614f608284614f2e565b6020820191508190509392505050565b7f496e76616c69642057686974656c6973742050726f6f662e00000000000000005f82015250565b5f614fa4601883613e52565b9150614faf82614f70565b602082019050919050565b5f6020820190508181035f830152614fd181614f98565b9050919050565b7f616c72656164792061206d696e746572000000000000000000000000000000005f82015250565b5f61500c601083613e52565b915061501782614fd8565b602082019050919050565b5f6020820190508181035f83015261503981615000565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f61509a602f83613e52565b91506150a582615040565b604082019050919050565b5f6020820190508181035f8301526150c78161508e565b9050919050565b5f81905092915050565b5f6150e282613e48565b6150ec81856150ce565b93506150fc818560208601613e62565b80840191505092915050565b5f815461511481614725565b61511e81866150ce565b9450600182165f8114615138576001811461514d5761517f565b60ff198316865281151582028601935061517f565b6151568561475f565b5f5b8381101561517757815481890152600182019150602081019050615158565b838801955050505b50505092915050565b5f61519382866150d8565b915061519f82856150d8565b91506151ab8284615108565b9150819050949350505050565b6151c182613e48565b67ffffffffffffffff8111156151da576151d96143b2565b5b6151e48254614725565b6151ef828285614873565b5f60209050601f831160018114615220575f841561520e578287015190505b61521885826148e1565b86555061527f565b601f19841661522e8661475f565b5f5b8281101561525557848901518255600182019150602085019450602081019050615230565b86831015615272578489015161526e601f8916826148c5565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b6152ce6152c982614141565b6152b4565b82525050565b5f6152df82856152bd565b6020820191506152ef82846152bd565b6020820191508190509392505050565b5f61531961531461530f84614556565b6147dd565b613ef2565b9050919050565b615329816152ff565b82525050565b5f6040820190506153425f830185615320565b61534f6020830184614064565b9392505050565b5f81519050919050565b5f82825260208201905092915050565b5f61537a82615356565b6153848185615360565b9350615394818560208601613e62565b61539d81613e8a565b840191505092915050565b5f6080820190506153bb5f830187613d5c565b6153c86020830186613d5c565b6153d56040830185614064565b81810360608301526153e78184615370565b905095945050505050565b5f8151905061540081613dc0565b92915050565b5f6020828403121561541b5761541a613d8d565b5b5f615428848285016153f2565b9150509291505056fea2646970667358221220f2e89c0356ff7abfff8b44ac419fa5134123fda118d7df00b4fb8fd54d3a274064736f6c63430008160033436162616e657320646520626f6973207061726d69206c6573206f6c697669657273206574c2a063797072c3a87300000000000000000000000081fedf698626187d0d48409cd1dca2f57566127f00000000000000000000000000000000000000000000000000000000000003e800000000000000000000000059de7273191e6bf1907d614e94ecfbe8e5fb7318
Deployed Bytecode
0x608060405260043610610396575f3560e01c80637bc02806116101db578063bc1ac5c111610101578063d62f3b1c1161009f578063e985e9c51161006e578063e985e9c514610ce1578063f2fde38b14610d1d578063f3237dec14610d45578063fb796e6c14610d5b57610396565b8063d62f3b1c14610c3f578063da3ef23f14610c55578063dc33e68114610c7d578063e75179a414610cb957610396565b8063c6682862116100db578063c668286214610b85578063c6ab67a314610baf578063c87b56dd14610bd9578063d54ad2a114610c1557610396565b8063bc1ac5c114610b0b578063beafc89b14610b35578063c21b471b14610b5d57610396565b8063aa592f2511610179578063b6c693e511610148578063b6c693e514610a61578063b7c0b8e814610a8b578063b88d4fde14610ab3578063bbadfe7614610acf57610396565b8063aa592f2514610997578063b366d613146109c1578063b449c24d146109e9578063b629f19214610a2557610396565b80638342083a116101b55780638342083a146108f15780638da5cb5b1461091b57806395d89b4114610945578063a22cb4651461096f57610396565b80637bc02806146108755780637cb647591461089f5780637ec9e156146108c757610396565b80633dd08c38116102c05780636817c76c1161025e57806370a082311161022d57806370a08231146107df578063715018a61461081b57806374d0101d1461083157806378bfbdbb1461085957610396565b80636817c76c14610739578063685756851461076357806369e2f0fb1461078d5780636e56539b146107b557610396565b806355f804b31161029a57806355f804b3146106835780635d82cf6e146106ab578063601e5e77146106d35780636352211e146106fd57610396565b80633dd08c381461060f578063402c38561461064b57806342842e0e1461066757610396565b806323b872dd1161033857806332cb6b0c1161030757806332cb6b0c1461057f57806334531828146105a9578063381a3506146105d15780633ccfd60b146105f957610396565b806323b872dd146104d457806326aa420a146104f05780632a55205a146105185780632eb4a7ab1461055557610396565b8063081812fc11610374578063081812fc1461042a578063095ea7b314610466578063109695231461048257806318160ddd146104aa57610396565b806301684b061461039a57806301ffc9a7146103c457806306fdde0314610400575b5f80fd5b3480156103a5575f80fd5b506103ae610d85565b6040516103bb9190613d6b565b60405180910390f35b3480156103cf575f80fd5b506103ea60048036038101906103e59190613dea565b610daa565b6040516103f79190613e2f565b60405180910390f35b34801561040b575f80fd5b50610414610dcb565b6040516104219190613ed2565b60405180910390f35b348015610435575f80fd5b50610450600480360381019061044b9190613f25565b610e5b565b60405161045d9190613d6b565b60405180910390f35b610480600480360381019061047b9190613f7a565b610ed5565b005b34801561048d575f80fd5b506104a860048036038101906104a39190614019565b610f3e565b005b3480156104b5575f80fd5b506104be611059565b6040516104cb9190614073565b60405180910390f35b6104ee60048036038101906104e9919061408c565b61106e565b005b3480156104fb575f80fd5b5061051660048036038101906105119190613f25565b6110e1565b005b348015610523575f80fd5b5061053e600480360381019061053991906140dc565b6110f3565b60405161054c92919061411a565b60405180910390f35b348015610560575f80fd5b506105696112cf565b6040516105769190614159565b60405180910390f35b34801561058a575f80fd5b506105936112d5565b6040516105a09190614073565b60405180910390f35b3480156105b4575f80fd5b506105cf60048036038101906105ca9190613dea565b6112db565b005b3480156105dc575f80fd5b506105f760048036038101906105f29190613f25565b61134d565b005b348015610604575f80fd5b5061060d61135f565b005b34801561061a575f80fd5b5061063560048036038101906106309190614172565b611409565b6040516106429190613e2f565b60405180910390f35b610665600480360381019061066091906141c7565b611426565b005b610681600480360381019061067c919061408c565b6116cf565b005b34801561068e575f80fd5b506106a960048036038101906106a49190614019565b611742565b005b3480156106b6575f80fd5b506106d160048036038101906106cc9190613f25565b611816565b005b3480156106de575f80fd5b506106e7611828565b6040516106f49190614073565b60405180910390f35b348015610708575f80fd5b50610723600480360381019061071e9190613f25565b61182e565b6040516107309190613d6b565b60405180910390f35b348015610744575f80fd5b5061074d61183f565b60405161075a9190614073565b60405180910390f35b34801561076e575f80fd5b50610777611845565b6040516107849190614073565b60405180910390f35b348015610798575f80fd5b506107b360048036038101906107ae9190614172565b61184b565b005b3480156107c0575f80fd5b506107c961193a565b6040516107d69190614073565b60405180910390f35b3480156107ea575f80fd5b5061080560048036038101906108009190614172565b611940565b6040516108129190614073565b60405180910390f35b348015610826575f80fd5b5061082f6119f5565b005b34801561083c575f80fd5b5061085760048036038101906108529190613f7a565b611a08565b005b610873600480360381019061086e919061426c565b611b2b565b005b348015610880575f80fd5b5061088961215c565b6040516108969190613d6b565b60405180910390f35b3480156108aa575f80fd5b506108c560048036038101906108c0919061431a565b612181565b005b3480156108d2575f80fd5b506108db612193565b6040516108e89190613d6b565b60405180910390f35b3480156108fc575f80fd5b506109056121b8565b6040516109129190614073565b60405180910390f35b348015610926575f80fd5b5061092f6121be565b60405161093c9190613d6b565b60405180910390f35b348015610950575f80fd5b506109596121e6565b6040516109669190613ed2565b60405180910390f35b34801561097a575f80fd5b5061099560048036038101906109909190614345565b612276565b005b3480156109a2575f80fd5b506109ab6122df565b6040516109b89190614073565b60405180910390f35b3480156109cc575f80fd5b506109e760048036038101906109e29190614172565b6122e4565b005b3480156109f4575f80fd5b50610a0f6004803603810190610a0a9190614172565b6123d3565b604051610a1c9190614073565b60405180910390f35b348015610a30575f80fd5b50610a4b6004803603810190610a469190614172565b6123e8565b604051610a589190613e2f565b60405180910390f35b348015610a6c575f80fd5b50610a75612405565b604051610a829190613e2f565b60405180910390f35b348015610a96575f80fd5b50610ab16004803603810190610aac9190614383565b612417565b005b610acd6004803603810190610ac891906144d6565b6124f1565b005b348015610ada575f80fd5b50610af56004803603810190610af09190613dea565b612566565b604051610b029190613e2f565b60405180910390f35b348015610b16575f80fd5b50610b1f612583565b604051610b2c9190613e2f565b60405180910390f35b348015610b40575f80fd5b50610b5b6004803603810190610b569190613f25565b612596565b005b348015610b68575f80fd5b50610b836004803603810190610b7e9190614597565b6125a8565b005b348015610b90575f80fd5b50610b996125be565b604051610ba69190613ed2565b60405180910390f35b348015610bba575f80fd5b50610bc361264a565b604051610bd09190613ed2565b60405180910390f35b348015610be4575f80fd5b50610bff6004803603810190610bfa9190613f25565b6126d6565b604051610c0c9190613ed2565b60405180910390f35b348015610c20575f80fd5b50610c2961277d565b604051610c369190614073565b60405180910390f35b348015610c4a575f80fd5b50610c53612783565b005b348015610c60575f80fd5b50610c7b6004803603810190610c769190614673565b6127a7565b005b348015610c88575f80fd5b50610ca36004803603810190610c9e9190614172565b6127c2565b604051610cb09190614073565b60405180910390f35b348015610cc4575f80fd5b50610cdf6004803603810190610cda9190614172565b6127d3565b005b348015610cec575f80fd5b50610d076004803603810190610d0291906146ba565b6128e0565b604051610d149190613e2f565b60405180910390f35b348015610d28575f80fd5b50610d436004803603810190610d3e9190614172565b61296e565b005b348015610d50575f80fd5b50610d596129f2565b005b348015610d66575f80fd5b50610d6f612a17565b604051610d7c9190613e2f565b60405180910390f35b60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f610db482612a29565b80610dc45750610dc382612aba565b5b9050919050565b606060028054610dda90614725565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0690614725565b8015610e515780601f10610e2857610100808354040283529160200191610e51565b820191905f5260205f20905b815481529060010190602001808311610e3457829003601f168201915b5050505050905090565b5f610e6582612b33565b610e9b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60065f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160185f9054906101000a900460ff168015610f2e5769c61711340011223344555f5230601a528160601b60601c603a525f80604460166daaeb6d7670e522a718067333cd4e5afa610f29573d5f803e3d5ffd5b5f603a525b610f388484612b8d565b50505050565b60195f80357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020015f205f9054906101000a900460ff1615610ff4576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ffc612ccc565b5f6017805461100a90614725565b905014611043576040517f19e24c1100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181601791826110549291906148fc565b505050565b5f611062612d53565b6001545f540303905090565b8260185f9054906101000a900460ff1680156110cf57338260601b60601c146110ce5769c61711340011223344555f5230601a5233603a525f80604460166daaeb6d7670e522a718067333cd4e5afa6110c9573d5f803e3d5ffd5b5f603a525b5b6110da858585612d5b565b5050505050565b6110e9612ccc565b8060138190555050565b5f805f60095f8681526020019081526020015f206040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff160361127c5760086040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b5f611285613069565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16866112b191906149f6565b6112bb9190614a64565b9050815f0151819350935050509250929050565b600c5481565b60115481565b6112e3612ccc565b600160195f837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b611355612ccc565b8060148190555050565b611367612ccc565b5f3373ffffffffffffffffffffffffffffffffffffffff164760405161138c90614ac1565b5f6040518083038185875af1925050503d805f81146113c6576040519150601f19603f3d011682016040523d82523d5f602084013e6113cb565b606091505b5050905080611406576040517f750b219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b601c602052805f5260405f205f915054906101000a900460ff1681565b60011515601c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161515146114b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ad90614b1f565b60405180910390fd5b60011515601a5f9054906101000a900460ff1615151461150b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150290614b87565b60405180910390fd5b601354821115611550576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154790614bef565b60405180910390fd5b6011548261155c613072565b6115669190614c0d565b11156115a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159e90614c8a565b60405180910390fd5b5f601554836115b691906149f6565b9050803410156115fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f290614cf2565b60405180910390fd5b6116058484613083565b8260135f8282546116169190614d10565b9250508190555081601b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550803411156116c9573373ffffffffffffffffffffffffffffffffffffffff166108fc823461169f9190614d10565b90811502906040515f60405180830381858888f193505050501580156116c7573d5f803e3d5ffd5b505b50505050565b8260185f9054906101000a900460ff16801561173057338260601b60601c1461172f5769c61711340011223344555f5230601a5233603a525f80604460166daaeb6d7670e522a718067333cd4e5afa61172a573d5f803e3d5ffd5b5f603a525b5b61173b85858561322c565b5050505050565b60195f80357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020015f205f9054906101000a900460ff16156117f8576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611800612ccc565b8181600b91826118119291906148fc565b505050565b61181e612ccc565b8060158190555050565b60125481565b5f6118388261324b565b9050919050565b60155481565b60165481565b611853612ccc565b60011515601c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161515146118e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118da90614d8d565b60405180910390fd5b5f601c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b60145481565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119a6576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054169050919050565b6119fd612ccc565b611a065f61330e565b565b60195f80357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020015f205f9054906101000a900460ff1615611abe576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ac6612ccc565b60115481611ad2613072565b611adc9190614c0d565b1115611b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1490614c8a565b60405180910390fd5b611b278282613083565b5050565b60011515601c5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151514611bbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb290614b1f565b60405180910390fd5b60011515601a60019054906101000a900460ff16151514611c11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0890614b87565b60405180910390fd5b60115484611c1d613072565b611c279190614c0d565b1115611c68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5f90614c8a565b60405180910390fd5b5f600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f60105f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401611d109190613d6b565b602060405180830381865afa158015611d2b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d4f9190614dbf565b8273ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b8152600401611d889190613d6b565b602060405180830381865afa158015611da3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dc79190614dbf565b8473ffffffffffffffffffffffffffffffffffffffff166370a082318b6040518263ffffffff1660e01b8152600401611e009190613d6b565b602060405180830381865afa158015611e1b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e3f9190614dbf565b611e499190614c0d565b611e539190614c0d565b601d5f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205410611ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec890614e5a565b60405180910390fd5b60145487601e54611ee29190614c0d565b1115611f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1a90614ec2565b60405180910390fd5b5f8888604051602001611f37929190614f45565b604051602081830303815290604052805190602001209050611f9c8686808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f82011690508083019250505050505050600c54836133d1565b611fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd290614fba565b60405180910390fd5b5f60165489611fea91906149f6565b90508034101561202f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202690614cf2565b60405180910390fd5b6120398a8a613083565b88601e5f82825461204a9190614c0d565b9250508190555088601d5f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461209d9190614c0d565b9250508190555087601b5f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555080341115612150573373ffffffffffffffffffffffffffffffffffffffff166108fc82346121269190614d10565b90811502906040515f60405180830381858888f1935050505015801561214e573d5f803e3d5ffd5b505b50505050505050505050565b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612189612ccc565b80600c8190555050565b600f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60135481565b5f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546121f590614725565b80601f016020809104026020016040519081016040528092919081815260200182805461222190614725565b801561226c5780601f106122435761010080835404028352916020019161226c565b820191905f5260205f20905b81548152906001019060200180831161224f57829003601f168201915b5050505050905090565b8160185f9054906101000a900460ff1680156122cf5769c61711340011223344555f5230601a528160601b60601c603a525f80604460166daaeb6d7670e522a718067333cd4e5afa6122ca573d5f803e3d5ffd5b5f603a525b6122d9848461347e565b50505050565b600381565b6122ec612ccc565b5f1515601c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615151461237b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237290615022565b60405180910390fd5b6001601c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b601d602052805f5260405f205f915090505481565b601b602052805f5260405f205f915054906101000a900460ff1681565b601a5f9054906101000a900460ff1681565b60195f80357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020015f205f9054906101000a900460ff16156124cd576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124d5612ccc565b8060185f6101000a81548160ff02191690831515021790555050565b8360185f9054906101000a900460ff16801561255257338260601b60601c146125515769c61711340011223344555f5230601a5233603a525f80604460166daaeb6d7670e522a718067333cd4e5afa61254c573d5f803e3d5ffd5b5f603a525b5b61255e86868686613584565b505050505050565b6019602052805f5260405f205f915054906101000a900460ff1681565b601a60019054906101000a900460ff1681565b61259e612ccc565b8060168190555050565b6125b0612ccc565b6125ba82826135f6565b5050565b600d80546125cb90614725565b80601f01602080910402602001604051908101604052809291908181526020018280546125f790614725565b80156126425780601f1061261957610100808354040283529160200191612642565b820191905f5260205f20905b81548152906001019060200180831161262557829003601f168201915b505050505081565b6017805461265790614725565b80601f016020809104026020016040519081016040528092919081815260200182805461268390614725565b80156126ce5780601f106126a5576101008083540402835291602001916126ce565b820191905f5260205f20905b8154815290600101906020018083116126b157829003601f168201915b505050505081565b60606126e182612b33565b612720576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612717906150b0565b60405180910390fd5b5f612729613791565b90505f8151116127475760405180602001604052805f815250612775565b8061275184613821565b600d60405160200161276593929190615188565b6040516020818303038152906040525b915050919050565b601e5481565b61278b612ccc565b6001601a5f6101000a81548160ff021916908315150217905550565b6127af612ccc565b80600d90816127be91906151b8565b5050565b5f6127cc826138eb565b9050919050565b60195f80357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020015f205f9054906101000a900460ff1615612889576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612891612ccc565b600361289b613072565b106128d2576040517f1f0f14ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128dd816003613083565b50565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b612976612ccc565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036129e6575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016129dd9190613d6b565b60405180910390fd5b6129ef8161330e565b50565b6129fa612ccc565b6001601a60016101000a81548160ff021916908315150217905550565b60185f9054906101000a900460ff1681565b5f6301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a8357506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612ab35750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b5f7f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b2c5750612b2b8261393f565b5b9050919050565b5f81612b3d612d53565b11158015612b4b57505f5482105b8015612b8657505f7c010000000000000000000000000000000000000000000000000000000060045f8581526020019081526020015f205416145b9050919050565b5f612b978261182e565b90508073ffffffffffffffffffffffffffffffffffffffff16612bb86139a8565b73ffffffffffffffffffffffffffffffffffffffff1614612c1b57612be481612bdf6139a8565b6128e0565b612c1a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8260065f8481526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b612cd46139af565b73ffffffffffffffffffffffffffffffffffffffff16612cf26121be565b73ffffffffffffffffffffffffffffffffffffffff1614612d5157612d156139af565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401612d489190613d6b565b60405180910390fd5b565b5f6001905090565b5f612d658261324b565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612dcc576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80612dd7846139b6565b91509150612ded8187612de86139a8565b6139d9565b612e3957612e0286612dfd6139a8565b6128e0565b612e38576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612e9e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612eab8686866001613a1c565b8015612eb5575f82555b60055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815460010191905081905550612f7d85612f59888887613a22565b7c020000000000000000000000000000000000000000000000000000000017613a49565b60045f8681526020019081526020015f20819055505f7c0200000000000000000000000000000000000000000000000000000000841603612ff9575f6001850190505f60045f8381526020019081526020015f205403612ff7575f548114612ff6578360045f8381526020019081526020015f20819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130618686866001613a73565b505050505050565b5f612710905090565b5f61307b612d53565b5f5403905090565b5f805490505f82036130c1576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6130cd5f848385613a1c565b600160406001901b17820260055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254019250508190555061313f836131305f865f613a22565b61313985613a79565b17613a49565b60045f8381526020019081526020015f20819055505f80838301905073ffffffffffffffffffffffffffffffffffffffff8516915082825f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600183015b8181146131d95780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a46001810190506131a0565b505f8203613213576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f8190555050506132275f848385613a73565b505050565b61324683838360405180602001604052805f8152506124f1565b505050565b5f8082905080613259612d53565b116132d7575f548110156132d6575f60045f8381526020019081526020015f205490505f7c01000000000000000000000000000000000000000000000000000000008216036132d4575b5f81036132ca5760045f836001900393508381526020019081526020015f205490506132a3565b8092505050613309565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f808290505f5b8551811015613470575f8682815181106133f5576133f4615287565b5b602002602001015190508083116134365782816040516020016134199291906152d4565b604051602081830303815290604052805190602001209250613462565b80836040516020016134499291906152d4565b6040516020818303038152906040528051906020012092505b5080806001019150506133d8565b508381149150509392505050565b8060075f61348a6139a8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166135336139a8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516135789190613e2f565b60405180910390a35050565b61358f84848461106e565b5f8373ffffffffffffffffffffffffffffffffffffffff163b146135f0576135b984848484613a88565b6135ef576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b5f6135ff613069565b6bffffffffffffffffffffffff16905080826bffffffffffffffffffffffff1611156136645781816040517f6f483d0900000000000000000000000000000000000000000000000000000000815260040161365b92919061532f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036136d4575f6040517fb6d9900a0000000000000000000000000000000000000000000000000000000081526004016136cb9190613d6b565b60405180910390fd5b60405180604001604052808473ffffffffffffffffffffffffffffffffffffffff168152602001836bffffffffffffffffffffffff1681525060085f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151815f0160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550905050505050565b6060600b80546137a090614725565b80601f01602080910402602001604051908101604052809291908181526020018280546137cc90614725565b80156138175780601f106137ee57610100808354040283529160200191613817565b820191905f5260205f20905b8154815290600101906020018083116137fa57829003601f168201915b5050505050905090565b60605f600161382f84613bd3565b0190505f8167ffffffffffffffff81111561384d5761384c6143b2565b5b6040519080825280601f01601f19166020018201604052801561387f5781602001600182028036833780820191505090505b5090505f82602001820190505b6001156138e0578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816138d5576138d4614a37565b5b0494505f850361388c575b819350505050919050565b5f67ffffffffffffffff604060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054901c169050919050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f33905090565b5f33905090565b5f805f60065f8581526020019081526020015f2090508092508254915050915091565b5f73ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b5f8060e883901c905060e8613a38868684613d24565b62ffffff16901b9150509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b5f6001821460e11b9050919050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613aad6139a8565b8786866040518563ffffffff1660e01b8152600401613acf94939291906153a8565b6020604051808303815f875af1925050508015613b0a57506040513d601f19601f82011682018060405250810190613b079190615406565b60015b613b80573d805f8114613b38576040519150601f19603f3d011682016040523d82523d5f602084013e613b3d565b606091505b505f815103613b78576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613c2f577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381613c2557613c24614a37565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613c6c576d04ee2d6d415b85acef81000000008381613c6257613c61614a37565b5b0492506020810190505b662386f26fc100008310613c9b57662386f26fc100008381613c9157613c90614a37565b5b0492506010810190505b6305f5e1008310613cc4576305f5e1008381613cba57613cb9614a37565b5b0492506008810190505b6127108310613ce9576127108381613cdf57613cde614a37565b5b0492506004810190505b60648310613d0c5760648381613d0257613d01614a37565b5b0492506002810190505b600a8310613d1b576001810190505b80915050919050565b5f9392505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613d5582613d2c565b9050919050565b613d6581613d4b565b82525050565b5f602082019050613d7e5f830184613d5c565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613dc981613d95565b8114613dd3575f80fd5b50565b5f81359050613de481613dc0565b92915050565b5f60208284031215613dff57613dfe613d8d565b5b5f613e0c84828501613dd6565b91505092915050565b5f8115159050919050565b613e2981613e15565b82525050565b5f602082019050613e425f830184613e20565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613e7f578082015181840152602081019050613e64565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613ea482613e48565b613eae8185613e52565b9350613ebe818560208601613e62565b613ec781613e8a565b840191505092915050565b5f6020820190508181035f830152613eea8184613e9a565b905092915050565b5f819050919050565b613f0481613ef2565b8114613f0e575f80fd5b50565b5f81359050613f1f81613efb565b92915050565b5f60208284031215613f3a57613f39613d8d565b5b5f613f4784828501613f11565b91505092915050565b613f5981613d4b565b8114613f63575f80fd5b50565b5f81359050613f7481613f50565b92915050565b5f8060408385031215613f9057613f8f613d8d565b5b5f613f9d85828601613f66565b9250506020613fae85828601613f11565b9150509250929050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112613fd957613fd8613fb8565b5b8235905067ffffffffffffffff811115613ff657613ff5613fbc565b5b60208301915083600182028301111561401257614011613fc0565b5b9250929050565b5f806020838503121561402f5761402e613d8d565b5b5f83013567ffffffffffffffff81111561404c5761404b613d91565b5b61405885828601613fc4565b92509250509250929050565b61406d81613ef2565b82525050565b5f6020820190506140865f830184614064565b92915050565b5f805f606084860312156140a3576140a2613d8d565b5b5f6140b086828701613f66565b93505060206140c186828701613f66565b92505060406140d286828701613f11565b9150509250925092565b5f80604083850312156140f2576140f1613d8d565b5b5f6140ff85828601613f11565b925050602061411085828601613f11565b9150509250929050565b5f60408201905061412d5f830185613d5c565b61413a6020830184614064565b9392505050565b5f819050919050565b61415381614141565b82525050565b5f60208201905061416c5f83018461414a565b92915050565b5f6020828403121561418757614186613d8d565b5b5f61419484828501613f66565b91505092915050565b6141a681613e15565b81146141b0575f80fd5b50565b5f813590506141c18161419d565b92915050565b5f805f606084860312156141de576141dd613d8d565b5b5f6141eb86828701613f66565b93505060206141fc86828701613f11565b925050604061420d868287016141b3565b9150509250925092565b5f8083601f84011261422c5761422b613fb8565b5b8235905067ffffffffffffffff81111561424957614248613fbc565b5b60208301915083602082028301111561426557614264613fc0565b5b9250929050565b5f805f805f6080868803121561428557614284613d8d565b5b5f61429288828901613f66565b95505060206142a388828901613f11565b94505060406142b4888289016141b3565b935050606086013567ffffffffffffffff8111156142d5576142d4613d91565b5b6142e188828901614217565b92509250509295509295909350565b6142f981614141565b8114614303575f80fd5b50565b5f81359050614314816142f0565b92915050565b5f6020828403121561432f5761432e613d8d565b5b5f61433c84828501614306565b91505092915050565b5f806040838503121561435b5761435a613d8d565b5b5f61436885828601613f66565b9250506020614379858286016141b3565b9150509250929050565b5f6020828403121561439857614397613d8d565b5b5f6143a5848285016141b3565b91505092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6143e882613e8a565b810181811067ffffffffffffffff82111715614407576144066143b2565b5b80604052505050565b5f614419613d84565b905061442582826143df565b919050565b5f67ffffffffffffffff821115614444576144436143b2565b5b61444d82613e8a565b9050602081019050919050565b828183375f83830152505050565b5f61447a6144758461442a565b614410565b905082815260208101848484011115614496576144956143ae565b5b6144a184828561445a565b509392505050565b5f82601f8301126144bd576144bc613fb8565b5b81356144cd848260208601614468565b91505092915050565b5f805f80608085870312156144ee576144ed613d8d565b5b5f6144fb87828801613f66565b945050602061450c87828801613f66565b935050604061451d87828801613f11565b925050606085013567ffffffffffffffff81111561453e5761453d613d91565b5b61454a878288016144a9565b91505092959194509250565b5f6bffffffffffffffffffffffff82169050919050565b61457681614556565b8114614580575f80fd5b50565b5f813590506145918161456d565b92915050565b5f80604083850312156145ad576145ac613d8d565b5b5f6145ba85828601613f66565b92505060206145cb85828601614583565b9150509250929050565b5f67ffffffffffffffff8211156145ef576145ee6143b2565b5b6145f882613e8a565b9050602081019050919050565b5f614617614612846145d5565b614410565b905082815260208101848484011115614633576146326143ae565b5b61463e84828561445a565b509392505050565b5f82601f83011261465a57614659613fb8565b5b813561466a848260208601614605565b91505092915050565b5f6020828403121561468857614687613d8d565b5b5f82013567ffffffffffffffff8111156146a5576146a4613d91565b5b6146b184828501614646565b91505092915050565b5f80604083850312156146d0576146cf613d8d565b5b5f6146dd85828601613f66565b92505060206146ee85828601613f66565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061473c57607f821691505b60208210810361474f5761474e6146f8565b5b50919050565b5f82905092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026147bb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614780565b6147c58683614780565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6148006147fb6147f684613ef2565b6147dd565b613ef2565b9050919050565b5f819050919050565b614819836147e6565b61482d61482582614807565b84845461478c565b825550505050565b5f90565b614841614835565b61484c818484614810565b505050565b5b8181101561486f576148645f82614839565b600181019050614852565b5050565b601f8211156148b4576148858161475f565b61488e84614771565b8101602085101561489d578190505b6148b16148a985614771565b830182614851565b50505b505050565b5f82821c905092915050565b5f6148d45f19846008026148b9565b1980831691505092915050565b5f6148ec83836148c5565b9150826002028217905092915050565b6149068383614755565b67ffffffffffffffff81111561491f5761491e6143b2565b5b6149298254614725565b614934828285614873565b5f601f831160018114614961575f841561494f578287013590505b61495985826148e1565b8655506149c0565b601f19841661496f8661475f565b5f5b8281101561499657848901358255600182019150602085019450602081019050614971565b868310156149b357848901356149af601f8916826148c5565b8355505b6001600288020188555050505b50505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614a0082613ef2565b9150614a0b83613ef2565b9250828202614a1981613ef2565b91508282048414831517614a3057614a2f6149c9565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614a6e82613ef2565b9150614a7983613ef2565b925082614a8957614a88614a37565b5b828204905092915050565b5f81905092915050565b50565b5f614aac5f83614a94565b9150614ab782614a9e565b5f82019050919050565b5f614acb82614aa1565b9150819050919050565b7f596f75277265206e6f742061206d696e746572000000000000000000000000005f82015250565b5f614b09601383613e52565b9150614b1482614ad5565b602082019050919050565b5f6020820190508181035f830152614b3681614afd565b9050919050565b7f4d696e74696e67206973206e6f7420796574206f70656e2e00000000000000005f82015250565b5f614b71601883613e52565b9150614b7c82614b3d565b602082019050919050565b5f6020820190508181035f830152614b9e81614b65565b9050919050565b7f4e465420616d6f756e74206578636565647300000000000000000000000000005f82015250565b5f614bd9601283613e52565b9150614be482614ba5565b602082019050919050565b5f6020820190508181035f830152614c0681614bcd565b9050919050565b5f614c1782613ef2565b9150614c2283613ef2565b9250828201905080821115614c3a57614c396149c9565b5b92915050565b7f45786365656473204d6178696d756d20537570706c79000000000000000000005f82015250565b5f614c74601683613e52565b9150614c7f82614c40565b602082019050919050565b5f6020820190508181035f830152614ca181614c68565b9050919050565b7f45746865722073656e74206973206e6f7420636f72726563742e0000000000005f82015250565b5f614cdc601a83613e52565b9150614ce782614ca8565b602082019050919050565b5f6020820190508181035f830152614d0981614cd0565b9050919050565b5f614d1a82613ef2565b9150614d2583613ef2565b9250828203905081811115614d3d57614d3c6149c9565b5b92915050565b7f6d696e74657220646f65736e27742065786973740000000000000000000000005f82015250565b5f614d77601483613e52565b9150614d8282614d43565b602082019050919050565b5f6020820190508181035f830152614da481614d6b565b9050919050565b5f81519050614db981613efb565b92915050565b5f60208284031215614dd457614dd3613d8d565b5b5f614de184828501614dab565b91505092915050565b7f496e76616c69642057686974656c6973742050726f6f66206f7220416c7265615f8201527f647920436c61696d656400000000000000000000000000000000000000000000602082015250565b5f614e44602a83613e52565b9150614e4f82614dea565b604082019050919050565b5f6020820190508181035f830152614e7181614e38565b9050919050565b7f416c6c204e46547320436c61696d65642e0000000000000000000000000000005f82015250565b5f614eac601183613e52565b9150614eb782614e78565b602082019050919050565b5f6020820190508181035f830152614ed981614ea0565b9050919050565b5f8160601b9050919050565b5f614ef682614ee0565b9050919050565b5f614f0782614eec565b9050919050565b614f1f614f1a82613d4b565b614efd565b82525050565b5f819050919050565b614f3f614f3a82613ef2565b614f25565b82525050565b5f614f508285614f0e565b601482019150614f608284614f2e565b6020820191508190509392505050565b7f496e76616c69642057686974656c6973742050726f6f662e00000000000000005f82015250565b5f614fa4601883613e52565b9150614faf82614f70565b602082019050919050565b5f6020820190508181035f830152614fd181614f98565b9050919050565b7f616c72656164792061206d696e746572000000000000000000000000000000005f82015250565b5f61500c601083613e52565b915061501782614fd8565b602082019050919050565b5f6020820190508181035f83015261503981615000565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f61509a602f83613e52565b91506150a582615040565b604082019050919050565b5f6020820190508181035f8301526150c78161508e565b9050919050565b5f81905092915050565b5f6150e282613e48565b6150ec81856150ce565b93506150fc818560208601613e62565b80840191505092915050565b5f815461511481614725565b61511e81866150ce565b9450600182165f8114615138576001811461514d5761517f565b60ff198316865281151582028601935061517f565b6151568561475f565b5f5b8381101561517757815481890152600182019150602081019050615158565b838801955050505b50505092915050565b5f61519382866150d8565b915061519f82856150d8565b91506151ab8284615108565b9150819050949350505050565b6151c182613e48565b67ffffffffffffffff8111156151da576151d96143b2565b5b6151e48254614725565b6151ef828285614873565b5f60209050601f831160018114615220575f841561520e578287015190505b61521885826148e1565b86555061527f565b601f19841661522e8661475f565b5f5b8281101561525557848901518255600182019150602085019450602081019050615230565b86831015615272578489015161526e601f8916826148c5565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b6152ce6152c982614141565b6152b4565b82525050565b5f6152df82856152bd565b6020820191506152ef82846152bd565b6020820191508190509392505050565b5f61531961531461530f84614556565b6147dd565b613ef2565b9050919050565b615329816152ff565b82525050565b5f6040820190506153425f830185615320565b61534f6020830184614064565b9392505050565b5f81519050919050565b5f82825260208201905092915050565b5f61537a82615356565b6153848185615360565b9350615394818560208601613e62565b61539d81613e8a565b840191505092915050565b5f6080820190506153bb5f830187613d5c565b6153c86020830186613d5c565b6153d56040830185614064565b81810360608301526153e78184615370565b905095945050505050565b5f8151905061540081613dc0565b92915050565b5f6020828403121561541b5761541a613d8d565b5b5f615428848285016153f2565b9150509291505056fea2646970667358221220f2e89c0356ff7abfff8b44ac419fa5134123fda118d7df00b4fb8fd54d3a274064736f6c63430008160033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000081fedf698626187d0d48409cd1dca2f57566127f00000000000000000000000000000000000000000000000000000000000003e800000000000000000000000059de7273191e6bf1907d614e94ecfbe8e5fb7318
-----Decoded View---------------
Arg [0] : _royaltyReceiver (address): 0x81feDf698626187d0d48409cD1Dca2f57566127F
Arg [1] : _royaltyFraction (uint96): 1000
Arg [2] : initialOwner (address): 0x59dE7273191E6bf1907d614e94eCFbe8e5FB7318
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000081fedf698626187d0d48409cd1dca2f57566127f
Arg [1] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [2] : 00000000000000000000000059de7273191e6bf1907d614e94ecfbe8e5fb7318
Deployed Bytecode Sourcemap
102285:12043:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;102612:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;104733:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60779:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67717:268;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;112747:232;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;108093:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56352:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;113139:272;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;111591:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33048:429;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;102460:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;102650:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;106496:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;111468:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;111986:207;;;;;;;;;;;;;:::i;:::-;;103213:38;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;110540:688;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;113571:280;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;107801:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;111236:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102731:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62269:202;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;102856:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;102901:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;106775:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102811:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57536:283;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39136:103;;;;;;;;;;;;;:::i;:::-;;108795:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;109082:1450;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102536:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;108370:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102574:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;102770:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38461:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60955:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;112353:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102688:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;106600:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;103258:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;103170:36;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;103081;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;107138:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;114011:314;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;103029:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;103124:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;111350:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;107521:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102492:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;102951:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;105389:649;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;103307:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;111708:93;;;;;;;;;;;;;:::i;:::-;;105230:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;106203:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;108619:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68748:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39394:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;111809:97;;;;;;;;;;;;;:::i;:::-;;102986:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;102612:31;;;;;;;;;;;;;:::o;104733:274::-;104864:4;104906:38;104932:11;104906:25;:38::i;:::-;:93;;;;104961:38;104987:11;104961:25;:38::i;:::-;104906:93;104886:113;;104733:274;;;:::o;60779:100::-;60833:13;60866:5;60859:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60779:100;:::o;67717:268::-;67838:7;67868:16;67876:7;67868;:16::i;:::-;67863:64;;67893:34;;;;;;;;;;;;;;67863:64;67947:15;:24;67963:7;67947:24;;;;;;;;;;;:30;;;;;;;;;;;;67940:37;;67717:268;;;:::o;112747:232::-;112887:8;112897:24;;;;;;;;;;;100651:7;100648:1138;;;100780:22;100774:4;100767:36;100881:9;100875:4;100868:23;101033:8;101029:2;101025:17;101021:2;101017:26;101011:4;101004:40;101393:4;101362;101331;101300;101248:25;101216:5;101179:241;101147:503;;101562:16;101556:4;101550;101535:44;101614:16;101608:4;101601:30;101147:503;101769:1;101763:4;101756:15;100648:1138;112939:32:::1;112953:8;112963:7;112939:13;:32::i;:::-;112747:232:::0;;;;:::o;108093:269::-;104492:14;:23;104507:7;;;;104492:23;;;;;;;;;;;;;;;;;;;;;;;;;;;104488:52;;;104524:16;;;;;;;;;;;;;;104488:52;38347:13:::1;:11;:13::i;:::-;108260:1:::2;108234:14;108228:28;;;;;:::i;:::-;;;:33;108224:85;;108283:26;;;;;;;;;;;;;;108224:85;108339:15;;108322:14;:32;;;;;;;:::i;:::-;;108093:269:::0;;:::o;56352:323::-;56413:7;56641:15;:13;:15::i;:::-;56626:12;;56610:13;;:28;:46;56603:53;;56352:323;:::o;113139:272::-;113318:4;113324:24;;;;;;;;;;;98166:7;98163:1892;;;98379:8;98371:4;98367:2;98363:13;98359:2;98355:22;98352:36;98342:1698;;98694:22;98688:4;98681:36;98803:9;98797:4;98790:23;98896:8;98890:4;98883:22;99290:4;99255;99220;99185;99129:25;99093:5;99052:269;99016:555;;99475:16;99469:4;99463;99448:44;99531:16;99525:4;99518:30;99016:555;100019:1;100013:4;100006:15;98342:1698;98163:1892;113366:37:::1;113385:4;113391:2;113395:7;113366:18;:37::i;:::-;113139:272:::0;;;;;:::o;111591:109::-;38347:13;:11;:13::i;:::-;111682:10:::1;111666:13;:26;;;;111591:109:::0;:::o;33048:429::-;33134:7;33143;33163:26;33192:17;:26;33210:7;33192:26;;;;;;;;;;;33163:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33263:1;33235:30;;:7;:16;;;:30;;;33231:92;;33292:19;33282:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33231:92;33335:21;33399:17;:15;:17::i;:::-;33359:57;;33372:7;:23;;;33360:35;;:9;:35;;;;:::i;:::-;33359:57;;;;:::i;:::-;33335:81;;33437:7;:16;;;33455:13;33429:40;;;;;;33048:429;;;;;:::o;102460:25::-;;;;:::o;102650:31::-;;;;:::o;106496:96::-;38347:13;:11;:13::i;:::-;106580:4:::1;106559:14;:18;106574:2;106559:18;;;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;106496:96:::0;:::o;111468:115::-;38347:13;:11;:13::i;:::-;111565:10:::1;111546:16;:29;;;;111468:115:::0;:::o;111986:207::-;38347:13;:11;:13::i;:::-;112037:12:::1;112063:10;112055:24;;112101:21;112055:82;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;112036:101;;;112153:7;112148:37;;112169:16;;;;;;;;;;;;;;112148:37;112025:168;111986:207::o:0;103213:38::-;;;;;;;;;;;;;;;;;;;;;;:::o;110540:688::-;104631:4;104609:26;;:6;:18;104616:10;104609:18;;;;;;;;;;;;;;;;;;;;;;;;;:26;;;104601:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;110702:4:::1;110682:24;;:16;;;;;;;;;;;:24;;;110674:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;110766:13;;110754:8;:25;;110746:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;110850:10;;110838:8;110821:14;:12;:14::i;:::-;:25;;;;:::i;:::-;:39;;110813:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;110900:17;110931:9;;110920:8;:20;;;;:::i;:::-;110900:40;;110972:9;110959;:22;;110951:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;111023:19;111029:2;111033:8;111023:5;:19::i;:::-;111070:8;111053:13;;:25;;;;;;;:::i;:::-;;;;;;;;111100:5;111089:4;:8;111094:2;111089:8;;;;;;;;;;;;;;;;:16;;;;;;;;;;;;;;;;;;111132:9;111120;:21;111116:105;;;111166:10;111158:28;;:51;111199:9;111187;:21;;;;:::i;:::-;111158:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;111116:105;110663:565;110540:688:::0;;;:::o;113571:280::-;113754:4;113760:24;;;;;;;;;;;98166:7;98163:1892;;;98379:8;98371:4;98367:2;98363:13;98359:2;98355:22;98352:36;98342:1698;;98694:22;98688:4;98681:36;98803:9;98797:4;98790:23;98896:8;98890:4;98883:22;99290:4;99255;99220;99185;99129:25;99093:5;99052:269;99016:555;;99475:16;99469:4;99463;99448:44;99531:16;99525:4;99518:30;99016:555;100019:1;100013:4;100006:15;98342:1698;98163:1892;113802:41:::1;113825:4;113831:2;113835:7;113802:22;:41::i;:::-;113571:280:::0;;;;;:::o;107801:155::-;104492:14;:23;104507:7;;;;104492:23;;;;;;;;;;;;;;;;;;;;;;;;;;;104488:52;;;104524:16;;;;;;;;;;;;;;104488:52;38347:13:::1;:11;:13::i;:::-;107937:11:::2;;107921:13;:27;;;;;;;:::i;:::-;;107801:155:::0;;:::o;111236:106::-;38347:13;:11;:13::i;:::-;111325:9:::1;111313;:21;;;;111236:106:::0;:::o;102731:32::-;;;;:::o;62269:202::-;62386:7;62434:27;62453:7;62434:18;:27::i;:::-;62411:52;;62269:202;;;:::o;102856:38::-;;;;:::o;102901:43::-;;;;:::o;106775:171::-;38347:13;:11;:13::i;:::-;106875:4:::1;106856:23;;:6;:15;106863:7;106856:15;;;;;;;;;;;;;;;;;;;;;;;;;:23;;;106848:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;106933:5;106915:6;:15;106922:7;106915:15;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;106775:171:::0;:::o;102811:37::-;;;;:::o;57536:283::-;57653:7;57699:1;57682:19;;:5;:19;;;57678:60;;57710:28;;;;;;;;;;;;;;57678:60;51695:13;57756:18;:25;57775:5;57756:25;;;;;;;;;;;;;;;;:55;57749:62;;57536:283;;;:::o;39136:103::-;38347:13;:11;:13::i;:::-;39201:30:::1;39228:1;39201:18;:30::i;:::-;39136:103::o:0;108795:279::-;104492:14;:23;104507:7;;;;104492:23;;;;;;;;;;;;;;;;;;;;;;;;;;;104488:52;;;104524:16;;;;;;;;;;;;;;104488:52;38347:13:::1;:11;:13::i;:::-;108976:10:::2;;108964:8;108947:14;:12;:14::i;:::-;:25;;;;:::i;:::-;:39;;108925:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;109047:19;109053:2;109057:8;109047:5;:19::i;:::-;108795:279:::0;;:::o;109082:1450::-;104631:4;104609:26;;:6;:18;104616:10;104609:18;;;;;;;;;;;;;;;;;;;;;;;;;:26;;;104601:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;109291:4:::1;109268:27;;:19;;;;;;;;;;;:27;;;109260:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;109372:10;;109360:8;109343:14;:12;:14::i;:::-;:25;;;;:::i;:::-;:39;;109335:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;109422:27;109461:16;;;;;;;;;;;109422:56;;109489:27;109528:16;;;;;;;;;;;109489:56;;109556:27;109595:16;;;;;;;;;;;109556:56;;109731:18;:28;;;109760:2;109731:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;109696:18;:28;;;109725:2;109696:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;109661:18;:28;;;109690:2;109661:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;;;:::i;:::-;:102;;;;:::i;:::-;109647:7;:11;109655:2;109647:11;;;;;;;;;;;;;;;;:116;109625:208;;;;;;;;;;;;:::i;:::-;;;;;;;;;109893:16;;109881:8;109866:12;;:23;;;;:::i;:::-;:43;;109844:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;109965:12;110007:2;110011:8;109990:30;;;;;;;;;:::i;:::-;;;;;;;;;;;;;109980:41;;;;;;109965:56;;110054:49;110073:11;;110054:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;110086:10;;110098:4;110054:18;:49::i;:::-;110032:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;110166:17;110197:14;;110186:8;:25;;;;:::i;:::-;110166:45;;110243:9;110230;:22;;110222:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;110294:19;110300:2;110304:8;110294:5;:19::i;:::-;110340:8;110324:12;;:24;;;;;;;:::i;:::-;;;;;;;;110374:8;110359:7;:11;110367:2;110359:11;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;110404:5;110393:4;:8;110398:2;110393:8;;;;;;;;;;;;;;;;:16;;;;;;;;;;;;;;;;;;110436:9;110424;:21;110420:105;;;110470:10;110462:28;;:51;110503:9;110491;:21;;;;:::i;:::-;110462:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;110420:105;109249:1283;;;;;109082:1450:::0;;;;;:::o;102536:31::-;;;;;;;;;;;;;:::o;108370:106::-;38347:13;:11;:13::i;:::-;108457:11:::1;108444:10;:24;;;;108370:106:::0;:::o;102574:31::-;;;;;;;;;;;;;:::o;102770:32::-;;;;:::o;38461:87::-;38507:7;38534:6;;;;;;;;;;;38527:13;;38461:87;:::o;60955:104::-;61011:13;61044:7;61037:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60955:104;:::o;112353:234::-;112484:8;112494:24;;;;;;;;;;;100651:7;100648:1138;;;100780:22;100774:4;100767:36;100881:9;100875:4;100868:23;101033:8;101029:2;101025:17;101021:2;101017:26;101011:4;101004:40;101393:4;101362;101331;101300;101248:25;101216:5;101179:241;101147:503;;101562:16;101556:4;101550;101535:44;101614:16;101608:4;101601:30;101147:503;101769:1;101763:4;101756:15;100648:1138;112536:43:::1;112560:8;112570;112536:23;:43::i;:::-;112353:234:::0;;;;:::o;102688:36::-;102723:1;102688:36;:::o;106600:167::-;38347:13;:11;:13::i;:::-;106700:5:::1;106681:24;;:6;:15;106688:7;106681:15;;;;;;;;;;;;;;;;;;;;;;;;;:24;;;106673:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;106755:4;106737:6;:15;106744:7;106737:15;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;106600:167:::0;:::o;103258:42::-;;;;;;;;;;;;;;;;;:::o;103170:36::-;;;;;;;;;;;;;;;;;;;;;;:::o;103081:::-;;;;;;;;;;;;;:::o;107138:160::-;104492:14;:23;104507:7;;;;104492:23;;;;;;;;;;;;;;;;;;;;;;;;;;;104488:52;;;104524:16;;;;;;;;;;;;;;104488:52;38347:13:::1;:11;:13::i;:::-;107285:5:::2;107258:24;;:32;;;;;;;;;;;;;;;;;;107138:160:::0;:::o;114011:314::-;114222:4;114228:24;;;;;;;;;;;98166:7;98163:1892;;;98379:8;98371:4;98367:2;98363:13;98359:2;98355:22;98352:36;98342:1698;;98694:22;98688:4;98681:36;98803:9;98797:4;98790:23;98896:8;98890:4;98883:22;99290:4;99255;99220;99185;99129:25;99093:5;99052:269;99016:555;;99475:16;99469:4;99463;99448:44;99531:16;99525:4;99518:30;99016:555;100019:1;100013:4;100006:15;98342:1698;98163:1892;114270:47:::1;114293:4;114299:2;114303:7;114312:4;114270:22;:47::i;:::-;114011:314:::0;;;;;;:::o;103029:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;103124:39::-;;;;;;;;;;;;;:::o;111350:110::-;38347:13;:11;:13::i;:::-;111443:9:::1;111426:14;:26;;;;111350:110:::0;:::o;107521:170::-;38347:13;:11;:13::i;:::-;107638:45:::1;107657:8;107667:15;107638:18;:45::i;:::-;107521:170:::0;;:::o;102492:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;102951:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;105389:649::-;105507:13;105560:16;105568:7;105560;:16::i;:::-;105538:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;105664:28;105695:10;:8;:10::i;:::-;105664:41;;105767:1;105742:14;105736:28;:32;:294;;;;;;;;;;;;;;;;;105860:14;105901:25;105918:7;105901:16;:25::i;:::-;105953:13;105817:172;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;105736:294;105716:314;;;105389:649;;;:::o;103307:31::-;;;;:::o;111708:93::-;38347:13;:11;:13::i;:::-;111789:4:::1;111770:16;;:23;;;;;;;;;;;;;;;;;;111708:93::o:0;105230:151::-;38347:13;:11;:13::i;:::-;105356:17:::1;105340:13;:33;;;;;;:::i;:::-;;105230:151:::0;:::o;106203:119::-;106265:7;106292:22;106306:7;106292:13;:22::i;:::-;106285:29;;106203:119;;;:::o;108619:168::-;104492:14;:23;104507:7;;;;104492:23;;;;;;;;;;;;;;;;;;;;;;;;;;;104488:52;;;104524:16;;;;;;;;;;;;;;104488:52;38347:13:::1;:11;:13::i;:::-;102723:1:::2;108691:14;:12;:14::i;:::-;:26;108687:62;;108726:23;;;;;;;;;;;;;;108687:62;108760:19;108766:2;102723:1;108760:5;:19::i;:::-;108619:168:::0;:::o;68748:214::-;68890:4;68919:18;:25;68938:5;68919:25;;;;;;;;;;;;;;;:35;68945:8;68919:35;;;;;;;;;;;;;;;;;;;;;;;;;68912:42;;68748:214;;;;:::o;39394:220::-;38347:13;:11;:13::i;:::-;39499:1:::1;39479:22;;:8;:22;;::::0;39475:93:::1;;39553:1;39525:31;;;;;;;;;;;:::i;:::-;;;;;;;;39475:93;39578:28;39597:8;39578:18;:28::i;:::-;39394:220:::0;:::o;111809:97::-;38347:13;:11;:13::i;:::-;111894:4:::1;111872:19;;:26;;;;;;;;;;;;;;;;;;111809:97::o:0;102986:36::-;;;;;;;;;;;;;:::o;59827:689::-;59957:4;60301:10;60286:25;;:11;:25;;;;:102;;;;60378:10;60363:25;;:11;:25;;;;60286:102;:179;;;;60455:10;60440:25;;:11;:25;;;;60286:179;60266:199;;59827:689;;;:::o;32778:215::-;32880:4;32919:26;32904:41;;;:11;:41;;;;:81;;;;32949:36;32973:11;32949:23;:36::i;:::-;32904:81;32897:88;;32778:215;;;:::o;69220:282::-;69285:4;69341:7;69322:15;:13;:15::i;:::-;:26;;:66;;;;;69375:13;;69365:7;:23;69322:66;:153;;;;;69474:1;52471:8;69426:17;:26;69444:7;69426:26;;;;;;;;;;;;:44;:49;69322:153;69302:173;;69220:282;;;:::o;67109:449::-;67239:13;67255:16;67263:7;67255;:16::i;:::-;67239:32;;67311:5;67288:28;;:19;:17;:19::i;:::-;:28;;;67284:175;;67336:44;67353:5;67360:19;:17;:19::i;:::-;67336:16;:44::i;:::-;67331:128;;67408:35;;;;;;;;;;;;;;67331:128;67284:175;67504:2;67471:15;:24;67487:7;67471:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;67542:7;67538:2;67522:28;;67531:5;67522:28;;;;;;;;;;;;67228:330;67109:449;;:::o;38626:166::-;38697:12;:10;:12::i;:::-;38686:23;;:7;:5;:7::i;:::-;:23;;;38682:103;;38760:12;:10;:12::i;:::-;38733:40;;;;;;;;;;;:::i;:::-;;;;;;;;38682:103;38626:166::o;55868:92::-;55924:7;55951:1;55944:8;;55868:92;:::o;71488:3003::-;71630:27;71660;71679:7;71660:18;:27::i;:::-;71630:57;;71745:4;71704:45;;71720:19;71704:45;;;71700:99;;71771:28;;;;;;;;;;;;;;71700:99;71827:27;71869:23;71906:35;71933:7;71906:26;:35::i;:::-;71812:129;;;;72055:134;72098:15;72132:4;72155:19;:17;:19::i;:::-;72055:24;:134::i;:::-;72036:287;;72219:43;72236:4;72242:19;:17;:19::i;:::-;72219:16;:43::i;:::-;72214:109;;72288:35;;;;;;;;;;;;;;72214:109;72036:287;72354:1;72340:16;;:2;:16;;;72336:52;;72365:23;;;;;;;;;;;;;;72336:52;72401:43;72423:4;72429:2;72433:7;72442:1;72401:21;:43::i;:::-;72537:15;72534:160;;;72677:1;72656:19;72649:30;72534:160;73074:18;:24;73093:4;73074:24;;;;;;;;;;;;;;;;73072:26;;;;;;;;;;;;73143:18;:22;73162:2;73143:22;;;;;;;;;;;;;;;;73141:24;;;;;;;;;;;73465:167;73502:2;73572:45;73587:4;73593:2;73597:19;73572:14;:45::i;:::-;52751:8;73523:94;73465:18;:167::i;:::-;73436:17;:26;73454:7;73436:26;;;;;;;;;;;:196;;;;73803:1;52751:8;73752:19;:47;:52;73748:627;;73825:19;73857:1;73847:7;:11;73825:33;;74014:1;73980:17;:30;73998:11;73980:30;;;;;;;;;;;;:35;73976:384;;74118:13;;74103:11;:28;74099:242;;74298:19;74265:17;:30;74283:11;74265:30;;;;;;;;;;;:52;;;;74099:242;73976:384;73806:569;73748:627;74422:7;74418:2;74403:27;;74412:4;74403:27;;;;;;;;;;;;74441:42;74462:4;74468:2;74472:7;74481:1;74441:20;:42::i;:::-;71619:2872;;;71488:3003;;;:::o;33759:97::-;33817:6;33843:5;33836:12;;33759:97;:::o;56773:296::-;56828:7;57035:15;:13;:15::i;:::-;57019:13;;:31;57012:38;;56773:296;:::o;79162:3021::-;79235:20;79258:13;;79235:36;;79298:1;79286:8;:13;79282:44;;79308:18;;;;;;;;;;;;;;79282:44;79339:61;79369:1;79373:2;79377:12;79391:8;79339:21;:61::i;:::-;79917:1;51833:2;79887:1;:26;;79886:32;79857:8;:62;79814:18;:22;79833:2;79814:22;;;;;;;;;;;;;;;;:105;;;;;;;;;;;80196:160;80233:2;80308:33;80331:1;80335:2;80339:1;80308:14;:33::i;:::-;80254:30;80275:8;80254:20;:30::i;:::-;:87;80196:18;:160::i;:::-;80162:17;:31;80180:12;80162:31;;;;;;;;;;;:194;;;;80373:16;80404:11;80433:8;80418:12;:23;80404:37;;80954:16;80950:2;80946:25;80934:37;;81326:12;81286:8;81245:1;81183:25;81124:1;81063;81036:335;81697:1;81683:12;81679:20;81637:346;81738:3;81729:7;81726:16;81637:346;;81956:7;81946:8;81943:1;81916:25;81913:1;81910;81905:59;81791:1;81782:7;81778:15;81767:26;;81637:346;;;81641:77;82028:1;82016:8;:13;82012:45;;82038:19;;;;;;;;;;;;;;82012:45;82090:3;82074:13;:19;;;;79588:2517;;82115:60;82144:1;82148:2;82152:12;82166:8;82115:20;:60::i;:::-;79224:2959;79162:3021;;:::o;74587:193::-;74733:39;74750:4;74756:2;74760:7;74733:39;;;;;;;;;;;;:16;:39::i;:::-;74587:193;;;:::o;63556:1307::-;63650:7;63675:12;63690:7;63675:22;;63758:4;63739:15;:13;:15::i;:::-;:23;63735:1061;;63792:13;;63785:4;:20;63781:1015;;;63830:14;63847:17;:23;63865:4;63847:23;;;;;;;;;;;;63830:40;;63964:1;52471:8;63936:6;:24;:29;63932:845;;64601:113;64618:1;64608:6;:11;64601:113;;64661:17;:25;64679:6;;;;;;;64661:25;;;;;;;;;;;;64652:34;;64601:113;;;64747:6;64740:13;;;;;;63932:845;63807:989;63781:1015;63735:1061;64824:31;;;;;;;;;;;;;;63556:1307;;;;:::o;39774:191::-;39848:16;39867:6;;;;;;;;;;;39848:25;;39893:8;39884:6;;:17;;;;;;;;;;;;;;;;;;39948:8;39917:40;;39938:8;39917:40;;;;;;;;;;;;39837:128;39774:191;:::o;40517:796::-;40608:4;40625:20;40648:4;40625:27;;40670:9;40665:525;40689:5;:12;40685:1;:16;40665:525;;;40723:20;40746:5;40752:1;40746:8;;;;;;;;:::i;:::-;;;;;;;;40723:31;;40791:12;40775;:28;40771:408;;40945:12;40959;40928:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40918:55;;;;;;40903:70;;40771:408;;;41135:12;41149;41118:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41108:55;;;;;;41093:70;;40771:408;40708:482;40703:3;;;;;;;40665:525;;;;41301:4;41285:12;:20;41278:27;;;40517:796;;;;;:::o;68325:266::-;68504:8;68452:18;:39;68471:19;:17;:19::i;:::-;68452:39;;;;;;;;;;;;;;;:49;68492:8;68452:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;68564:8;68528:55;;68543:19;:17;:19::i;:::-;68528:55;;;68574:8;68528:55;;;;;;:::i;:::-;;;;;;;;68325:266;;:::o;75378:407::-;75553:31;75566:4;75572:2;75576:7;75553:12;:31::i;:::-;75617:1;75599:2;:14;;;:19;75595:183;;75638:56;75669:4;75675:2;75679:7;75688:5;75638:30;:56::i;:::-;75633:145;;75722:40;;;;;;;;;;;;;;75633:145;75595:183;75378:407;;;;:::o;34127:518::-;34222:19;34244:17;:15;:17::i;:::-;34222:39;;;;34291:11;34276:12;:26;;;34272:176;;;34410:12;34424:11;34381:55;;;;;;;;;;;;:::i;:::-;;;;;;;;34272:176;34482:1;34462:22;;:8;:22;;;34458:110;;34553:1;34508:48;;;;;;;;;;;:::i;:::-;;;;;;;;34458:110;34602:35;;;;;;;;34614:8;34602:35;;;;;;34624:12;34602:35;;;;;34580:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34211:434;34127:518;;:::o;105108:114::-;105168:13;105201;105194:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;105108:114;:::o;17495:718::-;17551:13;17602:14;17639:1;17619:17;17630:5;17619:10;:17::i;:::-;:21;17602:38;;17655:20;17689:6;17678:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17655:41;;17711:11;17840:6;17836:2;17832:15;17824:6;17820:28;17813:35;;17877:290;17884:4;17877:290;;;17909:5;;;;;;;;18051:10;18046:2;18039:5;18035:14;18030:32;18025:3;18017:46;18109:2;18100:11;;;;;;:::i;:::-;;;;;18143:1;18134:5;:10;17877:290;18130:21;17877:290;18188:6;18181:13;;;;;17495:718;;;:::o;57901:204::-;57962:7;51695:13;51833:2;58003:18;:25;58022:5;58003:25;;;;;;;;;;;;;;;;:50;;58002:95;57982:115;;57901:204;;;:::o;29685:148::-;29761:4;29800:25;29785:40;;;:11;:40;;;;29778:47;;29685:148;;;:::o;92437:105::-;92497:7;92524:10;92517:17;;92437:105;:::o;36577:98::-;36630:7;36657:10;36650:17;;36577:98;:::o;70383:485::-;70485:27;70514:23;70555:38;70596:15;:24;70612:7;70596:24;;;;;;;;;;;70555:65;;70773:18;70750:41;;70830:19;70824:26;70805:45;;70735:126;70383:485;;;:::o;69611:659::-;69760:11;69925:16;69918:5;69914:28;69905:37;;70085:16;70074:9;70070:32;70057:45;;70235:15;70224:9;70221:30;70213:5;70202:9;70199:20;70196:56;70186:66;;69611:659;;;;;:::o;76447:159::-;;;;;:::o;91746:311::-;91881:7;91901:16;52875:3;91927:19;:41;;91901:68;;52875:3;91995:31;92006:4;92012:2;92016:9;91995:10;:31::i;:::-;91987:40;;:62;;91980:69;;;91746:311;;;;;:::o;65443:531::-;65550:14;65723:16;65716:5;65712:28;65703:37;;65935:5;65921:11;65896:23;65892:41;65889:52;65865:5;65844:112;65834:122;;65443:531;;;;:::o;77271:158::-;;;;;:::o;66076:356::-;66173:14;66411:1;66401:8;66398:15;66372:24;66368:46;66358:56;;66076:356;;;:::o;77869:831::-;78032:4;78091:2;78066:45;;;78130:19;:17;:19::i;:::-;78168:4;78191:7;78217:5;78066:171;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;78049:644;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78468:1;78451:6;:13;:18;78447:235;;78497:40;;;;;;;;;;;;;;78447:235;78640:6;78634:13;78625:6;78621:2;78617:15;78610:38;78049:644;78337:54;;;78310:81;;;:6;:81;;;;78286:105;;;77869:831;;;;;;:::o;13899:948::-;13952:7;13972:14;13989:1;13972:18;;14039:8;14030:5;:17;14026:106;;14077:8;14068:17;;;;;;:::i;:::-;;;;;14114:2;14104:12;;;;14026:106;14159:8;14150:5;:17;14146:106;;14197:8;14188:17;;;;;;:::i;:::-;;;;;14234:2;14224:12;;;;14146:106;14279:8;14270:5;:17;14266:106;;14317:8;14308:17;;;;;;:::i;:::-;;;;;14354:2;14344:12;;;;14266:106;14399:7;14390:5;:16;14386:103;;14436:7;14427:16;;;;;;:::i;:::-;;;;;14472:1;14462:11;;;;14386:103;14516:7;14507:5;:16;14503:103;;14553:7;14544:16;;;;;;:::i;:::-;;;;;14589:1;14579:11;;;;14503:103;14633:7;14624:5;:16;14620:103;;14670:7;14661:16;;;;;;:::i;:::-;;;;;14706:1;14696:11;;;;14620:103;14750:7;14741:5;:16;14737:68;;14788:1;14778:11;;;;14737:68;14833:6;14826:13;;;13899:948;;;:::o;91447:147::-;91584:6;91447:147;;;;;:::o;7:126:1:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:96::-;176:7;205:24;223:5;205:24;:::i;:::-;194:35;;139:96;;;:::o;241:118::-;328:24;346:5;328:24;:::i;:::-;323:3;316:37;241:118;;:::o;365:222::-;458:4;496:2;485:9;481:18;473:26;;509:71;577:1;566:9;562:17;553:6;509:71;:::i;:::-;365:222;;;;:::o;593:75::-;626:6;659:2;653:9;643:19;;593:75;:::o;674:117::-;783:1;780;773:12;797:117;906:1;903;896:12;920:149;956:7;996:66;989:5;985:78;974:89;;920:149;;;:::o;1075:120::-;1147:23;1164:5;1147:23;:::i;:::-;1140:5;1137:34;1127:62;;1185:1;1182;1175:12;1127:62;1075:120;:::o;1201:137::-;1246:5;1284:6;1271:20;1262:29;;1300:32;1326:5;1300:32;:::i;:::-;1201:137;;;;:::o;1344:327::-;1402:6;1451:2;1439:9;1430:7;1426:23;1422:32;1419:119;;;1457:79;;:::i;:::-;1419:119;1577:1;1602:52;1646:7;1637:6;1626:9;1622:22;1602:52;:::i;:::-;1592:62;;1548:116;1344:327;;;;:::o;1677:90::-;1711:7;1754:5;1747:13;1740:21;1729:32;;1677:90;;;:::o;1773:109::-;1854:21;1869:5;1854:21;:::i;:::-;1849:3;1842:34;1773:109;;:::o;1888:210::-;1975:4;2013:2;2002:9;1998:18;1990:26;;2026:65;2088:1;2077:9;2073:17;2064:6;2026:65;:::i;:::-;1888:210;;;;:::o;2104:99::-;2156:6;2190:5;2184:12;2174:22;;2104:99;;;:::o;2209:169::-;2293:11;2327:6;2322:3;2315:19;2367:4;2362:3;2358:14;2343:29;;2209:169;;;;:::o;2384:246::-;2465:1;2475:113;2489:6;2486:1;2483:13;2475:113;;;2574:1;2569:3;2565:11;2559:18;2555:1;2550:3;2546:11;2539:39;2511:2;2508:1;2504:10;2499:15;;2475:113;;;2622:1;2613:6;2608:3;2604:16;2597:27;2446:184;2384:246;;;:::o;2636:102::-;2677:6;2728:2;2724:7;2719:2;2712:5;2708:14;2704:28;2694:38;;2636:102;;;:::o;2744:377::-;2832:3;2860:39;2893:5;2860:39;:::i;:::-;2915:71;2979:6;2974:3;2915:71;:::i;:::-;2908:78;;2995:65;3053:6;3048:3;3041:4;3034:5;3030:16;2995:65;:::i;:::-;3085:29;3107:6;3085:29;:::i;:::-;3080:3;3076:39;3069:46;;2836:285;2744:377;;;;:::o;3127:313::-;3240:4;3278:2;3267:9;3263:18;3255:26;;3327:9;3321:4;3317:20;3313:1;3302:9;3298:17;3291:47;3355:78;3428:4;3419:6;3355:78;:::i;:::-;3347:86;;3127:313;;;;:::o;3446:77::-;3483:7;3512:5;3501:16;;3446:77;;;:::o;3529:122::-;3602:24;3620:5;3602:24;:::i;:::-;3595:5;3592:35;3582:63;;3641:1;3638;3631:12;3582:63;3529:122;:::o;3657:139::-;3703:5;3741:6;3728:20;3719:29;;3757:33;3784:5;3757:33;:::i;:::-;3657:139;;;;:::o;3802:329::-;3861:6;3910:2;3898:9;3889:7;3885:23;3881:32;3878:119;;;3916:79;;:::i;:::-;3878:119;4036:1;4061:53;4106:7;4097:6;4086:9;4082:22;4061:53;:::i;:::-;4051:63;;4007:117;3802:329;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:117::-;4999:1;4996;4989:12;5013:117;5122:1;5119;5112:12;5136:117;5245:1;5242;5235:12;5273:553;5331:8;5341:6;5391:3;5384:4;5376:6;5372:17;5368:27;5358:122;;5399:79;;:::i;:::-;5358:122;5512:6;5499:20;5489:30;;5542:18;5534:6;5531:30;5528:117;;;5564:79;;:::i;:::-;5528:117;5678:4;5670:6;5666:17;5654:29;;5732:3;5724:4;5716:6;5712:17;5702:8;5698:32;5695:41;5692:128;;;5739:79;;:::i;:::-;5692:128;5273:553;;;;;:::o;5832:529::-;5903:6;5911;5960:2;5948:9;5939:7;5935:23;5931:32;5928:119;;;5966:79;;:::i;:::-;5928:119;6114:1;6103:9;6099:17;6086:31;6144:18;6136:6;6133:30;6130:117;;;6166:79;;:::i;:::-;6130:117;6279:65;6336:7;6327:6;6316:9;6312:22;6279:65;:::i;:::-;6261:83;;;;6057:297;5832:529;;;;;:::o;6367:118::-;6454:24;6472:5;6454:24;:::i;:::-;6449:3;6442:37;6367:118;;:::o;6491:222::-;6584:4;6622:2;6611:9;6607:18;6599:26;;6635:71;6703:1;6692:9;6688:17;6679:6;6635:71;:::i;:::-;6491:222;;;;:::o;6719:619::-;6796:6;6804;6812;6861:2;6849:9;6840:7;6836:23;6832:32;6829:119;;;6867:79;;:::i;:::-;6829:119;6987:1;7012:53;7057:7;7048:6;7037:9;7033:22;7012:53;:::i;:::-;7002:63;;6958:117;7114:2;7140:53;7185:7;7176:6;7165:9;7161:22;7140:53;:::i;:::-;7130:63;;7085:118;7242:2;7268:53;7313:7;7304:6;7293:9;7289:22;7268:53;:::i;:::-;7258:63;;7213:118;6719:619;;;;;:::o;7344:474::-;7412:6;7420;7469:2;7457:9;7448:7;7444:23;7440:32;7437:119;;;7475:79;;:::i;:::-;7437:119;7595:1;7620:53;7665:7;7656:6;7645:9;7641:22;7620:53;:::i;:::-;7610:63;;7566:117;7722:2;7748:53;7793:7;7784:6;7773:9;7769:22;7748:53;:::i;:::-;7738:63;;7693:118;7344:474;;;;;:::o;7824:332::-;7945:4;7983:2;7972:9;7968:18;7960:26;;7996:71;8064:1;8053:9;8049:17;8040:6;7996:71;:::i;:::-;8077:72;8145:2;8134:9;8130:18;8121:6;8077:72;:::i;:::-;7824:332;;;;;:::o;8162:77::-;8199:7;8228:5;8217:16;;8162:77;;;:::o;8245:118::-;8332:24;8350:5;8332:24;:::i;:::-;8327:3;8320:37;8245:118;;:::o;8369:222::-;8462:4;8500:2;8489:9;8485:18;8477:26;;8513:71;8581:1;8570:9;8566:17;8557:6;8513:71;:::i;:::-;8369:222;;;;:::o;8597:329::-;8656:6;8705:2;8693:9;8684:7;8680:23;8676:32;8673:119;;;8711:79;;:::i;:::-;8673:119;8831:1;8856:53;8901:7;8892:6;8881:9;8877:22;8856:53;:::i;:::-;8846:63;;8802:117;8597:329;;;;:::o;8932:116::-;9002:21;9017:5;9002:21;:::i;:::-;8995:5;8992:32;8982:60;;9038:1;9035;9028:12;8982:60;8932:116;:::o;9054:133::-;9097:5;9135:6;9122:20;9113:29;;9151:30;9175:5;9151:30;:::i;:::-;9054:133;;;;:::o;9193:613::-;9267:6;9275;9283;9332:2;9320:9;9311:7;9307:23;9303:32;9300:119;;;9338:79;;:::i;:::-;9300:119;9458:1;9483:53;9528:7;9519:6;9508:9;9504:22;9483:53;:::i;:::-;9473:63;;9429:117;9585:2;9611:53;9656:7;9647:6;9636:9;9632:22;9611:53;:::i;:::-;9601:63;;9556:118;9713:2;9739:50;9781:7;9772:6;9761:9;9757:22;9739:50;:::i;:::-;9729:60;;9684:115;9193:613;;;;;:::o;9829:568::-;9902:8;9912:6;9962:3;9955:4;9947:6;9943:17;9939:27;9929:122;;9970:79;;:::i;:::-;9929:122;10083:6;10070:20;10060:30;;10113:18;10105:6;10102:30;10099:117;;;10135:79;;:::i;:::-;10099:117;10249:4;10241:6;10237:17;10225:29;;10303:3;10295:4;10287:6;10283:17;10273:8;10269:32;10266:41;10263:128;;;10310:79;;:::i;:::-;10263:128;9829:568;;;;;:::o;10403:989::-;10513:6;10521;10529;10537;10545;10594:3;10582:9;10573:7;10569:23;10565:33;10562:120;;;10601:79;;:::i;:::-;10562:120;10721:1;10746:53;10791:7;10782:6;10771:9;10767:22;10746:53;:::i;:::-;10736:63;;10692:117;10848:2;10874:53;10919:7;10910:6;10899:9;10895:22;10874:53;:::i;:::-;10864:63;;10819:118;10976:2;11002:50;11044:7;11035:6;11024:9;11020:22;11002:50;:::i;:::-;10992:60;;10947:115;11129:2;11118:9;11114:18;11101:32;11160:18;11152:6;11149:30;11146:117;;;11182:79;;:::i;:::-;11146:117;11295:80;11367:7;11358:6;11347:9;11343:22;11295:80;:::i;:::-;11277:98;;;;11072:313;10403:989;;;;;;;;:::o;11398:122::-;11471:24;11489:5;11471:24;:::i;:::-;11464:5;11461:35;11451:63;;11510:1;11507;11500:12;11451:63;11398:122;:::o;11526:139::-;11572:5;11610:6;11597:20;11588:29;;11626:33;11653:5;11626:33;:::i;:::-;11526:139;;;;:::o;11671:329::-;11730:6;11779:2;11767:9;11758:7;11754:23;11750:32;11747:119;;;11785:79;;:::i;:::-;11747:119;11905:1;11930:53;11975:7;11966:6;11955:9;11951:22;11930:53;:::i;:::-;11920:63;;11876:117;11671:329;;;;:::o;12006:468::-;12071:6;12079;12128:2;12116:9;12107:7;12103:23;12099:32;12096:119;;;12134:79;;:::i;:::-;12096:119;12254:1;12279:53;12324:7;12315:6;12304:9;12300:22;12279:53;:::i;:::-;12269:63;;12225:117;12381:2;12407:50;12449:7;12440:6;12429:9;12425:22;12407:50;:::i;:::-;12397:60;;12352:115;12006:468;;;;;:::o;12480:323::-;12536:6;12585:2;12573:9;12564:7;12560:23;12556:32;12553:119;;;12591:79;;:::i;:::-;12553:119;12711:1;12736:50;12778:7;12769:6;12758:9;12754:22;12736:50;:::i;:::-;12726:60;;12682:114;12480:323;;;;:::o;12809:117::-;12918:1;12915;12908:12;12932:180;12980:77;12977:1;12970:88;13077:4;13074:1;13067:15;13101:4;13098:1;13091:15;13118:281;13201:27;13223:4;13201:27;:::i;:::-;13193:6;13189:40;13331:6;13319:10;13316:22;13295:18;13283:10;13280:34;13277:62;13274:88;;;13342:18;;:::i;:::-;13274:88;13382:10;13378:2;13371:22;13161:238;13118:281;;:::o;13405:129::-;13439:6;13466:20;;:::i;:::-;13456:30;;13495:33;13523:4;13515:6;13495:33;:::i;:::-;13405:129;;;:::o;13540:307::-;13601:4;13691:18;13683:6;13680:30;13677:56;;;13713:18;;:::i;:::-;13677:56;13751:29;13773:6;13751:29;:::i;:::-;13743:37;;13835:4;13829;13825:15;13817:23;;13540:307;;;:::o;13853:146::-;13950:6;13945:3;13940;13927:30;13991:1;13982:6;13977:3;13973:16;13966:27;13853:146;;;:::o;14005:423::-;14082:5;14107:65;14123:48;14164:6;14123:48;:::i;:::-;14107:65;:::i;:::-;14098:74;;14195:6;14188:5;14181:21;14233:4;14226:5;14222:16;14271:3;14262:6;14257:3;14253:16;14250:25;14247:112;;;14278:79;;:::i;:::-;14247:112;14368:54;14415:6;14410:3;14405;14368:54;:::i;:::-;14088:340;14005:423;;;;;:::o;14447:338::-;14502:5;14551:3;14544:4;14536:6;14532:17;14528:27;14518:122;;14559:79;;:::i;:::-;14518:122;14676:6;14663:20;14701:78;14775:3;14767:6;14760:4;14752:6;14748:17;14701:78;:::i;:::-;14692:87;;14508:277;14447:338;;;;:::o;14791:943::-;14886:6;14894;14902;14910;14959:3;14947:9;14938:7;14934:23;14930:33;14927:120;;;14966:79;;:::i;:::-;14927:120;15086:1;15111:53;15156:7;15147:6;15136:9;15132:22;15111:53;:::i;:::-;15101:63;;15057:117;15213:2;15239:53;15284:7;15275:6;15264:9;15260:22;15239:53;:::i;:::-;15229:63;;15184:118;15341:2;15367:53;15412:7;15403:6;15392:9;15388:22;15367:53;:::i;:::-;15357:63;;15312:118;15497:2;15486:9;15482:18;15469:32;15528:18;15520:6;15517:30;15514:117;;;15550:79;;:::i;:::-;15514:117;15655:62;15709:7;15700:6;15689:9;15685:22;15655:62;:::i;:::-;15645:72;;15440:287;14791:943;;;;;;;:::o;15740:109::-;15776:7;15816:26;15809:5;15805:38;15794:49;;15740:109;;;:::o;15855:120::-;15927:23;15944:5;15927:23;:::i;:::-;15920:5;15917:34;15907:62;;15965:1;15962;15955:12;15907:62;15855:120;:::o;15981:137::-;16026:5;16064:6;16051:20;16042:29;;16080:32;16106:5;16080:32;:::i;:::-;15981:137;;;;:::o;16124:472::-;16191:6;16199;16248:2;16236:9;16227:7;16223:23;16219:32;16216:119;;;16254:79;;:::i;:::-;16216:119;16374:1;16399:53;16444:7;16435:6;16424:9;16420:22;16399:53;:::i;:::-;16389:63;;16345:117;16501:2;16527:52;16571:7;16562:6;16551:9;16547:22;16527:52;:::i;:::-;16517:62;;16472:117;16124:472;;;;;:::o;16602:308::-;16664:4;16754:18;16746:6;16743:30;16740:56;;;16776:18;;:::i;:::-;16740:56;16814:29;16836:6;16814:29;:::i;:::-;16806:37;;16898:4;16892;16888:15;16880:23;;16602:308;;;:::o;16916:425::-;16994:5;17019:66;17035:49;17077:6;17035:49;:::i;:::-;17019:66;:::i;:::-;17010:75;;17108:6;17101:5;17094:21;17146:4;17139:5;17135:16;17184:3;17175:6;17170:3;17166:16;17163:25;17160:112;;;17191:79;;:::i;:::-;17160:112;17281:54;17328:6;17323:3;17318;17281:54;:::i;:::-;17000:341;16916:425;;;;;:::o;17361:340::-;17417:5;17466:3;17459:4;17451:6;17447:17;17443:27;17433:122;;17474:79;;:::i;:::-;17433:122;17591:6;17578:20;17616:79;17691:3;17683:6;17676:4;17668:6;17664:17;17616:79;:::i;:::-;17607:88;;17423:278;17361:340;;;;:::o;17707:509::-;17776:6;17825:2;17813:9;17804:7;17800:23;17796:32;17793:119;;;17831:79;;:::i;:::-;17793:119;17979:1;17968:9;17964:17;17951:31;18009:18;18001:6;17998:30;17995:117;;;18031:79;;:::i;:::-;17995:117;18136:63;18191:7;18182:6;18171:9;18167:22;18136:63;:::i;:::-;18126:73;;17922:287;17707:509;;;;:::o;18222:474::-;18290:6;18298;18347:2;18335:9;18326:7;18322:23;18318:32;18315:119;;;18353:79;;:::i;:::-;18315:119;18473:1;18498:53;18543:7;18534:6;18523:9;18519:22;18498:53;:::i;:::-;18488:63;;18444:117;18600:2;18626:53;18671:7;18662:6;18651:9;18647:22;18626:53;:::i;:::-;18616:63;;18571:118;18222:474;;;;;:::o;18702:180::-;18750:77;18747:1;18740:88;18847:4;18844:1;18837:15;18871:4;18868:1;18861:15;18888:320;18932:6;18969:1;18963:4;18959:12;18949:22;;19016:1;19010:4;19006:12;19037:18;19027:81;;19093:4;19085:6;19081:17;19071:27;;19027:81;19155:2;19147:6;19144:14;19124:18;19121:38;19118:84;;19174:18;;:::i;:::-;19118:84;18939:269;18888:320;;;:::o;19214:97::-;19273:6;19301:3;19291:13;;19214:97;;;;:::o;19317:141::-;19366:4;19389:3;19381:11;;19412:3;19409:1;19402:14;19446:4;19443:1;19433:18;19425:26;;19317:141;;;:::o;19464:93::-;19501:6;19548:2;19543;19536:5;19532:14;19528:23;19518:33;;19464:93;;;:::o;19563:107::-;19607:8;19657:5;19651:4;19647:16;19626:37;;19563:107;;;;:::o;19676:393::-;19745:6;19795:1;19783:10;19779:18;19818:97;19848:66;19837:9;19818:97;:::i;:::-;19936:39;19966:8;19955:9;19936:39;:::i;:::-;19924:51;;20008:4;20004:9;19997:5;19993:21;19984:30;;20057:4;20047:8;20043:19;20036:5;20033:30;20023:40;;19752:317;;19676:393;;;;;:::o;20075:60::-;20103:3;20124:5;20117:12;;20075:60;;;:::o;20141:142::-;20191:9;20224:53;20242:34;20251:24;20269:5;20251:24;:::i;:::-;20242:34;:::i;:::-;20224:53;:::i;:::-;20211:66;;20141:142;;;:::o;20289:75::-;20332:3;20353:5;20346:12;;20289:75;;;:::o;20370:269::-;20480:39;20511:7;20480:39;:::i;:::-;20541:91;20590:41;20614:16;20590:41;:::i;:::-;20582:6;20575:4;20569:11;20541:91;:::i;:::-;20535:4;20528:105;20446:193;20370:269;;;:::o;20645:73::-;20690:3;20645:73;:::o;20724:189::-;20801:32;;:::i;:::-;20842:65;20900:6;20892;20886:4;20842:65;:::i;:::-;20777:136;20724:189;;:::o;20919:186::-;20979:120;20996:3;20989:5;20986:14;20979:120;;;21050:39;21087:1;21080:5;21050:39;:::i;:::-;21023:1;21016:5;21012:13;21003:22;;20979:120;;;20919:186;;:::o;21111:543::-;21212:2;21207:3;21204:11;21201:446;;;21246:38;21278:5;21246:38;:::i;:::-;21330:29;21348:10;21330:29;:::i;:::-;21320:8;21316:44;21513:2;21501:10;21498:18;21495:49;;;21534:8;21519:23;;21495:49;21557:80;21613:22;21631:3;21613:22;:::i;:::-;21603:8;21599:37;21586:11;21557:80;:::i;:::-;21216:431;;21201:446;21111:543;;;:::o;21660:117::-;21714:8;21764:5;21758:4;21754:16;21733:37;;21660:117;;;;:::o;21783:169::-;21827:6;21860:51;21908:1;21904:6;21896:5;21893:1;21889:13;21860:51;:::i;:::-;21856:56;21941:4;21935;21931:15;21921:25;;21834:118;21783:169;;;;:::o;21957:295::-;22033:4;22179:29;22204:3;22198:4;22179:29;:::i;:::-;22171:37;;22241:3;22238:1;22234:11;22228:4;22225:21;22217:29;;21957:295;;;;:::o;22257:1403::-;22381:44;22421:3;22416;22381:44;:::i;:::-;22490:18;22482:6;22479:30;22476:56;;;22512:18;;:::i;:::-;22476:56;22556:38;22588:4;22582:11;22556:38;:::i;:::-;22641:67;22701:6;22693;22687:4;22641:67;:::i;:::-;22735:1;22764:2;22756:6;22753:14;22781:1;22776:632;;;;23452:1;23469:6;23466:84;;;23525:9;23520:3;23516:19;23503:33;23494:42;;23466:84;23576:67;23636:6;23629:5;23576:67;:::i;:::-;23570:4;23563:81;23425:229;22746:908;;22776:632;22828:4;22824:9;22816:6;22812:22;22862:37;22894:4;22862:37;:::i;:::-;22921:1;22935:215;22949:7;22946:1;22943:14;22935:215;;;23035:9;23030:3;23026:19;23013:33;23005:6;22998:49;23086:1;23078:6;23074:14;23064:24;;23133:2;23122:9;23118:18;23105:31;;22972:4;22969:1;22965:12;22960:17;;22935:215;;;23178:6;23169:7;23166:19;23163:186;;;23243:9;23238:3;23234:19;23221:33;23286:48;23328:4;23320:6;23316:17;23305:9;23286:48;:::i;:::-;23278:6;23271:64;23186:163;23163:186;23395:1;23391;23383:6;23379:14;23375:22;23369:4;23362:36;22783:625;;;22746:908;;22356:1304;;;22257:1403;;;:::o;23666:180::-;23714:77;23711:1;23704:88;23811:4;23808:1;23801:15;23835:4;23832:1;23825:15;23852:410;23892:7;23915:20;23933:1;23915:20;:::i;:::-;23910:25;;23949:20;23967:1;23949:20;:::i;:::-;23944:25;;24004:1;24001;23997:9;24026:30;24044:11;24026:30;:::i;:::-;24015:41;;24205:1;24196:7;24192:15;24189:1;24186:22;24166:1;24159:9;24139:83;24116:139;;24235:18;;:::i;:::-;24116:139;23900:362;23852:410;;;;:::o;24268:180::-;24316:77;24313:1;24306:88;24413:4;24410:1;24403:15;24437:4;24434:1;24427:15;24454:185;24494:1;24511:20;24529:1;24511:20;:::i;:::-;24506:25;;24545:20;24563:1;24545:20;:::i;:::-;24540:25;;24584:1;24574:35;;24589:18;;:::i;:::-;24574:35;24631:1;24628;24624:9;24619:14;;24454:185;;;;:::o;24645:147::-;24746:11;24783:3;24768:18;;24645:147;;;;:::o;24798:114::-;;:::o;24918:398::-;25077:3;25098:83;25179:1;25174:3;25098:83;:::i;:::-;25091:90;;25190:93;25279:3;25190:93;:::i;:::-;25308:1;25303:3;25299:11;25292:18;;24918:398;;;:::o;25322:379::-;25506:3;25528:147;25671:3;25528:147;:::i;:::-;25521:154;;25692:3;25685:10;;25322:379;;;:::o;25707:169::-;25847:21;25843:1;25835:6;25831:14;25824:45;25707:169;:::o;25882:366::-;26024:3;26045:67;26109:2;26104:3;26045:67;:::i;:::-;26038:74;;26121:93;26210:3;26121:93;:::i;:::-;26239:2;26234:3;26230:12;26223:19;;25882:366;;;:::o;26254:419::-;26420:4;26458:2;26447:9;26443:18;26435:26;;26507:9;26501:4;26497:20;26493:1;26482:9;26478:17;26471:47;26535:131;26661:4;26535:131;:::i;:::-;26527:139;;26254:419;;;:::o;26679:174::-;26819:26;26815:1;26807:6;26803:14;26796:50;26679:174;:::o;26859:366::-;27001:3;27022:67;27086:2;27081:3;27022:67;:::i;:::-;27015:74;;27098:93;27187:3;27098:93;:::i;:::-;27216:2;27211:3;27207:12;27200:19;;26859:366;;;:::o;27231:419::-;27397:4;27435:2;27424:9;27420:18;27412:26;;27484:9;27478:4;27474:20;27470:1;27459:9;27455:17;27448:47;27512:131;27638:4;27512:131;:::i;:::-;27504:139;;27231:419;;;:::o;27656:168::-;27796:20;27792:1;27784:6;27780:14;27773:44;27656:168;:::o;27830:366::-;27972:3;27993:67;28057:2;28052:3;27993:67;:::i;:::-;27986:74;;28069:93;28158:3;28069:93;:::i;:::-;28187:2;28182:3;28178:12;28171:19;;27830:366;;;:::o;28202:419::-;28368:4;28406:2;28395:9;28391:18;28383:26;;28455:9;28449:4;28445:20;28441:1;28430:9;28426:17;28419:47;28483:131;28609:4;28483:131;:::i;:::-;28475:139;;28202:419;;;:::o;28627:191::-;28667:3;28686:20;28704:1;28686:20;:::i;:::-;28681:25;;28720:20;28738:1;28720:20;:::i;:::-;28715:25;;28763:1;28760;28756:9;28749:16;;28784:3;28781:1;28778:10;28775:36;;;28791:18;;:::i;:::-;28775:36;28627:191;;;;:::o;28824:172::-;28964:24;28960:1;28952:6;28948:14;28941:48;28824:172;:::o;29002:366::-;29144:3;29165:67;29229:2;29224:3;29165:67;:::i;:::-;29158:74;;29241:93;29330:3;29241:93;:::i;:::-;29359:2;29354:3;29350:12;29343:19;;29002:366;;;:::o;29374:419::-;29540:4;29578:2;29567:9;29563:18;29555:26;;29627:9;29621:4;29617:20;29613:1;29602:9;29598:17;29591:47;29655:131;29781:4;29655:131;:::i;:::-;29647:139;;29374:419;;;:::o;29799:176::-;29939:28;29935:1;29927:6;29923:14;29916:52;29799:176;:::o;29981:366::-;30123:3;30144:67;30208:2;30203:3;30144:67;:::i;:::-;30137:74;;30220:93;30309:3;30220:93;:::i;:::-;30338:2;30333:3;30329:12;30322:19;;29981:366;;;:::o;30353:419::-;30519:4;30557:2;30546:9;30542:18;30534:26;;30606:9;30600:4;30596:20;30592:1;30581:9;30577:17;30570:47;30634:131;30760:4;30634:131;:::i;:::-;30626:139;;30353:419;;;:::o;30778:194::-;30818:4;30838:20;30856:1;30838:20;:::i;:::-;30833:25;;30872:20;30890:1;30872:20;:::i;:::-;30867:25;;30916:1;30913;30909:9;30901:17;;30940:1;30934:4;30931:11;30928:37;;;30945:18;;:::i;:::-;30928:37;30778:194;;;;:::o;30978:170::-;31118:22;31114:1;31106:6;31102:14;31095:46;30978:170;:::o;31154:366::-;31296:3;31317:67;31381:2;31376:3;31317:67;:::i;:::-;31310:74;;31393:93;31482:3;31393:93;:::i;:::-;31511:2;31506:3;31502:12;31495:19;;31154:366;;;:::o;31526:419::-;31692:4;31730:2;31719:9;31715:18;31707:26;;31779:9;31773:4;31769:20;31765:1;31754:9;31750:17;31743:47;31807:131;31933:4;31807:131;:::i;:::-;31799:139;;31526:419;;;:::o;31951:143::-;32008:5;32039:6;32033:13;32024:22;;32055:33;32082:5;32055:33;:::i;:::-;31951:143;;;;:::o;32100:351::-;32170:6;32219:2;32207:9;32198:7;32194:23;32190:32;32187:119;;;32225:79;;:::i;:::-;32187:119;32345:1;32370:64;32426:7;32417:6;32406:9;32402:22;32370:64;:::i;:::-;32360:74;;32316:128;32100:351;;;;:::o;32457:229::-;32597:34;32593:1;32585:6;32581:14;32574:58;32666:12;32661:2;32653:6;32649:15;32642:37;32457:229;:::o;32692:366::-;32834:3;32855:67;32919:2;32914:3;32855:67;:::i;:::-;32848:74;;32931:93;33020:3;32931:93;:::i;:::-;33049:2;33044:3;33040:12;33033:19;;32692:366;;;:::o;33064:419::-;33230:4;33268:2;33257:9;33253:18;33245:26;;33317:9;33311:4;33307:20;33303:1;33292:9;33288:17;33281:47;33345:131;33471:4;33345:131;:::i;:::-;33337:139;;33064:419;;;:::o;33489:167::-;33629:19;33625:1;33617:6;33613:14;33606:43;33489:167;:::o;33662:366::-;33804:3;33825:67;33889:2;33884:3;33825:67;:::i;:::-;33818:74;;33901:93;33990:3;33901:93;:::i;:::-;34019:2;34014:3;34010:12;34003:19;;33662:366;;;:::o;34034:419::-;34200:4;34238:2;34227:9;34223:18;34215:26;;34287:9;34281:4;34277:20;34273:1;34262:9;34258:17;34251:47;34315:131;34441:4;34315:131;:::i;:::-;34307:139;;34034:419;;;:::o;34459:94::-;34492:8;34540:5;34536:2;34532:14;34511:35;;34459:94;;;:::o;34559:::-;34598:7;34627:20;34641:5;34627:20;:::i;:::-;34616:31;;34559:94;;;:::o;34659:100::-;34698:7;34727:26;34747:5;34727:26;:::i;:::-;34716:37;;34659:100;;;:::o;34765:157::-;34870:45;34890:24;34908:5;34890:24;:::i;:::-;34870:45;:::i;:::-;34865:3;34858:58;34765:157;;:::o;34928:79::-;34967:7;34996:5;34985:16;;34928:79;;;:::o;35013:157::-;35118:45;35138:24;35156:5;35138:24;:::i;:::-;35118:45;:::i;:::-;35113:3;35106:58;35013:157;;:::o;35176:397::-;35316:3;35331:75;35402:3;35393:6;35331:75;:::i;:::-;35431:2;35426:3;35422:12;35415:19;;35444:75;35515:3;35506:6;35444:75;:::i;:::-;35544:2;35539:3;35535:12;35528:19;;35564:3;35557:10;;35176:397;;;;;:::o;35579:174::-;35719:26;35715:1;35707:6;35703:14;35696:50;35579:174;:::o;35759:366::-;35901:3;35922:67;35986:2;35981:3;35922:67;:::i;:::-;35915:74;;35998:93;36087:3;35998:93;:::i;:::-;36116:2;36111:3;36107:12;36100:19;;35759:366;;;:::o;36131:419::-;36297:4;36335:2;36324:9;36320:18;36312:26;;36384:9;36378:4;36374:20;36370:1;36359:9;36355:17;36348:47;36412:131;36538:4;36412:131;:::i;:::-;36404:139;;36131:419;;;:::o;36556:166::-;36696:18;36692:1;36684:6;36680:14;36673:42;36556:166;:::o;36728:366::-;36870:3;36891:67;36955:2;36950:3;36891:67;:::i;:::-;36884:74;;36967:93;37056:3;36967:93;:::i;:::-;37085:2;37080:3;37076:12;37069:19;;36728:366;;;:::o;37100:419::-;37266:4;37304:2;37293:9;37289:18;37281:26;;37353:9;37347:4;37343:20;37339:1;37328:9;37324:17;37317:47;37381:131;37507:4;37381:131;:::i;:::-;37373:139;;37100:419;;;:::o;37525:234::-;37665:34;37661:1;37653:6;37649:14;37642:58;37734:17;37729:2;37721:6;37717:15;37710:42;37525:234;:::o;37765:366::-;37907:3;37928:67;37992:2;37987:3;37928:67;:::i;:::-;37921:74;;38004:93;38093:3;38004:93;:::i;:::-;38122:2;38117:3;38113:12;38106:19;;37765:366;;;:::o;38137:419::-;38303:4;38341:2;38330:9;38326:18;38318:26;;38390:9;38384:4;38380:20;38376:1;38365:9;38361:17;38354:47;38418:131;38544:4;38418:131;:::i;:::-;38410:139;;38137:419;;;:::o;38562:148::-;38664:11;38701:3;38686:18;;38562:148;;;;:::o;38716:390::-;38822:3;38850:39;38883:5;38850:39;:::i;:::-;38905:89;38987:6;38982:3;38905:89;:::i;:::-;38898:96;;39003:65;39061:6;39056:3;39049:4;39042:5;39038:16;39003:65;:::i;:::-;39093:6;39088:3;39084:16;39077:23;;38826:280;38716:390;;;;:::o;39136:874::-;39239:3;39276:5;39270:12;39305:36;39331:9;39305:36;:::i;:::-;39357:89;39439:6;39434:3;39357:89;:::i;:::-;39350:96;;39477:1;39466:9;39462:17;39493:1;39488:166;;;;39668:1;39663:341;;;;39455:549;;39488:166;39572:4;39568:9;39557;39553:25;39548:3;39541:38;39634:6;39627:14;39620:22;39612:6;39608:35;39603:3;39599:45;39592:52;;39488:166;;39663:341;39730:38;39762:5;39730:38;:::i;:::-;39790:1;39804:154;39818:6;39815:1;39812:13;39804:154;;;39892:7;39886:14;39882:1;39877:3;39873:11;39866:35;39942:1;39933:7;39929:15;39918:26;;39840:4;39837:1;39833:12;39828:17;;39804:154;;;39987:6;39982:3;39978:16;39971:23;;39670:334;;39455:549;;39243:767;;39136:874;;;;:::o;40016:589::-;40241:3;40263:95;40354:3;40345:6;40263:95;:::i;:::-;40256:102;;40375:95;40466:3;40457:6;40375:95;:::i;:::-;40368:102;;40487:92;40575:3;40566:6;40487:92;:::i;:::-;40480:99;;40596:3;40589:10;;40016:589;;;;;;:::o;40611:1395::-;40728:37;40761:3;40728:37;:::i;:::-;40830:18;40822:6;40819:30;40816:56;;;40852:18;;:::i;:::-;40816:56;40896:38;40928:4;40922:11;40896:38;:::i;:::-;40981:67;41041:6;41033;41027:4;40981:67;:::i;:::-;41075:1;41099:4;41086:17;;41131:2;41123:6;41120:14;41148:1;41143:618;;;;41805:1;41822:6;41819:77;;;41871:9;41866:3;41862:19;41856:26;41847:35;;41819:77;41922:67;41982:6;41975:5;41922:67;:::i;:::-;41916:4;41909:81;41778:222;41113:887;;41143:618;41195:4;41191:9;41183:6;41179:22;41229:37;41261:4;41229:37;:::i;:::-;41288:1;41302:208;41316:7;41313:1;41310:14;41302:208;;;41395:9;41390:3;41386:19;41380:26;41372:6;41365:42;41446:1;41438:6;41434:14;41424:24;;41493:2;41482:9;41478:18;41465:31;;41339:4;41336:1;41332:12;41327:17;;41302:208;;;41538:6;41529:7;41526:19;41523:179;;;41596:9;41591:3;41587:19;41581:26;41639:48;41681:4;41673:6;41669:17;41658:9;41639:48;:::i;:::-;41631:6;41624:64;41546:156;41523:179;41748:1;41744;41736:6;41732:14;41728:22;41722:4;41715:36;41150:611;;;41113:887;;40703:1303;;;40611:1395;;:::o;42012:180::-;42060:77;42057:1;42050:88;42157:4;42154:1;42147:15;42181:4;42178:1;42171:15;42198:79;42237:7;42266:5;42255:16;;42198:79;;;:::o;42283:157::-;42388:45;42408:24;42426:5;42408:24;:::i;:::-;42388:45;:::i;:::-;42383:3;42376:58;42283:157;;:::o;42446:397::-;42586:3;42601:75;42672:3;42663:6;42601:75;:::i;:::-;42701:2;42696:3;42692:12;42685:19;;42714:75;42785:3;42776:6;42714:75;:::i;:::-;42814:2;42809:3;42805:12;42798:19;;42834:3;42827:10;;42446:397;;;;;:::o;42849:140::-;42898:9;42931:52;42949:33;42958:23;42975:5;42958:23;:::i;:::-;42949:33;:::i;:::-;42931:52;:::i;:::-;42918:65;;42849:140;;;:::o;42995:129::-;43081:36;43111:5;43081:36;:::i;:::-;43076:3;43069:49;42995:129;;:::o;43130:330::-;43250:4;43288:2;43277:9;43273:18;43265:26;;43301:70;43368:1;43357:9;43353:17;43344:6;43301:70;:::i;:::-;43381:72;43449:2;43438:9;43434:18;43425:6;43381:72;:::i;:::-;43130:330;;;;;:::o;43466:98::-;43517:6;43551:5;43545:12;43535:22;;43466:98;;;:::o;43570:168::-;43653:11;43687:6;43682:3;43675:19;43727:4;43722:3;43718:14;43703:29;;43570:168;;;;:::o;43744:373::-;43830:3;43858:38;43890:5;43858:38;:::i;:::-;43912:70;43975:6;43970:3;43912:70;:::i;:::-;43905:77;;43991:65;44049:6;44044:3;44037:4;44030:5;44026:16;43991:65;:::i;:::-;44081:29;44103:6;44081:29;:::i;:::-;44076:3;44072:39;44065:46;;43834:283;43744:373;;;;:::o;44123:640::-;44318:4;44356:3;44345:9;44341:19;44333:27;;44370:71;44438:1;44427:9;44423:17;44414:6;44370:71;:::i;:::-;44451:72;44519:2;44508:9;44504:18;44495:6;44451:72;:::i;:::-;44533;44601:2;44590:9;44586:18;44577:6;44533:72;:::i;:::-;44652:9;44646:4;44642:20;44637:2;44626:9;44622:18;44615:48;44680:76;44751:4;44742:6;44680:76;:::i;:::-;44672:84;;44123:640;;;;;;;:::o;44769:141::-;44825:5;44856:6;44850:13;44841:22;;44872:32;44898:5;44872:32;:::i;:::-;44769:141;;;;:::o;44916:349::-;44985:6;45034:2;45022:9;45013:7;45009:23;45005:32;45002:119;;;45040:79;;:::i;:::-;45002:119;45160:1;45185:63;45240:7;45231:6;45220:9;45216:22;45185:63;:::i;:::-;45175:73;;45131:127;44916:349;;;;:::o
Swarm Source
ipfs://f2e89c0356ff7abfff8b44ac419fa5134123fda118d7df00b4fb8fd54d3a2740
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.