ERC-721
Overview
Max Total Supply
999 OP
Holders
368
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
0 OPLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
OCEANPLAYGROUND
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-02-09 */ /* ________ ________ _______ ________ ________ ________ ___ ________ ___ ___ ________ ________ ________ ___ ___ ________ ________ |\ __ \|\ ____\|\ ___ \ |\ __ \|\ ___ \ |\ __ \|\ \ |\ __ \ |\ \ / /|\ ____\|\ __ \|\ __ \|\ \|\ \|\ ___ \|\ ___ \ \ \ \|\ \ \ \___|\ \ __/|\ \ \|\ \ \ \\ \ \ \ \ \|\ \ \ \ \ \ \|\ \ \ \ \/ / | \ \___|\ \ \|\ \ \ \|\ \ \ \\\ \ \ \\ \ \ \ \_|\ \ \ \ \\\ \ \ \ \ \ \_|/_\ \ __ \ \ \\ \ \ \ \ ____\ \ \ \ \ __ \ \ \ / / \ \ \ __\ \ _ _\ \ \\\ \ \ \\\ \ \ \\ \ \ \ \ \\ \ \ \ \\\ \ \ \____\ \ \_|\ \ \ \ \ \ \ \\ \ \ \ \ \___|\ \ \____\ \ \ \ \ \/ / / \ \ \|\ \ \ \\ \\ \ \\\ \ \ \\\ \ \ \\ \ \ \ \_\\ \ \ \_______\ \_______\ \_______\ \__\ \__\ \__\\ \__\ \ \__\ \ \_______\ \__\ \__\__/ / / \ \_______\ \__\\ _\\ \_______\ \_______\ \__\\ \__\ \_______\ \|_______|\|_______|\|_______|\|__|\|__|\|__| \|__| \|__| \|_______|\|__|\|__|\___/ / \|_______|\|__|\|__|\|_______|\|_______|\|__| \|__|\|_______| \|___|/ */ // SPDX-License-Identifier: MIT // File: operator-filter-registry/src/lib/Constants.sol pragma solidity ^0.8.17; address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E; address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6; // File: operator-filter-registry/src/IOperatorFilterRegistry.sol pragma solidity ^0.8.13; interface IOperatorFilterRegistry { /** * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns * true if supplied registrant address is not registered. */ function isOperatorAllowed(address registrant, address operator) external view returns (bool); /** * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner. */ function register(address registrant) external; /** * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes. */ function registerAndSubscribe(address registrant, address subscription) external; /** * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another * address without subscribing. */ function registerAndCopyEntries(address registrant, address registrantToCopy) external; /** * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner. * Note that this does not remove any filtered addresses or codeHashes. * Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes. */ function unregister(address addr) external; /** * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered. */ function updateOperator(address registrant, address operator, bool filtered) external; /** * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates. */ function updateOperators(address registrant, address[] calldata operators, bool filtered) external; /** * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered. */ function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; /** * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates. */ function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; /** * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous * subscription if present. * Note that accounts with subscriptions may go on to subscribe to other accounts - in this case, * subscriptions will not be forwarded. Instead the former subscription's existing entries will still be * used. */ function subscribe(address registrant, address registrantToSubscribe) external; /** * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes. */ function unsubscribe(address registrant, bool copyExistingEntries) external; /** * @notice Get the subscription address of a given registrant, if any. */ function subscriptionOf(address addr) external returns (address registrant); /** * @notice Get the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscribers(address registrant) external returns (address[] memory); /** * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscriberAt(address registrant, uint256 index) external returns (address); /** * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr. */ function copyEntriesOf(address registrant, address registrantToCopy) external; /** * @notice Returns true if operator is filtered by a given address or its subscription. */ function isOperatorFiltered(address registrant, address operator) external returns (bool); /** * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription. */ function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); /** * @notice Returns true if a codeHash is filtered by a given address or its subscription. */ function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); /** * @notice Returns a list of filtered operators for a given address or its subscription. */ function filteredOperators(address addr) external returns (address[] memory); /** * @notice Returns the set of filtered codeHashes for a given address or its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashes(address addr) external returns (bytes32[] memory); /** * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredOperatorAt(address registrant, uint256 index) external returns (address); /** * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); /** * @notice Returns true if an address has registered */ function isRegistered(address addr) external returns (bool); /** * @dev Convenience method to compute the code hash of an arbitrary contract */ function codeHashOf(address addr) external returns (bytes32); } // File: operator-filter-registry/src/OperatorFilterer.sol pragma solidity ^0.8.13; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. * Please note that if your token contract does not provide an owner with EIP-173, it must provide * administration methods on the contract itself to interact with the registry otherwise the subscription * will be locked to the options set during construction. */ abstract contract OperatorFilterer { /// @dev Emitted when an operator is not allowed. error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS); /// @dev The constructor that is called when the contract is being deployed. constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } /** * @dev A helper function to check if an operator is allowed. */ modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } /** * @dev A helper function to check if an operator approval is allowed. */ modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } /** * @dev A helper function to check if an operator is allowed. */ function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { // under normal circumstances, this function will revert rather than return false, but inheriting contracts // may specify their own OperatorFilterRegistry implementations, which may behave differently if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } } // File: operator-filter-registry/src/DefaultOperatorFilterer.sol pragma solidity ^0.8.13; /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. * @dev Please note that if your token contract does not provide an owner with EIP-173, it must provide * administration methods on the contract itself to interact with the registry otherwise the subscription * will be locked to the options set during construction. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { /// @dev The constructor that is called when the contract is being deployed. constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {} } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.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) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.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 `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); } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @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); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @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 0; } /** * @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) } } } // File: contracts/oceanplayground.sol /* ________ ________ _______ ________ ________ ________ ___ ________ ___ ___ ________ ________ ________ ___ ___ ________ ________ |\ __ \|\ ____\|\ ___ \ |\ __ \|\ ___ \ |\ __ \|\ \ |\ __ \ |\ \ / /|\ ____\|\ __ \|\ __ \|\ \|\ \|\ ___ \|\ ___ \ \ \ \|\ \ \ \___|\ \ __/|\ \ \|\ \ \ \\ \ \ \ \ \|\ \ \ \ \ \ \|\ \ \ \ \/ / | \ \___|\ \ \|\ \ \ \|\ \ \ \\\ \ \ \\ \ \ \ \_|\ \ \ \ \\\ \ \ \ \ \ \_|/_\ \ __ \ \ \\ \ \ \ \ ____\ \ \ \ \ __ \ \ \ / / \ \ \ __\ \ _ _\ \ \\\ \ \ \\\ \ \ \\ \ \ \ \ \\ \ \ \ \\\ \ \ \____\ \ \_|\ \ \ \ \ \ \ \\ \ \ \ \ \___|\ \ \____\ \ \ \ \ \/ / / \ \ \|\ \ \ \\ \\ \ \\\ \ \ \\\ \ \ \\ \ \ \ \_\\ \ \ \_______\ \_______\ \_______\ \__\ \__\ \__\\ \__\ \ \__\ \ \_______\ \__\ \__\__/ / / \ \_______\ \__\\ _\\ \_______\ \_______\ \__\\ \__\ \_______\ \|_______|\|_______|\|_______|\|__|\|__|\|__| \|__| \|__| \|_______|\|__|\|__|\___/ / \|_______|\|__|\|__|\|_______|\|_______|\|__| \|__|\|_______| \|___|/ */ pragma solidity >=0.8.9 <0.9.0; contract OCEANPLAYGROUND is ERC721A, Ownable, ReentrancyGuard, DefaultOperatorFilterer { using Strings for uint256; string public baseURI = "ipfs://bafybeicr3cwnlemdc37wdhqfxfhveidqjoi3m5mo5fgbvakbqqrqw7jdqa/"; string public baseExtension = ".json"; uint256 public Freecost = 0 ether; uint256 public cost = 0.00999 ether; uint256 public freeSupply = 99; uint256 public maxSupply = 999; uint256 public maxMintAmountFree = 3; uint256 public maxMintAmountPublic = 9; mapping(address => uint256) public addressFreeMintedBalance; uint256 public currentState = 0; constructor() ERC721A("OCEAN PLAYGROUND", "OP") {} ///////////////////////////// // CORE FUNCTIONALITY ///////////////////////////// function mint(uint256 _mintAmount) public payable { uint256 supply = totalSupply(); require(_mintAmount > 0, "need to mint at least 1 NFT"); if (msg.sender != owner()) { require(currentState > 0, "the contract is paused"); if (currentState == 1) { require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded"); require(_mintAmount <= maxMintAmountPublic, "Max mint amount per session exceeded" ); require(msg.value >= cost * _mintAmount, "insufficient funds"); } else if (currentState == 2) { uint256 ownerMintedCount = addressFreeMintedBalance[msg.sender]; require(supply + _mintAmount <= freeSupply, "max Free NFT limit exceeded"); require(_mintAmount <= maxMintAmountFree, "Max mint amount per session exceeded" ); require(ownerMintedCount + _mintAmount <= maxMintAmountFree, "max NFT per address exceeded" ); require(msg.value >= Freecost * _mintAmount, "insufficient funds"); } } _safeMint(msg.sender, _mintAmount); if (currentState == 2) { addressFreeMintedBalance[msg.sender] += _mintAmount; } } function Airdrop(uint256 _mintAmount, address _receiver) public onlyOwner { require(_mintAmount > 0, "need to mint at least 1 NFT"); require(totalSupply() + _mintAmount <= maxSupply, "max NFT limit exceeded"); _safeMint(_receiver, _mintAmount); } function mintableAmountForUser(address _user) public view returns (uint256) { if (currentState == 2) { return maxMintAmountFree - addressFreeMintedBalance[_user]; } return 0; } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function _startTokenId() internal view virtual override returns (uint256) { return 1; } 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, tokenId.toString(), baseExtension ) ) : ""; } ///////////////////////////// // CONTRACT MANAGEMENT ///////////////////////////// function setmaxMintAmountFree(uint256 _newmaxMintAmountFree) public onlyOwner { maxMintAmountFree = _newmaxMintAmountFree; } function setmaxMintAmountPaid(uint256 _newmaxMintAmount) public onlyOwner { maxMintAmountPublic = _newmaxMintAmount; } function setfreeSupply(uint256 _newfreeSupply) public onlyOwner { require( _newfreeSupply <= maxSupply, "maxSupply exceeded"); freeSupply = _newfreeSupply; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function setCost(uint256 _price) public onlyOwner { cost = _price; } function setFreeCost(uint256 _price) public onlyOwner { Freecost = _price; } function pause() public onlyOwner { currentState = 0; } function setPaidMint() public onlyOwner { currentState = 1; } function setFreeMint() public onlyOwner { currentState = 2; } function withdraw() public onlyOwner nonReentrant { (bool os, ) = payable(owner()).call{value: address(this).balance}(''); require(os); } ///////////////////////////// // OPENSEA FILTER REGISTRY ///////////////////////////// function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public payable override onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public payable override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public payable override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public payable override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","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"},{"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":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"Airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Freecost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressFreeMintedBalance","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":"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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"mintableAmountForUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"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":"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":"uint256","name":"_price","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setFreeCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPaidMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newfreeSupply","type":"uint256"}],"name":"setfreeSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmountFree","type":"uint256"}],"name":"setmaxMintAmountFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmountPaid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060800160405280604381526020016200446960439139600a90816200002e9190620006e3565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600b9081620000759190620006e3565b506000600c5566237dda214e6000600d556063600e556103e7600f55600360105560096011556000601355348015620000ad57600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280601081526020017f4f4345414e20504c415947524f554e44000000000000000000000000000000008152506040518060400160405280600281526020017f4f500000000000000000000000000000000000000000000000000000000000008152508160029081620001429190620006e3565b508060039081620001549190620006e3565b50620001656200039260201b60201c565b60008190555050506200018d620001816200039b60201b60201c565b620003a360201b60201c565b600160098190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200038a57801562000250576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620002169291906200080f565b600060405180830381600087803b1580156200023157600080fd5b505af115801562000246573d6000803e3d6000fd5b5050505062000389565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200030a576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002d09291906200080f565b600060405180830381600087803b158015620002eb57600080fd5b505af115801562000300573d6000803e3d6000fd5b5050505062000388565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200035391906200083c565b600060405180830381600087803b1580156200036e57600080fd5b505af115801562000383573d6000803e3d6000fd5b505050505b5b5b505062000859565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004eb57607f821691505b602082108103620005015762000500620004a3565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200056b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200052c565b6200057786836200052c565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005c4620005be620005b8846200058f565b62000599565b6200058f565b9050919050565b6000819050919050565b620005e083620005a3565b620005f8620005ef82620005cb565b84845462000539565b825550505050565b600090565b6200060f62000600565b6200061c818484620005d5565b505050565b5b8181101562000644576200063860008262000605565b60018101905062000622565b5050565b601f82111562000693576200065d8162000507565b62000668846200051c565b8101602085101562000678578190505b6200069062000687856200051c565b83018262000621565b50505b505050565b600082821c905092915050565b6000620006b86000198460080262000698565b1980831691505092915050565b6000620006d38383620006a5565b9150826002028217905092915050565b620006ee8262000469565b67ffffffffffffffff8111156200070a576200070962000474565b5b620007168254620004d2565b6200072382828562000648565b600060209050601f8311600181146200075b576000841562000746578287015190505b620007528582620006c5565b865550620007c2565b601f1984166200076b8662000507565b60005b8281101562000795578489015182556001820191506020850194506020810190506200076e565b86831015620007b55784890151620007b1601f891682620006a5565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620007f782620007ca565b9050919050565b6200080981620007ea565b82525050565b6000604082019050620008266000830185620007fe565b620008356020830184620007fe565b9392505050565b6000602082019050620008536000830184620007fe565b92915050565b613c0080620008696000396000f3fe6080604052600436106102515760003560e01c80637871e15411610139578063c6682862116100b6578063da3ef23f1161007a578063da3ef23f14610837578063ded3fda714610860578063e1f3763b1461088b578063e852ec9f146108a2578063e985e9c5146108cb578063f2fde38b1461090857610251565b8063c668286214610764578063c87b56dd1461078f578063d4ed763b146107cc578063d5abeb01146107e3578063d85894d41461080e57610251565b8063925501e6116100fd578063925501e6146106ad57806395d89b41146106d8578063a0712d6814610703578063a22cb4651461071f578063b88d4fde1461074857610251565b80637871e154146105dc5780637c6b172d146106055780638456cb5914610642578063897097ce146106595780638da5cb5b1461068257610251565b806323b872dd116101d257806344a0d68a1161019657806344a0d68a146104ce57806355f804b3146104f75780636352211e146105205780636c0360eb1461055d57806370a0823114610588578063715018a6146105c557610251565b806323b872dd1461042957806324a6ab0c146104455780633ccfd60b1461047057806341f434341461048757806342842e0e146104b257610251565b80630c3f6acf116102195780630c3f6acf1461035457806313faede61461037f57806317f7bece146103aa57806318160ddd146103d55780631a86854f1461040057610251565b806301ffc9a71461025657806306fdde031461029357806307656e33146102be578063081812fc146102fb578063095ea7b314610338575b600080fd5b34801561026257600080fd5b5061027d600480360381019061027891906128f6565b610931565b60405161028a919061293e565b60405180910390f35b34801561029f57600080fd5b506102a86109c3565b6040516102b591906129e9565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190612a69565b610a55565b6040516102f29190612aaf565b60405180910390f35b34801561030757600080fd5b50610322600480360381019061031d9190612af6565b610abf565b60405161032f9190612b32565b60405180910390f35b610352600480360381019061034d9190612b4d565b610b3e565b005b34801561036057600080fd5b50610369610b57565b6040516103769190612aaf565b60405180910390f35b34801561038b57600080fd5b50610394610b5d565b6040516103a19190612aaf565b60405180910390f35b3480156103b657600080fd5b506103bf610b63565b6040516103cc9190612aaf565b60405180910390f35b3480156103e157600080fd5b506103ea610b69565b6040516103f79190612aaf565b60405180910390f35b34801561040c57600080fd5b5061042760048036038101906104229190612af6565b610b80565b005b610443600480360381019061043e9190612b8d565b610bd7565b005b34801561045157600080fd5b5061045a610c26565b6040516104679190612aaf565b60405180910390f35b34801561047c57600080fd5b50610485610c2c565b005b34801561049357600080fd5b5061049c610cc4565b6040516104a99190612c3f565b60405180910390f35b6104cc60048036038101906104c79190612b8d565b610cd6565b005b3480156104da57600080fd5b506104f560048036038101906104f09190612af6565b610d25565b005b34801561050357600080fd5b5061051e60048036038101906105199190612d8f565b610d37565b005b34801561052c57600080fd5b5061054760048036038101906105429190612af6565b610d52565b6040516105549190612b32565b60405180910390f35b34801561056957600080fd5b50610572610d64565b60405161057f91906129e9565b60405180910390f35b34801561059457600080fd5b506105af60048036038101906105aa9190612a69565b610df2565b6040516105bc9190612aaf565b60405180910390f35b3480156105d157600080fd5b506105da610eaa565b005b3480156105e857600080fd5b5061060360048036038101906105fe9190612dd8565b610ebe565b005b34801561061157600080fd5b5061062c60048036038101906106279190612a69565b610f6e565b6040516106399190612aaf565b60405180910390f35b34801561064e57600080fd5b50610657610f86565b005b34801561066557600080fd5b50610680600480360381019061067b9190612af6565b610f98565b005b34801561068e57600080fd5b50610697610faa565b6040516106a49190612b32565b60405180910390f35b3480156106b957600080fd5b506106c2610fd4565b6040516106cf9190612aaf565b60405180910390f35b3480156106e457600080fd5b506106ed610fda565b6040516106fa91906129e9565b60405180910390f35b61071d60048036038101906107189190612af6565b61106c565b005b34801561072b57600080fd5b5061074660048036038101906107419190612e44565b611424565b005b610762600480360381019061075d9190612f25565b61143d565b005b34801561077057600080fd5b5061077961148e565b60405161078691906129e9565b60405180910390f35b34801561079b57600080fd5b506107b660048036038101906107b19190612af6565b61151c565b6040516107c391906129e9565b60405180910390f35b3480156107d857600080fd5b506107e16115c6565b005b3480156107ef57600080fd5b506107f86115d8565b6040516108059190612aaf565b60405180910390f35b34801561081a57600080fd5b5061083560048036038101906108309190612af6565b6115de565b005b34801561084357600080fd5b5061085e60048036038101906108599190612d8f565b6115f0565b005b34801561086c57600080fd5b5061087561160b565b6040516108829190612aaf565b60405180910390f35b34801561089757600080fd5b506108a0611611565b005b3480156108ae57600080fd5b506108c960048036038101906108c49190612af6565b611623565b005b3480156108d757600080fd5b506108f260048036038101906108ed9190612fa8565b611635565b6040516108ff919061293e565b60405180910390f35b34801561091457600080fd5b5061092f600480360381019061092a9190612a69565b6116c9565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061098c57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109bc5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546109d290613017565b80601f01602080910402602001604051908101604052809291908181526020018280546109fe90613017565b8015610a4b5780601f10610a2057610100808354040283529160200191610a4b565b820191906000526020600020905b815481529060010190602001808311610a2e57829003601f168201915b5050505050905090565b6000600260135403610ab557601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601054610aae9190613077565b9050610aba565b600090505b919050565b6000610aca8261174c565b610b00576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610b48816117ab565b610b5283836118a8565b505050565b60135481565b600d5481565b60115481565b6000610b736119ec565b6001546000540303905090565b610b886119f5565b600f54811115610bcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc4906130f7565b60405180910390fd5b80600e8190555050565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c1557610c14336117ab565b5b610c20848484611a73565b50505050565b600e5481565b610c346119f5565b610c3c611d95565b6000610c46610faa565b73ffffffffffffffffffffffffffffffffffffffff1647604051610c6990613148565b60006040518083038185875af1925050503d8060008114610ca6576040519150601f19603f3d011682016040523d82523d6000602084013e610cab565b606091505b5050905080610cb957600080fd5b50610cc2611de4565b565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d1457610d13336117ab565b5b610d1f848484611dee565b50505050565b610d2d6119f5565b80600d8190555050565b610d3f6119f5565b80600a9081610d4e91906132ff565b5050565b6000610d5d82611e0e565b9050919050565b600a8054610d7190613017565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9d90613017565b8015610dea5780601f10610dbf57610100808354040283529160200191610dea565b820191906000526020600020905b815481529060010190602001808311610dcd57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e59576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610eb26119f5565b610ebc6000611eda565b565b610ec66119f5565b60008211610f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f009061341d565b60405180910390fd5b600f5482610f15610b69565b610f1f919061343d565b1115610f60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f57906134bd565b60405180910390fd5b610f6a8183611fa0565b5050565b60126020528060005260406000206000915090505481565b610f8e6119f5565b6000601381905550565b610fa06119f5565b8060108190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60105481565b606060038054610fe990613017565b80601f016020809104026020016040519081016040528092919081815260200182805461101590613017565b80156110625780601f1061103757610100808354040283529160200191611062565b820191906000526020600020905b81548152906001019060200180831161104557829003601f168201915b5050505050905090565b6000611076610b69565b9050600082116110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b29061341d565b60405180910390fd5b6110c3610faa565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113b55760006013541161113a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113190613529565b60405180910390fd5b60016013540361122e57600f548282611153919061343d565b1115611194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118b906134bd565b60405180910390fd5b6011548211156111d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d0906135bb565b60405180910390fd5b81600d546111e791906135db565b341015611229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122090613669565b60405180910390fd5b6113b4565b6002601354036113b3576000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600e54838361128b919061343d565b11156112cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c3906136d5565b60405180910390fd5b601054831115611311576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611308906135bb565b60405180910390fd5b6010548382611320919061343d565b1115611361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135890613741565b60405180910390fd5b82600c5461136f91906135db565b3410156113b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a890613669565b60405180910390fd5b505b5b5b6113bf3383611fa0565b6002601354036114205781601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611418919061343d565b925050819055505b5050565b8161142e816117ab565b6114388383611fbe565b505050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461147b5761147a336117ab565b5b611487858585856120c9565b5050505050565b600b805461149b90613017565b80601f01602080910402602001604051908101604052809291908181526020018280546114c790613017565b80156115145780601f106114e957610100808354040283529160200191611514565b820191906000526020600020905b8154815290600101906020018083116114f757829003601f168201915b505050505081565b60606115278261174c565b611566576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155d906137d3565b60405180910390fd5b600061157061213c565b9050600081511161159057604051806020016040528060008152506115be565b8061159a846121ce565b600b6040516020016115ae939291906138b2565b6040516020818303038152906040525b915050919050565b6115ce6119f5565b6001601381905550565b600f5481565b6115e66119f5565b80600c8190555050565b6115f86119f5565b80600b908161160791906132ff565b5050565b600c5481565b6116196119f5565b6002601381905550565b61162b6119f5565b8060118190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116d16119f5565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173790613955565b60405180910390fd5b61174981611eda565b50565b6000816117576119ec565b11158015611766575060005482105b80156117a4575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156118a5576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611822929190613975565b602060405180830381865afa15801561183f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186391906139b3565b6118a457806040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161189b9190612b32565b60405180910390fd5b5b50565b60006118b382610d52565b90508073ffffffffffffffffffffffffffffffffffffffff166118d461229c565b73ffffffffffffffffffffffffffffffffffffffff161461193757611900816118fb61229c565b611635565b611936576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6119fd6122a4565b73ffffffffffffffffffffffffffffffffffffffff16611a1b610faa565b73ffffffffffffffffffffffffffffffffffffffff1614611a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6890613a2c565b60405180910390fd5b565b6000611a7e82611e0e565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611ae5576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611af1846122ac565b91509150611b078187611b0261229c565b6122d3565b611b5357611b1c86611b1761229c565b611635565b611b52576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611bb9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611bc68686866001612317565b8015611bd157600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611c9f85611c7b88888761231d565b7c020000000000000000000000000000000000000000000000000000000017612345565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611d255760006001850190506000600460008381526020019081526020016000205403611d23576000548114611d22578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d8d8686866001612370565b505050505050565b600260095403611dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd190613a98565b60405180910390fd5b6002600981905550565b6001600981905550565b611e098383836040518060200160405280600081525061143d565b505050565b60008082905080611e1d6119ec565b11611ea357600054811015611ea25760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611ea0575b60008103611e96576004600083600190039350838152602001908152602001600020549050611e6c565b8092505050611ed5565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611fba828260405180602001604052806000815250612376565b5050565b8060076000611fcb61229c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661207861229c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120bd919061293e565b60405180910390a35050565b6120d4848484610bd7565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612136576120ff84848484612413565b612135576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600a805461214b90613017565b80601f016020809104026020016040519081016040528092919081815260200182805461217790613017565b80156121c45780601f10612199576101008083540402835291602001916121c4565b820191906000526020600020905b8154815290600101906020018083116121a757829003601f168201915b5050505050905090565b6060600060016121dd84612563565b01905060008167ffffffffffffffff8111156121fc576121fb612c64565b5b6040519080825280601f01601f19166020018201604052801561222e5781602001600182028036833780820191505090505b509050600082602001820190505b600115612291578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161228557612284613ab8565b5b0494506000850361223c575b819350505050919050565b600033905090565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86123348686846126b6565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b61238083836126bf565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461240e57600080549050600083820390505b6123c06000868380600101945086612413565b6123f6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106123ad57816000541461240b57600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261243961229c565b8786866040518563ffffffff1660e01b815260040161245b9493929190613b3c565b6020604051808303816000875af192505050801561249757506040513d601f19601f820116820180604052508101906124949190613b9d565b60015b612510573d80600081146124c7576040519150601f19603f3d011682016040523d82523d6000602084013e6124cc565b606091505b506000815103612508576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106125c1577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816125b7576125b6613ab8565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106125fe576d04ee2d6d415b85acef810000000083816125f4576125f3613ab8565b5b0492506020810190505b662386f26fc10000831061262d57662386f26fc10000838161262357612622613ab8565b5b0492506010810190505b6305f5e1008310612656576305f5e100838161264c5761264b613ab8565b5b0492506008810190505b612710831061267b57612710838161267157612670613ab8565b5b0492506004810190505b6064831061269e576064838161269457612693613ab8565b5b0492506002810190505b600a83106126ad576001810190505b80915050919050565b60009392505050565b600080549050600082036126ff576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61270c6000848385612317565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061278383612774600086600061231d565b61277d8561287a565b17612345565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461282457808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506127e9565b506000820361285f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506128756000848385612370565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6128d38161289e565b81146128de57600080fd5b50565b6000813590506128f0816128ca565b92915050565b60006020828403121561290c5761290b612894565b5b600061291a848285016128e1565b91505092915050565b60008115159050919050565b61293881612923565b82525050565b6000602082019050612953600083018461292f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612993578082015181840152602081019050612978565b60008484015250505050565b6000601f19601f8301169050919050565b60006129bb82612959565b6129c58185612964565b93506129d5818560208601612975565b6129de8161299f565b840191505092915050565b60006020820190508181036000830152612a0381846129b0565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a3682612a0b565b9050919050565b612a4681612a2b565b8114612a5157600080fd5b50565b600081359050612a6381612a3d565b92915050565b600060208284031215612a7f57612a7e612894565b5b6000612a8d84828501612a54565b91505092915050565b6000819050919050565b612aa981612a96565b82525050565b6000602082019050612ac46000830184612aa0565b92915050565b612ad381612a96565b8114612ade57600080fd5b50565b600081359050612af081612aca565b92915050565b600060208284031215612b0c57612b0b612894565b5b6000612b1a84828501612ae1565b91505092915050565b612b2c81612a2b565b82525050565b6000602082019050612b476000830184612b23565b92915050565b60008060408385031215612b6457612b63612894565b5b6000612b7285828601612a54565b9250506020612b8385828601612ae1565b9150509250929050565b600080600060608486031215612ba657612ba5612894565b5b6000612bb486828701612a54565b9350506020612bc586828701612a54565b9250506040612bd686828701612ae1565b9150509250925092565b6000819050919050565b6000612c05612c00612bfb84612a0b565b612be0565b612a0b565b9050919050565b6000612c1782612bea565b9050919050565b6000612c2982612c0c565b9050919050565b612c3981612c1e565b82525050565b6000602082019050612c546000830184612c30565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612c9c8261299f565b810181811067ffffffffffffffff82111715612cbb57612cba612c64565b5b80604052505050565b6000612cce61288a565b9050612cda8282612c93565b919050565b600067ffffffffffffffff821115612cfa57612cf9612c64565b5b612d038261299f565b9050602081019050919050565b82818337600083830152505050565b6000612d32612d2d84612cdf565b612cc4565b905082815260208101848484011115612d4e57612d4d612c5f565b5b612d59848285612d10565b509392505050565b600082601f830112612d7657612d75612c5a565b5b8135612d86848260208601612d1f565b91505092915050565b600060208284031215612da557612da4612894565b5b600082013567ffffffffffffffff811115612dc357612dc2612899565b5b612dcf84828501612d61565b91505092915050565b60008060408385031215612def57612dee612894565b5b6000612dfd85828601612ae1565b9250506020612e0e85828601612a54565b9150509250929050565b612e2181612923565b8114612e2c57600080fd5b50565b600081359050612e3e81612e18565b92915050565b60008060408385031215612e5b57612e5a612894565b5b6000612e6985828601612a54565b9250506020612e7a85828601612e2f565b9150509250929050565b600067ffffffffffffffff821115612e9f57612e9e612c64565b5b612ea88261299f565b9050602081019050919050565b6000612ec8612ec384612e84565b612cc4565b905082815260208101848484011115612ee457612ee3612c5f565b5b612eef848285612d10565b509392505050565b600082601f830112612f0c57612f0b612c5a565b5b8135612f1c848260208601612eb5565b91505092915050565b60008060008060808587031215612f3f57612f3e612894565b5b6000612f4d87828801612a54565b9450506020612f5e87828801612a54565b9350506040612f6f87828801612ae1565b925050606085013567ffffffffffffffff811115612f9057612f8f612899565b5b612f9c87828801612ef7565b91505092959194509250565b60008060408385031215612fbf57612fbe612894565b5b6000612fcd85828601612a54565b9250506020612fde85828601612a54565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061302f57607f821691505b60208210810361304257613041612fe8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061308282612a96565b915061308d83612a96565b92508282039050818111156130a5576130a4613048565b5b92915050565b7f6d6178537570706c792065786365656465640000000000000000000000000000600082015250565b60006130e1601283612964565b91506130ec826130ab565b602082019050919050565b60006020820190508181036000830152613110816130d4565b9050919050565b600081905092915050565b50565b6000613132600083613117565b915061313d82613122565b600082019050919050565b600061315382613125565b9150819050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026131bf7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613182565b6131c98683613182565b95508019841693508086168417925050509392505050565b60006131fc6131f76131f284612a96565b612be0565b612a96565b9050919050565b6000819050919050565b613216836131e1565b61322a61322282613203565b84845461318f565b825550505050565b600090565b61323f613232565b61324a81848461320d565b505050565b5b8181101561326e57613263600082613237565b600181019050613250565b5050565b601f8211156132b3576132848161315d565b61328d84613172565b8101602085101561329c578190505b6132b06132a885613172565b83018261324f565b50505b505050565b600082821c905092915050565b60006132d6600019846008026132b8565b1980831691505092915050565b60006132ef83836132c5565b9150826002028217905092915050565b61330882612959565b67ffffffffffffffff81111561332157613320612c64565b5b61332b8254613017565b613336828285613272565b600060209050601f8311600181146133695760008415613357578287015190505b61336185826132e3565b8655506133c9565b601f1984166133778661315d565b60005b8281101561339f5784890151825560018201915060208501945060208101905061337a565b868310156133bc57848901516133b8601f8916826132c5565b8355505b6001600288020188555050505b505050505050565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b6000613407601b83612964565b9150613412826133d1565b602082019050919050565b60006020820190508181036000830152613436816133fa565b9050919050565b600061344882612a96565b915061345383612a96565b925082820190508082111561346b5761346a613048565b5b92915050565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b60006134a7601683612964565b91506134b282613471565b602082019050919050565b600060208201905081810360008301526134d68161349a565b9050919050565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b6000613513601683612964565b915061351e826134dd565b602082019050919050565b6000602082019050818103600083015261354281613506565b9050919050565b7f4d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b60006135a5602483612964565b91506135b082613549565b604082019050919050565b600060208201905081810360008301526135d481613598565b9050919050565b60006135e682612a96565b91506135f183612a96565b92508282026135ff81612a96565b9150828204841483151761361657613615613048565b5b5092915050565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b6000613653601283612964565b915061365e8261361d565b602082019050919050565b6000602082019050818103600083015261368281613646565b9050919050565b7f6d61782046726565204e4654206c696d69742065786365656465640000000000600082015250565b60006136bf601b83612964565b91506136ca82613689565b602082019050919050565b600060208201905081810360008301526136ee816136b2565b9050919050565b7f6d6178204e465420706572206164647265737320657863656564656400000000600082015250565b600061372b601c83612964565b9150613736826136f5565b602082019050919050565b6000602082019050818103600083015261375a8161371e565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006137bd602f83612964565b91506137c882613761565b604082019050919050565b600060208201905081810360008301526137ec816137b0565b9050919050565b600081905092915050565b600061380982612959565b61381381856137f3565b9350613823818560208601612975565b80840191505092915050565b6000815461383c81613017565b61384681866137f3565b945060018216600081146138615760018114613876576138a9565b60ff19831686528115158202860193506138a9565b61387f8561315d565b60005b838110156138a157815481890152600182019150602081019050613882565b838801955050505b50505092915050565b60006138be82866137fe565b91506138ca82856137fe565b91506138d6828461382f565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061393f602683612964565b915061394a826138e3565b604082019050919050565b6000602082019050818103600083015261396e81613932565b9050919050565b600060408201905061398a6000830185612b23565b6139976020830184612b23565b9392505050565b6000815190506139ad81612e18565b92915050565b6000602082840312156139c9576139c8612894565b5b60006139d78482850161399e565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613a16602083612964565b9150613a21826139e0565b602082019050919050565b60006020820190508181036000830152613a4581613a09565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613a82601f83612964565b9150613a8d82613a4c565b602082019050919050565b60006020820190508181036000830152613ab181613a75565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000613b0e82613ae7565b613b188185613af2565b9350613b28818560208601612975565b613b318161299f565b840191505092915050565b6000608082019050613b516000830187612b23565b613b5e6020830186612b23565b613b6b6040830185612aa0565b8181036060830152613b7d8184613b03565b905095945050505050565b600081519050613b97816128ca565b92915050565b600060208284031215613bb357613bb2612894565b5b6000613bc184828501613b88565b9150509291505056fea2646970667358221220b9dfb43d9bd7428c4f5e5e4e286ffe7dc3a846c87dbe5b9f43086f217c41aa0464736f6c63430008110033697066733a2f2f6261667962656963723363776e6c656d64633337776468716678666876656964716a6f69336d356d6f3566676276616b627171727177376a6471612f
Deployed Bytecode
0x6080604052600436106102515760003560e01c80637871e15411610139578063c6682862116100b6578063da3ef23f1161007a578063da3ef23f14610837578063ded3fda714610860578063e1f3763b1461088b578063e852ec9f146108a2578063e985e9c5146108cb578063f2fde38b1461090857610251565b8063c668286214610764578063c87b56dd1461078f578063d4ed763b146107cc578063d5abeb01146107e3578063d85894d41461080e57610251565b8063925501e6116100fd578063925501e6146106ad57806395d89b41146106d8578063a0712d6814610703578063a22cb4651461071f578063b88d4fde1461074857610251565b80637871e154146105dc5780637c6b172d146106055780638456cb5914610642578063897097ce146106595780638da5cb5b1461068257610251565b806323b872dd116101d257806344a0d68a1161019657806344a0d68a146104ce57806355f804b3146104f75780636352211e146105205780636c0360eb1461055d57806370a0823114610588578063715018a6146105c557610251565b806323b872dd1461042957806324a6ab0c146104455780633ccfd60b1461047057806341f434341461048757806342842e0e146104b257610251565b80630c3f6acf116102195780630c3f6acf1461035457806313faede61461037f57806317f7bece146103aa57806318160ddd146103d55780631a86854f1461040057610251565b806301ffc9a71461025657806306fdde031461029357806307656e33146102be578063081812fc146102fb578063095ea7b314610338575b600080fd5b34801561026257600080fd5b5061027d600480360381019061027891906128f6565b610931565b60405161028a919061293e565b60405180910390f35b34801561029f57600080fd5b506102a86109c3565b6040516102b591906129e9565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190612a69565b610a55565b6040516102f29190612aaf565b60405180910390f35b34801561030757600080fd5b50610322600480360381019061031d9190612af6565b610abf565b60405161032f9190612b32565b60405180910390f35b610352600480360381019061034d9190612b4d565b610b3e565b005b34801561036057600080fd5b50610369610b57565b6040516103769190612aaf565b60405180910390f35b34801561038b57600080fd5b50610394610b5d565b6040516103a19190612aaf565b60405180910390f35b3480156103b657600080fd5b506103bf610b63565b6040516103cc9190612aaf565b60405180910390f35b3480156103e157600080fd5b506103ea610b69565b6040516103f79190612aaf565b60405180910390f35b34801561040c57600080fd5b5061042760048036038101906104229190612af6565b610b80565b005b610443600480360381019061043e9190612b8d565b610bd7565b005b34801561045157600080fd5b5061045a610c26565b6040516104679190612aaf565b60405180910390f35b34801561047c57600080fd5b50610485610c2c565b005b34801561049357600080fd5b5061049c610cc4565b6040516104a99190612c3f565b60405180910390f35b6104cc60048036038101906104c79190612b8d565b610cd6565b005b3480156104da57600080fd5b506104f560048036038101906104f09190612af6565b610d25565b005b34801561050357600080fd5b5061051e60048036038101906105199190612d8f565b610d37565b005b34801561052c57600080fd5b5061054760048036038101906105429190612af6565b610d52565b6040516105549190612b32565b60405180910390f35b34801561056957600080fd5b50610572610d64565b60405161057f91906129e9565b60405180910390f35b34801561059457600080fd5b506105af60048036038101906105aa9190612a69565b610df2565b6040516105bc9190612aaf565b60405180910390f35b3480156105d157600080fd5b506105da610eaa565b005b3480156105e857600080fd5b5061060360048036038101906105fe9190612dd8565b610ebe565b005b34801561061157600080fd5b5061062c60048036038101906106279190612a69565b610f6e565b6040516106399190612aaf565b60405180910390f35b34801561064e57600080fd5b50610657610f86565b005b34801561066557600080fd5b50610680600480360381019061067b9190612af6565b610f98565b005b34801561068e57600080fd5b50610697610faa565b6040516106a49190612b32565b60405180910390f35b3480156106b957600080fd5b506106c2610fd4565b6040516106cf9190612aaf565b60405180910390f35b3480156106e457600080fd5b506106ed610fda565b6040516106fa91906129e9565b60405180910390f35b61071d60048036038101906107189190612af6565b61106c565b005b34801561072b57600080fd5b5061074660048036038101906107419190612e44565b611424565b005b610762600480360381019061075d9190612f25565b61143d565b005b34801561077057600080fd5b5061077961148e565b60405161078691906129e9565b60405180910390f35b34801561079b57600080fd5b506107b660048036038101906107b19190612af6565b61151c565b6040516107c391906129e9565b60405180910390f35b3480156107d857600080fd5b506107e16115c6565b005b3480156107ef57600080fd5b506107f86115d8565b6040516108059190612aaf565b60405180910390f35b34801561081a57600080fd5b5061083560048036038101906108309190612af6565b6115de565b005b34801561084357600080fd5b5061085e60048036038101906108599190612d8f565b6115f0565b005b34801561086c57600080fd5b5061087561160b565b6040516108829190612aaf565b60405180910390f35b34801561089757600080fd5b506108a0611611565b005b3480156108ae57600080fd5b506108c960048036038101906108c49190612af6565b611623565b005b3480156108d757600080fd5b506108f260048036038101906108ed9190612fa8565b611635565b6040516108ff919061293e565b60405180910390f35b34801561091457600080fd5b5061092f600480360381019061092a9190612a69565b6116c9565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061098c57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109bc5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546109d290613017565b80601f01602080910402602001604051908101604052809291908181526020018280546109fe90613017565b8015610a4b5780601f10610a2057610100808354040283529160200191610a4b565b820191906000526020600020905b815481529060010190602001808311610a2e57829003601f168201915b5050505050905090565b6000600260135403610ab557601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601054610aae9190613077565b9050610aba565b600090505b919050565b6000610aca8261174c565b610b00576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610b48816117ab565b610b5283836118a8565b505050565b60135481565b600d5481565b60115481565b6000610b736119ec565b6001546000540303905090565b610b886119f5565b600f54811115610bcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc4906130f7565b60405180910390fd5b80600e8190555050565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c1557610c14336117ab565b5b610c20848484611a73565b50505050565b600e5481565b610c346119f5565b610c3c611d95565b6000610c46610faa565b73ffffffffffffffffffffffffffffffffffffffff1647604051610c6990613148565b60006040518083038185875af1925050503d8060008114610ca6576040519150601f19603f3d011682016040523d82523d6000602084013e610cab565b606091505b5050905080610cb957600080fd5b50610cc2611de4565b565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d1457610d13336117ab565b5b610d1f848484611dee565b50505050565b610d2d6119f5565b80600d8190555050565b610d3f6119f5565b80600a9081610d4e91906132ff565b5050565b6000610d5d82611e0e565b9050919050565b600a8054610d7190613017565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9d90613017565b8015610dea5780601f10610dbf57610100808354040283529160200191610dea565b820191906000526020600020905b815481529060010190602001808311610dcd57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e59576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610eb26119f5565b610ebc6000611eda565b565b610ec66119f5565b60008211610f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f009061341d565b60405180910390fd5b600f5482610f15610b69565b610f1f919061343d565b1115610f60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f57906134bd565b60405180910390fd5b610f6a8183611fa0565b5050565b60126020528060005260406000206000915090505481565b610f8e6119f5565b6000601381905550565b610fa06119f5565b8060108190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60105481565b606060038054610fe990613017565b80601f016020809104026020016040519081016040528092919081815260200182805461101590613017565b80156110625780601f1061103757610100808354040283529160200191611062565b820191906000526020600020905b81548152906001019060200180831161104557829003601f168201915b5050505050905090565b6000611076610b69565b9050600082116110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b29061341d565b60405180910390fd5b6110c3610faa565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113b55760006013541161113a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113190613529565b60405180910390fd5b60016013540361122e57600f548282611153919061343d565b1115611194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118b906134bd565b60405180910390fd5b6011548211156111d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d0906135bb565b60405180910390fd5b81600d546111e791906135db565b341015611229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122090613669565b60405180910390fd5b6113b4565b6002601354036113b3576000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600e54838361128b919061343d565b11156112cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c3906136d5565b60405180910390fd5b601054831115611311576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611308906135bb565b60405180910390fd5b6010548382611320919061343d565b1115611361576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135890613741565b60405180910390fd5b82600c5461136f91906135db565b3410156113b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a890613669565b60405180910390fd5b505b5b5b6113bf3383611fa0565b6002601354036114205781601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611418919061343d565b925050819055505b5050565b8161142e816117ab565b6114388383611fbe565b505050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461147b5761147a336117ab565b5b611487858585856120c9565b5050505050565b600b805461149b90613017565b80601f01602080910402602001604051908101604052809291908181526020018280546114c790613017565b80156115145780601f106114e957610100808354040283529160200191611514565b820191906000526020600020905b8154815290600101906020018083116114f757829003601f168201915b505050505081565b60606115278261174c565b611566576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155d906137d3565b60405180910390fd5b600061157061213c565b9050600081511161159057604051806020016040528060008152506115be565b8061159a846121ce565b600b6040516020016115ae939291906138b2565b6040516020818303038152906040525b915050919050565b6115ce6119f5565b6001601381905550565b600f5481565b6115e66119f5565b80600c8190555050565b6115f86119f5565b80600b908161160791906132ff565b5050565b600c5481565b6116196119f5565b6002601381905550565b61162b6119f5565b8060118190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116d16119f5565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173790613955565b60405180910390fd5b61174981611eda565b50565b6000816117576119ec565b11158015611766575060005482105b80156117a4575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156118a5576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611822929190613975565b602060405180830381865afa15801561183f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186391906139b3565b6118a457806040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161189b9190612b32565b60405180910390fd5b5b50565b60006118b382610d52565b90508073ffffffffffffffffffffffffffffffffffffffff166118d461229c565b73ffffffffffffffffffffffffffffffffffffffff161461193757611900816118fb61229c565b611635565b611936576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6119fd6122a4565b73ffffffffffffffffffffffffffffffffffffffff16611a1b610faa565b73ffffffffffffffffffffffffffffffffffffffff1614611a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6890613a2c565b60405180910390fd5b565b6000611a7e82611e0e565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611ae5576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611af1846122ac565b91509150611b078187611b0261229c565b6122d3565b611b5357611b1c86611b1761229c565b611635565b611b52576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611bb9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611bc68686866001612317565b8015611bd157600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611c9f85611c7b88888761231d565b7c020000000000000000000000000000000000000000000000000000000017612345565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611d255760006001850190506000600460008381526020019081526020016000205403611d23576000548114611d22578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611d8d8686866001612370565b505050505050565b600260095403611dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd190613a98565b60405180910390fd5b6002600981905550565b6001600981905550565b611e098383836040518060200160405280600081525061143d565b505050565b60008082905080611e1d6119ec565b11611ea357600054811015611ea25760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611ea0575b60008103611e96576004600083600190039350838152602001908152602001600020549050611e6c565b8092505050611ed5565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611fba828260405180602001604052806000815250612376565b5050565b8060076000611fcb61229c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661207861229c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120bd919061293e565b60405180910390a35050565b6120d4848484610bd7565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612136576120ff84848484612413565b612135576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600a805461214b90613017565b80601f016020809104026020016040519081016040528092919081815260200182805461217790613017565b80156121c45780601f10612199576101008083540402835291602001916121c4565b820191906000526020600020905b8154815290600101906020018083116121a757829003601f168201915b5050505050905090565b6060600060016121dd84612563565b01905060008167ffffffffffffffff8111156121fc576121fb612c64565b5b6040519080825280601f01601f19166020018201604052801561222e5781602001600182028036833780820191505090505b509050600082602001820190505b600115612291578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161228557612284613ab8565b5b0494506000850361223c575b819350505050919050565b600033905090565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86123348686846126b6565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b61238083836126bf565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461240e57600080549050600083820390505b6123c06000868380600101945086612413565b6123f6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106123ad57816000541461240b57600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261243961229c565b8786866040518563ffffffff1660e01b815260040161245b9493929190613b3c565b6020604051808303816000875af192505050801561249757506040513d601f19601f820116820180604052508101906124949190613b9d565b60015b612510573d80600081146124c7576040519150601f19603f3d011682016040523d82523d6000602084013e6124cc565b606091505b506000815103612508576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106125c1577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816125b7576125b6613ab8565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106125fe576d04ee2d6d415b85acef810000000083816125f4576125f3613ab8565b5b0492506020810190505b662386f26fc10000831061262d57662386f26fc10000838161262357612622613ab8565b5b0492506010810190505b6305f5e1008310612656576305f5e100838161264c5761264b613ab8565b5b0492506008810190505b612710831061267b57612710838161267157612670613ab8565b5b0492506004810190505b6064831061269e576064838161269457612693613ab8565b5b0492506002810190505b600a83106126ad576001810190505b80915050919050565b60009392505050565b600080549050600082036126ff576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61270c6000848385612317565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061278383612774600086600061231d565b61277d8561287a565b17612345565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461282457808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506127e9565b506000820361285f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506128756000848385612370565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6128d38161289e565b81146128de57600080fd5b50565b6000813590506128f0816128ca565b92915050565b60006020828403121561290c5761290b612894565b5b600061291a848285016128e1565b91505092915050565b60008115159050919050565b61293881612923565b82525050565b6000602082019050612953600083018461292f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612993578082015181840152602081019050612978565b60008484015250505050565b6000601f19601f8301169050919050565b60006129bb82612959565b6129c58185612964565b93506129d5818560208601612975565b6129de8161299f565b840191505092915050565b60006020820190508181036000830152612a0381846129b0565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a3682612a0b565b9050919050565b612a4681612a2b565b8114612a5157600080fd5b50565b600081359050612a6381612a3d565b92915050565b600060208284031215612a7f57612a7e612894565b5b6000612a8d84828501612a54565b91505092915050565b6000819050919050565b612aa981612a96565b82525050565b6000602082019050612ac46000830184612aa0565b92915050565b612ad381612a96565b8114612ade57600080fd5b50565b600081359050612af081612aca565b92915050565b600060208284031215612b0c57612b0b612894565b5b6000612b1a84828501612ae1565b91505092915050565b612b2c81612a2b565b82525050565b6000602082019050612b476000830184612b23565b92915050565b60008060408385031215612b6457612b63612894565b5b6000612b7285828601612a54565b9250506020612b8385828601612ae1565b9150509250929050565b600080600060608486031215612ba657612ba5612894565b5b6000612bb486828701612a54565b9350506020612bc586828701612a54565b9250506040612bd686828701612ae1565b9150509250925092565b6000819050919050565b6000612c05612c00612bfb84612a0b565b612be0565b612a0b565b9050919050565b6000612c1782612bea565b9050919050565b6000612c2982612c0c565b9050919050565b612c3981612c1e565b82525050565b6000602082019050612c546000830184612c30565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612c9c8261299f565b810181811067ffffffffffffffff82111715612cbb57612cba612c64565b5b80604052505050565b6000612cce61288a565b9050612cda8282612c93565b919050565b600067ffffffffffffffff821115612cfa57612cf9612c64565b5b612d038261299f565b9050602081019050919050565b82818337600083830152505050565b6000612d32612d2d84612cdf565b612cc4565b905082815260208101848484011115612d4e57612d4d612c5f565b5b612d59848285612d10565b509392505050565b600082601f830112612d7657612d75612c5a565b5b8135612d86848260208601612d1f565b91505092915050565b600060208284031215612da557612da4612894565b5b600082013567ffffffffffffffff811115612dc357612dc2612899565b5b612dcf84828501612d61565b91505092915050565b60008060408385031215612def57612dee612894565b5b6000612dfd85828601612ae1565b9250506020612e0e85828601612a54565b9150509250929050565b612e2181612923565b8114612e2c57600080fd5b50565b600081359050612e3e81612e18565b92915050565b60008060408385031215612e5b57612e5a612894565b5b6000612e6985828601612a54565b9250506020612e7a85828601612e2f565b9150509250929050565b600067ffffffffffffffff821115612e9f57612e9e612c64565b5b612ea88261299f565b9050602081019050919050565b6000612ec8612ec384612e84565b612cc4565b905082815260208101848484011115612ee457612ee3612c5f565b5b612eef848285612d10565b509392505050565b600082601f830112612f0c57612f0b612c5a565b5b8135612f1c848260208601612eb5565b91505092915050565b60008060008060808587031215612f3f57612f3e612894565b5b6000612f4d87828801612a54565b9450506020612f5e87828801612a54565b9350506040612f6f87828801612ae1565b925050606085013567ffffffffffffffff811115612f9057612f8f612899565b5b612f9c87828801612ef7565b91505092959194509250565b60008060408385031215612fbf57612fbe612894565b5b6000612fcd85828601612a54565b9250506020612fde85828601612a54565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061302f57607f821691505b60208210810361304257613041612fe8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061308282612a96565b915061308d83612a96565b92508282039050818111156130a5576130a4613048565b5b92915050565b7f6d6178537570706c792065786365656465640000000000000000000000000000600082015250565b60006130e1601283612964565b91506130ec826130ab565b602082019050919050565b60006020820190508181036000830152613110816130d4565b9050919050565b600081905092915050565b50565b6000613132600083613117565b915061313d82613122565b600082019050919050565b600061315382613125565b9150819050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026131bf7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613182565b6131c98683613182565b95508019841693508086168417925050509392505050565b60006131fc6131f76131f284612a96565b612be0565b612a96565b9050919050565b6000819050919050565b613216836131e1565b61322a61322282613203565b84845461318f565b825550505050565b600090565b61323f613232565b61324a81848461320d565b505050565b5b8181101561326e57613263600082613237565b600181019050613250565b5050565b601f8211156132b3576132848161315d565b61328d84613172565b8101602085101561329c578190505b6132b06132a885613172565b83018261324f565b50505b505050565b600082821c905092915050565b60006132d6600019846008026132b8565b1980831691505092915050565b60006132ef83836132c5565b9150826002028217905092915050565b61330882612959565b67ffffffffffffffff81111561332157613320612c64565b5b61332b8254613017565b613336828285613272565b600060209050601f8311600181146133695760008415613357578287015190505b61336185826132e3565b8655506133c9565b601f1984166133778661315d565b60005b8281101561339f5784890151825560018201915060208501945060208101905061337a565b868310156133bc57848901516133b8601f8916826132c5565b8355505b6001600288020188555050505b505050505050565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b6000613407601b83612964565b9150613412826133d1565b602082019050919050565b60006020820190508181036000830152613436816133fa565b9050919050565b600061344882612a96565b915061345383612a96565b925082820190508082111561346b5761346a613048565b5b92915050565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b60006134a7601683612964565b91506134b282613471565b602082019050919050565b600060208201905081810360008301526134d68161349a565b9050919050565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b6000613513601683612964565b915061351e826134dd565b602082019050919050565b6000602082019050818103600083015261354281613506565b9050919050565b7f4d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b60006135a5602483612964565b91506135b082613549565b604082019050919050565b600060208201905081810360008301526135d481613598565b9050919050565b60006135e682612a96565b91506135f183612a96565b92508282026135ff81612a96565b9150828204841483151761361657613615613048565b5b5092915050565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b6000613653601283612964565b915061365e8261361d565b602082019050919050565b6000602082019050818103600083015261368281613646565b9050919050565b7f6d61782046726565204e4654206c696d69742065786365656465640000000000600082015250565b60006136bf601b83612964565b91506136ca82613689565b602082019050919050565b600060208201905081810360008301526136ee816136b2565b9050919050565b7f6d6178204e465420706572206164647265737320657863656564656400000000600082015250565b600061372b601c83612964565b9150613736826136f5565b602082019050919050565b6000602082019050818103600083015261375a8161371e565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006137bd602f83612964565b91506137c882613761565b604082019050919050565b600060208201905081810360008301526137ec816137b0565b9050919050565b600081905092915050565b600061380982612959565b61381381856137f3565b9350613823818560208601612975565b80840191505092915050565b6000815461383c81613017565b61384681866137f3565b945060018216600081146138615760018114613876576138a9565b60ff19831686528115158202860193506138a9565b61387f8561315d565b60005b838110156138a157815481890152600182019150602081019050613882565b838801955050505b50505092915050565b60006138be82866137fe565b91506138ca82856137fe565b91506138d6828461382f565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061393f602683612964565b915061394a826138e3565b604082019050919050565b6000602082019050818103600083015261396e81613932565b9050919050565b600060408201905061398a6000830185612b23565b6139976020830184612b23565b9392505050565b6000815190506139ad81612e18565b92915050565b6000602082840312156139c9576139c8612894565b5b60006139d78482850161399e565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613a16602083612964565b9150613a21826139e0565b602082019050919050565b60006020820190508181036000830152613a4581613a09565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613a82601f83612964565b9150613a8d82613a4c565b602082019050919050565b60006020820190508181036000830152613ab181613a75565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000613b0e82613ae7565b613b188185613af2565b9350613b28818560208601612975565b613b318161299f565b840191505092915050565b6000608082019050613b516000830187612b23565b613b5e6020830186612b23565b613b6b6040830185612aa0565b8181036060830152613b7d8184613b03565b905095945050505050565b600081519050613b97816128ca565b92915050565b600060208284031215613bb357613bb2612894565b5b6000613bc184828501613b88565b9150509291505056fea2646970667358221220b9dfb43d9bd7428c4f5e5e4e286ffe7dc3a846c87dbe5b9f43086f217c41aa0464736f6c63430008110033
Deployed Bytecode Sourcemap
87740:5734:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53072:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53974:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90103:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60465:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92687:165;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;88330:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88052:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88211:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49725:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91362:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92860:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;88094:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92230:160;;;;;;;;;;;;;:::i;:::-;;9577:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93039:179;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91799:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91551:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55367:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87868:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50909:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33851:103;;;;;;;;;;;;;:::i;:::-;;89823:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;88258:59;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91987:69;;;;;;;;;;;;;:::i;:::-;;91076:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33203:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88168:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54150:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88529:1285;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92503:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93226:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87968:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90563:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92064:75;;;;;;;;;;;;;:::i;:::-;;88131:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91889:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91663:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;88012:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92147:75;;;;;;;;;;;;;:::i;:::-;;91222:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61414:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34109:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53072:639;53157:4;53496:10;53481:25;;:11;:25;;;;:102;;;;53573:10;53558:25;;:11;:25;;;;53481:102;:179;;;;53650:10;53635:25;;:11;:25;;;;53481:179;53461:199;;53072:639;;;:::o;53974:100::-;54028:13;54061:5;54054:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53974:100;:::o;90103:225::-;90170:7;90214:1;90198:12;;:17;90194:108;;90259:24;:31;90284:5;90259:31;;;;;;;;;;;;;;;;90239:17;;:51;;;;:::i;:::-;90232:58;;;;90194:108;90319:1;90312:8;;90103:225;;;;:::o;60465:218::-;60541:7;60566:16;60574:7;60566;:16::i;:::-;60561:64;;60591:34;;;;;;;;;;;;;;60561:64;60645:15;:24;60661:7;60645:24;;;;;;;;;;;:30;;;;;;;;;;;;60638:37;;60465:218;;;:::o;92687:165::-;92791:8;11359:30;11380:8;11359:20;:30::i;:::-;92812:32:::1;92826:8;92836:7;92812:13;:32::i;:::-;92687:165:::0;;;:::o;88330:31::-;;;;:::o;88052:35::-;;;;:::o;88211:38::-;;;;:::o;49725:323::-;49786:7;50014:15;:13;:15::i;:::-;49999:12;;49983:13;;:28;:46;49976:53;;49725:323;:::o;91362:180::-;33089:13;:11;:13::i;:::-;91464:9:::1;;91446:14;:27;;91437:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;91520:14;91507:10;:27;;;;91362:180:::0;:::o;92860:171::-;92969:4;11093:10;11085:18;;:4;:18;;;11081:83;;11120:32;11141:10;11120:20;:32::i;:::-;11081:83;92986:37:::1;93005:4;93011:2;93015:7;92986:18;:37::i;:::-;92860:171:::0;;;;:::o;88094:30::-;;;;:::o;92230:160::-;33089:13;:11;:13::i;:::-;30474:21:::1;:19;:21::i;:::-;92292:7:::2;92313;:5;:7::i;:::-;92305:21;;92334;92305:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;92291:69;;;92379:2;92371:11;;;::::0;::::2;;92280:110;30518:20:::1;:18;:20::i;:::-;92230:160::o:0;9577:143::-;1993:42;9577:143;:::o;93039:179::-;93152:4;11093:10;11085:18;;:4;:18;;;11081:83;;11120:32;11141:10;11120:20;:32::i;:::-;11081:83;93169:41:::1;93192:4;93198:2;93202:7;93169:22;:41::i;:::-;93039:179:::0;;;;:::o;91799:82::-;33089:13;:11;:13::i;:::-;91867:6:::1;91860:4;:13;;;;91799:82:::0;:::o;91551:104::-;33089:13;:11;:13::i;:::-;91636:11:::1;91626:7;:21;;;;;;:::i;:::-;;91551:104:::0;:::o;55367:152::-;55439:7;55482:27;55501:7;55482:18;:27::i;:::-;55459:52;;55367:152;;;:::o;87868:93::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50909:233::-;50981:7;51022:1;51005:19;;:5;:19;;;51001:60;;51033:28;;;;;;;;;;;;;;51001:60;45068:13;51079:18;:25;51098:5;51079:25;;;;;;;;;;;;;;;;:55;51072:62;;50909:233;;;:::o;33851:103::-;33089:13;:11;:13::i;:::-;33916:30:::1;33943:1;33916:18;:30::i;:::-;33851:103::o:0;89823:272::-;33089:13;:11;:13::i;:::-;89927:1:::1;89913:11;:15;89905:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;90007:9;;89992:11;89976:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;89968:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;90054:33;90064:9;90075:11;90054:9;:33::i;:::-;89823:272:::0;;:::o;88258:59::-;;;;;;;;;;;;;;;;;:::o;91987:69::-;33089:13;:11;:13::i;:::-;92047:1:::1;92032:12;:16;;;;91987:69::o:0;91076:138::-;33089:13;:11;:13::i;:::-;91185:21:::1;91165:17;:41;;;;91076:138:::0;:::o;33203:87::-;33249:7;33276:6;;;;;;;;;;;33269:13;;33203:87;:::o;88168:36::-;;;;:::o;54150:104::-;54206:13;54239:7;54232:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54150:104;:::o;88529:1285::-;88590:14;88607:13;:11;:13::i;:::-;88590:30;;88653:1;88639:11;:15;88631:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;88715:7;:5;:7::i;:::-;88701:21;;:10;:21;;;88697:951;;88762:1;88747:12;;:16;88739:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;88829:1;88813:12;;:17;88809:828;;88883:9;;88868:11;88859:6;:20;;;;:::i;:::-;:33;;88851:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;88961:19;;88946:11;:34;;88938:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;89069:11;89062:4;;:18;;;;:::i;:::-;89049:9;:31;;89041:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;88809:828;;;89145:1;89129:12;;:17;89125:512;;89167:24;89194;:36;89219:10;89194:36;;;;;;;;;;;;;;;;89167:63;;89281:10;;89266:11;89257:6;:20;;;;:::i;:::-;:34;;89249:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;89365:17;;89350:11;:32;;89342:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;89485:17;;89470:11;89451:16;:30;;;;:::i;:::-;:51;;89443:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;89587:11;89576:8;;:22;;;;:::i;:::-;89563:9;:35;;89555:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;89148:489;89125:512;88809:828;88697:951;89660:34;89670:10;89682:11;89660:9;:34::i;:::-;89726:1;89710:12;;:17;89706:101;;89784:11;89744:24;:36;89769:10;89744:36;;;;;;;;;;;;;;;;:51;;;;;;;:::i;:::-;;;;;;;;89706:101;88579:1235;88529:1285;:::o;92503:176::-;92607:8;11359:30;11380:8;11359:20;:30::i;:::-;92628:43:::1;92652:8;92662;92628:23;:43::i;:::-;92503:176:::0;;;:::o;93226:245::-;93394:4;11093:10;11085:18;;:4;:18;;;11081:83;;11120:32;11141:10;11120:20;:32::i;:::-;11081:83;93416:47:::1;93439:4;93445:2;93449:7;93458:4;93416:22;:47::i;:::-;93226:245:::0;;;;;:::o;87968:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;90563:404::-;90636:13;90671:16;90679:7;90671;:16::i;:::-;90662:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;90751:28;90782:10;:8;:10::i;:::-;90751:41;;90854:1;90829:14;90823:28;:32;:136;;;;;;;;;;;;;;;;;90901:14;90917:18;:7;:16;:18::i;:::-;90937:13;90883:69;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;90823:136;90803:156;;;90563:404;;;:::o;92064:75::-;33089:13;:11;:13::i;:::-;92130:1:::1;92115:12;:16;;;;92064:75::o:0;88131:30::-;;;;:::o;91889:90::-;33089:13;:11;:13::i;:::-;91965:6:::1;91954:8;:17;;;;91889:90:::0;:::o;91663:128::-;33089:13;:11;:13::i;:::-;91766:17:::1;91750:13;:33;;;;;;:::i;:::-;;91663:128:::0;:::o;88012:33::-;;;;:::o;92147:75::-;33089:13;:11;:13::i;:::-;92213:1:::1;92198:12;:16;;;;92147:75::o:0;91222:132::-;33089:13;:11;:13::i;:::-;91329:17:::1;91307:19;:39;;;;91222:132:::0;:::o;61414:164::-;61511:4;61535:18;:25;61554:5;61535:25;;;;;;;;;;;;;;;:35;61561:8;61535:35;;;;;;;;;;;;;;;;;;;;;;;;;61528:42;;61414:164;;;;:::o;34109:201::-;33089:13;:11;:13::i;:::-;34218:1:::1;34198:22;;:8;:22;;::::0;34190:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;34274:28;34293:8;34274:18;:28::i;:::-;34109:201:::0;:::o;61836:282::-;61901:4;61957:7;61938:15;:13;:15::i;:::-;:26;;:66;;;;;61991:13;;61981:7;:23;61938:66;:153;;;;;62090:1;45844:8;62042:17;:26;62060:7;62042:26;;;;;;;;;;;;:44;:49;61938:153;61918:173;;61836:282;;;:::o;11502:647::-;11741:1;1993:42;11693:45;;;:49;11689:453;;;1993:42;11992;;;12043:4;12050:8;11992:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11987:144;;12106:8;12087:28;;;;;;;;;;;:::i;:::-;;;;;;;;11987:144;11689:453;11502:647;:::o;59898:408::-;59987:13;60003:16;60011:7;60003;:16::i;:::-;59987:32;;60059:5;60036:28;;:19;:17;:19::i;:::-;:28;;;60032:175;;60084:44;60101:5;60108:19;:17;:19::i;:::-;60084:16;:44::i;:::-;60079:128;;60156:35;;;;;;;;;;;;;;60079:128;60032:175;60252:2;60219:15;:24;60235:7;60219:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;60290:7;60286:2;60270:28;;60279:5;60270:28;;;;;;;;;;;;59976:330;59898:408;;:::o;90453:101::-;90518:7;90545:1;90538:8;;90453:101;:::o;33368:132::-;33443:12;:10;:12::i;:::-;33432:23;;:7;:5;:7::i;:::-;:23;;;33424:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33368:132::o;64104:2825::-;64246:27;64276;64295:7;64276:18;:27::i;:::-;64246:57;;64361:4;64320:45;;64336:19;64320:45;;;64316:86;;64374:28;;;;;;;;;;;;;;64316:86;64416:27;64445:23;64472:35;64499:7;64472:26;:35::i;:::-;64415:92;;;;64607:68;64632:15;64649:4;64655:19;:17;:19::i;:::-;64607:24;:68::i;:::-;64602:180;;64695:43;64712:4;64718:19;:17;:19::i;:::-;64695:16;:43::i;:::-;64690:92;;64747:35;;;;;;;;;;;;;;64690:92;64602:180;64813:1;64799:16;;:2;:16;;;64795:52;;64824:23;;;;;;;;;;;;;;64795:52;64860:43;64882:4;64888:2;64892:7;64901:1;64860:21;:43::i;:::-;64996:15;64993:160;;;65136:1;65115:19;65108:30;64993:160;65533:18;:24;65552:4;65533:24;;;;;;;;;;;;;;;;65531:26;;;;;;;;;;;;65602:18;:22;65621:2;65602:22;;;;;;;;;;;;;;;;65600:24;;;;;;;;;;;65924:146;65961:2;66010:45;66025:4;66031:2;66035:19;66010:14;:45::i;:::-;46124:8;65982:73;65924:18;:146::i;:::-;65895:17;:26;65913:7;65895:26;;;;;;;;;;;:175;;;;66241:1;46124:8;66190:19;:47;:52;66186:627;;66263:19;66295:1;66285:7;:11;66263:33;;66452:1;66418:17;:30;66436:11;66418:30;;;;;;;;;;;;:35;66414:384;;66556:13;;66541:11;:28;66537:242;;66736:19;66703:17;:30;66721:11;66703:30;;;;;;;;;;;:52;;;;66537:242;66414:384;66244:569;66186:627;66860:7;66856:2;66841:27;;66850:4;66841:27;;;;;;;;;;;;66879:42;66900:4;66906:2;66910:7;66919:1;66879:20;:42::i;:::-;64235:2694;;;64104:2825;;;:::o;30554:293::-;29956:1;30688:7;;:19;30680:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;29956:1;30821:7;:18;;;;30554:293::o;30855:213::-;29912:1;31038:7;:22;;;;30855:213::o;67025:193::-;67171:39;67188:4;67194:2;67198:7;67171:39;;;;;;;;;;;;:16;:39::i;:::-;67025:193;;;:::o;56522:1275::-;56589:7;56609:12;56624:7;56609:22;;56692:4;56673:15;:13;:15::i;:::-;:23;56669:1061;;56726:13;;56719:4;:20;56715:1015;;;56764:14;56781:17;:23;56799:4;56781:23;;;;;;;;;;;;56764:40;;56898:1;45844:8;56870:6;:24;:29;56866:845;;57535:113;57552:1;57542:6;:11;57535:113;;57595:17;:25;57613:6;;;;;;;57595:25;;;;;;;;;;;;57586:34;;57535:113;;;57681:6;57674:13;;;;;;56866:845;56741:989;56715:1015;56669:1061;57758:31;;;;;;;;;;;;;;56522:1275;;;;:::o;34470:191::-;34544:16;34563:6;;;;;;;;;;;34544:25;;34589:8;34580:6;;:17;;;;;;;;;;;;;;;;;;34644:8;34613:40;;34634:8;34613:40;;;;;;;;;;;;34533:128;34470:191;:::o;77976:112::-;78053:27;78063:2;78067:8;78053:27;;;;;;;;;;;;:9;:27::i;:::-;77976:112;;:::o;61023:234::-;61170:8;61118:18;:39;61137:19;:17;:19::i;:::-;61118:39;;;;;;;;;;;;;;;:49;61158:8;61118:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;61230:8;61194:55;;61209:19;:17;:19::i;:::-;61194:55;;;61240:8;61194:55;;;;;;:::i;:::-;;;;;;;;61023:234;;:::o;67816:407::-;67991:31;68004:4;68010:2;68014:7;67991:12;:31::i;:::-;68055:1;68037:2;:14;;;:19;68033:183;;68076:56;68107:4;68113:2;68117:7;68126:5;68076:30;:56::i;:::-;68071:145;;68160:40;;;;;;;;;;;;;;68071:145;68033:183;67816:407;;;;:::o;90336:108::-;90396:13;90429:7;90422:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;90336:108;:::o;26235:716::-;26291:13;26342:14;26379:1;26359:17;26370:5;26359:10;:17::i;:::-;:21;26342:38;;26395:20;26429:6;26418:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26395:41;;26451:11;26580:6;26576:2;26572:15;26564:6;26560:28;26553:35;;26617:288;26624:4;26617:288;;;26649:5;;;;;;;;26791:8;26786:2;26779:5;26775:14;26770:30;26765:3;26757:44;26847:2;26838:11;;;;;;:::i;:::-;;;;;26881:1;26872:5;:10;26617:288;26868:21;26617:288;26926:6;26919:13;;;;;26235:716;;;:::o;84144:105::-;84204:7;84231:10;84224:17;;84144:105;:::o;31754:98::-;31807:7;31834:10;31827:17;;31754:98;:::o;62999:485::-;63101:27;63130:23;63171:38;63212:15;:24;63228:7;63212:24;;;;;;;;;;;63171:65;;63389:18;63366:41;;63446:19;63440:26;63421:45;;63351:126;62999:485;;;:::o;62227:659::-;62376:11;62541:16;62534:5;62530:28;62521:37;;62701:16;62690:9;62686:32;62673:45;;62851:15;62840:9;62837:30;62829:5;62818:9;62815:20;62812:56;62802:66;;62227:659;;;;;:::o;68885:159::-;;;;;:::o;83453:311::-;83588:7;83608:16;46248:3;83634:19;:41;;83608:68;;46248:3;83702:31;83713:4;83719:2;83723:9;83702:10;:31::i;:::-;83694:40;;:62;;83687:69;;;83453:311;;;;;:::o;58345:450::-;58425:14;58593:16;58586:5;58582:28;58573:37;;58770:5;58756:11;58731:23;58727:41;58724:52;58717:5;58714:63;58704:73;;58345:450;;;;:::o;69709:158::-;;;;;:::o;77203:689::-;77334:19;77340:2;77344:8;77334:5;:19::i;:::-;77413:1;77395:2;:14;;;:19;77391:483;;77435:11;77449:13;;77435:27;;77481:13;77503:8;77497:3;:14;77481:30;;77530:233;77561:62;77600:1;77604:2;77608:7;;;;;;77617:5;77561:30;:62::i;:::-;77556:167;;77659:40;;;;;;;;;;;;;;77556:167;77758:3;77750:5;:11;77530:233;;77845:3;77828:13;;:20;77824:34;;77850:8;;;77824:34;77416:458;;77391:483;77203:689;;;:::o;70307:716::-;70470:4;70516:2;70491:45;;;70537:19;:17;:19::i;:::-;70558:4;70564:7;70573:5;70491:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;70487:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70791:1;70774:6;:13;:18;70770:235;;70820:40;;;;;;;;;;;;;;70770:235;70963:6;70957:13;70948:6;70944:2;70940:15;70933:38;70487:529;70660:54;;;70650:64;;;:6;:64;;;;70643:71;;;70307:716;;;;;;:::o;23101:922::-;23154:7;23174:14;23191:1;23174:18;;23241:6;23232:5;:15;23228:102;;23277:6;23268:15;;;;;;:::i;:::-;;;;;23312:2;23302:12;;;;23228:102;23357:6;23348:5;:15;23344:102;;23393:6;23384:15;;;;;;:::i;:::-;;;;;23428:2;23418:12;;;;23344:102;23473:6;23464:5;:15;23460:102;;23509:6;23500:15;;;;;;:::i;:::-;;;;;23544:2;23534:12;;;;23460:102;23589:5;23580;:14;23576:99;;23624:5;23615:14;;;;;;:::i;:::-;;;;;23658:1;23648:11;;;;23576:99;23702:5;23693;:14;23689:99;;23737:5;23728:14;;;;;;:::i;:::-;;;;;23771:1;23761:11;;;;23689:99;23815:5;23806;:14;23802:99;;23850:5;23841:14;;;;;;:::i;:::-;;;;;23884:1;23874:11;;;;23802:99;23928:5;23919;:14;23915:66;;23964:1;23954:11;;;;23915:66;24009:6;24002:13;;;23101:922;;;:::o;83154:147::-;83291:6;83154:147;;;;;:::o;71485:2966::-;71558:20;71581:13;;71558:36;;71621:1;71609:8;:13;71605:44;;71631:18;;;;;;;;;;;;;;71605:44;71662:61;71692:1;71696:2;71700:12;71714:8;71662:21;:61::i;:::-;72206:1;45206:2;72176:1;:26;;72175:32;72163:8;:45;72137:18;:22;72156:2;72137:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;72485:139;72522:2;72576:33;72599:1;72603:2;72607:1;72576:14;:33::i;:::-;72543:30;72564:8;72543:20;:30::i;:::-;:66;72485:18;:139::i;:::-;72451:17;:31;72469:12;72451:31;;;;;;;;;;;:173;;;;72641:16;72672:11;72701:8;72686:12;:23;72672:37;;73222:16;73218:2;73214:25;73202:37;;73594:12;73554:8;73513:1;73451:25;73392:1;73331;73304:335;73965:1;73951:12;73947:20;73905:346;74006:3;73997:7;73994:16;73905:346;;74224:7;74214:8;74211:1;74184:25;74181:1;74178;74173:59;74059:1;74050:7;74046:15;74035:26;;73905:346;;;73909:77;74296:1;74284:8;:13;74280:45;;74306:19;;;;;;;;;;;;;;74280:45;74358:3;74342:13;:19;;;;71911:2462;;74383:60;74412:1;74416:2;74420:12;74434:8;74383:20;:60::i;:::-;71547:2904;71485:2966;;:::o;58897:324::-;58967:14;59200:1;59190:8;59187:15;59161:24;59157:46;59147:56;;58897:324;;;:::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:126::-;2897:7;2937:42;2930:5;2926:54;2915:65;;2860:126;;;:::o;2992:96::-;3029:7;3058:24;3076:5;3058:24;:::i;:::-;3047:35;;2992:96;;;:::o;3094:122::-;3167:24;3185:5;3167:24;:::i;:::-;3160:5;3157:35;3147:63;;3206:1;3203;3196:12;3147:63;3094:122;:::o;3222:139::-;3268:5;3306:6;3293:20;3284:29;;3322:33;3349:5;3322:33;:::i;:::-;3222:139;;;;:::o;3367:329::-;3426:6;3475:2;3463:9;3454:7;3450:23;3446:32;3443:119;;;3481:79;;:::i;:::-;3443:119;3601:1;3626:53;3671:7;3662:6;3651:9;3647:22;3626:53;:::i;:::-;3616:63;;3572:117;3367:329;;;;:::o;3702:77::-;3739:7;3768:5;3757:16;;3702:77;;;:::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:329::-;4469:6;4518:2;4506:9;4497:7;4493:23;4489:32;4486:119;;;4524:79;;:::i;:::-;4486:119;4644:1;4669:53;4714:7;4705:6;4694:9;4690:22;4669:53;:::i;:::-;4659:63;;4615:117;4410:329;;;;:::o;4745:118::-;4832:24;4850:5;4832:24;:::i;:::-;4827:3;4820:37;4745:118;;:::o;4869:222::-;4962:4;5000:2;4989:9;4985:18;4977:26;;5013:71;5081:1;5070:9;5066:17;5057:6;5013:71;:::i;:::-;4869:222;;;;:::o;5097:474::-;5165:6;5173;5222:2;5210:9;5201:7;5197:23;5193:32;5190:119;;;5228:79;;:::i;:::-;5190:119;5348:1;5373:53;5418:7;5409:6;5398:9;5394:22;5373:53;:::i;:::-;5363:63;;5319:117;5475:2;5501:53;5546:7;5537:6;5526:9;5522:22;5501:53;:::i;:::-;5491:63;;5446:118;5097:474;;;;;:::o;5577:619::-;5654:6;5662;5670;5719:2;5707:9;5698:7;5694:23;5690:32;5687:119;;;5725:79;;:::i;:::-;5687:119;5845:1;5870:53;5915:7;5906:6;5895:9;5891:22;5870:53;:::i;:::-;5860:63;;5816:117;5972:2;5998:53;6043:7;6034:6;6023:9;6019:22;5998:53;:::i;:::-;5988:63;;5943:118;6100:2;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6071:118;5577:619;;;;;:::o;6202:60::-;6230:3;6251:5;6244:12;;6202:60;;;:::o;6268:142::-;6318:9;6351:53;6369:34;6378:24;6396:5;6378:24;:::i;:::-;6369:34;:::i;:::-;6351:53;:::i;:::-;6338:66;;6268:142;;;:::o;6416:126::-;6466:9;6499:37;6530:5;6499:37;:::i;:::-;6486:50;;6416:126;;;:::o;6548:157::-;6629:9;6662:37;6693:5;6662:37;:::i;:::-;6649:50;;6548:157;;;:::o;6711:193::-;6829:68;6891:5;6829:68;:::i;:::-;6824:3;6817:81;6711:193;;:::o;6910:284::-;7034:4;7072:2;7061:9;7057:18;7049:26;;7085:102;7184:1;7173:9;7169:17;7160:6;7085:102;:::i;:::-;6910:284;;;;:::o;7200:117::-;7309:1;7306;7299:12;7323:117;7432:1;7429;7422:12;7446:180;7494:77;7491:1;7484:88;7591:4;7588:1;7581:15;7615:4;7612:1;7605:15;7632:281;7715:27;7737:4;7715:27;:::i;:::-;7707:6;7703:40;7845:6;7833:10;7830:22;7809:18;7797:10;7794:34;7791:62;7788:88;;;7856:18;;:::i;:::-;7788:88;7896:10;7892:2;7885:22;7675:238;7632:281;;:::o;7919:129::-;7953:6;7980:20;;:::i;:::-;7970:30;;8009:33;8037:4;8029:6;8009:33;:::i;:::-;7919:129;;;:::o;8054:308::-;8116:4;8206:18;8198:6;8195:30;8192:56;;;8228:18;;:::i;:::-;8192:56;8266:29;8288:6;8266:29;:::i;:::-;8258:37;;8350:4;8344;8340:15;8332:23;;8054:308;;;:::o;8368:146::-;8465:6;8460:3;8455;8442:30;8506:1;8497:6;8492:3;8488:16;8481:27;8368:146;;;:::o;8520:425::-;8598:5;8623:66;8639:49;8681:6;8639:49;:::i;:::-;8623:66;:::i;:::-;8614:75;;8712:6;8705:5;8698:21;8750:4;8743:5;8739:16;8788:3;8779:6;8774:3;8770:16;8767:25;8764:112;;;8795:79;;:::i;:::-;8764:112;8885:54;8932:6;8927:3;8922;8885:54;:::i;:::-;8604:341;8520:425;;;;;:::o;8965:340::-;9021:5;9070:3;9063:4;9055:6;9051:17;9047:27;9037:122;;9078:79;;:::i;:::-;9037:122;9195:6;9182:20;9220:79;9295:3;9287:6;9280:4;9272:6;9268:17;9220:79;:::i;:::-;9211:88;;9027:278;8965:340;;;;:::o;9311:509::-;9380:6;9429:2;9417:9;9408:7;9404:23;9400:32;9397:119;;;9435:79;;:::i;:::-;9397:119;9583:1;9572:9;9568:17;9555:31;9613:18;9605:6;9602:30;9599:117;;;9635:79;;:::i;:::-;9599:117;9740:63;9795:7;9786:6;9775:9;9771:22;9740:63;:::i;:::-;9730:73;;9526:287;9311:509;;;;:::o;9826:474::-;9894:6;9902;9951:2;9939:9;9930:7;9926:23;9922:32;9919:119;;;9957:79;;:::i;:::-;9919:119;10077:1;10102:53;10147:7;10138:6;10127:9;10123:22;10102:53;:::i;:::-;10092:63;;10048:117;10204:2;10230:53;10275:7;10266:6;10255:9;10251:22;10230:53;:::i;:::-;10220:63;;10175:118;9826:474;;;;;:::o;10306:116::-;10376:21;10391:5;10376:21;:::i;:::-;10369:5;10366:32;10356:60;;10412:1;10409;10402:12;10356:60;10306:116;:::o;10428:133::-;10471:5;10509:6;10496:20;10487:29;;10525:30;10549:5;10525:30;:::i;:::-;10428:133;;;;:::o;10567:468::-;10632:6;10640;10689:2;10677:9;10668:7;10664:23;10660:32;10657:119;;;10695:79;;:::i;:::-;10657:119;10815:1;10840:53;10885:7;10876:6;10865:9;10861:22;10840:53;:::i;:::-;10830:63;;10786:117;10942:2;10968:50;11010:7;11001:6;10990:9;10986:22;10968:50;:::i;:::-;10958:60;;10913:115;10567:468;;;;;:::o;11041:307::-;11102:4;11192:18;11184:6;11181:30;11178:56;;;11214:18;;:::i;:::-;11178:56;11252:29;11274:6;11252:29;:::i;:::-;11244:37;;11336:4;11330;11326:15;11318:23;;11041:307;;;:::o;11354:423::-;11431:5;11456:65;11472:48;11513:6;11472:48;:::i;:::-;11456:65;:::i;:::-;11447:74;;11544:6;11537:5;11530:21;11582:4;11575:5;11571:16;11620:3;11611:6;11606:3;11602:16;11599:25;11596:112;;;11627:79;;:::i;:::-;11596:112;11717:54;11764:6;11759:3;11754;11717:54;:::i;:::-;11437:340;11354:423;;;;;:::o;11796:338::-;11851:5;11900:3;11893:4;11885:6;11881:17;11877:27;11867:122;;11908:79;;:::i;:::-;11867:122;12025:6;12012:20;12050:78;12124:3;12116:6;12109:4;12101:6;12097:17;12050:78;:::i;:::-;12041:87;;11857:277;11796:338;;;;:::o;12140:943::-;12235:6;12243;12251;12259;12308:3;12296:9;12287:7;12283:23;12279:33;12276:120;;;12315:79;;:::i;:::-;12276:120;12435:1;12460:53;12505:7;12496:6;12485:9;12481:22;12460:53;:::i;:::-;12450:63;;12406:117;12562:2;12588:53;12633:7;12624:6;12613:9;12609:22;12588:53;:::i;:::-;12578:63;;12533:118;12690:2;12716:53;12761:7;12752:6;12741:9;12737:22;12716:53;:::i;:::-;12706:63;;12661:118;12846:2;12835:9;12831:18;12818:32;12877:18;12869:6;12866:30;12863:117;;;12899:79;;:::i;:::-;12863:117;13004:62;13058:7;13049:6;13038:9;13034:22;13004:62;:::i;:::-;12994:72;;12789:287;12140:943;;;;;;;:::o;13089:474::-;13157:6;13165;13214:2;13202:9;13193:7;13189:23;13185:32;13182:119;;;13220:79;;:::i;:::-;13182:119;13340:1;13365:53;13410:7;13401:6;13390:9;13386:22;13365:53;:::i;:::-;13355:63;;13311:117;13467:2;13493:53;13538:7;13529:6;13518:9;13514:22;13493:53;:::i;:::-;13483:63;;13438:118;13089:474;;;;;:::o;13569:180::-;13617:77;13614:1;13607:88;13714:4;13711:1;13704:15;13738:4;13735:1;13728:15;13755:320;13799:6;13836:1;13830:4;13826:12;13816:22;;13883:1;13877:4;13873:12;13904:18;13894:81;;13960:4;13952:6;13948:17;13938:27;;13894:81;14022:2;14014:6;14011:14;13991:18;13988:38;13985:84;;14041:18;;:::i;:::-;13985:84;13806:269;13755:320;;;:::o;14081:180::-;14129:77;14126:1;14119:88;14226:4;14223:1;14216:15;14250:4;14247:1;14240:15;14267:194;14307:4;14327:20;14345:1;14327:20;:::i;:::-;14322:25;;14361:20;14379:1;14361:20;:::i;:::-;14356:25;;14405:1;14402;14398:9;14390:17;;14429:1;14423:4;14420:11;14417:37;;;14434:18;;:::i;:::-;14417:37;14267:194;;;;:::o;14467:168::-;14607:20;14603:1;14595:6;14591:14;14584:44;14467:168;:::o;14641:366::-;14783:3;14804:67;14868:2;14863:3;14804:67;:::i;:::-;14797:74;;14880:93;14969:3;14880:93;:::i;:::-;14998:2;14993:3;14989:12;14982:19;;14641:366;;;:::o;15013:419::-;15179:4;15217:2;15206:9;15202:18;15194:26;;15266:9;15260:4;15256:20;15252:1;15241:9;15237:17;15230:47;15294:131;15420:4;15294:131;:::i;:::-;15286:139;;15013:419;;;:::o;15438:147::-;15539:11;15576:3;15561:18;;15438:147;;;;:::o;15591:114::-;;:::o;15711:398::-;15870:3;15891:83;15972:1;15967:3;15891:83;:::i;:::-;15884:90;;15983:93;16072:3;15983:93;:::i;:::-;16101:1;16096:3;16092:11;16085:18;;15711:398;;;:::o;16115:379::-;16299:3;16321:147;16464:3;16321:147;:::i;:::-;16314:154;;16485:3;16478:10;;16115:379;;;:::o;16500:141::-;16549:4;16572:3;16564:11;;16595:3;16592:1;16585:14;16629:4;16626:1;16616:18;16608:26;;16500:141;;;:::o;16647:93::-;16684:6;16731:2;16726;16719:5;16715:14;16711:23;16701:33;;16647:93;;;:::o;16746:107::-;16790:8;16840:5;16834:4;16830:16;16809:37;;16746:107;;;;:::o;16859:393::-;16928:6;16978:1;16966:10;16962:18;17001:97;17031:66;17020:9;17001:97;:::i;:::-;17119:39;17149:8;17138:9;17119:39;:::i;:::-;17107:51;;17191:4;17187:9;17180:5;17176:21;17167:30;;17240:4;17230:8;17226:19;17219:5;17216:30;17206:40;;16935:317;;16859:393;;;;;:::o;17258:142::-;17308:9;17341:53;17359:34;17368:24;17386:5;17368:24;:::i;:::-;17359:34;:::i;:::-;17341:53;:::i;:::-;17328:66;;17258:142;;;:::o;17406:75::-;17449:3;17470:5;17463:12;;17406:75;;;:::o;17487:269::-;17597:39;17628:7;17597:39;:::i;:::-;17658:91;17707:41;17731:16;17707:41;:::i;:::-;17699:6;17692:4;17686:11;17658:91;:::i;:::-;17652:4;17645:105;17563:193;17487:269;;;:::o;17762:73::-;17807:3;17762:73;:::o;17841:189::-;17918:32;;:::i;:::-;17959:65;18017:6;18009;18003:4;17959:65;:::i;:::-;17894:136;17841:189;;:::o;18036:186::-;18096:120;18113:3;18106:5;18103:14;18096:120;;;18167:39;18204:1;18197:5;18167:39;:::i;:::-;18140:1;18133:5;18129:13;18120:22;;18096:120;;;18036:186;;:::o;18228:543::-;18329:2;18324:3;18321:11;18318:446;;;18363:38;18395:5;18363:38;:::i;:::-;18447:29;18465:10;18447:29;:::i;:::-;18437:8;18433:44;18630:2;18618:10;18615:18;18612:49;;;18651:8;18636:23;;18612:49;18674:80;18730:22;18748:3;18730:22;:::i;:::-;18720:8;18716:37;18703:11;18674:80;:::i;:::-;18333:431;;18318:446;18228:543;;;:::o;18777:117::-;18831:8;18881:5;18875:4;18871:16;18850:37;;18777:117;;;;:::o;18900:169::-;18944:6;18977:51;19025:1;19021:6;19013:5;19010:1;19006:13;18977:51;:::i;:::-;18973:56;19058:4;19052;19048:15;19038:25;;18951:118;18900:169;;;;:::o;19074:295::-;19150:4;19296:29;19321:3;19315:4;19296:29;:::i;:::-;19288:37;;19358:3;19355:1;19351:11;19345:4;19342:21;19334:29;;19074:295;;;;:::o;19374:1395::-;19491:37;19524:3;19491:37;:::i;:::-;19593:18;19585:6;19582:30;19579:56;;;19615:18;;:::i;:::-;19579:56;19659:38;19691:4;19685:11;19659:38;:::i;:::-;19744:67;19804:6;19796;19790:4;19744:67;:::i;:::-;19838:1;19862:4;19849:17;;19894:2;19886:6;19883:14;19911:1;19906:618;;;;20568:1;20585:6;20582:77;;;20634:9;20629:3;20625:19;20619:26;20610:35;;20582:77;20685:67;20745:6;20738:5;20685:67;:::i;:::-;20679:4;20672:81;20541:222;19876:887;;19906:618;19958:4;19954:9;19946:6;19942:22;19992:37;20024:4;19992:37;:::i;:::-;20051:1;20065:208;20079:7;20076:1;20073:14;20065:208;;;20158:9;20153:3;20149:19;20143:26;20135:6;20128:42;20209:1;20201:6;20197:14;20187:24;;20256:2;20245:9;20241:18;20228:31;;20102:4;20099:1;20095:12;20090:17;;20065:208;;;20301:6;20292:7;20289:19;20286:179;;;20359:9;20354:3;20350:19;20344:26;20402:48;20444:4;20436:6;20432:17;20421:9;20402:48;:::i;:::-;20394:6;20387:64;20309:156;20286:179;20511:1;20507;20499:6;20495:14;20491:22;20485:4;20478:36;19913:611;;;19876:887;;19466:1303;;;19374:1395;;:::o;20775:177::-;20915:29;20911:1;20903:6;20899:14;20892:53;20775:177;:::o;20958:366::-;21100:3;21121:67;21185:2;21180:3;21121:67;:::i;:::-;21114:74;;21197:93;21286:3;21197:93;:::i;:::-;21315:2;21310:3;21306:12;21299:19;;20958:366;;;:::o;21330:419::-;21496:4;21534:2;21523:9;21519:18;21511:26;;21583:9;21577:4;21573:20;21569:1;21558:9;21554:17;21547:47;21611:131;21737:4;21611:131;:::i;:::-;21603:139;;21330:419;;;:::o;21755:191::-;21795:3;21814:20;21832:1;21814:20;:::i;:::-;21809:25;;21848:20;21866:1;21848:20;:::i;:::-;21843:25;;21891:1;21888;21884:9;21877:16;;21912:3;21909:1;21906:10;21903:36;;;21919:18;;:::i;:::-;21903:36;21755:191;;;;:::o;21952:172::-;22092:24;22088:1;22080:6;22076:14;22069:48;21952:172;:::o;22130:366::-;22272:3;22293:67;22357:2;22352:3;22293:67;:::i;:::-;22286:74;;22369:93;22458:3;22369:93;:::i;:::-;22487:2;22482:3;22478:12;22471:19;;22130:366;;;:::o;22502:419::-;22668:4;22706:2;22695:9;22691:18;22683:26;;22755:9;22749:4;22745:20;22741:1;22730:9;22726:17;22719:47;22783:131;22909:4;22783:131;:::i;:::-;22775:139;;22502:419;;;:::o;22927:172::-;23067:24;23063:1;23055:6;23051:14;23044:48;22927:172;:::o;23105:366::-;23247:3;23268:67;23332:2;23327:3;23268:67;:::i;:::-;23261:74;;23344:93;23433:3;23344:93;:::i;:::-;23462:2;23457:3;23453:12;23446:19;;23105:366;;;:::o;23477:419::-;23643:4;23681:2;23670:9;23666:18;23658:26;;23730:9;23724:4;23720:20;23716:1;23705:9;23701:17;23694:47;23758:131;23884:4;23758:131;:::i;:::-;23750:139;;23477:419;;;:::o;23902:223::-;24042:34;24038:1;24030:6;24026:14;24019:58;24111:6;24106:2;24098:6;24094:15;24087:31;23902:223;:::o;24131:366::-;24273:3;24294:67;24358:2;24353:3;24294:67;:::i;:::-;24287:74;;24370:93;24459:3;24370:93;:::i;:::-;24488:2;24483:3;24479:12;24472:19;;24131:366;;;:::o;24503:419::-;24669:4;24707:2;24696:9;24692:18;24684:26;;24756:9;24750:4;24746:20;24742:1;24731:9;24727:17;24720:47;24784:131;24910:4;24784:131;:::i;:::-;24776:139;;24503:419;;;:::o;24928:410::-;24968:7;24991:20;25009:1;24991:20;:::i;:::-;24986:25;;25025:20;25043:1;25025:20;:::i;:::-;25020:25;;25080:1;25077;25073:9;25102:30;25120:11;25102:30;:::i;:::-;25091:41;;25281:1;25272:7;25268:15;25265:1;25262:22;25242:1;25235:9;25215:83;25192:139;;25311:18;;:::i;:::-;25192:139;24976:362;24928:410;;;;:::o;25344:168::-;25484:20;25480:1;25472:6;25468:14;25461:44;25344:168;:::o;25518:366::-;25660:3;25681:67;25745:2;25740:3;25681:67;:::i;:::-;25674:74;;25757:93;25846:3;25757:93;:::i;:::-;25875:2;25870:3;25866:12;25859:19;;25518:366;;;:::o;25890:419::-;26056:4;26094:2;26083:9;26079:18;26071:26;;26143:9;26137:4;26133:20;26129:1;26118:9;26114:17;26107:47;26171:131;26297:4;26171:131;:::i;:::-;26163:139;;25890:419;;;:::o;26315:177::-;26455:29;26451:1;26443:6;26439:14;26432:53;26315:177;:::o;26498:366::-;26640:3;26661:67;26725:2;26720:3;26661:67;:::i;:::-;26654:74;;26737:93;26826:3;26737:93;:::i;:::-;26855:2;26850:3;26846:12;26839:19;;26498:366;;;:::o;26870:419::-;27036:4;27074:2;27063:9;27059:18;27051:26;;27123:9;27117:4;27113:20;27109:1;27098:9;27094:17;27087:47;27151:131;27277:4;27151:131;:::i;:::-;27143:139;;26870:419;;;:::o;27295:178::-;27435:30;27431:1;27423:6;27419:14;27412:54;27295:178;:::o;27479:366::-;27621:3;27642:67;27706:2;27701:3;27642:67;:::i;:::-;27635:74;;27718:93;27807:3;27718:93;:::i;:::-;27836:2;27831:3;27827:12;27820:19;;27479:366;;;:::o;27851:419::-;28017:4;28055:2;28044:9;28040:18;28032:26;;28104:9;28098:4;28094:20;28090:1;28079:9;28075:17;28068:47;28132:131;28258:4;28132:131;:::i;:::-;28124:139;;27851:419;;;:::o;28276:234::-;28416:34;28412:1;28404:6;28400:14;28393:58;28485:17;28480:2;28472:6;28468:15;28461:42;28276:234;:::o;28516:366::-;28658:3;28679:67;28743:2;28738:3;28679:67;:::i;:::-;28672:74;;28755:93;28844:3;28755:93;:::i;:::-;28873:2;28868:3;28864:12;28857:19;;28516:366;;;:::o;28888:419::-;29054:4;29092:2;29081:9;29077:18;29069:26;;29141:9;29135:4;29131:20;29127:1;29116:9;29112:17;29105:47;29169:131;29295:4;29169:131;:::i;:::-;29161:139;;28888:419;;;:::o;29313:148::-;29415:11;29452:3;29437:18;;29313:148;;;;:::o;29467:390::-;29573:3;29601:39;29634:5;29601:39;:::i;:::-;29656:89;29738:6;29733:3;29656:89;:::i;:::-;29649:96;;29754:65;29812:6;29807:3;29800:4;29793:5;29789:16;29754:65;:::i;:::-;29844:6;29839:3;29835:16;29828:23;;29577:280;29467:390;;;;:::o;29887:874::-;29990:3;30027:5;30021:12;30056:36;30082:9;30056:36;:::i;:::-;30108:89;30190:6;30185:3;30108:89;:::i;:::-;30101:96;;30228:1;30217:9;30213:17;30244:1;30239:166;;;;30419:1;30414:341;;;;30206:549;;30239:166;30323:4;30319:9;30308;30304:25;30299:3;30292:38;30385:6;30378:14;30371:22;30363:6;30359:35;30354:3;30350:45;30343:52;;30239:166;;30414:341;30481:38;30513:5;30481:38;:::i;:::-;30541:1;30555:154;30569:6;30566:1;30563:13;30555:154;;;30643:7;30637:14;30633:1;30628:3;30624:11;30617:35;30693:1;30684:7;30680:15;30669:26;;30591:4;30588:1;30584:12;30579:17;;30555:154;;;30738:6;30733:3;30729:16;30722:23;;30421:334;;30206:549;;29994:767;;29887:874;;;;:::o;30767:589::-;30992:3;31014:95;31105:3;31096:6;31014:95;:::i;:::-;31007:102;;31126:95;31217:3;31208:6;31126:95;:::i;:::-;31119:102;;31238:92;31326:3;31317:6;31238:92;:::i;:::-;31231:99;;31347:3;31340:10;;30767:589;;;;;;:::o;31362:225::-;31502:34;31498:1;31490:6;31486:14;31479:58;31571:8;31566:2;31558:6;31554:15;31547:33;31362:225;:::o;31593:366::-;31735:3;31756:67;31820:2;31815:3;31756:67;:::i;:::-;31749:74;;31832:93;31921:3;31832:93;:::i;:::-;31950:2;31945:3;31941:12;31934:19;;31593:366;;;:::o;31965:419::-;32131:4;32169:2;32158:9;32154:18;32146:26;;32218:9;32212:4;32208:20;32204:1;32193:9;32189:17;32182:47;32246:131;32372:4;32246:131;:::i;:::-;32238:139;;31965:419;;;:::o;32390:332::-;32511:4;32549:2;32538:9;32534:18;32526:26;;32562:71;32630:1;32619:9;32615:17;32606:6;32562:71;:::i;:::-;32643:72;32711:2;32700:9;32696:18;32687:6;32643:72;:::i;:::-;32390:332;;;;;:::o;32728:137::-;32782:5;32813:6;32807:13;32798:22;;32829:30;32853:5;32829:30;:::i;:::-;32728:137;;;;:::o;32871:345::-;32938:6;32987:2;32975:9;32966:7;32962:23;32958:32;32955:119;;;32993:79;;:::i;:::-;32955:119;33113:1;33138:61;33191:7;33182:6;33171:9;33167:22;33138:61;:::i;:::-;33128:71;;33084:125;32871:345;;;;:::o;33222:182::-;33362:34;33358:1;33350:6;33346:14;33339:58;33222:182;:::o;33410:366::-;33552:3;33573:67;33637:2;33632:3;33573:67;:::i;:::-;33566:74;;33649:93;33738:3;33649:93;:::i;:::-;33767:2;33762:3;33758:12;33751:19;;33410:366;;;:::o;33782:419::-;33948:4;33986:2;33975:9;33971:18;33963:26;;34035:9;34029:4;34025:20;34021:1;34010:9;34006:17;33999:47;34063:131;34189:4;34063:131;:::i;:::-;34055:139;;33782:419;;;:::o;34207:181::-;34347:33;34343:1;34335:6;34331:14;34324:57;34207:181;:::o;34394:366::-;34536:3;34557:67;34621:2;34616:3;34557:67;:::i;:::-;34550:74;;34633:93;34722:3;34633:93;:::i;:::-;34751:2;34746:3;34742:12;34735:19;;34394:366;;;:::o;34766:419::-;34932:4;34970:2;34959:9;34955:18;34947:26;;35019:9;35013:4;35009:20;35005:1;34994:9;34990:17;34983:47;35047:131;35173:4;35047:131;:::i;:::-;35039:139;;34766:419;;;:::o;35191:180::-;35239:77;35236:1;35229:88;35336:4;35333:1;35326:15;35360:4;35357:1;35350:15;35377:98;35428:6;35462:5;35456:12;35446:22;;35377:98;;;:::o;35481:168::-;35564:11;35598:6;35593:3;35586:19;35638:4;35633:3;35629:14;35614:29;;35481:168;;;;:::o;35655:373::-;35741:3;35769:38;35801:5;35769:38;:::i;:::-;35823:70;35886:6;35881:3;35823:70;:::i;:::-;35816:77;;35902:65;35960:6;35955:3;35948:4;35941:5;35937:16;35902:65;:::i;:::-;35992:29;36014:6;35992:29;:::i;:::-;35987:3;35983:39;35976:46;;35745:283;35655:373;;;;:::o;36034:640::-;36229:4;36267:3;36256:9;36252:19;36244:27;;36281:71;36349:1;36338:9;36334:17;36325:6;36281:71;:::i;:::-;36362:72;36430:2;36419:9;36415:18;36406:6;36362:72;:::i;:::-;36444;36512:2;36501:9;36497:18;36488:6;36444:72;:::i;:::-;36563:9;36557:4;36553:20;36548:2;36537:9;36533:18;36526:48;36591:76;36662:4;36653:6;36591:76;:::i;:::-;36583:84;;36034:640;;;;;;;:::o;36680:141::-;36736:5;36767:6;36761:13;36752:22;;36783:32;36809:5;36783:32;:::i;:::-;36680:141;;;;:::o;36827:349::-;36896:6;36945:2;36933:9;36924:7;36920:23;36916:32;36913:119;;;36951:79;;:::i;:::-;36913:119;37071:1;37096:63;37151:7;37142:6;37131:9;37127:22;37096:63;:::i;:::-;37086:73;;37042:127;36827:349;;;;:::o
Swarm Source
ipfs://b9dfb43d9bd7428c4f5e5e4e286ffe7dc3a846c87dbe5b9f43086f217c41aa04
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.