ERC-721
Overview
Max Total Supply
253 CNDLS
Holders
127
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 CNDLSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Candles
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-04-08 */ // SPDX-License-Identifier: MIT // File: operator-filter-registry/src/lib/Constants.sol pragma solidity ^0.8.13; address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E; address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6; // File: operator-filter-registry/src/IOperatorFilterRegistry.sol pragma solidity ^0.8.13; interface IOperatorFilterRegistry { /** * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns * true if supplied registrant address is not registered. */ function isOperatorAllowed(address registrant, address operator) external view returns (bool); /** * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner. */ function register(address registrant) external; /** * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes. */ function registerAndSubscribe(address registrant, address subscription) external; /** * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another * address without subscribing. */ function registerAndCopyEntries(address registrant, address registrantToCopy) external; /** * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner. * Note that this does not remove any filtered addresses or codeHashes. * Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes. */ function unregister(address addr) external; /** * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered. */ function updateOperator(address registrant, address operator, bool filtered) external; /** * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates. */ function updateOperators(address registrant, address[] calldata operators, bool filtered) external; /** * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered. */ function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; /** * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates. */ function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; /** * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous * subscription if present. * Note that accounts with subscriptions may go on to subscribe to other accounts - in this case, * subscriptions will not be forwarded. Instead the former subscription's existing entries will still be * used. */ function subscribe(address registrant, address registrantToSubscribe) external; /** * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes. */ function unsubscribe(address registrant, bool copyExistingEntries) external; /** * @notice Get the subscription address of a given registrant, if any. */ function subscriptionOf(address addr) external returns (address registrant); /** * @notice Get the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscribers(address registrant) external returns (address[] memory); /** * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscriberAt(address registrant, uint256 index) external returns (address); /** * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr. */ function copyEntriesOf(address registrant, address registrantToCopy) external; /** * @notice Returns true if operator is filtered by a given address or its subscription. */ function isOperatorFiltered(address registrant, address operator) external returns (bool); /** * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription. */ function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); /** * @notice Returns true if a codeHash is filtered by a given address or its subscription. */ function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); /** * @notice Returns a list of filtered operators for a given address or its subscription. */ function filteredOperators(address addr) external returns (address[] memory); /** * @notice Returns the set of filtered codeHashes for a given address or its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashes(address addr) external returns (bytes32[] memory); /** * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredOperatorAt(address registrant, uint256 index) external returns (address); /** * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); /** * @notice Returns true if an address has registered */ function isRegistered(address addr) external returns (bool); /** * @dev Convenience method to compute the code hash of an arbitrary contract */ function codeHashOf(address addr) external returns (bytes32); } // File: operator-filter-registry/src/OperatorFilterer.sol pragma solidity ^0.8.13; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. * Please note that if your token contract does not provide an owner with EIP-173, it must provide * administration methods on the contract itself to interact with the registry otherwise the subscription * will be locked to the options set during construction. */ abstract contract OperatorFilterer { /// @dev Emitted when an operator is not allowed. error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS); /// @dev The constructor that is called when the contract is being deployed. constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } /** * @dev A helper function to check if an operator is allowed. */ modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } /** * @dev A helper function to check if an operator approval is allowed. */ modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } /** * @dev A helper function to check if an operator is allowed. */ function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { // under normal circumstances, this function will revert rather than return false, but inheriting contracts // may specify their own OperatorFilterRegistry implementations, which may behave differently if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } } // File: operator-filter-registry/src/DefaultOperatorFilterer.sol pragma solidity ^0.8.13; /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. * @dev Please note that if your token contract does not provide an owner with EIP-173, it must provide * administration methods on the contract itself to interact with the registry otherwise the subscription * will be locked to the options set during construction. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { /// @dev The constructor that is called when the contract is being deployed. constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {} } // File: @openzeppelin/contracts/utils/Base64.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol) pragma solidity ^0.8.0; /** * @dev Provides a set of functions to operate with Base64 strings. * * _Available since v4.5._ */ library Base64 { /** * @dev Base64 Encoding/Decoding Table */ string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /** * @dev Converts a `bytes` to its Bytes64 `string` representation. */ function encode(bytes memory data) internal pure returns (string memory) { /** * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol */ if (data.length == 0) return ""; // Loads the table into memory string memory table = _TABLE; // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter // and split into 4 numbers of 6 bits. // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up // - `data.length + 2` -> Round up // - `/ 3` -> Number of 3-bytes chunks // - `4 *` -> 4 characters for each chunk string memory result = new string(4 * ((data.length + 2) / 3)); /// @solidity memory-safe-assembly assembly { // Prepare the lookup table (skip the first "length" byte) let tablePtr := add(table, 1) // Prepare result pointer, jump over length let resultPtr := add(result, 32) // Run over the input, 3 bytes at a time for { let dataPtr := data let endPtr := add(data, mload(data)) } lt(dataPtr, endPtr) { } { // Advance 3 bytes dataPtr := add(dataPtr, 3) let input := mload(dataPtr) // To write each character, shift the 3 bytes (18 bits) chunk // 4 times in blocks of 6 bits for each character (18, 12, 6, 0) // and apply logical AND with 0x3F which is the number of // the previous character in the ASCII table prior to the Base64 Table // The result is then added to the table to get the character to write, // and finally write it in the result pointer but with a left shift // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F)))) resultPtr := add(resultPtr, 1) // Advance } // When data `bytes` is not exactly 3 bytes long // it is padded with `=` characters at the end switch mod(mload(data), 3) case 1 { mstore8(sub(resultPtr, 1), 0x3d) mstore8(sub(resultPtr, 2), 0x3d) } case 2 { mstore8(sub(resultPtr, 1), 0x3d) } } return result; } } // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @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/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @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 caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @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/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.8.2) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @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}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => 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 override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(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 override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @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. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - 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, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * 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 virtual { _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); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @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 virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @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 virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @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 virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * 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 * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant * being 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`. */ // solhint-disable-next-line func-name-mixedcase function __unsafe_increaseBalance(address account, uint256 amount) internal { _balances[account] += amount; } } // File: contracts/Candles.sol pragma solidity ^0.8.0; contract Candles is ERC721, Ownable, DefaultOperatorFilterer { using Counters for Counters.Counter; uint256 public constant MAX_TOKENS = 5000; uint256 public constant MAX_TOKENS_PER_WALLET = 2; Counters.Counter private _totalTokensMinted; constructor(string memory name, string memory symbol) ERC721(name, symbol) {} struct CandleValues { uint256 hue; uint256 width; uint256 height; uint256 opacity; uint256 flickerTiming; // New attribute } function mint(uint256 _numTokens) public { _mint(_numTokens, msg.sender); } function _mint(uint256 _numTokens, address _to) internal { require(_totalTokensMinted.current() < MAX_TOKENS, "All tokens have been minted"); require(balanceOf(_to) + _numTokens <= MAX_TOKENS_PER_WALLET, "Cannot mint more tokens than allowed per wallet"); for (uint256 i = 0; i < _numTokens; i++) { uint256 tokenId = _totalTokensMinted.current() + 1; _safeMint(_to, tokenId); _totalTokensMinted.increment(); } } function generateCandleValues(uint256 _tokenId) internal pure returns (CandleValues memory) { uint256 hue = uint256(keccak256(abi.encodePacked(_tokenId, "hue"))) % 360; uint256 width = uint256(keccak256(abi.encodePacked(_tokenId, "width"))) % 50 + 50; uint256 height = uint256(keccak256(abi.encodePacked(_tokenId, "height"))) % 100 + 100; uint256 opacity = uint256(keccak256(abi.encodePacked(_tokenId, "opacity"))) % 56 + 45; uint256 flickerTiming = uint256(keccak256(abi.encodePacked(_tokenId, "flickerTiming"))) % 10; // New attribute value return CandleValues(hue, width, height, opacity, flickerTiming); } function generateSVG(uint256 _tokenId) internal pure returns (string memory) { CandleValues memory candleValues = generateCandleValues(_tokenId); uint256 centerX = 400; uint256 centerY = 300; uint256 candleX = centerX - candleValues.width / 2; uint256 candleY = centerY - candleValues.height / 2; uint256 ballX = centerX; uint256 ballY = centerY - candleValues.height / 2 - 20; string memory fillColor = string(abi.encodePacked("hsla(", Strings.toString(candleValues.hue), ", 100%, 50%, ", Strings.toString(candleValues.opacity), "%)")); string memory svg = string( abi.encodePacked( '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 600">', '<rect x="0" y="0" width="800" height="600" fill="#000" />', '<rect x="', Strings.toString(candleX), '" y="', Strings.toString(candleY), '" width="', Strings.toString(candleValues.width), '" height="', Strings.toString(candleValues.height), '" fill="', fillColor, '" rx="10" ry="10">', '<animate attributeName="opacity" dur="', Strings.toString(candleValues.flickerTiming + 1), 's" repeatCount="indefinite" values="0.8; 0.6; 0.9; 0.7; 1; 1; 0.6; 0.8; 0.9; 0.5; 0.7; 0.8" />', // New animation with the flickerTiming value '</rect>', '<circle cx="', Strings.toString(ballX), '" cy="', Strings.toString(ballY), '" r="10" fill="', fillColor, '">', '<animate attributeName="opacity" dur="1s" repeatCount="indefinite" values="0.5; 1; 0.7; 0.9; 0.6; 0.8; 0.5; 0.7; 1; 0.8; 0.6" />', '</circle>', '</svg>' ) ); return svg; } function generateAttributes(uint256 _tokenId) internal pure returns (string memory) { CandleValues memory candleValues = generateCandleValues(_tokenId); string memory attributes = string( abi.encodePacked( '{"trait_type": "Hue", "value": ', Strings.toString(candleValues.hue), '},', '{"trait_type": "Width", "value": ', Strings.toString(candleValues.width), '},', '{"trait_type": "Height", "value": ', Strings.toString(candleValues.height), '},', '{"trait_type": "Opacity", "value": ', Strings.toString(candleValues.opacity), '},', // New attribute '{"trait_type": "Flicker Timing", "value": ', Strings.toString(candleValues.flickerTiming), '}' // New attribute ) ); return attributes; } function tokenURI(uint256 _tokenId) public view override returns (string memory) { require(_exists(_tokenId), "Token does not exist"); // Generate the SVG string string memory svg = generateSVG(_tokenId); // Get the attribute values string memory attributes = generateAttributes(_tokenId); // Encode the SVG in base64 string memory svgBase64 = Base64.encode(bytes(svg)); // Generate the JSON metadata string memory name = string(abi.encodePacked("CANDLE #", Strings.toString(_tokenId))); string memory description = "A Journey to On-Chain Notability."; string memory imageUri = string(abi.encodePacked("data:image/svg+xml;base64,", svgBase64)); string memory backgroundColor = "#000000"; string memory json = string( abi.encodePacked( '{', '"name": "', name, '",', '"description": "', description, '",', '"image": "', imageUri, '",', '"background_color": "', backgroundColor, '",', '"attributes": [', attributes, ']', '}' ) ); // Encode the JSON metadata in base64 string memory jsonBase64 = Base64.encode(bytes(json)); // Combine the base64-encoded JSON metadata and SVG into the final URI return string(abi.encodePacked("data:application/json;base64,", jsonBase64)); } function withdraw() public onlyOwner { payable(owner()).transfer(address(this).balance); } function totalSupply() public view returns (uint256) { return _totalTokensMinted.current(); } // ------------------------- Opensea Royality Filter ----------------------- function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620052ff380380620052ff8339818101604052810190620000379190620004f6565b733cc6cdda760b79bafa08df41ecfa224f810dceb6600183838160009081620000619190620007c6565b508060019081620000739190620007c6565b505050620000966200008a6200029560201b60201c565b6200029d60201b60201c565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200028b57801562000151576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b815260040162000117929190620008f2565b600060405180830381600087803b1580156200013257600080fd5b505af115801562000147573d6000803e3d6000fd5b505050506200028a565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200020b576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620001d1929190620008f2565b600060405180830381600087803b158015620001ec57600080fd5b505af115801562000201573d6000803e3d6000fd5b5050505062000289565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200025491906200091f565b600060405180830381600087803b1580156200026f57600080fd5b505af115801562000284573d6000803e3d6000fd5b505050505b5b5b505050506200093c565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620003cc8262000381565b810181811067ffffffffffffffff82111715620003ee57620003ed62000392565b5b80604052505050565b60006200040362000363565b9050620004118282620003c1565b919050565b600067ffffffffffffffff82111562000434576200043362000392565b5b6200043f8262000381565b9050602081019050919050565b60005b838110156200046c5780820151818401526020810190506200044f565b60008484015250505050565b60006200048f620004898462000416565b620003f7565b905082815260208101848484011115620004ae57620004ad6200037c565b5b620004bb8482856200044c565b509392505050565b600082601f830112620004db57620004da62000377565b5b8151620004ed84826020860162000478565b91505092915050565b6000806040838503121562000510576200050f6200036d565b5b600083015167ffffffffffffffff81111562000531576200053062000372565b5b6200053f85828601620004c3565b925050602083015167ffffffffffffffff81111562000563576200056262000372565b5b6200057185828601620004c3565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620005ce57607f821691505b602082108103620005e457620005e362000586565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200064e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200060f565b6200065a86836200060f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620006a7620006a16200069b8462000672565b6200067c565b62000672565b9050919050565b6000819050919050565b620006c38362000686565b620006db620006d282620006ae565b8484546200061c565b825550505050565b600090565b620006f2620006e3565b620006ff818484620006b8565b505050565b5b8181101562000727576200071b600082620006e8565b60018101905062000705565b5050565b601f82111562000776576200074081620005ea565b6200074b84620005ff565b810160208510156200075b578190505b620007736200076a85620005ff565b83018262000704565b50505b505050565b600082821c905092915050565b60006200079b600019846008026200077b565b1980831691505092915050565b6000620007b6838362000788565b9150826002028217905092915050565b620007d1826200057b565b67ffffffffffffffff811115620007ed57620007ec62000392565b5b620007f98254620005b5565b620008068282856200072b565b600060209050601f8311600181146200083e576000841562000829578287015190505b620008358582620007a8565b865550620008a5565b601f1984166200084e86620005ea565b60005b82811015620008785784890151825560018201915060208501945060208101905062000851565b8683101562000898578489015162000894601f89168262000788565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008da82620008ad565b9050919050565b620008ec81620008cd565b82525050565b6000604082019050620009096000830185620008e1565b620009186020830184620008e1565b9392505050565b6000602082019050620009366000830184620008e1565b92915050565b6149b3806200094c6000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c8063715018a6116100b8578063b88d4fde1161007c578063b88d4fde1461033d578063c87b56dd14610359578063d1bdb1d114610389578063e985e9c5146103a7578063f2fde38b146103d7578063f47c84c5146103f357610142565b8063715018a6146102bf5780638da5cb5b146102c957806395d89b41146102e7578063a0712d6814610305578063a22cb4651461032157610142565b806323b872dd1161010a57806323b872dd146101ff5780633ccfd60b1461021b57806341f434341461022557806342842e0e146102435780636352211e1461025f57806370a082311461028f57610142565b806301ffc9a71461014757806306fdde0314610177578063081812fc14610195578063095ea7b3146101c557806318160ddd146101e1575b600080fd5b610161600480360381019061015c9190612473565b610411565b60405161016e91906124bb565b60405180910390f35b61017f6104f3565b60405161018c9190612566565b60405180910390f35b6101af60048036038101906101aa91906125be565b610585565b6040516101bc919061262c565b60405180910390f35b6101df60048036038101906101da9190612673565b6105cb565b005b6101e96106e2565b6040516101f691906126c2565b60405180910390f35b610219600480360381019061021491906126dd565b6106f3565b005b610223610742565b005b61022d61079a565b60405161023a919061278f565b60405180910390f35b61025d600480360381019061025891906126dd565b6107ac565b005b610279600480360381019061027491906125be565b6107fb565b604051610286919061262c565b60405180910390f35b6102a960048036038101906102a491906127aa565b610881565b6040516102b691906126c2565b60405180910390f35b6102c7610938565b005b6102d161094c565b6040516102de919061262c565b60405180910390f35b6102ef610976565b6040516102fc9190612566565b60405180910390f35b61031f600480360381019061031a91906125be565b610a08565b005b61033b60048036038101906103369190612803565b610a15565b005b61035760048036038101906103529190612978565b610a2b565b005b610373600480360381019061036e91906125be565b610a7c565b6040516103809190612566565b60405180910390f35b610391610bfd565b60405161039e91906126c2565b60405180910390f35b6103c160048036038101906103bc91906129fb565b610c02565b6040516103ce91906124bb565b60405180910390f35b6103f160048036038101906103ec91906127aa565b610c96565b005b6103fb610d19565b60405161040891906126c2565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104dc57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104ec57506104eb82610d1f565b5b9050919050565b60606000805461050290612a6a565b80601f016020809104026020016040519081016040528092919081815260200182805461052e90612a6a565b801561057b5780601f106105505761010080835404028352916020019161057b565b820191906000526020600020905b81548152906001019060200180831161055e57829003601f168201915b5050505050905090565b600061059082610d89565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006105d6826107fb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063d90612b0d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610665610dd4565b73ffffffffffffffffffffffffffffffffffffffff16148061069457506106938161068e610dd4565b610c02565b5b6106d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ca90612b9f565b60405180910390fd5b6106dd8383610ddc565b505050565b60006106ee6007610e95565b905090565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107315761073033610ea3565b5b61073c848484610fa0565b50505050565b61074a611000565b61075261094c565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610797573d6000803e3d6000fd5b50565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107ea576107e933610ea3565b5b6107f584848461107e565b50505050565b6000806108078361109e565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610878576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086f90612c0b565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e890612c9d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610940611000565b61094a60006110db565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461098590612a6a565b80601f01602080910402602001604051908101604052809291908181526020018280546109b190612a6a565b80156109fe5780601f106109d3576101008083540402835291602001916109fe565b820191906000526020600020905b8154815290600101906020018083116109e157829003601f168201915b5050505050905090565b610a1281336111a1565b50565b610a27610a20610dd4565b8383611297565b5050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a6957610a6833610ea3565b5b610a7585858585611403565b5050505050565b6060610a8782611465565b610ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abd90612d09565b60405180910390fd5b6000610ad1836114a6565b90506000610ade84611607565b90506000610aeb83611688565b90506000610af8866117eb565b604051602001610b089190612db1565b6040516020818303038152906040529050600060405180606001604052806021815260200161495d602191399050600083604051602001610b499190612e1f565b604051602081830303815290604052905060006040518060400160405280600781526020017f233030303030300000000000000000000000000000000000000000000000000081525090506000848484848a604051602001610baf9594939291906130ed565b60405160208183030381529060405290506000610bcb82611688565b905080604051602001610bde9190613208565b6040516020818303038152906040529950505050505050505050919050565b600281565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610c9e611000565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d049061329c565b60405180910390fd5b610d16816110db565b50565b61138881565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610d9281611465565b610dd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc890612c0b565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610e4f836107fb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610f9d576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610f1a9291906132bc565b602060405180830381865afa158015610f37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5b91906132fa565b610f9c57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610f93919061262c565b60405180910390fd5b5b50565b610fb1610fab610dd4565b826118b9565b610ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe790613399565b60405180910390fd5b610ffb83838361194e565b505050565b611008610dd4565b73ffffffffffffffffffffffffffffffffffffffff1661102661094c565b73ffffffffffffffffffffffffffffffffffffffff161461107c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107390613405565b60405180910390fd5b565b61109983838360405180602001604052806000815250610a2b565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6113886111ae6007610e95565b106111ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e590613471565b60405180910390fd5b6002826111fa83610881565b61120491906134c0565b1115611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123c90613566565b60405180910390fd5b60005b82811015611292576000600161125e6007610e95565b61126891906134c0565b90506112748382611c47565b61127e6007611c65565b50808061128a90613586565b915050611248565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611305576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fc9061361a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113f691906124bb565b60405180910390a3505050565b61141461140e610dd4565b836118b9565b611453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144a90613399565b60405180910390fd5b61145f84848484611c7b565b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166114878361109e565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b606060006114b383611cd7565b905060006101909050600061012c90506000600284602001516114d69190613669565b836114e1919061369a565b90506000600285604001516114f69190613669565b83611501919061369a565b90506000849050600060146002886040015161151d9190613669565b86611528919061369a565b611532919061369a565b9050600061154388600001516117eb565b61155089606001516117eb565b6040516020016115619291906137b2565b6040516020818303038152906040529050600061157d866117eb565b611586866117eb565b6115938b602001516117eb565b6115a08c604001516117eb565b856115ba60018f608001516115b591906134c0565b6117eb565b6115c38a6117eb565b6115cc8a6117eb565b896040516020016115e599989796959493929190613e7f565b6040516020818303038152906040529050809950505050505050505050919050565b6060600061161483611cd7565b9050600061162582600001516117eb565b61163283602001516117eb565b61163f84604001516117eb565b61164c85606001516117eb565b61165986608001516117eb565b60405160200161166d959493929190614224565b60405160208183030381529060405290508092505050919050565b606060008251036116aa576040518060200160405280600081525090506117e6565b600060405180606001604052806040815260200161491d60409139905060006003600285516116d991906134c0565b6116e39190613669565b60046116ef91906142dd565b67ffffffffffffffff8111156117085761170761284d565b5b6040519080825280601f01601f19166020018201604052801561173a5781602001600182028036833780820191505090505b509050600182016020820185865187015b808210156117a6576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184536001840193505061174b565b50506003865106600181146117c257600281146117d5576117dd565b603d6001830353603d60028303536117dd565b603d60018303535b50505080925050505b919050565b6060600060016117fa84611e57565b01905060008167ffffffffffffffff8111156118195761181861284d565b5b6040519080825280601f01601f19166020018201604052801561184b5781602001600182028036833780820191505090505b509050600082602001820190505b6001156118ae578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816118a2576118a161363a565b5b04945060008503611859575b819350505050919050565b6000806118c5836107fb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061190757506119068185610c02565b5b8061194557508373ffffffffffffffffffffffffffffffffffffffff1661192d84610585565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661196e826107fb565b73ffffffffffffffffffffffffffffffffffffffff16146119c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bb90614391565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2a90614423565b60405180910390fd5b611a408383836001611faa565b8273ffffffffffffffffffffffffffffffffffffffff16611a60826107fb565b73ffffffffffffffffffffffffffffffffffffffff1614611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad90614391565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c428383836001611fb0565b505050565b611c61828260405180602001604052806000815250611fb6565b5050565b6001816000016000828254019250508190555050565b611c8684848461194e565b611c9284848484612011565b611cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc8906144b5565b60405180910390fd5b50505050565b611cdf6123d8565b600061016883604051602001611cf59190614542565b6040516020818303038152906040528051906020012060001c611d189190614568565b9050600060328085604051602001611d3091906145e5565b6040516020818303038152906040528051906020012060001c611d539190614568565b611d5d91906134c0565b9050600060648086604051602001611d759190614657565b6040516020818303038152906040528051906020012060001c611d989190614568565b611da291906134c0565b90506000602d603887604051602001611dbb91906146c9565b6040516020818303038152906040528051906020012060001c611dde9190614568565b611de891906134c0565b90506000600a87604051602001611dff919061473b565b6040516020818303038152906040528051906020012060001c611e229190614568565b90506040518060a001604052808681526020018581526020018481526020018381526020018281525095505050505050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611eb5577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611eab57611eaa61363a565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611ef2576d04ee2d6d415b85acef81000000008381611ee857611ee761363a565b5b0492506020810190505b662386f26fc100008310611f2157662386f26fc100008381611f1757611f1661363a565b5b0492506010810190505b6305f5e1008310611f4a576305f5e1008381611f4057611f3f61363a565b5b0492506008810190505b6127108310611f6f576127108381611f6557611f6461363a565b5b0492506004810190505b60648310611f925760648381611f8857611f8761363a565b5b0492506002810190505b600a8310611fa1576001810190505b80915050919050565b50505050565b50505050565b611fc08383612198565b611fcd6000848484612011565b61200c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612003906144b5565b60405180910390fd5b505050565b60006120328473ffffffffffffffffffffffffffffffffffffffff166123b5565b1561218b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261205b610dd4565b8786866040518563ffffffff1660e01b815260040161207d94939291906147b6565b6020604051808303816000875af19250505080156120b957506040513d601f19601f820116820180604052508101906120b69190614817565b60015b61213b573d80600081146120e9576040519150601f19603f3d011682016040523d82523d6000602084013e6120ee565b606091505b506000815103612133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212a906144b5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612190565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fe90614890565b60405180910390fd5b61221081611465565b15612250576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612247906148fc565b60405180910390fd5b61225e600083836001611faa565b61226781611465565b156122a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229e906148fc565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123b1600083836001611fb0565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6124508161241b565b811461245b57600080fd5b50565b60008135905061246d81612447565b92915050565b60006020828403121561248957612488612411565b5b60006124978482850161245e565b91505092915050565b60008115159050919050565b6124b5816124a0565b82525050565b60006020820190506124d060008301846124ac565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156125105780820151818401526020810190506124f5565b60008484015250505050565b6000601f19601f8301169050919050565b6000612538826124d6565b61254281856124e1565b93506125528185602086016124f2565b61255b8161251c565b840191505092915050565b60006020820190508181036000830152612580818461252d565b905092915050565b6000819050919050565b61259b81612588565b81146125a657600080fd5b50565b6000813590506125b881612592565b92915050565b6000602082840312156125d4576125d3612411565b5b60006125e2848285016125a9565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612616826125eb565b9050919050565b6126268161260b565b82525050565b6000602082019050612641600083018461261d565b92915050565b6126508161260b565b811461265b57600080fd5b50565b60008135905061266d81612647565b92915050565b6000806040838503121561268a57612689612411565b5b60006126988582860161265e565b92505060206126a9858286016125a9565b9150509250929050565b6126bc81612588565b82525050565b60006020820190506126d760008301846126b3565b92915050565b6000806000606084860312156126f6576126f5612411565b5b60006127048682870161265e565b93505060206127158682870161265e565b9250506040612726868287016125a9565b9150509250925092565b6000819050919050565b600061275561275061274b846125eb565b612730565b6125eb565b9050919050565b60006127678261273a565b9050919050565b60006127798261275c565b9050919050565b6127898161276e565b82525050565b60006020820190506127a46000830184612780565b92915050565b6000602082840312156127c0576127bf612411565b5b60006127ce8482850161265e565b91505092915050565b6127e0816124a0565b81146127eb57600080fd5b50565b6000813590506127fd816127d7565b92915050565b6000806040838503121561281a57612819612411565b5b60006128288582860161265e565b9250506020612839858286016127ee565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6128858261251c565b810181811067ffffffffffffffff821117156128a4576128a361284d565b5b80604052505050565b60006128b7612407565b90506128c3828261287c565b919050565b600067ffffffffffffffff8211156128e3576128e261284d565b5b6128ec8261251c565b9050602081019050919050565b82818337600083830152505050565b600061291b612916846128c8565b6128ad565b90508281526020810184848401111561293757612936612848565b5b6129428482856128f9565b509392505050565b600082601f83011261295f5761295e612843565b5b813561296f848260208601612908565b91505092915050565b6000806000806080858703121561299257612991612411565b5b60006129a08782880161265e565b94505060206129b18782880161265e565b93505060406129c2878288016125a9565b925050606085013567ffffffffffffffff8111156129e3576129e2612416565b5b6129ef8782880161294a565b91505092959194509250565b60008060408385031215612a1257612a11612411565b5b6000612a208582860161265e565b9250506020612a318582860161265e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612a8257607f821691505b602082108103612a9557612a94612a3b565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612af76021836124e1565b9150612b0282612a9b565b604082019050919050565b60006020820190508181036000830152612b2681612aea565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612b89603d836124e1565b9150612b9482612b2d565b604082019050919050565b60006020820190508181036000830152612bb881612b7c565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000612bf56018836124e1565b9150612c0082612bbf565b602082019050919050565b60006020820190508181036000830152612c2481612be8565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612c876029836124e1565b9150612c9282612c2b565b604082019050919050565b60006020820190508181036000830152612cb681612c7a565b9050919050565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b6000612cf36014836124e1565b9150612cfe82612cbd565b602082019050919050565b60006020820190508181036000830152612d2281612ce6565b9050919050565b600081905092915050565b7f43414e444c452023000000000000000000000000000000000000000000000000600082015250565b6000612d6a600883612d29565b9150612d7582612d34565b600882019050919050565b6000612d8b826124d6565b612d958185612d29565b9350612da58185602086016124f2565b80840191505092915050565b6000612dbc82612d5d565b9150612dc88284612d80565b915081905092915050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000600082015250565b6000612e09601a83612d29565b9150612e1482612dd3565b601a82019050919050565b6000612e2a82612dfc565b9150612e368284612d80565b915081905092915050565b7f7b00000000000000000000000000000000000000000000000000000000000000600082015250565b6000612e77600183612d29565b9150612e8282612e41565b600182019050919050565b7f226e616d65223a20220000000000000000000000000000000000000000000000600082015250565b6000612ec3600983612d29565b9150612ece82612e8d565b600982019050919050565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b6000612f0f600283612d29565b9150612f1a82612ed9565b600282019050919050565b7f226465736372697074696f6e223a202200000000000000000000000000000000600082015250565b6000612f5b601083612d29565b9150612f6682612f25565b601082019050919050565b7f22696d616765223a202200000000000000000000000000000000000000000000600082015250565b6000612fa7600a83612d29565b9150612fb282612f71565b600a82019050919050565b7f226261636b67726f756e645f636f6c6f72223a20220000000000000000000000600082015250565b6000612ff3601583612d29565b9150612ffe82612fbd565b601582019050919050565b7f2261747472696275746573223a205b0000000000000000000000000000000000600082015250565b600061303f600f83612d29565b915061304a82613009565b600f82019050919050565b7f5d00000000000000000000000000000000000000000000000000000000000000600082015250565b600061308b600183612d29565b915061309682613055565b600182019050919050565b7f7d00000000000000000000000000000000000000000000000000000000000000600082015250565b60006130d7600183612d29565b91506130e2826130a1565b600182019050919050565b60006130f882612e6a565b915061310382612eb6565b915061310f8288612d80565b915061311a82612f02565b915061312582612f4e565b91506131318287612d80565b915061313c82612f02565b915061314782612f9a565b91506131538286612d80565b915061315e82612f02565b915061316982612fe6565b91506131758285612d80565b915061318082612f02565b915061318b82613032565b91506131978284612d80565b91506131a28261307e565b91506131ad826130ca565b91508190509695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b60006131f2601d83612d29565b91506131fd826131bc565b601d82019050919050565b6000613213826131e5565b915061321f8284612d80565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006132866026836124e1565b91506132918261322a565b604082019050919050565b600060208201905081810360008301526132b581613279565b9050919050565b60006040820190506132d1600083018561261d565b6132de602083018461261d565b9392505050565b6000815190506132f4816127d7565b92915050565b6000602082840312156133105761330f612411565b5b600061331e848285016132e5565b91505092915050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613383602d836124e1565b915061338e82613327565b604082019050919050565b600060208201905081810360008301526133b281613376565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006133ef6020836124e1565b91506133fa826133b9565b602082019050919050565b6000602082019050818103600083015261341e816133e2565b9050919050565b7f416c6c20746f6b656e732068617665206265656e206d696e7465640000000000600082015250565b600061345b601b836124e1565b915061346682613425565b602082019050919050565b6000602082019050818103600083015261348a8161344e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006134cb82612588565b91506134d683612588565b92508282019050808211156134ee576134ed613491565b5b92915050565b7f43616e6e6f74206d696e74206d6f726520746f6b656e73207468616e20616c6c60008201527f6f776564207065722077616c6c65740000000000000000000000000000000000602082015250565b6000613550602f836124e1565b915061355b826134f4565b604082019050919050565b6000602082019050818103600083015261357f81613543565b9050919050565b600061359182612588565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036135c3576135c2613491565b5b600182019050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006136046019836124e1565b915061360f826135ce565b602082019050919050565b60006020820190508181036000830152613633816135f7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061367482612588565b915061367f83612588565b92508261368f5761368e61363a565b5b828204905092915050565b60006136a582612588565b91506136b083612588565b92508282039050818111156136c8576136c7613491565b5b92915050565b7f68736c6128000000000000000000000000000000000000000000000000000000600082015250565b6000613704600583612d29565b915061370f826136ce565b600582019050919050565b7f2c20313030252c203530252c2000000000000000000000000000000000000000600082015250565b6000613750600d83612d29565b915061375b8261371a565b600d82019050919050565b7f2529000000000000000000000000000000000000000000000000000000000000600082015250565b600061379c600283612d29565b91506137a782613766565b600282019050919050565b60006137bd826136f7565b91506137c98285612d80565b91506137d482613743565b91506137e08284612d80565b91506137eb8261378f565b91508190509392505050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060008201527f30302f737667222076696577426f783d223020302038303020363030223e0000602082015250565b6000613853603e83612d29565b915061385e826137f7565b603e82019050919050565b7f3c7265637420783d22302220793d2230222077696474683d223830302220686560008201527f696768743d22363030222066696c6c3d222330303022202f3e00000000000000602082015250565b60006138c5603983612d29565b91506138d082613869565b603982019050919050565b7f3c7265637420783d220000000000000000000000000000000000000000000000600082015250565b6000613911600983612d29565b915061391c826138db565b600982019050919050565b7f2220793d22000000000000000000000000000000000000000000000000000000600082015250565b600061395d600583612d29565b915061396882613927565b600582019050919050565b7f222077696474683d220000000000000000000000000000000000000000000000600082015250565b60006139a9600983612d29565b91506139b482613973565b600982019050919050565b7f22206865696768743d2200000000000000000000000000000000000000000000600082015250565b60006139f5600a83612d29565b9150613a00826139bf565b600a82019050919050565b7f222066696c6c3d22000000000000000000000000000000000000000000000000600082015250565b6000613a41600883612d29565b9150613a4c82613a0b565b600882019050919050565b7f222072783d223130222072793d223130223e0000000000000000000000000000600082015250565b6000613a8d601283612d29565b9150613a9882613a57565b601282019050919050565b7f3c616e696d617465206174747269627574654e616d653d226f7061636974792260008201527f206475723d220000000000000000000000000000000000000000000000000000602082015250565b6000613aff602683612d29565b9150613b0a82613aa3565b602682019050919050565b7f732220726570656174436f756e743d22696e646566696e697465222076616c7560008201527f65733d22302e383b20302e363b20302e393b20302e373b20313b20313b20302e60208201527f363b20302e383b20302e393b20302e353b20302e373b20302e3822202f3e0000604082015250565b6000613b97605e83612d29565b9150613ba282613b15565b605e82019050919050565b7f3c2f726563743e00000000000000000000000000000000000000000000000000600082015250565b6000613be3600783612d29565b9150613bee82613bad565b600782019050919050565b7f3c636972636c652063783d220000000000000000000000000000000000000000600082015250565b6000613c2f600c83612d29565b9150613c3a82613bf9565b600c82019050919050565b7f222063793d220000000000000000000000000000000000000000000000000000600082015250565b6000613c7b600683612d29565b9150613c8682613c45565b600682019050919050565b7f2220723d223130222066696c6c3d220000000000000000000000000000000000600082015250565b6000613cc7600f83612d29565b9150613cd282613c91565b600f82019050919050565b7f223e000000000000000000000000000000000000000000000000000000000000600082015250565b6000613d13600283612d29565b9150613d1e82613cdd565b600282019050919050565b7f3c616e696d617465206174747269627574654e616d653d226f7061636974792260008201527f206475723d2231732220726570656174436f756e743d22696e646566696e697460208201527f65222076616c7565733d22302e353b20313b20302e373b20302e393b20302e3660408201527f3b20302e383b20302e353b20302e373b20313b20302e383b20302e3622202f3e606082015250565b6000613dd1608083612d29565b9150613ddc82613d29565b608082019050919050565b7f3c2f636972636c653e0000000000000000000000000000000000000000000000600082015250565b6000613e1d600983612d29565b9150613e2882613de7565b600982019050919050565b7f3c2f7376673e0000000000000000000000000000000000000000000000000000600082015250565b6000613e69600683612d29565b9150613e7482613e33565b600682019050919050565b6000613e8a82613846565b9150613e95826138b8565b9150613ea082613904565b9150613eac828c612d80565b9150613eb782613950565b9150613ec3828b612d80565b9150613ece8261399c565b9150613eda828a612d80565b9150613ee5826139e8565b9150613ef18289612d80565b9150613efc82613a34565b9150613f088288612d80565b9150613f1382613a80565b9150613f1e82613af2565b9150613f2a8287612d80565b9150613f3582613b8a565b9150613f4082613bd6565b9150613f4b82613c22565b9150613f578286612d80565b9150613f6282613c6e565b9150613f6e8285612d80565b9150613f7982613cba565b9150613f858284612d80565b9150613f9082613d06565b9150613f9b82613dc4565b9150613fa682613e10565b9150613fb182613e5c565b91508190509a9950505050505050505050565b7f7b2274726169745f74797065223a2022487565222c202276616c7565223a2000600082015250565b6000613ffa601f83612d29565b915061400582613fc4565b601f82019050919050565b7f7d2c000000000000000000000000000000000000000000000000000000000000600082015250565b6000614046600283612d29565b915061405182614010565b600282019050919050565b7f7b2274726169745f74797065223a20225769647468222c202276616c7565223a60008201527f2000000000000000000000000000000000000000000000000000000000000000602082015250565b60006140b8602183612d29565b91506140c38261405c565b602182019050919050565b7f7b2274726169745f74797065223a2022486569676874222c202276616c75652260008201527f3a20000000000000000000000000000000000000000000000000000000000000602082015250565b600061412a602283612d29565b9150614135826140ce565b602282019050919050565b7f7b2274726169745f74797065223a20224f706163697479222c202276616c756560008201527f223a200000000000000000000000000000000000000000000000000000000000602082015250565b600061419c602383612d29565b91506141a782614140565b602382019050919050565b7f7b2274726169745f74797065223a2022466c69636b65722054696d696e67222c60008201527f202276616c7565223a2000000000000000000000000000000000000000000000602082015250565b600061420e602a83612d29565b9150614219826141b2565b602a82019050919050565b600061422f82613fed565b915061423b8288612d80565b915061424682614039565b9150614251826140ab565b915061425d8287612d80565b915061426882614039565b91506142738261411d565b915061427f8286612d80565b915061428a82614039565b91506142958261418f565b91506142a18285612d80565b91506142ac82614039565b91506142b782614201565b91506142c38284612d80565b91506142ce826130ca565b91508190509695505050505050565b60006142e882612588565b91506142f383612588565b925082820261430181612588565b9150828204841483151761431857614317613491565b5b5092915050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061437b6025836124e1565b91506143868261431f565b604082019050919050565b600060208201905081810360008301526143aa8161436e565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061440d6024836124e1565b9150614418826143b1565b604082019050919050565b6000602082019050818103600083015261443c81614400565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061449f6032836124e1565b91506144aa82614443565b604082019050919050565b600060208201905081810360008301526144ce81614492565b9050919050565b6000819050919050565b6144f06144eb82612588565b6144d5565b82525050565b7f6875650000000000000000000000000000000000000000000000000000000000600082015250565b600061452c600383612d29565b9150614537826144f6565b600382019050919050565b600061454e82846144df565b60208201915061455d8261451f565b915081905092915050565b600061457382612588565b915061457e83612588565b92508261458e5761458d61363a565b5b828206905092915050565b7f7769647468000000000000000000000000000000000000000000000000000000600082015250565b60006145cf600583612d29565b91506145da82614599565b600582019050919050565b60006145f182846144df565b602082019150614600826145c2565b915081905092915050565b7f6865696768740000000000000000000000000000000000000000000000000000600082015250565b6000614641600683612d29565b915061464c8261460b565b600682019050919050565b600061466382846144df565b60208201915061467282614634565b915081905092915050565b7f6f70616369747900000000000000000000000000000000000000000000000000600082015250565b60006146b3600783612d29565b91506146be8261467d565b600782019050919050565b60006146d582846144df565b6020820191506146e4826146a6565b915081905092915050565b7f666c69636b657254696d696e6700000000000000000000000000000000000000600082015250565b6000614725600d83612d29565b9150614730826146ef565b600d82019050919050565b600061474782846144df565b60208201915061475682614718565b915081905092915050565b600081519050919050565b600082825260208201905092915050565b600061478882614761565b614792818561476c565b93506147a28185602086016124f2565b6147ab8161251c565b840191505092915050565b60006080820190506147cb600083018761261d565b6147d8602083018661261d565b6147e560408301856126b3565b81810360608301526147f7818461477d565b905095945050505050565b60008151905061481181612447565b92915050565b60006020828403121561482d5761482c612411565b5b600061483b84828501614802565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061487a6020836124e1565b915061488582614844565b602082019050919050565b600060208201905081810360008301526148a98161486d565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006148e6601c836124e1565b91506148f1826148b0565b602082019050919050565b60006020820190508181036000830152614915816148d9565b905091905056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f41204a6f75726e657920746f204f6e2d436861696e204e6f746162696c6974792ea2646970667358221220c5d9b397e2d7dd1d73b9c8ea3ad516df3123f621db97d59481d0d2044242715b64736f6c6343000812003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000743414e444c455300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000620434e444c530000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101425760003560e01c8063715018a6116100b8578063b88d4fde1161007c578063b88d4fde1461033d578063c87b56dd14610359578063d1bdb1d114610389578063e985e9c5146103a7578063f2fde38b146103d7578063f47c84c5146103f357610142565b8063715018a6146102bf5780638da5cb5b146102c957806395d89b41146102e7578063a0712d6814610305578063a22cb4651461032157610142565b806323b872dd1161010a57806323b872dd146101ff5780633ccfd60b1461021b57806341f434341461022557806342842e0e146102435780636352211e1461025f57806370a082311461028f57610142565b806301ffc9a71461014757806306fdde0314610177578063081812fc14610195578063095ea7b3146101c557806318160ddd146101e1575b600080fd5b610161600480360381019061015c9190612473565b610411565b60405161016e91906124bb565b60405180910390f35b61017f6104f3565b60405161018c9190612566565b60405180910390f35b6101af60048036038101906101aa91906125be565b610585565b6040516101bc919061262c565b60405180910390f35b6101df60048036038101906101da9190612673565b6105cb565b005b6101e96106e2565b6040516101f691906126c2565b60405180910390f35b610219600480360381019061021491906126dd565b6106f3565b005b610223610742565b005b61022d61079a565b60405161023a919061278f565b60405180910390f35b61025d600480360381019061025891906126dd565b6107ac565b005b610279600480360381019061027491906125be565b6107fb565b604051610286919061262c565b60405180910390f35b6102a960048036038101906102a491906127aa565b610881565b6040516102b691906126c2565b60405180910390f35b6102c7610938565b005b6102d161094c565b6040516102de919061262c565b60405180910390f35b6102ef610976565b6040516102fc9190612566565b60405180910390f35b61031f600480360381019061031a91906125be565b610a08565b005b61033b60048036038101906103369190612803565b610a15565b005b61035760048036038101906103529190612978565b610a2b565b005b610373600480360381019061036e91906125be565b610a7c565b6040516103809190612566565b60405180910390f35b610391610bfd565b60405161039e91906126c2565b60405180910390f35b6103c160048036038101906103bc91906129fb565b610c02565b6040516103ce91906124bb565b60405180910390f35b6103f160048036038101906103ec91906127aa565b610c96565b005b6103fb610d19565b60405161040891906126c2565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104dc57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104ec57506104eb82610d1f565b5b9050919050565b60606000805461050290612a6a565b80601f016020809104026020016040519081016040528092919081815260200182805461052e90612a6a565b801561057b5780601f106105505761010080835404028352916020019161057b565b820191906000526020600020905b81548152906001019060200180831161055e57829003601f168201915b5050505050905090565b600061059082610d89565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006105d6826107fb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063d90612b0d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610665610dd4565b73ffffffffffffffffffffffffffffffffffffffff16148061069457506106938161068e610dd4565b610c02565b5b6106d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ca90612b9f565b60405180910390fd5b6106dd8383610ddc565b505050565b60006106ee6007610e95565b905090565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107315761073033610ea3565b5b61073c848484610fa0565b50505050565b61074a611000565b61075261094c565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610797573d6000803e3d6000fd5b50565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107ea576107e933610ea3565b5b6107f584848461107e565b50505050565b6000806108078361109e565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610878576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086f90612c0b565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e890612c9d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610940611000565b61094a60006110db565b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461098590612a6a565b80601f01602080910402602001604051908101604052809291908181526020018280546109b190612a6a565b80156109fe5780601f106109d3576101008083540402835291602001916109fe565b820191906000526020600020905b8154815290600101906020018083116109e157829003601f168201915b5050505050905090565b610a1281336111a1565b50565b610a27610a20610dd4565b8383611297565b5050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a6957610a6833610ea3565b5b610a7585858585611403565b5050505050565b6060610a8782611465565b610ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abd90612d09565b60405180910390fd5b6000610ad1836114a6565b90506000610ade84611607565b90506000610aeb83611688565b90506000610af8866117eb565b604051602001610b089190612db1565b6040516020818303038152906040529050600060405180606001604052806021815260200161495d602191399050600083604051602001610b499190612e1f565b604051602081830303815290604052905060006040518060400160405280600781526020017f233030303030300000000000000000000000000000000000000000000000000081525090506000848484848a604051602001610baf9594939291906130ed565b60405160208183030381529060405290506000610bcb82611688565b905080604051602001610bde9190613208565b6040516020818303038152906040529950505050505050505050919050565b600281565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610c9e611000565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d049061329c565b60405180910390fd5b610d16816110db565b50565b61138881565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610d9281611465565b610dd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc890612c0b565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610e4f836107fb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610f9d576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610f1a9291906132bc565b602060405180830381865afa158015610f37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5b91906132fa565b610f9c57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610f93919061262c565b60405180910390fd5b5b50565b610fb1610fab610dd4565b826118b9565b610ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe790613399565b60405180910390fd5b610ffb83838361194e565b505050565b611008610dd4565b73ffffffffffffffffffffffffffffffffffffffff1661102661094c565b73ffffffffffffffffffffffffffffffffffffffff161461107c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107390613405565b60405180910390fd5b565b61109983838360405180602001604052806000815250610a2b565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6113886111ae6007610e95565b106111ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e590613471565b60405180910390fd5b6002826111fa83610881565b61120491906134c0565b1115611245576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123c90613566565b60405180910390fd5b60005b82811015611292576000600161125e6007610e95565b61126891906134c0565b90506112748382611c47565b61127e6007611c65565b50808061128a90613586565b915050611248565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611305576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fc9061361a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113f691906124bb565b60405180910390a3505050565b61141461140e610dd4565b836118b9565b611453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144a90613399565b60405180910390fd5b61145f84848484611c7b565b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166114878361109e565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b606060006114b383611cd7565b905060006101909050600061012c90506000600284602001516114d69190613669565b836114e1919061369a565b90506000600285604001516114f69190613669565b83611501919061369a565b90506000849050600060146002886040015161151d9190613669565b86611528919061369a565b611532919061369a565b9050600061154388600001516117eb565b61155089606001516117eb565b6040516020016115619291906137b2565b6040516020818303038152906040529050600061157d866117eb565b611586866117eb565b6115938b602001516117eb565b6115a08c604001516117eb565b856115ba60018f608001516115b591906134c0565b6117eb565b6115c38a6117eb565b6115cc8a6117eb565b896040516020016115e599989796959493929190613e7f565b6040516020818303038152906040529050809950505050505050505050919050565b6060600061161483611cd7565b9050600061162582600001516117eb565b61163283602001516117eb565b61163f84604001516117eb565b61164c85606001516117eb565b61165986608001516117eb565b60405160200161166d959493929190614224565b60405160208183030381529060405290508092505050919050565b606060008251036116aa576040518060200160405280600081525090506117e6565b600060405180606001604052806040815260200161491d60409139905060006003600285516116d991906134c0565b6116e39190613669565b60046116ef91906142dd565b67ffffffffffffffff8111156117085761170761284d565b5b6040519080825280601f01601f19166020018201604052801561173a5781602001600182028036833780820191505090505b509050600182016020820185865187015b808210156117a6576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f811685015184536001840193505061174b565b50506003865106600181146117c257600281146117d5576117dd565b603d6001830353603d60028303536117dd565b603d60018303535b50505080925050505b919050565b6060600060016117fa84611e57565b01905060008167ffffffffffffffff8111156118195761181861284d565b5b6040519080825280601f01601f19166020018201604052801561184b5781602001600182028036833780820191505090505b509050600082602001820190505b6001156118ae578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816118a2576118a161363a565b5b04945060008503611859575b819350505050919050565b6000806118c5836107fb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061190757506119068185610c02565b5b8061194557508373ffffffffffffffffffffffffffffffffffffffff1661192d84610585565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661196e826107fb565b73ffffffffffffffffffffffffffffffffffffffff16146119c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bb90614391565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2a90614423565b60405180910390fd5b611a408383836001611faa565b8273ffffffffffffffffffffffffffffffffffffffff16611a60826107fb565b73ffffffffffffffffffffffffffffffffffffffff1614611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad90614391565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c428383836001611fb0565b505050565b611c61828260405180602001604052806000815250611fb6565b5050565b6001816000016000828254019250508190555050565b611c8684848461194e565b611c9284848484612011565b611cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc8906144b5565b60405180910390fd5b50505050565b611cdf6123d8565b600061016883604051602001611cf59190614542565b6040516020818303038152906040528051906020012060001c611d189190614568565b9050600060328085604051602001611d3091906145e5565b6040516020818303038152906040528051906020012060001c611d539190614568565b611d5d91906134c0565b9050600060648086604051602001611d759190614657565b6040516020818303038152906040528051906020012060001c611d989190614568565b611da291906134c0565b90506000602d603887604051602001611dbb91906146c9565b6040516020818303038152906040528051906020012060001c611dde9190614568565b611de891906134c0565b90506000600a87604051602001611dff919061473b565b6040516020818303038152906040528051906020012060001c611e229190614568565b90506040518060a001604052808681526020018581526020018481526020018381526020018281525095505050505050919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611eb5577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611eab57611eaa61363a565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611ef2576d04ee2d6d415b85acef81000000008381611ee857611ee761363a565b5b0492506020810190505b662386f26fc100008310611f2157662386f26fc100008381611f1757611f1661363a565b5b0492506010810190505b6305f5e1008310611f4a576305f5e1008381611f4057611f3f61363a565b5b0492506008810190505b6127108310611f6f576127108381611f6557611f6461363a565b5b0492506004810190505b60648310611f925760648381611f8857611f8761363a565b5b0492506002810190505b600a8310611fa1576001810190505b80915050919050565b50505050565b50505050565b611fc08383612198565b611fcd6000848484612011565b61200c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612003906144b5565b60405180910390fd5b505050565b60006120328473ffffffffffffffffffffffffffffffffffffffff166123b5565b1561218b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261205b610dd4565b8786866040518563ffffffff1660e01b815260040161207d94939291906147b6565b6020604051808303816000875af19250505080156120b957506040513d601f19601f820116820180604052508101906120b69190614817565b60015b61213b573d80600081146120e9576040519150601f19603f3d011682016040523d82523d6000602084013e6120ee565b606091505b506000815103612133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212a906144b5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612190565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fe90614890565b60405180910390fd5b61221081611465565b15612250576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612247906148fc565b60405180910390fd5b61225e600083836001611faa565b61226781611465565b156122a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229e906148fc565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123b1600083836001611fb0565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6124508161241b565b811461245b57600080fd5b50565b60008135905061246d81612447565b92915050565b60006020828403121561248957612488612411565b5b60006124978482850161245e565b91505092915050565b60008115159050919050565b6124b5816124a0565b82525050565b60006020820190506124d060008301846124ac565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156125105780820151818401526020810190506124f5565b60008484015250505050565b6000601f19601f8301169050919050565b6000612538826124d6565b61254281856124e1565b93506125528185602086016124f2565b61255b8161251c565b840191505092915050565b60006020820190508181036000830152612580818461252d565b905092915050565b6000819050919050565b61259b81612588565b81146125a657600080fd5b50565b6000813590506125b881612592565b92915050565b6000602082840312156125d4576125d3612411565b5b60006125e2848285016125a9565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612616826125eb565b9050919050565b6126268161260b565b82525050565b6000602082019050612641600083018461261d565b92915050565b6126508161260b565b811461265b57600080fd5b50565b60008135905061266d81612647565b92915050565b6000806040838503121561268a57612689612411565b5b60006126988582860161265e565b92505060206126a9858286016125a9565b9150509250929050565b6126bc81612588565b82525050565b60006020820190506126d760008301846126b3565b92915050565b6000806000606084860312156126f6576126f5612411565b5b60006127048682870161265e565b93505060206127158682870161265e565b9250506040612726868287016125a9565b9150509250925092565b6000819050919050565b600061275561275061274b846125eb565b612730565b6125eb565b9050919050565b60006127678261273a565b9050919050565b60006127798261275c565b9050919050565b6127898161276e565b82525050565b60006020820190506127a46000830184612780565b92915050565b6000602082840312156127c0576127bf612411565b5b60006127ce8482850161265e565b91505092915050565b6127e0816124a0565b81146127eb57600080fd5b50565b6000813590506127fd816127d7565b92915050565b6000806040838503121561281a57612819612411565b5b60006128288582860161265e565b9250506020612839858286016127ee565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6128858261251c565b810181811067ffffffffffffffff821117156128a4576128a361284d565b5b80604052505050565b60006128b7612407565b90506128c3828261287c565b919050565b600067ffffffffffffffff8211156128e3576128e261284d565b5b6128ec8261251c565b9050602081019050919050565b82818337600083830152505050565b600061291b612916846128c8565b6128ad565b90508281526020810184848401111561293757612936612848565b5b6129428482856128f9565b509392505050565b600082601f83011261295f5761295e612843565b5b813561296f848260208601612908565b91505092915050565b6000806000806080858703121561299257612991612411565b5b60006129a08782880161265e565b94505060206129b18782880161265e565b93505060406129c2878288016125a9565b925050606085013567ffffffffffffffff8111156129e3576129e2612416565b5b6129ef8782880161294a565b91505092959194509250565b60008060408385031215612a1257612a11612411565b5b6000612a208582860161265e565b9250506020612a318582860161265e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612a8257607f821691505b602082108103612a9557612a94612a3b565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612af76021836124e1565b9150612b0282612a9b565b604082019050919050565b60006020820190508181036000830152612b2681612aea565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612b89603d836124e1565b9150612b9482612b2d565b604082019050919050565b60006020820190508181036000830152612bb881612b7c565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000612bf56018836124e1565b9150612c0082612bbf565b602082019050919050565b60006020820190508181036000830152612c2481612be8565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612c876029836124e1565b9150612c9282612c2b565b604082019050919050565b60006020820190508181036000830152612cb681612c7a565b9050919050565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b6000612cf36014836124e1565b9150612cfe82612cbd565b602082019050919050565b60006020820190508181036000830152612d2281612ce6565b9050919050565b600081905092915050565b7f43414e444c452023000000000000000000000000000000000000000000000000600082015250565b6000612d6a600883612d29565b9150612d7582612d34565b600882019050919050565b6000612d8b826124d6565b612d958185612d29565b9350612da58185602086016124f2565b80840191505092915050565b6000612dbc82612d5d565b9150612dc88284612d80565b915081905092915050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000600082015250565b6000612e09601a83612d29565b9150612e1482612dd3565b601a82019050919050565b6000612e2a82612dfc565b9150612e368284612d80565b915081905092915050565b7f7b00000000000000000000000000000000000000000000000000000000000000600082015250565b6000612e77600183612d29565b9150612e8282612e41565b600182019050919050565b7f226e616d65223a20220000000000000000000000000000000000000000000000600082015250565b6000612ec3600983612d29565b9150612ece82612e8d565b600982019050919050565b7f222c000000000000000000000000000000000000000000000000000000000000600082015250565b6000612f0f600283612d29565b9150612f1a82612ed9565b600282019050919050565b7f226465736372697074696f6e223a202200000000000000000000000000000000600082015250565b6000612f5b601083612d29565b9150612f6682612f25565b601082019050919050565b7f22696d616765223a202200000000000000000000000000000000000000000000600082015250565b6000612fa7600a83612d29565b9150612fb282612f71565b600a82019050919050565b7f226261636b67726f756e645f636f6c6f72223a20220000000000000000000000600082015250565b6000612ff3601583612d29565b9150612ffe82612fbd565b601582019050919050565b7f2261747472696275746573223a205b0000000000000000000000000000000000600082015250565b600061303f600f83612d29565b915061304a82613009565b600f82019050919050565b7f5d00000000000000000000000000000000000000000000000000000000000000600082015250565b600061308b600183612d29565b915061309682613055565b600182019050919050565b7f7d00000000000000000000000000000000000000000000000000000000000000600082015250565b60006130d7600183612d29565b91506130e2826130a1565b600182019050919050565b60006130f882612e6a565b915061310382612eb6565b915061310f8288612d80565b915061311a82612f02565b915061312582612f4e565b91506131318287612d80565b915061313c82612f02565b915061314782612f9a565b91506131538286612d80565b915061315e82612f02565b915061316982612fe6565b91506131758285612d80565b915061318082612f02565b915061318b82613032565b91506131978284612d80565b91506131a28261307e565b91506131ad826130ca565b91508190509695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b60006131f2601d83612d29565b91506131fd826131bc565b601d82019050919050565b6000613213826131e5565b915061321f8284612d80565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006132866026836124e1565b91506132918261322a565b604082019050919050565b600060208201905081810360008301526132b581613279565b9050919050565b60006040820190506132d1600083018561261d565b6132de602083018461261d565b9392505050565b6000815190506132f4816127d7565b92915050565b6000602082840312156133105761330f612411565b5b600061331e848285016132e5565b91505092915050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613383602d836124e1565b915061338e82613327565b604082019050919050565b600060208201905081810360008301526133b281613376565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006133ef6020836124e1565b91506133fa826133b9565b602082019050919050565b6000602082019050818103600083015261341e816133e2565b9050919050565b7f416c6c20746f6b656e732068617665206265656e206d696e7465640000000000600082015250565b600061345b601b836124e1565b915061346682613425565b602082019050919050565b6000602082019050818103600083015261348a8161344e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006134cb82612588565b91506134d683612588565b92508282019050808211156134ee576134ed613491565b5b92915050565b7f43616e6e6f74206d696e74206d6f726520746f6b656e73207468616e20616c6c60008201527f6f776564207065722077616c6c65740000000000000000000000000000000000602082015250565b6000613550602f836124e1565b915061355b826134f4565b604082019050919050565b6000602082019050818103600083015261357f81613543565b9050919050565b600061359182612588565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036135c3576135c2613491565b5b600182019050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006136046019836124e1565b915061360f826135ce565b602082019050919050565b60006020820190508181036000830152613633816135f7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061367482612588565b915061367f83612588565b92508261368f5761368e61363a565b5b828204905092915050565b60006136a582612588565b91506136b083612588565b92508282039050818111156136c8576136c7613491565b5b92915050565b7f68736c6128000000000000000000000000000000000000000000000000000000600082015250565b6000613704600583612d29565b915061370f826136ce565b600582019050919050565b7f2c20313030252c203530252c2000000000000000000000000000000000000000600082015250565b6000613750600d83612d29565b915061375b8261371a565b600d82019050919050565b7f2529000000000000000000000000000000000000000000000000000000000000600082015250565b600061379c600283612d29565b91506137a782613766565b600282019050919050565b60006137bd826136f7565b91506137c98285612d80565b91506137d482613743565b91506137e08284612d80565b91506137eb8261378f565b91508190509392505050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060008201527f30302f737667222076696577426f783d223020302038303020363030223e0000602082015250565b6000613853603e83612d29565b915061385e826137f7565b603e82019050919050565b7f3c7265637420783d22302220793d2230222077696474683d223830302220686560008201527f696768743d22363030222066696c6c3d222330303022202f3e00000000000000602082015250565b60006138c5603983612d29565b91506138d082613869565b603982019050919050565b7f3c7265637420783d220000000000000000000000000000000000000000000000600082015250565b6000613911600983612d29565b915061391c826138db565b600982019050919050565b7f2220793d22000000000000000000000000000000000000000000000000000000600082015250565b600061395d600583612d29565b915061396882613927565b600582019050919050565b7f222077696474683d220000000000000000000000000000000000000000000000600082015250565b60006139a9600983612d29565b91506139b482613973565b600982019050919050565b7f22206865696768743d2200000000000000000000000000000000000000000000600082015250565b60006139f5600a83612d29565b9150613a00826139bf565b600a82019050919050565b7f222066696c6c3d22000000000000000000000000000000000000000000000000600082015250565b6000613a41600883612d29565b9150613a4c82613a0b565b600882019050919050565b7f222072783d223130222072793d223130223e0000000000000000000000000000600082015250565b6000613a8d601283612d29565b9150613a9882613a57565b601282019050919050565b7f3c616e696d617465206174747269627574654e616d653d226f7061636974792260008201527f206475723d220000000000000000000000000000000000000000000000000000602082015250565b6000613aff602683612d29565b9150613b0a82613aa3565b602682019050919050565b7f732220726570656174436f756e743d22696e646566696e697465222076616c7560008201527f65733d22302e383b20302e363b20302e393b20302e373b20313b20313b20302e60208201527f363b20302e383b20302e393b20302e353b20302e373b20302e3822202f3e0000604082015250565b6000613b97605e83612d29565b9150613ba282613b15565b605e82019050919050565b7f3c2f726563743e00000000000000000000000000000000000000000000000000600082015250565b6000613be3600783612d29565b9150613bee82613bad565b600782019050919050565b7f3c636972636c652063783d220000000000000000000000000000000000000000600082015250565b6000613c2f600c83612d29565b9150613c3a82613bf9565b600c82019050919050565b7f222063793d220000000000000000000000000000000000000000000000000000600082015250565b6000613c7b600683612d29565b9150613c8682613c45565b600682019050919050565b7f2220723d223130222066696c6c3d220000000000000000000000000000000000600082015250565b6000613cc7600f83612d29565b9150613cd282613c91565b600f82019050919050565b7f223e000000000000000000000000000000000000000000000000000000000000600082015250565b6000613d13600283612d29565b9150613d1e82613cdd565b600282019050919050565b7f3c616e696d617465206174747269627574654e616d653d226f7061636974792260008201527f206475723d2231732220726570656174436f756e743d22696e646566696e697460208201527f65222076616c7565733d22302e353b20313b20302e373b20302e393b20302e3660408201527f3b20302e383b20302e353b20302e373b20313b20302e383b20302e3622202f3e606082015250565b6000613dd1608083612d29565b9150613ddc82613d29565b608082019050919050565b7f3c2f636972636c653e0000000000000000000000000000000000000000000000600082015250565b6000613e1d600983612d29565b9150613e2882613de7565b600982019050919050565b7f3c2f7376673e0000000000000000000000000000000000000000000000000000600082015250565b6000613e69600683612d29565b9150613e7482613e33565b600682019050919050565b6000613e8a82613846565b9150613e95826138b8565b9150613ea082613904565b9150613eac828c612d80565b9150613eb782613950565b9150613ec3828b612d80565b9150613ece8261399c565b9150613eda828a612d80565b9150613ee5826139e8565b9150613ef18289612d80565b9150613efc82613a34565b9150613f088288612d80565b9150613f1382613a80565b9150613f1e82613af2565b9150613f2a8287612d80565b9150613f3582613b8a565b9150613f4082613bd6565b9150613f4b82613c22565b9150613f578286612d80565b9150613f6282613c6e565b9150613f6e8285612d80565b9150613f7982613cba565b9150613f858284612d80565b9150613f9082613d06565b9150613f9b82613dc4565b9150613fa682613e10565b9150613fb182613e5c565b91508190509a9950505050505050505050565b7f7b2274726169745f74797065223a2022487565222c202276616c7565223a2000600082015250565b6000613ffa601f83612d29565b915061400582613fc4565b601f82019050919050565b7f7d2c000000000000000000000000000000000000000000000000000000000000600082015250565b6000614046600283612d29565b915061405182614010565b600282019050919050565b7f7b2274726169745f74797065223a20225769647468222c202276616c7565223a60008201527f2000000000000000000000000000000000000000000000000000000000000000602082015250565b60006140b8602183612d29565b91506140c38261405c565b602182019050919050565b7f7b2274726169745f74797065223a2022486569676874222c202276616c75652260008201527f3a20000000000000000000000000000000000000000000000000000000000000602082015250565b600061412a602283612d29565b9150614135826140ce565b602282019050919050565b7f7b2274726169745f74797065223a20224f706163697479222c202276616c756560008201527f223a200000000000000000000000000000000000000000000000000000000000602082015250565b600061419c602383612d29565b91506141a782614140565b602382019050919050565b7f7b2274726169745f74797065223a2022466c69636b65722054696d696e67222c60008201527f202276616c7565223a2000000000000000000000000000000000000000000000602082015250565b600061420e602a83612d29565b9150614219826141b2565b602a82019050919050565b600061422f82613fed565b915061423b8288612d80565b915061424682614039565b9150614251826140ab565b915061425d8287612d80565b915061426882614039565b91506142738261411d565b915061427f8286612d80565b915061428a82614039565b91506142958261418f565b91506142a18285612d80565b91506142ac82614039565b91506142b782614201565b91506142c38284612d80565b91506142ce826130ca565b91508190509695505050505050565b60006142e882612588565b91506142f383612588565b925082820261430181612588565b9150828204841483151761431857614317613491565b5b5092915050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061437b6025836124e1565b91506143868261431f565b604082019050919050565b600060208201905081810360008301526143aa8161436e565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061440d6024836124e1565b9150614418826143b1565b604082019050919050565b6000602082019050818103600083015261443c81614400565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061449f6032836124e1565b91506144aa82614443565b604082019050919050565b600060208201905081810360008301526144ce81614492565b9050919050565b6000819050919050565b6144f06144eb82612588565b6144d5565b82525050565b7f6875650000000000000000000000000000000000000000000000000000000000600082015250565b600061452c600383612d29565b9150614537826144f6565b600382019050919050565b600061454e82846144df565b60208201915061455d8261451f565b915081905092915050565b600061457382612588565b915061457e83612588565b92508261458e5761458d61363a565b5b828206905092915050565b7f7769647468000000000000000000000000000000000000000000000000000000600082015250565b60006145cf600583612d29565b91506145da82614599565b600582019050919050565b60006145f182846144df565b602082019150614600826145c2565b915081905092915050565b7f6865696768740000000000000000000000000000000000000000000000000000600082015250565b6000614641600683612d29565b915061464c8261460b565b600682019050919050565b600061466382846144df565b60208201915061467282614634565b915081905092915050565b7f6f70616369747900000000000000000000000000000000000000000000000000600082015250565b60006146b3600783612d29565b91506146be8261467d565b600782019050919050565b60006146d582846144df565b6020820191506146e4826146a6565b915081905092915050565b7f666c69636b657254696d696e6700000000000000000000000000000000000000600082015250565b6000614725600d83612d29565b9150614730826146ef565b600d82019050919050565b600061474782846144df565b60208201915061475682614718565b915081905092915050565b600081519050919050565b600082825260208201905092915050565b600061478882614761565b614792818561476c565b93506147a28185602086016124f2565b6147ab8161251c565b840191505092915050565b60006080820190506147cb600083018761261d565b6147d8602083018661261d565b6147e560408301856126b3565b81810360608301526147f7818461477d565b905095945050505050565b60008151905061481181612447565b92915050565b60006020828403121561482d5761482c612411565b5b600061483b84828501614802565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061487a6020836124e1565b915061488582614844565b602082019050919050565b600060208201905081810360008301526148a98161486d565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006148e6601c836124e1565b91506148f1826148b0565b602082019050919050565b60006020820190508181036000830152614915816148d9565b905091905056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f41204a6f75726e657920746f204f6e2d436861696e204e6f746162696c6974792ea2646970667358221220c5d9b397e2d7dd1d73b9c8ea3ad516df3123f621db97d59481d0d2044242715b64736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000743414e444c455300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000620434e444c530000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): CANDLES
Arg [1] : symbol (string): CNDLS
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [3] : 43414e444c455300000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [5] : 20434e444c530000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
71052:6374:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54780:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55708:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57220:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56738:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76730:95;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76913:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76632:92;;;:::i;:::-;;7768:143;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77070:159;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55418:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55149:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34211:103;;;:::i;:::-;;33563:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55877:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71573:85;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57463:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77235:188;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75288:1338;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71208:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57689:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34469:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71162:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54780:305;54882:4;54934:25;54919:40;;;:11;:40;;;;:105;;;;54991:33;54976:48;;;:11;:48;;;;54919:105;:158;;;;55041:36;55065:11;55041:23;:36::i;:::-;54919:158;54899:178;;54780:305;;;:::o;55708:100::-;55762:13;55795:5;55788:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55708:100;:::o;57220:171::-;57296:7;57316:23;57331:7;57316:14;:23::i;:::-;57359:15;:24;57375:7;57359:24;;;;;;;;;;;;;;;;;;;;;57352:31;;57220:171;;;:::o;56738:416::-;56819:13;56835:23;56850:7;56835:14;:23::i;:::-;56819:39;;56883:5;56877:11;;:2;:11;;;56869:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;56977:5;56961:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;56986:37;57003:5;57010:12;:10;:12::i;:::-;56986:16;:37::i;:::-;56961:62;56939:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;57125:21;57134:2;57138:7;57125:8;:21::i;:::-;56808:346;56738:416;;:::o;76730:95::-;76774:7;76793:28;:18;:26;:28::i;:::-;76786:35;;76730:95;:::o;76913:151::-;77014:4;9284:10;9276:18;;:4;:18;;;9272:83;;9311:32;9332:10;9311:20;:32::i;:::-;9272:83;77023:37:::1;77042:4;77048:2;77052:7;77023:18;:37::i;:::-;76913:151:::0;;;;:::o;76632:92::-;33449:13;:11;:13::i;:::-;76680:7:::1;:5;:7::i;:::-;76672:25;;:48;76698:21;76672:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;76632:92::o:0;7768:143::-;184:42;7768:143;:::o;77070:159::-;77175:4;9284:10;9276:18;;:4;:18;;;9272:83;;9311:32;9332:10;9311:20;:32::i;:::-;9272:83;77184:41:::1;77207:4;77213:2;77217:7;77184:22;:41::i;:::-;77070:159:::0;;;;:::o;55418:223::-;55490:7;55510:13;55526:17;55535:7;55526:8;:17::i;:::-;55510:33;;55579:1;55562:19;;:5;:19;;;55554:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;55628:5;55621:12;;;55418:223;;;:::o;55149:207::-;55221:7;55266:1;55249:19;;:5;:19;;;55241:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;55332:9;:16;55342:5;55332:16;;;;;;;;;;;;;;;;55325:23;;55149:207;;;:::o;34211:103::-;33449:13;:11;:13::i;:::-;34276:30:::1;34303:1;34276:18;:30::i;:::-;34211:103::o:0;33563:87::-;33609:7;33636:6;;;;;;;;;;;33629:13;;33563:87;:::o;55877:104::-;55933:13;55966:7;55959:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55877:104;:::o;71573:85::-;71623:29;71629:10;71641;71623:5;:29::i;:::-;71573:85;:::o;57463:155::-;57558:52;57577:12;:10;:12::i;:::-;57591:8;57601;57558:18;:52::i;:::-;57463:155;;:::o;77235:188::-;77362:4;9284:10;9276:18;;:4;:18;;;9272:83;;9311:32;9332:10;9311:20;:32::i;:::-;9272:83;77372:47:::1;77395:4;77401:2;77405:7;77414:4;77372:22;:47::i;:::-;77235:188:::0;;;;;:::o;75288:1338::-;75354:13;75380:17;75388:8;75380:7;:17::i;:::-;75372:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;75457:17;75477:21;75489:8;75477:11;:21::i;:::-;75457:41;;75538:24;75565:28;75584:8;75565:18;:28::i;:::-;75538:55;;75633:23;75659:25;75679:3;75659:13;:25::i;:::-;75633:51;;75726:18;75783:26;75800:8;75783:16;:26::i;:::-;75754:56;;;;;;;;:::i;:::-;;;;;;;;;;;;;75726:85;;75816:25;:63;;;;;;;;;;;;;;;;;;;75884:22;75963:9;75916:57;;;;;;;;:::i;:::-;;;;;;;;;;;;;75884:90;;75979:29;:41;;;;;;;;;;;;;;;;;;;76029:18;76123:4;76166:11;76210:8;76262:15;76315:10;76065:290;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;76029:331;;76410:24;76437:26;76457:4;76437:13;:26::i;:::-;76410:53;;76610:10;76560:61;;;;;;;;:::i;:::-;;;;;;;;;;;;;76546:76;;;;;;;;;;;75288:1338;;;:::o;71208:49::-;71256:1;71208:49;:::o;57689:164::-;57786:4;57810:18;:25;57829:5;57810:25;;;;;;;;;;;;;;;:35;57836:8;57810:35;;;;;;;;;;;;;;;;;;;;;;;;;57803:42;;57689:164;;;;:::o;34469:201::-;33449:13;:11;:13::i;:::-;34578:1:::1;34558:22;;:8;:22;;::::0;34550:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;34634:28;34653:8;34634:18;:28::i;:::-;34469:201:::0;:::o;71162:41::-;71199:4;71162:41;:::o;47292:157::-;47377:4;47416:25;47401:40;;;:11;:40;;;;47394:47;;47292:157;;;:::o;67039:135::-;67121:16;67129:7;67121;:16::i;:::-;67113:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;67039:135;:::o;32114:98::-;32167:7;32194:10;32187:17;;32114:98;:::o;66318:174::-;66420:2;66393:15;:24;66409:7;66393:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;66476:7;66472:2;66438:46;;66447:23;66462:7;66447:14;:23::i;:::-;66438:46;;;;;;;;;;;;66318:174;;:::o;15643:114::-;15708:7;15735;:14;;;15728:21;;15643:114;;;:::o;9693:647::-;9932:1;184:42;9884:45;;;:49;9880:453;;;184:42;10183;;;10234:4;10241:8;10183:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10178:144;;10297:8;10278:28;;;;;;;;;;;:::i;:::-;;;;;;;;10178:144;9880:453;9693:647;:::o;57920:335::-;58115:41;58134:12;:10;:12::i;:::-;58148:7;58115:18;:41::i;:::-;58107:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;58219:28;58229:4;58235:2;58239:7;58219:9;:28::i;:::-;57920:335;;;:::o;33728:132::-;33803:12;:10;:12::i;:::-;33792:23;;:7;:5;:7::i;:::-;:23;;;33784:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33728:132::o;58326:185::-;58464:39;58481:4;58487:2;58491:7;58464:39;;;;;;;;;;;;:16;:39::i;:::-;58326:185;;;:::o;60212:117::-;60278:7;60305;:16;60313:7;60305:16;;;;;;;;;;;;;;;;;;;;;60298:23;;60212:117;;;:::o;34830:191::-;34904:16;34923:6;;;;;;;;;;;34904:25;;34949:8;34940:6;;:17;;;;;;;;;;;;;;;;;;35004:8;34973:40;;34994:8;34973:40;;;;;;;;;;;;34893:128;34830:191;:::o;71666:479::-;71199:4;71740:28;:18;:26;:28::i;:::-;:41;71732:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;71256:1;71847:10;71830:14;71840:3;71830:9;:14::i;:::-;:27;;;;:::i;:::-;:52;;71822:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;71952:9;71947:193;71971:10;71967:1;:14;71947:193;;;72001:15;72050:1;72019:28;:18;:26;:28::i;:::-;:32;;;;:::i;:::-;72001:50;;72064:23;72074:3;72079:7;72064:9;:23::i;:::-;72100:30;:18;:28;:30::i;:::-;71988:152;71983:3;;;;;:::i;:::-;;;;71947:193;;;;71666:479;;:::o;66635:315::-;66790:8;66781:17;;:5;:17;;;66773:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;66877:8;66839:18;:25;66858:5;66839:25;;;;;;;;;;;;;;;:35;66865:8;66839:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;66923:8;66901:41;;66916:5;66901:41;;;66933:8;66901:41;;;;;;:::i;:::-;;;;;;;;66635:315;;;:::o;58582:322::-;58756:41;58775:12;:10;:12::i;:::-;58789:7;58756:18;:41::i;:::-;58748:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;58858:38;58872:4;58878:2;58882:7;58891:4;58858:13;:38::i;:::-;58582:322;;;;:::o;60642:128::-;60707:4;60760:1;60731:31;;:17;60740:7;60731:8;:17::i;:::-;:31;;;;60724:38;;60642:128;;;:::o;72819:1682::-;72881:13;72905:32;72940:30;72961:8;72940:20;:30::i;:::-;72905:65;;72983:15;73001:3;72983:21;;73013:15;73031:3;73013:21;;73043:15;73092:1;73071:12;:18;;;:22;;;;:::i;:::-;73061:7;:32;;;;:::i;:::-;73043:50;;73102:15;73152:1;73130:12;:19;;;:23;;;;:::i;:::-;73120:7;:33;;;;:::i;:::-;73102:51;;73162:13;73178:7;73162:23;;73194:13;73246:2;73242:1;73220:12;:19;;;:23;;;;:::i;:::-;73210:7;:33;;;;:::i;:::-;:38;;;;:::i;:::-;73194:54;;73261:23;73320:34;73337:12;:16;;;73320;:34::i;:::-;73373:38;73390:12;:20;;;73373:16;:38::i;:::-;73294:124;;;;;;;;;:::i;:::-;;;;;;;;;;;;;73261:158;;73432:17;73670:25;73687:7;73670:16;:25::i;:::-;73706;73723:7;73706:16;:25::i;:::-;73746:36;73763:12;:18;;;73746:16;:36::i;:::-;73798:37;73815:12;:19;;;73798:16;:37::i;:::-;73849:9;73935:48;73981:1;73952:12;:26;;;:30;;;;:::i;:::-;73935:16;:48::i;:::-;74178:23;74195:5;74178:16;:23::i;:::-;74213;74230:5;74213:16;:23::i;:::-;74257:9;73471:998;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;73432:1042;;74490:3;74483:10;;;;;;;;;;;72819:1682;;;:::o;74507:775::-;74576:13;74594:32;74629:30;74650:8;74629:20;:30::i;:::-;74594:65;;74664:24;74770:34;74787:12;:16;;;74770;:34::i;:::-;74860:36;74877:12;:18;;;74860:16;:36::i;:::-;74953:37;74970:12;:19;;;74953:16;:37::i;:::-;75048:38;75065:12;:20;;;75048:16;:38::i;:::-;75168:44;75185:12;:26;;;75168:16;:44::i;:::-;74706:537;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74664:584;;75264:10;75257:17;;;;74507:775;;;:::o;11667:3097::-;11725:13;11977:1;11962:4;:11;:16;11958:31;;11980:9;;;;;;;;;;;;;;;;11958:31;12042:19;12064:6;;;;;;;;;;;;;;;;;12042:28;;12481:20;12540:1;12535;12521:4;:11;:15;;;;:::i;:::-;12520:21;;;;:::i;:::-;12515:1;:27;;;;:::i;:::-;12504:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12481:62;;12723:1;12716:5;12712:13;12827:2;12819:6;12815:15;12938:4;12990;12984:11;12978:4;12974:22;12900:1432;13024:6;13015:7;13012:19;12900:1432;;;13130:1;13121:7;13117:15;13106:26;;13169:7;13163:14;13822:4;13814:5;13810:2;13806:14;13802:25;13792:8;13788:40;13782:47;13771:9;13763:67;13876:1;13865:9;13861:17;13848:30;;13968:4;13960:5;13956:2;13952:14;13948:25;13938:8;13934:40;13928:47;13917:9;13909:67;14022:1;14011:9;14007:17;13994:30;;14113:4;14105:5;14102:1;14098:13;14094:24;14084:8;14080:39;14074:46;14063:9;14055:66;14167:1;14156:9;14152:17;14139:30;;14250:4;14243:5;14239:16;14229:8;14225:31;14219:38;14208:9;14200:58;14304:1;14293:9;14289:17;14276:30;;13051:1281;12900:1432;;;12904:107;;14494:1;14487:4;14481:11;14477:19;14515:1;14510:123;;;;14652:1;14647:73;;;;14470:250;;14510:123;14563:4;14559:1;14548:9;14544:17;14536:32;14613:4;14609:1;14598:9;14594:17;14586:32;14510:123;;14647:73;14700:4;14696:1;14685:9;14681:17;14673:32;14470:250;;12609:2122;;14750:6;14743:13;;;;11667:3097;;;;:::o;29541:716::-;29597:13;29648:14;29685:1;29665:17;29676:5;29665:10;:17::i;:::-;:21;29648:38;;29701:20;29735:6;29724:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29701:41;;29757:11;29886:6;29882:2;29878:15;29870:6;29866:28;29859:35;;29923:288;29930:4;29923:288;;;29955:5;;;;;;;;30097:8;30092:2;30085:5;30081:14;30076:30;30071:3;30063:44;30153:2;30144:11;;;;;;:::i;:::-;;;;;30187:1;30178:5;:10;29923:288;30174:21;29923:288;30232:6;30225:13;;;;;29541:716;;;:::o;60937:264::-;61030:4;61047:13;61063:23;61078:7;61063:14;:23::i;:::-;61047:39;;61116:5;61105:16;;:7;:16;;;:52;;;;61125:32;61142:5;61149:7;61125:16;:32::i;:::-;61105:52;:87;;;;61185:7;61161:31;;:20;61173:7;61161:11;:20::i;:::-;:31;;;61105:87;61097:96;;;60937:264;;;;:::o;64936:1263::-;65095:4;65068:31;;:23;65083:7;65068:14;:23::i;:::-;:31;;;65060:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;65174:1;65160:16;;:2;:16;;;65152:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;65230:42;65251:4;65257:2;65261:7;65270:1;65230:20;:42::i;:::-;65402:4;65375:31;;:23;65390:7;65375:14;:23::i;:::-;:31;;;65367:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;65520:15;:24;65536:7;65520:24;;;;;;;;;;;;65513:31;;;;;;;;;;;66015:1;65996:9;:15;66006:4;65996:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;66048:1;66031:9;:13;66041:2;66031:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;66090:2;66071:7;:16;66079:7;66071:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;66129:7;66125:2;66110:27;;66119:4;66110:27;;;;;;;;;;;;66150:41;66170:4;66176:2;66180:7;66189:1;66150:19;:41::i;:::-;64936:1263;;;:::o;61543:110::-;61619:26;61629:2;61633:7;61619:26;;;;;;;;;;;;:9;:26::i;:::-;61543:110;;:::o;15765:127::-;15872:1;15854:7;:14;;;:19;;;;;;;;;;;15765:127;:::o;59785:313::-;59941:28;59951:4;59957:2;59961:7;59941:9;:28::i;:::-;59988:47;60011:4;60017:2;60021:7;60030:4;59988:22;:47::i;:::-;59980:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;59785:313;;;;:::o;72153:658::-;72224:19;;:::i;:::-;72254:11;72324:3;72303:8;72286:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;72276:44;;;;;;72268:53;;:59;;;;:::i;:::-;72254:73;;72336:13;72415:2;72410;72387:8;72370:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;72360:46;;;;;;72352:55;;:60;;;;:::i;:::-;:65;;;;:::i;:::-;72336:81;;72426:14;72508:3;72502;72478:8;72461:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;72451:47;;;;;;72443:56;;:62;;;;:::i;:::-;:68;;;;:::i;:::-;72426:85;;72520:15;72603:2;72598;72573:8;72556:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;72546:48;;;;;;72538:57;;:62;;;;:::i;:::-;:67;;;;:::i;:::-;72520:85;;72614:21;72704:2;72673:8;72656:43;;;;;;;;:::i;:::-;;;;;;;;;;;;;72646:54;;;;;;72638:63;;:68;;;;:::i;:::-;72614:92;;72749:56;;;;;;;;72762:3;72749:56;;;;72767:5;72749:56;;;;72774:6;72749:56;;;;72782:7;72749:56;;;;72791:13;72749:56;;;72742:63;;;;;;;72153:658;;;:::o;26407:922::-;26460:7;26480:14;26497:1;26480:18;;26547:6;26538:5;:15;26534:102;;26583:6;26574:15;;;;;;:::i;:::-;;;;;26618:2;26608:12;;;;26534:102;26663:6;26654:5;:15;26650:102;;26699:6;26690:15;;;;;;:::i;:::-;;;;;26734:2;26724:12;;;;26650:102;26779:6;26770:5;:15;26766:102;;26815:6;26806:15;;;;;;:::i;:::-;;;;;26850:2;26840:12;;;;26766:102;26895:5;26886;:14;26882:99;;26930:5;26921:14;;;;;;:::i;:::-;;;;;26964:1;26954:11;;;;26882:99;27008:5;26999;:14;26995:99;;27043:5;27034:14;;;;;;:::i;:::-;;;;;27077:1;27067:11;;;;26995:99;27121:5;27112;:14;27108:99;;27156:5;27147:14;;;;;;:::i;:::-;;;;;27190:1;27180:11;;;;27108:99;27234:5;27225;:14;27221:66;;27270:1;27260:11;;;;27221:66;27315:6;27308:13;;;26407:922;;;:::o;69323:159::-;;;;;:::o;70204:158::-;;;;;:::o;61880:319::-;62009:18;62015:2;62019:7;62009:5;:18::i;:::-;62060:53;62091:1;62095:2;62099:7;62108:4;62060:22;:53::i;:::-;62038:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;61880:319;;;:::o;67738:853::-;67892:4;67913:15;:2;:13;;;:15::i;:::-;67909:675;;;67965:2;67949:36;;;67986:12;:10;:12::i;:::-;68000:4;68006:7;68015:4;67949:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;67945:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68207:1;68190:6;:13;:18;68186:328;;68233:60;;;;;;;;;;:::i;:::-;;;;;;;;68186:328;68464:6;68458:13;68449:6;68445:2;68441:15;68434:38;67945:584;68081:41;;;68071:51;;;:6;:51;;;;68064:58;;;;;67909:675;68568:4;68561:11;;67738:853;;;;;;;:::o;62535:942::-;62629:1;62615:16;;:2;:16;;;62607:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;62688:16;62696:7;62688;:16::i;:::-;62687:17;62679:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;62750:48;62779:1;62783:2;62787:7;62796:1;62750:20;:48::i;:::-;62897:16;62905:7;62897;:16::i;:::-;62896:17;62888:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;63312:1;63295:9;:13;63305:2;63295:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;63356:2;63337:7;:16;63345:7;63337:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;63401:7;63397:2;63376:33;;63393:1;63376:33;;;;;;;;;;;;63422:47;63450:1;63454:2;63458:7;63467:1;63422:19;:47::i;:::-;62535:942;;:::o;36261:326::-;36321:4;36578:1;36556:7;:19;;;:23;36549:30;;36261:326;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:60::-;5895:3;5916:5;5909:12;;5867:60;;;:::o;5933:142::-;5983:9;6016:53;6034:34;6043:24;6061:5;6043:24;:::i;:::-;6034:34;:::i;:::-;6016:53;:::i;:::-;6003:66;;5933:142;;;:::o;6081:126::-;6131:9;6164:37;6195:5;6164:37;:::i;:::-;6151:50;;6081:126;;;:::o;6213:157::-;6294:9;6327:37;6358:5;6327:37;:::i;:::-;6314:50;;6213:157;;;:::o;6376:193::-;6494:68;6556:5;6494:68;:::i;:::-;6489:3;6482:81;6376:193;;:::o;6575:284::-;6699:4;6737:2;6726:9;6722:18;6714:26;;6750:102;6849:1;6838:9;6834:17;6825:6;6750:102;:::i;:::-;6575:284;;;;:::o;6865:329::-;6924:6;6973:2;6961:9;6952:7;6948:23;6944:32;6941:119;;;6979:79;;:::i;:::-;6941:119;7099:1;7124:53;7169:7;7160:6;7149:9;7145:22;7124:53;:::i;:::-;7114:63;;7070:117;6865:329;;;;:::o;7200:116::-;7270:21;7285:5;7270:21;:::i;:::-;7263:5;7260:32;7250:60;;7306:1;7303;7296:12;7250:60;7200:116;:::o;7322:133::-;7365:5;7403:6;7390:20;7381:29;;7419:30;7443:5;7419:30;:::i;:::-;7322:133;;;;:::o;7461:468::-;7526:6;7534;7583:2;7571:9;7562:7;7558:23;7554:32;7551:119;;;7589:79;;:::i;:::-;7551:119;7709:1;7734:53;7779:7;7770:6;7759:9;7755:22;7734:53;:::i;:::-;7724:63;;7680:117;7836:2;7862:50;7904:7;7895:6;7884:9;7880:22;7862:50;:::i;:::-;7852:60;;7807:115;7461:468;;;;;:::o;7935:117::-;8044:1;8041;8034:12;8058:117;8167:1;8164;8157:12;8181:180;8229:77;8226:1;8219:88;8326:4;8323:1;8316:15;8350:4;8347:1;8340:15;8367:281;8450:27;8472:4;8450:27;:::i;:::-;8442:6;8438:40;8580:6;8568:10;8565:22;8544:18;8532:10;8529:34;8526:62;8523:88;;;8591:18;;:::i;:::-;8523:88;8631:10;8627:2;8620:22;8410:238;8367:281;;:::o;8654:129::-;8688:6;8715:20;;:::i;:::-;8705:30;;8744:33;8772:4;8764:6;8744:33;:::i;:::-;8654:129;;;:::o;8789:307::-;8850:4;8940:18;8932:6;8929:30;8926:56;;;8962:18;;:::i;:::-;8926:56;9000:29;9022:6;9000:29;:::i;:::-;8992:37;;9084:4;9078;9074:15;9066:23;;8789:307;;;:::o;9102:146::-;9199:6;9194:3;9189;9176:30;9240:1;9231:6;9226:3;9222:16;9215:27;9102:146;;;:::o;9254:423::-;9331:5;9356:65;9372:48;9413:6;9372:48;:::i;:::-;9356:65;:::i;:::-;9347:74;;9444:6;9437:5;9430:21;9482:4;9475:5;9471:16;9520:3;9511:6;9506:3;9502:16;9499:25;9496:112;;;9527:79;;:::i;:::-;9496:112;9617:54;9664:6;9659:3;9654;9617:54;:::i;:::-;9337:340;9254:423;;;;;:::o;9696:338::-;9751:5;9800:3;9793:4;9785:6;9781:17;9777:27;9767:122;;9808:79;;:::i;:::-;9767:122;9925:6;9912:20;9950:78;10024:3;10016:6;10009:4;10001:6;9997:17;9950:78;:::i;:::-;9941:87;;9757:277;9696:338;;;;:::o;10040:943::-;10135:6;10143;10151;10159;10208:3;10196:9;10187:7;10183:23;10179:33;10176:120;;;10215:79;;:::i;:::-;10176:120;10335:1;10360:53;10405:7;10396:6;10385:9;10381:22;10360:53;:::i;:::-;10350:63;;10306:117;10462:2;10488:53;10533:7;10524:6;10513:9;10509:22;10488:53;:::i;:::-;10478:63;;10433:118;10590:2;10616:53;10661:7;10652:6;10641:9;10637:22;10616:53;:::i;:::-;10606:63;;10561:118;10746:2;10735:9;10731:18;10718:32;10777:18;10769:6;10766:30;10763:117;;;10799:79;;:::i;:::-;10763:117;10904:62;10958:7;10949:6;10938:9;10934:22;10904:62;:::i;:::-;10894:72;;10689:287;10040:943;;;;;;;:::o;10989:474::-;11057:6;11065;11114:2;11102:9;11093:7;11089:23;11085:32;11082:119;;;11120:79;;:::i;:::-;11082:119;11240:1;11265:53;11310:7;11301:6;11290:9;11286:22;11265:53;:::i;:::-;11255:63;;11211:117;11367:2;11393:53;11438:7;11429:6;11418:9;11414:22;11393:53;:::i;:::-;11383:63;;11338:118;10989:474;;;;;:::o;11469:180::-;11517:77;11514:1;11507:88;11614:4;11611:1;11604:15;11638:4;11635:1;11628:15;11655:320;11699:6;11736:1;11730:4;11726:12;11716:22;;11783:1;11777:4;11773:12;11804:18;11794:81;;11860:4;11852:6;11848:17;11838:27;;11794:81;11922:2;11914:6;11911:14;11891:18;11888:38;11885:84;;11941:18;;:::i;:::-;11885:84;11706:269;11655:320;;;:::o;11981:220::-;12121:34;12117:1;12109:6;12105:14;12098:58;12190:3;12185:2;12177:6;12173:15;12166:28;11981:220;:::o;12207:366::-;12349:3;12370:67;12434:2;12429:3;12370:67;:::i;:::-;12363:74;;12446:93;12535:3;12446:93;:::i;:::-;12564:2;12559:3;12555:12;12548:19;;12207:366;;;:::o;12579:419::-;12745:4;12783:2;12772:9;12768:18;12760:26;;12832:9;12826:4;12822:20;12818:1;12807:9;12803:17;12796:47;12860:131;12986:4;12860:131;:::i;:::-;12852:139;;12579:419;;;:::o;13004:248::-;13144:34;13140:1;13132:6;13128:14;13121:58;13213:31;13208:2;13200:6;13196:15;13189:56;13004:248;:::o;13258:366::-;13400:3;13421:67;13485:2;13480:3;13421:67;:::i;:::-;13414:74;;13497:93;13586:3;13497:93;:::i;:::-;13615:2;13610:3;13606:12;13599:19;;13258:366;;;:::o;13630:419::-;13796:4;13834:2;13823:9;13819:18;13811:26;;13883:9;13877:4;13873:20;13869:1;13858:9;13854:17;13847:47;13911:131;14037:4;13911:131;:::i;:::-;13903:139;;13630:419;;;:::o;14055:174::-;14195:26;14191:1;14183:6;14179:14;14172:50;14055:174;:::o;14235:366::-;14377:3;14398:67;14462:2;14457:3;14398:67;:::i;:::-;14391:74;;14474:93;14563:3;14474:93;:::i;:::-;14592:2;14587:3;14583:12;14576:19;;14235:366;;;:::o;14607:419::-;14773:4;14811:2;14800:9;14796:18;14788:26;;14860:9;14854:4;14850:20;14846:1;14835:9;14831:17;14824:47;14888:131;15014:4;14888:131;:::i;:::-;14880:139;;14607:419;;;:::o;15032:228::-;15172:34;15168:1;15160:6;15156:14;15149:58;15241:11;15236:2;15228:6;15224:15;15217:36;15032:228;:::o;15266:366::-;15408:3;15429:67;15493:2;15488:3;15429:67;:::i;:::-;15422:74;;15505:93;15594:3;15505:93;:::i;:::-;15623:2;15618:3;15614:12;15607:19;;15266:366;;;:::o;15638:419::-;15804:4;15842:2;15831:9;15827:18;15819:26;;15891:9;15885:4;15881:20;15877:1;15866:9;15862:17;15855:47;15919:131;16045:4;15919:131;:::i;:::-;15911:139;;15638:419;;;:::o;16063:170::-;16203:22;16199:1;16191:6;16187:14;16180:46;16063:170;:::o;16239:366::-;16381:3;16402:67;16466:2;16461:3;16402:67;:::i;:::-;16395:74;;16478:93;16567:3;16478:93;:::i;:::-;16596:2;16591:3;16587:12;16580:19;;16239:366;;;:::o;16611:419::-;16777:4;16815:2;16804:9;16800:18;16792:26;;16864:9;16858:4;16854:20;16850:1;16839:9;16835:17;16828:47;16892:131;17018:4;16892:131;:::i;:::-;16884:139;;16611:419;;;:::o;17036:148::-;17138:11;17175:3;17160:18;;17036:148;;;;:::o;17190:158::-;17330:10;17326:1;17318:6;17314:14;17307:34;17190:158;:::o;17354:400::-;17514:3;17535:84;17617:1;17612:3;17535:84;:::i;:::-;17528:91;;17628:93;17717:3;17628:93;:::i;:::-;17746:1;17741:3;17737:11;17730:18;;17354:400;;;:::o;17760:390::-;17866:3;17894:39;17927:5;17894:39;:::i;:::-;17949:89;18031:6;18026:3;17949:89;:::i;:::-;17942:96;;18047:65;18105:6;18100:3;18093:4;18086:5;18082:16;18047:65;:::i;:::-;18137:6;18132:3;18128:16;18121:23;;17870:280;17760:390;;;;:::o;18156:541::-;18389:3;18411:148;18555:3;18411:148;:::i;:::-;18404:155;;18576:95;18667:3;18658:6;18576:95;:::i;:::-;18569:102;;18688:3;18681:10;;18156:541;;;;:::o;18703:176::-;18843:28;18839:1;18831:6;18827:14;18820:52;18703:176;:::o;18885:402::-;19045:3;19066:85;19148:2;19143:3;19066:85;:::i;:::-;19059:92;;19160:93;19249:3;19160:93;:::i;:::-;19278:2;19273:3;19269:12;19262:19;;18885:402;;;:::o;19293:541::-;19526:3;19548:148;19692:3;19548:148;:::i;:::-;19541:155;;19713:95;19804:3;19795:6;19713:95;:::i;:::-;19706:102;;19825:3;19818:10;;19293:541;;;;:::o;19840:155::-;19980:3;19976:1;19968:6;19964:14;19957:27;19840:155;:::o;20005:416::-;20165:3;20190:84;20272:1;20267:3;20190:84;:::i;:::-;20183:91;;20287:93;20376:3;20287:93;:::i;:::-;20409:1;20404:3;20400:11;20393:18;;20005:416;;;:::o;20431:222::-;20575:66;20571:1;20563:6;20559:14;20552:90;20431:222;:::o;20663:416::-;20823:3;20848:84;20930:1;20925:3;20848:84;:::i;:::-;20841:91;;20945:93;21034:3;20945:93;:::i;:::-;21067:1;21062:3;21058:11;21051:18;;20663:416;;;:::o;21089:222::-;21233:66;21229:1;21221:6;21217:14;21210:90;21089:222;:::o;21321:416::-;21481:3;21506:84;21588:1;21583:3;21506:84;:::i;:::-;21499:91;;21603:93;21692:3;21603:93;:::i;:::-;21725:1;21720:3;21716:11;21709:18;;21321:416;;;:::o;21747:222::-;21891:66;21887:1;21879:6;21875:14;21868:90;21747:222;:::o;21979:418::-;22139:3;22164:85;22246:2;22241:3;22164:85;:::i;:::-;22157:92;;22262:93;22351:3;22262:93;:::i;:::-;22384:2;22379:3;22375:12;22368:19;;21979:418;;;:::o;22407:222::-;22551:66;22547:1;22539:6;22535:14;22528:90;22407:222;:::o;22639:418::-;22799:3;22824:85;22906:2;22901:3;22824:85;:::i;:::-;22817:92;;22922:93;23011:3;22922:93;:::i;:::-;23044:2;23039:3;23035:12;23028:19;;22639:418;;;:::o;23067:222::-;23211:66;23207:1;23199:6;23195:14;23188:90;23067:222;:::o;23299:418::-;23459:3;23484:85;23566:2;23561:3;23484:85;:::i;:::-;23477:92;;23582:93;23671:3;23582:93;:::i;:::-;23704:2;23699:3;23695:12;23688:19;;23299:418;;;:::o;23727:222::-;23871:66;23867:1;23859:6;23855:14;23848:90;23727:222;:::o;23959:418::-;24119:3;24144:85;24226:2;24221:3;24144:85;:::i;:::-;24137:92;;24242:93;24331:3;24242:93;:::i;:::-;24364:2;24359:3;24355:12;24348:19;;23959:418;;;:::o;24387:159::-;24531:3;24527:1;24519:6;24515:14;24508:27;24387:159;:::o;24556:416::-;24716:3;24741:84;24823:1;24818:3;24741:84;:::i;:::-;24734:91;;24838:93;24927:3;24838:93;:::i;:::-;24960:1;24955:3;24951:11;24944:18;;24556:416;;;:::o;24982:151::-;25122:3;25118:1;25110:6;25106:14;25099:27;24982:151;:::o;25139:400::-;25299:3;25320:84;25402:1;25397:3;25320:84;:::i;:::-;25313:91;;25413:93;25502:3;25413:93;:::i;:::-;25531:1;25526:3;25522:11;25515:18;;25139:400;;;:::o;25545:4107::-;27081:3;27103:148;27247:3;27103:148;:::i;:::-;27096:155;;27268:148;27412:3;27268:148;:::i;:::-;27261:155;;27433:95;27524:3;27515:6;27433:95;:::i;:::-;27426:102;;27545:148;27689:3;27545:148;:::i;:::-;27538:155;;27710:148;27854:3;27710:148;:::i;:::-;27703:155;;27875:95;27966:3;27957:6;27875:95;:::i;:::-;27868:102;;27987:148;28131:3;27987:148;:::i;:::-;27980:155;;28152:148;28296:3;28152:148;:::i;:::-;28145:155;;28317:95;28408:3;28399:6;28317:95;:::i;:::-;28310:102;;28429:148;28573:3;28429:148;:::i;:::-;28422:155;;28594:148;28738:3;28594:148;:::i;:::-;28587:155;;28759:95;28850:3;28841:6;28759:95;:::i;:::-;28752:102;;28871:148;29015:3;28871:148;:::i;:::-;28864:155;;29036:148;29180:3;29036:148;:::i;:::-;29029:155;;29201:95;29292:3;29283:6;29201:95;:::i;:::-;29194:102;;29313:148;29457:3;29313:148;:::i;:::-;29306:155;;29478:148;29622:3;29478:148;:::i;:::-;29471:155;;29643:3;29636:10;;25545:4107;;;;;;;;:::o;29658:179::-;29798:31;29794:1;29786:6;29782:14;29775:55;29658:179;:::o;29843:402::-;30003:3;30024:85;30106:2;30101:3;30024:85;:::i;:::-;30017:92;;30118:93;30207:3;30118:93;:::i;:::-;30236:2;30231:3;30227:12;30220:19;;29843:402;;;:::o;30251:541::-;30484:3;30506:148;30650:3;30506:148;:::i;:::-;30499:155;;30671:95;30762:3;30753:6;30671:95;:::i;:::-;30664:102;;30783:3;30776:10;;30251:541;;;;:::o;30798:225::-;30938:34;30934:1;30926:6;30922:14;30915:58;31007:8;31002:2;30994:6;30990:15;30983:33;30798:225;:::o;31029:366::-;31171:3;31192:67;31256:2;31251:3;31192:67;:::i;:::-;31185:74;;31268:93;31357:3;31268:93;:::i;:::-;31386:2;31381:3;31377:12;31370:19;;31029:366;;;:::o;31401:419::-;31567:4;31605:2;31594:9;31590:18;31582:26;;31654:9;31648:4;31644:20;31640:1;31629:9;31625:17;31618:47;31682:131;31808:4;31682:131;:::i;:::-;31674:139;;31401:419;;;:::o;31826:332::-;31947:4;31985:2;31974:9;31970:18;31962:26;;31998:71;32066:1;32055:9;32051:17;32042:6;31998:71;:::i;:::-;32079:72;32147:2;32136:9;32132:18;32123:6;32079:72;:::i;:::-;31826:332;;;;;:::o;32164:137::-;32218:5;32249:6;32243:13;32234:22;;32265:30;32289:5;32265:30;:::i;:::-;32164:137;;;;:::o;32307:345::-;32374:6;32423:2;32411:9;32402:7;32398:23;32394:32;32391:119;;;32429:79;;:::i;:::-;32391:119;32549:1;32574:61;32627:7;32618:6;32607:9;32603:22;32574:61;:::i;:::-;32564:71;;32520:125;32307:345;;;;:::o;32658:232::-;32798:34;32794:1;32786:6;32782:14;32775:58;32867:15;32862:2;32854:6;32850:15;32843:40;32658:232;:::o;32896:366::-;33038:3;33059:67;33123:2;33118:3;33059:67;:::i;:::-;33052:74;;33135:93;33224:3;33135:93;:::i;:::-;33253:2;33248:3;33244:12;33237:19;;32896:366;;;:::o;33268:419::-;33434:4;33472:2;33461:9;33457:18;33449:26;;33521:9;33515:4;33511:20;33507:1;33496:9;33492:17;33485:47;33549:131;33675:4;33549:131;:::i;:::-;33541:139;;33268:419;;;:::o;33693:182::-;33833:34;33829:1;33821:6;33817:14;33810:58;33693:182;:::o;33881:366::-;34023:3;34044:67;34108:2;34103:3;34044:67;:::i;:::-;34037:74;;34120:93;34209:3;34120:93;:::i;:::-;34238:2;34233:3;34229:12;34222:19;;33881:366;;;:::o;34253:419::-;34419:4;34457:2;34446:9;34442:18;34434:26;;34506:9;34500:4;34496:20;34492:1;34481:9;34477:17;34470:47;34534:131;34660:4;34534:131;:::i;:::-;34526:139;;34253:419;;;:::o;34678:177::-;34818:29;34814:1;34806:6;34802:14;34795:53;34678:177;:::o;34861:366::-;35003:3;35024:67;35088:2;35083:3;35024:67;:::i;:::-;35017:74;;35100:93;35189:3;35100:93;:::i;:::-;35218:2;35213:3;35209:12;35202:19;;34861:366;;;:::o;35233:419::-;35399:4;35437:2;35426:9;35422:18;35414:26;;35486:9;35480:4;35476:20;35472:1;35461:9;35457:17;35450:47;35514:131;35640:4;35514:131;:::i;:::-;35506:139;;35233:419;;;:::o;35658:180::-;35706:77;35703:1;35696:88;35803:4;35800:1;35793:15;35827:4;35824:1;35817:15;35844:191;35884:3;35903:20;35921:1;35903:20;:::i;:::-;35898:25;;35937:20;35955:1;35937:20;:::i;:::-;35932:25;;35980:1;35977;35973:9;35966:16;;36001:3;35998:1;35995:10;35992:36;;;36008:18;;:::i;:::-;35992:36;35844:191;;;;:::o;36041:234::-;36181:34;36177:1;36169:6;36165:14;36158:58;36250:17;36245:2;36237:6;36233:15;36226:42;36041:234;:::o;36281:366::-;36423:3;36444:67;36508:2;36503:3;36444:67;:::i;:::-;36437:74;;36520:93;36609:3;36520:93;:::i;:::-;36638:2;36633:3;36629:12;36622:19;;36281:366;;;:::o;36653:419::-;36819:4;36857:2;36846:9;36842:18;36834:26;;36906:9;36900:4;36896:20;36892:1;36881:9;36877:17;36870:47;36934:131;37060:4;36934:131;:::i;:::-;36926:139;;36653:419;;;:::o;37078:233::-;37117:3;37140:24;37158:5;37140:24;:::i;:::-;37131:33;;37186:66;37179:5;37176:77;37173:103;;37256:18;;:::i;:::-;37173:103;37303:1;37296:5;37292:13;37285:20;;37078:233;;;:::o;37317:175::-;37457:27;37453:1;37445:6;37441:14;37434:51;37317:175;:::o;37498:366::-;37640:3;37661:67;37725:2;37720:3;37661:67;:::i;:::-;37654:74;;37737:93;37826:3;37737:93;:::i;:::-;37855:2;37850:3;37846:12;37839:19;;37498:366;;;:::o;37870:419::-;38036:4;38074:2;38063:9;38059:18;38051:26;;38123:9;38117:4;38113:20;38109:1;38098:9;38094:17;38087:47;38151:131;38277:4;38151:131;:::i;:::-;38143:139;;37870:419;;;:::o;38295:180::-;38343:77;38340:1;38333:88;38440:4;38437:1;38430:15;38464:4;38461:1;38454:15;38481:185;38521:1;38538:20;38556:1;38538:20;:::i;:::-;38533:25;;38572:20;38590:1;38572:20;:::i;:::-;38567:25;;38611:1;38601:35;;38616:18;;:::i;:::-;38601:35;38658:1;38655;38651:9;38646:14;;38481:185;;;;:::o;38672:194::-;38712:4;38732:20;38750:1;38732:20;:::i;:::-;38727:25;;38766:20;38784:1;38766:20;:::i;:::-;38761:25;;38810:1;38807;38803:9;38795:17;;38834:1;38828:4;38825:11;38822:37;;;38839:18;;:::i;:::-;38822:37;38672:194;;;;:::o;38872:159::-;39012:7;39008:1;39000:6;38996:14;38989:31;38872:159;:::o;39041:416::-;39201:3;39226:84;39308:1;39303:3;39226:84;:::i;:::-;39219:91;;39323:93;39412:3;39323:93;:::i;:::-;39445:1;39440:3;39436:11;39429:18;;39041:416;;;:::o;39467:171::-;39611:15;39607:1;39599:6;39595:14;39588:39;39467:171;:::o;39648:418::-;39808:3;39833:85;39915:2;39910:3;39833:85;:::i;:::-;39826:92;;39931:93;40020:3;39931:93;:::i;:::-;40053:2;40048:3;40044:12;40037:19;;39648:418;;;:::o;40076:152::-;40216:4;40212:1;40204:6;40200:14;40193:28;40076:152;:::o;40234:400::-;40394:3;40415:84;40497:1;40492:3;40415:84;:::i;:::-;40408:91;;40508:93;40597:3;40508:93;:::i;:::-;40626:1;40621:3;40617:11;40610:18;;40234:400;;;:::o;40640:1233::-;41123:3;41145:148;41289:3;41145:148;:::i;:::-;41138:155;;41310:95;41401:3;41392:6;41310:95;:::i;:::-;41303:102;;41422:148;41566:3;41422:148;:::i;:::-;41415:155;;41587:95;41678:3;41669:6;41587:95;:::i;:::-;41580:102;;41699:148;41843:3;41699:148;:::i;:::-;41692:155;;41864:3;41857:10;;40640:1233;;;;;:::o;41879:315::-;42019:66;42015:1;42007:6;42003:14;41996:90;42120:66;42115:2;42107:6;42103:15;42096:91;41879:315;:::o;42200:402::-;42360:3;42381:85;42463:2;42458:3;42381:85;:::i;:::-;42374:92;;42475:93;42564:3;42475:93;:::i;:::-;42593:2;42588:3;42584:12;42577:19;;42200:402;;;:::o;42608:315::-;42748:66;42744:1;42736:6;42732:14;42725:90;42849:66;42844:2;42836:6;42832:15;42825:91;42608:315;:::o;42929:402::-;43089:3;43110:85;43192:2;43187:3;43110:85;:::i;:::-;43103:92;;43204:93;43293:3;43204:93;:::i;:::-;43322:2;43317:3;43313:12;43306:19;;42929:402;;;:::o;43337:214::-;43477:66;43473:1;43465:6;43461:14;43454:90;43337:214;:::o;43557:400::-;43717:3;43738:84;43820:1;43815:3;43738:84;:::i;:::-;43731:91;;43831:93;43920:3;43831:93;:::i;:::-;43949:1;43944:3;43940:11;43933:18;;43557:400;;;:::o;43963:214::-;44103:66;44099:1;44091:6;44087:14;44080:90;43963:214;:::o;44183:400::-;44343:3;44364:84;44446:1;44441:3;44364:84;:::i;:::-;44357:91;;44457:93;44546:3;44457:93;:::i;:::-;44575:1;44570:3;44566:11;44559:18;;44183:400;;;:::o;44589:214::-;44729:66;44725:1;44717:6;44713:14;44706:90;44589:214;:::o;44809:400::-;44969:3;44990:84;45072:1;45067:3;44990:84;:::i;:::-;44983:91;;45083:93;45172:3;45083:93;:::i;:::-;45201:1;45196:3;45192:11;45185:18;;44809:400;;;:::o;45215:214::-;45355:66;45351:1;45343:6;45339:14;45332:90;45215:214;:::o;45435:402::-;45595:3;45616:85;45698:2;45693:3;45616:85;:::i;:::-;45609:92;;45710:93;45799:3;45710:93;:::i;:::-;45828:2;45823:3;45819:12;45812:19;;45435:402;;;:::o;45843:214::-;45983:66;45979:1;45971:6;45967:14;45960:90;45843:214;:::o;46063:400::-;46223:3;46244:84;46326:1;46321:3;46244:84;:::i;:::-;46237:91;;46337:93;46426:3;46337:93;:::i;:::-;46455:1;46450:3;46446:11;46439:18;;46063:400;;;:::o;46469:214::-;46609:66;46605:1;46597:6;46593:14;46586:90;46469:214;:::o;46689:402::-;46849:3;46870:85;46952:2;46947:3;46870:85;:::i;:::-;46863:92;;46964:93;47053:3;46964:93;:::i;:::-;47082:2;47077:3;47073:12;47066:19;;46689:402;;;:::o;47097:315::-;47237:66;47233:1;47225:6;47221:14;47214:90;47338:66;47333:2;47325:6;47321:15;47314:91;47097:315;:::o;47418:402::-;47578:3;47599:85;47681:2;47676:3;47599:85;:::i;:::-;47592:92;;47693:93;47782:3;47693:93;:::i;:::-;47811:2;47806:3;47802:12;47795:19;;47418:402;;;:::o;47826:416::-;47966:66;47962:1;47954:6;47950:14;47943:90;48067:66;48062:2;48054:6;48050:15;48043:91;48168:66;48163:2;48155:6;48151:15;48144:91;47826:416;:::o;48248:402::-;48408:3;48429:85;48511:2;48506:3;48429:85;:::i;:::-;48422:92;;48523:93;48612:3;48523:93;:::i;:::-;48641:2;48636:3;48632:12;48625:19;;48248:402;;;:::o;48656:157::-;48796:9;48792:1;48784:6;48780:14;48773:33;48656:157;:::o;48819:400::-;48979:3;49000:84;49082:1;49077:3;49000:84;:::i;:::-;48993:91;;49093:93;49182:3;49093:93;:::i;:::-;49211:1;49206:3;49202:11;49195:18;;48819:400;;;:::o;49225:214::-;49365:66;49361:1;49353:6;49349:14;49342:90;49225:214;:::o;49445:402::-;49605:3;49626:85;49708:2;49703:3;49626:85;:::i;:::-;49619:92;;49720:93;49809:3;49720:93;:::i;:::-;49838:2;49833:3;49829:12;49822:19;;49445:402;;;:::o;49853:214::-;49993:66;49989:1;49981:6;49977:14;49970:90;49853:214;:::o;50073:400::-;50233:3;50254:84;50336:1;50331:3;50254:84;:::i;:::-;50247:91;;50347:93;50436:3;50347:93;:::i;:::-;50465:1;50460:3;50456:11;50449:18;;50073:400;;;:::o;50479:214::-;50619:66;50615:1;50607:6;50603:14;50596:90;50479:214;:::o;50699:402::-;50859:3;50880:85;50962:2;50957:3;50880:85;:::i;:::-;50873:92;;50974:93;51063:3;50974:93;:::i;:::-;51092:2;51087:3;51083:12;51076:19;;50699:402;;;:::o;51107:214::-;51247:66;51243:1;51235:6;51231:14;51224:90;51107:214;:::o;51327:400::-;51487:3;51508:84;51590:1;51585:3;51508:84;:::i;:::-;51501:91;;51601:93;51690:3;51601:93;:::i;:::-;51719:1;51714:3;51710:11;51703:18;;51327:400;;;:::o;51733:517::-;51873:66;51869:1;51861:6;51857:14;51850:90;51974:66;51969:2;51961:6;51957:15;51950:91;52075:66;52070:2;52062:6;52058:15;52051:91;52176:66;52171:2;52163:6;52159:15;52152:91;51733:517;:::o;52256:404::-;52416:3;52437:86;52519:3;52514;52437:86;:::i;:::-;52430:93;;52532;52621:3;52532:93;:::i;:::-;52650:3;52645;52641:13;52634:20;;52256:404;;;:::o;52666:159::-;52806:11;52802:1;52794:6;52790:14;52783:35;52666:159;:::o;52831:400::-;52991:3;53012:84;53094:1;53089:3;53012:84;:::i;:::-;53005:91;;53105:93;53194:3;53105:93;:::i;:::-;53223:1;53218:3;53214:11;53207:18;;52831:400;;;:::o;53237:156::-;53377:8;53373:1;53365:6;53361:14;53354:32;53237:156;:::o;53399:400::-;53559:3;53580:84;53662:1;53657:3;53580:84;:::i;:::-;53573:91;;53673:93;53762:3;53673:93;:::i;:::-;53791:1;53786:3;53782:11;53775:18;;53399:400;;;:::o;53805:6343::-;56139:3;56161:148;56305:3;56161:148;:::i;:::-;56154:155;;56326:148;56470:3;56326:148;:::i;:::-;56319:155;;56491:148;56635:3;56491:148;:::i;:::-;56484:155;;56656:95;56747:3;56738:6;56656:95;:::i;:::-;56649:102;;56768:148;56912:3;56768:148;:::i;:::-;56761:155;;56933:95;57024:3;57015:6;56933:95;:::i;:::-;56926:102;;57045:148;57189:3;57045:148;:::i;:::-;57038:155;;57210:95;57301:3;57292:6;57210:95;:::i;:::-;57203:102;;57322:148;57466:3;57322:148;:::i;:::-;57315:155;;57487:95;57578:3;57569:6;57487:95;:::i;:::-;57480:102;;57599:148;57743:3;57599:148;:::i;:::-;57592:155;;57764:95;57855:3;57846:6;57764:95;:::i;:::-;57757:102;;57876:148;58020:3;57876:148;:::i;:::-;57869:155;;58041:148;58185:3;58041:148;:::i;:::-;58034:155;;58206:95;58297:3;58288:6;58206:95;:::i;:::-;58199:102;;58318:148;58462:3;58318:148;:::i;:::-;58311:155;;58483:148;58627:3;58483:148;:::i;:::-;58476:155;;58648:148;58792:3;58648:148;:::i;:::-;58641:155;;58813:95;58904:3;58895:6;58813:95;:::i;:::-;58806:102;;58925:148;59069:3;58925:148;:::i;:::-;58918:155;;59090:95;59181:3;59172:6;59090:95;:::i;:::-;59083:102;;59202:148;59346:3;59202:148;:::i;:::-;59195:155;;59367:95;59458:3;59449:6;59367:95;:::i;:::-;59360:102;;59479:148;59623:3;59479:148;:::i;:::-;59472:155;;59644:148;59788:3;59644:148;:::i;:::-;59637:155;;59809:148;59953:3;59809:148;:::i;:::-;59802:155;;59974:148;60118:3;59974:148;:::i;:::-;59967:155;;60139:3;60132:10;;53805:6343;;;;;;;;;;;;:::o;60154:214::-;60294:66;60290:1;60282:6;60278:14;60271:90;60154:214;:::o;60374:402::-;60534:3;60555:85;60637:2;60632:3;60555:85;:::i;:::-;60548:92;;60649:93;60738:3;60649:93;:::i;:::-;60767:2;60762:3;60758:12;60751:19;;60374:402;;;:::o;60782:144::-;60918:4;60914:1;60906:6;60902:14;60895:28;60782:144;:::o;60928:384::-;61088:3;61105:84;61187:1;61182:3;61105:84;:::i;:::-;61098:91;;61194:93;61283:3;61194:93;:::i;:::-;61308:1;61303:3;61299:11;61292:18;;60928:384;;;:::o;61314:240::-;61450:66;61446:1;61438:6;61434:14;61427:90;61547:3;61542:2;61534:6;61530:15;61523:28;61314:240;:::o;61556:386::-;61716:3;61733:85;61815:2;61810:3;61733:85;:::i;:::-;61726:92;;61823:93;61912:3;61823:93;:::i;:::-;61937:2;61932:3;61928:12;61921:19;;61556:386;;;:::o;61944:241::-;62080:66;62076:1;62068:6;62064:14;62057:90;62177:4;62172:2;62164:6;62160:15;62153:29;61944:241;:::o;62187:386::-;62347:3;62364:85;62446:2;62441:3;62364:85;:::i;:::-;62357:92;;62454:93;62543:3;62454:93;:::i;:::-;62568:2;62563:3;62559:12;62552:19;;62187:386;;;:::o;62575:303::-;62711:66;62707:1;62699:6;62695:14;62688:90;62808:66;62803:2;62795:6;62791:15;62784:91;62575:303;:::o;62880:386::-;63040:3;63057:85;63139:2;63134:3;63057:85;:::i;:::-;63050:92;;63147:93;63236:3;63147:93;:::i;:::-;63261:2;63256:3;63252:12;63245:19;;62880:386;;;:::o;63268:303::-;63404:66;63400:1;63392:6;63388:14;63381:90;63501:66;63496:2;63488:6;63484:15;63477:91;63268:303;:::o;63573:386::-;63733:3;63750:85;63832:2;63827:3;63750:85;:::i;:::-;63743:92;;63840:93;63929:3;63840:93;:::i;:::-;63954:2;63949:3;63945:12;63938:19;;63573:386;;;:::o;63961:3507::-;65295:3;65313:148;65457:3;65313:148;:::i;:::-;65306:155;;65474:95;65565:3;65556:6;65474:95;:::i;:::-;65467:102;;65582:148;65726:3;65582:148;:::i;:::-;65575:155;;65743:148;65887:3;65743:148;:::i;:::-;65736:155;;65904:95;65995:3;65986:6;65904:95;:::i;:::-;65897:102;;66012:148;66156:3;66012:148;:::i;:::-;66005:155;;66173:148;66317:3;66173:148;:::i;:::-;66166:155;;66334:95;66425:3;66416:6;66334:95;:::i;:::-;66327:102;;66442:148;66586:3;66442:148;:::i;:::-;66435:155;;66603:148;66747:3;66603:148;:::i;:::-;66596:155;;66764:95;66855:3;66846:6;66764:95;:::i;:::-;66757:102;;66872:148;67016:3;66872:148;:::i;:::-;66865:155;;67033:148;67177:3;67033:148;:::i;:::-;67026:155;;67194:95;67285:3;67276:6;67194:95;:::i;:::-;67187:102;;67302:148;67446:3;67302:148;:::i;:::-;67295:155;;67463:3;67456:10;;63961:3507;;;;;;;;:::o;67470:362::-;67510:7;67529:20;67547:1;67529:20;:::i;:::-;67524:25;;67559:20;67577:1;67559:20;:::i;:::-;67554:25;;67610:1;67607;67603:9;67628:30;67646:11;67628:30;:::i;:::-;67617:41;;67787:1;67778:7;67774:15;67771:1;67768:22;67752:1;67745:9;67729:71;67710:119;;67809:18;;:::i;:::-;67710:119;67518:314;67470:362;;;;:::o;67834:212::-;67970:34;67966:1;67958:6;67954:14;67947:58;68035:7;68030:2;68022:6;68018:15;68011:32;67834:212;:::o;68048:350::-;68190:3;68207:67;68271:2;68266:3;68207:67;:::i;:::-;68200:74;;68279:93;68368:3;68279:93;:::i;:::-;68393:2;68388:3;68384:12;68377:19;;68048:350;;;:::o;68400:403::-;68566:4;68600:2;68589:9;68585:18;68577:26;;68645:9;68639:4;68635:20;68631:1;68620:9;68616:17;68609:47;68669:131;68795:4;68669:131;:::i;:::-;68661:139;;68400:403;;;:::o;68805:211::-;68941:34;68937:1;68929:6;68925:14;68918:58;69006:6;69001:2;68993:6;68989:15;68982:31;68805:211;:::o;69018:350::-;69160:3;69177:67;69241:2;69236:3;69177:67;:::i;:::-;69170:74;;69249:93;69338:3;69249:93;:::i;:::-;69363:2;69358:3;69354:12;69347:19;;69018:350;;;:::o;69370:403::-;69536:4;69570:2;69559:9;69555:18;69547:26;;69615:9;69609:4;69605:20;69601:1;69590:9;69586:17;69579:47;69639:131;69765:4;69639:131;:::i;:::-;69631:139;;69370:403;;;:::o;69775:225::-;69911:34;69907:1;69899:6;69895:14;69888:58;69976:20;69971:2;69963:6;69959:15;69952:45;69775:225;:::o;70002:350::-;70144:3;70161:67;70225:2;70220:3;70161:67;:::i;:::-;70154:74;;70233:93;70322:3;70233:93;:::i;:::-;70347:2;70342:3;70338:12;70331:19;;70002:350;;;:::o;70354:403::-;70520:4;70554:2;70543:9;70539:18;70531:26;;70599:9;70593:4;70589:20;70585:1;70574:9;70570:17;70563:47;70623:131;70749:4;70623:131;:::i;:::-;70615:139;;70354:403;;;:::o;70759:71::-;70798:7;70823:5;70812:16;;70759:71;;;:::o;70832:149::-;70933:45;70953:24;70971:5;70953:24;:::i;:::-;70933:45;:::i;:::-;70928:3;70921:58;70832:149;;:::o;70983:145::-;71119:5;71115:1;71107:6;71103:14;71096:29;70983:145;:::o;71130:384::-;71290:3;71307:84;71389:1;71384:3;71307:84;:::i;:::-;71300:91;;71396:93;71485:3;71396:93;:::i;:::-;71510:1;71505:3;71501:11;71494:18;;71130:384;;;:::o;71516:502::-;71729:3;71740:75;71811:3;71802:6;71740:75;:::i;:::-;71836:2;71831:3;71827:12;71820:19;;71852:148;71996:3;71852:148;:::i;:::-;71845:155;;72013:3;72006:10;;71516:502;;;;:::o;72020:156::-;72052:1;72065:20;72083:1;72065:20;:::i;:::-;72060:25;;72095:20;72113:1;72095:20;:::i;:::-;72090:25;;72130:1;72120:35;;72135:18;;:::i;:::-;72120:35;72172:1;72169;72165:9;72160:14;;72020:156;;;;:::o;72178:147::-;72314:7;72310:1;72302:6;72298:14;72291:31;72178:147;:::o;72327:384::-;72487:3;72504:84;72586:1;72581:3;72504:84;:::i;:::-;72497:91;;72593:93;72682:3;72593:93;:::i;:::-;72707:1;72702:3;72698:11;72691:18;;72327:384;;;:::o;72713:502::-;72926:3;72937:75;73008:3;72999:6;72937:75;:::i;:::-;73033:2;73028:3;73024:12;73017:19;;73049:148;73193:3;73049:148;:::i;:::-;73042:155;;73210:3;73203:10;;72713:502;;;;:::o;73217:148::-;73353:8;73349:1;73341:6;73337:14;73330:32;73217:148;:::o;73367:384::-;73527:3;73544:84;73626:1;73621:3;73544:84;:::i;:::-;73537:91;;73633:93;73722:3;73633:93;:::i;:::-;73747:1;73742:3;73738:11;73731:18;;73367:384;;;:::o;73753:502::-;73966:3;73977:75;74048:3;74039:6;73977:75;:::i;:::-;74073:2;74068:3;74064:12;74057:19;;74089:148;74233:3;74089:148;:::i;:::-;74082:155;;74250:3;74243:10;;73753:502;;;;:::o;74257:149::-;74393:9;74389:1;74381:6;74377:14;74370:33;74257:149;:::o;74408:384::-;74568:3;74585:84;74667:1;74662:3;74585:84;:::i;:::-;74578:91;;74674:93;74763:3;74674:93;:::i;:::-;74788:1;74783:3;74779:11;74772:18;;74408:384;;;:::o;74794:502::-;75007:3;75018:75;75089:3;75080:6;75018:75;:::i;:::-;75114:2;75109:3;75105:12;75098:19;;75130:148;75274:3;75130:148;:::i;:::-;75123:155;;75291:3;75284:10;;74794:502;;;;:::o;75298:155::-;75434:15;75430:1;75422:6;75418:14;75411:39;75298:155;:::o;75455:386::-;75615:3;75632:85;75714:2;75709:3;75632:85;:::i;:::-;75625:92;;75722:93;75811:3;75722:93;:::i;:::-;75836:2;75831:3;75827:12;75820:19;;75455:386;;;:::o;75843:502::-;76056:3;76067:75;76138:3;76129:6;76067:75;:::i;:::-;76163:2;76158:3;76154:12;76147:19;;76179:148;76323:3;76179:148;:::i;:::-;76172:155;;76340:3;76333:10;;75843:502;;;;:::o;76347:90::-;76398:6;76428:5;76422:12;76412:22;;76347:90;;;:::o;76439:156::-;76522:11;76552:6;76547:3;76540:19;76588:4;76583:3;76579:14;76564:29;;76439:156;;;;:::o;76597:353::-;76683:3;76707:38;76739:5;76707:38;:::i;:::-;76757:70;76820:6;76815:3;76757:70;:::i;:::-;76750:77;;76832:65;76890:6;76885:3;76878:4;76871:5;76867:16;76832:65;:::i;:::-;76918:29;76940:6;76918:29;:::i;:::-;76913:3;76909:39;76902:46;;76687:263;76597:353;;;;:::o;76952:612::-;77147:4;77181:3;77170:9;77166:19;77158:27;;77191:71;77259:1;77248:9;77244:17;77235:6;77191:71;:::i;:::-;77268:72;77336:2;77325:9;77321:18;77312:6;77268:72;:::i;:::-;77346;77414:2;77403:9;77399:18;77390:6;77346:72;:::i;:::-;77461:9;77455:4;77451:20;77446:2;77435:9;77431:18;77424:48;77485:76;77556:4;77547:6;77485:76;:::i;:::-;77477:84;;76952:612;;;;;;;:::o;77566:129::-;77622:5;77649:6;77643:13;77634:22;;77661:32;77687:5;77661:32;:::i;:::-;77566:129;;;;:::o;77697:325::-;77766:6;77811:2;77799:9;77790:7;77786:23;77782:32;77779:119;;;77817:79;;:::i;:::-;77779:119;77929:1;77950:63;78005:7;77996:6;77985:9;77981:22;77950:63;:::i;:::-;77940:73;;77904:115;77697:325;;;;:::o;78024:174::-;78160:34;78156:1;78148:6;78144:14;78137:58;78024:174;:::o;78200:350::-;78342:3;78359:67;78423:2;78418:3;78359:67;:::i;:::-;78352:74;;78431:93;78520:3;78431:93;:::i;:::-;78545:2;78540:3;78536:12;78529:19;;78200:350;;;:::o;78552:403::-;78718:4;78752:2;78741:9;78737:18;78729:26;;78797:9;78791:4;78787:20;78783:1;78772:9;78768:17;78761:47;78821:131;78947:4;78821:131;:::i;:::-;78813:139;;78552:403;;;:::o;78957:170::-;79093:30;79089:1;79081:6;79077:14;79070:54;78957:170;:::o;79129:350::-;79271:3;79288:67;79352:2;79347:3;79288:67;:::i;:::-;79281:74;;79360:93;79449:3;79360:93;:::i;:::-;79474:2;79469:3;79465:12;79458:19;;79129:350;;;:::o;79481:403::-;79647:4;79681:2;79670:9;79666:18;79658:26;;79726:9;79720:4;79716:20;79712:1;79701:9;79697:17;79690:47;79750:131;79876:4;79750:131;:::i;:::-;79742:139;;79481:403;;;:::o
Swarm Source
ipfs://c5d9b397e2d7dd1d73b9c8ea3ad516df3123f621db97d59481d0d2044242715b
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.