ERC-721
Overview
Max Total Supply
7 CFAFz
Holders
3
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Balance
3 CFAFzLoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
Clonez
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2023-05-07 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // 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.0; /** * @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: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(account), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.8.2) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such * that `ownerOf(tokenId)` is `a`. */ // solhint-disable-next-line func-name-mixedcase function __unsafe_increaseBalance(address account, uint256 amount) internal { _balances[account] += amount; } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev See {ERC721-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual override { super._beforeTokenTransfer(from, to, firstTokenId, batchSize); if (batchSize > 1) { // Will only trigger during construction. Batch transferring (minting) is not available afterwards. revert("ERC721Enumerable: consecutive transfers not supported"); } uint256 tokenId = firstTokenId; if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev See {ERC721-_burn}. This override additionally checks to see if a * token-specific URI was set for the token, and if so, it deletes the token URI from * the storage mapping. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Burnable.sol) pragma solidity ^0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _burn(tokenId); } } // File: contracts/clones.sol pragma solidity ^0.8.9; contract Clonez is ERC721, ERC721Enumerable, Pausable, AccessControl, ERC721Burnable { using Strings for uint256; string private baseURI; address[] public freeMintAddresses; mapping(uint256 => string) public tokenURIMapping; mapping(address => uint256) public freeMintCount; bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE"); constructor(address initialAdmin) ERC721("Clonez", "CFAFz") { _setupRole(DEFAULT_ADMIN_ROLE, initialAdmin); _setupRole(ADMIN_ROLE, initialAdmin); } modifier onlyAdmin() { require(hasRole(ADMIN_ROLE, msg.sender), "Caller is not an admin"); _; } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC721Enumerable, AccessControl) returns (bool) { return super.supportsInterface(interfaceId); } function setBaseURI(string memory _newBaseURI) public onlyAdmin { baseURI = _newBaseURI; } function batchAddFreeMints(address[] memory addresses, uint256[] memory freeMints)public onlyAdmin{ for (uint256 i = 0; i < addresses.length; i++) { freeMintCount[addresses[i]] = freeMints[i]; freeMintAddresses.push(addresses[i]); } } function addTokenMapping(uint256 _tokenID, string memory _ipfsHash)private { tokenURIMapping[_tokenID] = _ipfsHash; } function grantAdminRole(address account) public onlyAdmin { grantRole(ADMIN_ROLE, account); } function revokeAdminRole(address account) public onlyAdmin { revokeRole(ADMIN_ROLE, account); } //Update/Fix/Change function updateFreeMints(address _address, uint256 _amount)private { // First, delete the current value of the mapping delete freeMintCount[_address]; // Then, assign the new value to the key freeMintCount[_address] = _amount; } function updateCredits(address _address, uint256 _amount)public onlyAdmin{ // First, delete the current value of the mapping delete freeMintCount[_address]; // Then, assign the new value to the key freeMintCount[_address] = _amount; } function overwriteMappingValue(uint256 tokenId, string memory newValue) public onlyAdmin{ // First, delete the current value of the mapping delete tokenURIMapping[tokenId]; // Then, assign the new value to the key tokenURIMapping[tokenId] = newValue; } //Write function mint(string memory _ipfsHash)public { require(isfreeMinted(msg.sender), "User not in snapshot"); address _user = msg.sender; uint256 fmints = freeMintCount[_user]; require(fmints > 0, "No more mints avaiable"); uint256 tokenID = totalSupply() + 1; _safeMint(msg.sender, tokenID); addTokenMapping(tokenID, _ipfsHash); updateFreeMints(_user, fmints - 1); totalSupply()+ 1; } function safeMint(address to, uint256 tokenId) private{ _safeMint(to, tokenId); } function _beforeTokenTransfer(address from, address to, uint256 tokenId, uint256 batchSize) internal whenNotPaused override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId, batchSize); } //Read function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory currentBaseURI = _baseURI(); string memory hash = tokenURIMapping[tokenId]; return bytes(baseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, "/", hash)) : ""; } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](ownerTokenCount); for (uint256 i; i < ownerTokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } function isfreeMinted(address _user) public view returns (bool) { for (uint i = 0; i < freeMintAddresses.length; i++) { if (freeMintAddresses[i] == _user) { return true; } } return false; } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function pause() public onlyAdmin { _pause(); } function unpause() public onlyAdmin { _unpause(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"initialAdmin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"freeMints","type":"uint256[]"}],"name":"batchAddFreeMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"freeMintAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"grantAdminRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isfreeMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_ipfsHash","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"newValue","type":"string"}],"name":"overwriteMappingValue","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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"revokeAdminRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","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":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","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":"uint256","name":"","type":"uint256"}],"name":"tokenURIMapping","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"updateCredits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200592038038062005920833981810160405281019062000037919062000317565b6040518060400160405280600681526020017f436c6f6e657a00000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f434641467a0000000000000000000000000000000000000000000000000000008152508160009081620000b49190620005c3565b508060019081620000c69190620005c3565b5050506000600a60006101000a81548160ff021916908315150217905550620000f96000801b826200013260201b60201c565b6200012b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775826200013260201b60201c565b50620006aa565b6200014482826200014860201b60201c565b5050565b6200015a82826200023a60201b60201c565b62000236576001600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620001db620002a560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002df82620002b2565b9050919050565b620002f181620002d2565b8114620002fd57600080fd5b50565b6000815190506200031181620002e6565b92915050565b60006020828403121562000330576200032f620002ad565b5b6000620003408482850162000300565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003cb57607f821691505b602082108103620003e157620003e062000383565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200044b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200040c565b6200045786836200040c565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004a46200049e62000498846200046f565b62000479565b6200046f565b9050919050565b6000819050919050565b620004c08362000483565b620004d8620004cf82620004ab565b84845462000419565b825550505050565b600090565b620004ef620004e0565b620004fc818484620004b5565b505050565b5b81811015620005245762000518600082620004e5565b60018101905062000502565b5050565b601f82111562000573576200053d81620003e7565b6200054884620003fc565b8101602085101562000558578190505b620005706200056785620003fc565b83018262000501565b50505b505050565b600082821c905092915050565b6000620005986000198460080262000578565b1980831691505092915050565b6000620005b3838362000585565b9150826002028217905092915050565b620005ce8262000349565b67ffffffffffffffff811115620005ea57620005e962000354565b5b620005f68254620003b2565b6200060382828562000528565b600060209050601f8311600181146200063b576000841562000626578287015190505b620006328582620005a5565b865550620006a2565b601f1984166200064b86620003e7565b60005b8281101562000675578489015182556001820191506020850194506020810190506200064e565b8683101562000695578489015162000691601f89168262000585565b8355505b6001600288020188555050505b505050505050565b61526680620006ba6000396000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c80635ecf8a801161013b578063a22cb465116100b8578063d547741f1161007c578063d547741f146106e6578063d85d3d2714610702578063e985e9c51461071e578063f01bc0291461074e578063fc3aeb221461076a5761023d565b8063a22cb46514610632578063a45578941461064e578063b88d4fde1461067e578063c634b78e1461069a578063c87b56dd146106b65761023d565b80638456cb59116100ff5780638456cb59146105a057806391d14854146105aa57806395d89b41146105da5780639a19c7b0146105f8578063a217fddf146106145761023d565b80635ecf8a80146104c25780636352211e146104f257806370a082311461052257806371e3ef9d1461055257806375b238fc146105825761023d565b80632f745c59116101c9578063438b63001161018d578063438b63001461040c57806349ddaf9b1461043c5780634f6ccce71461045857806355f804b3146104885780635c975abb146104a45761023d565b80632f745c591461037e57806336568abe146103ae5780633f4ba83a146103ca57806342842e0e146103d457806342966c68146103f05761023d565b80631006b841116102105780631006b841146102dc57806318160ddd146102f857806323b872dd14610316578063248a9ca3146103325780632f2ff15d146103625761023d565b806301ffc9a71461024257806306fdde0314610272578063081812fc14610290578063095ea7b3146102c0575b600080fd5b61025c600480360381019061025791906135ea565b61079a565b6040516102699190613632565b60405180910390f35b61027a6107ac565b60405161028791906136dd565b60405180910390f35b6102aa60048036038101906102a59190613735565b61083e565b6040516102b791906137a3565b60405180910390f35b6102da60048036038101906102d591906137ea565b610884565b005b6102f660048036038101906102f1919061395f565b61099b565b005b610300610a48565b60405161030d91906139ca565b60405180910390f35b610330600480360381019061032b91906139e5565b610a55565b005b61034c60048036038101906103479190613a6e565b610ab5565b6040516103599190613aaa565b60405180910390f35b61037c60048036038101906103779190613ac5565b610ad5565b005b610398600480360381019061039391906137ea565b610af6565b6040516103a591906139ca565b60405180910390f35b6103c860048036038101906103c39190613ac5565b610b9b565b005b6103d2610c1e565b005b6103ee60048036038101906103e991906139e5565b610c91565b005b61040a60048036038101906104059190613735565b610cb1565b005b61042660048036038101906104219190613b05565b610d0d565b6040516104339190613bf0565b60405180910390f35b610456600480360381019061045191906137ea565b610dbb565b005b610472600480360381019061046d9190613735565b610eaf565b60405161047f91906139ca565b60405180910390f35b6104a2600480360381019061049d9190613c12565b610f20565b005b6104ac610f9c565b6040516104b99190613632565b60405180910390f35b6104dc60048036038101906104d79190613b05565b610fb3565b6040516104e991906139ca565b60405180910390f35b61050c60048036038101906105079190613735565b610fcb565b60405161051991906137a3565b60405180910390f35b61053c60048036038101906105379190613b05565b611051565b60405161054991906139ca565b60405180910390f35b61056c60048036038101906105679190613735565b611108565b60405161057991906137a3565b60405180910390f35b61058a611147565b6040516105979190613aaa565b60405180910390f35b6105a861116b565b005b6105c460048036038101906105bf9190613ac5565b6111de565b6040516105d19190613632565b60405180910390f35b6105e2611249565b6040516105ef91906136dd565b60405180910390f35b610612600480360381019061060d9190613b05565b6112db565b005b61061c611371565b6040516106299190613aaa565b60405180910390f35b61064c60048036038101906106479190613c87565b611378565b005b61066860048036038101906106639190613b05565b61138e565b6040516106759190613632565b60405180910390f35b61069860048036038101906106939190613d68565b61143c565b005b6106b460048036038101906106af9190613b05565b61149e565b005b6106d060048036038101906106cb9190613735565b611534565b6040516106dd91906136dd565b60405180910390f35b61070060048036038101906106fb9190613ac5565b611681565b005b61071c60048036038101906107179190613c12565b6116a2565b005b61073860048036038101906107339190613deb565b6117d3565b6040516107459190613632565b60405180910390f35b61076860048036038101906107639190613fb6565b611867565b005b610784600480360381019061077f9190613735565b6119e9565b60405161079191906136dd565b60405180910390f35b60006107a582611a89565b9050919050565b6060600080546107bb9061405d565b80601f01602080910402602001604051908101604052809291908181526020018280546107e79061405d565b80156108345780601f1061080957610100808354040283529160200191610834565b820191906000526020600020905b81548152906001019060200180831161081757829003601f168201915b5050505050905090565b600061084982611b03565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061088f82610fcb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f690614100565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661091e611b4e565b73ffffffffffffffffffffffffffffffffffffffff16148061094d575061094c81610947611b4e565b6117d3565b5b61098c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098390614192565b60405180910390fd5b6109968383611b56565b505050565b6109c57fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775336111de565b610a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fb906141fe565b60405180910390fd5b600e60008381526020019081526020016000206000610a239190613521565b80600e60008481526020019081526020016000209081610a4391906143ca565b505050565b6000600880549050905090565b610a66610a60611b4e565b82611c0f565b610aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9c9061450e565b60405180910390fd5b610ab0838383611ca4565b505050565b6000600b6000838152602001908152602001600020600101549050919050565b610ade82610ab5565b610ae781611f9d565b610af18383611fb1565b505050565b6000610b0183611051565b8210610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b39906145a0565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ba3611b4e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0790614632565b60405180910390fd5b610c1a8282612092565b5050565b610c487fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775336111de565b610c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7e906141fe565b60405180910390fd5b610c8f612174565b565b610cac8383836040518060200160405280600081525061143c565b505050565b610cc2610cbc611b4e565b82611c0f565b610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf89061450e565b60405180910390fd5b610d0a816121d7565b50565b60606000610d1a83611051565b905060008167ffffffffffffffff811115610d3857610d37613834565b5b604051908082528060200260200182016040528015610d665781602001602082028036833780820191505090505b50905060005b82811015610db057610d7e8582610af6565b828281518110610d9157610d90614652565b5b6020026020010181815250508080610da8906146b0565b915050610d6c565b508092505050919050565b610de57fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775336111de565b610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b906141fe565b60405180910390fd5b600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000905580600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6000610eb9610a48565b8210610efa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef19061476a565b60405180910390fd5b60088281548110610f0e57610f0d614652565b5b90600052602060002001549050919050565b610f4a7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775336111de565b610f89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f80906141fe565b60405180910390fd5b80600c9081610f9891906143ca565b5050565b6000600a60009054906101000a900460ff16905090565b600f6020528060005260406000206000915090505481565b600080610fd783612325565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103f906147d6565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b890614868565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600d818154811061111857600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b6111957fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775336111de565b6111d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cb906141fe565b60405180910390fd5b6111dc612362565b565b6000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600180546112589061405d565b80601f01602080910402602001604051908101604052809291908181526020018280546112849061405d565b80156112d15780601f106112a6576101008083540402835291602001916112d1565b820191906000526020600020905b8154815290600101906020018083116112b457829003601f168201915b5050505050905090565b6113057fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775336111de565b611344576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133b906141fe565b60405180910390fd5b61136e7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177582611681565b50565b6000801b81565b61138a611383611b4e565b83836123c5565b5050565b600080600090505b600d80549050811015611431578273ffffffffffffffffffffffffffffffffffffffff16600d82815481106113ce576113cd614652565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361141e576001915050611437565b8080611429906146b0565b915050611396565b50600090505b919050565b61144d611447611b4e565b83611c0f565b61148c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114839061450e565b60405180910390fd5b61149884848484612531565b50505050565b6114c87fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775336111de565b611507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fe906141fe565b60405180910390fd5b6115317fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177582610ad5565b50565b606061153f8261258d565b61157e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611575906148fa565b60405180910390fd5b60006115886125ce565b90506000600e600085815260200190815260200160002080546115aa9061405d565b80601f01602080910402602001604051908101604052809291908181526020018280546115d69061405d565b80156116235780601f106115f857610100808354040283529160200191611623565b820191906000526020600020905b81548152906001019060200180831161160657829003601f168201915b505050505090506000600c80546116399061405d565b9050116116555760405180602001604052806000815250611678565b81816040516020016116689291906149a2565b6040516020818303038152906040525b92505050919050565b61168a82610ab5565b61169381611f9d565b61169d8383612092565b505050565b6116ab3361138e565b6116ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e190614a1d565b60405180910390fd5b60003390506000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614a89565b60405180910390fd5b60006001611782610a48565b61178c9190614aa9565b90506117983382612660565b6117a2818561267e565b6117b8836001846117b39190614add565b6126a3565b60016117c2610a48565b6117cc9190614aa9565b5050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118917fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775336111de565b6118d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c7906141fe565b60405180910390fd5b60005b82518110156119e4578181815181106118ef576118ee614652565b5b6020026020010151600f600085848151811061190e5761190d614652565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600d83828151811061196957611968614652565b5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080806119dc906146b0565b9150506118d3565b505050565b600e6020528060005260406000206000915090508054611a089061405d565b80601f0160208091040260200160405190810160405280929190818152602001828054611a349061405d565b8015611a815780601f10611a5657610100808354040283529160200191611a81565b820191906000526020600020905b815481529060010190602001808311611a6457829003601f168201915b505050505081565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611afc5750611afb8261272e565b5b9050919050565b611b0c8161258d565b611b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b42906147d6565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611bc983610fcb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611c1b83610fcb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c5d5750611c5c81856117d3565b5b80611c9b57508373ffffffffffffffffffffffffffffffffffffffff16611c838461083e565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611cc482610fcb565b73ffffffffffffffffffffffffffffffffffffffff1614611d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1190614b83565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8090614c15565b60405180910390fd5b611d9683838360016127a8565b8273ffffffffffffffffffffffffffffffffffffffff16611db682610fcb565b73ffffffffffffffffffffffffffffffffffffffff1614611e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0390614b83565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f9883838360016127c2565b505050565b611fae81611fa9611b4e565b6127c8565b50565b611fbb82826111de565b61208e576001600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612033611b4e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61209c82826111de565b15612170576000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612115611b4e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b61217c61284d565b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6121c0611b4e565b6040516121cd91906137a3565b60405180910390a1565b60006121e282610fcb565b90506121f28160008460016127a8565b6121fb82610fcb565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123218160008460016127c2565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61236a612896565b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586123ae611b4e565b6040516123bb91906137a3565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242a90614c81565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125249190613632565b60405180910390a3505050565b61253c848484611ca4565b612548848484846128e0565b612587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257e90614d13565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166125af83612325565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600c80546125dd9061405d565b80601f01602080910402602001604051908101604052809291908181526020018280546126099061405d565b80156126565780601f1061262b57610100808354040283529160200191612656565b820191906000526020600020905b81548152906001019060200180831161263957829003601f168201915b5050505050905090565b61267a828260405180602001604052806000815250612a67565b5050565b80600e6000848152602001908152602001600020908161269e91906143ca565b505050565b600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000905580600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806127a157506127a082612ac2565b5b9050919050565b6127b0612896565b6127bc84848484612ba4565b50505050565b50505050565b6127d282826111de565b612849576127df81612d02565b6127ed8360001c6020612d2f565b6040516020016127fe929190614dcb565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284091906136dd565b60405180910390fd5b5050565b612855610f9c565b612894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288b90614e51565b60405180910390fd5b565b61289e610f9c565b156128de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d590614ebd565b60405180910390fd5b565b60006129018473ffffffffffffffffffffffffffffffffffffffff16612f6b565b15612a5a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261292a611b4e565b8786866040518563ffffffff1660e01b815260040161294c9493929190614f32565b6020604051808303816000875af192505050801561298857506040513d601f19601f820116820180604052508101906129859190614f93565b60015b612a0a573d80600081146129b8576040519150601f19603f3d011682016040523d82523d6000602084013e6129bd565b606091505b506000815103612a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f990614d13565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a5f565b600190505b949350505050565b612a718383612f8e565b612a7e60008484846128e0565b612abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab490614d13565b60405180910390fd5b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b8d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612b9d5750612b9c826131ab565b5b9050919050565b612bb084848484613215565b6001811115612bf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612beb90615032565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612c3b57612c368161321b565b612c7a565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612c7957612c788582613264565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612cbc57612cb7816133d1565b612cfb565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612cfa57612cf984826134a2565b5b5b5050505050565b6060612d288273ffffffffffffffffffffffffffffffffffffffff16601460ff16612d2f565b9050919050565b606060006002836002612d429190615052565b612d4c9190614aa9565b67ffffffffffffffff811115612d6557612d64613834565b5b6040519080825280601f01601f191660200182016040528015612d975781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612dcf57612dce614652565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612e3357612e32614652565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612e739190615052565b612e7d9190614aa9565b90505b6001811115612f1d577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612ebf57612ebe614652565b5b1a60f81b828281518110612ed657612ed5614652565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612f1690615094565b9050612e80565b5060008414612f61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5890615109565b60405180910390fd5b8091505092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff490615175565b60405180910390fd5b6130068161258d565b15613046576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303d906151e1565b60405180910390fd5b6130546000838360016127a8565b61305d8161258d565b1561309d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613094906151e1565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131a76000838360016127c2565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161327184611051565b61327b9190614add565b9050600060076000848152602001908152602001600020549050818114613360576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506133e59190614add565b905060006009600084815260200190815260200160002054905060006008838154811061341557613414614652565b5b90600052602060002001549050806008838154811061343757613436614652565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061348657613485615201565b5b6001900381819060005260206000200160009055905550505050565b60006134ad83611051565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b50805461352d9061405d565b6000825580601f1061353f575061355e565b601f01602090049060005260206000209081019061355d9190613561565b5b50565b5b8082111561357a576000816000905550600101613562565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6135c781613592565b81146135d257600080fd5b50565b6000813590506135e4816135be565b92915050565b600060208284031215613600576135ff613588565b5b600061360e848285016135d5565b91505092915050565b60008115159050919050565b61362c81613617565b82525050565b60006020820190506136476000830184613623565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561368757808201518184015260208101905061366c565b60008484015250505050565b6000601f19601f8301169050919050565b60006136af8261364d565b6136b98185613658565b93506136c9818560208601613669565b6136d281613693565b840191505092915050565b600060208201905081810360008301526136f781846136a4565b905092915050565b6000819050919050565b613712816136ff565b811461371d57600080fd5b50565b60008135905061372f81613709565b92915050565b60006020828403121561374b5761374a613588565b5b600061375984828501613720565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061378d82613762565b9050919050565b61379d81613782565b82525050565b60006020820190506137b86000830184613794565b92915050565b6137c781613782565b81146137d257600080fd5b50565b6000813590506137e4816137be565b92915050565b6000806040838503121561380157613800613588565b5b600061380f858286016137d5565b925050602061382085828601613720565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61386c82613693565b810181811067ffffffffffffffff8211171561388b5761388a613834565b5b80604052505050565b600061389e61357e565b90506138aa8282613863565b919050565b600067ffffffffffffffff8211156138ca576138c9613834565b5b6138d382613693565b9050602081019050919050565b82818337600083830152505050565b60006139026138fd846138af565b613894565b90508281526020810184848401111561391e5761391d61382f565b5b6139298482856138e0565b509392505050565b600082601f8301126139465761394561382a565b5b81356139568482602086016138ef565b91505092915050565b6000806040838503121561397657613975613588565b5b600061398485828601613720565b925050602083013567ffffffffffffffff8111156139a5576139a461358d565b5b6139b185828601613931565b9150509250929050565b6139c4816136ff565b82525050565b60006020820190506139df60008301846139bb565b92915050565b6000806000606084860312156139fe576139fd613588565b5b6000613a0c868287016137d5565b9350506020613a1d868287016137d5565b9250506040613a2e86828701613720565b9150509250925092565b6000819050919050565b613a4b81613a38565b8114613a5657600080fd5b50565b600081359050613a6881613a42565b92915050565b600060208284031215613a8457613a83613588565b5b6000613a9284828501613a59565b91505092915050565b613aa481613a38565b82525050565b6000602082019050613abf6000830184613a9b565b92915050565b60008060408385031215613adc57613adb613588565b5b6000613aea85828601613a59565b9250506020613afb858286016137d5565b9150509250929050565b600060208284031215613b1b57613b1a613588565b5b6000613b29848285016137d5565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613b67816136ff565b82525050565b6000613b798383613b5e565b60208301905092915050565b6000602082019050919050565b6000613b9d82613b32565b613ba78185613b3d565b9350613bb283613b4e565b8060005b83811015613be3578151613bca8882613b6d565b9750613bd583613b85565b925050600181019050613bb6565b5085935050505092915050565b60006020820190508181036000830152613c0a8184613b92565b905092915050565b600060208284031215613c2857613c27613588565b5b600082013567ffffffffffffffff811115613c4657613c4561358d565b5b613c5284828501613931565b91505092915050565b613c6481613617565b8114613c6f57600080fd5b50565b600081359050613c8181613c5b565b92915050565b60008060408385031215613c9e57613c9d613588565b5b6000613cac858286016137d5565b9250506020613cbd85828601613c72565b9150509250929050565b600067ffffffffffffffff821115613ce257613ce1613834565b5b613ceb82613693565b9050602081019050919050565b6000613d0b613d0684613cc7565b613894565b905082815260208101848484011115613d2757613d2661382f565b5b613d328482856138e0565b509392505050565b600082601f830112613d4f57613d4e61382a565b5b8135613d5f848260208601613cf8565b91505092915050565b60008060008060808587031215613d8257613d81613588565b5b6000613d90878288016137d5565b9450506020613da1878288016137d5565b9350506040613db287828801613720565b925050606085013567ffffffffffffffff811115613dd357613dd261358d565b5b613ddf87828801613d3a565b91505092959194509250565b60008060408385031215613e0257613e01613588565b5b6000613e10858286016137d5565b9250506020613e21858286016137d5565b9150509250929050565b600067ffffffffffffffff821115613e4657613e45613834565b5b602082029050602081019050919050565b600080fd5b6000613e6f613e6a84613e2b565b613894565b90508083825260208201905060208402830185811115613e9257613e91613e57565b5b835b81811015613ebb5780613ea788826137d5565b845260208401935050602081019050613e94565b5050509392505050565b600082601f830112613eda57613ed961382a565b5b8135613eea848260208601613e5c565b91505092915050565b600067ffffffffffffffff821115613f0e57613f0d613834565b5b602082029050602081019050919050565b6000613f32613f2d84613ef3565b613894565b90508083825260208201905060208402830185811115613f5557613f54613e57565b5b835b81811015613f7e5780613f6a8882613720565b845260208401935050602081019050613f57565b5050509392505050565b600082601f830112613f9d57613f9c61382a565b5b8135613fad848260208601613f1f565b91505092915050565b60008060408385031215613fcd57613fcc613588565b5b600083013567ffffffffffffffff811115613feb57613fea61358d565b5b613ff785828601613ec5565b925050602083013567ffffffffffffffff8111156140185761401761358d565b5b61402485828601613f88565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061407557607f821691505b6020821081036140885761408761402e565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006140ea602183613658565b91506140f58261408e565b604082019050919050565b60006020820190508181036000830152614119816140dd565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b600061417c603d83613658565b915061418782614120565b604082019050919050565b600060208201905081810360008301526141ab8161416f565b9050919050565b7f43616c6c6572206973206e6f7420616e2061646d696e00000000000000000000600082015250565b60006141e8601683613658565b91506141f3826141b2565b602082019050919050565b60006020820190508181036000830152614217816141db565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026142807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614243565b61428a8683614243565b95508019841693508086168417925050509392505050565b6000819050919050565b60006142c76142c26142bd846136ff565b6142a2565b6136ff565b9050919050565b6000819050919050565b6142e1836142ac565b6142f56142ed826142ce565b848454614250565b825550505050565b600090565b61430a6142fd565b6143158184846142d8565b505050565b5b818110156143395761432e600082614302565b60018101905061431b565b5050565b601f82111561437e5761434f8161421e565b61435884614233565b81016020851015614367578190505b61437b61437385614233565b83018261431a565b50505b505050565b600082821c905092915050565b60006143a160001984600802614383565b1980831691505092915050565b60006143ba8383614390565b9150826002028217905092915050565b6143d38261364d565b67ffffffffffffffff8111156143ec576143eb613834565b5b6143f6825461405d565b61440182828561433d565b600060209050601f8311600181146144345760008415614422578287015190505b61442c85826143ae565b865550614494565b601f1984166144428661421e565b60005b8281101561446a57848901518255600182019150602085019450602081019050614445565b868310156144875784890151614483601f891682614390565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006144f8602d83613658565b91506145038261449c565b604082019050919050565b60006020820190508181036000830152614527816144eb565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061458a602b83613658565b91506145958261452e565b604082019050919050565b600060208201905081810360008301526145b98161457d565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b600061461c602f83613658565b9150614627826145c0565b604082019050919050565b6000602082019050818103600083015261464b8161460f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006146bb826136ff565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036146ed576146ec614681565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614754602c83613658565b915061475f826146f8565b604082019050919050565b6000602082019050818103600083015261478381614747565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006147c0601883613658565b91506147cb8261478a565b602082019050919050565b600060208201905081810360008301526147ef816147b3565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614852602983613658565b915061485d826147f6565b604082019050919050565b6000602082019050818103600083015261488181614845565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006148e4602f83613658565b91506148ef82614888565b604082019050919050565b60006020820190508181036000830152614913816148d7565b9050919050565b600081905092915050565b60006149308261364d565b61493a818561491a565b935061494a818560208601613669565b80840191505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b600061498c60018361491a565b915061499782614956565b600182019050919050565b60006149ae8285614925565b91506149b98261497f565b91506149c58284614925565b91508190509392505050565b7f55736572206e6f7420696e20736e617073686f74000000000000000000000000600082015250565b6000614a07601483613658565b9150614a12826149d1565b602082019050919050565b60006020820190508181036000830152614a36816149fa565b9050919050565b7f4e6f206d6f7265206d696e7473206176616961626c6500000000000000000000600082015250565b6000614a73601683613658565b9150614a7e82614a3d565b602082019050919050565b60006020820190508181036000830152614aa281614a66565b9050919050565b6000614ab4826136ff565b9150614abf836136ff565b9250828201905080821115614ad757614ad6614681565b5b92915050565b6000614ae8826136ff565b9150614af3836136ff565b9250828203905081811115614b0b57614b0a614681565b5b92915050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614b6d602583613658565b9150614b7882614b11565b604082019050919050565b60006020820190508181036000830152614b9c81614b60565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614bff602483613658565b9150614c0a82614ba3565b604082019050919050565b60006020820190508181036000830152614c2e81614bf2565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614c6b601983613658565b9150614c7682614c35565b602082019050919050565b60006020820190508181036000830152614c9a81614c5e565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614cfd603283613658565b9150614d0882614ca1565b604082019050919050565b60006020820190508181036000830152614d2c81614cf0565b9050919050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000614d6960178361491a565b9150614d7482614d33565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614db560118361491a565b9150614dc082614d7f565b601182019050919050565b6000614dd682614d5c565b9150614de28285614925565b9150614ded82614da8565b9150614df98284614925565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614e3b601483613658565b9150614e4682614e05565b602082019050919050565b60006020820190508181036000830152614e6a81614e2e565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614ea7601083613658565b9150614eb282614e71565b602082019050919050565b60006020820190508181036000830152614ed681614e9a565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614f0482614edd565b614f0e8185614ee8565b9350614f1e818560208601613669565b614f2781613693565b840191505092915050565b6000608082019050614f476000830187613794565b614f546020830186613794565b614f6160408301856139bb565b8181036060830152614f738184614ef9565b905095945050505050565b600081519050614f8d816135be565b92915050565b600060208284031215614fa957614fa8613588565b5b6000614fb784828501614f7e565b91505092915050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b600061501c603583613658565b915061502782614fc0565b604082019050919050565b6000602082019050818103600083015261504b8161500f565b9050919050565b600061505d826136ff565b9150615068836136ff565b9250828202615076816136ff565b9150828204841483151761508d5761508c614681565b5b5092915050565b600061509f826136ff565b9150600082036150b2576150b1614681565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006150f3602083613658565b91506150fe826150bd565b602082019050919050565b60006020820190508181036000830152615122816150e6565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061515f602083613658565b915061516a82615129565b602082019050919050565b6000602082019050818103600083015261518e81615152565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006151cb601c83613658565b91506151d682615195565b602082019050919050565b600060208201905081810360008301526151fa816151be565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122035d9390190c8a0009872dc9ca3dbc13c7a7ad0b76b6d50c12871f71e3bdaa1fa64736f6c63430008120033000000000000000000000000d51b681526ba8ec9f54b07c3274a9e5bf0c10111
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061023d5760003560e01c80635ecf8a801161013b578063a22cb465116100b8578063d547741f1161007c578063d547741f146106e6578063d85d3d2714610702578063e985e9c51461071e578063f01bc0291461074e578063fc3aeb221461076a5761023d565b8063a22cb46514610632578063a45578941461064e578063b88d4fde1461067e578063c634b78e1461069a578063c87b56dd146106b65761023d565b80638456cb59116100ff5780638456cb59146105a057806391d14854146105aa57806395d89b41146105da5780639a19c7b0146105f8578063a217fddf146106145761023d565b80635ecf8a80146104c25780636352211e146104f257806370a082311461052257806371e3ef9d1461055257806375b238fc146105825761023d565b80632f745c59116101c9578063438b63001161018d578063438b63001461040c57806349ddaf9b1461043c5780634f6ccce71461045857806355f804b3146104885780635c975abb146104a45761023d565b80632f745c591461037e57806336568abe146103ae5780633f4ba83a146103ca57806342842e0e146103d457806342966c68146103f05761023d565b80631006b841116102105780631006b841146102dc57806318160ddd146102f857806323b872dd14610316578063248a9ca3146103325780632f2ff15d146103625761023d565b806301ffc9a71461024257806306fdde0314610272578063081812fc14610290578063095ea7b3146102c0575b600080fd5b61025c600480360381019061025791906135ea565b61079a565b6040516102699190613632565b60405180910390f35b61027a6107ac565b60405161028791906136dd565b60405180910390f35b6102aa60048036038101906102a59190613735565b61083e565b6040516102b791906137a3565b60405180910390f35b6102da60048036038101906102d591906137ea565b610884565b005b6102f660048036038101906102f1919061395f565b61099b565b005b610300610a48565b60405161030d91906139ca565b60405180910390f35b610330600480360381019061032b91906139e5565b610a55565b005b61034c60048036038101906103479190613a6e565b610ab5565b6040516103599190613aaa565b60405180910390f35b61037c60048036038101906103779190613ac5565b610ad5565b005b610398600480360381019061039391906137ea565b610af6565b6040516103a591906139ca565b60405180910390f35b6103c860048036038101906103c39190613ac5565b610b9b565b005b6103d2610c1e565b005b6103ee60048036038101906103e991906139e5565b610c91565b005b61040a60048036038101906104059190613735565b610cb1565b005b61042660048036038101906104219190613b05565b610d0d565b6040516104339190613bf0565b60405180910390f35b610456600480360381019061045191906137ea565b610dbb565b005b610472600480360381019061046d9190613735565b610eaf565b60405161047f91906139ca565b60405180910390f35b6104a2600480360381019061049d9190613c12565b610f20565b005b6104ac610f9c565b6040516104b99190613632565b60405180910390f35b6104dc60048036038101906104d79190613b05565b610fb3565b6040516104e991906139ca565b60405180910390f35b61050c60048036038101906105079190613735565b610fcb565b60405161051991906137a3565b60405180910390f35b61053c60048036038101906105379190613b05565b611051565b60405161054991906139ca565b60405180910390f35b61056c60048036038101906105679190613735565b611108565b60405161057991906137a3565b60405180910390f35b61058a611147565b6040516105979190613aaa565b60405180910390f35b6105a861116b565b005b6105c460048036038101906105bf9190613ac5565b6111de565b6040516105d19190613632565b60405180910390f35b6105e2611249565b6040516105ef91906136dd565b60405180910390f35b610612600480360381019061060d9190613b05565b6112db565b005b61061c611371565b6040516106299190613aaa565b60405180910390f35b61064c60048036038101906106479190613c87565b611378565b005b61066860048036038101906106639190613b05565b61138e565b6040516106759190613632565b60405180910390f35b61069860048036038101906106939190613d68565b61143c565b005b6106b460048036038101906106af9190613b05565b61149e565b005b6106d060048036038101906106cb9190613735565b611534565b6040516106dd91906136dd565b60405180910390f35b61070060048036038101906106fb9190613ac5565b611681565b005b61071c60048036038101906107179190613c12565b6116a2565b005b61073860048036038101906107339190613deb565b6117d3565b6040516107459190613632565b60405180910390f35b61076860048036038101906107639190613fb6565b611867565b005b610784600480360381019061077f9190613735565b6119e9565b60405161079191906136dd565b60405180910390f35b60006107a582611a89565b9050919050565b6060600080546107bb9061405d565b80601f01602080910402602001604051908101604052809291908181526020018280546107e79061405d565b80156108345780601f1061080957610100808354040283529160200191610834565b820191906000526020600020905b81548152906001019060200180831161081757829003601f168201915b5050505050905090565b600061084982611b03565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061088f82610fcb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f690614100565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661091e611b4e565b73ffffffffffffffffffffffffffffffffffffffff16148061094d575061094c81610947611b4e565b6117d3565b5b61098c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098390614192565b60405180910390fd5b6109968383611b56565b505050565b6109c57fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775336111de565b610a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fb906141fe565b60405180910390fd5b600e60008381526020019081526020016000206000610a239190613521565b80600e60008481526020019081526020016000209081610a4391906143ca565b505050565b6000600880549050905090565b610a66610a60611b4e565b82611c0f565b610aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9c9061450e565b60405180910390fd5b610ab0838383611ca4565b505050565b6000600b6000838152602001908152602001600020600101549050919050565b610ade82610ab5565b610ae781611f9d565b610af18383611fb1565b505050565b6000610b0183611051565b8210610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b39906145a0565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ba3611b4e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0790614632565b60405180910390fd5b610c1a8282612092565b5050565b610c487fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775336111de565b610c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7e906141fe565b60405180910390fd5b610c8f612174565b565b610cac8383836040518060200160405280600081525061143c565b505050565b610cc2610cbc611b4e565b82611c0f565b610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf89061450e565b60405180910390fd5b610d0a816121d7565b50565b60606000610d1a83611051565b905060008167ffffffffffffffff811115610d3857610d37613834565b5b604051908082528060200260200182016040528015610d665781602001602082028036833780820191505090505b50905060005b82811015610db057610d7e8582610af6565b828281518110610d9157610d90614652565b5b6020026020010181815250508080610da8906146b0565b915050610d6c565b508092505050919050565b610de57fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775336111de565b610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b906141fe565b60405180910390fd5b600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000905580600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6000610eb9610a48565b8210610efa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef19061476a565b60405180910390fd5b60088281548110610f0e57610f0d614652565b5b90600052602060002001549050919050565b610f4a7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775336111de565b610f89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f80906141fe565b60405180910390fd5b80600c9081610f9891906143ca565b5050565b6000600a60009054906101000a900460ff16905090565b600f6020528060005260406000206000915090505481565b600080610fd783612325565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103f906147d6565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b890614868565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600d818154811061111857600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b6111957fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775336111de565b6111d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cb906141fe565b60405180910390fd5b6111dc612362565b565b6000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600180546112589061405d565b80601f01602080910402602001604051908101604052809291908181526020018280546112849061405d565b80156112d15780601f106112a6576101008083540402835291602001916112d1565b820191906000526020600020905b8154815290600101906020018083116112b457829003601f168201915b5050505050905090565b6113057fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775336111de565b611344576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133b906141fe565b60405180910390fd5b61136e7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177582611681565b50565b6000801b81565b61138a611383611b4e565b83836123c5565b5050565b600080600090505b600d80549050811015611431578273ffffffffffffffffffffffffffffffffffffffff16600d82815481106113ce576113cd614652565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361141e576001915050611437565b8080611429906146b0565b915050611396565b50600090505b919050565b61144d611447611b4e565b83611c0f565b61148c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114839061450e565b60405180910390fd5b61149884848484612531565b50505050565b6114c87fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775336111de565b611507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fe906141fe565b60405180910390fd5b6115317fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177582610ad5565b50565b606061153f8261258d565b61157e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611575906148fa565b60405180910390fd5b60006115886125ce565b90506000600e600085815260200190815260200160002080546115aa9061405d565b80601f01602080910402602001604051908101604052809291908181526020018280546115d69061405d565b80156116235780601f106115f857610100808354040283529160200191611623565b820191906000526020600020905b81548152906001019060200180831161160657829003601f168201915b505050505090506000600c80546116399061405d565b9050116116555760405180602001604052806000815250611678565b81816040516020016116689291906149a2565b6040516020818303038152906040525b92505050919050565b61168a82610ab5565b61169381611f9d565b61169d8383612092565b505050565b6116ab3361138e565b6116ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e190614a1d565b60405180910390fd5b60003390506000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111611776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176d90614a89565b60405180910390fd5b60006001611782610a48565b61178c9190614aa9565b90506117983382612660565b6117a2818561267e565b6117b8836001846117b39190614add565b6126a3565b60016117c2610a48565b6117cc9190614aa9565b5050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118917fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775336111de565b6118d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c7906141fe565b60405180910390fd5b60005b82518110156119e4578181815181106118ef576118ee614652565b5b6020026020010151600f600085848151811061190e5761190d614652565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600d83828151811061196957611968614652565b5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080806119dc906146b0565b9150506118d3565b505050565b600e6020528060005260406000206000915090508054611a089061405d565b80601f0160208091040260200160405190810160405280929190818152602001828054611a349061405d565b8015611a815780601f10611a5657610100808354040283529160200191611a81565b820191906000526020600020905b815481529060010190602001808311611a6457829003601f168201915b505050505081565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611afc5750611afb8261272e565b5b9050919050565b611b0c8161258d565b611b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b42906147d6565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611bc983610fcb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611c1b83610fcb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c5d5750611c5c81856117d3565b5b80611c9b57508373ffffffffffffffffffffffffffffffffffffffff16611c838461083e565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611cc482610fcb565b73ffffffffffffffffffffffffffffffffffffffff1614611d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1190614b83565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8090614c15565b60405180910390fd5b611d9683838360016127a8565b8273ffffffffffffffffffffffffffffffffffffffff16611db682610fcb565b73ffffffffffffffffffffffffffffffffffffffff1614611e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0390614b83565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f9883838360016127c2565b505050565b611fae81611fa9611b4e565b6127c8565b50565b611fbb82826111de565b61208e576001600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612033611b4e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61209c82826111de565b15612170576000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612115611b4e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b61217c61284d565b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6121c0611b4e565b6040516121cd91906137a3565b60405180910390a1565b60006121e282610fcb565b90506121f28160008460016127a8565b6121fb82610fcb565b90506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123218160008460016127c2565b5050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61236a612896565b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586123ae611b4e565b6040516123bb91906137a3565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242a90614c81565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125249190613632565b60405180910390a3505050565b61253c848484611ca4565b612548848484846128e0565b612587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257e90614d13565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166125af83612325565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600c80546125dd9061405d565b80601f01602080910402602001604051908101604052809291908181526020018280546126099061405d565b80156126565780601f1061262b57610100808354040283529160200191612656565b820191906000526020600020905b81548152906001019060200180831161263957829003601f168201915b5050505050905090565b61267a828260405180602001604052806000815250612a67565b5050565b80600e6000848152602001908152602001600020908161269e91906143ca565b505050565b600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000905580600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806127a157506127a082612ac2565b5b9050919050565b6127b0612896565b6127bc84848484612ba4565b50505050565b50505050565b6127d282826111de565b612849576127df81612d02565b6127ed8360001c6020612d2f565b6040516020016127fe929190614dcb565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284091906136dd565b60405180910390fd5b5050565b612855610f9c565b612894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288b90614e51565b60405180910390fd5b565b61289e610f9c565b156128de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d590614ebd565b60405180910390fd5b565b60006129018473ffffffffffffffffffffffffffffffffffffffff16612f6b565b15612a5a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261292a611b4e565b8786866040518563ffffffff1660e01b815260040161294c9493929190614f32565b6020604051808303816000875af192505050801561298857506040513d601f19601f820116820180604052508101906129859190614f93565b60015b612a0a573d80600081146129b8576040519150601f19603f3d011682016040523d82523d6000602084013e6129bd565b606091505b506000815103612a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f990614d13565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a5f565b600190505b949350505050565b612a718383612f8e565b612a7e60008484846128e0565b612abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab490614d13565b60405180910390fd5b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b8d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612b9d5750612b9c826131ab565b5b9050919050565b612bb084848484613215565b6001811115612bf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612beb90615032565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612c3b57612c368161321b565b612c7a565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612c7957612c788582613264565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612cbc57612cb7816133d1565b612cfb565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612cfa57612cf984826134a2565b5b5b5050505050565b6060612d288273ffffffffffffffffffffffffffffffffffffffff16601460ff16612d2f565b9050919050565b606060006002836002612d429190615052565b612d4c9190614aa9565b67ffffffffffffffff811115612d6557612d64613834565b5b6040519080825280601f01601f191660200182016040528015612d975781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612dcf57612dce614652565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612e3357612e32614652565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612e739190615052565b612e7d9190614aa9565b90505b6001811115612f1d577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612ebf57612ebe614652565b5b1a60f81b828281518110612ed657612ed5614652565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612f1690615094565b9050612e80565b5060008414612f61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5890615109565b60405180910390fd5b8091505092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff490615175565b60405180910390fd5b6130068161258d565b15613046576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303d906151e1565b60405180910390fd5b6130546000838360016127a8565b61305d8161258d565b1561309d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613094906151e1565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131a76000838360016127c2565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161327184611051565b61327b9190614add565b9050600060076000848152602001908152602001600020549050818114613360576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506133e59190614add565b905060006009600084815260200190815260200160002054905060006008838154811061341557613414614652565b5b90600052602060002001549050806008838154811061343757613436614652565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061348657613485615201565b5b6001900381819060005260206000200160009055905550505050565b60006134ad83611051565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b50805461352d9061405d565b6000825580601f1061353f575061355e565b601f01602090049060005260206000209081019061355d9190613561565b5b50565b5b8082111561357a576000816000905550600101613562565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6135c781613592565b81146135d257600080fd5b50565b6000813590506135e4816135be565b92915050565b600060208284031215613600576135ff613588565b5b600061360e848285016135d5565b91505092915050565b60008115159050919050565b61362c81613617565b82525050565b60006020820190506136476000830184613623565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561368757808201518184015260208101905061366c565b60008484015250505050565b6000601f19601f8301169050919050565b60006136af8261364d565b6136b98185613658565b93506136c9818560208601613669565b6136d281613693565b840191505092915050565b600060208201905081810360008301526136f781846136a4565b905092915050565b6000819050919050565b613712816136ff565b811461371d57600080fd5b50565b60008135905061372f81613709565b92915050565b60006020828403121561374b5761374a613588565b5b600061375984828501613720565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061378d82613762565b9050919050565b61379d81613782565b82525050565b60006020820190506137b86000830184613794565b92915050565b6137c781613782565b81146137d257600080fd5b50565b6000813590506137e4816137be565b92915050565b6000806040838503121561380157613800613588565b5b600061380f858286016137d5565b925050602061382085828601613720565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61386c82613693565b810181811067ffffffffffffffff8211171561388b5761388a613834565b5b80604052505050565b600061389e61357e565b90506138aa8282613863565b919050565b600067ffffffffffffffff8211156138ca576138c9613834565b5b6138d382613693565b9050602081019050919050565b82818337600083830152505050565b60006139026138fd846138af565b613894565b90508281526020810184848401111561391e5761391d61382f565b5b6139298482856138e0565b509392505050565b600082601f8301126139465761394561382a565b5b81356139568482602086016138ef565b91505092915050565b6000806040838503121561397657613975613588565b5b600061398485828601613720565b925050602083013567ffffffffffffffff8111156139a5576139a461358d565b5b6139b185828601613931565b9150509250929050565b6139c4816136ff565b82525050565b60006020820190506139df60008301846139bb565b92915050565b6000806000606084860312156139fe576139fd613588565b5b6000613a0c868287016137d5565b9350506020613a1d868287016137d5565b9250506040613a2e86828701613720565b9150509250925092565b6000819050919050565b613a4b81613a38565b8114613a5657600080fd5b50565b600081359050613a6881613a42565b92915050565b600060208284031215613a8457613a83613588565b5b6000613a9284828501613a59565b91505092915050565b613aa481613a38565b82525050565b6000602082019050613abf6000830184613a9b565b92915050565b60008060408385031215613adc57613adb613588565b5b6000613aea85828601613a59565b9250506020613afb858286016137d5565b9150509250929050565b600060208284031215613b1b57613b1a613588565b5b6000613b29848285016137d5565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613b67816136ff565b82525050565b6000613b798383613b5e565b60208301905092915050565b6000602082019050919050565b6000613b9d82613b32565b613ba78185613b3d565b9350613bb283613b4e565b8060005b83811015613be3578151613bca8882613b6d565b9750613bd583613b85565b925050600181019050613bb6565b5085935050505092915050565b60006020820190508181036000830152613c0a8184613b92565b905092915050565b600060208284031215613c2857613c27613588565b5b600082013567ffffffffffffffff811115613c4657613c4561358d565b5b613c5284828501613931565b91505092915050565b613c6481613617565b8114613c6f57600080fd5b50565b600081359050613c8181613c5b565b92915050565b60008060408385031215613c9e57613c9d613588565b5b6000613cac858286016137d5565b9250506020613cbd85828601613c72565b9150509250929050565b600067ffffffffffffffff821115613ce257613ce1613834565b5b613ceb82613693565b9050602081019050919050565b6000613d0b613d0684613cc7565b613894565b905082815260208101848484011115613d2757613d2661382f565b5b613d328482856138e0565b509392505050565b600082601f830112613d4f57613d4e61382a565b5b8135613d5f848260208601613cf8565b91505092915050565b60008060008060808587031215613d8257613d81613588565b5b6000613d90878288016137d5565b9450506020613da1878288016137d5565b9350506040613db287828801613720565b925050606085013567ffffffffffffffff811115613dd357613dd261358d565b5b613ddf87828801613d3a565b91505092959194509250565b60008060408385031215613e0257613e01613588565b5b6000613e10858286016137d5565b9250506020613e21858286016137d5565b9150509250929050565b600067ffffffffffffffff821115613e4657613e45613834565b5b602082029050602081019050919050565b600080fd5b6000613e6f613e6a84613e2b565b613894565b90508083825260208201905060208402830185811115613e9257613e91613e57565b5b835b81811015613ebb5780613ea788826137d5565b845260208401935050602081019050613e94565b5050509392505050565b600082601f830112613eda57613ed961382a565b5b8135613eea848260208601613e5c565b91505092915050565b600067ffffffffffffffff821115613f0e57613f0d613834565b5b602082029050602081019050919050565b6000613f32613f2d84613ef3565b613894565b90508083825260208201905060208402830185811115613f5557613f54613e57565b5b835b81811015613f7e5780613f6a8882613720565b845260208401935050602081019050613f57565b5050509392505050565b600082601f830112613f9d57613f9c61382a565b5b8135613fad848260208601613f1f565b91505092915050565b60008060408385031215613fcd57613fcc613588565b5b600083013567ffffffffffffffff811115613feb57613fea61358d565b5b613ff785828601613ec5565b925050602083013567ffffffffffffffff8111156140185761401761358d565b5b61402485828601613f88565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061407557607f821691505b6020821081036140885761408761402e565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006140ea602183613658565b91506140f58261408e565b604082019050919050565b60006020820190508181036000830152614119816140dd565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b600061417c603d83613658565b915061418782614120565b604082019050919050565b600060208201905081810360008301526141ab8161416f565b9050919050565b7f43616c6c6572206973206e6f7420616e2061646d696e00000000000000000000600082015250565b60006141e8601683613658565b91506141f3826141b2565b602082019050919050565b60006020820190508181036000830152614217816141db565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026142807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614243565b61428a8683614243565b95508019841693508086168417925050509392505050565b6000819050919050565b60006142c76142c26142bd846136ff565b6142a2565b6136ff565b9050919050565b6000819050919050565b6142e1836142ac565b6142f56142ed826142ce565b848454614250565b825550505050565b600090565b61430a6142fd565b6143158184846142d8565b505050565b5b818110156143395761432e600082614302565b60018101905061431b565b5050565b601f82111561437e5761434f8161421e565b61435884614233565b81016020851015614367578190505b61437b61437385614233565b83018261431a565b50505b505050565b600082821c905092915050565b60006143a160001984600802614383565b1980831691505092915050565b60006143ba8383614390565b9150826002028217905092915050565b6143d38261364d565b67ffffffffffffffff8111156143ec576143eb613834565b5b6143f6825461405d565b61440182828561433d565b600060209050601f8311600181146144345760008415614422578287015190505b61442c85826143ae565b865550614494565b601f1984166144428661421e565b60005b8281101561446a57848901518255600182019150602085019450602081019050614445565b868310156144875784890151614483601f891682614390565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006144f8602d83613658565b91506145038261449c565b604082019050919050565b60006020820190508181036000830152614527816144eb565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061458a602b83613658565b91506145958261452e565b604082019050919050565b600060208201905081810360008301526145b98161457d565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b600061461c602f83613658565b9150614627826145c0565b604082019050919050565b6000602082019050818103600083015261464b8161460f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006146bb826136ff565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036146ed576146ec614681565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614754602c83613658565b915061475f826146f8565b604082019050919050565b6000602082019050818103600083015261478381614747565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006147c0601883613658565b91506147cb8261478a565b602082019050919050565b600060208201905081810360008301526147ef816147b3565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614852602983613658565b915061485d826147f6565b604082019050919050565b6000602082019050818103600083015261488181614845565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006148e4602f83613658565b91506148ef82614888565b604082019050919050565b60006020820190508181036000830152614913816148d7565b9050919050565b600081905092915050565b60006149308261364d565b61493a818561491a565b935061494a818560208601613669565b80840191505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b600061498c60018361491a565b915061499782614956565b600182019050919050565b60006149ae8285614925565b91506149b98261497f565b91506149c58284614925565b91508190509392505050565b7f55736572206e6f7420696e20736e617073686f74000000000000000000000000600082015250565b6000614a07601483613658565b9150614a12826149d1565b602082019050919050565b60006020820190508181036000830152614a36816149fa565b9050919050565b7f4e6f206d6f7265206d696e7473206176616961626c6500000000000000000000600082015250565b6000614a73601683613658565b9150614a7e82614a3d565b602082019050919050565b60006020820190508181036000830152614aa281614a66565b9050919050565b6000614ab4826136ff565b9150614abf836136ff565b9250828201905080821115614ad757614ad6614681565b5b92915050565b6000614ae8826136ff565b9150614af3836136ff565b9250828203905081811115614b0b57614b0a614681565b5b92915050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614b6d602583613658565b9150614b7882614b11565b604082019050919050565b60006020820190508181036000830152614b9c81614b60565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614bff602483613658565b9150614c0a82614ba3565b604082019050919050565b60006020820190508181036000830152614c2e81614bf2565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614c6b601983613658565b9150614c7682614c35565b602082019050919050565b60006020820190508181036000830152614c9a81614c5e565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614cfd603283613658565b9150614d0882614ca1565b604082019050919050565b60006020820190508181036000830152614d2c81614cf0565b9050919050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000614d6960178361491a565b9150614d7482614d33565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614db560118361491a565b9150614dc082614d7f565b601182019050919050565b6000614dd682614d5c565b9150614de28285614925565b9150614ded82614da8565b9150614df98284614925565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614e3b601483613658565b9150614e4682614e05565b602082019050919050565b60006020820190508181036000830152614e6a81614e2e565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614ea7601083613658565b9150614eb282614e71565b602082019050919050565b60006020820190508181036000830152614ed681614e9a565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614f0482614edd565b614f0e8185614ee8565b9350614f1e818560208601613669565b614f2781613693565b840191505092915050565b6000608082019050614f476000830187613794565b614f546020830186613794565b614f6160408301856139bb565b8181036060830152614f738184614ef9565b905095945050505050565b600081519050614f8d816135be565b92915050565b600060208284031215614fa957614fa8613588565b5b6000614fb784828501614f7e565b91505092915050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b600061501c603583613658565b915061502782614fc0565b604082019050919050565b6000602082019050818103600083015261504b8161500f565b9050919050565b600061505d826136ff565b9150615068836136ff565b9250828202615076816136ff565b9150828204841483151761508d5761508c614681565b5b5092915050565b600061509f826136ff565b9150600082036150b2576150b1614681565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006150f3602083613658565b91506150fe826150bd565b602082019050919050565b60006020820190508181036000830152615122816150e6565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061515f602083613658565b915061516a82615129565b602082019050919050565b6000602082019050818103600083015261518e81615152565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006151cb601c83613658565b91506151d682615195565b602082019050919050565b600060208201905081810360008301526151fa816151be565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122035d9390190c8a0009872dc9ca3dbc13c7a7ad0b76b6d50c12871f71e3bdaa1fa64736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d51b681526ba8ec9f54b07c3274a9e5bf0c10111
-----Decoded View---------------
Arg [0] : initialAdmin (address): 0xd51B681526Ba8ec9F54b07c3274a9E5Bf0C10111
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000d51b681526ba8ec9f54b07c3274a9e5bf0c10111
Deployed Bytecode Sourcemap
92954:4811:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;93628:194;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67896:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69408:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68926:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;95161:293;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84829:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70108:335;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54718:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55159:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84497:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56303:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;97695:65;;;:::i;:::-;;70514:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92623:242;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;96844:386;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;94878:275;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85019:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93828:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36908:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93208:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67606:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67337:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93109:34;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93263:60;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;97626:61;;;:::i;:::-;;53191:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68065:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;94465:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52296:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69651:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;97238:264;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70770:322;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;94354:103;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;96328:508;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55599:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;95477:467;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69877:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93938:271;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93152:49;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93628:194;93754:4;93778:36;93802:11;93778:23;:36::i;:::-;93771:43;;93628:194;;;:::o;67896:100::-;67950:13;67983:5;67976:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67896:100;:::o;69408:171::-;69484:7;69504:23;69519:7;69504:14;:23::i;:::-;69547:15;:24;69563:7;69547:24;;;;;;;;;;;;;;;;;;;;;69540:31;;69408:171;;;:::o;68926:416::-;69007:13;69023:23;69038:7;69023:14;:23::i;:::-;69007:39;;69071:5;69065:11;;:2;:11;;;69057:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;69165:5;69149:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;69174:37;69191:5;69198:12;:10;:12::i;:::-;69174:16;:37::i;:::-;69149:62;69127:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;69313:21;69322:2;69326:7;69313:8;:21::i;:::-;68996:346;68926:416;;:::o;95161:293::-;93546:31;93300:23;93566:10;93546:7;:31::i;:::-;93538:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;95326:15:::1;:24;95342:7;95326:24;;;;;;;;;;;;95319:31;;;;:::i;:::-;95438:8;95411:15;:24;95427:7;95411:24;;;;;;;;;;;:35;;;;;;:::i;:::-;;95161:293:::0;;:::o;84829:113::-;84890:7;84917:10;:17;;;;84910:24;;84829:113;:::o;70108:335::-;70303:41;70322:12;:10;:12::i;:::-;70336:7;70303:18;:41::i;:::-;70295:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;70407:28;70417:4;70423:2;70427:7;70407:9;:28::i;:::-;70108:335;;;:::o;54718:131::-;54792:7;54819:6;:12;54826:4;54819:12;;;;;;;;;;;:22;;;54812:29;;54718:131;;;:::o;55159:147::-;55242:18;55255:4;55242:12;:18::i;:::-;52787:16;52798:4;52787:10;:16::i;:::-;55273:25:::1;55284:4;55290:7;55273:10;:25::i;:::-;55159:147:::0;;;:::o;84497:256::-;84594:7;84630:23;84647:5;84630:16;:23::i;:::-;84622:5;:31;84614:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;84719:12;:19;84732:5;84719:19;;;;;;;;;;;;;;;:26;84739:5;84719:26;;;;;;;;;;;;84712:33;;84497:256;;;;:::o;56303:218::-;56410:12;:10;:12::i;:::-;56399:23;;:7;:23;;;56391:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;56487:26;56499:4;56505:7;56487:11;:26::i;:::-;56303:218;;:::o;97695:65::-;93546:31;93300:23;93566:10;93546:7;:31::i;:::-;93538:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;97742:10:::1;:8;:10::i;:::-;97695:65::o:0;70514:185::-;70652:39;70669:4;70675:2;70679:7;70652:39;;;;;;;;;;;;:16;:39::i;:::-;70514:185;;;:::o;92623:242::-;92741:41;92760:12;:10;:12::i;:::-;92774:7;92741:18;:41::i;:::-;92733:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;92843:14;92849:7;92843:5;:14::i;:::-;92623:242;:::o;96844:386::-;96931:16;96965:23;96991:17;97001:6;96991:9;:17::i;:::-;96965:43;;97019:25;97061:15;97047:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;97019:58;;97093:9;97088:109;97108:15;97104:1;:19;97088:109;;;97155:30;97175:6;97183:1;97155:19;:30::i;:::-;97141:8;97150:1;97141:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;97125:3;;;;;:::i;:::-;;;;97088:109;;;;97214:8;97207:15;;;;96844:386;;;:::o;94878:275::-;93546:31;93300:23;93566:10;93546:7;:31::i;:::-;93538:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;95028:13:::1;:23;95042:8;95028:23;;;;;;;;;;;;;;;95021:30;;;95138:7;95112:13;:23;95126:8;95112:23;;;;;;;;;;;;;;;:33;;;;94878:275:::0;;:::o;85019:233::-;85094:7;85130:30;:28;:30::i;:::-;85122:5;:38;85114:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;85227:10;85238:5;85227:17;;;;;;;;:::i;:::-;;;;;;;;;;85220:24;;85019:233;;;:::o;93828:104::-;93546:31;93300:23;93566:10;93546:7;:31::i;:::-;93538:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;93913:11:::1;93903:7;:21;;;;;;:::i;:::-;;93828:104:::0;:::o;36908:86::-;36955:4;36979:7;;;;;;;;;;;36972:14;;36908:86;:::o;93208:48::-;;;;;;;;;;;;;;;;;:::o;67606:223::-;67678:7;67698:13;67714:17;67723:7;67714:8;:17::i;:::-;67698:33;;67767:1;67750:19;;:5;:19;;;67742:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;67816:5;67809:12;;;67606:223;;;:::o;67337:207::-;67409:7;67454:1;67437:19;;:5;:19;;;67429:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;67520:9;:16;67530:5;67520:16;;;;;;;;;;;;;;;;67513:23;;67337:207;;;:::o;93109:34::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;93263:60::-;93300:23;93263:60;:::o;97626:61::-;93546:31;93300:23;93566:10;93546:7;:31::i;:::-;93538:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;97671:8:::1;:6;:8::i;:::-;97626:61::o:0;53191:147::-;53277:4;53301:6;:12;53308:4;53301:12;;;;;;;;;;;:20;;:29;53322:7;53301:29;;;;;;;;;;;;;;;;;;;;;;;;;53294:36;;53191:147;;;;:::o;68065:104::-;68121:13;68154:7;68147:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68065:104;:::o;94465:105::-;93546:31;93300:23;93566:10;93546:7;:31::i;:::-;93538:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;94531:31:::1;93300:23;94554:7;94531:10;:31::i;:::-;94465:105:::0;:::o;52296:49::-;52341:4;52296:49;;;:::o;69651:155::-;69746:52;69765:12;:10;:12::i;:::-;69779:8;69789;69746:18;:52::i;:::-;69651:155;;:::o;97238:264::-;97296:4;97318:6;97327:1;97318:10;;97313:159;97334:17;:24;;;;97330:1;:28;97313:159;;;97408:5;97384:29;;:17;97402:1;97384:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:29;;;97380:81;;97441:4;97434:11;;;;;97380:81;97360:3;;;;;:::i;:::-;;;;97313:159;;;;97489:5;97482:12;;97238:264;;;;:::o;70770:322::-;70944:41;70963:12;:10;:12::i;:::-;70977:7;70944:18;:41::i;:::-;70936:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;71046:38;71060:4;71066:2;71070:7;71079:4;71046:13;:38::i;:::-;70770:322;;;;:::o;94354:103::-;93546:31;93300:23;93566:10;93546:7;:31::i;:::-;93538:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;94419:30:::1;93300:23;94441:7;94419:9;:30::i;:::-;94354:103:::0;:::o;96328:508::-;96446:13;96499:16;96507:7;96499;:16::i;:::-;96477:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;96603:28;96634:10;:8;:10::i;:::-;96603:41;;96655:18;96676:15;:24;96692:7;96676:24;;;;;;;;;;;96655:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96742:1;96724:7;96718:21;;;;;:::i;:::-;;;:25;:110;;;;;;;;;;;;;;;;;96783:14;96804:4;96766:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;96718:110;96711:117;;;;96328:508;;;:::o;55599:149::-;55683:18;55696:4;55683:12;:18::i;:::-;52787:16;52798:4;52787:10;:16::i;:::-;55714:26:::1;55726:4;55732:7;55714:11;:26::i;:::-;55599:149:::0;;;:::o;95477:467::-;95541:24;95554:10;95541:12;:24::i;:::-;95533:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;95601:13;95617:10;95601:26;;95638:14;95655:13;:20;95669:5;95655:20;;;;;;;;;;;;;;;;95638:37;;95703:1;95694:6;:10;95686:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;95742:15;95776:1;95760:13;:11;:13::i;:::-;:17;;;;:::i;:::-;95742:35;;95788:30;95798:10;95810:7;95788:9;:30::i;:::-;95829:35;95845:7;95854:9;95829:15;:35::i;:::-;95875:34;95891:5;95907:1;95898:6;:10;;;;:::i;:::-;95875:15;:34::i;:::-;95935:1;95920:13;:11;:13::i;:::-;:16;;;;:::i;:::-;;95522:422;;;95477:467;:::o;69877:164::-;69974:4;69998:18;:25;70017:5;69998:25;;;;;;;;;;;;;;;:35;70024:8;69998:35;;;;;;;;;;;;;;;;;;;;;;;;;69991:42;;69877:164;;;;:::o;93938:271::-;93546:31;93300:23;93566:10;93546:7;:31::i;:::-;93538:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;94048:9:::1;94043:159;94067:9;:16;94063:1;:20;94043:159;;;94131:9;94141:1;94131:12;;;;;;;;:::i;:::-;;;;;;;;94101:13;:27;94115:9;94125:1;94115:12;;;;;;;;:::i;:::-;;;;;;;;94101:27;;;;;;;;;;;;;;;:42;;;;94154:17;94177:9;94187:1;94177:12;;;;;;;;:::i;:::-;;;;;;;;94154:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;94085:3;;;;;:::i;:::-;;;;94043:159;;;;93938:271:::0;;:::o;93152:49::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52895:204::-;52980:4;53019:32;53004:47;;;:11;:47;;;;:87;;;;53055:36;53079:11;53055:23;:36::i;:::-;53004:87;52997:94;;52895:204;;;:::o;79227:135::-;79309:16;79317:7;79309;:16::i;:::-;79301:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;79227:135;:::o;32321:98::-;32374:7;32401:10;32394:17;;32321:98;:::o;78506:174::-;78608:2;78581:15;:24;78597:7;78581:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;78664:7;78660:2;78626:46;;78635:23;78650:7;78635:14;:23::i;:::-;78626:46;;;;;;;;;;;;78506:174;;:::o;73125:264::-;73218:4;73235:13;73251:23;73266:7;73251:14;:23::i;:::-;73235:39;;73304:5;73293:16;;:7;:16;;;:52;;;;73313:32;73330:5;73337:7;73313:16;:32::i;:::-;73293:52;:87;;;;73373:7;73349:31;;:20;73361:7;73349:11;:20::i;:::-;:31;;;73293:87;73285:96;;;73125:264;;;;:::o;77124:1263::-;77283:4;77256:31;;:23;77271:7;77256:14;:23::i;:::-;:31;;;77248:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;77362:1;77348:16;;:2;:16;;;77340:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;77418:42;77439:4;77445:2;77449:7;77458:1;77418:20;:42::i;:::-;77590:4;77563:31;;:23;77578:7;77563:14;:23::i;:::-;:31;;;77555:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;77708:15;:24;77724:7;77708:24;;;;;;;;;;;;77701:31;;;;;;;;;;;78203:1;78184:9;:15;78194:4;78184:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;78236:1;78219:9;:13;78229:2;78219:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;78278:2;78259:7;:16;78267:7;78259:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;78317:7;78313:2;78298:27;;78307:4;78298:27;;;;;;;;;;;;78338:41;78358:4;78364:2;78368:7;78377:1;78338:19;:41::i;:::-;77124:1263;;;:::o;53642:105::-;53709:30;53720:4;53726:12;:10;:12::i;:::-;53709:10;:30::i;:::-;53642:105;:::o;57900:238::-;57984:22;57992:4;57998:7;57984;:22::i;:::-;57979:152;;58055:4;58023:6;:12;58030:4;58023:12;;;;;;;;;;;:20;;:29;58044:7;58023:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;58106:12;:10;:12::i;:::-;58079:40;;58097:7;58079:40;;58091:4;58079:40;;;;;;;;;;57979:152;57900:238;;:::o;58318:239::-;58402:22;58410:4;58416:7;58402;:22::i;:::-;58398:152;;;58473:5;58441:6;:12;58448:4;58441:12;;;;;;;;;;;:20;;:29;58462:7;58441:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;58525:12;:10;:12::i;:::-;58498:40;;58516:7;58498:40;;58510:4;58498:40;;;;;;;;;;58398:152;58318:239;;:::o;37763:120::-;36772:16;:14;:16::i;:::-;37832:5:::1;37822:7;;:15;;;;;;;;;;;;;;;;;;37853:22;37862:12;:10;:12::i;:::-;37853:22;;;;;;:::i;:::-;;;;;;;;37763:120::o:0;76004:783::-;76064:13;76080:23;76095:7;76080:14;:23::i;:::-;76064:39;;76116:51;76137:5;76152:1;76156:7;76165:1;76116:20;:51::i;:::-;76280:23;76295:7;76280:14;:23::i;:::-;76272:31;;76351:15;:24;76367:7;76351:24;;;;;;;;;;;;76344:31;;;;;;;;;;;76616:1;76596:9;:16;76606:5;76596:16;;;;;;;;;;;;;;;;:21;;;;;;;;;;;76646:7;:16;76654:7;76646:16;;;;;;;;;;;;76639:23;;;;;;;;;;;76708:7;76704:1;76680:36;;76689:5;76680:36;;;;;;;;;;;;76729:50;76749:5;76764:1;76768:7;76777:1;76729:19;:50::i;:::-;76053:734;76004:783;:::o;72400:117::-;72466:7;72493;:16;72501:7;72493:16;;;;;;;;;;;;;;;;;;;;;72486:23;;72400:117;;;:::o;37504:118::-;36513:19;:17;:19::i;:::-;37574:4:::1;37564:7;;:14;;;;;;;;;;;;;;;;;;37594:20;37601:12;:10;:12::i;:::-;37594:20;;;;;;:::i;:::-;;;;;;;;37504:118::o:0;78823:315::-;78978:8;78969:17;;:5;:17;;;78961:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;79065:8;79027:18;:25;79046:5;79027:25;;;;;;;;;;;;;;;:35;79053:8;79027:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;79111:8;79089:41;;79104:5;79089:41;;;79121:8;79089:41;;;;;;:::i;:::-;;;;;;;;78823:315;;;:::o;71973:313::-;72129:28;72139:4;72145:2;72149:7;72129:9;:28::i;:::-;72176:47;72199:4;72205:2;72209:7;72218:4;72176:22;:47::i;:::-;72168:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;71973:313;;;;:::o;72830:128::-;72895:4;72948:1;72919:31;;:17;72928:7;72919:8;:17::i;:::-;:31;;;;72912:38;;72830:128;;;:::o;97510:108::-;97570:13;97603:7;97596:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;97510:108;:::o;73731:110::-;73807:26;73817:2;73821:7;73807:26;;;;;;;;;;;;:9;:26::i;:::-;73731:110;;:::o;94215:131::-;94329:9;94301:15;:25;94317:8;94301:25;;;;;;;;;;;:37;;;;;;:::i;:::-;;94215:131;;:::o;94601:269::-;94745:13;:23;94759:8;94745:23;;;;;;;;;;;;;;;94738:30;;;94855:7;94829:13;:23;94843:8;94829:23;;;;;;;;;;;;;;;:33;;;;94601:269;;:::o;84189:224::-;84291:4;84330:35;84315:50;;;:11;:50;;;;:90;;;;84369:36;84393:11;84369:23;:36::i;:::-;84315:90;84308:97;;84189:224;;;:::o;96055:257::-;36513:19;:17;:19::i;:::-;96248:56:::1;96275:4;96281:2;96285:7;96294:9;96248:26;:56::i;:::-;96055:257:::0;;;;:::o;82392:158::-;;;;;:::o;54037:492::-;54126:22;54134:4;54140:7;54126;:22::i;:::-;54121:401;;54314:28;54334:7;54314:19;:28::i;:::-;54415:38;54443:4;54435:13;;54450:2;54415:19;:38::i;:::-;54219:257;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54165:345;;;;;;;;;;;:::i;:::-;;;;;;;;54121:401;54037:492;;:::o;37252:108::-;37319:8;:6;:8::i;:::-;37311:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;37252:108::o;37067:::-;37138:8;:6;:8::i;:::-;37137:9;37129:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;37067:108::o;79926:853::-;80080:4;80101:15;:2;:13;;;:15::i;:::-;80097:675;;;80153:2;80137:36;;;80174:12;:10;:12::i;:::-;80188:4;80194:7;80203:4;80137:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;80133:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80395:1;80378:6;:13;:18;80374:328;;80421:60;;;;;;;;;;:::i;:::-;;;;;;;;80374:328;80652:6;80646:13;80637:6;80633:2;80629:15;80622:38;80133:584;80269:41;;;80259:51;;;:6;:51;;;;80252:58;;;;;80097:675;80756:4;80749:11;;79926:853;;;;;;;:::o;74068:319::-;74197:18;74203:2;74207:7;74197:5;:18::i;:::-;74248:53;74279:1;74283:2;74287:7;74296:4;74248:22;:53::i;:::-;74226:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;74068:319;;;:::o;66968:305::-;67070:4;67122:25;67107:40;;;:11;:40;;;;:105;;;;67179:33;67164:48;;;:11;:48;;;;67107:105;:158;;;;67229:36;67253:11;67229:23;:36::i;:::-;67107:158;67087:178;;66968:305;;;:::o;85326:915::-;85503:61;85530:4;85536:2;85540:12;85554:9;85503:26;:61::i;:::-;85593:1;85581:9;:13;85577:222;;;85724:63;;;;;;;;;;:::i;:::-;;;;;;;;85577:222;85811:15;85829:12;85811:30;;85874:1;85858:18;;:4;:18;;;85854:187;;85893:40;85925:7;85893:31;:40::i;:::-;85854:187;;;85963:2;85955:10;;:4;:10;;;85951:90;;85982:47;86015:4;86021:7;85982:32;:47::i;:::-;85951:90;85854:187;86069:1;86055:16;;:2;:16;;;86051:183;;86088:45;86125:7;86088:36;:45::i;:::-;86051:183;;;86161:4;86155:10;;:2;:10;;;86151:83;;86182:40;86210:2;86214:7;86182:27;:40::i;:::-;86151:83;86051:183;85492:749;85326:915;;;;:::o;31484:151::-;31542:13;31575:52;31603:4;31587:22;;29639:2;31575:52;;:11;:52::i;:::-;31568:59;;31484:151;;;:::o;30880:447::-;30955:13;30981:19;31026:1;31017:6;31013:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;31003:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30981:47;;31039:15;:6;31046:1;31039:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;31065;:6;31072:1;31065:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;31096:9;31121:1;31112:6;31108:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;31096:26;;31091:131;31128:1;31124;:5;31091:131;;;31163:8;31180:3;31172:5;:11;31163:21;;;;;;;:::i;:::-;;;;;31151:6;31158:1;31151:9;;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;31209:1;31199:11;;;;;31131:3;;;;:::i;:::-;;;31091:131;;;;31249:1;31240:5;:10;31232:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;31312:6;31298:21;;;30880:447;;;;:::o;39123:326::-;39183:4;39440:1;39418:7;:19;;;:23;39411:30;;39123:326;;;:::o;74723:942::-;74817:1;74803:16;;:2;:16;;;74795:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;74876:16;74884:7;74876;:16::i;:::-;74875:17;74867:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;74938:48;74967:1;74971:2;74975:7;74984:1;74938:20;:48::i;:::-;75085:16;75093:7;75085;:16::i;:::-;75084:17;75076:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;75500:1;75483:9;:13;75493:2;75483:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;75544:2;75525:7;:16;75533:7;75525:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;75589:7;75585:2;75564:33;;75581:1;75564:33;;;;;;;;;;;;75610:47;75638:1;75642:2;75646:7;75655:1;75610:19;:47::i;:::-;74723:942;;:::o;50154:157::-;50239:4;50278:25;50263:40;;;:11;:40;;;;50256:47;;50154:157;;;:::o;81511:159::-;;;;;:::o;86964:164::-;87068:10;:17;;;;87041:15;:24;87057:7;87041:24;;;;;;;;;;;:44;;;;87096:10;87112:7;87096:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86964:164;:::o;87755:988::-;88021:22;88071:1;88046:22;88063:4;88046:16;:22::i;:::-;:26;;;;:::i;:::-;88021:51;;88083:18;88104:17;:26;88122:7;88104:26;;;;;;;;;;;;88083:47;;88251:14;88237:10;:28;88233:328;;88282:19;88304:12;:18;88317:4;88304:18;;;;;;;;;;;;;;;:34;88323:14;88304:34;;;;;;;;;;;;88282:56;;88388:11;88355:12;:18;88368:4;88355:18;;;;;;;;;;;;;;;:30;88374:10;88355:30;;;;;;;;;;;:44;;;;88505:10;88472:17;:30;88490:11;88472:30;;;;;;;;;;;:43;;;;88267:294;88233:328;88657:17;:26;88675:7;88657:26;;;;;;;;;;;88650:33;;;88701:12;:18;88714:4;88701:18;;;;;;;;;;;;;;;:34;88720:14;88701:34;;;;;;;;;;;88694:41;;;87836:907;;87755:988;;:::o;89038:1079::-;89291:22;89336:1;89316:10;:17;;;;:21;;;;:::i;:::-;89291:46;;89348:18;89369:15;:24;89385:7;89369:24;;;;;;;;;;;;89348:45;;89720:19;89742:10;89753:14;89742:26;;;;;;;;:::i;:::-;;;;;;;;;;89720:48;;89806:11;89781:10;89792;89781:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;89917:10;89886:15;:28;89902:11;89886:28;;;;;;;;;;;:41;;;;90058:15;:24;90074:7;90058:24;;;;;;;;;;;90051:31;;;90093:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;89109:1008;;;89038:1079;:::o;86542:221::-;86627:14;86644:20;86661:2;86644:16;:20::i;:::-;86627:37;;86702:7;86675:12;:16;86688:2;86675:16;;;;;;;;;;;;;;;:24;86692:6;86675:24;;;;;;;;;;;:34;;;;86749:6;86720:17;:26;86738:7;86720:26;;;;;;;;;;;:35;;;;86616:147;86542:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:117::-;4999:1;4996;4989:12;5013:117;5122:1;5119;5112:12;5136:180;5184:77;5181:1;5174:88;5281:4;5278:1;5271:15;5305:4;5302:1;5295:15;5322:281;5405:27;5427:4;5405:27;:::i;:::-;5397:6;5393:40;5535:6;5523:10;5520:22;5499:18;5487:10;5484:34;5481:62;5478:88;;;5546:18;;:::i;:::-;5478:88;5586:10;5582:2;5575:22;5365:238;5322:281;;:::o;5609:129::-;5643:6;5670:20;;:::i;:::-;5660:30;;5699:33;5727:4;5719:6;5699:33;:::i;:::-;5609:129;;;:::o;5744:308::-;5806:4;5896:18;5888:6;5885:30;5882:56;;;5918:18;;:::i;:::-;5882:56;5956:29;5978:6;5956:29;:::i;:::-;5948:37;;6040:4;6034;6030:15;6022:23;;5744:308;;;:::o;6058:146::-;6155:6;6150:3;6145;6132:30;6196:1;6187:6;6182:3;6178:16;6171:27;6058:146;;;:::o;6210:425::-;6288:5;6313:66;6329:49;6371:6;6329:49;:::i;:::-;6313:66;:::i;:::-;6304:75;;6402:6;6395:5;6388:21;6440:4;6433:5;6429:16;6478:3;6469:6;6464:3;6460:16;6457:25;6454:112;;;6485:79;;:::i;:::-;6454:112;6575:54;6622:6;6617:3;6612;6575:54;:::i;:::-;6294:341;6210:425;;;;;:::o;6655:340::-;6711:5;6760:3;6753:4;6745:6;6741:17;6737:27;6727:122;;6768:79;;:::i;:::-;6727:122;6885:6;6872:20;6910:79;6985:3;6977:6;6970:4;6962:6;6958:17;6910:79;:::i;:::-;6901:88;;6717:278;6655:340;;;;:::o;7001:654::-;7079:6;7087;7136:2;7124:9;7115:7;7111:23;7107:32;7104:119;;;7142:79;;:::i;:::-;7104:119;7262:1;7287:53;7332:7;7323:6;7312:9;7308:22;7287:53;:::i;:::-;7277:63;;7233:117;7417:2;7406:9;7402:18;7389:32;7448:18;7440:6;7437:30;7434:117;;;7470:79;;:::i;:::-;7434:117;7575:63;7630:7;7621:6;7610:9;7606:22;7575:63;:::i;:::-;7565:73;;7360:288;7001:654;;;;;:::o;7661:118::-;7748:24;7766:5;7748:24;:::i;:::-;7743:3;7736:37;7661:118;;:::o;7785:222::-;7878:4;7916:2;7905:9;7901:18;7893:26;;7929:71;7997:1;7986:9;7982:17;7973:6;7929:71;:::i;:::-;7785:222;;;;:::o;8013:619::-;8090:6;8098;8106;8155:2;8143:9;8134:7;8130:23;8126:32;8123:119;;;8161:79;;:::i;:::-;8123:119;8281:1;8306:53;8351:7;8342:6;8331:9;8327:22;8306:53;:::i;:::-;8296:63;;8252:117;8408:2;8434:53;8479:7;8470:6;8459:9;8455:22;8434:53;:::i;:::-;8424:63;;8379:118;8536:2;8562:53;8607:7;8598:6;8587:9;8583:22;8562:53;:::i;:::-;8552:63;;8507:118;8013:619;;;;;:::o;8638:77::-;8675:7;8704:5;8693:16;;8638:77;;;:::o;8721:122::-;8794:24;8812:5;8794:24;:::i;:::-;8787:5;8784:35;8774:63;;8833:1;8830;8823:12;8774:63;8721:122;:::o;8849:139::-;8895:5;8933:6;8920:20;8911:29;;8949:33;8976:5;8949:33;:::i;:::-;8849:139;;;;:::o;8994:329::-;9053:6;9102:2;9090:9;9081:7;9077:23;9073:32;9070:119;;;9108:79;;:::i;:::-;9070:119;9228:1;9253:53;9298:7;9289:6;9278:9;9274:22;9253:53;:::i;:::-;9243:63;;9199:117;8994:329;;;;:::o;9329:118::-;9416:24;9434:5;9416:24;:::i;:::-;9411:3;9404:37;9329:118;;:::o;9453:222::-;9546:4;9584:2;9573:9;9569:18;9561:26;;9597:71;9665:1;9654:9;9650:17;9641:6;9597:71;:::i;:::-;9453:222;;;;:::o;9681:474::-;9749:6;9757;9806:2;9794:9;9785:7;9781:23;9777:32;9774:119;;;9812:79;;:::i;:::-;9774:119;9932:1;9957:53;10002:7;9993:6;9982:9;9978:22;9957:53;:::i;:::-;9947:63;;9903:117;10059:2;10085:53;10130:7;10121:6;10110:9;10106:22;10085:53;:::i;:::-;10075:63;;10030:118;9681:474;;;;;:::o;10161:329::-;10220:6;10269:2;10257:9;10248:7;10244:23;10240:32;10237:119;;;10275:79;;:::i;:::-;10237:119;10395:1;10420:53;10465:7;10456:6;10445:9;10441:22;10420:53;:::i;:::-;10410:63;;10366:117;10161:329;;;;:::o;10496:114::-;10563:6;10597:5;10591:12;10581:22;;10496:114;;;:::o;10616:184::-;10715:11;10749:6;10744:3;10737:19;10789:4;10784:3;10780:14;10765:29;;10616:184;;;;:::o;10806:132::-;10873:4;10896:3;10888:11;;10926:4;10921:3;10917:14;10909:22;;10806:132;;;:::o;10944:108::-;11021:24;11039:5;11021:24;:::i;:::-;11016:3;11009:37;10944:108;;:::o;11058:179::-;11127:10;11148:46;11190:3;11182:6;11148:46;:::i;:::-;11226:4;11221:3;11217:14;11203:28;;11058:179;;;;:::o;11243:113::-;11313:4;11345;11340:3;11336:14;11328:22;;11243:113;;;:::o;11392:732::-;11511:3;11540:54;11588:5;11540:54;:::i;:::-;11610:86;11689:6;11684:3;11610:86;:::i;:::-;11603:93;;11720:56;11770:5;11720:56;:::i;:::-;11799:7;11830:1;11815:284;11840:6;11837:1;11834:13;11815:284;;;11916:6;11910:13;11943:63;12002:3;11987:13;11943:63;:::i;:::-;11936:70;;12029:60;12082:6;12029:60;:::i;:::-;12019:70;;11875:224;11862:1;11859;11855:9;11850:14;;11815:284;;;11819:14;12115:3;12108:10;;11516:608;;;11392:732;;;;:::o;12130:373::-;12273:4;12311:2;12300:9;12296:18;12288:26;;12360:9;12354:4;12350:20;12346:1;12335:9;12331:17;12324:47;12388:108;12491:4;12482:6;12388:108;:::i;:::-;12380:116;;12130:373;;;;:::o;12509:509::-;12578:6;12627:2;12615:9;12606:7;12602:23;12598:32;12595:119;;;12633:79;;:::i;:::-;12595:119;12781:1;12770:9;12766:17;12753:31;12811:18;12803:6;12800:30;12797:117;;;12833:79;;:::i;:::-;12797:117;12938:63;12993:7;12984:6;12973:9;12969:22;12938:63;:::i;:::-;12928:73;;12724:287;12509:509;;;;:::o;13024:116::-;13094:21;13109:5;13094:21;:::i;:::-;13087:5;13084:32;13074:60;;13130:1;13127;13120:12;13074:60;13024:116;:::o;13146:133::-;13189:5;13227:6;13214:20;13205:29;;13243:30;13267:5;13243:30;:::i;:::-;13146:133;;;;:::o;13285:468::-;13350:6;13358;13407:2;13395:9;13386:7;13382:23;13378:32;13375:119;;;13413:79;;:::i;:::-;13375:119;13533:1;13558:53;13603:7;13594:6;13583:9;13579:22;13558:53;:::i;:::-;13548:63;;13504:117;13660:2;13686:50;13728:7;13719:6;13708:9;13704:22;13686:50;:::i;:::-;13676:60;;13631:115;13285:468;;;;;:::o;13759:307::-;13820:4;13910:18;13902:6;13899:30;13896:56;;;13932:18;;:::i;:::-;13896:56;13970:29;13992:6;13970:29;:::i;:::-;13962:37;;14054:4;14048;14044:15;14036:23;;13759:307;;;:::o;14072:423::-;14149:5;14174:65;14190:48;14231:6;14190:48;:::i;:::-;14174:65;:::i;:::-;14165:74;;14262:6;14255:5;14248:21;14300:4;14293:5;14289:16;14338:3;14329:6;14324:3;14320:16;14317:25;14314:112;;;14345:79;;:::i;:::-;14314:112;14435:54;14482:6;14477:3;14472;14435:54;:::i;:::-;14155:340;14072:423;;;;;:::o;14514:338::-;14569:5;14618:3;14611:4;14603:6;14599:17;14595:27;14585:122;;14626:79;;:::i;:::-;14585:122;14743:6;14730:20;14768:78;14842:3;14834:6;14827:4;14819:6;14815:17;14768:78;:::i;:::-;14759:87;;14575:277;14514:338;;;;:::o;14858:943::-;14953:6;14961;14969;14977;15026:3;15014:9;15005:7;15001:23;14997:33;14994:120;;;15033:79;;:::i;:::-;14994:120;15153:1;15178:53;15223:7;15214:6;15203:9;15199:22;15178:53;:::i;:::-;15168:63;;15124:117;15280:2;15306:53;15351:7;15342:6;15331:9;15327:22;15306:53;:::i;:::-;15296:63;;15251:118;15408:2;15434:53;15479:7;15470:6;15459:9;15455:22;15434:53;:::i;:::-;15424:63;;15379:118;15564:2;15553:9;15549:18;15536:32;15595:18;15587:6;15584:30;15581:117;;;15617:79;;:::i;:::-;15581:117;15722:62;15776:7;15767:6;15756:9;15752:22;15722:62;:::i;:::-;15712:72;;15507:287;14858:943;;;;;;;:::o;15807:474::-;15875:6;15883;15932:2;15920:9;15911:7;15907:23;15903:32;15900:119;;;15938:79;;:::i;:::-;15900:119;16058:1;16083:53;16128:7;16119:6;16108:9;16104:22;16083:53;:::i;:::-;16073:63;;16029:117;16185:2;16211:53;16256:7;16247:6;16236:9;16232:22;16211:53;:::i;:::-;16201:63;;16156:118;15807:474;;;;;:::o;16287:311::-;16364:4;16454:18;16446:6;16443:30;16440:56;;;16476:18;;:::i;:::-;16440:56;16526:4;16518:6;16514:17;16506:25;;16586:4;16580;16576:15;16568:23;;16287:311;;;:::o;16604:117::-;16713:1;16710;16703:12;16744:710;16840:5;16865:81;16881:64;16938:6;16881:64;:::i;:::-;16865:81;:::i;:::-;16856:90;;16966:5;16995:6;16988:5;16981:21;17029:4;17022:5;17018:16;17011:23;;17082:4;17074:6;17070:17;17062:6;17058:30;17111:3;17103:6;17100:15;17097:122;;;17130:79;;:::i;:::-;17097:122;17245:6;17228:220;17262:6;17257:3;17254:15;17228:220;;;17337:3;17366:37;17399:3;17387:10;17366:37;:::i;:::-;17361:3;17354:50;17433:4;17428:3;17424:14;17417:21;;17304:144;17288:4;17283:3;17279:14;17272:21;;17228:220;;;17232:21;16846:608;;16744:710;;;;;:::o;17477:370::-;17548:5;17597:3;17590:4;17582:6;17578:17;17574:27;17564:122;;17605:79;;:::i;:::-;17564:122;17722:6;17709:20;17747:94;17837:3;17829:6;17822:4;17814:6;17810:17;17747:94;:::i;:::-;17738:103;;17554:293;17477:370;;;;:::o;17853:311::-;17930:4;18020:18;18012:6;18009:30;18006:56;;;18042:18;;:::i;:::-;18006:56;18092:4;18084:6;18080:17;18072:25;;18152:4;18146;18142:15;18134:23;;17853:311;;;:::o;18187:710::-;18283:5;18308:81;18324:64;18381:6;18324:64;:::i;:::-;18308:81;:::i;:::-;18299:90;;18409:5;18438:6;18431:5;18424:21;18472:4;18465:5;18461:16;18454:23;;18525:4;18517:6;18513:17;18505:6;18501:30;18554:3;18546:6;18543:15;18540:122;;;18573:79;;:::i;:::-;18540:122;18688:6;18671:220;18705:6;18700:3;18697:15;18671:220;;;18780:3;18809:37;18842:3;18830:10;18809:37;:::i;:::-;18804:3;18797:50;18876:4;18871:3;18867:14;18860:21;;18747:144;18731:4;18726:3;18722:14;18715:21;;18671:220;;;18675:21;18289:608;;18187:710;;;;;:::o;18920:370::-;18991:5;19040:3;19033:4;19025:6;19021:17;19017:27;19007:122;;19048:79;;:::i;:::-;19007:122;19165:6;19152:20;19190:94;19280:3;19272:6;19265:4;19257:6;19253:17;19190:94;:::i;:::-;19181:103;;18997:293;18920:370;;;;:::o;19296:894::-;19414:6;19422;19471:2;19459:9;19450:7;19446:23;19442:32;19439:119;;;19477:79;;:::i;:::-;19439:119;19625:1;19614:9;19610:17;19597:31;19655:18;19647:6;19644:30;19641:117;;;19677:79;;:::i;:::-;19641:117;19782:78;19852:7;19843:6;19832:9;19828:22;19782:78;:::i;:::-;19772:88;;19568:302;19937:2;19926:9;19922:18;19909:32;19968:18;19960:6;19957:30;19954:117;;;19990:79;;:::i;:::-;19954:117;20095:78;20165:7;20156:6;20145:9;20141:22;20095:78;:::i;:::-;20085:88;;19880:303;19296:894;;;;;:::o;20196:180::-;20244:77;20241:1;20234:88;20341:4;20338:1;20331:15;20365:4;20362:1;20355:15;20382:320;20426:6;20463:1;20457:4;20453:12;20443:22;;20510:1;20504:4;20500:12;20531:18;20521:81;;20587:4;20579:6;20575:17;20565:27;;20521:81;20649:2;20641:6;20638:14;20618:18;20615:38;20612:84;;20668:18;;:::i;:::-;20612:84;20433:269;20382:320;;;:::o;20708:220::-;20848:34;20844:1;20836:6;20832:14;20825:58;20917:3;20912:2;20904:6;20900:15;20893:28;20708:220;:::o;20934:366::-;21076:3;21097:67;21161:2;21156:3;21097:67;:::i;:::-;21090:74;;21173:93;21262:3;21173:93;:::i;:::-;21291:2;21286:3;21282:12;21275:19;;20934:366;;;:::o;21306:419::-;21472:4;21510:2;21499:9;21495:18;21487:26;;21559:9;21553:4;21549:20;21545:1;21534:9;21530:17;21523:47;21587:131;21713:4;21587:131;:::i;:::-;21579:139;;21306:419;;;:::o;21731:248::-;21871:34;21867:1;21859:6;21855:14;21848:58;21940:31;21935:2;21927:6;21923:15;21916:56;21731:248;:::o;21985:366::-;22127:3;22148:67;22212:2;22207:3;22148:67;:::i;:::-;22141:74;;22224:93;22313:3;22224:93;:::i;:::-;22342:2;22337:3;22333:12;22326:19;;21985:366;;;:::o;22357:419::-;22523:4;22561:2;22550:9;22546:18;22538:26;;22610:9;22604:4;22600:20;22596:1;22585:9;22581:17;22574:47;22638:131;22764:4;22638:131;:::i;:::-;22630:139;;22357:419;;;:::o;22782:172::-;22922:24;22918:1;22910:6;22906:14;22899:48;22782:172;:::o;22960:366::-;23102:3;23123:67;23187:2;23182:3;23123:67;:::i;:::-;23116:74;;23199:93;23288:3;23199:93;:::i;:::-;23317:2;23312:3;23308:12;23301:19;;22960:366;;;:::o;23332:419::-;23498:4;23536:2;23525:9;23521:18;23513:26;;23585:9;23579:4;23575:20;23571:1;23560:9;23556:17;23549:47;23613:131;23739:4;23613:131;:::i;:::-;23605:139;;23332:419;;;:::o;23757:141::-;23806:4;23829:3;23821:11;;23852:3;23849:1;23842:14;23886:4;23883:1;23873:18;23865:26;;23757:141;;;:::o;23904:93::-;23941:6;23988:2;23983;23976:5;23972:14;23968:23;23958:33;;23904:93;;;:::o;24003:107::-;24047:8;24097:5;24091:4;24087:16;24066:37;;24003:107;;;;:::o;24116:393::-;24185:6;24235:1;24223:10;24219:18;24258:97;24288:66;24277:9;24258:97;:::i;:::-;24376:39;24406:8;24395:9;24376:39;:::i;:::-;24364:51;;24448:4;24444:9;24437:5;24433:21;24424:30;;24497:4;24487:8;24483:19;24476:5;24473:30;24463:40;;24192:317;;24116:393;;;;;:::o;24515:60::-;24543:3;24564:5;24557:12;;24515:60;;;:::o;24581:142::-;24631:9;24664:53;24682:34;24691:24;24709:5;24691:24;:::i;:::-;24682:34;:::i;:::-;24664:53;:::i;:::-;24651:66;;24581:142;;;:::o;24729:75::-;24772:3;24793:5;24786:12;;24729:75;;;:::o;24810:269::-;24920:39;24951:7;24920:39;:::i;:::-;24981:91;25030:41;25054:16;25030:41;:::i;:::-;25022:6;25015:4;25009:11;24981:91;:::i;:::-;24975:4;24968:105;24886:193;24810:269;;;:::o;25085:73::-;25130:3;25085:73;:::o;25164:189::-;25241:32;;:::i;:::-;25282:65;25340:6;25332;25326:4;25282:65;:::i;:::-;25217:136;25164:189;;:::o;25359:186::-;25419:120;25436:3;25429:5;25426:14;25419:120;;;25490:39;25527:1;25520:5;25490:39;:::i;:::-;25463:1;25456:5;25452:13;25443:22;;25419:120;;;25359:186;;:::o;25551:543::-;25652:2;25647:3;25644:11;25641:446;;;25686:38;25718:5;25686:38;:::i;:::-;25770:29;25788:10;25770:29;:::i;:::-;25760:8;25756:44;25953:2;25941:10;25938:18;25935:49;;;25974:8;25959:23;;25935:49;25997:80;26053:22;26071:3;26053:22;:::i;:::-;26043:8;26039:37;26026:11;25997:80;:::i;:::-;25656:431;;25641:446;25551:543;;;:::o;26100:117::-;26154:8;26204:5;26198:4;26194:16;26173:37;;26100:117;;;;:::o;26223:169::-;26267:6;26300:51;26348:1;26344:6;26336:5;26333:1;26329:13;26300:51;:::i;:::-;26296:56;26381:4;26375;26371:15;26361:25;;26274:118;26223:169;;;;:::o;26397:295::-;26473:4;26619:29;26644:3;26638:4;26619:29;:::i;:::-;26611:37;;26681:3;26678:1;26674:11;26668:4;26665:21;26657:29;;26397:295;;;;:::o;26697:1395::-;26814:37;26847:3;26814:37;:::i;:::-;26916:18;26908:6;26905:30;26902:56;;;26938:18;;:::i;:::-;26902:56;26982:38;27014:4;27008:11;26982:38;:::i;:::-;27067:67;27127:6;27119;27113:4;27067:67;:::i;:::-;27161:1;27185:4;27172:17;;27217:2;27209:6;27206:14;27234:1;27229:618;;;;27891:1;27908:6;27905:77;;;27957:9;27952:3;27948:19;27942:26;27933:35;;27905:77;28008:67;28068:6;28061:5;28008:67;:::i;:::-;28002:4;27995:81;27864:222;27199:887;;27229:618;27281:4;27277:9;27269:6;27265:22;27315:37;27347:4;27315:37;:::i;:::-;27374:1;27388:208;27402:7;27399:1;27396:14;27388:208;;;27481:9;27476:3;27472:19;27466:26;27458:6;27451:42;27532:1;27524:6;27520:14;27510:24;;27579:2;27568:9;27564:18;27551:31;;27425:4;27422:1;27418:12;27413:17;;27388:208;;;27624:6;27615:7;27612:19;27609:179;;;27682:9;27677:3;27673:19;27667:26;27725:48;27767:4;27759:6;27755:17;27744:9;27725:48;:::i;:::-;27717:6;27710:64;27632:156;27609:179;27834:1;27830;27822:6;27818:14;27814:22;27808:4;27801:36;27236:611;;;27199:887;;26789:1303;;;26697:1395;;:::o;28098:232::-;28238:34;28234:1;28226:6;28222:14;28215:58;28307:15;28302:2;28294:6;28290:15;28283:40;28098:232;:::o;28336:366::-;28478:3;28499:67;28563:2;28558:3;28499:67;:::i;:::-;28492:74;;28575:93;28664:3;28575:93;:::i;:::-;28693:2;28688:3;28684:12;28677:19;;28336:366;;;:::o;28708:419::-;28874:4;28912:2;28901:9;28897:18;28889:26;;28961:9;28955:4;28951:20;28947:1;28936:9;28932:17;28925:47;28989:131;29115:4;28989:131;:::i;:::-;28981:139;;28708:419;;;:::o;29133:230::-;29273:34;29269:1;29261:6;29257:14;29250:58;29342:13;29337:2;29329:6;29325:15;29318:38;29133:230;:::o;29369:366::-;29511:3;29532:67;29596:2;29591:3;29532:67;:::i;:::-;29525:74;;29608:93;29697:3;29608:93;:::i;:::-;29726:2;29721:3;29717:12;29710:19;;29369:366;;;:::o;29741:419::-;29907:4;29945:2;29934:9;29930:18;29922:26;;29994:9;29988:4;29984:20;29980:1;29969:9;29965:17;29958:47;30022:131;30148:4;30022:131;:::i;:::-;30014:139;;29741:419;;;:::o;30166:234::-;30306:34;30302:1;30294:6;30290:14;30283:58;30375:17;30370:2;30362:6;30358:15;30351:42;30166:234;:::o;30406:366::-;30548:3;30569:67;30633:2;30628:3;30569:67;:::i;:::-;30562:74;;30645:93;30734:3;30645:93;:::i;:::-;30763:2;30758:3;30754:12;30747:19;;30406:366;;;:::o;30778:419::-;30944:4;30982:2;30971:9;30967:18;30959:26;;31031:9;31025:4;31021:20;31017:1;31006:9;31002:17;30995:47;31059:131;31185:4;31059:131;:::i;:::-;31051:139;;30778:419;;;:::o;31203:180::-;31251:77;31248:1;31241:88;31348:4;31345:1;31338:15;31372:4;31369:1;31362:15;31389:180;31437:77;31434:1;31427:88;31534:4;31531:1;31524:15;31558:4;31555:1;31548:15;31575:233;31614:3;31637:24;31655:5;31637:24;:::i;:::-;31628:33;;31683:66;31676:5;31673:77;31670:103;;31753:18;;:::i;:::-;31670:103;31800:1;31793:5;31789:13;31782:20;;31575:233;;;:::o;31814:231::-;31954:34;31950:1;31942:6;31938:14;31931:58;32023:14;32018:2;32010:6;32006:15;31999:39;31814:231;:::o;32051:366::-;32193:3;32214:67;32278:2;32273:3;32214:67;:::i;:::-;32207:74;;32290:93;32379:3;32290:93;:::i;:::-;32408:2;32403:3;32399:12;32392:19;;32051:366;;;:::o;32423:419::-;32589:4;32627:2;32616:9;32612:18;32604:26;;32676:9;32670:4;32666:20;32662:1;32651:9;32647:17;32640:47;32704:131;32830:4;32704:131;:::i;:::-;32696:139;;32423:419;;;:::o;32848:174::-;32988:26;32984:1;32976:6;32972:14;32965:50;32848:174;:::o;33028:366::-;33170:3;33191:67;33255:2;33250:3;33191:67;:::i;:::-;33184:74;;33267:93;33356:3;33267:93;:::i;:::-;33385:2;33380:3;33376:12;33369:19;;33028:366;;;:::o;33400:419::-;33566:4;33604:2;33593:9;33589:18;33581:26;;33653:9;33647:4;33643:20;33639:1;33628:9;33624:17;33617:47;33681:131;33807:4;33681:131;:::i;:::-;33673:139;;33400:419;;;:::o;33825:228::-;33965:34;33961:1;33953:6;33949:14;33942:58;34034:11;34029:2;34021:6;34017:15;34010:36;33825:228;:::o;34059:366::-;34201:3;34222:67;34286:2;34281:3;34222:67;:::i;:::-;34215:74;;34298:93;34387:3;34298:93;:::i;:::-;34416:2;34411:3;34407:12;34400:19;;34059:366;;;:::o;34431:419::-;34597:4;34635:2;34624:9;34620:18;34612:26;;34684:9;34678:4;34674:20;34670:1;34659:9;34655:17;34648:47;34712:131;34838:4;34712:131;:::i;:::-;34704:139;;34431:419;;;:::o;34856:234::-;34996:34;34992:1;34984:6;34980:14;34973:58;35065:17;35060:2;35052:6;35048:15;35041:42;34856:234;:::o;35096:366::-;35238:3;35259:67;35323:2;35318:3;35259:67;:::i;:::-;35252:74;;35335:93;35424:3;35335:93;:::i;:::-;35453:2;35448:3;35444:12;35437:19;;35096:366;;;:::o;35468:419::-;35634:4;35672:2;35661:9;35657:18;35649:26;;35721:9;35715:4;35711:20;35707:1;35696:9;35692:17;35685:47;35749:131;35875:4;35749:131;:::i;:::-;35741:139;;35468:419;;;:::o;35893:148::-;35995:11;36032:3;36017:18;;35893:148;;;;:::o;36047:390::-;36153:3;36181:39;36214:5;36181:39;:::i;:::-;36236:89;36318:6;36313:3;36236:89;:::i;:::-;36229:96;;36334:65;36392:6;36387:3;36380:4;36373:5;36369:16;36334:65;:::i;:::-;36424:6;36419:3;36415:16;36408:23;;36157:280;36047:390;;;;:::o;36443:151::-;36583:3;36579:1;36571:6;36567:14;36560:27;36443:151;:::o;36600:400::-;36760:3;36781:84;36863:1;36858:3;36781:84;:::i;:::-;36774:91;;36874:93;36963:3;36874:93;:::i;:::-;36992:1;36987:3;36983:11;36976:18;;36600:400;;;:::o;37006:701::-;37287:3;37309:95;37400:3;37391:6;37309:95;:::i;:::-;37302:102;;37421:148;37565:3;37421:148;:::i;:::-;37414:155;;37586:95;37677:3;37668:6;37586:95;:::i;:::-;37579:102;;37698:3;37691:10;;37006:701;;;;;:::o;37713:170::-;37853:22;37849:1;37841:6;37837:14;37830:46;37713:170;:::o;37889:366::-;38031:3;38052:67;38116:2;38111:3;38052:67;:::i;:::-;38045:74;;38128:93;38217:3;38128:93;:::i;:::-;38246:2;38241:3;38237:12;38230:19;;37889:366;;;:::o;38261:419::-;38427:4;38465:2;38454:9;38450:18;38442:26;;38514:9;38508:4;38504:20;38500:1;38489:9;38485:17;38478:47;38542:131;38668:4;38542:131;:::i;:::-;38534:139;;38261:419;;;:::o;38686:172::-;38826:24;38822:1;38814:6;38810:14;38803:48;38686:172;:::o;38864:366::-;39006:3;39027:67;39091:2;39086:3;39027:67;:::i;:::-;39020:74;;39103:93;39192:3;39103:93;:::i;:::-;39221:2;39216:3;39212:12;39205:19;;38864:366;;;:::o;39236:419::-;39402:4;39440:2;39429:9;39425:18;39417:26;;39489:9;39483:4;39479:20;39475:1;39464:9;39460:17;39453:47;39517:131;39643:4;39517:131;:::i;:::-;39509:139;;39236:419;;;:::o;39661:191::-;39701:3;39720:20;39738:1;39720:20;:::i;:::-;39715:25;;39754:20;39772:1;39754:20;:::i;:::-;39749:25;;39797:1;39794;39790:9;39783:16;;39818:3;39815:1;39812:10;39809:36;;;39825:18;;:::i;:::-;39809:36;39661:191;;;;:::o;39858:194::-;39898:4;39918:20;39936:1;39918:20;:::i;:::-;39913:25;;39952:20;39970:1;39952:20;:::i;:::-;39947:25;;39996:1;39993;39989:9;39981:17;;40020:1;40014:4;40011:11;40008:37;;;40025:18;;:::i;:::-;40008:37;39858:194;;;;:::o;40058:224::-;40198:34;40194:1;40186:6;40182:14;40175:58;40267:7;40262:2;40254:6;40250:15;40243:32;40058:224;:::o;40288:366::-;40430:3;40451:67;40515:2;40510:3;40451:67;:::i;:::-;40444:74;;40527:93;40616:3;40527:93;:::i;:::-;40645:2;40640:3;40636:12;40629:19;;40288:366;;;:::o;40660:419::-;40826:4;40864:2;40853:9;40849:18;40841:26;;40913:9;40907:4;40903:20;40899:1;40888:9;40884:17;40877:47;40941:131;41067:4;40941:131;:::i;:::-;40933:139;;40660:419;;;:::o;41085:223::-;41225:34;41221:1;41213:6;41209:14;41202:58;41294:6;41289:2;41281:6;41277:15;41270:31;41085:223;:::o;41314:366::-;41456:3;41477:67;41541:2;41536:3;41477:67;:::i;:::-;41470:74;;41553:93;41642:3;41553:93;:::i;:::-;41671:2;41666:3;41662:12;41655:19;;41314:366;;;:::o;41686:419::-;41852:4;41890:2;41879:9;41875:18;41867:26;;41939:9;41933:4;41929:20;41925:1;41914:9;41910:17;41903:47;41967:131;42093:4;41967:131;:::i;:::-;41959:139;;41686:419;;;:::o;42111:175::-;42251:27;42247:1;42239:6;42235:14;42228:51;42111:175;:::o;42292:366::-;42434:3;42455:67;42519:2;42514:3;42455:67;:::i;:::-;42448:74;;42531:93;42620:3;42531:93;:::i;:::-;42649:2;42644:3;42640:12;42633:19;;42292:366;;;:::o;42664:419::-;42830:4;42868:2;42857:9;42853:18;42845:26;;42917:9;42911:4;42907:20;42903:1;42892:9;42888:17;42881:47;42945:131;43071:4;42945:131;:::i;:::-;42937:139;;42664:419;;;:::o;43089:237::-;43229:34;43225:1;43217:6;43213:14;43206:58;43298:20;43293:2;43285:6;43281:15;43274:45;43089:237;:::o;43332:366::-;43474:3;43495:67;43559:2;43554:3;43495:67;:::i;:::-;43488:74;;43571:93;43660:3;43571:93;:::i;:::-;43689:2;43684:3;43680:12;43673:19;;43332:366;;;:::o;43704:419::-;43870:4;43908:2;43897:9;43893:18;43885:26;;43957:9;43951:4;43947:20;43943:1;43932:9;43928:17;43921:47;43985:131;44111:4;43985:131;:::i;:::-;43977:139;;43704:419;;;:::o;44129:173::-;44269:25;44265:1;44257:6;44253:14;44246:49;44129:173;:::o;44308:402::-;44468:3;44489:85;44571:2;44566:3;44489:85;:::i;:::-;44482:92;;44583:93;44672:3;44583:93;:::i;:::-;44701:2;44696:3;44692:12;44685:19;;44308:402;;;:::o;44716:167::-;44856:19;44852:1;44844:6;44840:14;44833:43;44716:167;:::o;44889:402::-;45049:3;45070:85;45152:2;45147:3;45070:85;:::i;:::-;45063:92;;45164:93;45253:3;45164:93;:::i;:::-;45282:2;45277:3;45273:12;45266:19;;44889:402;;;:::o;45297:967::-;45679:3;45701:148;45845:3;45701:148;:::i;:::-;45694:155;;45866:95;45957:3;45948:6;45866:95;:::i;:::-;45859:102;;45978:148;46122:3;45978:148;:::i;:::-;45971:155;;46143:95;46234:3;46225:6;46143:95;:::i;:::-;46136:102;;46255:3;46248:10;;45297:967;;;;;:::o;46270:170::-;46410:22;46406:1;46398:6;46394:14;46387:46;46270:170;:::o;46446:366::-;46588:3;46609:67;46673:2;46668:3;46609:67;:::i;:::-;46602:74;;46685:93;46774:3;46685:93;:::i;:::-;46803:2;46798:3;46794:12;46787:19;;46446:366;;;:::o;46818:419::-;46984:4;47022:2;47011:9;47007:18;46999:26;;47071:9;47065:4;47061:20;47057:1;47046:9;47042:17;47035:47;47099:131;47225:4;47099:131;:::i;:::-;47091:139;;46818:419;;;:::o;47243:166::-;47383:18;47379:1;47371:6;47367:14;47360:42;47243:166;:::o;47415:366::-;47557:3;47578:67;47642:2;47637:3;47578:67;:::i;:::-;47571:74;;47654:93;47743:3;47654:93;:::i;:::-;47772:2;47767:3;47763:12;47756:19;;47415:366;;;:::o;47787:419::-;47953:4;47991:2;47980:9;47976:18;47968:26;;48040:9;48034:4;48030:20;48026:1;48015:9;48011:17;48004:47;48068:131;48194:4;48068:131;:::i;:::-;48060:139;;47787:419;;;:::o;48212:98::-;48263:6;48297:5;48291:12;48281:22;;48212:98;;;:::o;48316:168::-;48399:11;48433:6;48428:3;48421:19;48473:4;48468:3;48464:14;48449:29;;48316:168;;;;:::o;48490:373::-;48576:3;48604:38;48636:5;48604:38;:::i;:::-;48658:70;48721:6;48716:3;48658:70;:::i;:::-;48651:77;;48737:65;48795:6;48790:3;48783:4;48776:5;48772:16;48737:65;:::i;:::-;48827:29;48849:6;48827:29;:::i;:::-;48822:3;48818:39;48811:46;;48580:283;48490:373;;;;:::o;48869:640::-;49064:4;49102:3;49091:9;49087:19;49079:27;;49116:71;49184:1;49173:9;49169:17;49160:6;49116:71;:::i;:::-;49197:72;49265:2;49254:9;49250:18;49241:6;49197:72;:::i;:::-;49279;49347:2;49336:9;49332:18;49323:6;49279:72;:::i;:::-;49398:9;49392:4;49388:20;49383:2;49372:9;49368:18;49361:48;49426:76;49497:4;49488:6;49426:76;:::i;:::-;49418:84;;48869:640;;;;;;;:::o;49515:141::-;49571:5;49602:6;49596:13;49587:22;;49618:32;49644:5;49618:32;:::i;:::-;49515:141;;;;:::o;49662:349::-;49731:6;49780:2;49768:9;49759:7;49755:23;49751:32;49748:119;;;49786:79;;:::i;:::-;49748:119;49906:1;49931:63;49986:7;49977:6;49966:9;49962:22;49931:63;:::i;:::-;49921:73;;49877:127;49662:349;;;;:::o;50017:240::-;50157:34;50153:1;50145:6;50141:14;50134:58;50226:23;50221:2;50213:6;50209:15;50202:48;50017:240;:::o;50263:366::-;50405:3;50426:67;50490:2;50485:3;50426:67;:::i;:::-;50419:74;;50502:93;50591:3;50502:93;:::i;:::-;50620:2;50615:3;50611:12;50604:19;;50263:366;;;:::o;50635:419::-;50801:4;50839:2;50828:9;50824:18;50816:26;;50888:9;50882:4;50878:20;50874:1;50863:9;50859:17;50852:47;50916:131;51042:4;50916:131;:::i;:::-;50908:139;;50635:419;;;:::o;51060:410::-;51100:7;51123:20;51141:1;51123:20;:::i;:::-;51118:25;;51157:20;51175:1;51157:20;:::i;:::-;51152:25;;51212:1;51209;51205:9;51234:30;51252:11;51234:30;:::i;:::-;51223:41;;51413:1;51404:7;51400:15;51397:1;51394:22;51374:1;51367:9;51347:83;51324:139;;51443:18;;:::i;:::-;51324:139;51108:362;51060:410;;;;:::o;51476:171::-;51515:3;51538:24;51556:5;51538:24;:::i;:::-;51529:33;;51584:4;51577:5;51574:15;51571:41;;51592:18;;:::i;:::-;51571:41;51639:1;51632:5;51628:13;51621:20;;51476:171;;;:::o;51653:182::-;51793:34;51789:1;51781:6;51777:14;51770:58;51653:182;:::o;51841:366::-;51983:3;52004:67;52068:2;52063:3;52004:67;:::i;:::-;51997:74;;52080:93;52169:3;52080:93;:::i;:::-;52198:2;52193:3;52189:12;52182:19;;51841:366;;;:::o;52213:419::-;52379:4;52417:2;52406:9;52402:18;52394:26;;52466:9;52460:4;52456:20;52452:1;52441:9;52437:17;52430:47;52494:131;52620:4;52494:131;:::i;:::-;52486:139;;52213:419;;;:::o;52638:182::-;52778:34;52774:1;52766:6;52762:14;52755:58;52638:182;:::o;52826:366::-;52968:3;52989:67;53053:2;53048:3;52989:67;:::i;:::-;52982:74;;53065:93;53154:3;53065:93;:::i;:::-;53183:2;53178:3;53174:12;53167:19;;52826:366;;;:::o;53198:419::-;53364:4;53402:2;53391:9;53387:18;53379:26;;53451:9;53445:4;53441:20;53437:1;53426:9;53422:17;53415:47;53479:131;53605:4;53479:131;:::i;:::-;53471:139;;53198:419;;;:::o;53623:178::-;53763:30;53759:1;53751:6;53747:14;53740:54;53623:178;:::o;53807:366::-;53949:3;53970:67;54034:2;54029:3;53970:67;:::i;:::-;53963:74;;54046:93;54135:3;54046:93;:::i;:::-;54164:2;54159:3;54155:12;54148:19;;53807:366;;;:::o;54179:419::-;54345:4;54383:2;54372:9;54368:18;54360:26;;54432:9;54426:4;54422:20;54418:1;54407:9;54403:17;54396:47;54460:131;54586:4;54460:131;:::i;:::-;54452:139;;54179:419;;;:::o;54604:180::-;54652:77;54649:1;54642:88;54749:4;54746:1;54739:15;54773:4;54770:1;54763:15
Swarm Source
ipfs://35d9390190c8a0009872dc9ca3dbc13c7a7ad0b76b6d50c12871f71e3bdaa1fa
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.