Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
0
Holders
224
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CryptoFish
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-11-28 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.17; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } } // File: artifacts/IOperatorFilterRegistry.sol //pragma solidity ^0.8.13; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } // File: artifacts/OperatorFilterer.sol //pragma solidity ^0.8.13; contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry constant operatorFilterRegistry = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); 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(operatorFilterRegistry).code.length > 0) { if (subscribe) { operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { operatorFilterRegistry.register(address(this)); } } } } modifier onlyAllowedOperator() virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(operatorFilterRegistry).code.length > 0) { if (!operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)) { revert OperatorNotAllowed(msg.sender); } } _; } } // File: artifacts/DefaultOperatorFilterer.sol //pragma solidity ^0.8.13; contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {} } // File: CryptoFish.sol // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) //pragma solidity ^0.8.17; /** * @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 << 3) < value ? 1 : 0); } } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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://consensys.net/diligence/blog/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.8.0) (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 { if (batchSize > 1) { if (from != address(0)) { _balances[from] -= batchSize; } if (to != address(0)) { _balances[to] += batchSize; } } } /** * @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 {} } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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); } } abstract contract Functional { function toString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } bool private _reentryKey = false; modifier reentryLock { require(!_reentryKey, "attempt to reenter a locked function"); _reentryKey = true; _; _reentryKey = false; } } // File: CryptoFish.sol // ****************************************************************************************************************************** // ************************************************** Start of Main Contract *************************************************** // ****************************************************************************************************************************** //pragma solidity ^0.8.17; contract CryptoFish is ERC721, Ownable, Functional, DefaultOperatorFilterer { // Token name string private _name; // Token symbol string private _symbol; // URI Root Location for Json Files string private baseURI; // Specific Functionality bool public publicMintActive; bool public wetListActive; bool private _hideTokens; //for URI redirects uint256 public pricePublic; uint256 public priceWetList; uint256 public maxSupply; uint256 public tokenMinted; uint256 public maxMintPerTx; uint256 public maxPerWallet; uint256 public reservedTokens; mapping(address => uint256) private tokenMintedby; mapping(address => uint256) private mintedByWL; mapping(address => uint256) private wetListUser; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor() ERC721("",""){ _name = "CryptoFish"; _symbol = "NEMO"; baseURI = "https://cryptofish.us/metadata"; _hideTokens = true; maxSupply = 10000; // 0-9999 pricePublic = 99 * (10 ** 15); // Replace leading value with price priceWetList = 0; //10 * (10 ** 15);// maxMintPerTx = 100; maxPerWallet = 100; reservedTokens = 100; // reserved for giveaways and such } // Standard Withdraw function for the owner to pull the contract function withdraw() external onlyOwner { uint256 sendAmount = address(this).balance; address PT1 = payable(0xB55f2682aF328743FaFedeaa2252AF4BdCD749fD); address PT2 = payable(0x8d4dAbA34C92E581F928fCA40e018382f7A0282a); address TRNT = payable(0xb3a05B0feCC927e32ab448415C7D0EFC694fD5E4); address CFB = payable(0x4FA0f099b015aefD70d9A12ba96a311Abf0Cbde6); bool success; (success, ) = PT1.call{value: ((sendAmount * 5)/1000)}(""); //0.5% require(success, "Transaction Unsuccessful"); (success, ) = PT2.call{value: ((sendAmount * 2)/100)}(""); //2% require(success, "Transaction Unsuccessful"); (success, ) = TRNT.call{value: ((sendAmount * 9)/100)}(""); //9% require(success, "Transaction Unsuccessful"); (success, ) = CFB.call{value: ((sendAmount * 885)/1000)}(""); //88.5% require(success, "Transaction Unsuccessful"); } function ownerMint(address _to, uint256 qty) external onlyOwner { require((tokenMinted + qty) > tokenMinted, "Math overflow error"); require((tokenMinted + qty) <= maxSupply, "Cannot fill order"); require((reservedTokens != 0) && (reservedTokens - qty >= 0), "Reserved tokens end"); uint256 mintSeedValue = tokenMinted; //Store the starting value of the mint batch if (reservedTokens >= qty) { reservedTokens -= qty; } else { reservedTokens = 0; } for(uint256 i = 0; i < qty; i++) { _safeMint(_to, mintSeedValue + i); tokenMinted ++; //reservedTokens can be reset, tokenMinted can not } } function publicMint(uint256 qty) external payable reentryLock { require(publicMintActive, "Mint: Public Mint is not active."); require(msg.value == qty*pricePublic, "Mint: Insufficient Funds."); require((qty + reservedTokens + tokenMinted) <= maxSupply, "Mint: Not enough avaialability"); require(qty <= maxMintPerTx,"Mint: Max Mint tokens per transaction exceeded"); require((tokenMintedby[msg.sender] + qty) <= maxPerWallet, "Mint: Max tokens per wallet exceeded"); tokensMint(qty); } function wetListMint(uint256 qty) external payable reentryLock { require(wetListActive, "WetList: WetList Mint is not enable."); require(msg.value == qty*priceWetList, "WetList: Insufficient Funds."); require(wetListUser[msg.sender] > 0, "WetList: Invalid User"); require((qty + reservedTokens + tokenMinted) <= maxSupply, "WetList: Not enough avaialability"); require((tokenMintedby[msg.sender] + qty) <= maxPerWallet, "WetList: Max tokens per wallet exceeded"); require(qty <= maxMintPerTx,"WetList: Max mint tokens per Transaction exceeded"); require(mintedByWL[msg.sender] + qty <= wetListUser[msg.sender], "WetList: Limit exceeded"); mintedByWL[msg.sender] += qty; tokensMint(qty); } function tokensMint(uint256 qty) private{ uint256 mintSeedValue = tokenMinted; tokenMintedby[msg.sender] += qty; for(uint256 i = 0; i < qty; i++) { _safeMint(msg.sender, mintSeedValue + i); tokenMinted ++; } } // allows holders to burn their own tokens if desired function burn(uint256 tokenID) external { _burn(tokenID); } ////////////////////////////////////////////////////////////// //////////////////// Setters and Getters ///////////////////// ////////////////////////////////////////////////////////////// function setMultipleWetList(address [] memory _Address, uint256 [] memory qty) public onlyOwner{ require(_Address.length == qty.length, "WetList Entry: Length mismatch error"); for( uint256 i = 0; i < _Address.length; i++ ){ wetListUser[_Address[i]] = qty[i]; } } function setSingleWetList(address _Address, uint256 _qty) public onlyOwner { wetListUser[ _Address ] = _qty; } function publicMintEnable() public onlyOwner{ //require(!wetListActive, "wetList is active"); publicMintActive = true; } function publicMintDisable() public onlyOwner{ publicMintActive = false; } function wetListEnable() public onlyOwner{ //require(!publicMintActive, "Public mint is active"); wetListActive = true; } function wetListDisable() public onlyOwner{ wetListActive = false; } function setBaseURI(string memory newURI) public onlyOwner { baseURI = newURI; } function hideTokens() external onlyOwner { _hideTokens = true; } function revealTokens() external onlyOwner { _hideTokens = false; } function setMaxSupply(uint256 newTokenLimit) public onlyOwner{ require( newTokenLimit > tokenMinted + reservedTokens, "Increase the limit of total tokens."); maxSupply = newTokenLimit; } function setMaxMintPerWallet(uint newMaxMintValue) public onlyOwner { maxPerWallet = newMaxMintValue; } function setPricePublic(uint256 newPrice) public onlyOwner { pricePublic = newPrice; } function setPriceWetList(uint256 newPrice) public onlyOwner { priceWetList = newPrice; } function setReservedTokens(uint256 newReservedTokens) public onlyOwner { require(newReservedTokens <= maxSupply , "Max supply overflow"); require(newReservedTokens <= maxSupply - tokenMinted,"Math Error to set reserve tokens"); reservedTokens = newReservedTokens; } function setMaxMintPerTx(uint256 newMintTx) public onlyOwner { maxMintPerTx = newMintTx; } function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override onlyAllowedOperator { super.safeTransferFrom(from, to, tokenId, data); } function getWetListToken() external view returns (uint256) { return wetListUser[msg.sender]; } function getWetListUser(address _Address) external view returns (uint256) { return wetListUser[_Address]; } function getRemainWetList() external view returns(uint256) { return wetListUser[msg.sender]-mintedByWL[msg.sender]; } function getName() external view returns(string memory ){ return _name; } function getSymbol() external view returns(string memory ){ return _symbol; } //@dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. function tokenURI(uint256 tokenId) public virtual override view returns (string memory){ require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory tokenuri; if (_hideTokens) { //redirect to mystery box tokenuri = string(abi.encodePacked(baseURI, "mystery.json")); } else { //Input flag data here to send to reveal URI tokenuri = string(abi.encodePacked(baseURI, toString(tokenId), ".json")); /// 0.json 135.json } return tokenuri; } function contractURI() public view returns (string memory) { return string(abi.encodePacked(baseURI,"contract.json")); } // ******************************************************************************* receive() external payable {} fallback() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"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"},{"stateMutability":"payable","type":"fallback"},{"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":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRemainWetList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSymbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWetListToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_Address","type":"address"}],"name":"getWetListUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hideTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricePublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceWetList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintDisable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"publicMintEnable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealTokens","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":"string","name":"newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMintTx","type":"uint256"}],"name":"setMaxMintPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxMintValue","type":"uint256"}],"name":"setMaxMintPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTokenLimit","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_Address","type":"address[]"},{"internalType":"uint256[]","name":"qty","type":"uint256[]"}],"name":"setMultipleWetList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPricePublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPriceWetList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newReservedTokens","type":"uint256"}],"name":"setReservedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_Address","type":"address"},{"internalType":"uint256","name":"_qty","type":"uint256"}],"name":"setSingleWetList","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":[],"name":"tokenMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"wetListActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wetListDisable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wetListEnable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"wetListMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526000600660146101000a81548160ff0219169083151502179055503480156200002c57600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060200160405280600081525060405180602001604052806000815250816000908162000075919062000717565b50806001908162000087919062000717565b505050620000aa6200009e620003cf60201b60201c565b620003d760201b60201c565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200029f57801562000165576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200012b92919062000843565b600060405180830381600087803b1580156200014657600080fd5b505af11580156200015b573d6000803e3d6000fd5b505050506200029e565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200021f576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620001e592919062000843565b600060405180830381600087803b1580156200020057600080fd5b505af115801562000215573d6000803e3d6000fd5b505050506200029d565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000268919062000870565b600060405180830381600087803b1580156200028357600080fd5b505af115801562000298573d6000803e3d6000fd5b505050505b5b5b50506040518060400160405280600a81526020017f43727970746f466973680000000000000000000000000000000000000000000081525060079081620002e7919062000717565b506040518060400160405280600481526020017f4e454d4f00000000000000000000000000000000000000000000000000000000815250600890816200032e919062000717565b506040518060400160405280601e81526020017f68747470733a2f2f63727970746f666973682e75732f6d6574616461746100008152506009908162000375919062000717565b506001600a60026101000a81548160ff021916908315150217905550612710600d8190555067015fb7f9b8c38000600b819055506000600c819055506064600f81905550606460108190555060646011819055506200088d565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200051f57607f821691505b602082108103620005355762000534620004d7565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200059f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000560565b620005ab868362000560565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005f8620005f2620005ec84620005c3565b620005cd565b620005c3565b9050919050565b6000819050919050565b6200061483620005d7565b6200062c6200062382620005ff565b8484546200056d565b825550505050565b600090565b6200064362000634565b6200065081848462000609565b505050565b5b8181101562000678576200066c60008262000639565b60018101905062000656565b5050565b601f821115620006c75762000691816200053b565b6200069c8462000550565b81016020851015620006ac578190505b620006c4620006bb8562000550565b83018262000655565b50505b505050565b600082821c905092915050565b6000620006ec60001984600802620006cc565b1980831691505092915050565b6000620007078383620006d9565b9150826002028217905092915050565b62000722826200049d565b67ffffffffffffffff8111156200073e576200073d620004a8565b5b6200074a825462000506565b620007578282856200067c565b600060209050601f8311600181146200078f57600084156200077a578287015190505b620007868582620006f9565b865550620007f6565b601f1984166200079f866200053b565b60005b82811015620007c957848901518255600182019150602085019450602081019050620007a2565b86831015620007e95784890151620007e5601f891682620006d9565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200082b82620007fe565b9050919050565b6200083d816200081e565b82525050565b60006040820190506200085a600083018562000832565b62000869602083018462000832565b9392505050565b600060208201905062000887600083018462000832565b92915050565b615bd7806200089d6000396000f3fe6080604052600436106102e85760003560e01c8063616cdb1e11610190578063afdf6134116100dc578063d4820b1111610095578063e0d232601161006f578063e0d2326014610a64578063e8a3d48514610a8f578063e985e9c514610aba578063f2fde38b14610af7576102ef565b8063d4820b11146109d1578063d5abeb0114610a0e578063de7fcb1d14610a39576102ef565b8063afdf6134146108d7578063b5b3e21414610900578063b67c25a314610917578063b88d4fde14610942578063c08bbe6e1461096b578063c87b56dd14610994576102ef565b8063872f289011610149578063963563551161012357806396356355146108415780639f3e2f1d1461086c578063a22cb46514610883578063ad675964146108ac576102ef565b8063872f2890146107c25780638da5cb5b146107eb57806395d89b4114610816576102ef565b8063616cdb1e146106b65780636352211e146106df5780636f8b44b01461071c57806370a0823114610745578063715018a614610782578063857cb39714610799576102ef565b806323b872dd1161024f5780633ccfd60b116102085780634530a832116101e25780634530a83214610610578063453c231014610639578063484b973c1461066457806355f804b31461068d576102ef565b80633ccfd60b146105a757806342842e0e146105be57806342966c68146105e7576102ef565b806323b872dd146104f25780632b1904c31461051b5780632db11544146105465780632e8f793114610562578063353241ee146105795780633ba5939d14610590576102ef565b8063123b394f116102a1578063123b394f14610413578063150704011461043e57806315a553471461046957806317d7de7c146104945780631db31174146104bf57806321c304fb146104d6576102ef565b806301ffc9a7146102f1578063027903ef1461032e57806306fdde0314610357578063081812fc14610382578063095ea7b3146103bf578063102e766d146103e8576102ef565b366102ef57005b005b3480156102fd57600080fd5b506103186004803603810190610313919061398d565b610b20565b60405161032591906139d5565b60405180910390f35b34801561033a57600080fd5b5061035560048036038101906103509190613a26565b610c02565b005b34801561036357600080fd5b5061036c610cab565b6040516103799190613ae3565b60405180910390f35b34801561038e57600080fd5b506103a960048036038101906103a49190613a26565b610d3d565b6040516103b69190613b46565b60405180910390f35b3480156103cb57600080fd5b506103e660048036038101906103e19190613b8d565b610d83565b005b3480156103f457600080fd5b506103fd610e9a565b60405161040a9190613bdc565b60405180910390f35b34801561041f57600080fd5b50610428610ea0565b6040516104359190613bdc565b60405180910390f35b34801561044a57600080fd5b50610453610ea6565b6040516104609190613ae3565b60405180910390f35b34801561047557600080fd5b5061047e610f38565b60405161048b9190613bdc565b60405180910390f35b3480156104a057600080fd5b506104a9610f3e565b6040516104b69190613ae3565b60405180910390f35b3480156104cb57600080fd5b506104d4610fd0565b005b6104f060048036038101906104eb9190613a26565b610ff5565b005b3480156104fe57600080fd5b5061051960048036038101906105149190613bf7565b6113fc565b005b34801561052757600080fd5b50610530611508565b60405161053d9190613bdc565b60405180910390f35b610560600480360381019061055b9190613a26565b61154f565b005b34801561056e57600080fd5b506105776117b2565b005b34801561058557600080fd5b5061058e6117d7565b005b34801561059c57600080fd5b506105a56117fc565b005b3480156105b357600080fd5b506105bc611821565b005b3480156105ca57600080fd5b506105e560048036038101906105e09190613bf7565b611baf565b005b3480156105f357600080fd5b5061060e60048036038101906106099190613a26565b611cbb565b005b34801561061c57600080fd5b5061063760048036038101906106329190613a26565b611cc7565b005b34801561064557600080fd5b5061064e611cd9565b60405161065b9190613bdc565b60405180910390f35b34801561067057600080fd5b5061068b60048036038101906106869190613b8d565b611cdf565b005b34801561069957600080fd5b506106b460048036038101906106af9190613d7f565b611e72565b005b3480156106c257600080fd5b506106dd60048036038101906106d89190613a26565b611e8d565b005b3480156106eb57600080fd5b5061070660048036038101906107019190613a26565b611e9f565b6040516107139190613b46565b60405180910390f35b34801561072857600080fd5b50610743600480360381019061073e9190613a26565b611f25565b005b34801561075157600080fd5b5061076c60048036038101906107679190613dc8565b611f88565b6040516107799190613bdc565b60405180910390f35b34801561078e57600080fd5b5061079761203f565b005b3480156107a557600080fd5b506107c060048036038101906107bb9190613a26565b612053565b005b3480156107ce57600080fd5b506107e960048036038101906107e49190613f80565b612065565b005b3480156107f757600080fd5b5061080061214d565b60405161080d9190613b46565b60405180910390f35b34801561082257600080fd5b5061082b612177565b6040516108389190613ae3565b60405180910390f35b34801561084d57600080fd5b50610856612209565b6040516108639190613bdc565b60405180910390f35b34801561087857600080fd5b5061088161220f565b005b34801561088f57600080fd5b506108aa60048036038101906108a59190614024565b612234565b005b3480156108b857600080fd5b506108c161224a565b6040516108ce91906139d5565b60405180910390f35b3480156108e357600080fd5b506108fe60048036038101906108f99190613a26565b61225d565b005b34801561090c57600080fd5b5061091561226f565b005b34801561092357600080fd5b5061092c612294565b60405161093991906139d5565b60405180910390f35b34801561094e57600080fd5b5061096960048036038101906109649190614105565b6122a7565b005b34801561097757600080fd5b50610992600480360381019061098d9190613b8d565b6123b5565b005b3480156109a057600080fd5b506109bb60048036038101906109b69190613a26565b612405565b6040516109c89190613ae3565b60405180910390f35b3480156109dd57600080fd5b506109f860048036038101906109f39190613dc8565b6124c5565b604051610a059190613bdc565b60405180910390f35b348015610a1a57600080fd5b50610a2361250e565b604051610a309190613bdc565b60405180910390f35b348015610a4557600080fd5b50610a4e612514565b604051610a5b9190613bdc565b60405180910390f35b348015610a7057600080fd5b50610a7961251a565b604051610a869190613bdc565b60405180910390f35b348015610a9b57600080fd5b50610aa46125ab565b604051610ab19190613ae3565b60405180910390f35b348015610ac657600080fd5b50610ae16004803603810190610adc9190614188565b6125d3565b604051610aee91906139d5565b60405180910390f35b348015610b0357600080fd5b50610b1e6004803603810190610b199190613dc8565b612667565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610beb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bfb5750610bfa826126ea565b5b9050919050565b610c0a612754565b600d54811115610c4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4690614214565b60405180910390fd5b600e54600d54610c5f9190614263565b811115610ca1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c98906142e3565b60405180910390fd5b8060118190555050565b606060008054610cba90614332565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce690614332565b8015610d335780601f10610d0857610100808354040283529160200191610d33565b820191906000526020600020905b815481529060010190602001808311610d1657829003601f168201915b5050505050905090565b6000610d48826127d2565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d8e82611e9f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df5906143d5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e1d61281d565b73ffffffffffffffffffffffffffffffffffffffff161480610e4c5750610e4b81610e4661281d565b6125d3565b5b610e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8290614467565b60405180910390fd5b610e958383612825565b505050565b600b5481565b600c5481565b606060088054610eb590614332565b80601f0160208091040260200160405190810160405280929190818152602001828054610ee190614332565b8015610f2e5780601f10610f0357610100808354040283529160200191610f2e565b820191906000526020600020905b815481529060010190602001808311610f1157829003601f168201915b5050505050905090565b60115481565b606060078054610f4d90614332565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7990614332565b8015610fc65780601f10610f9b57610100808354040283529160200191610fc6565b820191906000526020600020905b815481529060010190602001808311610fa957829003601f168201915b5050505050905090565b610fd8612754565b6001600a60016101000a81548160ff021916908315150217905550565b600660149054906101000a900460ff1615611045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103c906144f9565b60405180910390fd5b6001600660146101000a81548160ff021916908315150217905550600a60019054906101000a900460ff166110af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a69061458b565b60405180910390fd5b600c54816110bd91906145ab565b34146110fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f590614639565b60405180910390fd5b6000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611180576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611177906146a5565b60405180910390fd5b600d54600e546011548361119491906146c5565b61119e91906146c5565b11156111df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d69061476b565b60405180910390fd5b60105481601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461122d91906146c5565b111561126e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611265906147fd565b60405180910390fd5b600f548111156112b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112aa9061488f565b60405180910390fd5b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461133e91906146c5565b111561137f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611376906148fb565b60405180910390fd5b80601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113ce91906146c5565b925050819055506113de816128de565b6000600660146101000a81548160ff02191690831515021790555050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156114f8576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161147392919061491b565b6020604051808303816000875af1158015611492573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b69190614959565b6114f757336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016114ee9190613b46565b60405180910390fd5b5b61150383838361298b565b505050565b6000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b600660149054906101000a900460ff161561159f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611596906144f9565b60405180910390fd5b6001600660146101000a81548160ff021916908315150217905550600a60009054906101000a900460ff16611609576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611600906149d2565b60405180910390fd5b600b548161161791906145ab565b3414611658576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164f90614a3e565b60405180910390fd5b600d54600e546011548361166c91906146c5565b61167691906146c5565b11156116b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ae90614aaa565b60405180910390fd5b600f548111156116fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f390614b3c565b60405180910390fd5b60105481601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461174a91906146c5565b111561178b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178290614bce565b60405180910390fd5b611794816128de565b6000600660146101000a81548160ff02191690831515021790555050565b6117ba612754565b6001600a60006101000a81548160ff021916908315150217905550565b6117df612754565b6000600a60016101000a81548160ff021916908315150217905550565b611804612754565b6000600a60026101000a81548160ff021916908315150217905550565b611829612754565b6000479050600073b55f2682af328743fafedeaa2252af4bdcd749fd90506000738d4daba34c92e581f928fca40e018382f7a0282a9050600073b3a05b0fecc927e32ab448415c7d0efc694fd5e490506000734fa0f099b015aefd70d9a12ba96a311abf0cbde6905060008473ffffffffffffffffffffffffffffffffffffffff166103e86005886118bb91906145ab565b6118c59190614c1d565b6040516118d190614c7f565b60006040518083038185875af1925050503d806000811461190e576040519150601f19603f3d011682016040523d82523d6000602084013e611913565b606091505b50508091505080611959576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195090614ce0565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff16606460028861197f91906145ab565b6119899190614c1d565b60405161199590614c7f565b60006040518083038185875af1925050503d80600081146119d2576040519150601f19603f3d011682016040523d82523d6000602084013e6119d7565b606091505b50508091505080611a1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1490614ce0565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff166064600988611a4391906145ab565b611a4d9190614c1d565b604051611a5990614c7f565b60006040518083038185875af1925050503d8060008114611a96576040519150601f19603f3d011682016040523d82523d6000602084013e611a9b565b606091505b50508091505080611ae1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad890614ce0565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166103e861037588611b0991906145ab565b611b139190614c1d565b604051611b1f90614c7f565b60006040518083038185875af1925050503d8060008114611b5c576040519150601f19603f3d011682016040523d82523d6000602084013e611b61565b606091505b50508091505080611ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9e90614ce0565b60405180910390fd5b505050505050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611cab576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611c2692919061491b565b6020604051808303816000875af1158015611c45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c699190614959565b611caa57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611ca19190613b46565b60405180910390fd5b5b611cb68383836129eb565b505050565b611cc481612a0b565b50565b611ccf612754565b80600b8190555050565b60105481565b611ce7612754565b600e5481600e54611cf891906146c5565b11611d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2f90614d4c565b60405180910390fd5b600d5481600e54611d4991906146c5565b1115611d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8190614db8565b60405180910390fd5b600060115414158015611dab5750600081601154611da89190614263565b10155b611dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de190614e24565b60405180910390fd5b6000600e5490508160115410611e18578160116000828254611e0c9190614263565b92505081905550611e21565b60006011819055505b60005b82811015611e6c57611e41848284611e3c91906146c5565b612b59565b600e6000815480929190611e5490614e44565b91905055508080611e6490614e44565b915050611e24565b50505050565b611e7a612754565b8060099081611e899190615038565b5050565b611e95612754565b80600f8190555050565b600080611eab83612b77565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1390615156565b60405180910390fd5b80915050919050565b611f2d612754565b601154600e54611f3d91906146c5565b8111611f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f75906151e8565b60405180910390fd5b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fef9061527a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b612047612754565b6120516000612bb4565b565b61205b612754565b80600c8190555050565b61206d612754565b80518251146120b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a89061530c565b60405180910390fd5b60005b8251811015612148578181815181106120d0576120cf61532c565b5b6020026020010151601460008584815181106120ef576120ee61532c565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061214090614e44565b9150506120b4565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461218690614332565b80601f01602080910402602001604051908101604052809291908181526020018280546121b290614332565b80156121ff5780601f106121d4576101008083540402835291602001916121ff565b820191906000526020600020905b8154815290600101906020018083116121e257829003601f168201915b5050505050905090565b600e5481565b612217612754565b6000600a60006101000a81548160ff021916908315150217905550565b61224661223f61281d565b8383612c7a565b5050565b600a60019054906101000a900460ff1681565b612265612754565b8060108190555050565b612277612754565b6001600a60026101000a81548160ff021916908315150217905550565b600a60009054906101000a900460ff1681565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156123a3576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161231e92919061491b565b6020604051808303816000875af115801561233d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123619190614959565b6123a257336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016123999190613b46565b60405180910390fd5b5b6123af84848484612de6565b50505050565b6123bd612754565b80601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b606061241082612e48565b61244f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612446906153cd565b60405180910390fd5b6060600a60029054906101000a900460ff161561248e57600960405160200161247891906154c7565b60405160208183030381529060405290506124bc565b600961249984612e89565b6040516020016124aa929190615566565b60405160208183030381529060405290505b80915050919050565b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600d5481565b600f5481565b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125a69190614263565b905090565b606060096040516020016125bf91906155e1565b604051602081830303815290604052905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61266f612754565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036126de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d590615675565b60405180910390fd5b6126e781612bb4565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61275c61281d565b73ffffffffffffffffffffffffffffffffffffffff1661277a61214d565b73ffffffffffffffffffffffffffffffffffffffff16146127d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c7906156e1565b60405180910390fd5b565b6127db81612e48565b61281a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281190615156565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661289883611e9f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000600e54905081601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461293491906146c5565b9250508190555060005b828110156129865761295b33828461295691906146c5565b612b59565b600e600081548092919061296e90614e44565b9190505550808061297e90614e44565b91505061293e565b505050565b61299c61299661281d565b82612fe9565b6129db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d290615773565b60405180910390fd5b6129e683838361307e565b505050565b612a06838383604051806020016040528060008152506122a7565b505050565b6000612a1682611e9f565b9050612a26816000846001613377565b612a2f82611e9f565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b5581600084600161349d565b5050565b612b738282604051806020016040528060008152506134a3565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cdf906157df565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612dd991906139d5565b60405180910390a3505050565b612df7612df161281d565b83612fe9565b612e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2d90615773565b60405180910390fd5b612e42848484846134fe565b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16612e6a83612b77565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b606060008203612ed0576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612fe4565b600082905060005b60008214612f02578080612eeb90614e44565b915050600a82612efb9190614c1d565b9150612ed8565b60008167ffffffffffffffff811115612f1e57612f1d613c54565b5b6040519080825280601f01601f191660200182016040528015612f505781602001600182028036833780820191505090505b5090505b60008514612fdd57600182612f699190614263565b9150600a85612f7891906157ff565b6030612f8491906146c5565b60f81b818381518110612f9a57612f9961532c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612fd69190614c1d565b9450612f54565b8093505050505b919050565b600080612ff583611e9f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480613037575061303681856125d3565b5b8061307557508373ffffffffffffffffffffffffffffffffffffffff1661305d84610d3d565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661309e82611e9f565b73ffffffffffffffffffffffffffffffffffffffff16146130f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130eb906158a2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613163576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315a90615934565b60405180910390fd5b6131708383836001613377565b8273ffffffffffffffffffffffffffffffffffffffff1661319082611e9f565b73ffffffffffffffffffffffffffffffffffffffff16146131e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131dd906158a2565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613372838383600161349d565b505050565b600181111561349757600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461340b5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134039190614263565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146134965780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461348e91906146c5565b925050819055505b5b50505050565b50505050565b6134ad838361355a565b6134ba6000848484613777565b6134f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134f0906159c6565b60405180910390fd5b505050565b61350984848461307e565b61351584848484613777565b613554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161354b906159c6565b60405180910390fd5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036135c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135c090615a32565b60405180910390fd5b6135d281612e48565b15613612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360990615a9e565b60405180910390fd5b613620600083836001613377565b61362981612e48565b15613669576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161366090615a9e565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461377360008383600161349d565b5050565b60006137988473ffffffffffffffffffffffffffffffffffffffff166138fe565b156138f1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026137c161281d565b8786866040518563ffffffff1660e01b81526004016137e39493929190615b13565b6020604051808303816000875af192505050801561381f57506040513d601f19601f8201168201806040525081019061381c9190615b74565b60015b6138a1573d806000811461384f576040519150601f19603f3d011682016040523d82523d6000602084013e613854565b606091505b506000815103613899576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613890906159c6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506138f6565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61396a81613935565b811461397557600080fd5b50565b60008135905061398781613961565b92915050565b6000602082840312156139a3576139a261392b565b5b60006139b184828501613978565b91505092915050565b60008115159050919050565b6139cf816139ba565b82525050565b60006020820190506139ea60008301846139c6565b92915050565b6000819050919050565b613a03816139f0565b8114613a0e57600080fd5b50565b600081359050613a20816139fa565b92915050565b600060208284031215613a3c57613a3b61392b565b5b6000613a4a84828501613a11565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613a8d578082015181840152602081019050613a72565b60008484015250505050565b6000601f19601f8301169050919050565b6000613ab582613a53565b613abf8185613a5e565b9350613acf818560208601613a6f565b613ad881613a99565b840191505092915050565b60006020820190508181036000830152613afd8184613aaa565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613b3082613b05565b9050919050565b613b4081613b25565b82525050565b6000602082019050613b5b6000830184613b37565b92915050565b613b6a81613b25565b8114613b7557600080fd5b50565b600081359050613b8781613b61565b92915050565b60008060408385031215613ba457613ba361392b565b5b6000613bb285828601613b78565b9250506020613bc385828601613a11565b9150509250929050565b613bd6816139f0565b82525050565b6000602082019050613bf16000830184613bcd565b92915050565b600080600060608486031215613c1057613c0f61392b565b5b6000613c1e86828701613b78565b9350506020613c2f86828701613b78565b9250506040613c4086828701613a11565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613c8c82613a99565b810181811067ffffffffffffffff82111715613cab57613caa613c54565b5b80604052505050565b6000613cbe613921565b9050613cca8282613c83565b919050565b600067ffffffffffffffff821115613cea57613ce9613c54565b5b613cf382613a99565b9050602081019050919050565b82818337600083830152505050565b6000613d22613d1d84613ccf565b613cb4565b905082815260208101848484011115613d3e57613d3d613c4f565b5b613d49848285613d00565b509392505050565b600082601f830112613d6657613d65613c4a565b5b8135613d76848260208601613d0f565b91505092915050565b600060208284031215613d9557613d9461392b565b5b600082013567ffffffffffffffff811115613db357613db2613930565b5b613dbf84828501613d51565b91505092915050565b600060208284031215613dde57613ddd61392b565b5b6000613dec84828501613b78565b91505092915050565b600067ffffffffffffffff821115613e1057613e0f613c54565b5b602082029050602081019050919050565b600080fd5b6000613e39613e3484613df5565b613cb4565b90508083825260208201905060208402830185811115613e5c57613e5b613e21565b5b835b81811015613e855780613e718882613b78565b845260208401935050602081019050613e5e565b5050509392505050565b600082601f830112613ea457613ea3613c4a565b5b8135613eb4848260208601613e26565b91505092915050565b600067ffffffffffffffff821115613ed857613ed7613c54565b5b602082029050602081019050919050565b6000613efc613ef784613ebd565b613cb4565b90508083825260208201905060208402830185811115613f1f57613f1e613e21565b5b835b81811015613f485780613f348882613a11565b845260208401935050602081019050613f21565b5050509392505050565b600082601f830112613f6757613f66613c4a565b5b8135613f77848260208601613ee9565b91505092915050565b60008060408385031215613f9757613f9661392b565b5b600083013567ffffffffffffffff811115613fb557613fb4613930565b5b613fc185828601613e8f565b925050602083013567ffffffffffffffff811115613fe257613fe1613930565b5b613fee85828601613f52565b9150509250929050565b614001816139ba565b811461400c57600080fd5b50565b60008135905061401e81613ff8565b92915050565b6000806040838503121561403b5761403a61392b565b5b600061404985828601613b78565b925050602061405a8582860161400f565b9150509250929050565b600067ffffffffffffffff82111561407f5761407e613c54565b5b61408882613a99565b9050602081019050919050565b60006140a86140a384614064565b613cb4565b9050828152602081018484840111156140c4576140c3613c4f565b5b6140cf848285613d00565b509392505050565b600082601f8301126140ec576140eb613c4a565b5b81356140fc848260208601614095565b91505092915050565b6000806000806080858703121561411f5761411e61392b565b5b600061412d87828801613b78565b945050602061413e87828801613b78565b935050604061414f87828801613a11565b925050606085013567ffffffffffffffff8111156141705761416f613930565b5b61417c878288016140d7565b91505092959194509250565b6000806040838503121561419f5761419e61392b565b5b60006141ad85828601613b78565b92505060206141be85828601613b78565b9150509250929050565b7f4d617820737570706c79206f766572666c6f7700000000000000000000000000600082015250565b60006141fe601383613a5e565b9150614209826141c8565b602082019050919050565b6000602082019050818103600083015261422d816141f1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061426e826139f0565b9150614279836139f0565b925082820390508181111561429157614290614234565b5b92915050565b7f4d617468204572726f7220746f20736574207265736572766520746f6b656e73600082015250565b60006142cd602083613a5e565b91506142d882614297565b602082019050919050565b600060208201905081810360008301526142fc816142c0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061434a57607f821691505b60208210810361435d5761435c614303565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006143bf602183613a5e565b91506143ca82614363565b604082019050919050565b600060208201905081810360008301526143ee816143b2565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000614451603d83613a5e565b915061445c826143f5565b604082019050919050565b6000602082019050818103600083015261448081614444565b9050919050565b7f617474656d707420746f207265656e7465722061206c6f636b65642066756e6360008201527f74696f6e00000000000000000000000000000000000000000000000000000000602082015250565b60006144e3602483613a5e565b91506144ee82614487565b604082019050919050565b60006020820190508181036000830152614512816144d6565b9050919050565b7f5765744c6973743a205765744c697374204d696e74206973206e6f7420656e6160008201527f626c652e00000000000000000000000000000000000000000000000000000000602082015250565b6000614575602483613a5e565b915061458082614519565b604082019050919050565b600060208201905081810360008301526145a481614568565b9050919050565b60006145b6826139f0565b91506145c1836139f0565b92508282026145cf816139f0565b915082820484148315176145e6576145e5614234565b5b5092915050565b7f5765744c6973743a20496e73756666696369656e742046756e64732e00000000600082015250565b6000614623601c83613a5e565b915061462e826145ed565b602082019050919050565b6000602082019050818103600083015261465281614616565b9050919050565b7f5765744c6973743a20496e76616c696420557365720000000000000000000000600082015250565b600061468f601583613a5e565b915061469a82614659565b602082019050919050565b600060208201905081810360008301526146be81614682565b9050919050565b60006146d0826139f0565b91506146db836139f0565b92508282019050808211156146f3576146f2614234565b5b92915050565b7f5765744c6973743a204e6f7420656e6f7567682061766169616c6162696c697460008201527f7900000000000000000000000000000000000000000000000000000000000000602082015250565b6000614755602183613a5e565b9150614760826146f9565b604082019050919050565b6000602082019050818103600083015261478481614748565b9050919050565b7f5765744c6973743a204d617820746f6b656e73207065722077616c6c6574206560008201527f7863656564656400000000000000000000000000000000000000000000000000602082015250565b60006147e7602783613a5e565b91506147f28261478b565b604082019050919050565b60006020820190508181036000830152614816816147da565b9050919050565b7f5765744c6973743a204d6178206d696e7420746f6b656e73207065722054726160008201527f6e73616374696f6e206578636565646564000000000000000000000000000000602082015250565b6000614879603183613a5e565b91506148848261481d565b604082019050919050565b600060208201905081810360008301526148a88161486c565b9050919050565b7f5765744c6973743a204c696d6974206578636565646564000000000000000000600082015250565b60006148e5601783613a5e565b91506148f0826148af565b602082019050919050565b60006020820190508181036000830152614914816148d8565b9050919050565b60006040820190506149306000830185613b37565b61493d6020830184613b37565b9392505050565b60008151905061495381613ff8565b92915050565b60006020828403121561496f5761496e61392b565b5b600061497d84828501614944565b91505092915050565b7f4d696e743a205075626c6963204d696e74206973206e6f74206163746976652e600082015250565b60006149bc602083613a5e565b91506149c782614986565b602082019050919050565b600060208201905081810360008301526149eb816149af565b9050919050565b7f4d696e743a20496e73756666696369656e742046756e64732e00000000000000600082015250565b6000614a28601983613a5e565b9150614a33826149f2565b602082019050919050565b60006020820190508181036000830152614a5781614a1b565b9050919050565b7f4d696e743a204e6f7420656e6f7567682061766169616c6162696c6974790000600082015250565b6000614a94601e83613a5e565b9150614a9f82614a5e565b602082019050919050565b60006020820190508181036000830152614ac381614a87565b9050919050565b7f4d696e743a204d6178204d696e7420746f6b656e7320706572207472616e736160008201527f6374696f6e206578636565646564000000000000000000000000000000000000602082015250565b6000614b26602e83613a5e565b9150614b3182614aca565b604082019050919050565b60006020820190508181036000830152614b5581614b19565b9050919050565b7f4d696e743a204d617820746f6b656e73207065722077616c6c6574206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b6000614bb8602483613a5e565b9150614bc382614b5c565b604082019050919050565b60006020820190508181036000830152614be781614bab565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614c28826139f0565b9150614c33836139f0565b925082614c4357614c42614bee565b5b828204905092915050565b600081905092915050565b50565b6000614c69600083614c4e565b9150614c7482614c59565b600082019050919050565b6000614c8a82614c5c565b9150819050919050565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b6000614cca601883613a5e565b9150614cd582614c94565b602082019050919050565b60006020820190508181036000830152614cf981614cbd565b9050919050565b7f4d617468206f766572666c6f77206572726f7200000000000000000000000000600082015250565b6000614d36601383613a5e565b9150614d4182614d00565b602082019050919050565b60006020820190508181036000830152614d6581614d29565b9050919050565b7f43616e6e6f742066696c6c206f72646572000000000000000000000000000000600082015250565b6000614da2601183613a5e565b9150614dad82614d6c565b602082019050919050565b60006020820190508181036000830152614dd181614d95565b9050919050565b7f526573657276656420746f6b656e7320656e6400000000000000000000000000600082015250565b6000614e0e601383613a5e565b9150614e1982614dd8565b602082019050919050565b60006020820190508181036000830152614e3d81614e01565b9050919050565b6000614e4f826139f0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e8157614e80614234565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614eee7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614eb1565b614ef88683614eb1565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614f35614f30614f2b846139f0565b614f10565b6139f0565b9050919050565b6000819050919050565b614f4f83614f1a565b614f63614f5b82614f3c565b848454614ebe565b825550505050565b600090565b614f78614f6b565b614f83818484614f46565b505050565b5b81811015614fa757614f9c600082614f70565b600181019050614f89565b5050565b601f821115614fec57614fbd81614e8c565b614fc684614ea1565b81016020851015614fd5578190505b614fe9614fe185614ea1565b830182614f88565b50505b505050565b600082821c905092915050565b600061500f60001984600802614ff1565b1980831691505092915050565b60006150288383614ffe565b9150826002028217905092915050565b61504182613a53565b67ffffffffffffffff81111561505a57615059613c54565b5b6150648254614332565b61506f828285614fab565b600060209050601f8311600181146150a25760008415615090578287015190505b61509a858261501c565b865550615102565b601f1984166150b086614e8c565b60005b828110156150d8578489015182556001820191506020850194506020810190506150b3565b868310156150f557848901516150f1601f891682614ffe565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000615140601883613a5e565b915061514b8261510a565b602082019050919050565b6000602082019050818103600083015261516f81615133565b9050919050565b7f496e63726561736520746865206c696d6974206f6620746f74616c20746f6b6560008201527f6e732e0000000000000000000000000000000000000000000000000000000000602082015250565b60006151d2602383613a5e565b91506151dd82615176565b604082019050919050565b60006020820190508181036000830152615201816151c5565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000615264602983613a5e565b915061526f82615208565b604082019050919050565b6000602082019050818103600083015261529381615257565b9050919050565b7f5765744c69737420456e7472793a204c656e677468206d69736d61746368206560008201527f72726f7200000000000000000000000000000000000000000000000000000000602082015250565b60006152f6602483613a5e565b91506153018261529a565b604082019050919050565b60006020820190508181036000830152615325816152e9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006153b7602f83613a5e565b91506153c28261535b565b604082019050919050565b600060208201905081810360008301526153e6816153aa565b9050919050565b600081905092915050565b6000815461540581614332565b61540f81866153ed565b9450600182166000811461542a576001811461543f57615472565b60ff1983168652811515820286019350615472565b61544885614e8c565b60005b8381101561546a5781548189015260018201915060208101905061544b565b838801955050505b50505092915050565b7f6d7973746572792e6a736f6e0000000000000000000000000000000000000000600082015250565b60006154b1600c836153ed565b91506154bc8261547b565b600c82019050919050565b60006154d382846153f8565b91506154de826154a4565b915081905092915050565b60006154f482613a53565b6154fe81856153ed565b935061550e818560208601613a6f565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006155506005836153ed565b915061555b8261551a565b600582019050919050565b600061557282856153f8565b915061557e82846154e9565b915061558982615543565b91508190509392505050565b7f636f6e74726163742e6a736f6e00000000000000000000000000000000000000600082015250565b60006155cb600d836153ed565b91506155d682615595565b600d82019050919050565b60006155ed82846153f8565b91506155f8826155be565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061565f602683613a5e565b915061566a82615603565b604082019050919050565b6000602082019050818103600083015261568e81615652565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006156cb602083613a5e565b91506156d682615695565b602082019050919050565b600060208201905081810360008301526156fa816156be565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b600061575d602d83613a5e565b915061576882615701565b604082019050919050565b6000602082019050818103600083015261578c81615750565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006157c9601983613a5e565b91506157d482615793565b602082019050919050565b600060208201905081810360008301526157f8816157bc565b9050919050565b600061580a826139f0565b9150615815836139f0565b92508261582557615824614bee565b5b828206905092915050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061588c602583613a5e565b915061589782615830565b604082019050919050565b600060208201905081810360008301526158bb8161587f565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061591e602483613a5e565b9150615929826158c2565b604082019050919050565b6000602082019050818103600083015261594d81615911565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006159b0603283613a5e565b91506159bb82615954565b604082019050919050565b600060208201905081810360008301526159df816159a3565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615a1c602083613a5e565b9150615a27826159e6565b602082019050919050565b60006020820190508181036000830152615a4b81615a0f565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615a88601c83613a5e565b9150615a9382615a52565b602082019050919050565b60006020820190508181036000830152615ab781615a7b565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615ae582615abe565b615aef8185615ac9565b9350615aff818560208601613a6f565b615b0881613a99565b840191505092915050565b6000608082019050615b286000830187613b37565b615b356020830186613b37565b615b426040830185613bcd565b8181036060830152615b548184615ada565b905095945050505050565b600081519050615b6e81613961565b92915050565b600060208284031215615b8a57615b8961392b565b5b6000615b9884828501615b5f565b9150509291505056fea264697066735822122004d20f2a1ce828364228af4f711468522d074703520905c5eb0f649870d7bb5764736f6c63430008110033
Deployed Bytecode
0x6080604052600436106102e85760003560e01c8063616cdb1e11610190578063afdf6134116100dc578063d4820b1111610095578063e0d232601161006f578063e0d2326014610a64578063e8a3d48514610a8f578063e985e9c514610aba578063f2fde38b14610af7576102ef565b8063d4820b11146109d1578063d5abeb0114610a0e578063de7fcb1d14610a39576102ef565b8063afdf6134146108d7578063b5b3e21414610900578063b67c25a314610917578063b88d4fde14610942578063c08bbe6e1461096b578063c87b56dd14610994576102ef565b8063872f289011610149578063963563551161012357806396356355146108415780639f3e2f1d1461086c578063a22cb46514610883578063ad675964146108ac576102ef565b8063872f2890146107c25780638da5cb5b146107eb57806395d89b4114610816576102ef565b8063616cdb1e146106b65780636352211e146106df5780636f8b44b01461071c57806370a0823114610745578063715018a614610782578063857cb39714610799576102ef565b806323b872dd1161024f5780633ccfd60b116102085780634530a832116101e25780634530a83214610610578063453c231014610639578063484b973c1461066457806355f804b31461068d576102ef565b80633ccfd60b146105a757806342842e0e146105be57806342966c68146105e7576102ef565b806323b872dd146104f25780632b1904c31461051b5780632db11544146105465780632e8f793114610562578063353241ee146105795780633ba5939d14610590576102ef565b8063123b394f116102a1578063123b394f14610413578063150704011461043e57806315a553471461046957806317d7de7c146104945780631db31174146104bf57806321c304fb146104d6576102ef565b806301ffc9a7146102f1578063027903ef1461032e57806306fdde0314610357578063081812fc14610382578063095ea7b3146103bf578063102e766d146103e8576102ef565b366102ef57005b005b3480156102fd57600080fd5b506103186004803603810190610313919061398d565b610b20565b60405161032591906139d5565b60405180910390f35b34801561033a57600080fd5b5061035560048036038101906103509190613a26565b610c02565b005b34801561036357600080fd5b5061036c610cab565b6040516103799190613ae3565b60405180910390f35b34801561038e57600080fd5b506103a960048036038101906103a49190613a26565b610d3d565b6040516103b69190613b46565b60405180910390f35b3480156103cb57600080fd5b506103e660048036038101906103e19190613b8d565b610d83565b005b3480156103f457600080fd5b506103fd610e9a565b60405161040a9190613bdc565b60405180910390f35b34801561041f57600080fd5b50610428610ea0565b6040516104359190613bdc565b60405180910390f35b34801561044a57600080fd5b50610453610ea6565b6040516104609190613ae3565b60405180910390f35b34801561047557600080fd5b5061047e610f38565b60405161048b9190613bdc565b60405180910390f35b3480156104a057600080fd5b506104a9610f3e565b6040516104b69190613ae3565b60405180910390f35b3480156104cb57600080fd5b506104d4610fd0565b005b6104f060048036038101906104eb9190613a26565b610ff5565b005b3480156104fe57600080fd5b5061051960048036038101906105149190613bf7565b6113fc565b005b34801561052757600080fd5b50610530611508565b60405161053d9190613bdc565b60405180910390f35b610560600480360381019061055b9190613a26565b61154f565b005b34801561056e57600080fd5b506105776117b2565b005b34801561058557600080fd5b5061058e6117d7565b005b34801561059c57600080fd5b506105a56117fc565b005b3480156105b357600080fd5b506105bc611821565b005b3480156105ca57600080fd5b506105e560048036038101906105e09190613bf7565b611baf565b005b3480156105f357600080fd5b5061060e60048036038101906106099190613a26565b611cbb565b005b34801561061c57600080fd5b5061063760048036038101906106329190613a26565b611cc7565b005b34801561064557600080fd5b5061064e611cd9565b60405161065b9190613bdc565b60405180910390f35b34801561067057600080fd5b5061068b60048036038101906106869190613b8d565b611cdf565b005b34801561069957600080fd5b506106b460048036038101906106af9190613d7f565b611e72565b005b3480156106c257600080fd5b506106dd60048036038101906106d89190613a26565b611e8d565b005b3480156106eb57600080fd5b5061070660048036038101906107019190613a26565b611e9f565b6040516107139190613b46565b60405180910390f35b34801561072857600080fd5b50610743600480360381019061073e9190613a26565b611f25565b005b34801561075157600080fd5b5061076c60048036038101906107679190613dc8565b611f88565b6040516107799190613bdc565b60405180910390f35b34801561078e57600080fd5b5061079761203f565b005b3480156107a557600080fd5b506107c060048036038101906107bb9190613a26565b612053565b005b3480156107ce57600080fd5b506107e960048036038101906107e49190613f80565b612065565b005b3480156107f757600080fd5b5061080061214d565b60405161080d9190613b46565b60405180910390f35b34801561082257600080fd5b5061082b612177565b6040516108389190613ae3565b60405180910390f35b34801561084d57600080fd5b50610856612209565b6040516108639190613bdc565b60405180910390f35b34801561087857600080fd5b5061088161220f565b005b34801561088f57600080fd5b506108aa60048036038101906108a59190614024565b612234565b005b3480156108b857600080fd5b506108c161224a565b6040516108ce91906139d5565b60405180910390f35b3480156108e357600080fd5b506108fe60048036038101906108f99190613a26565b61225d565b005b34801561090c57600080fd5b5061091561226f565b005b34801561092357600080fd5b5061092c612294565b60405161093991906139d5565b60405180910390f35b34801561094e57600080fd5b5061096960048036038101906109649190614105565b6122a7565b005b34801561097757600080fd5b50610992600480360381019061098d9190613b8d565b6123b5565b005b3480156109a057600080fd5b506109bb60048036038101906109b69190613a26565b612405565b6040516109c89190613ae3565b60405180910390f35b3480156109dd57600080fd5b506109f860048036038101906109f39190613dc8565b6124c5565b604051610a059190613bdc565b60405180910390f35b348015610a1a57600080fd5b50610a2361250e565b604051610a309190613bdc565b60405180910390f35b348015610a4557600080fd5b50610a4e612514565b604051610a5b9190613bdc565b60405180910390f35b348015610a7057600080fd5b50610a7961251a565b604051610a869190613bdc565b60405180910390f35b348015610a9b57600080fd5b50610aa46125ab565b604051610ab19190613ae3565b60405180910390f35b348015610ac657600080fd5b50610ae16004803603810190610adc9190614188565b6125d3565b604051610aee91906139d5565b60405180910390f35b348015610b0357600080fd5b50610b1e6004803603810190610b199190613dc8565b612667565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610beb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bfb5750610bfa826126ea565b5b9050919050565b610c0a612754565b600d54811115610c4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4690614214565b60405180910390fd5b600e54600d54610c5f9190614263565b811115610ca1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c98906142e3565b60405180910390fd5b8060118190555050565b606060008054610cba90614332565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce690614332565b8015610d335780601f10610d0857610100808354040283529160200191610d33565b820191906000526020600020905b815481529060010190602001808311610d1657829003601f168201915b5050505050905090565b6000610d48826127d2565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d8e82611e9f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df5906143d5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e1d61281d565b73ffffffffffffffffffffffffffffffffffffffff161480610e4c5750610e4b81610e4661281d565b6125d3565b5b610e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8290614467565b60405180910390fd5b610e958383612825565b505050565b600b5481565b600c5481565b606060088054610eb590614332565b80601f0160208091040260200160405190810160405280929190818152602001828054610ee190614332565b8015610f2e5780601f10610f0357610100808354040283529160200191610f2e565b820191906000526020600020905b815481529060010190602001808311610f1157829003601f168201915b5050505050905090565b60115481565b606060078054610f4d90614332565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7990614332565b8015610fc65780601f10610f9b57610100808354040283529160200191610fc6565b820191906000526020600020905b815481529060010190602001808311610fa957829003601f168201915b5050505050905090565b610fd8612754565b6001600a60016101000a81548160ff021916908315150217905550565b600660149054906101000a900460ff1615611045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103c906144f9565b60405180910390fd5b6001600660146101000a81548160ff021916908315150217905550600a60019054906101000a900460ff166110af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a69061458b565b60405180910390fd5b600c54816110bd91906145ab565b34146110fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f590614639565b60405180910390fd5b6000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611180576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611177906146a5565b60405180910390fd5b600d54600e546011548361119491906146c5565b61119e91906146c5565b11156111df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d69061476b565b60405180910390fd5b60105481601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461122d91906146c5565b111561126e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611265906147fd565b60405180910390fd5b600f548111156112b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112aa9061488f565b60405180910390fd5b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461133e91906146c5565b111561137f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611376906148fb565b60405180910390fd5b80601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113ce91906146c5565b925050819055506113de816128de565b6000600660146101000a81548160ff02191690831515021790555050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156114f8576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161147392919061491b565b6020604051808303816000875af1158015611492573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b69190614959565b6114f757336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016114ee9190613b46565b60405180910390fd5b5b61150383838361298b565b505050565b6000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b600660149054906101000a900460ff161561159f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611596906144f9565b60405180910390fd5b6001600660146101000a81548160ff021916908315150217905550600a60009054906101000a900460ff16611609576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611600906149d2565b60405180910390fd5b600b548161161791906145ab565b3414611658576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164f90614a3e565b60405180910390fd5b600d54600e546011548361166c91906146c5565b61167691906146c5565b11156116b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ae90614aaa565b60405180910390fd5b600f548111156116fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f390614b3c565b60405180910390fd5b60105481601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461174a91906146c5565b111561178b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178290614bce565b60405180910390fd5b611794816128de565b6000600660146101000a81548160ff02191690831515021790555050565b6117ba612754565b6001600a60006101000a81548160ff021916908315150217905550565b6117df612754565b6000600a60016101000a81548160ff021916908315150217905550565b611804612754565b6000600a60026101000a81548160ff021916908315150217905550565b611829612754565b6000479050600073b55f2682af328743fafedeaa2252af4bdcd749fd90506000738d4daba34c92e581f928fca40e018382f7a0282a9050600073b3a05b0fecc927e32ab448415c7d0efc694fd5e490506000734fa0f099b015aefd70d9a12ba96a311abf0cbde6905060008473ffffffffffffffffffffffffffffffffffffffff166103e86005886118bb91906145ab565b6118c59190614c1d565b6040516118d190614c7f565b60006040518083038185875af1925050503d806000811461190e576040519150601f19603f3d011682016040523d82523d6000602084013e611913565b606091505b50508091505080611959576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195090614ce0565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff16606460028861197f91906145ab565b6119899190614c1d565b60405161199590614c7f565b60006040518083038185875af1925050503d80600081146119d2576040519150601f19603f3d011682016040523d82523d6000602084013e6119d7565b606091505b50508091505080611a1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1490614ce0565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff166064600988611a4391906145ab565b611a4d9190614c1d565b604051611a5990614c7f565b60006040518083038185875af1925050503d8060008114611a96576040519150601f19603f3d011682016040523d82523d6000602084013e611a9b565b606091505b50508091505080611ae1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad890614ce0565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166103e861037588611b0991906145ab565b611b139190614c1d565b604051611b1f90614c7f565b60006040518083038185875af1925050503d8060008114611b5c576040519150601f19603f3d011682016040523d82523d6000602084013e611b61565b606091505b50508091505080611ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9e90614ce0565b60405180910390fd5b505050505050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611cab576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611c2692919061491b565b6020604051808303816000875af1158015611c45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c699190614959565b611caa57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611ca19190613b46565b60405180910390fd5b5b611cb68383836129eb565b505050565b611cc481612a0b565b50565b611ccf612754565b80600b8190555050565b60105481565b611ce7612754565b600e5481600e54611cf891906146c5565b11611d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2f90614d4c565b60405180910390fd5b600d5481600e54611d4991906146c5565b1115611d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8190614db8565b60405180910390fd5b600060115414158015611dab5750600081601154611da89190614263565b10155b611dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de190614e24565b60405180910390fd5b6000600e5490508160115410611e18578160116000828254611e0c9190614263565b92505081905550611e21565b60006011819055505b60005b82811015611e6c57611e41848284611e3c91906146c5565b612b59565b600e6000815480929190611e5490614e44565b91905055508080611e6490614e44565b915050611e24565b50505050565b611e7a612754565b8060099081611e899190615038565b5050565b611e95612754565b80600f8190555050565b600080611eab83612b77565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1390615156565b60405180910390fd5b80915050919050565b611f2d612754565b601154600e54611f3d91906146c5565b8111611f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f75906151e8565b60405180910390fd5b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fef9061527a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b612047612754565b6120516000612bb4565b565b61205b612754565b80600c8190555050565b61206d612754565b80518251146120b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a89061530c565b60405180910390fd5b60005b8251811015612148578181815181106120d0576120cf61532c565b5b6020026020010151601460008584815181106120ef576120ee61532c565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061214090614e44565b9150506120b4565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461218690614332565b80601f01602080910402602001604051908101604052809291908181526020018280546121b290614332565b80156121ff5780601f106121d4576101008083540402835291602001916121ff565b820191906000526020600020905b8154815290600101906020018083116121e257829003601f168201915b5050505050905090565b600e5481565b612217612754565b6000600a60006101000a81548160ff021916908315150217905550565b61224661223f61281d565b8383612c7a565b5050565b600a60019054906101000a900460ff1681565b612265612754565b8060108190555050565b612277612754565b6001600a60026101000a81548160ff021916908315150217905550565b600a60009054906101000a900460ff1681565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156123a3576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161231e92919061491b565b6020604051808303816000875af115801561233d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123619190614959565b6123a257336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016123999190613b46565b60405180910390fd5b5b6123af84848484612de6565b50505050565b6123bd612754565b80601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b606061241082612e48565b61244f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612446906153cd565b60405180910390fd5b6060600a60029054906101000a900460ff161561248e57600960405160200161247891906154c7565b60405160208183030381529060405290506124bc565b600961249984612e89565b6040516020016124aa929190615566565b60405160208183030381529060405290505b80915050919050565b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600d5481565b600f5481565b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125a69190614263565b905090565b606060096040516020016125bf91906155e1565b604051602081830303815290604052905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61266f612754565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036126de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d590615675565b60405180910390fd5b6126e781612bb4565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61275c61281d565b73ffffffffffffffffffffffffffffffffffffffff1661277a61214d565b73ffffffffffffffffffffffffffffffffffffffff16146127d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c7906156e1565b60405180910390fd5b565b6127db81612e48565b61281a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281190615156565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661289883611e9f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000600e54905081601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461293491906146c5565b9250508190555060005b828110156129865761295b33828461295691906146c5565b612b59565b600e600081548092919061296e90614e44565b9190505550808061297e90614e44565b91505061293e565b505050565b61299c61299661281d565b82612fe9565b6129db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d290615773565b60405180910390fd5b6129e683838361307e565b505050565b612a06838383604051806020016040528060008152506122a7565b505050565b6000612a1682611e9f565b9050612a26816000846001613377565b612a2f82611e9f565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b5581600084600161349d565b5050565b612b738282604051806020016040528060008152506134a3565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cdf906157df565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612dd991906139d5565b60405180910390a3505050565b612df7612df161281d565b83612fe9565b612e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2d90615773565b60405180910390fd5b612e42848484846134fe565b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff16612e6a83612b77565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b606060008203612ed0576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612fe4565b600082905060005b60008214612f02578080612eeb90614e44565b915050600a82612efb9190614c1d565b9150612ed8565b60008167ffffffffffffffff811115612f1e57612f1d613c54565b5b6040519080825280601f01601f191660200182016040528015612f505781602001600182028036833780820191505090505b5090505b60008514612fdd57600182612f699190614263565b9150600a85612f7891906157ff565b6030612f8491906146c5565b60f81b818381518110612f9a57612f9961532c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612fd69190614c1d565b9450612f54565b8093505050505b919050565b600080612ff583611e9f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480613037575061303681856125d3565b5b8061307557508373ffffffffffffffffffffffffffffffffffffffff1661305d84610d3d565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661309e82611e9f565b73ffffffffffffffffffffffffffffffffffffffff16146130f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130eb906158a2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613163576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315a90615934565b60405180910390fd5b6131708383836001613377565b8273ffffffffffffffffffffffffffffffffffffffff1661319082611e9f565b73ffffffffffffffffffffffffffffffffffffffff16146131e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131dd906158a2565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613372838383600161349d565b505050565b600181111561349757600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461340b5780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134039190614263565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146134965780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461348e91906146c5565b925050819055505b5b50505050565b50505050565b6134ad838361355a565b6134ba6000848484613777565b6134f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134f0906159c6565b60405180910390fd5b505050565b61350984848461307e565b61351584848484613777565b613554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161354b906159c6565b60405180910390fd5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036135c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135c090615a32565b60405180910390fd5b6135d281612e48565b15613612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360990615a9e565b60405180910390fd5b613620600083836001613377565b61362981612e48565b15613669576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161366090615a9e565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461377360008383600161349d565b5050565b60006137988473ffffffffffffffffffffffffffffffffffffffff166138fe565b156138f1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026137c161281d565b8786866040518563ffffffff1660e01b81526004016137e39493929190615b13565b6020604051808303816000875af192505050801561381f57506040513d601f19601f8201168201806040525081019061381c9190615b74565b60015b6138a1573d806000811461384f576040519150601f19603f3d011682016040523d82523d6000602084013e613854565b606091505b506000815103613899576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613890906159c6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506138f6565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61396a81613935565b811461397557600080fd5b50565b60008135905061398781613961565b92915050565b6000602082840312156139a3576139a261392b565b5b60006139b184828501613978565b91505092915050565b60008115159050919050565b6139cf816139ba565b82525050565b60006020820190506139ea60008301846139c6565b92915050565b6000819050919050565b613a03816139f0565b8114613a0e57600080fd5b50565b600081359050613a20816139fa565b92915050565b600060208284031215613a3c57613a3b61392b565b5b6000613a4a84828501613a11565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613a8d578082015181840152602081019050613a72565b60008484015250505050565b6000601f19601f8301169050919050565b6000613ab582613a53565b613abf8185613a5e565b9350613acf818560208601613a6f565b613ad881613a99565b840191505092915050565b60006020820190508181036000830152613afd8184613aaa565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613b3082613b05565b9050919050565b613b4081613b25565b82525050565b6000602082019050613b5b6000830184613b37565b92915050565b613b6a81613b25565b8114613b7557600080fd5b50565b600081359050613b8781613b61565b92915050565b60008060408385031215613ba457613ba361392b565b5b6000613bb285828601613b78565b9250506020613bc385828601613a11565b9150509250929050565b613bd6816139f0565b82525050565b6000602082019050613bf16000830184613bcd565b92915050565b600080600060608486031215613c1057613c0f61392b565b5b6000613c1e86828701613b78565b9350506020613c2f86828701613b78565b9250506040613c4086828701613a11565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613c8c82613a99565b810181811067ffffffffffffffff82111715613cab57613caa613c54565b5b80604052505050565b6000613cbe613921565b9050613cca8282613c83565b919050565b600067ffffffffffffffff821115613cea57613ce9613c54565b5b613cf382613a99565b9050602081019050919050565b82818337600083830152505050565b6000613d22613d1d84613ccf565b613cb4565b905082815260208101848484011115613d3e57613d3d613c4f565b5b613d49848285613d00565b509392505050565b600082601f830112613d6657613d65613c4a565b5b8135613d76848260208601613d0f565b91505092915050565b600060208284031215613d9557613d9461392b565b5b600082013567ffffffffffffffff811115613db357613db2613930565b5b613dbf84828501613d51565b91505092915050565b600060208284031215613dde57613ddd61392b565b5b6000613dec84828501613b78565b91505092915050565b600067ffffffffffffffff821115613e1057613e0f613c54565b5b602082029050602081019050919050565b600080fd5b6000613e39613e3484613df5565b613cb4565b90508083825260208201905060208402830185811115613e5c57613e5b613e21565b5b835b81811015613e855780613e718882613b78565b845260208401935050602081019050613e5e565b5050509392505050565b600082601f830112613ea457613ea3613c4a565b5b8135613eb4848260208601613e26565b91505092915050565b600067ffffffffffffffff821115613ed857613ed7613c54565b5b602082029050602081019050919050565b6000613efc613ef784613ebd565b613cb4565b90508083825260208201905060208402830185811115613f1f57613f1e613e21565b5b835b81811015613f485780613f348882613a11565b845260208401935050602081019050613f21565b5050509392505050565b600082601f830112613f6757613f66613c4a565b5b8135613f77848260208601613ee9565b91505092915050565b60008060408385031215613f9757613f9661392b565b5b600083013567ffffffffffffffff811115613fb557613fb4613930565b5b613fc185828601613e8f565b925050602083013567ffffffffffffffff811115613fe257613fe1613930565b5b613fee85828601613f52565b9150509250929050565b614001816139ba565b811461400c57600080fd5b50565b60008135905061401e81613ff8565b92915050565b6000806040838503121561403b5761403a61392b565b5b600061404985828601613b78565b925050602061405a8582860161400f565b9150509250929050565b600067ffffffffffffffff82111561407f5761407e613c54565b5b61408882613a99565b9050602081019050919050565b60006140a86140a384614064565b613cb4565b9050828152602081018484840111156140c4576140c3613c4f565b5b6140cf848285613d00565b509392505050565b600082601f8301126140ec576140eb613c4a565b5b81356140fc848260208601614095565b91505092915050565b6000806000806080858703121561411f5761411e61392b565b5b600061412d87828801613b78565b945050602061413e87828801613b78565b935050604061414f87828801613a11565b925050606085013567ffffffffffffffff8111156141705761416f613930565b5b61417c878288016140d7565b91505092959194509250565b6000806040838503121561419f5761419e61392b565b5b60006141ad85828601613b78565b92505060206141be85828601613b78565b9150509250929050565b7f4d617820737570706c79206f766572666c6f7700000000000000000000000000600082015250565b60006141fe601383613a5e565b9150614209826141c8565b602082019050919050565b6000602082019050818103600083015261422d816141f1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061426e826139f0565b9150614279836139f0565b925082820390508181111561429157614290614234565b5b92915050565b7f4d617468204572726f7220746f20736574207265736572766520746f6b656e73600082015250565b60006142cd602083613a5e565b91506142d882614297565b602082019050919050565b600060208201905081810360008301526142fc816142c0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061434a57607f821691505b60208210810361435d5761435c614303565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006143bf602183613a5e565b91506143ca82614363565b604082019050919050565b600060208201905081810360008301526143ee816143b2565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000614451603d83613a5e565b915061445c826143f5565b604082019050919050565b6000602082019050818103600083015261448081614444565b9050919050565b7f617474656d707420746f207265656e7465722061206c6f636b65642066756e6360008201527f74696f6e00000000000000000000000000000000000000000000000000000000602082015250565b60006144e3602483613a5e565b91506144ee82614487565b604082019050919050565b60006020820190508181036000830152614512816144d6565b9050919050565b7f5765744c6973743a205765744c697374204d696e74206973206e6f7420656e6160008201527f626c652e00000000000000000000000000000000000000000000000000000000602082015250565b6000614575602483613a5e565b915061458082614519565b604082019050919050565b600060208201905081810360008301526145a481614568565b9050919050565b60006145b6826139f0565b91506145c1836139f0565b92508282026145cf816139f0565b915082820484148315176145e6576145e5614234565b5b5092915050565b7f5765744c6973743a20496e73756666696369656e742046756e64732e00000000600082015250565b6000614623601c83613a5e565b915061462e826145ed565b602082019050919050565b6000602082019050818103600083015261465281614616565b9050919050565b7f5765744c6973743a20496e76616c696420557365720000000000000000000000600082015250565b600061468f601583613a5e565b915061469a82614659565b602082019050919050565b600060208201905081810360008301526146be81614682565b9050919050565b60006146d0826139f0565b91506146db836139f0565b92508282019050808211156146f3576146f2614234565b5b92915050565b7f5765744c6973743a204e6f7420656e6f7567682061766169616c6162696c697460008201527f7900000000000000000000000000000000000000000000000000000000000000602082015250565b6000614755602183613a5e565b9150614760826146f9565b604082019050919050565b6000602082019050818103600083015261478481614748565b9050919050565b7f5765744c6973743a204d617820746f6b656e73207065722077616c6c6574206560008201527f7863656564656400000000000000000000000000000000000000000000000000602082015250565b60006147e7602783613a5e565b91506147f28261478b565b604082019050919050565b60006020820190508181036000830152614816816147da565b9050919050565b7f5765744c6973743a204d6178206d696e7420746f6b656e73207065722054726160008201527f6e73616374696f6e206578636565646564000000000000000000000000000000602082015250565b6000614879603183613a5e565b91506148848261481d565b604082019050919050565b600060208201905081810360008301526148a88161486c565b9050919050565b7f5765744c6973743a204c696d6974206578636565646564000000000000000000600082015250565b60006148e5601783613a5e565b91506148f0826148af565b602082019050919050565b60006020820190508181036000830152614914816148d8565b9050919050565b60006040820190506149306000830185613b37565b61493d6020830184613b37565b9392505050565b60008151905061495381613ff8565b92915050565b60006020828403121561496f5761496e61392b565b5b600061497d84828501614944565b91505092915050565b7f4d696e743a205075626c6963204d696e74206973206e6f74206163746976652e600082015250565b60006149bc602083613a5e565b91506149c782614986565b602082019050919050565b600060208201905081810360008301526149eb816149af565b9050919050565b7f4d696e743a20496e73756666696369656e742046756e64732e00000000000000600082015250565b6000614a28601983613a5e565b9150614a33826149f2565b602082019050919050565b60006020820190508181036000830152614a5781614a1b565b9050919050565b7f4d696e743a204e6f7420656e6f7567682061766169616c6162696c6974790000600082015250565b6000614a94601e83613a5e565b9150614a9f82614a5e565b602082019050919050565b60006020820190508181036000830152614ac381614a87565b9050919050565b7f4d696e743a204d6178204d696e7420746f6b656e7320706572207472616e736160008201527f6374696f6e206578636565646564000000000000000000000000000000000000602082015250565b6000614b26602e83613a5e565b9150614b3182614aca565b604082019050919050565b60006020820190508181036000830152614b5581614b19565b9050919050565b7f4d696e743a204d617820746f6b656e73207065722077616c6c6574206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b6000614bb8602483613a5e565b9150614bc382614b5c565b604082019050919050565b60006020820190508181036000830152614be781614bab565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614c28826139f0565b9150614c33836139f0565b925082614c4357614c42614bee565b5b828204905092915050565b600081905092915050565b50565b6000614c69600083614c4e565b9150614c7482614c59565b600082019050919050565b6000614c8a82614c5c565b9150819050919050565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b6000614cca601883613a5e565b9150614cd582614c94565b602082019050919050565b60006020820190508181036000830152614cf981614cbd565b9050919050565b7f4d617468206f766572666c6f77206572726f7200000000000000000000000000600082015250565b6000614d36601383613a5e565b9150614d4182614d00565b602082019050919050565b60006020820190508181036000830152614d6581614d29565b9050919050565b7f43616e6e6f742066696c6c206f72646572000000000000000000000000000000600082015250565b6000614da2601183613a5e565b9150614dad82614d6c565b602082019050919050565b60006020820190508181036000830152614dd181614d95565b9050919050565b7f526573657276656420746f6b656e7320656e6400000000000000000000000000600082015250565b6000614e0e601383613a5e565b9150614e1982614dd8565b602082019050919050565b60006020820190508181036000830152614e3d81614e01565b9050919050565b6000614e4f826139f0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e8157614e80614234565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614eee7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614eb1565b614ef88683614eb1565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614f35614f30614f2b846139f0565b614f10565b6139f0565b9050919050565b6000819050919050565b614f4f83614f1a565b614f63614f5b82614f3c565b848454614ebe565b825550505050565b600090565b614f78614f6b565b614f83818484614f46565b505050565b5b81811015614fa757614f9c600082614f70565b600181019050614f89565b5050565b601f821115614fec57614fbd81614e8c565b614fc684614ea1565b81016020851015614fd5578190505b614fe9614fe185614ea1565b830182614f88565b50505b505050565b600082821c905092915050565b600061500f60001984600802614ff1565b1980831691505092915050565b60006150288383614ffe565b9150826002028217905092915050565b61504182613a53565b67ffffffffffffffff81111561505a57615059613c54565b5b6150648254614332565b61506f828285614fab565b600060209050601f8311600181146150a25760008415615090578287015190505b61509a858261501c565b865550615102565b601f1984166150b086614e8c565b60005b828110156150d8578489015182556001820191506020850194506020810190506150b3565b868310156150f557848901516150f1601f891682614ffe565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000615140601883613a5e565b915061514b8261510a565b602082019050919050565b6000602082019050818103600083015261516f81615133565b9050919050565b7f496e63726561736520746865206c696d6974206f6620746f74616c20746f6b6560008201527f6e732e0000000000000000000000000000000000000000000000000000000000602082015250565b60006151d2602383613a5e565b91506151dd82615176565b604082019050919050565b60006020820190508181036000830152615201816151c5565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000615264602983613a5e565b915061526f82615208565b604082019050919050565b6000602082019050818103600083015261529381615257565b9050919050565b7f5765744c69737420456e7472793a204c656e677468206d69736d61746368206560008201527f72726f7200000000000000000000000000000000000000000000000000000000602082015250565b60006152f6602483613a5e565b91506153018261529a565b604082019050919050565b60006020820190508181036000830152615325816152e9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006153b7602f83613a5e565b91506153c28261535b565b604082019050919050565b600060208201905081810360008301526153e6816153aa565b9050919050565b600081905092915050565b6000815461540581614332565b61540f81866153ed565b9450600182166000811461542a576001811461543f57615472565b60ff1983168652811515820286019350615472565b61544885614e8c565b60005b8381101561546a5781548189015260018201915060208101905061544b565b838801955050505b50505092915050565b7f6d7973746572792e6a736f6e0000000000000000000000000000000000000000600082015250565b60006154b1600c836153ed565b91506154bc8261547b565b600c82019050919050565b60006154d382846153f8565b91506154de826154a4565b915081905092915050565b60006154f482613a53565b6154fe81856153ed565b935061550e818560208601613a6f565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006155506005836153ed565b915061555b8261551a565b600582019050919050565b600061557282856153f8565b915061557e82846154e9565b915061558982615543565b91508190509392505050565b7f636f6e74726163742e6a736f6e00000000000000000000000000000000000000600082015250565b60006155cb600d836153ed565b91506155d682615595565b600d82019050919050565b60006155ed82846153f8565b91506155f8826155be565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061565f602683613a5e565b915061566a82615603565b604082019050919050565b6000602082019050818103600083015261568e81615652565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006156cb602083613a5e565b91506156d682615695565b602082019050919050565b600060208201905081810360008301526156fa816156be565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b600061575d602d83613a5e565b915061576882615701565b604082019050919050565b6000602082019050818103600083015261578c81615750565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006157c9601983613a5e565b91506157d482615793565b602082019050919050565b600060208201905081810360008301526157f8816157bc565b9050919050565b600061580a826139f0565b9150615815836139f0565b92508261582557615824614bee565b5b828206905092915050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061588c602583613a5e565b915061589782615830565b604082019050919050565b600060208201905081810360008301526158bb8161587f565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061591e602483613a5e565b9150615929826158c2565b604082019050919050565b6000602082019050818103600083015261594d81615911565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006159b0603283613a5e565b91506159bb82615954565b604082019050919050565b600060208201905081810360008301526159df816159a3565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615a1c602083613a5e565b9150615a27826159e6565b602082019050919050565b60006020820190508181036000830152615a4b81615a0f565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615a88601c83613a5e565b9150615a9382615a52565b602082019050919050565b60006020820190508181036000830152615ab781615a7b565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615ae582615abe565b615aef8185615ac9565b9350615aff818560208601613a6f565b615b0881613a99565b840191505092915050565b6000608082019050615b286000830187613b37565b615b356020830186613b37565b615b426040830185613bcd565b8181036060830152615b548184615ada565b905095945050505050565b600081519050615b6e81613961565b92915050565b600060208284031215615b8a57615b8961392b565b5b6000615b9884828501615b5f565b9150509291505056fea264697066735822122004d20f2a1ce828364228af4f711468522d074703520905c5eb0f649870d7bb5764736f6c63430008110033
Deployed Bytecode Sourcemap
73754:9733:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53909:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80916:299;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54837:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56349:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55867:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74170:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74203:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82384:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74369:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82289:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79819:144;;;;;;;;;;;;;:::i;:::-;;77641:820;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81335:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81905:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77038:593;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79572:143;;;;;;;;;;;;;:::i;:::-;;79971:82;;;;;;;;;;;;;:::i;:::-;;80253:81;;;;;;;;;;;;;:::i;:::-;;75247:1028;;;;;;;;;;;;;:::i;:::-;;81500:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78827:73;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80698:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74335:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76283:747;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80061:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81223:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54547:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54278:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71687:103;;;;;;;;;;;;;:::i;:::-;;80806:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79118:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71039:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55006:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74268:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79723:88;;;;;;;;;;;;;:::i;:::-;;56592:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74086:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80573:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80163:78;;;;;;;;;;;;;:::i;:::-;;74051:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81673:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79434:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82562:607;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82021:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74237:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74301:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82150:131;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83177:138;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56818:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71945:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53909:305;54011:4;54063:25;54048:40;;;:11;:40;;;;:105;;;;54120:33;54105:48;;;:11;:48;;;;54048:105;:158;;;;54170:36;54194:11;54170:23;:36::i;:::-;54048:158;54028:178;;53909:305;;;:::o;80916:299::-;70925:13;:11;:13::i;:::-;81029:9:::1;;81008:17;:30;;81000:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;81115:11;;81103:9;;:23;;;;:::i;:::-;81082:17;:44;;81074:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;81190:17;81173:14;:34;;;;80916:299:::0;:::o;54837:100::-;54891:13;54924:5;54917:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54837:100;:::o;56349:171::-;56425:7;56445:23;56460:7;56445:14;:23::i;:::-;56488:15;:24;56504:7;56488:24;;;;;;;;;;;;;;;;;;;;;56481:31;;56349:171;;;:::o;55867:416::-;55948:13;55964:23;55979:7;55964:14;:23::i;:::-;55948:39;;56012:5;56006:11;;:2;:11;;;55998:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;56106:5;56090:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;56115:37;56132:5;56139:12;:10;:12::i;:::-;56115:16;:37::i;:::-;56090:62;56068:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;56254:21;56263:2;56267:7;56254:8;:21::i;:::-;55937:346;55867:416;;:::o;74170:26::-;;;;:::o;74203:27::-;;;;:::o;82384:91::-;82427:13;82460:7;82453:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82384:91;:::o;74369:29::-;;;;:::o;82289:87::-;82330:13;82363:5;82356:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82289:87;:::o;79819:144::-;70925:13;:11;:13::i;:::-;79951:4:::1;79935:13;;:20;;;;;;;;;;;;;;;;;;79819:144::o:0;77641:820::-;73164:11;;;;;;;;;;;73163:12;73155:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;73241:4;73227:11;;:18;;;;;;;;;;;;;;;;;;77723:13:::1;;;;;;;;;;;77715:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;77813:12;;77809:3;:16;;;;:::i;:::-;77796:9;:29;77788:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;77903:1;77877:11;:23;77889:10;77877:23;;;;;;;;;;;;;;;;:27;77869:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;77990:9;;77974:11;;77957:14;;77951:3;:20;;;;:::i;:::-;:34;;;;:::i;:::-;77950:49;;77942:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;78108:12;;78100:3;78072:13;:25;78086:10;78072:25;;;;;;;;;;;;;;;;:31;;;;:::i;:::-;78071:49;;78063:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;78204:12;;78197:3;:19;;78189:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;78320:11;:23;78332:10;78320:23;;;;;;;;;;;;;;;;78313:3;78288:10;:22;78299:10;78288:22;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;:55;;78280:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;78422:3;78396:10;:22;78407:10;78396:22;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;78438:15;78449:3;78438:10;:15::i;:::-;73282:5:::0;73268:11;;:19;;;;;;;;;;;;;;;;;;77641:820;:::o;81335:157::-;16974:1;15800:42;16928:43;;;:47;16924:225;;;15800:42;16997:40;;;17046:4;17053:10;16997:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16992:146;;17111:10;17092:30;;;;;;;;;;;:::i;:::-;;;;;;;;16992:146;16924:225;81447:37:::1;81466:4;81472:2;81476:7;81447:18;:37::i;:::-;81335:157:::0;;;:::o;81905:108::-;81955:7;81982:11;:23;81994:10;81982:23;;;;;;;;;;;;;;;;81975:30;;81905:108;:::o;77038:593::-;73164:11;;;;;;;;;;;73163:12;73155:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;73241:4;73227:11;;:18;;;;;;;;;;;;;;;;;;77119:16:::1;;;;;;;;;;;77111:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;77208:11;;77204:3;:15;;;;:::i;:::-;77191:9;:28;77183:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;77308:9;;77292:11;;77275:14;;77269:3;:20;;;;:::i;:::-;:34;;;;:::i;:::-;77268:49;;77260:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;77398:12;;77391:3;:19;;77383:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;77516:12;;77508:3;77480:13;:25;77494:10;77480:25;;;;;;;;;;;;;;;;:31;;;;:::i;:::-;77479:49;;77471:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;77608:15;77619:3;77608:10;:15::i;:::-;73282:5:::0;73268:11;;:19;;;;;;;;;;;;;;;;;;77038:593;:::o;79572:143::-;70925:13;:11;:13::i;:::-;79703:4:::1;79684:16;;:23;;;;;;;;;;;;;;;;;;79572:143::o:0;79971:82::-;70925:13;:11;:13::i;:::-;80040:5:::1;80024:13;;:21;;;;;;;;;;;;;;;;;;79971:82::o:0;80253:81::-;70925:13;:11;:13::i;:::-;80321:5:::1;80307:11;;:19;;;;;;;;;;;;;;;;;;80253:81::o:0;75247:1028::-;70925:13;:11;:13::i;:::-;75297:18:::1;75318:21;75297:42;;75360:11;75382:42;75360:65;;75436:11;75458:42;75436:65;;75512:12;75535:42;75512:66;;75589:11;75611:42;75589:65;;75683:12;75720:3;:8;;75754:4;75751:1;75738:10;:14;;;;:::i;:::-;75737:21;;;;:::i;:::-;75720:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75706:58;;;;;75793:7;75785:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;75864:3;:8;;75898:3;75895:1;75882:10;:14;;;;:::i;:::-;75881:20;;;;:::i;:::-;75864:43;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75850:57;;;;;75935:7;75927:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;76006:4;:9;;76041:3;76038:1;76025:10;:14;;;;:::i;:::-;76024:20;;;;:::i;:::-;76006:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75992:58;;;;;76076:7;76068:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;76139:3;:8;;76175:4;76170:3;76157:10;:16;;;;:::i;:::-;76156:23;;;;:::i;:::-;76139:46;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76125:60;;;;;76216:7;76208:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;75286:989;;;;;;75247:1028::o:0;81500:165::-;16974:1;15800:42;16928:43;;;:47;16924:225;;;15800:42;16997:40;;;17046:4;17053:10;16997:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16992:146;;17111:10;17092:30;;;;;;;;;;;:::i;:::-;;;;;;;;16992:146;16924:225;81616:41:::1;81639:4;81645:2;81649:7;81616:22;:41::i;:::-;81500:165:::0;;;:::o;78827:73::-;78878:14;78884:7;78878:5;:14::i;:::-;78827:73;:::o;80698:100::-;70925:13;:11;:13::i;:::-;80782:8:::1;80768:11;:22;;;;80698:100:::0;:::o;74335:27::-;;;;:::o;76283:747::-;70925:13;:11;:13::i;:::-;76388:11:::1;;76381:3;76367:11;;:17;;;;:::i;:::-;76366:33;76358:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;76465:9;;76457:3;76443:11;;:17;;;;:::i;:::-;76442:32;;76434:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;76534:1;76516:14;;:19;;76515:52;;;;;76565:1;76558:3;76541:14;;:20;;;;:::i;:::-;:25;;76515:52;76507:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;76612:21;76636:11;;76612:35;;76725:3;76707:14;;:21;76703:126;;76763:3;76745:14;;:21;;;;;;;:::i;:::-;;;;;;;;76703:126;;;76816:1;76799:14;:18;;;;76703:126;76853:9;76849:174;76872:3;76868:1;:7;76849:174;;;76897:33;76907:3;76928:1;76912:13;:17;;;;:::i;:::-;76897:9;:33::i;:::-;76945:11;;:14;;;;;;;;;:::i;:::-;;;;;;76877:3;;;;;:::i;:::-;;;;76849:174;;;;76347:683;76283:747:::0;;:::o;80061:94::-;70925:13;:11;:13::i;:::-;80141:6:::1;80131:7;:16;;;;;;:::i;:::-;;80061:94:::0;:::o;81223:104::-;70925:13;:11;:13::i;:::-;81310:9:::1;81295:12;:24;;;;81223:104:::0;:::o;54547:223::-;54619:7;54639:13;54655:17;54664:7;54655:8;:17::i;:::-;54639:33;;54708:1;54691:19;;:5;:19;;;54683:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;54757:5;54750:12;;;54547:223;;;:::o;80342:::-;70925:13;:11;:13::i;:::-;80453:14:::1;;80439:11;;:28;;;;:::i;:::-;80423:13;:44;80414:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;80544:13;80532:9;:25;;;;80342:223:::0;:::o;54278:207::-;54350:7;54395:1;54378:19;;:5;:19;;;54370:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54461:9;:16;54471:5;54461:16;;;;;;;;;;;;;;;;54454:23;;54278:207;;;:::o;71687:103::-;70925:13;:11;:13::i;:::-;71752:30:::1;71779:1;71752:18;:30::i;:::-;71687:103::o:0;80806:102::-;70925:13;:11;:13::i;:::-;80892:8:::1;80877:12;:23;;;;80806:102:::0;:::o;79118:308::-;70925:13;:11;:13::i;:::-;79251:3:::1;:10;79232:8;:15;:29;79224:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;79318:9;79313:106;79337:8;:15;79333:1;:19;79313:106;;;79401:3;79405:1;79401:6;;;;;;;;:::i;:::-;;;;;;;;79374:11;:24;79386:8;79395:1;79386:11;;;;;;;;:::i;:::-;;;;;;;;79374:24;;;;;;;;;;;;;;;:33;;;;79354:3;;;;;:::i;:::-;;;;79313:106;;;;79118:308:::0;;:::o;71039:87::-;71085:7;71112:6;;;;;;;;;;;71105:13;;71039:87;:::o;55006:104::-;55062:13;55095:7;55088:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55006:104;:::o;74268:26::-;;;;:::o;79723:88::-;70925:13;:11;:13::i;:::-;79798:5:::1;79779:16;;:24;;;;;;;;;;;;;;;;;;79723:88::o:0;56592:155::-;56687:52;56706:12;:10;:12::i;:::-;56720:8;56730;56687:18;:52::i;:::-;56592:155;;:::o;74086:25::-;;;;;;;;;;;;;:::o;80573:117::-;70925:13;:11;:13::i;:::-;80667:15:::1;80652:12;:30;;;;80573:117:::0;:::o;80163:78::-;70925:13;:11;:13::i;:::-;80229:4:::1;80215:11;;:18;;;;;;;;;;;;;;;;;;80163:78::o:0;74051:28::-;;;;;;;;;;;;;:::o;81673:222::-;16974:1;15800:42;16928:43;;;:47;16924:225;;;15800:42;16997:40;;;17046:4;17053:10;16997:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16992:146;;17111:10;17092:30;;;;;;;;;;;:::i;:::-;;;;;;;;16992:146;16924:225;81840:47:::1;81863:4;81869:2;81873:7;81882:4;81840:22;:47::i;:::-;81673:222:::0;;;;:::o;79434:124::-;70925:13;:11;:13::i;:::-;79546:4:::1;79520:11;:23;79533:8;79520:23;;;;;;;;;;;;;;;:30;;;;79434:124:::0;;:::o;82562:607::-;82635:13;82668:16;82676:7;82668;:16::i;:::-;82660:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;82757:22;82804:11;;;;;;;;;;;82800:326;;;82906:7;82889:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;82871:60;;82800:326;;;83057:7;83066:17;83075:7;83066:8;:17::i;:::-;83040:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;83022:72;;82800:326;83153:8;83146:15;;;82562:607;;;:::o;82021:121::-;82086:7;82113:11;:21;82125:8;82113:21;;;;;;;;;;;;;;;;82106:28;;82021:121;;;:::o;74237:24::-;;;;:::o;74301:27::-;;;;:::o;82150:131::-;82200:7;82251:10;:22;82262:10;82251:22;;;;;;;;;;;;;;;;82227:11;:23;82239:10;82227:23;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;82220:53;;82150:131;:::o;83177:138::-;83221:13;83282:7;83265:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;83251:56;;83177:138;:::o;56818:164::-;56915:4;56939:18;:25;56958:5;56939:25;;;;;;;;;;;;;;;:35;56965:8;56939:35;;;;;;;;;;;;;;;;;;;;;;;;;56932:42;;56818:164;;;;:::o;71945:201::-;70925:13;:11;:13::i;:::-;72054:1:::1;72034:22;;:8;:22;;::::0;72026:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;72110:28;72129:8;72110:18;:28::i;:::-;71945:201:::0;:::o;45308:157::-;45393:4;45432:25;45417:40;;;:11;:40;;;;45410:47;;45308:157;;;:::o;71204:132::-;71279:12;:10;:12::i;:::-;71268:23;;:7;:5;:7::i;:::-;:23;;;71260:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71204:132::o;66168:135::-;66250:16;66258:7;66250;:16::i;:::-;66242:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;66168:135;:::o;52233:98::-;52286:7;52313:10;52306:17;;52233:98;:::o;65447:174::-;65549:2;65522:15;:24;65538:7;65522:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;65605:7;65601:2;65567:46;;65576:23;65591:7;65576:14;:23::i;:::-;65567:46;;;;;;;;;;;;65447:174;;:::o;78470:290::-;78521:21;78545:11;;78521:35;;78597:3;78568:13;:25;78582:10;78568:25;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;78622:9;78618:129;78641:3;78637:1;:7;78618:129;;;78666:40;78676:10;78704:1;78688:13;:17;;;;:::i;:::-;78666:9;:40::i;:::-;78721:11;;:14;;;;;;;;;:::i;:::-;;;;;;78646:3;;;;;:::i;:::-;;;;78618:129;;;;78510:250;78470:290;:::o;57049:335::-;57244:41;57263:12;:10;:12::i;:::-;57277:7;57244:18;:41::i;:::-;57236:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;57348:28;57358:4;57364:2;57368:7;57348:9;:28::i;:::-;57049:335;;;:::o;57455:185::-;57593:39;57610:4;57616:2;57620:7;57593:39;;;;;;;;;;;;:16;:39::i;:::-;57455:185;;;:::o;62945:783::-;63005:13;63021:23;63036:7;63021:14;:23::i;:::-;63005:39;;63057:51;63078:5;63093:1;63097:7;63106:1;63057:20;:51::i;:::-;63221:23;63236:7;63221:14;:23::i;:::-;63213:31;;63292:15;:24;63308:7;63292:24;;;;;;;;;;;;63285:31;;;;;;;;;;;63557:1;63537:9;:16;63547:5;63537:16;;;;;;;;;;;;;;;;:21;;;;;;;;;;;63587:7;:16;63595:7;63587:16;;;;;;;;;;;;63580:23;;;;;;;;;;;63649:7;63645:1;63621:36;;63630:5;63621:36;;;;;;;;;;;;63670:50;63690:5;63705:1;63709:7;63718:1;63670:19;:50::i;:::-;62994:734;62945:783;:::o;60672:110::-;60748:26;60758:2;60762:7;60748:26;;;;;;;;;;;;:9;:26::i;:::-;60672:110;;:::o;59341:117::-;59407:7;59434;:16;59442:7;59434:16;;;;;;;;;;;;;;;;;;;;;59427:23;;59341:117;;;:::o;72306:191::-;72380:16;72399:6;;;;;;;;;;;72380:25;;72425:8;72416:6;;:17;;;;;;;;;;;;;;;;;;72480:8;72449:40;;72470:8;72449:40;;;;;;;;;;;;72369:128;72306:191;:::o;65764:315::-;65919:8;65910:17;;:5;:17;;;65902:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;66006:8;65968:18;:25;65987:5;65968:25;;;;;;;;;;;;;;;:35;65994:8;65968:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;66052:8;66030:41;;66045:5;66030:41;;;66062:8;66030:41;;;;;;:::i;:::-;;;;;;;;65764:315;;;:::o;57711:322::-;57885:41;57904:12;:10;:12::i;:::-;57918:7;57885:18;:41::i;:::-;57877:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;57987:38;58001:4;58007:2;58011:7;58020:4;57987:13;:38::i;:::-;57711:322;;;;:::o;59771:128::-;59836:4;59889:1;59860:31;;:17;59869:7;59860:8;:17::i;:::-;:31;;;;59853:38;;59771:128;;;:::o;72540:532::-;72596:13;72635:1;72626:5;:10;72622:53;;72653:10;;;;;;;;;;;;;;;;;;;;;72622:53;72685:12;72700:5;72685:20;;72716:14;72741:78;72756:1;72748:4;:9;72741:78;;72774:8;;;;;:::i;:::-;;;;72805:2;72797:10;;;;;:::i;:::-;;;72741:78;;;72829:19;72861:6;72851:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72829:39;;72879:154;72895:1;72886:5;:10;72879:154;;72923:1;72913:11;;;;;:::i;:::-;;;72990:2;72982:5;:10;;;;:::i;:::-;72969:2;:24;;;;:::i;:::-;72956:39;;72939:6;72946;72939:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;73019:2;73010:11;;;;;:::i;:::-;;;72879:154;;;73057:6;73043:21;;;;;72540:532;;;;:::o;60066:264::-;60159:4;60176:13;60192:23;60207:7;60192:14;:23::i;:::-;60176:39;;60245:5;60234:16;;:7;:16;;;:52;;;;60254:32;60271:5;60278:7;60254:16;:32::i;:::-;60234:52;:87;;;;60314:7;60290:31;;:20;60302:7;60290:11;:20::i;:::-;:31;;;60234:87;60226:96;;;60066:264;;;;:::o;64065:1263::-;64224:4;64197:31;;:23;64212:7;64197:14;:23::i;:::-;:31;;;64189:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;64303:1;64289:16;;:2;:16;;;64281:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;64359:42;64380:4;64386:2;64390:7;64399:1;64359:20;:42::i;:::-;64531:4;64504:31;;:23;64519:7;64504:14;:23::i;:::-;:31;;;64496:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;64649:15;:24;64665:7;64649:24;;;;;;;;;;;;64642:31;;;;;;;;;;;65144:1;65125:9;:15;65135:4;65125:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;65177:1;65160:9;:13;65170:2;65160:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;65219:2;65200:7;:16;65208:7;65200:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;65258:7;65254:2;65239:27;;65248:4;65239:27;;;;;;;;;;;;65279:41;65299:4;65305:2;65309:7;65318:1;65279:19;:41::i;:::-;64065:1263;;;:::o;68452:410::-;68642:1;68630:9;:13;68626:229;;;68680:1;68664:18;;:4;:18;;;68660:87;;68722:9;68703;:15;68713:4;68703:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;68660:87;68779:1;68765:16;;:2;:16;;;68761:83;;68819:9;68802;:13;68812:2;68802:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;68761:83;68626:229;68452:410;;;;:::o;69584:158::-;;;;;:::o;61009:319::-;61138:18;61144:2;61148:7;61138:5;:18::i;:::-;61189:53;61220:1;61224:2;61228:7;61237:4;61189:22;:53::i;:::-;61167:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;61009:319;;;:::o;58914:313::-;59070:28;59080:4;59086:2;59090:7;59070:9;:28::i;:::-;59117:47;59140:4;59146:2;59150:7;59159:4;59117:22;:47::i;:::-;59109:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;58914:313;;;;:::o;61664:942::-;61758:1;61744:16;;:2;:16;;;61736:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;61817:16;61825:7;61817;:16::i;:::-;61816:17;61808:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;61879:48;61908:1;61912:2;61916:7;61925:1;61879:20;:48::i;:::-;62026:16;62034:7;62026;:16::i;:::-;62025:17;62017:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;62441:1;62424:9;:13;62434:2;62424:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;62485:2;62466:7;:16;62474:7;62466:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;62530:7;62526:2;62505:33;;62522:1;62505:33;;;;;;;;;;;;62551:47;62579:1;62583:2;62587:7;62596:1;62551:19;:47::i;:::-;61664:942;;:::o;66867:853::-;67021:4;67042:15;:2;:13;;;:15::i;:::-;67038:675;;;67094:2;67078:36;;;67115:12;:10;:12::i;:::-;67129:4;67135:7;67144:4;67078:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;67074:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67336:1;67319:6;:13;:18;67315:328;;67362:60;;;;;;;;;;:::i;:::-;;;;;;;;67315:328;67593:6;67587:13;67578:6;67574:2;67570:15;67563:38;67074:584;67210:41;;;67200:51;;;:6;:51;;;;67193:58;;;;;67038:675;67697:4;67690:11;;66867:853;;;;;;;:::o;34113:326::-;34173:4;34430:1;34408:7;:19;;;:23;34401:30;;34113:326;;;:::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:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:122::-;1674:24;1692:5;1674:24;:::i;:::-;1667:5;1664:35;1654:63;;1713:1;1710;1703:12;1654:63;1601:122;:::o;1729:139::-;1775:5;1813:6;1800:20;1791:29;;1829:33;1856:5;1829:33;:::i;:::-;1729:139;;;;:::o;1874:329::-;1933:6;1982:2;1970:9;1961:7;1957:23;1953:32;1950:119;;;1988:79;;:::i;:::-;1950:119;2108:1;2133:53;2178:7;2169:6;2158:9;2154:22;2133:53;:::i;:::-;2123:63;;2079:117;1874:329;;;;:::o;2209:99::-;2261:6;2295:5;2289:12;2279:22;;2209:99;;;:::o;2314:169::-;2398:11;2432:6;2427:3;2420:19;2472:4;2467:3;2463:14;2448:29;;2314:169;;;;:::o;2489:246::-;2570:1;2580:113;2594:6;2591:1;2588:13;2580:113;;;2679:1;2674:3;2670:11;2664:18;2660:1;2655:3;2651:11;2644:39;2616:2;2613:1;2609:10;2604:15;;2580:113;;;2727:1;2718:6;2713:3;2709:16;2702:27;2551:184;2489:246;;;:::o;2741:102::-;2782:6;2833:2;2829:7;2824:2;2817:5;2813:14;2809:28;2799:38;;2741:102;;;:::o;2849:377::-;2937:3;2965:39;2998:5;2965:39;:::i;:::-;3020:71;3084:6;3079:3;3020:71;:::i;:::-;3013:78;;3100:65;3158:6;3153:3;3146:4;3139:5;3135:16;3100:65;:::i;:::-;3190:29;3212:6;3190:29;:::i;:::-;3185:3;3181:39;3174:46;;2941:285;2849:377;;;;:::o;3232:313::-;3345:4;3383:2;3372:9;3368:18;3360:26;;3432:9;3426:4;3422:20;3418:1;3407:9;3403:17;3396:47;3460:78;3533:4;3524:6;3460:78;:::i;:::-;3452:86;;3232:313;;;;:::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:117::-;5976:1;5973;5966:12;5990:117;6099:1;6096;6089:12;6113:180;6161:77;6158:1;6151:88;6258:4;6255:1;6248:15;6282:4;6279:1;6272:15;6299:281;6382:27;6404:4;6382:27;:::i;:::-;6374:6;6370:40;6512:6;6500:10;6497:22;6476:18;6464:10;6461:34;6458:62;6455:88;;;6523:18;;:::i;:::-;6455:88;6563:10;6559:2;6552:22;6342:238;6299:281;;:::o;6586:129::-;6620:6;6647:20;;:::i;:::-;6637:30;;6676:33;6704:4;6696:6;6676:33;:::i;:::-;6586:129;;;:::o;6721:308::-;6783:4;6873:18;6865:6;6862:30;6859:56;;;6895:18;;:::i;:::-;6859:56;6933:29;6955:6;6933:29;:::i;:::-;6925:37;;7017:4;7011;7007:15;6999:23;;6721:308;;;:::o;7035:146::-;7132:6;7127:3;7122;7109:30;7173:1;7164:6;7159:3;7155:16;7148:27;7035:146;;;:::o;7187:425::-;7265:5;7290:66;7306:49;7348:6;7306:49;:::i;:::-;7290:66;:::i;:::-;7281:75;;7379:6;7372:5;7365:21;7417:4;7410:5;7406:16;7455:3;7446:6;7441:3;7437:16;7434:25;7431:112;;;7462:79;;:::i;:::-;7431:112;7552:54;7599:6;7594:3;7589;7552:54;:::i;:::-;7271:341;7187:425;;;;;:::o;7632:340::-;7688:5;7737:3;7730:4;7722:6;7718:17;7714:27;7704:122;;7745:79;;:::i;:::-;7704:122;7862:6;7849:20;7887:79;7962:3;7954:6;7947:4;7939:6;7935:17;7887:79;:::i;:::-;7878:88;;7694:278;7632:340;;;;:::o;7978:509::-;8047:6;8096:2;8084:9;8075:7;8071:23;8067:32;8064:119;;;8102:79;;:::i;:::-;8064:119;8250:1;8239:9;8235:17;8222:31;8280:18;8272:6;8269:30;8266:117;;;8302:79;;:::i;:::-;8266:117;8407:63;8462:7;8453:6;8442:9;8438:22;8407:63;:::i;:::-;8397:73;;8193:287;7978:509;;;;:::o;8493:329::-;8552:6;8601:2;8589:9;8580:7;8576:23;8572:32;8569:119;;;8607:79;;:::i;:::-;8569:119;8727:1;8752:53;8797:7;8788:6;8777:9;8773:22;8752:53;:::i;:::-;8742:63;;8698:117;8493:329;;;;:::o;8828:311::-;8905:4;8995:18;8987:6;8984:30;8981:56;;;9017:18;;:::i;:::-;8981:56;9067:4;9059:6;9055:17;9047:25;;9127:4;9121;9117:15;9109:23;;8828:311;;;:::o;9145:117::-;9254:1;9251;9244:12;9285:710;9381:5;9406:81;9422:64;9479:6;9422:64;:::i;:::-;9406:81;:::i;:::-;9397:90;;9507:5;9536:6;9529:5;9522:21;9570:4;9563:5;9559:16;9552:23;;9623:4;9615:6;9611:17;9603:6;9599:30;9652:3;9644:6;9641:15;9638:122;;;9671:79;;:::i;:::-;9638:122;9786:6;9769:220;9803:6;9798:3;9795:15;9769:220;;;9878:3;9907:37;9940:3;9928:10;9907:37;:::i;:::-;9902:3;9895:50;9974:4;9969:3;9965:14;9958:21;;9845:144;9829:4;9824:3;9820:14;9813:21;;9769:220;;;9773:21;9387:608;;9285:710;;;;;:::o;10018:370::-;10089:5;10138:3;10131:4;10123:6;10119:17;10115:27;10105:122;;10146:79;;:::i;:::-;10105:122;10263:6;10250:20;10288:94;10378:3;10370:6;10363:4;10355:6;10351:17;10288:94;:::i;:::-;10279:103;;10095:293;10018:370;;;;:::o;10394:311::-;10471:4;10561:18;10553:6;10550:30;10547:56;;;10583:18;;:::i;:::-;10547:56;10633:4;10625:6;10621:17;10613:25;;10693:4;10687;10683:15;10675:23;;10394:311;;;:::o;10728:710::-;10824:5;10849:81;10865:64;10922:6;10865:64;:::i;:::-;10849:81;:::i;:::-;10840:90;;10950:5;10979:6;10972:5;10965:21;11013:4;11006:5;11002:16;10995:23;;11066:4;11058:6;11054:17;11046:6;11042:30;11095:3;11087:6;11084:15;11081:122;;;11114:79;;:::i;:::-;11081:122;11229:6;11212:220;11246:6;11241:3;11238:15;11212:220;;;11321:3;11350:37;11383:3;11371:10;11350:37;:::i;:::-;11345:3;11338:50;11417:4;11412:3;11408:14;11401:21;;11288:144;11272:4;11267:3;11263:14;11256:21;;11212:220;;;11216:21;10830:608;;10728:710;;;;;:::o;11461:370::-;11532:5;11581:3;11574:4;11566:6;11562:17;11558:27;11548:122;;11589:79;;:::i;:::-;11548:122;11706:6;11693:20;11731:94;11821:3;11813:6;11806:4;11798:6;11794:17;11731:94;:::i;:::-;11722:103;;11538:293;11461:370;;;;:::o;11837:894::-;11955:6;11963;12012:2;12000:9;11991:7;11987:23;11983:32;11980:119;;;12018:79;;:::i;:::-;11980:119;12166:1;12155:9;12151:17;12138:31;12196:18;12188:6;12185:30;12182:117;;;12218:79;;:::i;:::-;12182:117;12323:78;12393:7;12384:6;12373:9;12369:22;12323:78;:::i;:::-;12313:88;;12109:302;12478:2;12467:9;12463:18;12450:32;12509:18;12501:6;12498:30;12495:117;;;12531:79;;:::i;:::-;12495:117;12636:78;12706:7;12697:6;12686:9;12682:22;12636:78;:::i;:::-;12626:88;;12421:303;11837:894;;;;;:::o;12737:116::-;12807:21;12822:5;12807:21;:::i;:::-;12800:5;12797:32;12787:60;;12843:1;12840;12833:12;12787:60;12737:116;:::o;12859:133::-;12902:5;12940:6;12927:20;12918:29;;12956:30;12980:5;12956:30;:::i;:::-;12859:133;;;;:::o;12998:468::-;13063:6;13071;13120:2;13108:9;13099:7;13095:23;13091:32;13088:119;;;13126:79;;:::i;:::-;13088:119;13246:1;13271:53;13316:7;13307:6;13296:9;13292:22;13271:53;:::i;:::-;13261:63;;13217:117;13373:2;13399:50;13441:7;13432:6;13421:9;13417:22;13399:50;:::i;:::-;13389:60;;13344:115;12998:468;;;;;:::o;13472:307::-;13533:4;13623:18;13615:6;13612:30;13609:56;;;13645:18;;:::i;:::-;13609:56;13683:29;13705:6;13683:29;:::i;:::-;13675:37;;13767:4;13761;13757:15;13749:23;;13472:307;;;:::o;13785:423::-;13862:5;13887:65;13903:48;13944:6;13903:48;:::i;:::-;13887:65;:::i;:::-;13878:74;;13975:6;13968:5;13961:21;14013:4;14006:5;14002:16;14051:3;14042:6;14037:3;14033:16;14030:25;14027:112;;;14058:79;;:::i;:::-;14027:112;14148:54;14195:6;14190:3;14185;14148:54;:::i;:::-;13868:340;13785:423;;;;;:::o;14227:338::-;14282:5;14331:3;14324:4;14316:6;14312:17;14308:27;14298:122;;14339:79;;:::i;:::-;14298:122;14456:6;14443:20;14481:78;14555:3;14547:6;14540:4;14532:6;14528:17;14481:78;:::i;:::-;14472:87;;14288:277;14227:338;;;;:::o;14571:943::-;14666:6;14674;14682;14690;14739:3;14727:9;14718:7;14714:23;14710:33;14707:120;;;14746:79;;:::i;:::-;14707:120;14866:1;14891:53;14936:7;14927:6;14916:9;14912:22;14891:53;:::i;:::-;14881:63;;14837:117;14993:2;15019:53;15064:7;15055:6;15044:9;15040:22;15019:53;:::i;:::-;15009:63;;14964:118;15121:2;15147:53;15192:7;15183:6;15172:9;15168:22;15147:53;:::i;:::-;15137:63;;15092:118;15277:2;15266:9;15262:18;15249:32;15308:18;15300:6;15297:30;15294:117;;;15330:79;;:::i;:::-;15294:117;15435:62;15489:7;15480:6;15469:9;15465:22;15435:62;:::i;:::-;15425:72;;15220:287;14571:943;;;;;;;:::o;15520:474::-;15588:6;15596;15645:2;15633:9;15624:7;15620:23;15616:32;15613:119;;;15651:79;;:::i;:::-;15613:119;15771:1;15796:53;15841:7;15832:6;15821:9;15817:22;15796:53;:::i;:::-;15786:63;;15742:117;15898:2;15924:53;15969:7;15960:6;15949:9;15945:22;15924:53;:::i;:::-;15914:63;;15869:118;15520:474;;;;;:::o;16000:169::-;16140:21;16136:1;16128:6;16124:14;16117:45;16000:169;:::o;16175:366::-;16317:3;16338:67;16402:2;16397:3;16338:67;:::i;:::-;16331:74;;16414:93;16503:3;16414:93;:::i;:::-;16532:2;16527:3;16523:12;16516:19;;16175:366;;;:::o;16547:419::-;16713:4;16751:2;16740:9;16736:18;16728:26;;16800:9;16794:4;16790:20;16786:1;16775:9;16771:17;16764:47;16828:131;16954:4;16828:131;:::i;:::-;16820:139;;16547:419;;;:::o;16972:180::-;17020:77;17017:1;17010:88;17117:4;17114:1;17107:15;17141:4;17138:1;17131:15;17158:194;17198:4;17218:20;17236:1;17218:20;:::i;:::-;17213:25;;17252:20;17270:1;17252:20;:::i;:::-;17247:25;;17296:1;17293;17289:9;17281:17;;17320:1;17314:4;17311:11;17308:37;;;17325:18;;:::i;:::-;17308:37;17158:194;;;;:::o;17358:182::-;17498:34;17494:1;17486:6;17482:14;17475:58;17358:182;:::o;17546:366::-;17688:3;17709:67;17773:2;17768:3;17709:67;:::i;:::-;17702:74;;17785:93;17874:3;17785:93;:::i;:::-;17903:2;17898:3;17894:12;17887:19;;17546:366;;;:::o;17918:419::-;18084:4;18122:2;18111:9;18107:18;18099:26;;18171:9;18165:4;18161:20;18157:1;18146:9;18142:17;18135:47;18199:131;18325:4;18199:131;:::i;:::-;18191:139;;17918:419;;;:::o;18343:180::-;18391:77;18388:1;18381:88;18488:4;18485:1;18478:15;18512:4;18509:1;18502:15;18529:320;18573:6;18610:1;18604:4;18600:12;18590:22;;18657:1;18651:4;18647:12;18678:18;18668:81;;18734:4;18726:6;18722:17;18712:27;;18668:81;18796:2;18788:6;18785:14;18765:18;18762:38;18759:84;;18815:18;;:::i;:::-;18759:84;18580:269;18529:320;;;:::o;18855:220::-;18995:34;18991:1;18983:6;18979:14;18972:58;19064:3;19059:2;19051:6;19047:15;19040:28;18855:220;:::o;19081:366::-;19223:3;19244:67;19308:2;19303:3;19244:67;:::i;:::-;19237:74;;19320:93;19409:3;19320:93;:::i;:::-;19438:2;19433:3;19429:12;19422:19;;19081:366;;;:::o;19453:419::-;19619:4;19657:2;19646:9;19642:18;19634:26;;19706:9;19700:4;19696:20;19692:1;19681:9;19677:17;19670:47;19734:131;19860:4;19734:131;:::i;:::-;19726:139;;19453:419;;;:::o;19878:248::-;20018:34;20014:1;20006:6;20002:14;19995:58;20087:31;20082:2;20074:6;20070:15;20063:56;19878:248;:::o;20132:366::-;20274:3;20295:67;20359:2;20354:3;20295:67;:::i;:::-;20288:74;;20371:93;20460:3;20371:93;:::i;:::-;20489:2;20484:3;20480:12;20473:19;;20132:366;;;:::o;20504:419::-;20670:4;20708:2;20697:9;20693:18;20685:26;;20757:9;20751:4;20747:20;20743:1;20732:9;20728:17;20721:47;20785:131;20911:4;20785:131;:::i;:::-;20777:139;;20504:419;;;:::o;20929:223::-;21069:34;21065:1;21057:6;21053:14;21046:58;21138:6;21133:2;21125:6;21121:15;21114:31;20929:223;:::o;21158:366::-;21300:3;21321:67;21385:2;21380:3;21321:67;:::i;:::-;21314:74;;21397:93;21486:3;21397:93;:::i;:::-;21515:2;21510:3;21506:12;21499:19;;21158:366;;;:::o;21530:419::-;21696:4;21734:2;21723:9;21719:18;21711:26;;21783:9;21777:4;21773:20;21769:1;21758:9;21754:17;21747:47;21811:131;21937:4;21811:131;:::i;:::-;21803:139;;21530:419;;;:::o;21955:223::-;22095:34;22091:1;22083:6;22079:14;22072:58;22164:6;22159:2;22151:6;22147:15;22140:31;21955:223;:::o;22184:366::-;22326:3;22347:67;22411:2;22406:3;22347:67;:::i;:::-;22340:74;;22423:93;22512:3;22423:93;:::i;:::-;22541:2;22536:3;22532:12;22525:19;;22184:366;;;:::o;22556:419::-;22722:4;22760:2;22749:9;22745:18;22737:26;;22809:9;22803:4;22799:20;22795:1;22784:9;22780:17;22773:47;22837:131;22963:4;22837:131;:::i;:::-;22829:139;;22556:419;;;:::o;22981:410::-;23021:7;23044:20;23062:1;23044:20;:::i;:::-;23039:25;;23078:20;23096:1;23078:20;:::i;:::-;23073:25;;23133:1;23130;23126:9;23155:30;23173:11;23155:30;:::i;:::-;23144:41;;23334:1;23325:7;23321:15;23318:1;23315:22;23295:1;23288:9;23268:83;23245:139;;23364:18;;:::i;:::-;23245:139;23029:362;22981:410;;;;:::o;23397:178::-;23537:30;23533:1;23525:6;23521:14;23514:54;23397:178;:::o;23581:366::-;23723:3;23744:67;23808:2;23803:3;23744:67;:::i;:::-;23737:74;;23820:93;23909:3;23820:93;:::i;:::-;23938:2;23933:3;23929:12;23922:19;;23581:366;;;:::o;23953:419::-;24119:4;24157:2;24146:9;24142:18;24134:26;;24206:9;24200:4;24196:20;24192:1;24181:9;24177:17;24170:47;24234:131;24360:4;24234:131;:::i;:::-;24226:139;;23953:419;;;:::o;24378:171::-;24518:23;24514:1;24506:6;24502:14;24495:47;24378:171;:::o;24555:366::-;24697:3;24718:67;24782:2;24777:3;24718:67;:::i;:::-;24711:74;;24794:93;24883:3;24794:93;:::i;:::-;24912:2;24907:3;24903:12;24896:19;;24555:366;;;:::o;24927:419::-;25093:4;25131:2;25120:9;25116:18;25108:26;;25180:9;25174:4;25170:20;25166:1;25155:9;25151:17;25144:47;25208:131;25334:4;25208:131;:::i;:::-;25200:139;;24927:419;;;:::o;25352:191::-;25392:3;25411:20;25429:1;25411:20;:::i;:::-;25406:25;;25445:20;25463:1;25445:20;:::i;:::-;25440:25;;25488:1;25485;25481:9;25474:16;;25509:3;25506:1;25503:10;25500:36;;;25516:18;;:::i;:::-;25500:36;25352:191;;;;:::o;25549:220::-;25689:34;25685:1;25677:6;25673:14;25666:58;25758:3;25753:2;25745:6;25741:15;25734:28;25549:220;:::o;25775:366::-;25917:3;25938:67;26002:2;25997:3;25938:67;:::i;:::-;25931:74;;26014:93;26103:3;26014:93;:::i;:::-;26132:2;26127:3;26123:12;26116:19;;25775:366;;;:::o;26147:419::-;26313:4;26351:2;26340:9;26336:18;26328:26;;26400:9;26394:4;26390:20;26386:1;26375:9;26371:17;26364:47;26428:131;26554:4;26428:131;:::i;:::-;26420:139;;26147:419;;;:::o;26572:226::-;26712:34;26708:1;26700:6;26696:14;26689:58;26781:9;26776:2;26768:6;26764:15;26757:34;26572:226;:::o;26804:366::-;26946:3;26967:67;27031:2;27026:3;26967:67;:::i;:::-;26960:74;;27043:93;27132:3;27043:93;:::i;:::-;27161:2;27156:3;27152:12;27145:19;;26804:366;;;:::o;27176:419::-;27342:4;27380:2;27369:9;27365:18;27357:26;;27429:9;27423:4;27419:20;27415:1;27404:9;27400:17;27393:47;27457:131;27583:4;27457:131;:::i;:::-;27449:139;;27176:419;;;:::o;27601:236::-;27741:34;27737:1;27729:6;27725:14;27718:58;27810:19;27805:2;27797:6;27793:15;27786:44;27601:236;:::o;27843:366::-;27985:3;28006:67;28070:2;28065:3;28006:67;:::i;:::-;27999:74;;28082:93;28171:3;28082:93;:::i;:::-;28200:2;28195:3;28191:12;28184:19;;27843:366;;;:::o;28215:419::-;28381:4;28419:2;28408:9;28404:18;28396:26;;28468:9;28462:4;28458:20;28454:1;28443:9;28439:17;28432:47;28496:131;28622:4;28496:131;:::i;:::-;28488:139;;28215:419;;;:::o;28640:173::-;28780:25;28776:1;28768:6;28764:14;28757:49;28640:173;:::o;28819:366::-;28961:3;28982:67;29046:2;29041:3;28982:67;:::i;:::-;28975:74;;29058:93;29147:3;29058:93;:::i;:::-;29176:2;29171:3;29167:12;29160:19;;28819:366;;;:::o;29191:419::-;29357:4;29395:2;29384:9;29380:18;29372:26;;29444:9;29438:4;29434:20;29430:1;29419:9;29415:17;29408:47;29472:131;29598:4;29472:131;:::i;:::-;29464:139;;29191:419;;;:::o;29616:332::-;29737:4;29775:2;29764:9;29760:18;29752:26;;29788:71;29856:1;29845:9;29841:17;29832:6;29788:71;:::i;:::-;29869:72;29937:2;29926:9;29922:18;29913:6;29869:72;:::i;:::-;29616:332;;;;;:::o;29954:137::-;30008:5;30039:6;30033:13;30024:22;;30055:30;30079:5;30055:30;:::i;:::-;29954:137;;;;:::o;30097:345::-;30164:6;30213:2;30201:9;30192:7;30188:23;30184:32;30181:119;;;30219:79;;:::i;:::-;30181:119;30339:1;30364:61;30417:7;30408:6;30397:9;30393:22;30364:61;:::i;:::-;30354:71;;30310:125;30097:345;;;;:::o;30448:182::-;30588:34;30584:1;30576:6;30572:14;30565:58;30448:182;:::o;30636:366::-;30778:3;30799:67;30863:2;30858:3;30799:67;:::i;:::-;30792:74;;30875:93;30964:3;30875:93;:::i;:::-;30993:2;30988:3;30984:12;30977:19;;30636:366;;;:::o;31008:419::-;31174:4;31212:2;31201:9;31197:18;31189:26;;31261:9;31255:4;31251:20;31247:1;31236:9;31232:17;31225:47;31289:131;31415:4;31289:131;:::i;:::-;31281:139;;31008:419;;;:::o;31433:175::-;31573:27;31569:1;31561:6;31557:14;31550:51;31433:175;:::o;31614:366::-;31756:3;31777:67;31841:2;31836:3;31777:67;:::i;:::-;31770:74;;31853:93;31942:3;31853:93;:::i;:::-;31971:2;31966:3;31962:12;31955:19;;31614:366;;;:::o;31986:419::-;32152:4;32190:2;32179:9;32175:18;32167:26;;32239:9;32233:4;32229:20;32225:1;32214:9;32210:17;32203:47;32267:131;32393:4;32267:131;:::i;:::-;32259:139;;31986:419;;;:::o;32411:180::-;32551:32;32547:1;32539:6;32535:14;32528:56;32411:180;:::o;32597:366::-;32739:3;32760:67;32824:2;32819:3;32760:67;:::i;:::-;32753:74;;32836:93;32925:3;32836:93;:::i;:::-;32954:2;32949:3;32945:12;32938:19;;32597:366;;;:::o;32969:419::-;33135:4;33173:2;33162:9;33158:18;33150:26;;33222:9;33216:4;33212:20;33208:1;33197:9;33193:17;33186:47;33250:131;33376:4;33250:131;:::i;:::-;33242:139;;32969:419;;;:::o;33394:233::-;33534:34;33530:1;33522:6;33518:14;33511:58;33603:16;33598:2;33590:6;33586:15;33579:41;33394:233;:::o;33633:366::-;33775:3;33796:67;33860:2;33855:3;33796:67;:::i;:::-;33789:74;;33872:93;33961:3;33872:93;:::i;:::-;33990:2;33985:3;33981:12;33974:19;;33633:366;;;:::o;34005:419::-;34171:4;34209:2;34198:9;34194:18;34186:26;;34258:9;34252:4;34248:20;34244:1;34233:9;34229:17;34222:47;34286:131;34412:4;34286:131;:::i;:::-;34278:139;;34005:419;;;:::o;34430:223::-;34570:34;34566:1;34558:6;34554:14;34547:58;34639:6;34634:2;34626:6;34622:15;34615:31;34430:223;:::o;34659:366::-;34801:3;34822:67;34886:2;34881:3;34822:67;:::i;:::-;34815:74;;34898:93;34987:3;34898:93;:::i;:::-;35016:2;35011:3;35007:12;35000:19;;34659:366;;;:::o;35031:419::-;35197:4;35235:2;35224:9;35220:18;35212:26;;35284:9;35278:4;35274:20;35270:1;35259:9;35255:17;35248:47;35312:131;35438:4;35312:131;:::i;:::-;35304:139;;35031:419;;;:::o;35456:180::-;35504:77;35501:1;35494:88;35601:4;35598:1;35591:15;35625:4;35622:1;35615:15;35642:185;35682:1;35699:20;35717:1;35699:20;:::i;:::-;35694:25;;35733:20;35751:1;35733:20;:::i;:::-;35728:25;;35772:1;35762:35;;35777:18;;:::i;:::-;35762:35;35819:1;35816;35812:9;35807:14;;35642:185;;;;:::o;35833:147::-;35934:11;35971:3;35956:18;;35833:147;;;;:::o;35986:114::-;;:::o;36106:398::-;36265:3;36286:83;36367:1;36362:3;36286:83;:::i;:::-;36279:90;;36378:93;36467:3;36378:93;:::i;:::-;36496:1;36491:3;36487:11;36480:18;;36106:398;;;:::o;36510:379::-;36694:3;36716:147;36859:3;36716:147;:::i;:::-;36709:154;;36880:3;36873:10;;36510:379;;;:::o;36895:174::-;37035:26;37031:1;37023:6;37019:14;37012:50;36895:174;:::o;37075:366::-;37217:3;37238:67;37302:2;37297:3;37238:67;:::i;:::-;37231:74;;37314:93;37403:3;37314:93;:::i;:::-;37432:2;37427:3;37423:12;37416:19;;37075:366;;;:::o;37447:419::-;37613:4;37651:2;37640:9;37636:18;37628:26;;37700:9;37694:4;37690:20;37686:1;37675:9;37671:17;37664:47;37728:131;37854:4;37728:131;:::i;:::-;37720:139;;37447:419;;;:::o;37872:169::-;38012:21;38008:1;38000:6;37996:14;37989:45;37872:169;:::o;38047:366::-;38189:3;38210:67;38274:2;38269:3;38210:67;:::i;:::-;38203:74;;38286:93;38375:3;38286:93;:::i;:::-;38404:2;38399:3;38395:12;38388:19;;38047:366;;;:::o;38419:419::-;38585:4;38623:2;38612:9;38608:18;38600:26;;38672:9;38666:4;38662:20;38658:1;38647:9;38643:17;38636:47;38700:131;38826:4;38700:131;:::i;:::-;38692:139;;38419:419;;;:::o;38844:167::-;38984:19;38980:1;38972:6;38968:14;38961:43;38844:167;:::o;39017:366::-;39159:3;39180:67;39244:2;39239:3;39180:67;:::i;:::-;39173:74;;39256:93;39345:3;39256:93;:::i;:::-;39374:2;39369:3;39365:12;39358:19;;39017:366;;;:::o;39389:419::-;39555:4;39593:2;39582:9;39578:18;39570:26;;39642:9;39636:4;39632:20;39628:1;39617:9;39613:17;39606:47;39670:131;39796:4;39670:131;:::i;:::-;39662:139;;39389:419;;;:::o;39814:169::-;39954:21;39950:1;39942:6;39938:14;39931:45;39814:169;:::o;39989:366::-;40131:3;40152:67;40216:2;40211:3;40152:67;:::i;:::-;40145:74;;40228:93;40317:3;40228:93;:::i;:::-;40346:2;40341:3;40337:12;40330:19;;39989:366;;;:::o;40361:419::-;40527:4;40565:2;40554:9;40550:18;40542:26;;40614:9;40608:4;40604:20;40600:1;40589:9;40585:17;40578:47;40642:131;40768:4;40642:131;:::i;:::-;40634:139;;40361:419;;;:::o;40786:233::-;40825:3;40848:24;40866:5;40848:24;:::i;:::-;40839:33;;40894:66;40887:5;40884:77;40881:103;;40964:18;;:::i;:::-;40881:103;41011:1;41004:5;41000:13;40993:20;;40786:233;;;:::o;41025:141::-;41074:4;41097:3;41089:11;;41120:3;41117:1;41110:14;41154:4;41151:1;41141:18;41133:26;;41025:141;;;:::o;41172:93::-;41209:6;41256:2;41251;41244:5;41240:14;41236:23;41226:33;;41172:93;;;:::o;41271:107::-;41315:8;41365:5;41359:4;41355:16;41334:37;;41271:107;;;;:::o;41384:393::-;41453:6;41503:1;41491:10;41487:18;41526:97;41556:66;41545:9;41526:97;:::i;:::-;41644:39;41674:8;41663:9;41644:39;:::i;:::-;41632:51;;41716:4;41712:9;41705:5;41701:21;41692:30;;41765:4;41755:8;41751:19;41744:5;41741:30;41731:40;;41460:317;;41384:393;;;;;:::o;41783:60::-;41811:3;41832:5;41825:12;;41783:60;;;:::o;41849:142::-;41899:9;41932:53;41950:34;41959:24;41977:5;41959:24;:::i;:::-;41950:34;:::i;:::-;41932:53;:::i;:::-;41919:66;;41849:142;;;:::o;41997:75::-;42040:3;42061:5;42054:12;;41997:75;;;:::o;42078:269::-;42188:39;42219:7;42188:39;:::i;:::-;42249:91;42298:41;42322:16;42298:41;:::i;:::-;42290:6;42283:4;42277:11;42249:91;:::i;:::-;42243:4;42236:105;42154:193;42078:269;;;:::o;42353:73::-;42398:3;42353:73;:::o;42432:189::-;42509:32;;:::i;:::-;42550:65;42608:6;42600;42594:4;42550:65;:::i;:::-;42485:136;42432:189;;:::o;42627:186::-;42687:120;42704:3;42697:5;42694:14;42687:120;;;42758:39;42795:1;42788:5;42758:39;:::i;:::-;42731:1;42724:5;42720:13;42711:22;;42687:120;;;42627:186;;:::o;42819:543::-;42920:2;42915:3;42912:11;42909:446;;;42954:38;42986:5;42954:38;:::i;:::-;43038:29;43056:10;43038:29;:::i;:::-;43028:8;43024:44;43221:2;43209:10;43206:18;43203:49;;;43242:8;43227:23;;43203:49;43265:80;43321:22;43339:3;43321:22;:::i;:::-;43311:8;43307:37;43294:11;43265:80;:::i;:::-;42924:431;;42909:446;42819:543;;;:::o;43368:117::-;43422:8;43472:5;43466:4;43462:16;43441:37;;43368:117;;;;:::o;43491:169::-;43535:6;43568:51;43616:1;43612:6;43604:5;43601:1;43597:13;43568:51;:::i;:::-;43564:56;43649:4;43643;43639:15;43629:25;;43542:118;43491:169;;;;:::o;43665:295::-;43741:4;43887:29;43912:3;43906:4;43887:29;:::i;:::-;43879:37;;43949:3;43946:1;43942:11;43936:4;43933:21;43925:29;;43665:295;;;;:::o;43965:1395::-;44082:37;44115:3;44082:37;:::i;:::-;44184:18;44176:6;44173:30;44170:56;;;44206:18;;:::i;:::-;44170:56;44250:38;44282:4;44276:11;44250:38;:::i;:::-;44335:67;44395:6;44387;44381:4;44335:67;:::i;:::-;44429:1;44453:4;44440:17;;44485:2;44477:6;44474:14;44502:1;44497:618;;;;45159:1;45176:6;45173:77;;;45225:9;45220:3;45216:19;45210:26;45201:35;;45173:77;45276:67;45336:6;45329:5;45276:67;:::i;:::-;45270:4;45263:81;45132:222;44467:887;;44497:618;44549:4;44545:9;44537:6;44533:22;44583:37;44615:4;44583:37;:::i;:::-;44642:1;44656:208;44670:7;44667:1;44664:14;44656:208;;;44749:9;44744:3;44740:19;44734:26;44726:6;44719:42;44800:1;44792:6;44788:14;44778:24;;44847:2;44836:9;44832:18;44819:31;;44693:4;44690:1;44686:12;44681:17;;44656:208;;;44892:6;44883:7;44880:19;44877:179;;;44950:9;44945:3;44941:19;44935:26;44993:48;45035:4;45027:6;45023:17;45012:9;44993:48;:::i;:::-;44985:6;44978:64;44900:156;44877:179;45102:1;45098;45090:6;45086:14;45082:22;45076:4;45069:36;44504:611;;;44467:887;;44057:1303;;;43965:1395;;:::o;45366:174::-;45506:26;45502:1;45494:6;45490:14;45483:50;45366:174;:::o;45546:366::-;45688:3;45709:67;45773:2;45768:3;45709:67;:::i;:::-;45702:74;;45785:93;45874:3;45785:93;:::i;:::-;45903:2;45898:3;45894:12;45887:19;;45546:366;;;:::o;45918:419::-;46084:4;46122:2;46111:9;46107:18;46099:26;;46171:9;46165:4;46161:20;46157:1;46146:9;46142:17;46135:47;46199:131;46325:4;46199:131;:::i;:::-;46191:139;;45918:419;;;:::o;46343:222::-;46483:34;46479:1;46471:6;46467:14;46460:58;46552:5;46547:2;46539:6;46535:15;46528:30;46343:222;:::o;46571:366::-;46713:3;46734:67;46798:2;46793:3;46734:67;:::i;:::-;46727:74;;46810:93;46899:3;46810:93;:::i;:::-;46928:2;46923:3;46919:12;46912:19;;46571:366;;;:::o;46943:419::-;47109:4;47147:2;47136:9;47132:18;47124:26;;47196:9;47190:4;47186:20;47182:1;47171:9;47167:17;47160:47;47224:131;47350:4;47224:131;:::i;:::-;47216:139;;46943:419;;;:::o;47368:228::-;47508:34;47504:1;47496:6;47492:14;47485:58;47577:11;47572:2;47564:6;47560:15;47553:36;47368:228;:::o;47602:366::-;47744:3;47765:67;47829:2;47824:3;47765:67;:::i;:::-;47758:74;;47841:93;47930:3;47841:93;:::i;:::-;47959:2;47954:3;47950:12;47943:19;;47602:366;;;:::o;47974:419::-;48140:4;48178:2;48167:9;48163:18;48155:26;;48227:9;48221:4;48217:20;48213:1;48202:9;48198:17;48191:47;48255:131;48381:4;48255:131;:::i;:::-;48247:139;;47974:419;;;:::o;48399:223::-;48539:34;48535:1;48527:6;48523:14;48516:58;48608:6;48603:2;48595:6;48591:15;48584:31;48399:223;:::o;48628:366::-;48770:3;48791:67;48855:2;48850:3;48791:67;:::i;:::-;48784:74;;48867:93;48956:3;48867:93;:::i;:::-;48985:2;48980:3;48976:12;48969:19;;48628:366;;;:::o;49000:419::-;49166:4;49204:2;49193:9;49189:18;49181:26;;49253:9;49247:4;49243:20;49239:1;49228:9;49224:17;49217:47;49281:131;49407:4;49281:131;:::i;:::-;49273:139;;49000:419;;;:::o;49425:180::-;49473:77;49470:1;49463:88;49570:4;49567:1;49560:15;49594:4;49591:1;49584:15;49611:234;49751:34;49747:1;49739:6;49735:14;49728:58;49820:17;49815:2;49807:6;49803:15;49796:42;49611:234;:::o;49851:366::-;49993:3;50014:67;50078:2;50073:3;50014:67;:::i;:::-;50007:74;;50090:93;50179:3;50090:93;:::i;:::-;50208:2;50203:3;50199:12;50192:19;;49851:366;;;:::o;50223:419::-;50389:4;50427:2;50416:9;50412:18;50404:26;;50476:9;50470:4;50466:20;50462:1;50451:9;50447:17;50440:47;50504:131;50630:4;50504:131;:::i;:::-;50496:139;;50223:419;;;:::o;50648:148::-;50750:11;50787:3;50772:18;;50648:148;;;;:::o;50826:874::-;50929:3;50966:5;50960:12;50995:36;51021:9;50995:36;:::i;:::-;51047:89;51129:6;51124:3;51047:89;:::i;:::-;51040:96;;51167:1;51156:9;51152:17;51183:1;51178:166;;;;51358:1;51353:341;;;;51145:549;;51178:166;51262:4;51258:9;51247;51243:25;51238:3;51231:38;51324:6;51317:14;51310:22;51302:6;51298:35;51293:3;51289:45;51282:52;;51178:166;;51353:341;51420:38;51452:5;51420:38;:::i;:::-;51480:1;51494:154;51508:6;51505:1;51502:13;51494:154;;;51582:7;51576:14;51572:1;51567:3;51563:11;51556:35;51632:1;51623:7;51619:15;51608:26;;51530:4;51527:1;51523:12;51518:17;;51494:154;;;51677:6;51672:3;51668:16;51661:23;;51360:334;;51145:549;;50933:767;;50826:874;;;;:::o;51706:162::-;51846:14;51842:1;51834:6;51830:14;51823:38;51706:162;:::o;51874:402::-;52034:3;52055:85;52137:2;52132:3;52055:85;:::i;:::-;52048:92;;52149:93;52238:3;52149:93;:::i;:::-;52267:2;52262:3;52258:12;52251:19;;51874:402;;;:::o;52282:535::-;52512:3;52534:92;52622:3;52613:6;52534:92;:::i;:::-;52527:99;;52643:148;52787:3;52643:148;:::i;:::-;52636:155;;52808:3;52801:10;;52282:535;;;;:::o;52823:390::-;52929:3;52957:39;52990:5;52957:39;:::i;:::-;53012:89;53094:6;53089:3;53012:89;:::i;:::-;53005:96;;53110:65;53168:6;53163:3;53156:4;53149:5;53145:16;53110:65;:::i;:::-;53200:6;53195:3;53191:16;53184:23;;52933:280;52823:390;;;;:::o;53219:155::-;53359:7;53355:1;53347:6;53343:14;53336:31;53219:155;:::o;53380:400::-;53540:3;53561:84;53643:1;53638:3;53561:84;:::i;:::-;53554:91;;53654:93;53743:3;53654:93;:::i;:::-;53772:1;53767:3;53763:11;53756:18;;53380:400;;;:::o;53786:695::-;54064:3;54086:92;54174:3;54165:6;54086:92;:::i;:::-;54079:99;;54195:95;54286:3;54277:6;54195:95;:::i;:::-;54188:102;;54307:148;54451:3;54307:148;:::i;:::-;54300:155;;54472:3;54465:10;;53786:695;;;;;:::o;54487:163::-;54627:15;54623:1;54615:6;54611:14;54604:39;54487:163;:::o;54656:402::-;54816:3;54837:85;54919:2;54914:3;54837:85;:::i;:::-;54830:92;;54931:93;55020:3;54931:93;:::i;:::-;55049:2;55044:3;55040:12;55033:19;;54656:402;;;:::o;55064:535::-;55294:3;55316:92;55404:3;55395:6;55316:92;:::i;:::-;55309:99;;55425:148;55569:3;55425:148;:::i;:::-;55418:155;;55590:3;55583:10;;55064:535;;;;:::o;55605:225::-;55745:34;55741:1;55733:6;55729:14;55722:58;55814:8;55809:2;55801:6;55797:15;55790:33;55605:225;:::o;55836:366::-;55978:3;55999:67;56063:2;56058:3;55999:67;:::i;:::-;55992:74;;56075:93;56164:3;56075:93;:::i;:::-;56193:2;56188:3;56184:12;56177:19;;55836:366;;;:::o;56208:419::-;56374:4;56412:2;56401:9;56397:18;56389:26;;56461:9;56455:4;56451:20;56447:1;56436:9;56432:17;56425:47;56489:131;56615:4;56489:131;:::i;:::-;56481:139;;56208:419;;;:::o;56633:182::-;56773:34;56769:1;56761:6;56757:14;56750:58;56633:182;:::o;56821:366::-;56963:3;56984:67;57048:2;57043:3;56984:67;:::i;:::-;56977:74;;57060:93;57149:3;57060:93;:::i;:::-;57178:2;57173:3;57169:12;57162:19;;56821:366;;;:::o;57193:419::-;57359:4;57397:2;57386:9;57382:18;57374:26;;57446:9;57440:4;57436:20;57432:1;57421:9;57417:17;57410:47;57474:131;57600:4;57474:131;:::i;:::-;57466:139;;57193:419;;;:::o;57618:232::-;57758:34;57754:1;57746:6;57742:14;57735:58;57827:15;57822:2;57814:6;57810:15;57803:40;57618:232;:::o;57856:366::-;57998:3;58019:67;58083:2;58078:3;58019:67;:::i;:::-;58012:74;;58095:93;58184:3;58095:93;:::i;:::-;58213:2;58208:3;58204:12;58197:19;;57856:366;;;:::o;58228:419::-;58394:4;58432:2;58421:9;58417:18;58409:26;;58481:9;58475:4;58471:20;58467:1;58456:9;58452:17;58445:47;58509:131;58635:4;58509:131;:::i;:::-;58501:139;;58228:419;;;:::o;58653:175::-;58793:27;58789:1;58781:6;58777:14;58770:51;58653:175;:::o;58834:366::-;58976:3;58997:67;59061:2;59056:3;58997:67;:::i;:::-;58990:74;;59073:93;59162:3;59073:93;:::i;:::-;59191:2;59186:3;59182:12;59175:19;;58834:366;;;:::o;59206:419::-;59372:4;59410:2;59399:9;59395:18;59387:26;;59459:9;59453:4;59449:20;59445:1;59434:9;59430:17;59423:47;59487:131;59613:4;59487:131;:::i;:::-;59479:139;;59206:419;;;:::o;59631:176::-;59663:1;59680:20;59698:1;59680:20;:::i;:::-;59675:25;;59714:20;59732:1;59714:20;:::i;:::-;59709:25;;59753:1;59743:35;;59758:18;;:::i;:::-;59743:35;59799:1;59796;59792:9;59787:14;;59631:176;;;;:::o;59813:224::-;59953:34;59949:1;59941:6;59937:14;59930:58;60022:7;60017:2;60009:6;60005:15;59998:32;59813:224;:::o;60043:366::-;60185:3;60206:67;60270:2;60265:3;60206:67;:::i;:::-;60199:74;;60282:93;60371:3;60282:93;:::i;:::-;60400:2;60395:3;60391:12;60384:19;;60043:366;;;:::o;60415:419::-;60581:4;60619:2;60608:9;60604:18;60596:26;;60668:9;60662:4;60658:20;60654:1;60643:9;60639:17;60632:47;60696:131;60822:4;60696:131;:::i;:::-;60688:139;;60415:419;;;:::o;60840:223::-;60980:34;60976:1;60968:6;60964:14;60957:58;61049:6;61044:2;61036:6;61032:15;61025:31;60840:223;:::o;61069:366::-;61211:3;61232:67;61296:2;61291:3;61232:67;:::i;:::-;61225:74;;61308:93;61397:3;61308:93;:::i;:::-;61426:2;61421:3;61417:12;61410:19;;61069:366;;;:::o;61441:419::-;61607:4;61645:2;61634:9;61630:18;61622:26;;61694:9;61688:4;61684:20;61680:1;61669:9;61665:17;61658:47;61722:131;61848:4;61722:131;:::i;:::-;61714:139;;61441:419;;;:::o;61866:237::-;62006:34;62002:1;61994:6;61990:14;61983:58;62075:20;62070:2;62062:6;62058:15;62051:45;61866:237;:::o;62109:366::-;62251:3;62272:67;62336:2;62331:3;62272:67;:::i;:::-;62265:74;;62348:93;62437:3;62348:93;:::i;:::-;62466:2;62461:3;62457:12;62450:19;;62109:366;;;:::o;62481:419::-;62647:4;62685:2;62674:9;62670:18;62662:26;;62734:9;62728:4;62724:20;62720:1;62709:9;62705:17;62698:47;62762:131;62888:4;62762:131;:::i;:::-;62754:139;;62481:419;;;:::o;62906:182::-;63046:34;63042:1;63034:6;63030:14;63023:58;62906:182;:::o;63094:366::-;63236:3;63257:67;63321:2;63316:3;63257:67;:::i;:::-;63250:74;;63333:93;63422:3;63333:93;:::i;:::-;63451:2;63446:3;63442:12;63435:19;;63094:366;;;:::o;63466:419::-;63632:4;63670:2;63659:9;63655:18;63647:26;;63719:9;63713:4;63709:20;63705:1;63694:9;63690:17;63683:47;63747:131;63873:4;63747:131;:::i;:::-;63739:139;;63466:419;;;:::o;63891:178::-;64031:30;64027:1;64019:6;64015:14;64008:54;63891:178;:::o;64075:366::-;64217:3;64238:67;64302:2;64297:3;64238:67;:::i;:::-;64231:74;;64314:93;64403:3;64314:93;:::i;:::-;64432:2;64427:3;64423:12;64416:19;;64075:366;;;:::o;64447:419::-;64613:4;64651:2;64640:9;64636:18;64628:26;;64700:9;64694:4;64690:20;64686:1;64675:9;64671:17;64664:47;64728:131;64854:4;64728:131;:::i;:::-;64720:139;;64447:419;;;:::o;64872:98::-;64923:6;64957:5;64951:12;64941:22;;64872:98;;;:::o;64976:168::-;65059:11;65093:6;65088:3;65081:19;65133:4;65128:3;65124:14;65109:29;;64976:168;;;;:::o;65150:373::-;65236:3;65264:38;65296:5;65264:38;:::i;:::-;65318:70;65381:6;65376:3;65318:70;:::i;:::-;65311:77;;65397:65;65455:6;65450:3;65443:4;65436:5;65432:16;65397:65;:::i;:::-;65487:29;65509:6;65487:29;:::i;:::-;65482:3;65478:39;65471:46;;65240:283;65150:373;;;;:::o;65529:640::-;65724:4;65762:3;65751:9;65747:19;65739:27;;65776:71;65844:1;65833:9;65829:17;65820:6;65776:71;:::i;:::-;65857:72;65925:2;65914:9;65910:18;65901:6;65857:72;:::i;:::-;65939;66007:2;65996:9;65992:18;65983:6;65939:72;:::i;:::-;66058:9;66052:4;66048:20;66043:2;66032:9;66028:18;66021:48;66086:76;66157:4;66148:6;66086:76;:::i;:::-;66078:84;;65529:640;;;;;;;:::o;66175:141::-;66231:5;66262:6;66256:13;66247:22;;66278:32;66304:5;66278:32;:::i;:::-;66175:141;;;;:::o;66322:349::-;66391:6;66440:2;66428:9;66419:7;66415:23;66411:32;66408:119;;;66446:79;;:::i;:::-;66408:119;66566:1;66591:63;66646:7;66637:6;66626:9;66622:22;66591:63;:::i;:::-;66581:73;;66537:127;66322:349;;;;:::o
Swarm Source
ipfs://04d20f2a1ce828364228af4f711468522d074703520905c5eb0f649870d7bb57
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.