Overview
APE Balance
APE Value
$0.00More Info
Private Name Tags
ContractCreator
Multichain Info
No addresses found
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
APETEST_SALE
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity)
/** *Submitted for verification at apescan.io on 2025-02-01 */ // File: @pythnetwork/pyth-sdk-solidity/PythStructs.sol pragma solidity ^0.8.0; contract PythStructs { // A price with a degree of uncertainty, represented as a price +- a confidence interval. // // The confidence interval roughly corresponds to the standard error of a normal distribution. // Both the price and confidence are stored in a fixed-point numeric representation, // `x * (10^expo)`, where `expo` is the exponent. // // Please refer to the documentation at https://docs.pyth.network/documentation/pythnet-price-feeds/best-practices for how // to how this price safely. struct Price { // Price int64 price; // Confidence interval around the price uint64 conf; // Price exponent int32 expo; // Unix timestamp describing when the price was published uint publishTime; } // PriceFeed represents a current aggregate price from pyth publisher feeds. struct PriceFeed { // The price ID. bytes32 id; // Latest available price Price price; // Latest available exponentially-weighted moving average price Price emaPrice; } } // File: @pythnetwork/pyth-sdk-solidity/IPythEvents.sol pragma solidity ^0.8.0; /// @title IPythEvents contains the events that Pyth contract emits. /// @dev This interface can be used for listening to the updates for off-chain and testing purposes. interface IPythEvents { /// @dev Emitted when the price feed with `id` has received a fresh update. /// @param id The Pyth Price Feed ID. /// @param publishTime Publish time of the given price update. /// @param price Price of the given price update. /// @param conf Confidence interval of the given price update. event PriceFeedUpdate( bytes32 indexed id, uint64 publishTime, int64 price, uint64 conf ); } // File: @pythnetwork/pyth-sdk-solidity/IPyth.sol pragma solidity ^0.8.0; /// @title Consume prices from the Pyth Network (https://pyth.network/). /// @dev Please refer to the guidance at https://docs.pyth.network/documentation/pythnet-price-feeds/best-practices for how to consume prices safely. /// @author Pyth Data Association interface IPyth is IPythEvents { /// @notice Returns the price of a price feed without any sanity checks. /// @dev This function returns the most recent price update in this contract without any recency checks. /// This function is unsafe as the returned price update may be arbitrarily far in the past. /// /// Users of this function should check the `publishTime` in the price to ensure that the returned price is /// sufficiently recent for their application. If you are considering using this function, it may be /// safer / easier to use `getPriceNoOlderThan`. /// @return price - please read the documentation of PythStructs.Price to understand how to use this safely. function getPriceUnsafe( bytes32 id ) external view returns (PythStructs.Price memory price); /// @notice Returns the price that is no older than `age` seconds of the current time. /// @dev This function is a sanity-checked version of `getPriceUnsafe` which is useful in /// applications that require a sufficiently-recent price. Reverts if the price wasn't updated sufficiently /// recently. /// @return price - please read the documentation of PythStructs.Price to understand how to use this safely. function getPriceNoOlderThan( bytes32 id, uint age ) external view returns (PythStructs.Price memory price); /// @notice Returns the exponentially-weighted moving average price of a price feed without any sanity checks. /// @dev This function returns the same price as `getEmaPrice` in the case where the price is available. /// However, if the price is not recent this function returns the latest available price. /// /// The returned price can be from arbitrarily far in the past; this function makes no guarantees that /// the returned price is recent or useful for any particular application. /// /// Users of this function should check the `publishTime` in the price to ensure that the returned price is /// sufficiently recent for their application. If you are considering using this function, it may be /// safer / easier to use either `getEmaPrice` or `getEmaPriceNoOlderThan`. /// @return price - please read the documentation of PythStructs.Price to understand how to use this safely. function getEmaPriceUnsafe( bytes32 id ) external view returns (PythStructs.Price memory price); /// @notice Returns the exponentially-weighted moving average price that is no older than `age` seconds /// of the current time. /// @dev This function is a sanity-checked version of `getEmaPriceUnsafe` which is useful in /// applications that require a sufficiently-recent price. Reverts if the price wasn't updated sufficiently /// recently. /// @return price - please read the documentation of PythStructs.Price to understand how to use this safely. function getEmaPriceNoOlderThan( bytes32 id, uint age ) external view returns (PythStructs.Price memory price); /// @notice Update price feeds with given update messages. /// This method requires the caller to pay a fee in wei; the required fee can be computed by calling /// `getUpdateFee` with the length of the `updateData` array. /// Prices will be updated if they are more recent than the current stored prices. /// The call will succeed even if the update is not the most recent. /// @dev Reverts if the transferred fee is not sufficient or the updateData is invalid. /// @param updateData Array of price update data. function updatePriceFeeds(bytes[] calldata updateData) external payable; /// @notice Wrapper around updatePriceFeeds that rejects fast if a price update is not necessary. A price update is /// necessary if the current on-chain publishTime is older than the given publishTime. It relies solely on the /// given `publishTimes` for the price feeds and does not read the actual price update publish time within `updateData`. /// /// This method requires the caller to pay a fee in wei; the required fee can be computed by calling /// `getUpdateFee` with the length of the `updateData` array. /// /// `priceIds` and `publishTimes` are two arrays with the same size that correspond to senders known publishTime /// of each priceId when calling this method. If all of price feeds within `priceIds` have updated and have /// a newer or equal publish time than the given publish time, it will reject the transaction to save gas. /// Otherwise, it calls updatePriceFeeds method to update the prices. /// /// @dev Reverts if update is not needed or the transferred fee is not sufficient or the updateData is invalid. /// @param updateData Array of price update data. /// @param priceIds Array of price ids. /// @param publishTimes Array of publishTimes. `publishTimes[i]` corresponds to known `publishTime` of `priceIds[i]` function updatePriceFeedsIfNecessary( bytes[] calldata updateData, bytes32[] calldata priceIds, uint64[] calldata publishTimes ) external payable; /// @notice Returns the required fee to update an array of price updates. /// @param updateData Array of price update data. /// @return feeAmount The required fee in Wei. function getUpdateFee( bytes[] calldata updateData ) external view returns (uint feeAmount); /// @notice Parse `updateData` and return price feeds of the given `priceIds` if they are all published /// within `minPublishTime` and `maxPublishTime`. /// /// You can use this method if you want to use a Pyth price at a fixed time and not the most recent price; /// otherwise, please consider using `updatePriceFeeds`. This method may store the price updates on-chain, if they /// are more recent than the current stored prices. /// /// This method requires the caller to pay a fee in wei; the required fee can be computed by calling /// `getUpdateFee` with the length of the `updateData` array. /// /// /// @dev Reverts if the transferred fee is not sufficient or the updateData is invalid or there is /// no update for any of the given `priceIds` within the given time range. /// @param updateData Array of price update data. /// @param priceIds Array of price ids. /// @param minPublishTime minimum acceptable publishTime for the given `priceIds`. /// @param maxPublishTime maximum acceptable publishTime for the given `priceIds`. /// @return priceFeeds Array of the price feeds corresponding to the given `priceIds` (with the same order). function parsePriceFeedUpdates( bytes[] calldata updateData, bytes32[] calldata priceIds, uint64 minPublishTime, uint64 maxPublishTime ) external payable returns (PythStructs.PriceFeed[] memory priceFeeds); /// @notice Similar to `parsePriceFeedUpdates` but ensures the updates returned are /// the first updates published in minPublishTime. That is, if there are multiple updates for a given timestamp, /// this method will return the first update. This method may store the price updates on-chain, if they /// are more recent than the current stored prices. /// /// /// @dev Reverts if the transferred fee is not sufficient or the updateData is invalid or there is /// no update for any of the given `priceIds` within the given time range and uniqueness condition. /// @param updateData Array of price update data. /// @param priceIds Array of price ids. /// @param minPublishTime minimum acceptable publishTime for the given `priceIds`. /// @param maxPublishTime maximum acceptable publishTime for the given `priceIds`. /// @return priceFeeds Array of the price feeds corresponding to the given `priceIds` (with the same order). function parsePriceFeedUpdatesUnique( bytes[] calldata updateData, bytes32[] calldata priceIds, uint64 minPublishTime, uint64 maxPublishTime ) external payable returns (PythStructs.PriceFeed[] memory priceFeeds); } // File: contact.sol pragma solidity ^0.8.20; // SPDX-License-Identifier: MIT // File: @openzeppelin/[email protected]/interfaces/draft-IERC6093.sol // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol) pragma solidity ^0.8.20; /** * @dev Standard ERC20 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens. */ interface IERC20Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC20InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC20InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers. * @param spender Address that may be allowed to operate on tokens without being their owner. * @param allowance Amount of tokens a `spender` is allowed to operate with. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC20InvalidApprover(address approver); /** * @dev Indicates a failure with the `spender` to be approved. Used in approvals. * @param spender Address that may be allowed to operate on tokens without being their owner. */ error ERC20InvalidSpender(address spender); } /** * @dev Standard ERC721 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens. */ interface IERC721Errors { /** * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20. * Used in balance queries. * @param owner Address of the current owner of a token. */ error ERC721InvalidOwner(address owner); /** * @dev Indicates a `tokenId` whose `owner` is the zero address. * @param tokenId Identifier number of a token. */ error ERC721NonexistentToken(uint256 tokenId); /** * @dev Indicates an error related to the ownership over a particular token. Used in transfers. * @param sender Address whose tokens are being transferred. * @param tokenId Identifier number of a token. * @param owner Address of the current owner of a token. */ error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC721InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC721InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param tokenId Identifier number of a token. */ error ERC721InsufficientApproval(address operator, uint256 tokenId); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC721InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC721InvalidOperator(address operator); } /** * @dev Standard ERC1155 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens. */ interface IERC1155Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. * @param tokenId Identifier number of a token. */ error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC1155InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC1155InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param owner Address of the current owner of a token. */ error ERC1155MissingApprovalForAll(address operator, address owner); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC1155InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC1155InvalidOperator(address operator); /** * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation. * Used in batch transfers. * @param idsLength Length of the array of token identifiers * @param valuesLength Length of the array of token amounts */ error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength); } // File: @openzeppelin/[email protected]/utils/math/SignedMath.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.20; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File: @openzeppelin/[email protected]/utils/math/Math.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol) pragma solidity ^0.8.20; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Muldiv operation overflow. */ error MathOverflowedMulDiv(); enum Rounding { Floor, // Toward negative infinity Ceil, // Toward positive infinity Trunc, // Toward zero Expand // Away from zero } /** * @dev Returns the addition of two unsigned integers, with an overflow flag. */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds towards infinity instead * of rounding towards zero. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { if (b == 0) { // Guarantee the same behavior as in a regular Solidity division. return a / b; } // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or * denominator == 0. * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by * Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0 = x * y; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. if (denominator <= prod1) { revert MathOverflowedMulDiv(); } /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. // Always >= 1. See https://cs.stackexchange.com/q/138556/92363. uint256 twos = denominator & (0 - denominator); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also // works in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded * towards zero. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256 of a positive value rounded towards zero. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0); } } /** * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers. */ function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) { return uint8(rounding) % 2 == 1; } } // File: @openzeppelin/[email protected]/utils/Strings.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol) pragma solidity ^0.8.20; /** * @dev String operations. */ library Strings { bytes16 private constant HEX_DIGITS = "0123456789abcdef"; uint8 private constant ADDRESS_LENGTH = 20; /** * @dev The `value` string doesn't fit in the specified `length`. */ error StringsInsufficientHexLength(uint256 value, uint256 length); /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), HEX_DIGITS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toStringSigned(int256 value) internal pure returns (string memory) { return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { uint256 localValue = value; bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = HEX_DIGITS[localValue & 0xf]; localValue >>= 4; } if (localValue != 0) { revert StringsInsufficientHexLength(value, length); } return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal * representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b)); } } // File: @openzeppelin/[email protected]/utils/Context.sol // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // File: @openzeppelin/[email protected]/access/Ownable.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/[email protected]/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.20; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be * reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/[email protected]/utils/introspection/IERC165.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/[email protected]/interfaces/IERC165.sol // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol) pragma solidity ^0.8.20; // File: @openzeppelin/[email protected]/utils/introspection/ERC165.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol) pragma solidity ^0.8.20; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/[email protected]/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.20; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon * a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or * {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon * a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the address zero. * * 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); } // File: @openzeppelin/[email protected]/interfaces/IERC721.sol // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC721.sol) pragma solidity ^0.8.20; // File: @openzeppelin/[email protected]/interfaces/IERC4906.sol // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC4906.sol) pragma solidity ^0.8.20; /// @title EIP-721 Metadata Update Extension interface IERC4906 is IERC165, IERC721 { /// @dev This event emits when the metadata of a token is changed. /// So that the third-party platforms such as NFT market could /// timely update the images and related attributes of the NFT. event MetadataUpdate(uint256 _tokenId); /// @dev This event emits when the metadata of a range of tokens is changed. /// So that the third-party platforms such as NFT market could /// timely update the images and related attributes of the NFTs. event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId); } // File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.20; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/[email protected]/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.20; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Errors { using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; mapping(uint256 tokenId => address) private _owners; mapping(address owner => uint256) private _balances; mapping(uint256 tokenId => address) private _tokenApprovals; mapping(address owner => mapping(address operator => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual returns (uint256) { if (owner == address(0)) { revert ERC721InvalidOwner(address(0)); } return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual returns (address) { return _requireOwned(tokenId); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual returns (string memory) { _requireOwned(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string.concat(baseURI, tokenId.toString()) : ""; } /** * @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, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual { _approve(to, tokenId, _msgSender()); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual returns (address) { _requireOwned(tokenId); return _getApproved(tokenId); } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual { if (to == address(0)) { revert ERC721InvalidReceiver(address(0)); } // Setting an "auth" arguments enables the `_isAuthorized` check which verifies that the token exists // (from != 0). Therefore, it is not needed to verify that the return value is not 0 here. address previousOwner = _update(to, tokenId, _msgSender()); if (previousOwner != from) { revert ERC721IncorrectOwner(from, tokenId, previousOwner); } } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual { transferFrom(from, to, tokenId); _checkOnERC721Received(from, to, tokenId, data); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist * * IMPORTANT: Any overrides to this function that add ownership of tokens not tracked by the * core ERC721 logic MUST be matched with the use of {_increaseBalance} to keep balances * consistent with ownership. The invariant to preserve is that for any address `a` the value returned by * `balanceOf(a)` must be equal to the number of tokens such that `_ownerOf(tokenId)` is `a`. */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted. */ function _getApproved(uint256 tokenId) internal view virtual returns (address) { return _tokenApprovals[tokenId]; } /** * @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in * particular (ignoring whether it is owned by `owner`). * * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this * assumption. */ function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) { return spender != address(0) && (owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender); } /** * @dev Checks if `spender` can operate on `tokenId`, assuming the provided `owner` is the actual owner. * Reverts if `spender` does not have approval from the provided `owner` for the given token or for all its assets * the `spender` for the specific `tokenId`. * * WARNING: This function assumes that `owner` is the actual owner of `tokenId` and does not verify this * assumption. */ function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual { if (!_isAuthorized(owner, spender, tokenId)) { if (owner == address(0)) { revert ERC721NonexistentToken(tokenId); } else { revert ERC721InsufficientApproval(spender, tokenId); } } } /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * NOTE: the value is limited to type(uint128).max. This protect against _balance overflow. It is unrealistic that * a uint256 would ever overflow from increments when these increments are bounded to uint128 values. * * WARNING: Increasing an account's balance using this function tends to be paired with an override of the * {_ownerOf} function to resolve the ownership of the corresponding tokens so that balances and ownership * remain consistent with one another. */ function _increaseBalance(address account, uint128 value) internal virtual { unchecked { _balances[account] += value; } } /** * @dev Transfers `tokenId` from its current owner to `to`, or alternatively mints (or burns) if the current owner * (or `to`) is the zero address. Returns the owner of the `tokenId` before the update. * * The `auth` argument is optional. If the value passed is non 0, then this function will check that * `auth` is either the owner of the token, or approved to operate on the token (by the owner). * * Emits a {Transfer} event. * * NOTE: If overriding this function in a way that tracks balances, see also {_increaseBalance}. */ function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) { address from = _ownerOf(tokenId); // Perform (optional) operator check if (auth != address(0)) { _checkAuthorized(from, auth, tokenId); } // Execute the update if (from != address(0)) { // Clear approval. No need to re-authorize or emit the Approval event _approve(address(0), tokenId, address(0), false); unchecked { _balances[from] -= 1; } } if (to != address(0)) { unchecked { _balances[to] += 1; } } _owners[tokenId] = to; emit Transfer(from, to, tokenId); return from; } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal { if (to == address(0)) { revert ERC721InvalidReceiver(address(0)); } address previousOwner = _update(to, tokenId, address(0)); if (previousOwner != address(0)) { revert ERC721InvalidSender(address(0)); } } /** * @dev Mints `tokenId`, transfers it to `to` and checks for `to` acceptance. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual { _mint(to, tokenId); _checkOnERC721Received(address(0), to, tokenId, data); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal { address previousOwner = _update(address(0), tokenId, address(0)); if (previousOwner == address(0)) { revert ERC721NonexistentToken(tokenId); } } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal { if (to == address(0)) { revert ERC721InvalidReceiver(address(0)); } address previousOwner = _update(to, tokenId, address(0)); if (previousOwner == address(0)) { revert ERC721NonexistentToken(tokenId); } else if (previousOwner != from) { revert ERC721IncorrectOwner(from, tokenId, previousOwner); } } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking that contract recipients * are aware of the ERC721 standard to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is like {safeTransferFrom} in the sense that it invokes * {IERC721Receiver-onERC721Received} on the receiver, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `tokenId` token must exist and be owned by `from`. * - `to` cannot be the zero address. * - `from` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId) internal { _safeTransfer(from, to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeTransfer-address-address-uint256-}[`_safeTransfer`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual { _transfer(from, to, tokenId); _checkOnERC721Received(from, to, tokenId, data); } /** * @dev Approve `to` to operate on `tokenId` * * The `auth` argument is optional. If the value passed is non 0, then this function will check that `auth` is * either the owner of the token, or approved to operate on all tokens held by this owner. * * Emits an {Approval} event. * * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument. */ function _approve(address to, uint256 tokenId, address auth) internal { _approve(to, tokenId, auth, true); } /** * @dev Variant of `_approve` with an optional flag to enable or disable the {Approval} event. The event is not * emitted in the context of transfers. */ function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual { // Avoid reading the owner unless necessary if (emitEvent || auth != address(0)) { address owner = _requireOwned(tokenId); // We do not use _isAuthorized because single-token approvals should not be able to call approve if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) { revert ERC721InvalidApprover(auth); } if (emitEvent) { emit Approval(owner, to, tokenId); } } _tokenApprovals[tokenId] = to; } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Requirements: * - operator can't be the address zero. * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { if (operator == address(0)) { revert ERC721InvalidOperator(operator); } _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned). * Returns the owner. * * Overrides to ownership logic should be done to {_ownerOf}. */ function _requireOwned(uint256 tokenId) internal view returns (address) { address owner = _ownerOf(tokenId); if (owner == address(0)) { revert ERC721NonexistentToken(tokenId); } return owner; } /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target address. This will revert if the * recipient doesn't accept the token transfer. The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private { if (to.code.length > 0) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { if (retval != IERC721Receiver.onERC721Received.selector) { revert ERC721InvalidReceiver(to); } } catch (bytes memory reason) { if (reason.length == 0) { revert ERC721InvalidReceiver(to); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.9.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; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } pragma solidity ^0.8.0; interface AggregatorV3Interface { function decimals() external view returns (uint8); function description() external view returns (string memory); function version() external view returns (uint256); function getRoundData( uint80 _roundId ) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound); function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound); } interface mainContract { function mint(address to, string memory uri) external returns (uint256); function safeMint(address to, string memory uri) external; } contract APETEST_SALE is Ownable, ReentrancyGuard { uint256 private _nextTokenId; mainContract public mainContractInstance; uint256 private _tokenPrice = 1000000000000000000; uint256 private _totalSupply = 10; uint256 private _totalMinted = 0; uint256[] public _wlPrice; mapping(address => uint256) public nonces; bool public normalMintStarted = false; bool public isLaunched = false; string public uri = "https://cbmdsup8tf.execute-api.eu-central-1.amazonaws.com/prod/metadata/679d0b58e1cb15f1181b9857/"; uint256 public platformFeeAmount = 0 ether; uint256 public platformFee = 10; IPyth pyth = IPyth(0x2880aB155794e7179c9eE2e38200202908C17B43); address private signerAddress = 0x9aC26D5af386f5950D3D94476aFB4060325c6976; address private aiowAddress = 0x9aC26D5af386f5950D3D94476aFB4060325c6976; constructor(address _initialOwner) Ownable(_initialOwner) { _wlPrice.push(1000000000000000000); } function checkRequirement(uint256 amount) internal view returns (bool) { return _totalSupply > _totalMinted + amount && isLaunched && normalMintStarted; } function safeMint(address to) public payable onlyOwner { require(_totalSupply > _totalMinted, "All token minted"); require(msg.value >= getRealPrice(), "invalid price recived"); mainContractInstance.safeMint(to, string(abi.encodePacked(uri,uintToString(_totalMinted), ".json"))); _totalMinted = _totalMinted + 1; } function uintToString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } function mint(uint256 amount) public payable { require(msg.value >= getTokenPrice(amount), "Price mismatch"); require(checkRequirement(amount), "Either batch is full or all token are mined or contract is not launched yet"); require(20 >= amount, "You can only max 20 mint at a time."); for (uint256 i = 0; i < amount; i++) { mainContractInstance.mint(msg.sender, string(abi.encodePacked(uri,uintToString(_totalMinted), ".json"))); platformFeeAmount += getRealPrice(); _totalMinted = _totalMinted + 1; } } function getTokenPrice(uint256 amount) view public returns (uint256) { return amount*(_tokenPrice + getRealPrice()); } function verifyAddressSigner(bytes memory signature) public view returns (bool) { bytes32 messageHash = keccak256(abi.encodePacked(msg.sender)); bytes32 ethSignedMessageHash = toEthSignedMessageHash(messageHash); return recoverSigner(ethSignedMessageHash, signature) == signerAddress; } function toEthSignedMessageHash(bytes32 _messageHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", _messageHash)); } function recoverSigner(bytes32 _ethSignedMessageHash, bytes memory _signature) internal pure returns (address) { require(_signature.length == 65, "Invalid signature length"); bytes32 r; bytes32 s; uint8 v; // Split the signature into r, s, and v variables assembly { r := mload(add(_signature, 32)) s := mload(add(_signature, 64)) v := byte(0, mload(add(_signature, 96))) } // Adjust the `v` value if necessary if (v < 27) { v += 27; } require(v == 27 || v == 28, "Invalid signature 'v' value"); // Perform ecrecover and return the signer address return ecrecover(_ethSignedMessageHash, v, r, s); } function startNormalMint() external onlyOwner { normalMintStarted = true; } function checkWLRequirement(uint256 amount) internal view returns (bool) { return _totalSupply > _totalMinted + amount && isLaunched && !normalMintStarted ; } function whitelistMint(bytes[] memory signature, uint256 rank, uint256 nouce, uint256 amount) public payable { require(msg.value >= getWhiteListPrice(rank , amount), "Price mismatch"); require(checkWLRequirement(amount), "Either batch is full or all token are minted or contract is not launched yet"); require(verifyAddressSigner(signature[0]), "Incorrect Signature"); require(20 >= amount, "You can only mint 20 at a time."); for (uint256 i = 0; i < amount; i++) { mainContractInstance.mint(msg.sender, string(abi.encodePacked(uri,uintToString(_totalMinted), ".json"))); platformFeeAmount += getRealPrice(); _totalMinted = _totalMinted + 1; } } function setwlPrice(uint256 wlPrice, uint256 rank) public onlyOwner { _wlPrice[rank] = wlPrice; } function addwlPrice(uint256 wlPrice) public onlyOwner { _wlPrice.push(wlPrice); } function getWhiteListPrice(uint256 rank, uint256 amount) view public returns (uint256) { return amount* (_wlPrice[rank] + getRealPrice()); } function launch(address _nftAddress) public onlyOwner { isLaunched = true; mainContractInstance = mainContract(_nftAddress); } function setTokenPrice(uint256 tokenPrice) public onlyOwner { _tokenPrice = tokenPrice; } function setAiowAddress(address _address) public onlyServer { aiowAddress = _address; } function setSignerAddress(address _signerAddress) public onlyServer { signerAddress = _signerAddress; } function setNFTContract(address _nftAddress) public onlyOwner { mainContractInstance = mainContract(_nftAddress); } function getRealPrice() public view returns (uint256) { PythStructs.Price memory priceData = pyth.getPriceUnsafe(0x15add95022ae13563a11992e727c91bdb6b55bc183d9d747436c80a483d8c864); return (10**26)/uint64(priceData.price); } modifier onlyServer { require(msg.sender == aiowAddress); _; } function withdraw() public onlyOwner nonReentrant { (bool hs, ) = payable(aiowAddress).call{value: platformFeeAmount}(''); require(hs); platformFeeAmount = 0 ether; (bool os, ) = payable(owner()).call{value: address(this).balance}(''); require(os); } function withdrawPlatformFee() public onlyServer nonReentrant { (bool hs, ) = payable(aiowAddress).call{value: platformFeeAmount}(''); require(hs); platformFeeAmount = 0 ether; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_initialOwner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_wlPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"wlPrice","type":"uint256"}],"name":"addwlPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRealPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rank","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getWhiteListPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLaunched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_nftAddress","type":"address"}],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mainContractInstance","outputs":[{"internalType":"contract mainContract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"normalMintStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platformFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platformFeeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setAiowAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nftAddress","type":"address"}],"name":"setNFTContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signerAddress","type":"address"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenPrice","type":"uint256"}],"name":"setTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"wlPrice","type":"uint256"},{"internalType":"uint256","name":"rank","type":"uint256"}],"name":"setwlPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startNormalMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"verifyAddressSigner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"signature","type":"bytes[]"},{"internalType":"uint256","name":"rank","type":"uint256"},{"internalType":"uint256","name":"nouce","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawPlatformFee","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052670de0b6b3a7640000600455600a60055560006006556000600960006101000a81548160ff0219169083151502179055506000600960016101000a81548160ff0219169083151502179055506040518060a00160405280606181526020016200349c60619139600a90816200007a9190620005bc565b506000600b55600a600c55732880ab155794e7179c9ee2e38200202908c17b43600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550739ac26d5af386f5950d3d94476afb4060325c6976600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550739ac26d5af386f5950d3d94476afb4060325c6976600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200019157600080fd5b50604051620034fd380380620034fd8339818101604052810190620001b791906200070d565b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200022d5760006040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040162000224919062000750565b60405180910390fd5b6200023e816200027e60201b60201c565b50600180819055506007670de0b6b3a76400009080600181540180825580915050600190039060005260206000200160009091909190915055506200076d565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003c457607f821691505b602082108103620003da57620003d96200037c565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004447fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000405565b62000450868362000405565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200049d62000497620004918462000468565b62000472565b62000468565b9050919050565b6000819050919050565b620004b9836200047c565b620004d1620004c882620004a4565b84845462000412565b825550505050565b600090565b620004e8620004d9565b620004f5818484620004ae565b505050565b5b818110156200051d5762000511600082620004de565b600181019050620004fb565b5050565b601f8211156200056c576200053681620003e0565b6200054184620003f5565b8101602085101562000551578190505b620005696200056085620003f5565b830182620004fa565b50505b505050565b600082821c905092915050565b6000620005916000198460080262000571565b1980831691505092915050565b6000620005ac83836200057e565b9150826002028217905092915050565b620005c78262000342565b67ffffffffffffffff811115620005e357620005e26200034d565b5b620005ef8254620003ab565b620005fc82828562000521565b600060209050601f8311600181146200063457600084156200061f578287015190505b6200062b85826200059e565b8655506200069b565b601f1984166200064486620003e0565b60005b828110156200066e5784890151825560018201915060208501945060208101905062000647565b868310156200068e57848901516200068a601f8916826200057e565b8355505b6001600288020188555050505b505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006d582620006a8565b9050919050565b620006e781620006c8565b8114620006f357600080fd5b50565b6000815190506200070781620006dc565b92915050565b600060208284031215620007265762000725620006a3565b5b60006200073684828501620006f6565b91505092915050565b6200074a81620006c8565b82525050565b60006020820190506200076760008301846200073f565b92915050565b612d1f806200077d6000396000f3fe6080604052600436106101b75760003560e01c8063715018a6116100ec578063a7ccabdf1161008a578063c457fb3711610064578063c457fb3714610581578063e6a31db7146105be578063eac989f8146105e9578063f2fde38b14610614576101b7565b8063a7ccabdf14610511578063b302334c1461053a578063bd74c04614610556576101b7565b806389985047116100c657806389985047146104785780638af664d2146104a15780638da5cb5b146104ca578063a0712d68146104f5576101b7565b8063715018a6146103f95780637b5c66f3146104105780637ecebe001461043b576101b7565b806330df32001161015957806348b0d31a1161013357806348b0d31a1461033f5780634b85b1c2146103685780635681afa1146103a55780636a61e5fc146103d0576101b7565b806330df3200146102cf5780633ccfd60b1461030c57806340d097c314610323576101b7565b8063202cefd511610195578063202cefd514610239578063214013ca1461025057806326232a2e14610279578063307aebc9146102a4576101b7565b8063046dc166146101bc578063151a4ee9146101e5578063152ac4f514610222575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190611a26565b61063d565b005b3480156101f157600080fd5b5061020c60048036038101906102079190611a89565b6106db565b6040516102199190611ad8565b60405180910390f35b34801561022e57600080fd5b50610237610721565b005b34801561024557600080fd5b5061024e610746565b005b34801561025c57600080fd5b5061027760048036038101906102729190611a26565b610855565b005b34801561028557600080fd5b5061028e6108bc565b60405161029b9190611ad8565b60405180910390f35b3480156102b057600080fd5b506102b96108c2565b6040516102c69190611b0e565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f19190611c6f565b6108d5565b6040516103039190611b0e565b60405180910390f35b34801561031857600080fd5b50610321610971565b005b61033d60048036038101906103389190611a26565b610aac565b005b34801561034b57600080fd5b5061036660048036038101906103619190611cb8565b610c17565b005b34801561037457600080fd5b5061038f600480360381019061038a9190611cb8565b610c4b565b60405161039c9190611ad8565b60405180910390f35b3480156103b157600080fd5b506103ba610c6f565b6040516103c79190611ad8565b60405180910390f35b3480156103dc57600080fd5b506103f760048036038101906103f29190611cb8565b610d68565b005b34801561040557600080fd5b5061040e610d7a565b005b34801561041c57600080fd5b50610425610d8e565b6040516104329190611b0e565b60405180910390f35b34801561044757600080fd5b50610462600480360381019061045d9190611a26565b610da1565b60405161046f9190611ad8565b60405180910390f35b34801561048457600080fd5b5061049f600480360381019061049a9190611a89565b610db9565b005b3480156104ad57600080fd5b506104c860048036038101906104c39190611a26565b610de8565b005b3480156104d657600080fd5b506104df610e86565b6040516104ec9190611cf4565b60405180910390f35b61050f600480360381019061050a9190611cb8565b610eaf565b005b34801561051d57600080fd5b5061053860048036038101906105339190611a26565b6110a4565b005b610554600480360381019061054f9190611df5565b6110f0565b005b34801561056257600080fd5b5061056b61134c565b6040516105789190611ad8565b60405180910390f35b34801561058d57600080fd5b506105a860048036038101906105a39190611cb8565b611352565b6040516105b59190611ad8565b60405180910390f35b3480156105ca57600080fd5b506105d361137b565b6040516105e09190611ed7565b60405180910390f35b3480156105f557600080fd5b506105fe6113a1565b60405161060b9190611f71565b60405180910390f35b34801561062057600080fd5b5061063b60048036038101906106369190611a26565b61142f565b005b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069757600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006106e5610c6f565b600784815481106106f9576106f8611f93565b5b906000526020600020015461070e9190611ff1565b826107199190612025565b905092915050565b6107296114b5565b6001600960006101000a81548160ff021916908315150217905550565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107a057600080fd5b6107a861153c565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b546040516107f290612098565b60006040518083038185875af1925050503d806000811461082f576040519150601f19603f3d011682016040523d82523d6000602084013e610834565b606091505b505090508061084257600080fd5b6000600b819055505061085361158b565b565b61085d6114b5565b6001600960016101000a81548160ff02191690831515021790555080600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c5481565b600960019054906101000a900460ff1681565b600080336040516020016108e991906120f5565b604051602081830303815290604052805190602001209050600061090c82611594565b9050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661095182866115c4565b73ffffffffffffffffffffffffffffffffffffffff161492505050919050565b6109796114b5565b61098161153c565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b546040516109cb90612098565b60006040518083038185875af1925050503d8060008114610a08576040519150601f19603f3d011682016040523d82523d6000602084013e610a0d565b606091505b5050905080610a1b57600080fd5b6000600b819055506000610a2d610e86565b73ffffffffffffffffffffffffffffffffffffffff1647604051610a5090612098565b60006040518083038185875af1925050503d8060008114610a8d576040519150601f19603f3d011682016040523d82523d6000602084013e610a92565b606091505b5050905080610aa057600080fd5b5050610aaa61158b565b565b610ab46114b5565b60065460055411610afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af19061215c565b60405180910390fd5b610b02610c6f565b341015610b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3b906121c8565b60405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d204c45e82600a610b906006546116f1565b604051602001610ba1929190612368565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610bcd929190612397565b600060405180830381600087803b158015610be757600080fd5b505af1158015610bfb573d6000803e3d6000fd5b505050506001600654610c0e9190611ff1565b60068190555050565b610c1f6114b5565b600781908060018154018082558091505060019003906000526020600020016000909190919091505550565b60078181548110610c5b57600080fd5b906000526020600020016000915090505481565b600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166396834ad37f15add95022ae13563a11992e727c91bdb6b55bc183d9d747436c80a483d8c8646040518263ffffffff1660e01b8152600401610ced9190612419565b608060405180830381865afa158015610d0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2e9190612578565b9050806000015167ffffffffffffffff166a52b7d2dcc80cd2e4000000610d5591906125eb565b6affffffffffffffffffffff1691505090565b610d706114b5565b8060048190555050565b610d826114b5565b610d8c6000611851565b565b600960009054906101000a900460ff1681565b60086020528060005260406000206000915090505481565b610dc16114b5565b8160078281548110610dd657610dd5611f93565b5b90600052602060002001819055505050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e4257600080fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610eb881611352565b341015610efa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef190612668565b60405180910390fd5b610f0381611915565b610f42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3990612720565b60405180910390fd5b8060141015610f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7d906127b2565b60405180910390fd5b60005b818110156110a057600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0def52133600a610fdd6006546116f1565b604051602001610fee929190612368565b6040516020818303038152906040526040518363ffffffff1660e01b815260040161101a929190612397565b6020604051808303816000875af1158015611039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105d91906127d2565b50611066610c6f565b600b60008282546110779190611ff1565b92505081905550600160065461108d9190611ff1565b6006819055508080600101915050610f89565b5050565b6110ac6114b5565b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6110fa83826106db565b34101561113c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113390612668565b60405180910390fd5b61114581611960565b611184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117b90612897565b60405180910390fd5b6111a88460008151811061119b5761119a611f93565b5b60200260200101516108d5565b6111e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111de90612903565b60405180910390fd5b806014101561122b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112229061296f565b60405180910390fd5b60005b8181101561134557600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0def52133600a6112826006546116f1565b604051602001611293929190612368565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016112bf929190612397565b6020604051808303816000875af11580156112de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130291906127d2565b5061130b610c6f565b600b600082825461131c9190611ff1565b9250508190555060016006546113329190611ff1565b600681905550808060010191505061122e565b5050505050565b600b5481565b600061135c610c6f565b6004546113699190611ff1565b826113749190612025565b9050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a80546113ae90612217565b80601f01602080910402602001604051908101604052809291908181526020018280546113da90612217565b80156114275780601f106113fc57610100808354040283529160200191611427565b820191906000526020600020905b81548152906001019060200180831161140a57829003601f168201915b505050505081565b6114376114b5565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114a95760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016114a09190611cf4565b60405180910390fd5b6114b281611851565b50565b6114bd6119ac565b73ffffffffffffffffffffffffffffffffffffffff166114db610e86565b73ffffffffffffffffffffffffffffffffffffffff161461153a576114fe6119ac565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016115319190611cf4565b60405180910390fd5b565b600260015403611581576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611578906129db565b60405180910390fd5b6002600181905550565b60018081905550565b6000816040516020016115a79190612a68565b604051602081830303815290604052805190602001209050919050565b6000604182511461160a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160190612ada565b60405180910390fd5b60008060006020850151925060408501519150606085015160001a9050601b8160ff16101561164357601b816116409190612b07565b90505b601b8160ff1614806116585750601c8160ff16145b611697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168e90612b88565b60405180910390fd5b600186828585604051600081526020016040526040516116ba9493929190612bc6565b6020604051602081039080840390855afa1580156116dc573d6000803e3d6000fd5b50505060206040510351935050505092915050565b606060008203611738576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061184c565b600082905060005b6000821461176a57808061175390612c0b565b915050600a826117639190612c53565b9150611740565b60008167ffffffffffffffff81111561178657611785611b44565b5b6040519080825280601f01601f1916602001820160405280156117b85781602001600182028036833780820191505090505b5090505b60008514611845576001826117d19190612c84565b9150600a856117e09190612cb8565b60306117ec9190611ff1565b60f81b81838151811061180257611801611f93565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561183e9190612c53565b94506117bc565b8093505050505b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000816006546119259190611ff1565b6005541180156119415750600960019054906101000a900460ff165b80156119595750600960009054906101000a900460ff165b9050919050565b6000816006546119709190611ff1565b60055411801561198c5750600960019054906101000a900460ff165b80156119a55750600960009054906101000a900460ff16155b9050919050565b600033905090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119f3826119c8565b9050919050565b611a03816119e8565b8114611a0e57600080fd5b50565b600081359050611a20816119fa565b92915050565b600060208284031215611a3c57611a3b6119be565b5b6000611a4a84828501611a11565b91505092915050565b6000819050919050565b611a6681611a53565b8114611a7157600080fd5b50565b600081359050611a8381611a5d565b92915050565b60008060408385031215611aa057611a9f6119be565b5b6000611aae85828601611a74565b9250506020611abf85828601611a74565b9150509250929050565b611ad281611a53565b82525050565b6000602082019050611aed6000830184611ac9565b92915050565b60008115159050919050565b611b0881611af3565b82525050565b6000602082019050611b236000830184611aff565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611b7c82611b33565b810181811067ffffffffffffffff82111715611b9b57611b9a611b44565b5b80604052505050565b6000611bae6119b4565b9050611bba8282611b73565b919050565b600067ffffffffffffffff821115611bda57611bd9611b44565b5b611be382611b33565b9050602081019050919050565b82818337600083830152505050565b6000611c12611c0d84611bbf565b611ba4565b905082815260208101848484011115611c2e57611c2d611b2e565b5b611c39848285611bf0565b509392505050565b600082601f830112611c5657611c55611b29565b5b8135611c66848260208601611bff565b91505092915050565b600060208284031215611c8557611c846119be565b5b600082013567ffffffffffffffff811115611ca357611ca26119c3565b5b611caf84828501611c41565b91505092915050565b600060208284031215611cce57611ccd6119be565b5b6000611cdc84828501611a74565b91505092915050565b611cee816119e8565b82525050565b6000602082019050611d096000830184611ce5565b92915050565b600067ffffffffffffffff821115611d2a57611d29611b44565b5b602082029050602081019050919050565b600080fd5b6000611d53611d4e84611d0f565b611ba4565b90508083825260208201905060208402830185811115611d7657611d75611d3b565b5b835b81811015611dbd57803567ffffffffffffffff811115611d9b57611d9a611b29565b5b808601611da88982611c41565b85526020850194505050602081019050611d78565b5050509392505050565b600082601f830112611ddc57611ddb611b29565b5b8135611dec848260208601611d40565b91505092915050565b60008060008060808587031215611e0f57611e0e6119be565b5b600085013567ffffffffffffffff811115611e2d57611e2c6119c3565b5b611e3987828801611dc7565b9450506020611e4a87828801611a74565b9350506040611e5b87828801611a74565b9250506060611e6c87828801611a74565b91505092959194509250565b6000819050919050565b6000611e9d611e98611e93846119c8565b611e78565b6119c8565b9050919050565b6000611eaf82611e82565b9050919050565b6000611ec182611ea4565b9050919050565b611ed181611eb6565b82525050565b6000602082019050611eec6000830184611ec8565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611f2c578082015181840152602081019050611f11565b60008484015250505050565b6000611f4382611ef2565b611f4d8185611efd565b9350611f5d818560208601611f0e565b611f6681611b33565b840191505092915050565b60006020820190508181036000830152611f8b8184611f38565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611ffc82611a53565b915061200783611a53565b925082820190508082111561201f5761201e611fc2565b5b92915050565b600061203082611a53565b915061203b83611a53565b925082820261204981611a53565b915082820484148315176120605761205f611fc2565b5b5092915050565b600081905092915050565b50565b6000612082600083612067565b915061208d82612072565b600082019050919050565b60006120a382612075565b9150819050919050565b60008160601b9050919050565b60006120c5826120ad565b9050919050565b60006120d7826120ba565b9050919050565b6120ef6120ea826119e8565b6120cc565b82525050565b600061210182846120de565b60148201915081905092915050565b7f416c6c20746f6b656e206d696e74656400000000000000000000000000000000600082015250565b6000612146601083611efd565b915061215182612110565b602082019050919050565b6000602082019050818103600083015261217581612139565b9050919050565b7f696e76616c696420707269636520726563697665640000000000000000000000600082015250565b60006121b2601583611efd565b91506121bd8261217c565b602082019050919050565b600060208201905081810360008301526121e1816121a5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061222f57607f821691505b602082108103612242576122416121e8565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461227581612217565b61227f8186612248565b9450600182166000811461229a57600181146122af576122e2565b60ff19831686528115158202860193506122e2565b6122b885612253565b60005b838110156122da578154818901526001820191506020810190506122bb565b838801955050505b50505092915050565b60006122f682611ef2565b6123008185612248565b9350612310818560208601611f0e565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000612352600583612248565b915061235d8261231c565b600582019050919050565b60006123748285612268565b915061238082846122eb565b915061238b82612345565b91508190509392505050565b60006040820190506123ac6000830185611ce5565b81810360208301526123be8184611f38565b90509392505050565b6000819050919050565b6000819050919050565b60008160001b9050919050565b60006124036123fe6123f9846123c7565b6123db565b6123d1565b9050919050565b612413816123e8565b82525050565b600060208201905061242e600083018461240a565b92915050565b600080fd5b60008160070b9050919050565b61244f81612439565b811461245a57600080fd5b50565b60008151905061246c81612446565b92915050565b600067ffffffffffffffff82169050919050565b61248f81612472565b811461249a57600080fd5b50565b6000815190506124ac81612486565b92915050565b60008160030b9050919050565b6124c8816124b2565b81146124d357600080fd5b50565b6000815190506124e5816124bf565b92915050565b6000815190506124fa81611a5d565b92915050565b60006080828403121561251657612515612434565b5b6125206080611ba4565b905060006125308482850161245d565b60008301525060206125448482850161249d565b6020830152506040612558848285016124d6565b604083015250606061256c848285016124eb565b60608301525092915050565b60006080828403121561258e5761258d6119be565b5b600061259c84828501612500565b91505092915050565b60006affffffffffffffffffffff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006125f6826125a5565b9150612601836125a5565b925082612611576126106125bc565b5b828204905092915050565b7f5072696365206d69736d61746368000000000000000000000000000000000000600082015250565b6000612652600e83611efd565b915061265d8261261c565b602082019050919050565b6000602082019050818103600083015261268181612645565b9050919050565b7f4569746865722062617463682069732066756c6c206f7220616c6c20746f6b6560008201527f6e20617265206d696e6564206f7220636f6e7472616374206973206e6f74206c60208201527f61756e6368656420796574000000000000000000000000000000000000000000604082015250565b600061270a604b83611efd565b915061271582612688565b606082019050919050565b60006020820190508181036000830152612739816126fd565b9050919050565b7f596f752063616e206f6e6c79206d6178203230206d696e74206174206120746960008201527f6d652e0000000000000000000000000000000000000000000000000000000000602082015250565b600061279c602383611efd565b91506127a782612740565b604082019050919050565b600060208201905081810360008301526127cb8161278f565b9050919050565b6000602082840312156127e8576127e76119be565b5b60006127f6848285016124eb565b91505092915050565b7f4569746865722062617463682069732066756c6c206f7220616c6c20746f6b6560008201527f6e20617265206d696e746564206f7220636f6e7472616374206973206e6f742060208201527f6c61756e63686564207965740000000000000000000000000000000000000000604082015250565b6000612881604c83611efd565b915061288c826127ff565b606082019050919050565b600060208201905081810360008301526128b081612874565b9050919050565b7f496e636f7272656374205369676e617475726500000000000000000000000000600082015250565b60006128ed601383611efd565b91506128f8826128b7565b602082019050919050565b6000602082019050818103600083015261291c816128e0565b9050919050565b7f596f752063616e206f6e6c79206d696e7420323020617420612074696d652e00600082015250565b6000612959601f83611efd565b915061296482612923565b602082019050919050565b600060208201905081810360008301526129888161294c565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006129c5601f83611efd565b91506129d08261298f565b602082019050919050565b600060208201905081810360008301526129f4816129b8565b9050919050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000612a31601c83612248565b9150612a3c826129fb565b601c82019050919050565b6000819050919050565b612a62612a5d826123d1565b612a47565b82525050565b6000612a7382612a24565b9150612a7f8284612a51565b60208201915081905092915050565b7f496e76616c6964207369676e6174757265206c656e6774680000000000000000600082015250565b6000612ac4601883611efd565b9150612acf82612a8e565b602082019050919050565b60006020820190508181036000830152612af381612ab7565b9050919050565b600060ff82169050919050565b6000612b1282612afa565b9150612b1d83612afa565b9250828201905060ff811115612b3657612b35611fc2565b5b92915050565b7f496e76616c6964207369676e6174757265202776272076616c75650000000000600082015250565b6000612b72601b83611efd565b9150612b7d82612b3c565b602082019050919050565b60006020820190508181036000830152612ba181612b65565b9050919050565b612bb1816123d1565b82525050565b612bc081612afa565b82525050565b6000608082019050612bdb6000830187612ba8565b612be86020830186612bb7565b612bf56040830185612ba8565b612c026060830184612ba8565b95945050505050565b6000612c1682611a53565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612c4857612c47611fc2565b5b600182019050919050565b6000612c5e82611a53565b9150612c6983611a53565b925082612c7957612c786125bc565b5b828204905092915050565b6000612c8f82611a53565b9150612c9a83611a53565b9250828203905081811115612cb257612cb1611fc2565b5b92915050565b6000612cc382611a53565b9150612cce83611a53565b925082612cde57612cdd6125bc565b5b82820690509291505056fea26469706673582212203b18a728993bd49320ec0b965d97cfef7f285ce58cd72fc937117fb0a1c4ac6464736f6c6343000818003368747470733a2f2f63626d647375703874662e657865637574652d6170692e65752d63656e7472616c2d312e616d617a6f6e6177732e636f6d2f70726f642f6d657461646174612f3637396430623538653163623135663131383162393835372f000000000000000000000000ee9dece310dda4dfcbcf0e63e3a19c7df3b99274
Deployed Bytecode
0x6080604052600436106101b75760003560e01c8063715018a6116100ec578063a7ccabdf1161008a578063c457fb3711610064578063c457fb3714610581578063e6a31db7146105be578063eac989f8146105e9578063f2fde38b14610614576101b7565b8063a7ccabdf14610511578063b302334c1461053a578063bd74c04614610556576101b7565b806389985047116100c657806389985047146104785780638af664d2146104a15780638da5cb5b146104ca578063a0712d68146104f5576101b7565b8063715018a6146103f95780637b5c66f3146104105780637ecebe001461043b576101b7565b806330df32001161015957806348b0d31a1161013357806348b0d31a1461033f5780634b85b1c2146103685780635681afa1146103a55780636a61e5fc146103d0576101b7565b806330df3200146102cf5780633ccfd60b1461030c57806340d097c314610323576101b7565b8063202cefd511610195578063202cefd514610239578063214013ca1461025057806326232a2e14610279578063307aebc9146102a4576101b7565b8063046dc166146101bc578063151a4ee9146101e5578063152ac4f514610222575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190611a26565b61063d565b005b3480156101f157600080fd5b5061020c60048036038101906102079190611a89565b6106db565b6040516102199190611ad8565b60405180910390f35b34801561022e57600080fd5b50610237610721565b005b34801561024557600080fd5b5061024e610746565b005b34801561025c57600080fd5b5061027760048036038101906102729190611a26565b610855565b005b34801561028557600080fd5b5061028e6108bc565b60405161029b9190611ad8565b60405180910390f35b3480156102b057600080fd5b506102b96108c2565b6040516102c69190611b0e565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f19190611c6f565b6108d5565b6040516103039190611b0e565b60405180910390f35b34801561031857600080fd5b50610321610971565b005b61033d60048036038101906103389190611a26565b610aac565b005b34801561034b57600080fd5b5061036660048036038101906103619190611cb8565b610c17565b005b34801561037457600080fd5b5061038f600480360381019061038a9190611cb8565b610c4b565b60405161039c9190611ad8565b60405180910390f35b3480156103b157600080fd5b506103ba610c6f565b6040516103c79190611ad8565b60405180910390f35b3480156103dc57600080fd5b506103f760048036038101906103f29190611cb8565b610d68565b005b34801561040557600080fd5b5061040e610d7a565b005b34801561041c57600080fd5b50610425610d8e565b6040516104329190611b0e565b60405180910390f35b34801561044757600080fd5b50610462600480360381019061045d9190611a26565b610da1565b60405161046f9190611ad8565b60405180910390f35b34801561048457600080fd5b5061049f600480360381019061049a9190611a89565b610db9565b005b3480156104ad57600080fd5b506104c860048036038101906104c39190611a26565b610de8565b005b3480156104d657600080fd5b506104df610e86565b6040516104ec9190611cf4565b60405180910390f35b61050f600480360381019061050a9190611cb8565b610eaf565b005b34801561051d57600080fd5b5061053860048036038101906105339190611a26565b6110a4565b005b610554600480360381019061054f9190611df5565b6110f0565b005b34801561056257600080fd5b5061056b61134c565b6040516105789190611ad8565b60405180910390f35b34801561058d57600080fd5b506105a860048036038101906105a39190611cb8565b611352565b6040516105b59190611ad8565b60405180910390f35b3480156105ca57600080fd5b506105d361137b565b6040516105e09190611ed7565b60405180910390f35b3480156105f557600080fd5b506105fe6113a1565b60405161060b9190611f71565b60405180910390f35b34801561062057600080fd5b5061063b60048036038101906106369190611a26565b61142f565b005b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461069757600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006106e5610c6f565b600784815481106106f9576106f8611f93565b5b906000526020600020015461070e9190611ff1565b826107199190612025565b905092915050565b6107296114b5565b6001600960006101000a81548160ff021916908315150217905550565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107a057600080fd5b6107a861153c565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b546040516107f290612098565b60006040518083038185875af1925050503d806000811461082f576040519150601f19603f3d011682016040523d82523d6000602084013e610834565b606091505b505090508061084257600080fd5b6000600b819055505061085361158b565b565b61085d6114b5565b6001600960016101000a81548160ff02191690831515021790555080600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c5481565b600960019054906101000a900460ff1681565b600080336040516020016108e991906120f5565b604051602081830303815290604052805190602001209050600061090c82611594565b9050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661095182866115c4565b73ffffffffffffffffffffffffffffffffffffffff161492505050919050565b6109796114b5565b61098161153c565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600b546040516109cb90612098565b60006040518083038185875af1925050503d8060008114610a08576040519150601f19603f3d011682016040523d82523d6000602084013e610a0d565b606091505b5050905080610a1b57600080fd5b6000600b819055506000610a2d610e86565b73ffffffffffffffffffffffffffffffffffffffff1647604051610a5090612098565b60006040518083038185875af1925050503d8060008114610a8d576040519150601f19603f3d011682016040523d82523d6000602084013e610a92565b606091505b5050905080610aa057600080fd5b5050610aaa61158b565b565b610ab46114b5565b60065460055411610afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af19061215c565b60405180910390fd5b610b02610c6f565b341015610b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3b906121c8565b60405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d204c45e82600a610b906006546116f1565b604051602001610ba1929190612368565b6040516020818303038152906040526040518363ffffffff1660e01b8152600401610bcd929190612397565b600060405180830381600087803b158015610be757600080fd5b505af1158015610bfb573d6000803e3d6000fd5b505050506001600654610c0e9190611ff1565b60068190555050565b610c1f6114b5565b600781908060018154018082558091505060019003906000526020600020016000909190919091505550565b60078181548110610c5b57600080fd5b906000526020600020016000915090505481565b600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166396834ad37f15add95022ae13563a11992e727c91bdb6b55bc183d9d747436c80a483d8c8646040518263ffffffff1660e01b8152600401610ced9190612419565b608060405180830381865afa158015610d0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2e9190612578565b9050806000015167ffffffffffffffff166a52b7d2dcc80cd2e4000000610d5591906125eb565b6affffffffffffffffffffff1691505090565b610d706114b5565b8060048190555050565b610d826114b5565b610d8c6000611851565b565b600960009054906101000a900460ff1681565b60086020528060005260406000206000915090505481565b610dc16114b5565b8160078281548110610dd657610dd5611f93565b5b90600052602060002001819055505050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e4257600080fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610eb881611352565b341015610efa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef190612668565b60405180910390fd5b610f0381611915565b610f42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3990612720565b60405180910390fd5b8060141015610f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7d906127b2565b60405180910390fd5b60005b818110156110a057600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0def52133600a610fdd6006546116f1565b604051602001610fee929190612368565b6040516020818303038152906040526040518363ffffffff1660e01b815260040161101a929190612397565b6020604051808303816000875af1158015611039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105d91906127d2565b50611066610c6f565b600b60008282546110779190611ff1565b92505081905550600160065461108d9190611ff1565b6006819055508080600101915050610f89565b5050565b6110ac6114b5565b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6110fa83826106db565b34101561113c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113390612668565b60405180910390fd5b61114581611960565b611184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117b90612897565b60405180910390fd5b6111a88460008151811061119b5761119a611f93565b5b60200260200101516108d5565b6111e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111de90612903565b60405180910390fd5b806014101561122b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112229061296f565b60405180910390fd5b60005b8181101561134557600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0def52133600a6112826006546116f1565b604051602001611293929190612368565b6040516020818303038152906040526040518363ffffffff1660e01b81526004016112bf929190612397565b6020604051808303816000875af11580156112de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130291906127d2565b5061130b610c6f565b600b600082825461131c9190611ff1565b9250508190555060016006546113329190611ff1565b600681905550808060010191505061122e565b5050505050565b600b5481565b600061135c610c6f565b6004546113699190611ff1565b826113749190612025565b9050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a80546113ae90612217565b80601f01602080910402602001604051908101604052809291908181526020018280546113da90612217565b80156114275780601f106113fc57610100808354040283529160200191611427565b820191906000526020600020905b81548152906001019060200180831161140a57829003601f168201915b505050505081565b6114376114b5565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114a95760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016114a09190611cf4565b60405180910390fd5b6114b281611851565b50565b6114bd6119ac565b73ffffffffffffffffffffffffffffffffffffffff166114db610e86565b73ffffffffffffffffffffffffffffffffffffffff161461153a576114fe6119ac565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016115319190611cf4565b60405180910390fd5b565b600260015403611581576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611578906129db565b60405180910390fd5b6002600181905550565b60018081905550565b6000816040516020016115a79190612a68565b604051602081830303815290604052805190602001209050919050565b6000604182511461160a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160190612ada565b60405180910390fd5b60008060006020850151925060408501519150606085015160001a9050601b8160ff16101561164357601b816116409190612b07565b90505b601b8160ff1614806116585750601c8160ff16145b611697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168e90612b88565b60405180910390fd5b600186828585604051600081526020016040526040516116ba9493929190612bc6565b6020604051602081039080840390855afa1580156116dc573d6000803e3d6000fd5b50505060206040510351935050505092915050565b606060008203611738576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061184c565b600082905060005b6000821461176a57808061175390612c0b565b915050600a826117639190612c53565b9150611740565b60008167ffffffffffffffff81111561178657611785611b44565b5b6040519080825280601f01601f1916602001820160405280156117b85781602001600182028036833780820191505090505b5090505b60008514611845576001826117d19190612c84565b9150600a856117e09190612cb8565b60306117ec9190611ff1565b60f81b81838151811061180257611801611f93565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561183e9190612c53565b94506117bc565b8093505050505b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000816006546119259190611ff1565b6005541180156119415750600960019054906101000a900460ff165b80156119595750600960009054906101000a900460ff165b9050919050565b6000816006546119709190611ff1565b60055411801561198c5750600960019054906101000a900460ff165b80156119a55750600960009054906101000a900460ff16155b9050919050565b600033905090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119f3826119c8565b9050919050565b611a03816119e8565b8114611a0e57600080fd5b50565b600081359050611a20816119fa565b92915050565b600060208284031215611a3c57611a3b6119be565b5b6000611a4a84828501611a11565b91505092915050565b6000819050919050565b611a6681611a53565b8114611a7157600080fd5b50565b600081359050611a8381611a5d565b92915050565b60008060408385031215611aa057611a9f6119be565b5b6000611aae85828601611a74565b9250506020611abf85828601611a74565b9150509250929050565b611ad281611a53565b82525050565b6000602082019050611aed6000830184611ac9565b92915050565b60008115159050919050565b611b0881611af3565b82525050565b6000602082019050611b236000830184611aff565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611b7c82611b33565b810181811067ffffffffffffffff82111715611b9b57611b9a611b44565b5b80604052505050565b6000611bae6119b4565b9050611bba8282611b73565b919050565b600067ffffffffffffffff821115611bda57611bd9611b44565b5b611be382611b33565b9050602081019050919050565b82818337600083830152505050565b6000611c12611c0d84611bbf565b611ba4565b905082815260208101848484011115611c2e57611c2d611b2e565b5b611c39848285611bf0565b509392505050565b600082601f830112611c5657611c55611b29565b5b8135611c66848260208601611bff565b91505092915050565b600060208284031215611c8557611c846119be565b5b600082013567ffffffffffffffff811115611ca357611ca26119c3565b5b611caf84828501611c41565b91505092915050565b600060208284031215611cce57611ccd6119be565b5b6000611cdc84828501611a74565b91505092915050565b611cee816119e8565b82525050565b6000602082019050611d096000830184611ce5565b92915050565b600067ffffffffffffffff821115611d2a57611d29611b44565b5b602082029050602081019050919050565b600080fd5b6000611d53611d4e84611d0f565b611ba4565b90508083825260208201905060208402830185811115611d7657611d75611d3b565b5b835b81811015611dbd57803567ffffffffffffffff811115611d9b57611d9a611b29565b5b808601611da88982611c41565b85526020850194505050602081019050611d78565b5050509392505050565b600082601f830112611ddc57611ddb611b29565b5b8135611dec848260208601611d40565b91505092915050565b60008060008060808587031215611e0f57611e0e6119be565b5b600085013567ffffffffffffffff811115611e2d57611e2c6119c3565b5b611e3987828801611dc7565b9450506020611e4a87828801611a74565b9350506040611e5b87828801611a74565b9250506060611e6c87828801611a74565b91505092959194509250565b6000819050919050565b6000611e9d611e98611e93846119c8565b611e78565b6119c8565b9050919050565b6000611eaf82611e82565b9050919050565b6000611ec182611ea4565b9050919050565b611ed181611eb6565b82525050565b6000602082019050611eec6000830184611ec8565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611f2c578082015181840152602081019050611f11565b60008484015250505050565b6000611f4382611ef2565b611f4d8185611efd565b9350611f5d818560208601611f0e565b611f6681611b33565b840191505092915050565b60006020820190508181036000830152611f8b8184611f38565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611ffc82611a53565b915061200783611a53565b925082820190508082111561201f5761201e611fc2565b5b92915050565b600061203082611a53565b915061203b83611a53565b925082820261204981611a53565b915082820484148315176120605761205f611fc2565b5b5092915050565b600081905092915050565b50565b6000612082600083612067565b915061208d82612072565b600082019050919050565b60006120a382612075565b9150819050919050565b60008160601b9050919050565b60006120c5826120ad565b9050919050565b60006120d7826120ba565b9050919050565b6120ef6120ea826119e8565b6120cc565b82525050565b600061210182846120de565b60148201915081905092915050565b7f416c6c20746f6b656e206d696e74656400000000000000000000000000000000600082015250565b6000612146601083611efd565b915061215182612110565b602082019050919050565b6000602082019050818103600083015261217581612139565b9050919050565b7f696e76616c696420707269636520726563697665640000000000000000000000600082015250565b60006121b2601583611efd565b91506121bd8261217c565b602082019050919050565b600060208201905081810360008301526121e1816121a5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061222f57607f821691505b602082108103612242576122416121e8565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461227581612217565b61227f8186612248565b9450600182166000811461229a57600181146122af576122e2565b60ff19831686528115158202860193506122e2565b6122b885612253565b60005b838110156122da578154818901526001820191506020810190506122bb565b838801955050505b50505092915050565b60006122f682611ef2565b6123008185612248565b9350612310818560208601611f0e565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000612352600583612248565b915061235d8261231c565b600582019050919050565b60006123748285612268565b915061238082846122eb565b915061238b82612345565b91508190509392505050565b60006040820190506123ac6000830185611ce5565b81810360208301526123be8184611f38565b90509392505050565b6000819050919050565b6000819050919050565b60008160001b9050919050565b60006124036123fe6123f9846123c7565b6123db565b6123d1565b9050919050565b612413816123e8565b82525050565b600060208201905061242e600083018461240a565b92915050565b600080fd5b60008160070b9050919050565b61244f81612439565b811461245a57600080fd5b50565b60008151905061246c81612446565b92915050565b600067ffffffffffffffff82169050919050565b61248f81612472565b811461249a57600080fd5b50565b6000815190506124ac81612486565b92915050565b60008160030b9050919050565b6124c8816124b2565b81146124d357600080fd5b50565b6000815190506124e5816124bf565b92915050565b6000815190506124fa81611a5d565b92915050565b60006080828403121561251657612515612434565b5b6125206080611ba4565b905060006125308482850161245d565b60008301525060206125448482850161249d565b6020830152506040612558848285016124d6565b604083015250606061256c848285016124eb565b60608301525092915050565b60006080828403121561258e5761258d6119be565b5b600061259c84828501612500565b91505092915050565b60006affffffffffffffffffffff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006125f6826125a5565b9150612601836125a5565b925082612611576126106125bc565b5b828204905092915050565b7f5072696365206d69736d61746368000000000000000000000000000000000000600082015250565b6000612652600e83611efd565b915061265d8261261c565b602082019050919050565b6000602082019050818103600083015261268181612645565b9050919050565b7f4569746865722062617463682069732066756c6c206f7220616c6c20746f6b6560008201527f6e20617265206d696e6564206f7220636f6e7472616374206973206e6f74206c60208201527f61756e6368656420796574000000000000000000000000000000000000000000604082015250565b600061270a604b83611efd565b915061271582612688565b606082019050919050565b60006020820190508181036000830152612739816126fd565b9050919050565b7f596f752063616e206f6e6c79206d6178203230206d696e74206174206120746960008201527f6d652e0000000000000000000000000000000000000000000000000000000000602082015250565b600061279c602383611efd565b91506127a782612740565b604082019050919050565b600060208201905081810360008301526127cb8161278f565b9050919050565b6000602082840312156127e8576127e76119be565b5b60006127f6848285016124eb565b91505092915050565b7f4569746865722062617463682069732066756c6c206f7220616c6c20746f6b6560008201527f6e20617265206d696e746564206f7220636f6e7472616374206973206e6f742060208201527f6c61756e63686564207965740000000000000000000000000000000000000000604082015250565b6000612881604c83611efd565b915061288c826127ff565b606082019050919050565b600060208201905081810360008301526128b081612874565b9050919050565b7f496e636f7272656374205369676e617475726500000000000000000000000000600082015250565b60006128ed601383611efd565b91506128f8826128b7565b602082019050919050565b6000602082019050818103600083015261291c816128e0565b9050919050565b7f596f752063616e206f6e6c79206d696e7420323020617420612074696d652e00600082015250565b6000612959601f83611efd565b915061296482612923565b602082019050919050565b600060208201905081810360008301526129888161294c565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006129c5601f83611efd565b91506129d08261298f565b602082019050919050565b600060208201905081810360008301526129f4816129b8565b9050919050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000612a31601c83612248565b9150612a3c826129fb565b601c82019050919050565b6000819050919050565b612a62612a5d826123d1565b612a47565b82525050565b6000612a7382612a24565b9150612a7f8284612a51565b60208201915081905092915050565b7f496e76616c6964207369676e6174757265206c656e6774680000000000000000600082015250565b6000612ac4601883611efd565b9150612acf82612a8e565b602082019050919050565b60006020820190508181036000830152612af381612ab7565b9050919050565b600060ff82169050919050565b6000612b1282612afa565b9150612b1d83612afa565b9250828201905060ff811115612b3657612b35611fc2565b5b92915050565b7f496e76616c6964207369676e6174757265202776272076616c75650000000000600082015250565b6000612b72601b83611efd565b9150612b7d82612b3c565b602082019050919050565b60006020820190508181036000830152612ba181612b65565b9050919050565b612bb1816123d1565b82525050565b612bc081612afa565b82525050565b6000608082019050612bdb6000830187612ba8565b612be86020830186612bb7565b612bf56040830185612ba8565b612c026060830184612ba8565b95945050505050565b6000612c1682611a53565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612c4857612c47611fc2565b5b600182019050919050565b6000612c5e82611a53565b9150612c6983611a53565b925082612c7957612c786125bc565b5b828204905092915050565b6000612c8f82611a53565b9150612c9a83611a53565b9250828203905081811115612cb257612cb1611fc2565b5b92915050565b6000612cc382611a53565b9150612cce83611a53565b925082612cde57612cdd6125bc565b5b82820690509291505056fea26469706673582212203b18a728993bd49320ec0b965d97cfef7f285ce58cd72fc937117fb0a1c4ac6464736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ee9dece310dda4dfcbcf0e63e3a19c7df3b99274
-----Decoded View---------------
Arg [0] : _initialOwner (address): 0xEE9DeCE310ddA4dFcbCF0e63E3a19C7Df3b99274
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000ee9dece310dda4dfcbcf0e63e3a19c7df3b99274
Deployed Bytecode Sourcemap
73477:7459:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79737:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79166:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77853:89;;;;;;;;;;;;;:::i;:::-;;80721:210;;;;;;;;;;;;;:::i;:::-;;79350:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74139:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73895:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76536:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80383:330;;;;;;;;;;;;;:::i;:::-;;74773:377;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79063:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73765:25;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80031:247;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79517:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40831;;;;;;;;;;;;;:::i;:::-;;73845:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73797:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78944:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79628:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40156:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75708:668;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79884:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78130:806;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74088:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76384:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73571:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73938:119;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41089:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79737:117;80343:11;;;;;;;;;;;80329:25;;:10;:25;;;80321:34;;;;;;79832:14:::1;79816:13;;:30;;;;;;;;;;;;;;;;;;79737:117:::0;:::o;79166:164::-;79244:7;79307:14;:12;:14::i;:::-;79290:8;79299:4;79290:14;;;;;;;;:::i;:::-;;;;;;;;;;:31;;;;:::i;:::-;79281:6;:41;;;;:::i;:::-;79274:48;;79166:164;;;;:::o;77853:89::-;40042:13;:11;:13::i;:::-;77930:4:::1;77910:17;;:24;;;;;;;;;;;;;;;;;;77853:89::o:0;80721:210::-;80343:11;;;;;;;;;;;80329:25;;:10;:25;;;80321:34;;;;;;71831:21:::1;:19;:21::i;:::-;80795:7:::2;80816:11;;;;;;;;;;;80808:25;;80841:17;;80808:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80794:69;;;80882:2;80874:11;;;::::0;::::2;;80916:7;80896:17;:27;;;;80783:148;71875:20:::1;:18;:20::i;:::-;80721:210::o:0;79350:159::-;40042:13;:11;:13::i;:::-;79428:4:::1;79415:10;;:17;;;;;;;;;;;;;;;;;;79479:11;79443:20;;:48;;;;;;;;;;;;;;;;;;79350:159:::0;:::o;74139:31::-;;;;:::o;73895:30::-;;;;;;;;;;;;;:::o;76536:318::-;76610:4;76627:19;76676:10;76659:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;76649:39;;;;;;76627:61;;76699:28;76730:35;76753:11;76730:22;:35::i;:::-;76699:66;;76833:13;;;;;;;;;;;76783:63;;:46;76797:20;76819:9;76783:13;:46::i;:::-;:63;;;76776:70;;;;76536:318;;;:::o;80383:330::-;40042:13;:11;:13::i;:::-;71831:21:::1;:19;:21::i;:::-;80445:7:::2;80466:11;;;;;;;;;;;80458:25;;80491:17;;80458:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80444:69;;;80532:2;80524:11;;;::::0;::::2;;80566:7;80546:17;:27;;;;80605:7;80626;:5;:7::i;:::-;80618:21;;80647;80618:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80604:69;;;80692:2;80684:11;;;::::0;::::2;;80433:280;;71875:20:::1;:18;:20::i;:::-;80383:330::o:0;74773:377::-;40042:13;:11;:13::i;:::-;74862:12:::1;;74847;;:27;74839:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;74927:14;:12;:14::i;:::-;74914:9;:27;;74906:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;74988:20;;;;;;;;;;;:29;;;75018:2;75046:3;75050:26;75063:12;;75050;:26::i;:::-;75029:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74988:100;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;75139:1;75124:12;;:16;;;;:::i;:::-;75109:12;:31;;;;74773:377:::0;:::o;79063:95::-;40042:13;:11;:13::i;:::-;79128:8:::1;79142:7;79128:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79063:95:::0;:::o;73765:25::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;80031:247::-;80076:7;80096:34;80133:4;;;;;;;;;;;:19;;;80153:66;80133:87;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80096:124;;80254:9;:15;;;80238:32;;80239:6;80238:32;;;;:::i;:::-;80231:39;;;;;80031:247;:::o;79517:103::-;40042:13;:11;:13::i;:::-;79602:10:::1;79588:11;:24;;;;79517:103:::0;:::o;40831:::-;40042:13;:11;:13::i;:::-;40896:30:::1;40923:1;40896:18;:30::i;:::-;40831:103::o:0;73845:37::-;;;;;;;;;;;;;:::o;73797:41::-;;;;;;;;;;;;;;;;;:::o;78944:111::-;40042:13;:11;:13::i;:::-;79040:7:::1;79023:8;79032:4;79023:14;;;;;;;;:::i;:::-;;;;;;;;;:24;;;;78944:111:::0;;:::o;79628:101::-;80343:11;;;;;;;;;;;80329:25;;:10;:25;;;80321:34;;;;;;79713:8:::1;79699:11;;:22;;;;;;;;;;;;;;;;;;79628:101:::0;:::o;40156:87::-;40202:7;40229:6;;;;;;;;;;;40222:13;;40156:87;:::o;75708:668::-;75800:21;75814:6;75800:13;:21::i;:::-;75787:9;:34;;75779:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;75859:24;75876:6;75859:16;:24::i;:::-;75851:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;75998:6;75992:2;:12;;75984:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;76062:9;76057:302;76081:6;76077:1;:10;76057:302;;;76135:20;;;;;;;;;;;:25;;;76161:10;76197:3;76201:26;76214:12;;76201;:26::i;:::-;76180:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;76135:104;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;76281:14;:12;:14::i;:::-;76260:17;;:35;;;;;;;:::i;:::-;;;;;;;;76336:1;76321:12;;:16;;;;:::i;:::-;76306:12;:31;;;;76089:3;;;;;;;76057:302;;;;75708:668;:::o;79884:129::-;40042:13;:11;:13::i;:::-;79993:11:::1;79957:20;;:48;;;;;;;;;;;;;;;;;;79884:129:::0;:::o;78130:806::-;78286:32;78304:4;78311:6;78286:17;:32::i;:::-;78273:9;:45;;78265:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;78356:26;78375:6;78356:18;:26::i;:::-;78348:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;78482:33;78502:9;78512:1;78502:12;;;;;;;;:::i;:::-;;;;;;;;78482:19;:33::i;:::-;78474:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;78574:6;78568:2;:12;;78560:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;78632:9;78627:292;78651:6;78647:1;:10;78627:292;;;78695:20;;;;;;;;;;;:25;;;78721:10;78757:3;78761:26;78774:12;;78761;:26::i;:::-;78740:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;78695:104;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;78831:14;:12;:14::i;:::-;78810:17;;:35;;;;;;;:::i;:::-;;;;;;;;78896:1;78881:12;;:16;;;;:::i;:::-;78866:12;:31;;;;78659:3;;;;;;;78627:292;;;;78130:806;;;;:::o;74088:42::-;;;;:::o;76384:132::-;76444:7;76493:14;:12;:14::i;:::-;76479:11;;:28;;;;:::i;:::-;76471:6;:37;;;;:::i;:::-;76464:44;;76384:132;;;:::o;73571:40::-;;;;;;;;;;;;;:::o;73938:119::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41089:220::-;40042:13;:11;:13::i;:::-;41194:1:::1;41174:22;;:8;:22;;::::0;41170:93:::1;;41248:1;41220:31;;;;;;;;;;;:::i;:::-;;;;;;;;41170:93;41273:28;41292:8;41273:18;:28::i;:::-;41089:220:::0;:::o;40321:166::-;40392:12;:10;:12::i;:::-;40381:23;;:7;:5;:7::i;:::-;:23;;;40377:103;;40455:12;:10;:12::i;:::-;40428:40;;;;;;;;;;;:::i;:::-;;;;;;;;40377:103;40321:166::o;71911:293::-;71313:1;72045:7;;:19;72037:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;71313:1;72178:7;:18;;;;71911:293::o;72212:213::-;71269:1;72395:7;:22;;;;72212:213::o;76862:189::-;76939:7;77029:12;76976:66;;;;;;;;:::i;:::-;;;;;;;;;;;;;76966:77;;;;;;76959:84;;76862:189;;;:::o;77063:782::-;77165:7;77214:2;77193:10;:17;:23;77185:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;77258:9;77278;77298:7;77428:2;77416:10;77412:19;77406:26;77401:31;;77473:2;77461:10;77457:19;77451:26;77446:31;;77526:2;77514:10;77510:19;77504:26;77501:1;77496:35;77491:40;;77608:2;77604:1;:6;;;77600:46;;;77632:2;77627:7;;;;;:::i;:::-;;;77600:46;77671:2;77666:1;:7;;;:18;;;;77682:2;77677:1;:7;;;77666:18;77658:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;77796:41;77806:21;77829:1;77832;77835;77796:41;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77789:48;;;;;77063:782;;;;:::o;75158:536::-;75218:13;75257:1;75248:5;:10;75244:53;;75275:10;;;;;;;;;;;;;;;;;;;;;75244:53;75307:12;75322:5;75307:20;;75338:14;75363:78;75378:1;75370:4;:9;75363:78;;75396:8;;;;;:::i;:::-;;;;75427:2;75419:10;;;;;:::i;:::-;;;75363:78;;;75451:19;75483:6;75473:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75451:39;;75501:154;75517:1;75508:5;:10;75501:154;;75545:1;75535:11;;;;;:::i;:::-;;;75612:2;75604:5;:10;;;;:::i;:::-;75591:2;:24;;;;:::i;:::-;75578:39;;75561:6;75568;75561:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;75641:2;75632:11;;;;;:::i;:::-;;;75501:154;;;75679:6;75665:21;;;;;75158:536;;;;:::o;41469:191::-;41543:16;41562:6;;;;;;;;;;;41543:25;;41588:8;41579:6;;:17;;;;;;;;;;;;;;;;;;41643:8;41612:40;;41633:8;41612:40;;;;;;;;;;;;41532:128;41469:191;:::o;74595:170::-;74660:4;74714:6;74699:12;;:21;;;;:::i;:::-;74684:12;;:36;:50;;;;;74724:10;;;;;;;;;;;74684:50;:73;;;;;74740:17;;;;;;;;;;;74684:73;74677:80;;74595:170;;;:::o;77950:172::-;78017:4;78071:6;78056:12;;:21;;;;:::i;:::-;78041:12;;:36;:50;;;;;78081:10;;;;;;;;;;;78041:50;:72;;;;;78096:17;;;;;;;;;;;78095:18;78041:72;78034:79;;77950:172;;;:::o;38159:98::-;38212:7;38239:10;38232:17;;38159:98;:::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:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:77::-;1213:7;1242:5;1231:16;;1176:77;;;:::o;1259:122::-;1332:24;1350:5;1332:24;:::i;:::-;1325:5;1322:35;1312:63;;1371:1;1368;1361:12;1312:63;1259:122;:::o;1387:139::-;1433:5;1471:6;1458:20;1449:29;;1487:33;1514:5;1487:33;:::i;:::-;1387:139;;;;:::o;1532:474::-;1600:6;1608;1657:2;1645:9;1636:7;1632:23;1628:32;1625:119;;;1663:79;;:::i;:::-;1625:119;1783:1;1808:53;1853:7;1844:6;1833:9;1829:22;1808:53;:::i;:::-;1798:63;;1754:117;1910:2;1936:53;1981:7;1972:6;1961:9;1957:22;1936:53;:::i;:::-;1926:63;;1881:118;1532:474;;;;;:::o;2012:118::-;2099:24;2117:5;2099:24;:::i;:::-;2094:3;2087:37;2012:118;;:::o;2136:222::-;2229:4;2267:2;2256:9;2252:18;2244:26;;2280:71;2348:1;2337:9;2333:17;2324:6;2280:71;:::i;:::-;2136:222;;;;:::o;2364:90::-;2398:7;2441:5;2434:13;2427:21;2416:32;;2364:90;;;:::o;2460:109::-;2541:21;2556:5;2541:21;:::i;:::-;2536:3;2529:34;2460:109;;:::o;2575:210::-;2662:4;2700:2;2689:9;2685:18;2677:26;;2713:65;2775:1;2764:9;2760:17;2751:6;2713:65;:::i;:::-;2575:210;;;;:::o;2791:117::-;2900:1;2897;2890:12;2914:117;3023:1;3020;3013:12;3037:102;3078:6;3129:2;3125:7;3120:2;3113:5;3109:14;3105:28;3095:38;;3037:102;;;:::o;3145:180::-;3193:77;3190:1;3183:88;3290:4;3287:1;3280:15;3314:4;3311:1;3304:15;3331:281;3414:27;3436:4;3414:27;:::i;:::-;3406:6;3402:40;3544:6;3532:10;3529:22;3508:18;3496:10;3493:34;3490:62;3487:88;;;3555:18;;:::i;:::-;3487:88;3595:10;3591:2;3584:22;3374:238;3331:281;;:::o;3618:129::-;3652:6;3679:20;;:::i;:::-;3669:30;;3708:33;3736:4;3728:6;3708:33;:::i;:::-;3618:129;;;:::o;3753:307::-;3814:4;3904:18;3896:6;3893:30;3890:56;;;3926:18;;:::i;:::-;3890:56;3964:29;3986:6;3964:29;:::i;:::-;3956:37;;4048:4;4042;4038:15;4030:23;;3753:307;;;:::o;4066:146::-;4163:6;4158:3;4153;4140:30;4204:1;4195:6;4190:3;4186:16;4179:27;4066:146;;;:::o;4218:423::-;4295:5;4320:65;4336:48;4377:6;4336:48;:::i;:::-;4320:65;:::i;:::-;4311:74;;4408:6;4401:5;4394:21;4446:4;4439:5;4435:16;4484:3;4475:6;4470:3;4466:16;4463:25;4460:112;;;4491:79;;:::i;:::-;4460:112;4581:54;4628:6;4623:3;4618;4581:54;:::i;:::-;4301:340;4218:423;;;;;:::o;4660:338::-;4715:5;4764:3;4757:4;4749:6;4745:17;4741:27;4731:122;;4772:79;;:::i;:::-;4731:122;4889:6;4876:20;4914:78;4988:3;4980:6;4973:4;4965:6;4961:17;4914:78;:::i;:::-;4905:87;;4721:277;4660:338;;;;:::o;5004:507::-;5072:6;5121:2;5109:9;5100:7;5096:23;5092:32;5089:119;;;5127:79;;:::i;:::-;5089:119;5275:1;5264:9;5260:17;5247:31;5305:18;5297:6;5294:30;5291:117;;;5327:79;;:::i;:::-;5291:117;5432:62;5486:7;5477:6;5466:9;5462:22;5432:62;:::i;:::-;5422:72;;5218:286;5004:507;;;;:::o;5517:329::-;5576:6;5625:2;5613:9;5604:7;5600:23;5596:32;5593:119;;;5631:79;;:::i;:::-;5593:119;5751:1;5776:53;5821:7;5812:6;5801:9;5797:22;5776:53;:::i;:::-;5766:63;;5722:117;5517:329;;;;:::o;5852:118::-;5939:24;5957:5;5939:24;:::i;:::-;5934:3;5927:37;5852:118;;:::o;5976:222::-;6069:4;6107:2;6096:9;6092:18;6084:26;;6120:71;6188:1;6177:9;6173:17;6164:6;6120:71;:::i;:::-;5976:222;;;;:::o;6204:320::-;6290:4;6380:18;6372:6;6369:30;6366:56;;;6402:18;;:::i;:::-;6366:56;6452:4;6444:6;6440:17;6432:25;;6512:4;6506;6502:15;6494:23;;6204:320;;;:::o;6530:117::-;6639:1;6636;6629:12;6668:942;6773:5;6798:90;6814:73;6880:6;6814:73;:::i;:::-;6798:90;:::i;:::-;6789:99;;6908:5;6937:6;6930:5;6923:21;6971:4;6964:5;6960:16;6953:23;;7024:4;7016:6;7012:17;7004:6;7000:30;7053:3;7045:6;7042:15;7039:122;;;7072:79;;:::i;:::-;7039:122;7187:6;7170:434;7204:6;7199:3;7196:15;7170:434;;;7293:3;7280:17;7329:18;7316:11;7313:35;7310:122;;;7351:79;;:::i;:::-;7310:122;7475:11;7467:6;7463:24;7513:46;7555:3;7543:10;7513:46;:::i;:::-;7508:3;7501:59;7589:4;7584:3;7580:14;7573:21;;7246:358;;7230:4;7225:3;7221:14;7214:21;;7170:434;;;7174:21;6779:831;;6668:942;;;;;:::o;7631:388::-;7711:5;7760:3;7753:4;7745:6;7741:17;7737:27;7727:122;;7768:79;;:::i;:::-;7727:122;7885:6;7872:20;7910:103;8009:3;8001:6;7994:4;7986:6;7982:17;7910:103;:::i;:::-;7901:112;;7717:302;7631:388;;;;:::o;8025:993::-;8145:6;8153;8161;8169;8218:3;8206:9;8197:7;8193:23;8189:33;8186:120;;;8225:79;;:::i;:::-;8186:120;8373:1;8362:9;8358:17;8345:31;8403:18;8395:6;8392:30;8389:117;;;8425:79;;:::i;:::-;8389:117;8530:87;8609:7;8600:6;8589:9;8585:22;8530:87;:::i;:::-;8520:97;;8316:311;8666:2;8692:53;8737:7;8728:6;8717:9;8713:22;8692:53;:::i;:::-;8682:63;;8637:118;8794:2;8820:53;8865:7;8856:6;8845:9;8841:22;8820:53;:::i;:::-;8810:63;;8765:118;8922:2;8948:53;8993:7;8984:6;8973:9;8969:22;8948:53;:::i;:::-;8938:63;;8893:118;8025:993;;;;;;;:::o;9024:60::-;9052:3;9073:5;9066:12;;9024:60;;;:::o;9090:142::-;9140:9;9173:53;9191:34;9200:24;9218:5;9200:24;:::i;:::-;9191:34;:::i;:::-;9173:53;:::i;:::-;9160:66;;9090:142;;;:::o;9238:126::-;9288:9;9321:37;9352:5;9321:37;:::i;:::-;9308:50;;9238:126;;;:::o;9370:147::-;9441:9;9474:37;9505:5;9474:37;:::i;:::-;9461:50;;9370:147;;;:::o;9523:173::-;9631:58;9683:5;9631:58;:::i;:::-;9626:3;9619:71;9523:173;;:::o;9702:264::-;9816:4;9854:2;9843:9;9839:18;9831:26;;9867:92;9956:1;9945:9;9941:17;9932:6;9867:92;:::i;:::-;9702:264;;;;:::o;9972:99::-;10024:6;10058:5;10052:12;10042:22;;9972:99;;;:::o;10077:169::-;10161:11;10195:6;10190:3;10183:19;10235:4;10230:3;10226:14;10211:29;;10077:169;;;;:::o;10252:246::-;10333:1;10343:113;10357:6;10354:1;10351:13;10343:113;;;10442:1;10437:3;10433:11;10427:18;10423:1;10418:3;10414:11;10407:39;10379:2;10376:1;10372:10;10367:15;;10343:113;;;10490:1;10481:6;10476:3;10472:16;10465:27;10314:184;10252:246;;;:::o;10504:377::-;10592:3;10620:39;10653:5;10620:39;:::i;:::-;10675:71;10739:6;10734:3;10675:71;:::i;:::-;10668:78;;10755:65;10813:6;10808:3;10801:4;10794:5;10790:16;10755:65;:::i;:::-;10845:29;10867:6;10845:29;:::i;:::-;10840:3;10836:39;10829:46;;10596:285;10504:377;;;;:::o;10887:313::-;11000:4;11038:2;11027:9;11023:18;11015:26;;11087:9;11081:4;11077:20;11073:1;11062:9;11058:17;11051:47;11115:78;11188:4;11179:6;11115:78;:::i;:::-;11107:86;;10887:313;;;;:::o;11206:180::-;11254:77;11251:1;11244:88;11351:4;11348:1;11341:15;11375:4;11372:1;11365:15;11392:180;11440:77;11437:1;11430:88;11537:4;11534:1;11527:15;11561:4;11558:1;11551:15;11578:191;11618:3;11637:20;11655:1;11637:20;:::i;:::-;11632:25;;11671:20;11689:1;11671:20;:::i;:::-;11666:25;;11714:1;11711;11707:9;11700:16;;11735:3;11732:1;11729:10;11726:36;;;11742:18;;:::i;:::-;11726:36;11578:191;;;;:::o;11775:410::-;11815:7;11838:20;11856:1;11838:20;:::i;:::-;11833:25;;11872:20;11890:1;11872:20;:::i;:::-;11867:25;;11927:1;11924;11920:9;11949:30;11967:11;11949:30;:::i;:::-;11938:41;;12128:1;12119:7;12115:15;12112:1;12109:22;12089:1;12082:9;12062:83;12039:139;;12158:18;;:::i;:::-;12039:139;11823:362;11775:410;;;;:::o;12191:147::-;12292:11;12329:3;12314:18;;12191:147;;;;:::o;12344:114::-;;:::o;12464:398::-;12623:3;12644:83;12725:1;12720:3;12644:83;:::i;:::-;12637:90;;12736:93;12825:3;12736:93;:::i;:::-;12854:1;12849:3;12845:11;12838:18;;12464:398;;;:::o;12868:379::-;13052:3;13074:147;13217:3;13074:147;:::i;:::-;13067:154;;13238:3;13231:10;;12868:379;;;:::o;13253:94::-;13286:8;13334:5;13330:2;13326:14;13305:35;;13253:94;;;:::o;13353:::-;13392:7;13421:20;13435:5;13421:20;:::i;:::-;13410:31;;13353:94;;;:::o;13453:100::-;13492:7;13521:26;13541:5;13521:26;:::i;:::-;13510:37;;13453:100;;;:::o;13559:157::-;13664:45;13684:24;13702:5;13684:24;:::i;:::-;13664:45;:::i;:::-;13659:3;13652:58;13559:157;;:::o;13722:256::-;13834:3;13849:75;13920:3;13911:6;13849:75;:::i;:::-;13949:2;13944:3;13940:12;13933:19;;13969:3;13962:10;;13722:256;;;;:::o;13984:166::-;14124:18;14120:1;14112:6;14108:14;14101:42;13984:166;:::o;14156:366::-;14298:3;14319:67;14383:2;14378:3;14319:67;:::i;:::-;14312:74;;14395:93;14484:3;14395:93;:::i;:::-;14513:2;14508:3;14504:12;14497:19;;14156:366;;;:::o;14528:419::-;14694:4;14732:2;14721:9;14717:18;14709:26;;14781:9;14775:4;14771:20;14767:1;14756:9;14752:17;14745:47;14809:131;14935:4;14809:131;:::i;:::-;14801:139;;14528:419;;;:::o;14953:171::-;15093:23;15089:1;15081:6;15077:14;15070:47;14953:171;:::o;15130:366::-;15272:3;15293:67;15357:2;15352:3;15293:67;:::i;:::-;15286:74;;15369:93;15458:3;15369:93;:::i;:::-;15487:2;15482:3;15478:12;15471:19;;15130:366;;;:::o;15502:419::-;15668:4;15706:2;15695:9;15691:18;15683:26;;15755:9;15749:4;15745:20;15741:1;15730:9;15726:17;15719:47;15783:131;15909:4;15783:131;:::i;:::-;15775:139;;15502:419;;;:::o;15927:180::-;15975:77;15972:1;15965:88;16072:4;16069:1;16062:15;16096:4;16093:1;16086:15;16113:320;16157:6;16194:1;16188:4;16184:12;16174:22;;16241:1;16235:4;16231:12;16262:18;16252:81;;16318:4;16310:6;16306:17;16296:27;;16252:81;16380:2;16372:6;16369:14;16349:18;16346:38;16343:84;;16399:18;;:::i;:::-;16343:84;16164:269;16113:320;;;:::o;16439:148::-;16541:11;16578:3;16563:18;;16439:148;;;;:::o;16593:141::-;16642:4;16665:3;16657:11;;16688:3;16685:1;16678:14;16722:4;16719:1;16709:18;16701:26;;16593:141;;;:::o;16764:874::-;16867:3;16904:5;16898:12;16933:36;16959:9;16933:36;:::i;:::-;16985:89;17067:6;17062:3;16985:89;:::i;:::-;16978:96;;17105:1;17094:9;17090:17;17121:1;17116:166;;;;17296:1;17291:341;;;;17083:549;;17116:166;17200:4;17196:9;17185;17181:25;17176:3;17169:38;17262:6;17255:14;17248:22;17240:6;17236:35;17231:3;17227:45;17220:52;;17116:166;;17291:341;17358:38;17390:5;17358:38;:::i;:::-;17418:1;17432:154;17446:6;17443:1;17440:13;17432:154;;;17520:7;17514:14;17510:1;17505:3;17501:11;17494:35;17570:1;17561:7;17557:15;17546:26;;17468:4;17465:1;17461:12;17456:17;;17432:154;;;17615:6;17610:3;17606:16;17599:23;;17298:334;;17083:549;;16871:767;;16764:874;;;;:::o;17644:390::-;17750:3;17778:39;17811:5;17778:39;:::i;:::-;17833:89;17915:6;17910:3;17833:89;:::i;:::-;17826:96;;17931:65;17989:6;17984:3;17977:4;17970:5;17966:16;17931:65;:::i;:::-;18021:6;18016:3;18012:16;18005:23;;17754:280;17644:390;;;;:::o;18040:155::-;18180:7;18176:1;18168:6;18164:14;18157:31;18040:155;:::o;18201:400::-;18361:3;18382:84;18464:1;18459:3;18382:84;:::i;:::-;18375:91;;18475:93;18564:3;18475:93;:::i;:::-;18593:1;18588:3;18584:11;18577:18;;18201:400;;;:::o;18607:695::-;18885:3;18907:92;18995:3;18986:6;18907:92;:::i;:::-;18900:99;;19016:95;19107:3;19098:6;19016:95;:::i;:::-;19009:102;;19128:148;19272:3;19128:148;:::i;:::-;19121:155;;19293:3;19286:10;;18607:695;;;;;:::o;19308:423::-;19449:4;19487:2;19476:9;19472:18;19464:26;;19500:71;19568:1;19557:9;19553:17;19544:6;19500:71;:::i;:::-;19618:9;19612:4;19608:20;19603:2;19592:9;19588:18;19581:48;19646:78;19719:4;19710:6;19646:78;:::i;:::-;19638:86;;19308:423;;;;;:::o;19737:160::-;19857:7;19886:5;19875:16;;19737:160;;;:::o;19903:77::-;19940:7;19969:5;19958:16;;19903:77;;;:::o;19986:92::-;20018:8;20065:5;20062:1;20058:13;20037:34;;19986:92;;;:::o;20084:312::-;20217:9;20250:140;20268:121;20281:107;20382:5;20281:107;:::i;:::-;20268:121;:::i;:::-;20250:140;:::i;:::-;20237:153;;20084:312;;;:::o;20402:297::-;20572:120;20686:5;20572:120;:::i;:::-;20567:3;20560:133;20402:297;;:::o;20705:388::-;20881:4;20919:2;20908:9;20904:18;20896:26;;20932:154;21083:1;21072:9;21068:17;21059:6;20932:154;:::i;:::-;20705:388;;;;:::o;21099:117::-;21208:1;21205;21198:12;21345:90;21380:7;21423:5;21420:1;21409:20;21398:31;;21345:90;;;:::o;21441:118::-;21512:22;21528:5;21512:22;:::i;:::-;21505:5;21502:33;21492:61;;21549:1;21546;21539:12;21492:61;21441:118;:::o;21565:139::-;21620:5;21651:6;21645:13;21636:22;;21667:31;21692:5;21667:31;:::i;:::-;21565:139;;;;:::o;21710:101::-;21746:7;21786:18;21779:5;21775:30;21764:41;;21710:101;;;:::o;21817:120::-;21889:23;21906:5;21889:23;:::i;:::-;21882:5;21879:34;21869:62;;21927:1;21924;21917:12;21869:62;21817:120;:::o;21943:141::-;21999:5;22030:6;22024:13;22015:22;;22046:32;22072:5;22046:32;:::i;:::-;21943:141;;;;:::o;22090:90::-;22125:7;22168:5;22165:1;22154:20;22143:31;;22090:90;;;:::o;22186:118::-;22257:22;22273:5;22257:22;:::i;:::-;22250:5;22247:33;22237:61;;22294:1;22291;22284:12;22237:61;22186:118;:::o;22310:139::-;22365:5;22396:6;22390:13;22381:22;;22412:31;22437:5;22412:31;:::i;:::-;22310:139;;;;:::o;22455:143::-;22512:5;22543:6;22537:13;22528:22;;22559:33;22586:5;22559:33;:::i;:::-;22455:143;;;;:::o;22636:950::-;22717:5;22761:4;22749:9;22744:3;22740:19;22736:30;22733:117;;;22769:79;;:::i;:::-;22733:117;22868:21;22884:4;22868:21;:::i;:::-;22859:30;;22949:1;22989:58;23043:3;23034:6;23023:9;23019:22;22989:58;:::i;:::-;22982:4;22975:5;22971:16;22964:84;22899:160;23118:2;23159:59;23214:3;23205:6;23194:9;23190:22;23159:59;:::i;:::-;23152:4;23145:5;23141:16;23134:85;23069:161;23289:2;23330:58;23384:3;23375:6;23364:9;23360:22;23330:58;:::i;:::-;23323:4;23316:5;23312:16;23305:84;23240:160;23466:2;23507:60;23563:3;23554:6;23543:9;23539:22;23507:60;:::i;:::-;23500:4;23493:5;23489:16;23482:86;23410:169;22636:950;;;;:::o;23592:394::-;23683:6;23732:3;23720:9;23711:7;23707:23;23703:33;23700:120;;;23739:79;;:::i;:::-;23700:120;23859:1;23884:85;23961:7;23952:6;23941:9;23937:22;23884:85;:::i;:::-;23874:95;;23830:149;23592:394;;;;:::o;23992:107::-;24028:7;24068:24;24061:5;24057:36;24046:47;;23992:107;;;:::o;24105:180::-;24153:77;24150:1;24143:88;24250:4;24247:1;24240:15;24274:4;24271:1;24264:15;24291:182;24330:1;24347:19;24364:1;24347:19;:::i;:::-;24342:24;;24380:19;24397:1;24380:19;:::i;:::-;24375:24;;24418:1;24408:35;;24423:18;;:::i;:::-;24408:35;24465:1;24462;24458:9;24453:14;;24291:182;;;;:::o;24479:164::-;24619:16;24615:1;24607:6;24603:14;24596:40;24479:164;:::o;24649:366::-;24791:3;24812:67;24876:2;24871:3;24812:67;:::i;:::-;24805:74;;24888:93;24977:3;24888:93;:::i;:::-;25006:2;25001:3;24997:12;24990:19;;24649:366;;;:::o;25021:419::-;25187:4;25225:2;25214:9;25210:18;25202:26;;25274:9;25268:4;25264:20;25260:1;25249:9;25245:17;25238:47;25302:131;25428:4;25302:131;:::i;:::-;25294:139;;25021:419;;;:::o;25446:299::-;25586:34;25582:1;25574:6;25570:14;25563:58;25655:34;25650:2;25642:6;25638:15;25631:59;25724:13;25719:2;25711:6;25707:15;25700:38;25446:299;:::o;25751:366::-;25893:3;25914:67;25978:2;25973:3;25914:67;:::i;:::-;25907:74;;25990:93;26079:3;25990:93;:::i;:::-;26108:2;26103:3;26099:12;26092:19;;25751:366;;;:::o;26123:419::-;26289:4;26327:2;26316:9;26312:18;26304:26;;26376:9;26370:4;26366:20;26362:1;26351:9;26347:17;26340:47;26404:131;26530:4;26404:131;:::i;:::-;26396:139;;26123:419;;;:::o;26548:222::-;26688:34;26684:1;26676:6;26672:14;26665:58;26757:5;26752:2;26744:6;26740:15;26733:30;26548:222;:::o;26776:366::-;26918:3;26939:67;27003:2;26998:3;26939:67;:::i;:::-;26932:74;;27015:93;27104:3;27015:93;:::i;:::-;27133:2;27128:3;27124:12;27117:19;;26776:366;;;:::o;27148:419::-;27314:4;27352:2;27341:9;27337:18;27329:26;;27401:9;27395:4;27391:20;27387:1;27376:9;27372:17;27365:47;27429:131;27555:4;27429:131;:::i;:::-;27421:139;;27148:419;;;:::o;27573:351::-;27643:6;27692:2;27680:9;27671:7;27667:23;27663:32;27660:119;;;27698:79;;:::i;:::-;27660:119;27818:1;27843:64;27899:7;27890:6;27879:9;27875:22;27843:64;:::i;:::-;27833:74;;27789:128;27573:351;;;;:::o;27930:300::-;28070:34;28066:1;28058:6;28054:14;28047:58;28139:34;28134:2;28126:6;28122:15;28115:59;28208:14;28203:2;28195:6;28191:15;28184:39;27930:300;:::o;28236:366::-;28378:3;28399:67;28463:2;28458:3;28399:67;:::i;:::-;28392:74;;28475:93;28564:3;28475:93;:::i;:::-;28593:2;28588:3;28584:12;28577:19;;28236:366;;;:::o;28608:419::-;28774:4;28812:2;28801:9;28797:18;28789:26;;28861:9;28855:4;28851:20;28847:1;28836:9;28832:17;28825:47;28889:131;29015:4;28889:131;:::i;:::-;28881:139;;28608:419;;;:::o;29033:169::-;29173:21;29169:1;29161:6;29157:14;29150:45;29033:169;:::o;29208:366::-;29350:3;29371:67;29435:2;29430:3;29371:67;:::i;:::-;29364:74;;29447:93;29536:3;29447:93;:::i;:::-;29565:2;29560:3;29556:12;29549:19;;29208:366;;;:::o;29580:419::-;29746:4;29784:2;29773:9;29769:18;29761:26;;29833:9;29827:4;29823:20;29819:1;29808:9;29804:17;29797:47;29861:131;29987:4;29861:131;:::i;:::-;29853:139;;29580:419;;;:::o;30005:181::-;30145:33;30141:1;30133:6;30129:14;30122:57;30005:181;:::o;30192:366::-;30334:3;30355:67;30419:2;30414:3;30355:67;:::i;:::-;30348:74;;30431:93;30520:3;30431:93;:::i;:::-;30549:2;30544:3;30540:12;30533:19;;30192:366;;;:::o;30564:419::-;30730:4;30768:2;30757:9;30753:18;30745:26;;30817:9;30811:4;30807:20;30803:1;30792:9;30788:17;30781:47;30845:131;30971:4;30845:131;:::i;:::-;30837:139;;30564:419;;;:::o;30989:181::-;31129:33;31125:1;31117:6;31113:14;31106:57;30989:181;:::o;31176:366::-;31318:3;31339:67;31403:2;31398:3;31339:67;:::i;:::-;31332:74;;31415:93;31504:3;31415:93;:::i;:::-;31533:2;31528:3;31524:12;31517:19;;31176:366;;;:::o;31548:419::-;31714:4;31752:2;31741:9;31737:18;31729:26;;31801:9;31795:4;31791:20;31787:1;31776:9;31772:17;31765:47;31829:131;31955:4;31829:131;:::i;:::-;31821:139;;31548:419;;;:::o;31973:214::-;32113:66;32109:1;32101:6;32097:14;32090:90;31973:214;:::o;32193:402::-;32353:3;32374:85;32456:2;32451:3;32374:85;:::i;:::-;32367:92;;32468:93;32557:3;32468:93;:::i;:::-;32586:2;32581:3;32577:12;32570:19;;32193:402;;;:::o;32601:79::-;32640:7;32669:5;32658:16;;32601:79;;;:::o;32686:157::-;32791:45;32811:24;32829:5;32811:24;:::i;:::-;32791:45;:::i;:::-;32786:3;32779:58;32686:157;;:::o;32849:522::-;33062:3;33084:148;33228:3;33084:148;:::i;:::-;33077:155;;33242:75;33313:3;33304:6;33242:75;:::i;:::-;33342:2;33337:3;33333:12;33326:19;;33362:3;33355:10;;32849:522;;;;:::o;33377:174::-;33517:26;33513:1;33505:6;33501:14;33494:50;33377:174;:::o;33557:366::-;33699:3;33720:67;33784:2;33779:3;33720:67;:::i;:::-;33713:74;;33796:93;33885:3;33796:93;:::i;:::-;33914:2;33909:3;33905:12;33898:19;;33557:366;;;:::o;33929:419::-;34095:4;34133:2;34122:9;34118:18;34110:26;;34182:9;34176:4;34172:20;34168:1;34157:9;34153:17;34146:47;34210:131;34336:4;34210:131;:::i;:::-;34202:139;;33929:419;;;:::o;34354:86::-;34389:7;34429:4;34422:5;34418:16;34407:27;;34354:86;;;:::o;34446:188::-;34484:3;34503:18;34519:1;34503:18;:::i;:::-;34498:23;;34535:18;34551:1;34535:18;:::i;:::-;34530:23;;34576:1;34573;34569:9;34562:16;;34599:4;34594:3;34591:13;34588:39;;;34607:18;;:::i;:::-;34588:39;34446:188;;;;:::o;34640:177::-;34780:29;34776:1;34768:6;34764:14;34757:53;34640:177;:::o;34823:366::-;34965:3;34986:67;35050:2;35045:3;34986:67;:::i;:::-;34979:74;;35062:93;35151:3;35062:93;:::i;:::-;35180:2;35175:3;35171:12;35164:19;;34823:366;;;:::o;35195:419::-;35361:4;35399:2;35388:9;35384:18;35376:26;;35448:9;35442:4;35438:20;35434:1;35423:9;35419:17;35412:47;35476:131;35602:4;35476:131;:::i;:::-;35468:139;;35195:419;;;:::o;35620:118::-;35707:24;35725:5;35707:24;:::i;:::-;35702:3;35695:37;35620:118;;:::o;35744:112::-;35827:22;35843:5;35827:22;:::i;:::-;35822:3;35815:35;35744:112;;:::o;35862:545::-;36035:4;36073:3;36062:9;36058:19;36050:27;;36087:71;36155:1;36144:9;36140:17;36131:6;36087:71;:::i;:::-;36168:68;36232:2;36221:9;36217:18;36208:6;36168:68;:::i;:::-;36246:72;36314:2;36303:9;36299:18;36290:6;36246:72;:::i;:::-;36328;36396:2;36385:9;36381:18;36372:6;36328:72;:::i;:::-;35862:545;;;;;;;:::o;36413:233::-;36452:3;36475:24;36493:5;36475:24;:::i;:::-;36466:33;;36521:66;36514:5;36511:77;36508:103;;36591:18;;:::i;:::-;36508:103;36638:1;36631:5;36627:13;36620:20;;36413:233;;;:::o;36652:185::-;36692:1;36709:20;36727:1;36709:20;:::i;:::-;36704:25;;36743:20;36761:1;36743:20;:::i;:::-;36738:25;;36782:1;36772:35;;36787:18;;:::i;:::-;36772:35;36829:1;36826;36822:9;36817:14;;36652:185;;;;:::o;36843:194::-;36883:4;36903:20;36921:1;36903:20;:::i;:::-;36898:25;;36937:20;36955:1;36937:20;:::i;:::-;36932:25;;36981:1;36978;36974:9;36966:17;;37005:1;36999:4;36996:11;36993:37;;;37010:18;;:::i;:::-;36993:37;36843:194;;;;:::o;37043:176::-;37075:1;37092:20;37110:1;37092:20;:::i;:::-;37087:25;;37126:20;37144:1;37126:20;:::i;:::-;37121:25;;37165:1;37155:35;;37170:18;;:::i;:::-;37155:35;37211:1;37208;37204:9;37199:14;;37043:176;;;;:::o
Swarm Source
ipfs://3b18a728993bd49320ec0b965d97cfef7f285ce58cd72fc937117fb0a1c4ac64
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.