ERC-721
Overview
Max Total Supply
145 Moona Lisa (Sculpture) Original
Holders
98
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 Moona Lisa (Sculpture) OriginalLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Moona_Lisa_Sculpture_Original
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-09-05 */ // File: @openzeppelin/contracts/cryptography/MerkleProof.sol 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; } } // File: @openzeppelin/contracts/utils/math/SignedMath.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV // Deprecated in v4.8 } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) { // 32 is the length in bytes of hash, // enforced by the type signature above /// @solidity memory-safe-assembly assembly { mstore(0x00, "\x19Ethereum Signed Message:\n32") mstore(0x1c, hash) message := keccak256(0x00, 0x3c) } } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, "\x19\x01") mstore(add(ptr, 0x02), domainSeparator) mstore(add(ptr, 0x22), structHash) data := keccak256(ptr, 0x42) } } /** * @dev Returns an Ethereum Signed Data with intended validator, created from a * `validator` and `data` according to the version 0 of EIP-191. * * See {recover}. */ function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x00", validator, data)); } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo( uint256 tokenId, uint256 salePrice ) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/contracts/token/common/ERC2981.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: moonalisasculpture.sol 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 Moona_Lisa_Sculpture_Original 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; uint256 public constant RESERVED = 1; uint256 public SEC_RESERVED = 32; uint256 public constant MAX_SUPPLY = 330; uint256 public PUBLIC_SUPPLY = 0; uint256 public WHITELIST_SUPPLY = 297; uint256 public mintPrice = 0.062 ether; uint256 public whiteListPrice = 0.062 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 ) ERC721A("Moona Lisa (Sculpture) Original", "Moona Lisa (Sculpture) Original") { _registerForOperatorFiltering(); operatorFilteringEnabled = true; minter[0xa8C10eC49dF815e73A881ABbE0Aa7b210f39E2Df] = true; minter[0x79bB164367BB64742E993f381372961a945BF447] = true; minter[0xFd88229910A28D6B319E147b40c822FA5CF38a45] = true; minter[0x6b40a842e05D60081F5474046c713b294B4BbC63] = true; minter[0x8528fA2503c49893B704B981e0cBAC021E678789] = true; contractAddress1 = 0xfCca30504374f54EdDD0b5C43A07f170B75df42A; contractAddress2 = 0xFE9E420370f0e3b0f13b6089e5b8bFBB585D0Ea9; _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() + SEC_RESERVED <= MAX_SUPPLY, "Exceeds Maximum Supply" ); _mint(to, quantity); } function whiteListMint( address to, uint256 quantity, bool _isUk, bytes32[] calldata merkleProof ) external payable onlyMinter { require(publicSaleStatus == true, "Minting is not yet open."); IERC721A whiteListContract1 = IERC721A(contractAddress1); IERC721A whiteListContract2 = IERC721A(contractAddress2); require( Claimed[to] < whiteListContract1.balanceOf(to) || Claimed[to] < whiteListContract2.balanceOf(to), "Invalid Whitelist Proof or Already Claimed" ); require( totalClaimed + quantity <= WHITELIST_SUPPLY, "All NFTs Claimed." ); require( _totalMinted() + quantity <= MAX_SUPPLY, "Exceeds Maximum Supply" ); 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 setMintPrice(uint256 _newPrice) external onlyOwner { mintPrice = _newPrice; } function setWhiteListPrice(uint256 _newPrice) external onlyOwner { whiteListPrice = _newPrice; } function setPublicSupply(uint256 _newSupply) external onlyOwner { PUBLIC_SUPPLY = _newSupply; } function setWhiteListSupply(uint256 _newSupply) external onlyOwner { WHITELIST_SUPPLY = _newSupply; } function setSecondaryReserve(uint256 amount) external onlyOwner { SEC_RESERVED = amount; } function publicSale(bool _enable) external onlyOwner { publicSaleStatus = _enable; } function whiteListSale(bool _enable) external onlyOwner { whiteListSaleStatus = _enable; } /** * @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"}],"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":[],"name":"FunctionLocked","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","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":[{"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":[{"internalType":"bool","name":"_enable","type":"bool"}],"name":"publicSale","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"_newPrice","type":"uint256"}],"name":"setMintPrice","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":"_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":"amount","type":"uint256"}],"name":"setSecondaryReserve","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":[{"internalType":"bool","name":"_enable","type":"bool"}],"name":"whiteListSale","outputs":[],"stateMutability":"nonpayable","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
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d90816200004a919062000a3b565b506020601055600060115561012960125566dc44abe813000060135566dc44abe81300006014556000601860006101000a81548160ff0219169083151502179055506000601860016101000a81548160ff0219169083151502179055506000601c55348015620000b957600080fd5b506040516200654b3803806200654b8339818101604052810190620000df919062000bd5565b6040518060400160405280601f81526020017f4d6f6f6e61204c69736120285363756c707475726529204f726967696e616c008152506040518060400160405280601f81526020017f4d6f6f6e61204c69736120285363756c707475726529204f726967696e616c0081525081600290816200015c919062000a3b565b5080600390816200016e919062000a3b565b506200017f620004b260201b60201c565b6000819055505050620001a76200019b620004bb60201b60201c565b620004c360201b60201c565b620001b76200058960201b60201c565b6001601660006101000a81548160ff0219169083151502179055506001601a600073a8c10ec49df815e73a881abbe0aa7b210f39e2df73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601a60007379bb164367bb64742e993f381372961a945bf44773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601a600073fd88229910a28d6b319e147b40c822fa5cf38a4573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601a6000736b40a842e05d60081f5474046c713b294b4bbc6373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601a6000738528fa2503c49893b704b981e0cbac021e67878973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555073fcca30504374f54eddd0b5c43a07f170b75df42a600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073fe9e420370f0e3b0f13b6089e5b8bfbb585d0ea9600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620004aa8282620005b260201b60201c565b505062000d37565b60006001905090565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620005b0733cc6cdda760b79bafa08df41ecfa224f810dceb660016200075560201b60201c565b565b620005c2620007b760201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562000623576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200061a9062000ca3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000695576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200068c9062000d15565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b637d3e3dbe8260601b60601c9250816200078457826200077c57634420e486905062000784565b63a0af290390505b8060e01b600052306004528260245260008060446000806daaeb6d7670e522a718067333cd4e5af1506000602452505050565b6000612710905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200084357607f821691505b602082108103620008595762000858620007fb565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620008c37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000884565b620008cf868362000884565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200091c620009166200091084620008e7565b620008f1565b620008e7565b9050919050565b6000819050919050565b6200093883620008fb565b62000950620009478262000923565b84845462000891565b825550505050565b600090565b6200096762000958565b620009748184846200092d565b505050565b5b818110156200099c57620009906000826200095d565b6001810190506200097a565b5050565b601f821115620009eb57620009b5816200085f565b620009c08462000874565b81016020851015620009d0578190505b620009e8620009df8562000874565b83018262000979565b50505b505050565b600082821c905092915050565b600062000a1060001984600802620009f0565b1980831691505092915050565b600062000a2b8383620009fd565b9150826002028217905092915050565b62000a4682620007c1565b67ffffffffffffffff81111562000a625762000a61620007cc565b5b62000a6e82546200082a565b62000a7b828285620009a0565b600060209050601f83116001811462000ab3576000841562000a9e578287015190505b62000aaa858262000a1d565b86555062000b1a565b601f19841662000ac3866200085f565b60005b8281101562000aed5784890151825560018201915060208501945060208101905062000ac6565b8683101562000b0d578489015162000b09601f891682620009fd565b8355505b6001600288020188555050505b505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000b548262000b27565b9050919050565b62000b668162000b47565b811462000b7257600080fd5b50565b60008151905062000b868162000b5b565b92915050565b60006bffffffffffffffffffffffff82169050919050565b62000baf8162000b8c565b811462000bbb57600080fd5b50565b60008151905062000bcf8162000ba4565b92915050565b6000806040838503121562000bef5762000bee62000b22565b5b600062000bff8582860162000b75565b925050602062000c128582860162000bbe565b9150509250929050565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000c8b602a8362000c1c565b915062000c988262000c2d565b604082019050919050565b6000602082019050818103600083015262000cbe8162000c7c565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000cfd60198362000c1c565b915062000d0a8262000cc5565b602082019050919050565b6000602082019050818103600083015262000d308162000cee565b9050919050565b6158048062000d476000396000f3fe6080604052600436106103975760003560e01c80637bc02806116101dc578063bbadfe7611610102578063d54ad2a1116100a0578063e985e9c51161006f578063e985e9c514610d25578063f2fde38b14610d62578063f4a0a52814610d8b578063fb796e6c14610db457610397565b8063d54ad2a114610c6b578063da3ef23f14610c96578063dc33e68114610cbf578063e75179a414610cfc57610397565b8063c6682862116100dc578063c668286214610baf578063c6ab67a314610bda578063c87b56dd14610c05578063caab918214610c4257610397565b8063bbadfe7614610b20578063beafc89b14610b5d578063c21b471b14610b8657610397565b8063a22cb4651161017a578063b629f19211610149578063b629f19214610a73578063b6c693e514610ab0578063b7c0b8e814610adb578063b88d4fde14610b0457610397565b8063a22cb465146109b9578063aa592f25146109e2578063b366d61314610a0d578063b449c24d14610a3657610397565b80637ec9e156116101b65780637ec9e1561461090d5780638342083a146109385780638da5cb5b1461096357806395d89b411461098e57610397565b80637bc02806146108905780637c976322146108bb5780637cb64759146108e457610397565b80633dd08c38116102c15780636817c76c1161025f57806370a082311161022e57806370a08231146107f7578063715018a61461083457806374d0101d1461084b57806378bfbdbb1461087457610397565b80636817c76c1461074d578063685756851461077857806369e2f0fb146107a35780636e56539b146107cc57610397565b8063559c55b91161029b578063559c55b91461069357806355f804b3146106bc578063601e5e77146106e55780636352211e1461071057610397565b80633dd08c381461061e578063402c38561461065b57806342842e0e1461067757610397565b806323b872dd1161033957806332cb6b0c1161030857806332cb6b0c1461058a57806334531828146105b5578063381a3506146105de5780633ccfd60b1461060757610397565b806323b872dd146104dc57806326aa420a146104f85780632a55205a146105215780632eb4a7ab1461055f57610397565b8063095ea7b311610375578063095ea7b3146104415780630de4cd801461045d578063109695231461048857806318160ddd146104b157610397565b806301ffc9a71461039c57806306fdde03146103d9578063081812fc14610404575b600080fd5b3480156103a857600080fd5b506103c360048036038101906103be9190613e7f565b610ddf565b6040516103d09190613ec7565b60405180910390f35b3480156103e557600080fd5b506103ee610e01565b6040516103fb9190613f72565b60405180910390f35b34801561041057600080fd5b5061042b60048036038101906104269190613fca565b610e93565b6040516104389190614038565b60405180910390f35b61045b6004803603810190610456919061407f565b610f12565b005b34801561046957600080fd5b50610472610f81565b60405161047f9190613ec7565b60405180910390f35b34801561049457600080fd5b506104af60048036038101906104aa9190614124565b610f94565b005b3480156104bd57600080fd5b506104c66110b3565b6040516104d39190614180565b60405180910390f35b6104f660048036038101906104f1919061419b565b6110ca565b005b34801561050457600080fd5b5061051f600480360381019061051a9190613fca565b611143565b005b34801561052d57600080fd5b50610548600480360381019061054391906141ee565b611155565b60405161055692919061422e565b60405180910390f35b34801561056b57600080fd5b5061057461133f565b6040516105819190614270565b60405180910390f35b34801561059657600080fd5b5061059f611345565b6040516105ac9190614180565b60405180910390f35b3480156105c157600080fd5b506105dc60048036038101906105d79190613e7f565b61134b565b005b3480156105ea57600080fd5b5061060560048036038101906106009190613fca565b6113c0565b005b34801561061357600080fd5b5061061c6113d2565b005b34801561062a57600080fd5b506106456004803603810190610640919061428b565b611480565b6040516106529190613ec7565b60405180910390f35b610675600480360381019061067091906142e4565b6114a0565b005b610691600480360381019061068c919061419b565b611755565b005b34801561069f57600080fd5b506106ba60048036038101906106b59190613fca565b6117ce565b005b3480156106c857600080fd5b506106e360048036038101906106de9190614124565b6117e0565b005b3480156106f157600080fd5b506106fa6118b7565b6040516107079190614180565b60405180910390f35b34801561071c57600080fd5b5061073760048036038101906107329190613fca565b6118bd565b6040516107449190614038565b60405180910390f35b34801561075957600080fd5b506107626118cf565b60405161076f9190614180565b60405180910390f35b34801561078457600080fd5b5061078d6118d5565b60405161079a9190614180565b60405180910390f35b3480156107af57600080fd5b506107ca60048036038101906107c5919061428b565b6118db565b005b3480156107d857600080fd5b506107e16119d1565b6040516107ee9190614180565b60405180910390f35b34801561080357600080fd5b5061081e6004803603810190610819919061428b565b6119d7565b60405161082b9190614180565b60405180910390f35b34801561084057600080fd5b50610849611a8f565b005b34801561085757600080fd5b50610872600480360381019061086d919061407f565b611aa3565b005b61088e6004803603810190610889919061438d565b611bcb565b005b34801561089c57600080fd5b506108a56121ac565b6040516108b29190614038565b60405180910390f35b3480156108c757600080fd5b506108e260048036038101906108dd9190614415565b6121d2565b005b3480156108f057600080fd5b5061090b6004803603810190610906919061446e565b6121f7565b005b34801561091957600080fd5b50610922612209565b60405161092f9190614038565b60405180910390f35b34801561094457600080fd5b5061094d61222f565b60405161095a9190614180565b60405180910390f35b34801561096f57600080fd5b50610978612235565b6040516109859190614038565b60405180910390f35b34801561099a57600080fd5b506109a361225f565b6040516109b09190613f72565b60405180910390f35b3480156109c557600080fd5b506109e060048036038101906109db919061449b565b6122f1565b005b3480156109ee57600080fd5b506109f7612360565b604051610a049190614180565b60405180910390f35b348015610a1957600080fd5b50610a346004803603810190610a2f919061428b565b612365565b005b348015610a4257600080fd5b50610a5d6004803603810190610a58919061428b565b61245b565b604051610a6a9190614180565b60405180910390f35b348015610a7f57600080fd5b50610a9a6004803603810190610a95919061428b565b612473565b604051610aa79190613ec7565b60405180910390f35b348015610abc57600080fd5b50610ac5612493565b604051610ad29190613ec7565b60405180910390f35b348015610ae757600080fd5b50610b026004803603810190610afd9190614415565b6124a6565b005b610b1e6004803603810190610b19919061460b565b612584565b005b348015610b2c57600080fd5b50610b476004803603810190610b429190613e7f565b6125ff565b604051610b549190613ec7565b60405180910390f35b348015610b6957600080fd5b50610b846004803603810190610b7f9190613fca565b61261f565b005b348015610b9257600080fd5b50610bad6004803603810190610ba891906146d2565b612631565b005b348015610bbb57600080fd5b50610bc4612647565b604051610bd19190613f72565b60405180910390f35b348015610be657600080fd5b50610bef6126d5565b604051610bfc9190613f72565b60405180910390f35b348015610c1157600080fd5b50610c2c6004803603810190610c279190613fca565b612763565b604051610c399190613f72565b60405180910390f35b348015610c4e57600080fd5b50610c696004803603810190610c649190614415565b61280d565b005b348015610c7757600080fd5b50610c80612832565b604051610c8d9190614180565b60405180910390f35b348015610ca257600080fd5b50610cbd6004803603810190610cb891906147b3565b612838565b005b348015610ccb57600080fd5b50610ce66004803603810190610ce1919061428b565b612853565b604051610cf39190614180565b60405180910390f35b348015610d0857600080fd5b50610d236004803603810190610d1e919061428b565b612865565b005b348015610d3157600080fd5b50610d4c6004803603810190610d4791906147fc565b612975565b604051610d599190613ec7565b60405180910390f35b348015610d6e57600080fd5b50610d896004803603810190610d84919061428b565b612a09565b005b348015610d9757600080fd5b50610db26004803603810190610dad9190613fca565b612a8c565b005b348015610dc057600080fd5b50610dc9612a9e565b604051610dd69190613ec7565b60405180910390f35b6000610dea82612ab1565b80610dfa5750610df982612b43565b5b9050919050565b606060028054610e109061486b565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3c9061486b565b8015610e895780601f10610e5e57610100808354040283529160200191610e89565b820191906000526020600020905b815481529060010190602001808311610e6c57829003601f168201915b5050505050905090565b6000610e9e82612bbd565b610ed4576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81601660009054906101000a900460ff168015610f715769c617113400112233445560005230601a528160601b60601c603a52600080604460166daaeb6d7670e522a718067333cd4e5afa610f6b573d6000803e3d6000fd5b6000603a525b610f7b8484612c1c565b50505050565b601860019054906101000a900460ff1681565b6017600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff161561104d576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611055612d60565b6000601580546110649061486b565b90501461109d576040517f19e24c1100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181601591826110ae929190614a53565b505050565b60006110bd612dde565b6001546000540303905090565b82601660009054906101000a900460ff16801561113157338260601b60601c146111305769c617113400112233445560005230601a5233603a52600080604460166daaeb6d7670e522a718067333cd4e5afa61112a573d6000803e3d6000fd5b6000603a525b5b61113c858585612de7565b5050505050565b61114b612d60565b8060118190555050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036112ea5760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006112f4613109565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16866113209190614b52565b61132a9190614bc3565b90508160000151819350935050509250929050565b600c5481565b61014a81565b611353612d60565b600160176000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6113c8612d60565b8060128190555050565b6113da612d60565b60003373ffffffffffffffffffffffffffffffffffffffff164760405161140090614c25565b60006040518083038185875af1925050503d806000811461143d576040519150601f19603f3d011682016040523d82523d6000602084013e611442565b606091505b505090508061147d576040517f750b219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b601a6020528060005260406000206000915054906101000a900460ff1681565b60011515601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152a90614c86565b60405180910390fd5b60011515601860009054906101000a900460ff16151514611589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158090614cf2565b60405180910390fd5b6011548211156115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c590614d5e565b60405180910390fd5b61014a826115da613113565b6115e49190614d7e565b1115611625576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161c90614dfe565b60405180910390fd5b6000601354836116359190614b52565b90508034101561167a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167190614e6a565b60405180910390fd5b6116848484613126565b82601160008282546116969190614e8a565b9250508190555081601960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508034111561174f573373ffffffffffffffffffffffffffffffffffffffff166108fc82346117229190614e8a565b9081150290604051600060405180830381858888f1935050505015801561174d573d6000803e3d6000fd5b505b50505050565b82601660009054906101000a900460ff1680156117bc57338260601b60601c146117bb5769c617113400112233445560005230601a5233603a52600080604460166daaeb6d7670e522a718067333cd4e5afa6117b5573d6000803e3d6000fd5b6000603a525b5b6117c78585856132e1565b5050505050565b6117d6612d60565b8060108190555050565b6017600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff1615611899576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118a1612d60565b8181600b91826118b2929190614a53565b505050565b60105481565b60006118c882613301565b9050919050565b60135481565b60145481565b6118e3612d60565b60011515601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196d90614f0a565b60405180910390fd5b6000601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60125481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a3e576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611a97612d60565b611aa160006133cd565b565b6017600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff1615611b5c576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b64612d60565b61014a601054611b72613113565b611b7c9190614d7e565b1115611bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb490614dfe565b60405180910390fd5b611bc78282613126565b5050565b60011515601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5590614c86565b60405180910390fd5b60011515601860009054906101000a900460ff16151514611cb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cab90614cf2565b60405180910390fd5b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508173ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401611d3b9190614038565b602060405180830381865afa158015611d58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7c9190614f3f565b601b60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541080611e7f57508073ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401611dfc9190614038565b602060405180830381865afa158015611e19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3d9190614f3f565b601b60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054105b611ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb590614fde565b60405180910390fd5b60125486601c54611ecf9190614d7e565b1115611f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f079061504a565b60405180910390fd5b61014a86611f1c613113565b611f269190614d7e565b1115611f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5e90614dfe565b60405180910390fd5b60008787604051602001611f7c9291906150d3565b604051602081830303815290604052805190602001209050611fe2858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600c5483613493565b612021576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120189061514b565b60405180910390fd5b6000601454886120319190614b52565b905080341015612076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206d90614e6a565b60405180910390fd5b6120808989613126565b87601c60008282546120929190614d7e565b9250508190555087601b60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120e89190614d7e565b9250508190555086601960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550803411156121a1573373ffffffffffffffffffffffffffffffffffffffff166108fc82346121749190614e8a565b9081150290604051600060405180830381858888f1935050505015801561219f573d6000803e3d6000fd5b505b505050505050505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6121da612d60565b80601860016101000a81548160ff02191690831515021790555050565b6121ff612d60565b80600c8190555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60115481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461226e9061486b565b80601f016020809104026020016040519081016040528092919081815260200182805461229a9061486b565b80156122e75780601f106122bc576101008083540402835291602001916122e7565b820191906000526020600020905b8154815290600101906020018083116122ca57829003601f168201915b5050505050905090565b81601660009054906101000a900460ff1680156123505769c617113400112233445560005230601a528160601b60601c603a52600080604460166daaeb6d7670e522a718067333cd4e5afa61234a573d6000803e3d6000fd5b6000603a525b61235a8484613549565b50505050565b600181565b61236d612d60565b60001515601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f7906151b7565b60405180910390fd5b6001601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b601b6020528060005260406000206000915090505481565b60196020528060005260406000206000915054906101000a900460ff1681565b601860009054906101000a900460ff1681565b6017600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff161561255f576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612567612d60565b80601660006101000a81548160ff02191690831515021790555050565b83601660009054906101000a900460ff1680156125eb57338260601b60601c146125ea5769c617113400112233445560005230601a5233603a52600080604460166daaeb6d7670e522a718067333cd4e5afa6125e4573d6000803e3d6000fd5b6000603a525b5b6125f786868686613654565b505050505050565b60176020528060005260406000206000915054906101000a900460ff1681565b612627612d60565b8060148190555050565b612639612d60565b61264382826136c7565b5050565b600d80546126549061486b565b80601f01602080910402602001604051908101604052809291908181526020018280546126809061486b565b80156126cd5780601f106126a2576101008083540402835291602001916126cd565b820191906000526020600020905b8154815290600101906020018083116126b057829003601f168201915b505050505081565b601580546126e29061486b565b80601f016020809104026020016040519081016040528092919081815260200182805461270e9061486b565b801561275b5780601f106127305761010080835404028352916020019161275b565b820191906000526020600020905b81548152906001019060200180831161273e57829003601f168201915b505050505081565b606061276e82612bbd565b6127ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a490615249565b60405180910390fd5b60006127b761385c565b905060008151116127d75760405180602001604052806000815250612805565b806127e1846138ee565b600d6040516020016127f593929190615328565b6040516020818303038152906040525b915050919050565b612815612d60565b80601860006101000a81548160ff02191690831515021790555050565b601c5481565b612840612d60565b80600d908161284f9190615359565b5050565b600061285e826139bc565b9050919050565b6017600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff161561291e576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612926612d60565b6001612930613113565b10612967576040517f1f0f14ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612972816001613126565b50565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612a11612d60565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a779061549d565b60405180910390fd5b612a89816133cd565b50565b612a94612d60565b8060138190555050565b601660009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b0c57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612b3c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612bb65750612bb582613a13565b5b9050919050565b600081612bc8612dde565b11158015612bd7575060005482105b8015612c15575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000612c27826118bd565b90508073ffffffffffffffffffffffffffffffffffffffff16612c48613a7d565b73ffffffffffffffffffffffffffffffffffffffff1614612cab57612c7481612c6f613a7d565b612975565b612caa576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b612d68613a85565b73ffffffffffffffffffffffffffffffffffffffff16612d86612235565b73ffffffffffffffffffffffffffffffffffffffff1614612ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd390615509565b60405180910390fd5b565b60006001905090565b6000612df282613301565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612e59576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080612e6584613a8d565b91509150612e7b8187612e76613a7d565b613ab4565b612ec757612e9086612e8b613a7d565b612975565b612ec6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612f2d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f3a8686866001613af8565b8015612f4557600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061301385612fef888887613afe565b7c020000000000000000000000000000000000000000000000000000000017613b26565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036130995760006001850190506000600460008381526020019081526020016000205403613097576000548114613096578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131018686866001613b51565b505050505050565b6000612710905090565b600061311d612dde565b60005403905090565b60008054905060008203613166576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6131736000848385613af8565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506131ea836131db6000866000613afe565b6131e485613b57565b17613b26565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461328b57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613250565b50600082036132c6576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506132dc6000848385613b51565b505050565b6132fc83838360405180602001604052806000815250612584565b505050565b60008082905080613310612dde565b11613396576000548110156133955760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603613393575b6000810361338957600460008360019003935083815260200190815260200160002054905061335f565b80925050506133c8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008082905060005b855181101561353b5760008682815181106134ba576134b9615529565b5b602002602001015190508083116134fb5782816040516020016134de929190615579565b604051602081830303815290604052805190602001209250613527565b808360405160200161350e929190615579565b6040516020818303038152906040528051906020012092505b508080613533906155a5565b91505061349c565b508381149150509392505050565b8060076000613556613a7d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16613603613a7d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516136489190613ec7565b60405180910390a35050565b61365f8484846110ca565b60008373ffffffffffffffffffffffffffffffffffffffff163b146136c15761368a84848484613b67565b6136c0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6136cf613109565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111561372d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137249061565f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361379c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613793906156cb565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6060600b805461386b9061486b565b80601f01602080910402602001604051908101604052809291908181526020018280546138979061486b565b80156138e45780601f106138b9576101008083540402835291602001916138e4565b820191906000526020600020905b8154815290600101906020018083116138c757829003601f168201915b5050505050905090565b6060600060016138fd84613cb7565b01905060008167ffffffffffffffff81111561391c5761391b6144e0565b5b6040519080825280601f01601f19166020018201604052801561394e5781602001600182028036833780820191505090505b509050600082602001820190505b6001156139b1578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816139a5576139a4614b94565b5b0494506000850361395c575b819350505050919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8613b15868684613e0a565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60006001821460e11b9050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613b8d613a7d565b8786866040518563ffffffff1660e01b8152600401613baf9493929190615740565b6020604051808303816000875af1925050508015613beb57506040513d601f19601f82011682018060405250810190613be891906157a1565b60015b613c64573d8060008114613c1b576040519150601f19603f3d011682016040523d82523d6000602084013e613c20565b606091505b506000815103613c5c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613d15577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381613d0b57613d0a614b94565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613d52576d04ee2d6d415b85acef81000000008381613d4857613d47614b94565b5b0492506020810190505b662386f26fc100008310613d8157662386f26fc100008381613d7757613d76614b94565b5b0492506010810190505b6305f5e1008310613daa576305f5e1008381613da057613d9f614b94565b5b0492506008810190505b6127108310613dcf576127108381613dc557613dc4614b94565b5b0492506004810190505b60648310613df25760648381613de857613de7614b94565b5b0492506002810190505b600a8310613e01576001810190505b80915050919050565b60009392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613e5c81613e27565b8114613e6757600080fd5b50565b600081359050613e7981613e53565b92915050565b600060208284031215613e9557613e94613e1d565b5b6000613ea384828501613e6a565b91505092915050565b60008115159050919050565b613ec181613eac565b82525050565b6000602082019050613edc6000830184613eb8565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613f1c578082015181840152602081019050613f01565b60008484015250505050565b6000601f19601f8301169050919050565b6000613f4482613ee2565b613f4e8185613eed565b9350613f5e818560208601613efe565b613f6781613f28565b840191505092915050565b60006020820190508181036000830152613f8c8184613f39565b905092915050565b6000819050919050565b613fa781613f94565b8114613fb257600080fd5b50565b600081359050613fc481613f9e565b92915050565b600060208284031215613fe057613fdf613e1d565b5b6000613fee84828501613fb5565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061402282613ff7565b9050919050565b61403281614017565b82525050565b600060208201905061404d6000830184614029565b92915050565b61405c81614017565b811461406757600080fd5b50565b60008135905061407981614053565b92915050565b6000806040838503121561409657614095613e1d565b5b60006140a48582860161406a565b92505060206140b585828601613fb5565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126140e4576140e36140bf565b5b8235905067ffffffffffffffff811115614101576141006140c4565b5b60208301915083600182028301111561411d5761411c6140c9565b5b9250929050565b6000806020838503121561413b5761413a613e1d565b5b600083013567ffffffffffffffff81111561415957614158613e22565b5b614165858286016140ce565b92509250509250929050565b61417a81613f94565b82525050565b60006020820190506141956000830184614171565b92915050565b6000806000606084860312156141b4576141b3613e1d565b5b60006141c28682870161406a565b93505060206141d38682870161406a565b92505060406141e486828701613fb5565b9150509250925092565b6000806040838503121561420557614204613e1d565b5b600061421385828601613fb5565b925050602061422485828601613fb5565b9150509250929050565b60006040820190506142436000830185614029565b6142506020830184614171565b9392505050565b6000819050919050565b61426a81614257565b82525050565b60006020820190506142856000830184614261565b92915050565b6000602082840312156142a1576142a0613e1d565b5b60006142af8482850161406a565b91505092915050565b6142c181613eac565b81146142cc57600080fd5b50565b6000813590506142de816142b8565b92915050565b6000806000606084860312156142fd576142fc613e1d565b5b600061430b8682870161406a565b935050602061431c86828701613fb5565b925050604061432d868287016142cf565b9150509250925092565b60008083601f84011261434d5761434c6140bf565b5b8235905067ffffffffffffffff81111561436a576143696140c4565b5b602083019150836020820283011115614386576143856140c9565b5b9250929050565b6000806000806000608086880312156143a9576143a8613e1d565b5b60006143b78882890161406a565b95505060206143c888828901613fb5565b94505060406143d9888289016142cf565b935050606086013567ffffffffffffffff8111156143fa576143f9613e22565b5b61440688828901614337565b92509250509295509295909350565b60006020828403121561442b5761442a613e1d565b5b6000614439848285016142cf565b91505092915050565b61444b81614257565b811461445657600080fd5b50565b60008135905061446881614442565b92915050565b60006020828403121561448457614483613e1d565b5b600061449284828501614459565b91505092915050565b600080604083850312156144b2576144b1613e1d565b5b60006144c08582860161406a565b92505060206144d1858286016142cf565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61451882613f28565b810181811067ffffffffffffffff82111715614537576145366144e0565b5b80604052505050565b600061454a613e13565b9050614556828261450f565b919050565b600067ffffffffffffffff821115614576576145756144e0565b5b61457f82613f28565b9050602081019050919050565b82818337600083830152505050565b60006145ae6145a98461455b565b614540565b9050828152602081018484840111156145ca576145c96144db565b5b6145d584828561458c565b509392505050565b600082601f8301126145f2576145f16140bf565b5b813561460284826020860161459b565b91505092915050565b6000806000806080858703121561462557614624613e1d565b5b60006146338782880161406a565b94505060206146448782880161406a565b935050604061465587828801613fb5565b925050606085013567ffffffffffffffff81111561467657614675613e22565b5b614682878288016145dd565b91505092959194509250565b60006bffffffffffffffffffffffff82169050919050565b6146af8161468e565b81146146ba57600080fd5b50565b6000813590506146cc816146a6565b92915050565b600080604083850312156146e9576146e8613e1d565b5b60006146f78582860161406a565b9250506020614708858286016146bd565b9150509250929050565b600067ffffffffffffffff82111561472d5761472c6144e0565b5b61473682613f28565b9050602081019050919050565b600061475661475184614712565b614540565b905082815260208101848484011115614772576147716144db565b5b61477d84828561458c565b509392505050565b600082601f83011261479a576147996140bf565b5b81356147aa848260208601614743565b91505092915050565b6000602082840312156147c9576147c8613e1d565b5b600082013567ffffffffffffffff8111156147e7576147e6613e22565b5b6147f384828501614785565b91505092915050565b6000806040838503121561481357614812613e1d565b5b60006148218582860161406a565b92505060206148328582860161406a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061488357607f821691505b6020821081036148965761489561483c565b5b50919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026149097fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826148cc565b61491386836148cc565b95508019841693508086168417925050509392505050565b6000819050919050565b600061495061494b61494684613f94565b61492b565b613f94565b9050919050565b6000819050919050565b61496a83614935565b61497e61497682614957565b8484546148d9565b825550505050565b600090565b614993614986565b61499e818484614961565b505050565b5b818110156149c2576149b760008261498b565b6001810190506149a4565b5050565b601f821115614a07576149d8816148a7565b6149e1846148bc565b810160208510156149f0578190505b614a046149fc856148bc565b8301826149a3565b50505b505050565b600082821c905092915050565b6000614a2a60001984600802614a0c565b1980831691505092915050565b6000614a438383614a19565b9150826002028217905092915050565b614a5d838361489c565b67ffffffffffffffff811115614a7657614a756144e0565b5b614a80825461486b565b614a8b8282856149c6565b6000601f831160018114614aba5760008415614aa8578287013590505b614ab28582614a37565b865550614b1a565b601f198416614ac8866148a7565b60005b82811015614af057848901358255600182019150602085019450602081019050614acb565b86831015614b0d5784890135614b09601f891682614a19565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614b5d82613f94565b9150614b6883613f94565b9250828202614b7681613f94565b91508282048414831517614b8d57614b8c614b23565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614bce82613f94565b9150614bd983613f94565b925082614be957614be8614b94565b5b828204905092915050565b600081905092915050565b50565b6000614c0f600083614bf4565b9150614c1a82614bff565b600082019050919050565b6000614c3082614c02565b9150819050919050565b7f596f75277265206e6f742061206d696e74657200000000000000000000000000600082015250565b6000614c70601383613eed565b9150614c7b82614c3a565b602082019050919050565b60006020820190508181036000830152614c9f81614c63565b9050919050565b7f4d696e74696e67206973206e6f7420796574206f70656e2e0000000000000000600082015250565b6000614cdc601883613eed565b9150614ce782614ca6565b602082019050919050565b60006020820190508181036000830152614d0b81614ccf565b9050919050565b7f4e465420616d6f756e7420657863656564730000000000000000000000000000600082015250565b6000614d48601283613eed565b9150614d5382614d12565b602082019050919050565b60006020820190508181036000830152614d7781614d3b565b9050919050565b6000614d8982613f94565b9150614d9483613f94565b9250828201905080821115614dac57614dab614b23565b5b92915050565b7f45786365656473204d6178696d756d20537570706c7900000000000000000000600082015250565b6000614de8601683613eed565b9150614df382614db2565b602082019050919050565b60006020820190508181036000830152614e1781614ddb565b9050919050565b7f45746865722073656e74206973206e6f7420636f72726563742e000000000000600082015250565b6000614e54601a83613eed565b9150614e5f82614e1e565b602082019050919050565b60006020820190508181036000830152614e8381614e47565b9050919050565b6000614e9582613f94565b9150614ea083613f94565b9250828203905081811115614eb857614eb7614b23565b5b92915050565b7f6d696e74657220646f65736e2774206578697374000000000000000000000000600082015250565b6000614ef4601483613eed565b9150614eff82614ebe565b602082019050919050565b60006020820190508181036000830152614f2381614ee7565b9050919050565b600081519050614f3981613f9e565b92915050565b600060208284031215614f5557614f54613e1d565b5b6000614f6384828501614f2a565b91505092915050565b7f496e76616c69642057686974656c6973742050726f6f66206f7220416c72656160008201527f647920436c61696d656400000000000000000000000000000000000000000000602082015250565b6000614fc8602a83613eed565b9150614fd382614f6c565b604082019050919050565b60006020820190508181036000830152614ff781614fbb565b9050919050565b7f416c6c204e46547320436c61696d65642e000000000000000000000000000000600082015250565b6000615034601183613eed565b915061503f82614ffe565b602082019050919050565b6000602082019050818103600083015261506381615027565b9050919050565b60008160601b9050919050565b60006150828261506a565b9050919050565b600061509482615077565b9050919050565b6150ac6150a782614017565b615089565b82525050565b6000819050919050565b6150cd6150c882613f94565b6150b2565b82525050565b60006150df828561509b565b6014820191506150ef82846150bc565b6020820191508190509392505050565b7f496e76616c69642057686974656c6973742050726f6f662e0000000000000000600082015250565b6000615135601883613eed565b9150615140826150ff565b602082019050919050565b6000602082019050818103600083015261516481615128565b9050919050565b7f616c72656164792061206d696e74657200000000000000000000000000000000600082015250565b60006151a1601083613eed565b91506151ac8261516b565b602082019050919050565b600060208201905081810360008301526151d081615194565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615233602f83613eed565b915061523e826151d7565b604082019050919050565b6000602082019050818103600083015261526281615226565b9050919050565b600081905092915050565b600061527f82613ee2565b6152898185615269565b9350615299818560208601613efe565b80840191505092915050565b600081546152b28161486b565b6152bc8186615269565b945060018216600081146152d757600181146152ec5761531f565b60ff198316865281151582028601935061531f565b6152f5856148a7565b60005b83811015615317578154818901526001820191506020810190506152f8565b838801955050505b50505092915050565b60006153348286615274565b91506153408285615274565b915061534c82846152a5565b9150819050949350505050565b61536282613ee2565b67ffffffffffffffff81111561537b5761537a6144e0565b5b615385825461486b565b6153908282856149c6565b600060209050601f8311600181146153c357600084156153b1578287015190505b6153bb8582614a37565b865550615423565b601f1984166153d1866148a7565b60005b828110156153f9578489015182556001820191506020850194506020810190506153d4565b868310156154165784890151615412601f891682614a19565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615487602683613eed565b91506154928261542b565b604082019050919050565b600060208201905081810360008301526154b68161547a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006154f3602083613eed565b91506154fe826154bd565b602082019050919050565b60006020820190508181036000830152615522816154e6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b61557361556e82614257565b615558565b82525050565b60006155858285615562565b6020820191506155958284615562565b6020820191508190509392505050565b60006155b082613f94565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036155e2576155e1614b23565b5b600182019050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000615649602a83613eed565b9150615654826155ed565b604082019050919050565b600060208201905081810360008301526156788161563c565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006156b5601983613eed565b91506156c08261567f565b602082019050919050565b600060208201905081810360008301526156e4816156a8565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615712826156eb565b61571c81856156f6565b935061572c818560208601613efe565b61573581613f28565b840191505092915050565b60006080820190506157556000830187614029565b6157626020830186614029565b61576f6040830185614171565b81810360608301526157818184615707565b905095945050505050565b60008151905061579b81613e53565b92915050565b6000602082840312156157b7576157b6613e1d565b5b60006157c58482850161578c565b9150509291505056fea26469706673582212200cc2e711f3cab6b3e5bf45fc2d41f1472ec6d652c8ae0a6c342679cf6b0e4d4a64736f6c6343000812003300000000000000000000000004d601c7101fe1d271ee18340be5dc37ba016d9100000000000000000000000000000000000000000000000000000000000003e8
Deployed Bytecode
0x6080604052600436106103975760003560e01c80637bc02806116101dc578063bbadfe7611610102578063d54ad2a1116100a0578063e985e9c51161006f578063e985e9c514610d25578063f2fde38b14610d62578063f4a0a52814610d8b578063fb796e6c14610db457610397565b8063d54ad2a114610c6b578063da3ef23f14610c96578063dc33e68114610cbf578063e75179a414610cfc57610397565b8063c6682862116100dc578063c668286214610baf578063c6ab67a314610bda578063c87b56dd14610c05578063caab918214610c4257610397565b8063bbadfe7614610b20578063beafc89b14610b5d578063c21b471b14610b8657610397565b8063a22cb4651161017a578063b629f19211610149578063b629f19214610a73578063b6c693e514610ab0578063b7c0b8e814610adb578063b88d4fde14610b0457610397565b8063a22cb465146109b9578063aa592f25146109e2578063b366d61314610a0d578063b449c24d14610a3657610397565b80637ec9e156116101b65780637ec9e1561461090d5780638342083a146109385780638da5cb5b1461096357806395d89b411461098e57610397565b80637bc02806146108905780637c976322146108bb5780637cb64759146108e457610397565b80633dd08c38116102c15780636817c76c1161025f57806370a082311161022e57806370a08231146107f7578063715018a61461083457806374d0101d1461084b57806378bfbdbb1461087457610397565b80636817c76c1461074d578063685756851461077857806369e2f0fb146107a35780636e56539b146107cc57610397565b8063559c55b91161029b578063559c55b91461069357806355f804b3146106bc578063601e5e77146106e55780636352211e1461071057610397565b80633dd08c381461061e578063402c38561461065b57806342842e0e1461067757610397565b806323b872dd1161033957806332cb6b0c1161030857806332cb6b0c1461058a57806334531828146105b5578063381a3506146105de5780633ccfd60b1461060757610397565b806323b872dd146104dc57806326aa420a146104f85780632a55205a146105215780632eb4a7ab1461055f57610397565b8063095ea7b311610375578063095ea7b3146104415780630de4cd801461045d578063109695231461048857806318160ddd146104b157610397565b806301ffc9a71461039c57806306fdde03146103d9578063081812fc14610404575b600080fd5b3480156103a857600080fd5b506103c360048036038101906103be9190613e7f565b610ddf565b6040516103d09190613ec7565b60405180910390f35b3480156103e557600080fd5b506103ee610e01565b6040516103fb9190613f72565b60405180910390f35b34801561041057600080fd5b5061042b60048036038101906104269190613fca565b610e93565b6040516104389190614038565b60405180910390f35b61045b6004803603810190610456919061407f565b610f12565b005b34801561046957600080fd5b50610472610f81565b60405161047f9190613ec7565b60405180910390f35b34801561049457600080fd5b506104af60048036038101906104aa9190614124565b610f94565b005b3480156104bd57600080fd5b506104c66110b3565b6040516104d39190614180565b60405180910390f35b6104f660048036038101906104f1919061419b565b6110ca565b005b34801561050457600080fd5b5061051f600480360381019061051a9190613fca565b611143565b005b34801561052d57600080fd5b50610548600480360381019061054391906141ee565b611155565b60405161055692919061422e565b60405180910390f35b34801561056b57600080fd5b5061057461133f565b6040516105819190614270565b60405180910390f35b34801561059657600080fd5b5061059f611345565b6040516105ac9190614180565b60405180910390f35b3480156105c157600080fd5b506105dc60048036038101906105d79190613e7f565b61134b565b005b3480156105ea57600080fd5b5061060560048036038101906106009190613fca565b6113c0565b005b34801561061357600080fd5b5061061c6113d2565b005b34801561062a57600080fd5b506106456004803603810190610640919061428b565b611480565b6040516106529190613ec7565b60405180910390f35b610675600480360381019061067091906142e4565b6114a0565b005b610691600480360381019061068c919061419b565b611755565b005b34801561069f57600080fd5b506106ba60048036038101906106b59190613fca565b6117ce565b005b3480156106c857600080fd5b506106e360048036038101906106de9190614124565b6117e0565b005b3480156106f157600080fd5b506106fa6118b7565b6040516107079190614180565b60405180910390f35b34801561071c57600080fd5b5061073760048036038101906107329190613fca565b6118bd565b6040516107449190614038565b60405180910390f35b34801561075957600080fd5b506107626118cf565b60405161076f9190614180565b60405180910390f35b34801561078457600080fd5b5061078d6118d5565b60405161079a9190614180565b60405180910390f35b3480156107af57600080fd5b506107ca60048036038101906107c5919061428b565b6118db565b005b3480156107d857600080fd5b506107e16119d1565b6040516107ee9190614180565b60405180910390f35b34801561080357600080fd5b5061081e6004803603810190610819919061428b565b6119d7565b60405161082b9190614180565b60405180910390f35b34801561084057600080fd5b50610849611a8f565b005b34801561085757600080fd5b50610872600480360381019061086d919061407f565b611aa3565b005b61088e6004803603810190610889919061438d565b611bcb565b005b34801561089c57600080fd5b506108a56121ac565b6040516108b29190614038565b60405180910390f35b3480156108c757600080fd5b506108e260048036038101906108dd9190614415565b6121d2565b005b3480156108f057600080fd5b5061090b6004803603810190610906919061446e565b6121f7565b005b34801561091957600080fd5b50610922612209565b60405161092f9190614038565b60405180910390f35b34801561094457600080fd5b5061094d61222f565b60405161095a9190614180565b60405180910390f35b34801561096f57600080fd5b50610978612235565b6040516109859190614038565b60405180910390f35b34801561099a57600080fd5b506109a361225f565b6040516109b09190613f72565b60405180910390f35b3480156109c557600080fd5b506109e060048036038101906109db919061449b565b6122f1565b005b3480156109ee57600080fd5b506109f7612360565b604051610a049190614180565b60405180910390f35b348015610a1957600080fd5b50610a346004803603810190610a2f919061428b565b612365565b005b348015610a4257600080fd5b50610a5d6004803603810190610a58919061428b565b61245b565b604051610a6a9190614180565b60405180910390f35b348015610a7f57600080fd5b50610a9a6004803603810190610a95919061428b565b612473565b604051610aa79190613ec7565b60405180910390f35b348015610abc57600080fd5b50610ac5612493565b604051610ad29190613ec7565b60405180910390f35b348015610ae757600080fd5b50610b026004803603810190610afd9190614415565b6124a6565b005b610b1e6004803603810190610b19919061460b565b612584565b005b348015610b2c57600080fd5b50610b476004803603810190610b429190613e7f565b6125ff565b604051610b549190613ec7565b60405180910390f35b348015610b6957600080fd5b50610b846004803603810190610b7f9190613fca565b61261f565b005b348015610b9257600080fd5b50610bad6004803603810190610ba891906146d2565b612631565b005b348015610bbb57600080fd5b50610bc4612647565b604051610bd19190613f72565b60405180910390f35b348015610be657600080fd5b50610bef6126d5565b604051610bfc9190613f72565b60405180910390f35b348015610c1157600080fd5b50610c2c6004803603810190610c279190613fca565b612763565b604051610c399190613f72565b60405180910390f35b348015610c4e57600080fd5b50610c696004803603810190610c649190614415565b61280d565b005b348015610c7757600080fd5b50610c80612832565b604051610c8d9190614180565b60405180910390f35b348015610ca257600080fd5b50610cbd6004803603810190610cb891906147b3565b612838565b005b348015610ccb57600080fd5b50610ce66004803603810190610ce1919061428b565b612853565b604051610cf39190614180565b60405180910390f35b348015610d0857600080fd5b50610d236004803603810190610d1e919061428b565b612865565b005b348015610d3157600080fd5b50610d4c6004803603810190610d4791906147fc565b612975565b604051610d599190613ec7565b60405180910390f35b348015610d6e57600080fd5b50610d896004803603810190610d84919061428b565b612a09565b005b348015610d9757600080fd5b50610db26004803603810190610dad9190613fca565b612a8c565b005b348015610dc057600080fd5b50610dc9612a9e565b604051610dd69190613ec7565b60405180910390f35b6000610dea82612ab1565b80610dfa5750610df982612b43565b5b9050919050565b606060028054610e109061486b565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3c9061486b565b8015610e895780601f10610e5e57610100808354040283529160200191610e89565b820191906000526020600020905b815481529060010190602001808311610e6c57829003601f168201915b5050505050905090565b6000610e9e82612bbd565b610ed4576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81601660009054906101000a900460ff168015610f715769c617113400112233445560005230601a528160601b60601c603a52600080604460166daaeb6d7670e522a718067333cd4e5afa610f6b573d6000803e3d6000fd5b6000603a525b610f7b8484612c1c565b50505050565b601860019054906101000a900460ff1681565b6017600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff161561104d576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611055612d60565b6000601580546110649061486b565b90501461109d576040517f19e24c1100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181601591826110ae929190614a53565b505050565b60006110bd612dde565b6001546000540303905090565b82601660009054906101000a900460ff16801561113157338260601b60601c146111305769c617113400112233445560005230601a5233603a52600080604460166daaeb6d7670e522a718067333cd4e5afa61112a573d6000803e3d6000fd5b6000603a525b5b61113c858585612de7565b5050505050565b61114b612d60565b8060118190555050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036112ea5760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006112f4613109565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16866113209190614b52565b61132a9190614bc3565b90508160000151819350935050509250929050565b600c5481565b61014a81565b611353612d60565b600160176000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6113c8612d60565b8060128190555050565b6113da612d60565b60003373ffffffffffffffffffffffffffffffffffffffff164760405161140090614c25565b60006040518083038185875af1925050503d806000811461143d576040519150601f19603f3d011682016040523d82523d6000602084013e611442565b606091505b505090508061147d576040517f750b219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b601a6020528060005260406000206000915054906101000a900460ff1681565b60011515601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152a90614c86565b60405180910390fd5b60011515601860009054906101000a900460ff16151514611589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158090614cf2565b60405180910390fd5b6011548211156115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c590614d5e565b60405180910390fd5b61014a826115da613113565b6115e49190614d7e565b1115611625576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161c90614dfe565b60405180910390fd5b6000601354836116359190614b52565b90508034101561167a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167190614e6a565b60405180910390fd5b6116848484613126565b82601160008282546116969190614e8a565b9250508190555081601960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508034111561174f573373ffffffffffffffffffffffffffffffffffffffff166108fc82346117229190614e8a565b9081150290604051600060405180830381858888f1935050505015801561174d573d6000803e3d6000fd5b505b50505050565b82601660009054906101000a900460ff1680156117bc57338260601b60601c146117bb5769c617113400112233445560005230601a5233603a52600080604460166daaeb6d7670e522a718067333cd4e5afa6117b5573d6000803e3d6000fd5b6000603a525b5b6117c78585856132e1565b5050505050565b6117d6612d60565b8060108190555050565b6017600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff1615611899576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118a1612d60565b8181600b91826118b2929190614a53565b505050565b60105481565b60006118c882613301565b9050919050565b60135481565b60145481565b6118e3612d60565b60011515601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196d90614f0a565b60405180910390fd5b6000601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60125481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a3e576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611a97612d60565b611aa160006133cd565b565b6017600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff1615611b5c576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b64612d60565b61014a601054611b72613113565b611b7c9190614d7e565b1115611bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb490614dfe565b60405180910390fd5b611bc78282613126565b5050565b60011515601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5590614c86565b60405180910390fd5b60011515601860009054906101000a900460ff16151514611cb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cab90614cf2565b60405180910390fd5b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508173ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401611d3b9190614038565b602060405180830381865afa158015611d58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7c9190614f3f565b601b60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541080611e7f57508073ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401611dfc9190614038565b602060405180830381865afa158015611e19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3d9190614f3f565b601b60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054105b611ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb590614fde565b60405180910390fd5b60125486601c54611ecf9190614d7e565b1115611f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f079061504a565b60405180910390fd5b61014a86611f1c613113565b611f269190614d7e565b1115611f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5e90614dfe565b60405180910390fd5b60008787604051602001611f7c9291906150d3565b604051602081830303815290604052805190602001209050611fe2858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600c5483613493565b612021576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120189061514b565b60405180910390fd5b6000601454886120319190614b52565b905080341015612076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206d90614e6a565b60405180910390fd5b6120808989613126565b87601c60008282546120929190614d7e565b9250508190555087601b60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120e89190614d7e565b9250508190555086601960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550803411156121a1573373ffffffffffffffffffffffffffffffffffffffff166108fc82346121749190614e8a565b9081150290604051600060405180830381858888f1935050505015801561219f573d6000803e3d6000fd5b505b505050505050505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6121da612d60565b80601860016101000a81548160ff02191690831515021790555050565b6121ff612d60565b80600c8190555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60115481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461226e9061486b565b80601f016020809104026020016040519081016040528092919081815260200182805461229a9061486b565b80156122e75780601f106122bc576101008083540402835291602001916122e7565b820191906000526020600020905b8154815290600101906020018083116122ca57829003601f168201915b5050505050905090565b81601660009054906101000a900460ff1680156123505769c617113400112233445560005230601a528160601b60601c603a52600080604460166daaeb6d7670e522a718067333cd4e5afa61234a573d6000803e3d6000fd5b6000603a525b61235a8484613549565b50505050565b600181565b61236d612d60565b60001515601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f7906151b7565b60405180910390fd5b6001601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b601b6020528060005260406000206000915090505481565b60196020528060005260406000206000915054906101000a900460ff1681565b601860009054906101000a900460ff1681565b6017600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff161561255f576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612567612d60565b80601660006101000a81548160ff02191690831515021790555050565b83601660009054906101000a900460ff1680156125eb57338260601b60601c146125ea5769c617113400112233445560005230601a5233603a52600080604460166daaeb6d7670e522a718067333cd4e5afa6125e4573d6000803e3d6000fd5b6000603a525b5b6125f786868686613654565b505050505050565b60176020528060005260406000206000915054906101000a900460ff1681565b612627612d60565b8060148190555050565b612639612d60565b61264382826136c7565b5050565b600d80546126549061486b565b80601f01602080910402602001604051908101604052809291908181526020018280546126809061486b565b80156126cd5780601f106126a2576101008083540402835291602001916126cd565b820191906000526020600020905b8154815290600101906020018083116126b057829003601f168201915b505050505081565b601580546126e29061486b565b80601f016020809104026020016040519081016040528092919081815260200182805461270e9061486b565b801561275b5780601f106127305761010080835404028352916020019161275b565b820191906000526020600020905b81548152906001019060200180831161273e57829003601f168201915b505050505081565b606061276e82612bbd565b6127ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a490615249565b60405180910390fd5b60006127b761385c565b905060008151116127d75760405180602001604052806000815250612805565b806127e1846138ee565b600d6040516020016127f593929190615328565b6040516020818303038152906040525b915050919050565b612815612d60565b80601860006101000a81548160ff02191690831515021790555050565b601c5481565b612840612d60565b80600d908161284f9190615359565b5050565b600061285e826139bc565b9050919050565b6017600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff161561291e576040517f8bf9b99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612926612d60565b6001612930613113565b10612967576040517f1f0f14ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612972816001613126565b50565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612a11612d60565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a779061549d565b60405180910390fd5b612a89816133cd565b50565b612a94612d60565b8060138190555050565b601660009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b0c57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612b3c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612bb65750612bb582613a13565b5b9050919050565b600081612bc8612dde565b11158015612bd7575060005482105b8015612c15575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000612c27826118bd565b90508073ffffffffffffffffffffffffffffffffffffffff16612c48613a7d565b73ffffffffffffffffffffffffffffffffffffffff1614612cab57612c7481612c6f613a7d565b612975565b612caa576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b612d68613a85565b73ffffffffffffffffffffffffffffffffffffffff16612d86612235565b73ffffffffffffffffffffffffffffffffffffffff1614612ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dd390615509565b60405180910390fd5b565b60006001905090565b6000612df282613301565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612e59576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080612e6584613a8d565b91509150612e7b8187612e76613a7d565b613ab4565b612ec757612e9086612e8b613a7d565b612975565b612ec6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612f2d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f3a8686866001613af8565b8015612f4557600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061301385612fef888887613afe565b7c020000000000000000000000000000000000000000000000000000000017613b26565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036130995760006001850190506000600460008381526020019081526020016000205403613097576000548114613096578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131018686866001613b51565b505050505050565b6000612710905090565b600061311d612dde565b60005403905090565b60008054905060008203613166576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6131736000848385613af8565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506131ea836131db6000866000613afe565b6131e485613b57565b17613b26565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461328b57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613250565b50600082036132c6576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506132dc6000848385613b51565b505050565b6132fc83838360405180602001604052806000815250612584565b505050565b60008082905080613310612dde565b11613396576000548110156133955760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603613393575b6000810361338957600460008360019003935083815260200190815260200160002054905061335f565b80925050506133c8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008082905060005b855181101561353b5760008682815181106134ba576134b9615529565b5b602002602001015190508083116134fb5782816040516020016134de929190615579565b604051602081830303815290604052805190602001209250613527565b808360405160200161350e929190615579565b6040516020818303038152906040528051906020012092505b508080613533906155a5565b91505061349c565b508381149150509392505050565b8060076000613556613a7d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16613603613a7d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516136489190613ec7565b60405180910390a35050565b61365f8484846110ca565b60008373ffffffffffffffffffffffffffffffffffffffff163b146136c15761368a84848484613b67565b6136c0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6136cf613109565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111561372d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137249061565f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361379c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613793906156cb565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6060600b805461386b9061486b565b80601f01602080910402602001604051908101604052809291908181526020018280546138979061486b565b80156138e45780601f106138b9576101008083540402835291602001916138e4565b820191906000526020600020905b8154815290600101906020018083116138c757829003601f168201915b5050505050905090565b6060600060016138fd84613cb7565b01905060008167ffffffffffffffff81111561391c5761391b6144e0565b5b6040519080825280601f01601f19166020018201604052801561394e5781602001600182028036833780820191505090505b509050600082602001820190505b6001156139b1578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816139a5576139a4614b94565b5b0494506000850361395c575b819350505050919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8613b15868684613e0a565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60006001821460e11b9050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613b8d613a7d565b8786866040518563ffffffff1660e01b8152600401613baf9493929190615740565b6020604051808303816000875af1925050508015613beb57506040513d601f19601f82011682018060405250810190613be891906157a1565b60015b613c64573d8060008114613c1b576040519150601f19603f3d011682016040523d82523d6000602084013e613c20565b606091505b506000815103613c5c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613d15577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381613d0b57613d0a614b94565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613d52576d04ee2d6d415b85acef81000000008381613d4857613d47614b94565b5b0492506020810190505b662386f26fc100008310613d8157662386f26fc100008381613d7757613d76614b94565b5b0492506010810190505b6305f5e1008310613daa576305f5e1008381613da057613d9f614b94565b5b0492506008810190505b6127108310613dcf576127108381613dc557613dc4614b94565b5b0492506004810190505b60648310613df25760648381613de857613de7614b94565b5b0492506002810190505b600a8310613e01576001810190505b80915050919050565b60009392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613e5c81613e27565b8114613e6757600080fd5b50565b600081359050613e7981613e53565b92915050565b600060208284031215613e9557613e94613e1d565b5b6000613ea384828501613e6a565b91505092915050565b60008115159050919050565b613ec181613eac565b82525050565b6000602082019050613edc6000830184613eb8565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613f1c578082015181840152602081019050613f01565b60008484015250505050565b6000601f19601f8301169050919050565b6000613f4482613ee2565b613f4e8185613eed565b9350613f5e818560208601613efe565b613f6781613f28565b840191505092915050565b60006020820190508181036000830152613f8c8184613f39565b905092915050565b6000819050919050565b613fa781613f94565b8114613fb257600080fd5b50565b600081359050613fc481613f9e565b92915050565b600060208284031215613fe057613fdf613e1d565b5b6000613fee84828501613fb5565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061402282613ff7565b9050919050565b61403281614017565b82525050565b600060208201905061404d6000830184614029565b92915050565b61405c81614017565b811461406757600080fd5b50565b60008135905061407981614053565b92915050565b6000806040838503121561409657614095613e1d565b5b60006140a48582860161406a565b92505060206140b585828601613fb5565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126140e4576140e36140bf565b5b8235905067ffffffffffffffff811115614101576141006140c4565b5b60208301915083600182028301111561411d5761411c6140c9565b5b9250929050565b6000806020838503121561413b5761413a613e1d565b5b600083013567ffffffffffffffff81111561415957614158613e22565b5b614165858286016140ce565b92509250509250929050565b61417a81613f94565b82525050565b60006020820190506141956000830184614171565b92915050565b6000806000606084860312156141b4576141b3613e1d565b5b60006141c28682870161406a565b93505060206141d38682870161406a565b92505060406141e486828701613fb5565b9150509250925092565b6000806040838503121561420557614204613e1d565b5b600061421385828601613fb5565b925050602061422485828601613fb5565b9150509250929050565b60006040820190506142436000830185614029565b6142506020830184614171565b9392505050565b6000819050919050565b61426a81614257565b82525050565b60006020820190506142856000830184614261565b92915050565b6000602082840312156142a1576142a0613e1d565b5b60006142af8482850161406a565b91505092915050565b6142c181613eac565b81146142cc57600080fd5b50565b6000813590506142de816142b8565b92915050565b6000806000606084860312156142fd576142fc613e1d565b5b600061430b8682870161406a565b935050602061431c86828701613fb5565b925050604061432d868287016142cf565b9150509250925092565b60008083601f84011261434d5761434c6140bf565b5b8235905067ffffffffffffffff81111561436a576143696140c4565b5b602083019150836020820283011115614386576143856140c9565b5b9250929050565b6000806000806000608086880312156143a9576143a8613e1d565b5b60006143b78882890161406a565b95505060206143c888828901613fb5565b94505060406143d9888289016142cf565b935050606086013567ffffffffffffffff8111156143fa576143f9613e22565b5b61440688828901614337565b92509250509295509295909350565b60006020828403121561442b5761442a613e1d565b5b6000614439848285016142cf565b91505092915050565b61444b81614257565b811461445657600080fd5b50565b60008135905061446881614442565b92915050565b60006020828403121561448457614483613e1d565b5b600061449284828501614459565b91505092915050565b600080604083850312156144b2576144b1613e1d565b5b60006144c08582860161406a565b92505060206144d1858286016142cf565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61451882613f28565b810181811067ffffffffffffffff82111715614537576145366144e0565b5b80604052505050565b600061454a613e13565b9050614556828261450f565b919050565b600067ffffffffffffffff821115614576576145756144e0565b5b61457f82613f28565b9050602081019050919050565b82818337600083830152505050565b60006145ae6145a98461455b565b614540565b9050828152602081018484840111156145ca576145c96144db565b5b6145d584828561458c565b509392505050565b600082601f8301126145f2576145f16140bf565b5b813561460284826020860161459b565b91505092915050565b6000806000806080858703121561462557614624613e1d565b5b60006146338782880161406a565b94505060206146448782880161406a565b935050604061465587828801613fb5565b925050606085013567ffffffffffffffff81111561467657614675613e22565b5b614682878288016145dd565b91505092959194509250565b60006bffffffffffffffffffffffff82169050919050565b6146af8161468e565b81146146ba57600080fd5b50565b6000813590506146cc816146a6565b92915050565b600080604083850312156146e9576146e8613e1d565b5b60006146f78582860161406a565b9250506020614708858286016146bd565b9150509250929050565b600067ffffffffffffffff82111561472d5761472c6144e0565b5b61473682613f28565b9050602081019050919050565b600061475661475184614712565b614540565b905082815260208101848484011115614772576147716144db565b5b61477d84828561458c565b509392505050565b600082601f83011261479a576147996140bf565b5b81356147aa848260208601614743565b91505092915050565b6000602082840312156147c9576147c8613e1d565b5b600082013567ffffffffffffffff8111156147e7576147e6613e22565b5b6147f384828501614785565b91505092915050565b6000806040838503121561481357614812613e1d565b5b60006148218582860161406a565b92505060206148328582860161406a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061488357607f821691505b6020821081036148965761489561483c565b5b50919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026149097fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826148cc565b61491386836148cc565b95508019841693508086168417925050509392505050565b6000819050919050565b600061495061494b61494684613f94565b61492b565b613f94565b9050919050565b6000819050919050565b61496a83614935565b61497e61497682614957565b8484546148d9565b825550505050565b600090565b614993614986565b61499e818484614961565b505050565b5b818110156149c2576149b760008261498b565b6001810190506149a4565b5050565b601f821115614a07576149d8816148a7565b6149e1846148bc565b810160208510156149f0578190505b614a046149fc856148bc565b8301826149a3565b50505b505050565b600082821c905092915050565b6000614a2a60001984600802614a0c565b1980831691505092915050565b6000614a438383614a19565b9150826002028217905092915050565b614a5d838361489c565b67ffffffffffffffff811115614a7657614a756144e0565b5b614a80825461486b565b614a8b8282856149c6565b6000601f831160018114614aba5760008415614aa8578287013590505b614ab28582614a37565b865550614b1a565b601f198416614ac8866148a7565b60005b82811015614af057848901358255600182019150602085019450602081019050614acb565b86831015614b0d5784890135614b09601f891682614a19565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614b5d82613f94565b9150614b6883613f94565b9250828202614b7681613f94565b91508282048414831517614b8d57614b8c614b23565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614bce82613f94565b9150614bd983613f94565b925082614be957614be8614b94565b5b828204905092915050565b600081905092915050565b50565b6000614c0f600083614bf4565b9150614c1a82614bff565b600082019050919050565b6000614c3082614c02565b9150819050919050565b7f596f75277265206e6f742061206d696e74657200000000000000000000000000600082015250565b6000614c70601383613eed565b9150614c7b82614c3a565b602082019050919050565b60006020820190508181036000830152614c9f81614c63565b9050919050565b7f4d696e74696e67206973206e6f7420796574206f70656e2e0000000000000000600082015250565b6000614cdc601883613eed565b9150614ce782614ca6565b602082019050919050565b60006020820190508181036000830152614d0b81614ccf565b9050919050565b7f4e465420616d6f756e7420657863656564730000000000000000000000000000600082015250565b6000614d48601283613eed565b9150614d5382614d12565b602082019050919050565b60006020820190508181036000830152614d7781614d3b565b9050919050565b6000614d8982613f94565b9150614d9483613f94565b9250828201905080821115614dac57614dab614b23565b5b92915050565b7f45786365656473204d6178696d756d20537570706c7900000000000000000000600082015250565b6000614de8601683613eed565b9150614df382614db2565b602082019050919050565b60006020820190508181036000830152614e1781614ddb565b9050919050565b7f45746865722073656e74206973206e6f7420636f72726563742e000000000000600082015250565b6000614e54601a83613eed565b9150614e5f82614e1e565b602082019050919050565b60006020820190508181036000830152614e8381614e47565b9050919050565b6000614e9582613f94565b9150614ea083613f94565b9250828203905081811115614eb857614eb7614b23565b5b92915050565b7f6d696e74657220646f65736e2774206578697374000000000000000000000000600082015250565b6000614ef4601483613eed565b9150614eff82614ebe565b602082019050919050565b60006020820190508181036000830152614f2381614ee7565b9050919050565b600081519050614f3981613f9e565b92915050565b600060208284031215614f5557614f54613e1d565b5b6000614f6384828501614f2a565b91505092915050565b7f496e76616c69642057686974656c6973742050726f6f66206f7220416c72656160008201527f647920436c61696d656400000000000000000000000000000000000000000000602082015250565b6000614fc8602a83613eed565b9150614fd382614f6c565b604082019050919050565b60006020820190508181036000830152614ff781614fbb565b9050919050565b7f416c6c204e46547320436c61696d65642e000000000000000000000000000000600082015250565b6000615034601183613eed565b915061503f82614ffe565b602082019050919050565b6000602082019050818103600083015261506381615027565b9050919050565b60008160601b9050919050565b60006150828261506a565b9050919050565b600061509482615077565b9050919050565b6150ac6150a782614017565b615089565b82525050565b6000819050919050565b6150cd6150c882613f94565b6150b2565b82525050565b60006150df828561509b565b6014820191506150ef82846150bc565b6020820191508190509392505050565b7f496e76616c69642057686974656c6973742050726f6f662e0000000000000000600082015250565b6000615135601883613eed565b9150615140826150ff565b602082019050919050565b6000602082019050818103600083015261516481615128565b9050919050565b7f616c72656164792061206d696e74657200000000000000000000000000000000600082015250565b60006151a1601083613eed565b91506151ac8261516b565b602082019050919050565b600060208201905081810360008301526151d081615194565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615233602f83613eed565b915061523e826151d7565b604082019050919050565b6000602082019050818103600083015261526281615226565b9050919050565b600081905092915050565b600061527f82613ee2565b6152898185615269565b9350615299818560208601613efe565b80840191505092915050565b600081546152b28161486b565b6152bc8186615269565b945060018216600081146152d757600181146152ec5761531f565b60ff198316865281151582028601935061531f565b6152f5856148a7565b60005b83811015615317578154818901526001820191506020810190506152f8565b838801955050505b50505092915050565b60006153348286615274565b91506153408285615274565b915061534c82846152a5565b9150819050949350505050565b61536282613ee2565b67ffffffffffffffff81111561537b5761537a6144e0565b5b615385825461486b565b6153908282856149c6565b600060209050601f8311600181146153c357600084156153b1578287015190505b6153bb8582614a37565b865550615423565b601f1984166153d1866148a7565b60005b828110156153f9578489015182556001820191506020850194506020810190506153d4565b868310156154165784890151615412601f891682614a19565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615487602683613eed565b91506154928261542b565b604082019050919050565b600060208201905081810360008301526154b68161547a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006154f3602083613eed565b91506154fe826154bd565b602082019050919050565b60006020820190508181036000830152615522816154e6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b61557361556e82614257565b615558565b82525050565b60006155858285615562565b6020820191506155958284615562565b6020820191508190509392505050565b60006155b082613f94565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036155e2576155e1614b23565b5b600182019050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000615649602a83613eed565b9150615654826155ed565b604082019050919050565b600060208201905081810360008301526156788161563c565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006156b5601983613eed565b91506156c08261567f565b602082019050919050565b600060208201905081810360008301526156e4816156a8565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615712826156eb565b61571c81856156f6565b935061572c818560208601613efe565b61573581613f28565b840191505092915050565b60006080820190506157556000830187614029565b6157626020830186614029565b61576f6040830185614171565b81810360608301526157818184615707565b905095945050505050565b60008151905061579b81613e53565b92915050565b6000602082840312156157b7576157b6613e1d565b5b60006157c58482850161578c565b9150509291505056fea26469706673582212200cc2e711f3cab6b3e5bf45fc2d41f1472ec6d652c8ae0a6c342679cf6b0e4d4a64736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000004d601c7101fe1d271ee18340be5dc37ba016d9100000000000000000000000000000000000000000000000000000000000003e8
-----Decoded View---------------
Arg [0] : _royaltyReceiver (address): 0x04D601C7101fE1D271EE18340bE5dc37Ba016d91
Arg [1] : _royaltyFraction (uint96): 1000
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000004d601c7101fe1d271ee18340be5dc37ba016d91
Arg [1] : 00000000000000000000000000000000000000000000000000000000000003e8
Deployed Bytecode Sourcemap
99582:11935:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101806:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58076:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65014:268;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109936:232;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100374:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;105166:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53649:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;110328:272;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;108533:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32527:438;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;99742:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99976:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;103569:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;108650:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;109175:207;;;;;;;;;;;;;:::i;:::-;;100463:38;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;107575:724;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;110760:280;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;108773:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;104874:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99937:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59566:202;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100106:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100151:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;103848:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100062:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54833:283;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37755:103;;;;;;;;;;;;;:::i;:::-;;105868:280;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;106156:1411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99818:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;108991:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;105443:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99856:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100023:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37114:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58252:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109542:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99894:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;103673:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100508:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100420:36;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100331;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;104211:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;111200:314;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100279:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;108415:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;104594:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99774:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100201:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;102462:649;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;108885:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100557:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;102303:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;103276:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;105692:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66045:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38013:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;108307:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100236:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;101806:274;101937:4;101979:38;102005:11;101979:25;:38::i;:::-;:93;;;;102034:38;102060:11;102034:25;:38::i;:::-;101979:93;101959:113;;101806:274;;;:::o;58076:100::-;58130:13;58163:5;58156:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58076:100;:::o;65014:268::-;65135:7;65165:16;65173:7;65165;:16::i;:::-;65160:64;;65190:34;;;;;;;;;;;;;;65160:64;65244:15;:24;65260:7;65244:24;;;;;;;;;;;:30;;;;;;;;;;;;65237:37;;65014:268;;;:::o;109936:232::-;110076:8;110086:24;;;;;;;;;;;97948:7;97945:1138;;;98077:22;98071:4;98064:36;98178:9;98172:4;98165:23;98330:8;98326:2;98322:17;98318:2;98314:26;98308:4;98301:40;98690:4;98659;98628;98597;98545:25;98513:5;98476:241;98444:503;;98859:16;98853:4;98847;98832:44;98911:16;98905:4;98898:30;98444:503;99066:1;99060:4;99053:15;97945:1138;110128:32:::1;110142:8;110152:7;110128:13;:32::i;:::-;109936:232:::0;;;;:::o;100374:39::-;;;;;;;;;;;;;:::o;105166:269::-;101565:14;:23;101580:7;;;;101565:23;;;;;;;;;;;;;;;;;;;;;;;;;;;101561:52;;;101597:16;;;;;;;;;;;;;;101561:52;37000:13:::1;:11;:13::i;:::-;105333:1:::2;105307:14;105301:28;;;;;:::i;:::-;;;:33;105297:85;;105356:26;;;;;;;;;;;;;;105297:85;105412:15;;105395:14;:32;;;;;;;:::i;:::-;;105166:269:::0;;:::o;53649:323::-;53710:7;53938:15;:13;:15::i;:::-;53923:12;;53907:13;;:28;:46;53900:53;;53649:323;:::o;110328:272::-;110507:4;110513:24;;;;;;;;;;;95463:7;95460:1892;;;95676:8;95668:4;95664:2;95660:13;95656:2;95652:22;95649:36;95639:1698;;95991:22;95985:4;95978:36;96100:9;96094:4;96087:23;96193:8;96187:4;96180:22;96587:4;96552;96517;96482;96426:25;96390:5;96349:269;96313:555;;96772:16;96766:4;96760;96745:44;96828:16;96822:4;96815:30;96313:555;97316:1;97310:4;97303:15;95639:1698;95460:1892;110555:37:::1;110574:4;110580:2;110584:7;110555:18;:37::i;:::-;110328:272:::0;;;;;:::o;108533:109::-;37000:13;:11;:13::i;:::-;108624:10:::1;108608:13;:26;;;;108533:109:::0;:::o;32527:438::-;32622:7;32631;32651:26;32680:17;:26;32698:7;32680:26;;;;;;;;;;;32651:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32751:1;32723:30;;:7;:16;;;:30;;;32719:92;;32780:19;32770:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32719:92;32823:21;32887:17;:15;:17::i;:::-;32847:57;;32860:7;:23;;;32848:35;;:9;:35;;;;:::i;:::-;32847:57;;;;:::i;:::-;32823:81;;32925:7;:16;;;32943:13;32917:40;;;;;;32527:438;;;;;:::o;99742:25::-;;;;:::o;99976:40::-;100013:3;99976:40;:::o;103569:96::-;37000:13;:11;:13::i;:::-;103653:4:::1;103632:14;:18;103647:2;103632:18;;;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;103569:96:::0;:::o;108650:115::-;37000:13;:11;:13::i;:::-;108747:10:::1;108728:16;:29;;;;108650:115:::0;:::o;109175:207::-;37000:13;:11;:13::i;:::-;109226:12:::1;109252:10;109244:24;;109290:21;109244:82;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;109225:101;;;109342:7;109337:37;;109358:16;;;;;;;;;;;;;;109337:37;109214:168;109175:207::o:0;100463:38::-;;;;;;;;;;;;;;;;;;;;;;:::o;107575:724::-;101704:4;101682:26;;:6;:18;101689:10;101682:18;;;;;;;;;;;;;;;;;;;;;;;;;:26;;;101674:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;107738:4:::1;107718:24;;:16;;;;;;;;;;;:24;;;107710:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;107802:13;;107790:8;:25;;107782:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;100013:3;107888:8;107871:14;:12;:14::i;:::-;:25;;;;:::i;:::-;:39;;107849:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;107971:17;108002:9;;107991:8;:20;;;;:::i;:::-;107971:40;;108043:9;108030;:22;;108022:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;108094:19;108100:2;108104:8;108094:5;:19::i;:::-;108141:8;108124:13;;:25;;;;;;;:::i;:::-;;;;;;;;108171:5;108160:4;:8;108165:2;108160:8;;;;;;;;;;;;;;;;:16;;;;;;;;;;;;;;;;;;108203:9;108191;:21;108187:105;;;108237:10;108229:28;;:51;108270:9;108258;:21;;;;:::i;:::-;108229:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;108187:105;107699:600;107575:724:::0;;;:::o;110760:280::-;110943:4;110949:24;;;;;;;;;;;95463:7;95460:1892;;;95676:8;95668:4;95664:2;95660:13;95656:2;95652:22;95649:36;95639:1698;;95991:22;95985:4;95978:36;96100:9;96094:4;96087:23;96193:8;96187:4;96180:22;96587:4;96552;96517;96482;96426:25;96390:5;96349:269;96313:555;;96772:16;96766:4;96760;96745:44;96828:16;96822:4;96815:30;96313:555;97316:1;97310:4;97303:15;95639:1698;95460:1892;110991:41:::1;111014:4;111020:2;111024:7;110991:22;:41::i;:::-;110760:280:::0;;;;;:::o;108773:104::-;37000:13;:11;:13::i;:::-;108863:6:::1;108848:12;:21;;;;108773:104:::0;:::o;104874:155::-;101565:14;:23;101580:7;;;;101565:23;;;;;;;;;;;;;;;;;;;;;;;;;;;101561:52;;;101597:16;;;;;;;;;;;;;;101561:52;37000:13:::1;:11;:13::i;:::-;105010:11:::2;;104994:13;:27;;;;;;;:::i;:::-;;104874:155:::0;;:::o;99937:32::-;;;;:::o;59566:202::-;59683:7;59731:27;59750:7;59731:18;:27::i;:::-;59708:52;;59566:202;;;:::o;100106:38::-;;;;:::o;100151:43::-;;;;:::o;103848:171::-;37000:13;:11;:13::i;:::-;103948:4:::1;103929:23;;:6;:15;103936:7;103929:15;;;;;;;;;;;;;;;;;;;;;;;;;:23;;;103921:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;104006:5;103988:6;:15;103995:7;103988:15;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;103848:171:::0;:::o;100062:37::-;;;;:::o;54833:283::-;54950:7;54996:1;54979:19;;:5;:19;;;54975:60;;55007:28;;;;;;;;;;;;;;54975:60;48992:13;55053:18;:25;55072:5;55053:25;;;;;;;;;;;;;;;;:55;55046:62;;54833:283;;;:::o;37755:103::-;37000:13;:11;:13::i;:::-;37820:30:::1;37847:1;37820:18;:30::i;:::-;37755:103::o:0;105868:280::-;101565:14;:23;101580:7;;;;101565:23;;;;;;;;;;;;;;;;;;;;;;;;;;;101561:52;;;101597:16;;;;;;;;;;;;;;101561:52;37000:13:::1;:11;:13::i;:::-;100013:3:::2;106034:12;;106017:14;:12;:14::i;:::-;:29;;;;:::i;:::-;:43;;105995:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;106121:19;106127:2;106131:8;106121:5;:19::i;:::-;105868:280:::0;;:::o;106156:1411::-;101704:4;101682:26;;:6;:18;101689:10;101682:18;;;;;;;;;;;;;;;;;;;;;;;;;:26;;;101674:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;106363:4:::1;106343:24;;:16;;;;;;;;;;;:24;;;106335:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;106407:27;106446:16;;;;;;;;;;;106407:56;;106474:27;106513:16;;;;;;;;;;;106474:56;;106577:18;:28;;;106606:2;106577:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;106563:7;:11;106571:2;106563:11;;;;;;;;;;;;;;;;:46;:113;;;;106644:18;:28;;;106673:2;106644:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;106630:7;:11;106638:2;106630:11;;;;;;;;;;;;;;;;:46;106563:113;106541:205;;;;;;;;;;;;:::i;:::-;;;;;;;;;106806:16;;106794:8;106779:12;;:23;;;;:::i;:::-;:43;;106757:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;100013:3;106917:8;106900:14;:12;:14::i;:::-;:25;;;;:::i;:::-;:39;;106878:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;107000:12;107042:2;107046:8;107025:30;;;;;;;;;:::i;:::-;;;;;;;;;;;;;107015:41;;;;;;107000:56;;107089:49;107108:11;;107089:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;107121:10;;107133:4;107089:18;:49::i;:::-;107067:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;107201:17;107232:14;;107221:8;:25;;;;:::i;:::-;107201:45;;107278:9;107265;:22;;107257:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;107329:19;107335:2;107339:8;107329:5;:19::i;:::-;107375:8;107359:12;;:24;;;;;;;:::i;:::-;;;;;;;;107409:8;107394:7;:11;107402:2;107394:11;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;107439:5;107428:4;:8;107433:2;107428:8;;;;;;;;;;;;;;;;:16;;;;;;;;;;;;;;;;;;107471:9;107459;:21;107455:105;;;107505:10;107497:28;;:51;107538:9;107526;:21;;;;:::i;:::-;107497:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;107455:105;106324:1243;;;;106156:1411:::0;;;;;:::o;99818:31::-;;;;;;;;;;;;;:::o;108991:104::-;37000:13;:11;:13::i;:::-;109080:7:::1;109058:19;;:29;;;;;;;;;;;;;;;;;;108991:104:::0;:::o;105443:106::-;37000:13;:11;:13::i;:::-;105530:11:::1;105517:10;:24;;;;105443:106:::0;:::o;99856:31::-;;;;;;;;;;;;;:::o;100023:32::-;;;;:::o;37114:87::-;37160:7;37187:6;;;;;;;;;;;37180:13;;37114:87;:::o;58252:104::-;58308:13;58341:7;58334:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58252:104;:::o;109542:234::-;109673:8;109683:24;;;;;;;;;;;97948:7;97945:1138;;;98077:22;98071:4;98064:36;98178:9;98172:4;98165:23;98330:8;98326:2;98322:17;98318:2;98314:26;98308:4;98301:40;98690:4;98659;98628;98597;98545:25;98513:5;98476:241;98444:503;;98859:16;98853:4;98847;98832:44;98911:16;98905:4;98898:30;98444:503;99066:1;99060:4;99053:15;97945:1138;109725:43:::1;109749:8;109759;109725:23;:43::i;:::-;109542:234:::0;;;;:::o;99894:36::-;99929:1;99894:36;:::o;103673:167::-;37000:13;:11;:13::i;:::-;103773:5:::1;103754:24;;:6;:15;103761:7;103754:15;;;;;;;;;;;;;;;;;;;;;;;;;:24;;;103746:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;103828:4;103810:6;:15;103817:7;103810:15;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;103673:167:::0;:::o;100508:42::-;;;;;;;;;;;;;;;;;:::o;100420:36::-;;;;;;;;;;;;;;;;;;;;;;:::o;100331:::-;;;;;;;;;;;;;:::o;104211:160::-;101565:14;:23;101580:7;;;;101565:23;;;;;;;;;;;;;;;;;;;;;;;;;;;101561:52;;;101597:16;;;;;;;;;;;;;;101561:52;37000:13:::1;:11;:13::i;:::-;104358:5:::2;104331:24;;:32;;;;;;;;;;;;;;;;;;104211:160:::0;:::o;111200:314::-;111411:4;111417:24;;;;;;;;;;;95463:7;95460:1892;;;95676:8;95668:4;95664:2;95660:13;95656:2;95652:22;95649:36;95639:1698;;95991:22;95985:4;95978:36;96100:9;96094:4;96087:23;96193:8;96187:4;96180:22;96587:4;96552;96517;96482;96426:25;96390:5;96349:269;96313:555;;96772:16;96766:4;96760;96745:44;96828:16;96822:4;96815:30;96313:555;97316:1;97310:4;97303:15;95639:1698;95460:1892;111459:47:::1;111482:4;111488:2;111492:7;111501:4;111459:22;:47::i;:::-;111200:314:::0;;;;;;:::o;100279:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;108415:110::-;37000:13;:11;:13::i;:::-;108508:9:::1;108491:14;:26;;;;108415:110:::0;:::o;104594:170::-;37000:13;:11;:13::i;:::-;104711:45:::1;104730:8;104740:15;104711:18;:45::i;:::-;104594:170:::0;;:::o;99774:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;100201:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;102462:649::-;102580:13;102633:16;102641:7;102633;:16::i;:::-;102611:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;102737:28;102768:10;:8;:10::i;:::-;102737:41;;102840:1;102815:14;102809:28;:32;:294;;;;;;;;;;;;;;;;;102933:14;102974:25;102991:7;102974:16;:25::i;:::-;103026:13;102890:172;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;102809:294;102789:314;;;102462:649;;;:::o;108885:98::-;37000:13;:11;:13::i;:::-;108968:7:::1;108949:16;;:26;;;;;;;;;;;;;;;;;;108885:98:::0;:::o;100557:31::-;;;;:::o;102303:151::-;37000:13;:11;:13::i;:::-;102429:17:::1;102413:13;:33;;;;;;:::i;:::-;;102303:151:::0;:::o;103276:119::-;103338:7;103365:22;103379:7;103365:13;:22::i;:::-;103358:29;;103276:119;;;:::o;105692:168::-;101565:14;:23;101580:7;;;;101565:23;;;;;;;;;;;;;;;;;;;;;;;;;;;101561:52;;;101597:16;;;;;;;;;;;;;;101561:52;37000:13:::1;:11;:13::i;:::-;99929:1:::2;105764:14;:12;:14::i;:::-;:26;105760:62;;105799:23;;;;;;;;;;;;;;105760:62;105833:19;105839:2;99929:1;105833:5;:19::i;:::-;105692:168:::0;:::o;66045:214::-;66187:4;66216:18;:25;66235:5;66216:25;;;;;;;;;;;;;;;:35;66242:8;66216:35;;;;;;;;;;;;;;;;;;;;;;;;;66209:42;;66045:214;;;;:::o;38013:201::-;37000:13;:11;:13::i;:::-;38122:1:::1;38102:22;;:8;:22;;::::0;38094:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;38178:28;38197:8;38178:18;:28::i;:::-;38013:201:::0;:::o;108307:100::-;37000:13;:11;:13::i;:::-;108390:9:::1;108378;:21;;;;108307:100:::0;:::o;100236:36::-;;;;;;;;;;;;;:::o;57124:689::-;57254:4;57598:10;57583:25;;:11;:25;;;;:102;;;;57675:10;57660:25;;:11;:25;;;;57583:102;:179;;;;57752:10;57737:25;;:11;:25;;;;57583:179;57563:199;;57124:689;;;:::o;32257:215::-;32359:4;32398:26;32383:41;;;:11;:41;;;;:81;;;;32428:36;32452:11;32428:23;:36::i;:::-;32383:81;32376:88;;32257:215;;;:::o;66517:282::-;66582:4;66638:7;66619:15;:13;:15::i;:::-;:26;;:66;;;;;66672:13;;66662:7;:23;66619:66;:153;;;;;66771:1;49768:8;66723:17;:26;66741:7;66723:26;;;;;;;;;;;;:44;:49;66619:153;66599:173;;66517:282;;;:::o;64406:449::-;64536:13;64552:16;64560:7;64552;:16::i;:::-;64536:32;;64608:5;64585:28;;:19;:17;:19::i;:::-;:28;;;64581:175;;64633:44;64650:5;64657:19;:17;:19::i;:::-;64633:16;:44::i;:::-;64628:128;;64705:35;;;;;;;;;;;;;;64628:128;64581:175;64801:2;64768:15;:24;64784:7;64768:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;64839:7;64835:2;64819:28;;64828:5;64819:28;;;;;;;;;;;;64525:330;64406:449;;:::o;37279:132::-;37354:12;:10;:12::i;:::-;37343:23;;:7;:5;:7::i;:::-;:23;;;37335:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37279:132::o;53165:92::-;53221:7;53248:1;53241:8;;53165:92;:::o;68785:3003::-;68927:27;68957;68976:7;68957:18;:27::i;:::-;68927:57;;69042:4;69001:45;;69017:19;69001:45;;;68997:99;;69068:28;;;;;;;;;;;;;;68997:99;69124:27;69166:23;69203:35;69230:7;69203:26;:35::i;:::-;69109:129;;;;69352:134;69395:15;69429:4;69452:19;:17;:19::i;:::-;69352:24;:134::i;:::-;69333:287;;69516:43;69533:4;69539:19;:17;:19::i;:::-;69516:16;:43::i;:::-;69511:109;;69585:35;;;;;;;;;;;;;;69511:109;69333:287;69651:1;69637:16;;:2;:16;;;69633:52;;69662:23;;;;;;;;;;;;;;69633:52;69698:43;69720:4;69726:2;69730:7;69739:1;69698:21;:43::i;:::-;69834:15;69831:160;;;69974:1;69953:19;69946:30;69831:160;70371:18;:24;70390:4;70371:24;;;;;;;;;;;;;;;;70369:26;;;;;;;;;;;;70440:18;:22;70459:2;70440:22;;;;;;;;;;;;;;;;70438:24;;;;;;;;;;;70762:167;70799:2;70869:45;70884:4;70890:2;70894:19;70869:14;:45::i;:::-;50048:8;70820:94;70762:18;:167::i;:::-;70733:17;:26;70751:7;70733:26;;;;;;;;;;;:196;;;;71100:1;50048:8;71049:19;:47;:52;71045:627;;71122:19;71154:1;71144:7;:11;71122:33;;71311:1;71277:17;:30;71295:11;71277:30;;;;;;;;;;;;:35;71273:384;;71415:13;;71400:11;:28;71396:242;;71595:19;71562:17;:30;71580:11;71562:30;;;;;;;;;;;:52;;;;71396:242;71273:384;71103:569;71045:627;71719:7;71715:2;71700:27;;71709:4;71700:27;;;;;;;;;;;;71738:42;71759:4;71765:2;71769:7;71778:1;71738:20;:42::i;:::-;68916:2872;;;68785:3003;;;:::o;33247:97::-;33305:6;33331:5;33324:12;;33247:97;:::o;54070:296::-;54125:7;54332:15;:13;:15::i;:::-;54316:13;;:31;54309:38;;54070:296;:::o;76459:3021::-;76532:20;76555:13;;76532:36;;76595:1;76583:8;:13;76579:44;;76605:18;;;;;;;;;;;;;;76579:44;76636:61;76666:1;76670:2;76674:12;76688:8;76636:21;:61::i;:::-;77214:1;49130:2;77184:1;:26;;77183:32;77154:8;:62;77111:18;:22;77130:2;77111:22;;;;;;;;;;;;;;;;:105;;;;;;;;;;;77493:160;77530:2;77605:33;77628:1;77632:2;77636:1;77605:14;:33::i;:::-;77551:30;77572:8;77551:20;:30::i;:::-;:87;77493:18;:160::i;:::-;77459:17;:31;77477:12;77459:31;;;;;;;;;;;:194;;;;77670:16;77701:11;77730:8;77715:12;:23;77701:37;;78251:16;78247:2;78243:25;78231:37;;78623:12;78583:8;78542:1;78480:25;78421:1;78360;78333:335;78994:1;78980:12;78976:20;78934:346;79035:3;79026:7;79023:16;78934:346;;79253:7;79243:8;79240:1;79213:25;79210:1;79207;79202:59;79088:1;79079:7;79075:15;79064:26;;78934:346;;;78938:77;79325:1;79313:8;:13;79309:45;;79335:19;;;;;;;;;;;;;;79309:45;79387:3;79371:13;:19;;;;76885:2517;;79412:60;79441:1;79445:2;79449:12;79463:8;79412:20;:60::i;:::-;76521:2959;76459:3021;;:::o;71884:193::-;72030:39;72047:4;72053:2;72057:7;72030:39;;;;;;;;;;;;:16;:39::i;:::-;71884:193;;;:::o;60853:1307::-;60947:7;60972:12;60987:7;60972:22;;61055:4;61036:15;:13;:15::i;:::-;:23;61032:1061;;61089:13;;61082:4;:20;61078:1015;;;61127:14;61144:17;:23;61162:4;61144:23;;;;;;;;;;;;61127:40;;61261:1;49768:8;61233:6;:24;:29;61229:845;;61898:113;61915:1;61905:6;:11;61898:113;;61958:17;:25;61976:6;;;;;;;61958:25;;;;;;;;;;;;61949:34;;61898:113;;;62044:6;62037:13;;;;;;61229:845;61104:989;61078:1015;61032:1061;62121:31;;;;;;;;;;;;;;60853:1307;;;;:::o;38374:191::-;38448:16;38467:6;;;;;;;;;;;38448:25;;38493:8;38484:6;;:17;;;;;;;;;;;;;;;;;;38548:8;38517:40;;38538:8;38517:40;;;;;;;;;;;;38437:128;38374:191;:::o;546:796::-;637:4;654:20;677:4;654:27;;699:9;694:525;718:5;:12;714:1;:16;694:525;;;752:20;775:5;781:1;775:8;;;;;;;;:::i;:::-;;;;;;;;752:31;;820:12;804;:28;800:408;;974:12;988;957:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;947:55;;;;;;932:70;;800:408;;;1164:12;1178;1147:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1137:55;;;;;;1122:70;;800:408;737:482;732:3;;;;;:::i;:::-;;;;694:525;;;;1330:4;1314:12;:20;1307:27;;;546:796;;;;;:::o;65622:266::-;65801:8;65749:18;:39;65768:19;:17;:19::i;:::-;65749:39;;;;;;;;;;;;;;;:49;65789:8;65749:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;65861:8;65825:55;;65840:19;:17;:19::i;:::-;65825:55;;;65871:8;65825:55;;;;;;:::i;:::-;;;;;;;;65622:266;;:::o;72675:407::-;72850:31;72863:4;72869:2;72873:7;72850:12;:31::i;:::-;72914:1;72896:2;:14;;;:19;72892:183;;72935:56;72966:4;72972:2;72976:7;72985:5;72935:30;:56::i;:::-;72930:145;;73019:40;;;;;;;;;;;;;;72930:145;72892:183;72675:407;;;;:::o;33615:332::-;33734:17;:15;:17::i;:::-;33718:33;;:12;:33;;;;33710:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;33837:1;33817:22;;:8;:22;;;33809:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;33904:35;;;;;;;;33916:8;33904:35;;;;;;33926:12;33904:35;;;;;33882:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33615:332;;:::o;102181:114::-;102241:13;102274;102267:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;102181:114;:::o;16269:716::-;16325:13;16376:14;16413:1;16393:17;16404:5;16393:10;:17::i;:::-;:21;16376:38;;16429:20;16463:6;16452:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16429:41;;16485:11;16614:6;16610:2;16606:15;16598:6;16594:28;16587:35;;16651:288;16658:4;16651:288;;;16683:5;;;;;;;;16825:8;16820:2;16813:5;16809:14;16804:30;16799:3;16791:44;16881:2;16872:11;;;;;;:::i;:::-;;;;;16915:1;16906:5;:10;16651:288;16902:21;16651:288;16960:6;16953:13;;;;;16269:716;;;:::o;55198:204::-;55259:7;48992:13;49130:2;55300:18;:25;55319:5;55300:25;;;;;;;;;;;;;;;;:50;;55299:95;55279:115;;55198:204;;;:::o;29811:157::-;29896:4;29935:25;29920:40;;;:11;:40;;;;29913:47;;29811:157;;;:::o;89734:105::-;89794:7;89821:10;89814:17;;89734:105;:::o;35665:98::-;35718:7;35745:10;35738:17;;35665:98;:::o;67680:485::-;67782:27;67811:23;67852:38;67893:15;:24;67909:7;67893:24;;;;;;;;;;;67852:65;;68070:18;68047:41;;68127:19;68121:26;68102:45;;68032:126;67680:485;;;:::o;66908:659::-;67057:11;67222:16;67215:5;67211:28;67202:37;;67382:16;67371:9;67367:32;67354:45;;67532:15;67521:9;67518:30;67510:5;67499:9;67496:20;67493:56;67483:66;;66908:659;;;;;:::o;73744:159::-;;;;;:::o;89043:311::-;89178:7;89198:16;50172:3;89224:19;:41;;89198:68;;50172:3;89292:31;89303:4;89309:2;89313:9;89292:10;:31::i;:::-;89284:40;;:62;;89277:69;;;89043:311;;;;;:::o;62740:531::-;62847:14;63020:16;63013:5;63009:28;63000:37;;63232:5;63218:11;63193:23;63189:41;63186:52;63162:5;63141:112;63131:122;;62740:531;;;;:::o;74568:158::-;;;;;:::o;63373:356::-;63470:14;63708:1;63698:8;63695:15;63669:24;63665:46;63655:56;;63373:356;;;:::o;75166:831::-;75329:4;75388:2;75363:45;;;75427:19;:17;:19::i;:::-;75465:4;75488:7;75514:5;75363:171;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;75346:644;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75765:1;75748:6;:13;:18;75744:235;;75794:40;;;;;;;;;;;;;;75744:235;75937:6;75931:13;75922:6;75918:2;75914:15;75907:38;75346:644;75634:54;;;75607:81;;;:6;:81;;;;75583:105;;;75166:831;;;;;;:::o;13103:948::-;13156:7;13176:14;13193:1;13176:18;;13243:8;13234:5;:17;13230:106;;13281:8;13272:17;;;;;;:::i;:::-;;;;;13318:2;13308:12;;;;13230:106;13363:8;13354:5;:17;13350:106;;13401:8;13392:17;;;;;;:::i;:::-;;;;;13438:2;13428:12;;;;13350:106;13483:8;13474:5;:17;13470:106;;13521:8;13512:17;;;;;;:::i;:::-;;;;;13558:2;13548:12;;;;13470:106;13603:7;13594:5;:16;13590:103;;13640:7;13631:16;;;;;;:::i;:::-;;;;;13676:1;13666:11;;;;13590:103;13720:7;13711:5;:16;13707:103;;13757:7;13748:16;;;;;;:::i;:::-;;;;;13793:1;13783:11;;;;13707:103;13837:7;13828:5;:16;13824:103;;13874:7;13865:16;;;;;;:::i;:::-;;;;;13910:1;13900:11;;;;13824:103;13954:7;13945:5;:16;13941:68;;13992:1;13982:11;;;;13941:68;14037:6;14030:13;;;13103:948;;;:::o;88744:147::-;88881:6;88744:147;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::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:323::-;11454:6;11503:2;11491:9;11482:7;11478:23;11474:32;11471:119;;;11509:79;;:::i;:::-;11471:119;11629:1;11654:50;11696:7;11687:6;11676:9;11672:22;11654:50;:::i;:::-;11644:60;;11600:114;11398:323;;;;:::o;11727:122::-;11800:24;11818:5;11800:24;:::i;:::-;11793:5;11790:35;11780:63;;11839:1;11836;11829:12;11780:63;11727:122;:::o;11855:139::-;11901:5;11939:6;11926:20;11917:29;;11955:33;11982:5;11955:33;:::i;:::-;11855:139;;;;:::o;12000:329::-;12059:6;12108:2;12096:9;12087:7;12083:23;12079:32;12076:119;;;12114:79;;:::i;:::-;12076:119;12234:1;12259:53;12304:7;12295:6;12284:9;12280:22;12259:53;:::i;:::-;12249:63;;12205:117;12000:329;;;;:::o;12335:468::-;12400:6;12408;12457:2;12445:9;12436:7;12432:23;12428:32;12425:119;;;12463:79;;:::i;:::-;12425:119;12583:1;12608:53;12653:7;12644:6;12633:9;12629:22;12608:53;:::i;:::-;12598:63;;12554:117;12710:2;12736:50;12778:7;12769:6;12758:9;12754:22;12736:50;:::i;:::-;12726:60;;12681:115;12335:468;;;;;:::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:225::-;42152:34;42148:1;42140:6;42136:14;42129:58;42221:8;42216:2;42208:6;42204:15;42197:33;42012:225;:::o;42243:366::-;42385:3;42406:67;42470:2;42465:3;42406:67;:::i;:::-;42399:74;;42482:93;42571:3;42482:93;:::i;:::-;42600:2;42595:3;42591:12;42584:19;;42243:366;;;:::o;42615:419::-;42781:4;42819:2;42808:9;42804:18;42796:26;;42868:9;42862:4;42858:20;42854:1;42843:9;42839:17;42832:47;42896:131;43022:4;42896:131;:::i;:::-;42888:139;;42615:419;;;:::o;43040:182::-;43180:34;43176:1;43168:6;43164:14;43157:58;43040:182;:::o;43228:366::-;43370:3;43391:67;43455:2;43450:3;43391:67;:::i;:::-;43384:74;;43467:93;43556:3;43467:93;:::i;:::-;43585:2;43580:3;43576:12;43569:19;;43228:366;;;:::o;43600:419::-;43766:4;43804:2;43793:9;43789:18;43781:26;;43853:9;43847:4;43843:20;43839:1;43828:9;43824:17;43817:47;43881:131;44007:4;43881:131;:::i;:::-;43873:139;;43600:419;;;:::o;44025:180::-;44073:77;44070:1;44063:88;44170:4;44167:1;44160:15;44194:4;44191:1;44184:15;44211:79;44250:7;44279:5;44268:16;;44211:79;;;:::o;44296:157::-;44401:45;44421:24;44439:5;44421:24;:::i;:::-;44401:45;:::i;:::-;44396:3;44389:58;44296:157;;:::o;44459:397::-;44599:3;44614:75;44685:3;44676:6;44614:75;:::i;:::-;44714:2;44709:3;44705:12;44698:19;;44727:75;44798:3;44789:6;44727:75;:::i;:::-;44827:2;44822:3;44818:12;44811:19;;44847:3;44840:10;;44459:397;;;;;:::o;44862:233::-;44901:3;44924:24;44942:5;44924:24;:::i;:::-;44915:33;;44970:66;44963:5;44960:77;44957:103;;45040:18;;:::i;:::-;44957:103;45087:1;45080:5;45076:13;45069:20;;44862:233;;;:::o;45101:229::-;45241:34;45237:1;45229:6;45225:14;45218:58;45310:12;45305:2;45297:6;45293:15;45286:37;45101:229;:::o;45336:366::-;45478:3;45499:67;45563:2;45558:3;45499:67;:::i;:::-;45492:74;;45575:93;45664:3;45575:93;:::i;:::-;45693:2;45688:3;45684:12;45677:19;;45336:366;;;:::o;45708:419::-;45874:4;45912:2;45901:9;45897:18;45889:26;;45961:9;45955:4;45951:20;45947:1;45936:9;45932:17;45925:47;45989:131;46115:4;45989:131;:::i;:::-;45981:139;;45708:419;;;:::o;46133:175::-;46273:27;46269:1;46261:6;46257:14;46250:51;46133:175;:::o;46314:366::-;46456:3;46477:67;46541:2;46536:3;46477:67;:::i;:::-;46470:74;;46553:93;46642:3;46553:93;:::i;:::-;46671:2;46666:3;46662:12;46655:19;;46314:366;;;:::o;46686:419::-;46852:4;46890:2;46879:9;46875:18;46867:26;;46939:9;46933:4;46929:20;46925:1;46914:9;46910:17;46903:47;46967:131;47093:4;46967:131;:::i;:::-;46959:139;;46686:419;;;:::o;47111:98::-;47162:6;47196:5;47190:12;47180:22;;47111:98;;;:::o;47215:168::-;47298:11;47332:6;47327:3;47320:19;47372:4;47367:3;47363:14;47348:29;;47215:168;;;;:::o;47389:373::-;47475:3;47503:38;47535:5;47503:38;:::i;:::-;47557:70;47620:6;47615:3;47557:70;:::i;:::-;47550:77;;47636:65;47694:6;47689:3;47682:4;47675:5;47671:16;47636:65;:::i;:::-;47726:29;47748:6;47726:29;:::i;:::-;47721:3;47717:39;47710:46;;47479:283;47389:373;;;;:::o;47768:640::-;47963:4;48001:3;47990:9;47986:19;47978:27;;48015:71;48083:1;48072:9;48068:17;48059:6;48015:71;:::i;:::-;48096:72;48164:2;48153:9;48149:18;48140:6;48096:72;:::i;:::-;48178;48246:2;48235:9;48231:18;48222:6;48178:72;:::i;:::-;48297:9;48291:4;48287:20;48282:2;48271:9;48267:18;48260:48;48325:76;48396:4;48387:6;48325:76;:::i;:::-;48317:84;;47768:640;;;;;;;:::o;48414:141::-;48470:5;48501:6;48495:13;48486:22;;48517:32;48543:5;48517:32;:::i;:::-;48414:141;;;;:::o;48561:349::-;48630:6;48679:2;48667:9;48658:7;48654:23;48650:32;48647:119;;;48685:79;;:::i;:::-;48647:119;48805:1;48830:63;48885:7;48876:6;48865:9;48861:22;48830:63;:::i;:::-;48820:73;;48776:127;48561:349;;;;:::o
Swarm Source
ipfs://0cc2e711f3cab6b3e5bf45fc2d41f1472ec6d652c8ae0a6c342679cf6b0e4d4a
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.