ERC-721
Overview
Max Total Supply
560 JINFT
Holders
256
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 JINFTLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
JINFT
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-11-08 */ // File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/structs/EnumerableSet.sol) 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) { return _values(set._inner); } // 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 on 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/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/access/IAccessControlEnumerable.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerable is IAccessControl { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_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) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @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] = _HEX_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/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.7.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 functionCall(target, data, "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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(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) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(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) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason 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 { // 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.7.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(uint160(account), 20), " 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/access/AccessControlEnumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl { using EnumerableSet for EnumerableSet.AddressSet; mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) { return _roleMembers[role].length(); } /** * @dev Overload {_grantRole} to track enumerable memberships */ function _grantRole(bytes32 role, address account) internal virtual override { super._grantRole(role, account); _roleMembers[role].add(account); } /** * @dev Overload {_revokeRole} to track enumerable memberships */ function _revokeRole(bytes32 role, address account) internal virtual override { super._revokeRole(role, account); _roleMembers[role].remove(account); } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.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: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @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.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[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 nor 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 nor 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 nor 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 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 _owners[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); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal 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); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @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. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // 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/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (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 Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); 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: GenerativeERC721.sol pragma solidity ^0.8.0; /** * @dev {ERC721} token, including: * * - a minter role that allows for token minting (creation) * - a pauser role that allows to stop all token transfers * * This contract uses {AccessControl} to lock permissioned functions using the * different roles - head to its documentation for details. * * The account that deploys the contract will be granted the minter and pauser * roles, as well as the default admin role, which will let it grant both minter * and pauser roles to other accounts. * * _Deprecated in favor of https://wizard.openzeppelin.com/[Contracts Wizard]._ */ contract JINFT is Context, AccessControlEnumerable, ERC721Enumerable, ERC721URIStorage, Pausable { bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE"); bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); bytes32 public constant URI_SETTER_ROLE = keccak256("URI_SETTER_ROLE"); /** * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the * account that deploys the contract. * * Token URIs will be autogenerated based on `baseURI` and their token IDs. * See {ERC721-tokenURI}. */ constructor( string memory name, string memory symbol ) ERC721(name, symbol) { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(MINTER_ROLE, _msgSender()); _setupRole(BURNER_ROLE, _msgSender()); _setupRole(PAUSER_ROLE, _msgSender()); _setupRole(URI_SETTER_ROLE, _msgSender()); } /** * @dev Set Token URI for a specific Token ID * Requirements: * - the caller must have the `URI_SETTER_ROLE`. */ function setTokenURI(uint256 tokenId, string memory _tokenURI) public { require(hasRole(URI_SETTER_ROLE, _msgSender()), "Must have uri_setter role to set Token URI"); _setTokenURI(tokenId, _tokenURI); } /** * @dev Set Token URI Batch */ function setTokenURIBatch(uint256[] memory tokenIds, string[] memory _tokenURIs) public { require(tokenIds.length == _tokenURIs.length, "tokenIds and uris length mismatch"); for (uint256 i = 0; i < tokenIds.length; i++) { setTokenURI(tokenIds[i], _tokenURIs[i]); } } /** * @dev Creates a new token for `to`. * Requirements: * - the caller must have the `MINTER_ROLE`. */ function mint(address to, uint256 tokenId) public virtual { require(hasRole(MINTER_ROLE, _msgSender()), "Must have minter role to mint"); _mint(to, tokenId); } /** * @dev Mint Batch */ function mintBatch(address[] memory tos, uint256[] memory tokenIds) public { require(tos.length == tokenIds.length, "tokenIds and uris length mismatch"); for (uint256 i = 0; i < tos.length; i++) { mint(tos[i], tokenIds[i]); } } /** * @dev Creates a new token for `to`. * Requirements: * - the caller must have the `MINTER_ROLE`. * - the caller must have the `URI_SETTER_ROLE`. */ function mintWithURI(address to, uint256 tokenId, string memory _tokenURI) public { mint(to, tokenId); setTokenURI(tokenId, _tokenURI); } /** * @dev Creates a new token for `to` with `tokenURI` * Requirements: * - the caller must have the `MINTER_ROLE`. * - the caller must have the `URI_SETTER_ROLE`. */ function mintWithURIBatch(address[] memory tos, uint256[] memory tokenIds, string[] memory _tokenURIs) public { require(tos.length == tokenIds.length, "tos and tokenIDs length mismatch"); require(tos.length == _tokenURIs.length, "tos and _tokenURIs length mismatch"); for (uint256 i = 0; i < tos.length; i++) { mintWithURI(tos[i], tokenIds[i], _tokenURIs[i]); } } /** * @dev Pauses all token transfers. * Requirements: * - the caller must have the `PAUSER_ROLE`. */ function pause() public virtual { require(hasRole(PAUSER_ROLE, _msgSender()), "Must have pauser role to pause"); _pause(); } /** * @dev Unpauses all token transfers. * Requirements: * - the caller must have the `PAUSER_ROLE`. */ function unpause() public virtual { require(hasRole(PAUSER_ROLE, _msgSender()), "Must have pauser role to unpause"); _unpause(); } /** * @dev Before Token Transfer Hook */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId ) internal virtual override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, firstTokenId); require(!paused(), "Token transfer while paused"); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControlEnumerable, ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } function burn(uint256 tokenId) public { require(hasRole(BURNER_ROLE, _msgSender()), "Must have burner role to unpause"); _burn(tokenId); } function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"BURNER_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":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"URI_SETTER_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":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","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":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tos","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"mintWithURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tos","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"_tokenURIs","type":"string[]"}],"name":"mintWithURIBatch","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"}],"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":"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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"_tokenURIs","type":"string[]"}],"name":"setTokenURIBatch","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":[],"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"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162005b5238038062005b5283398181016040528101906200003791906200057c565b81818160029080519060200190620000519291906200044e565b5080600390805190602001906200006a9291906200044e565b5050506000600d60006101000a81548160ff021916908315150217905550620000ac6000801b620000a0620001b860201b60201c565b620001c060201b60201c565b620000ed7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620000e1620001b860201b60201c565b620001c060201b60201c565b6200012e7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84862000122620001b860201b60201c565b620001c060201b60201c565b6200016f7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a62000163620001b860201b60201c565b620001c060201b60201c565b620001b07f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c620001a4620001b860201b60201c565b620001c060201b60201c565b505062000785565b600033905090565b620001d28282620001d660201b60201c565b5050565b620001ed82826200021e60201b620015221760201c565b6200021981600160008581526020019081526020016000206200030f60201b620016021790919060201c565b505050565b6200023082826200034760201b60201c565b6200030b57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620002b0620001b860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006200033f836000018373ffffffffffffffffffffffffffffffffffffffff1660001b620003b160201b60201c565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000620003c583836200042b60201b60201c565b6200042057826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000425565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b8280546200045c9062000696565b90600052602060002090601f016020900481019282620004805760008555620004cc565b82601f106200049b57805160ff1916838001178555620004cc565b82800160010185558215620004cc579182015b82811115620004cb578251825591602001919060010190620004ae565b5b509050620004db9190620004df565b5090565b5b80821115620004fa576000816000905550600101620004e0565b5090565b6000620005156200050f846200062a565b62000601565b90508281526020810184848401111562000534576200053362000765565b5b6200054184828562000660565b509392505050565b600082601f83011262000561576200056062000760565b5b815162000573848260208601620004fe565b91505092915050565b600080604083850312156200059657620005956200076f565b5b600083015167ffffffffffffffff811115620005b757620005b66200076a565b5b620005c58582860162000549565b925050602083015167ffffffffffffffff811115620005e957620005e86200076a565b5b620005f78582860162000549565b9150509250929050565b60006200060d62000620565b90506200061b8282620006cc565b919050565b6000604051905090565b600067ffffffffffffffff82111562000648576200064762000731565b5b620006538262000774565b9050602081019050919050565b60005b838110156200068057808201518184015260208101905062000663565b8381111562000690576000848401525b50505050565b60006002820490506001821680620006af57607f821691505b60208210811415620006c657620006c562000702565b5b50919050565b620006d78262000774565b810181811067ffffffffffffffff82111715620006f957620006f862000731565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6153bd80620007956000396000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c806352e274551161013057806395d89b41116100b8578063ca15c8731161007c578063ca15c87314610685578063d5391393146106b5578063d547741f146106d3578063e63ab1e9146106ef578063e985e9c51461070d57610232565b806395d89b41146105e1578063a217fddf146105ff578063a22cb4651461061d578063b88d4fde14610639578063c87b56dd1461065557610232565b80637c88e3d9116100ff5780637c88e3d91461053d5780637f345710146105595780638456cb59146105775780639010d07c1461058157806391d14854146105b157610232565b806352e27455146104a35780635c975abb146104bf5780636352211e146104dd57806370a082311461050d57610232565b80632f2ff15d116101be57806342842e0e1161018257806342842e0e1461040357806342966c681461041f5780634a99950b1461043b5780634bb99351146104575780634f6ccce71461047357610232565b80632f2ff15d146103755780632f745c591461039157806336568abe146103c15780633f4ba83a146103dd57806340c10f19146103e757610232565b8063162094c411610205578063162094c4146102d157806318160ddd146102ed57806323b872dd1461030b578063248a9ca314610327578063282c51f31461035757610232565b806301ffc9a71461023757806306fdde0314610267578063081812fc14610285578063095ea7b3146102b5575b600080fd5b610251600480360381019061024c9190613c9c565b61073d565b60405161025e919061431a565b60405180910390f35b61026f61074f565b60405161027c9190614350565b60405180910390f35b61029f600480360381019061029a9190613cf6565b6107e1565b6040516102ac91906142b3565b60405180910390f35b6102cf60048036038101906102ca91906139a9565b610827565b005b6102eb60048036038101906102e69190613d23565b61093f565b005b6102f56109bd565b60405161030291906146d2565b60405180910390f35b61032560048036038101906103209190613893565b6109ca565b005b610341600480360381019061033c9190613bef565b610a2a565b60405161034e9190614335565b60405180910390f35b61035f610a49565b60405161036c9190614335565b60405180910390f35b61038f600480360381019061038a9190613c1c565b610a6d565b005b6103ab60048036038101906103a691906139a9565b610a8e565b6040516103b891906146d2565b60405180910390f35b6103db60048036038101906103d69190613c1c565b610b33565b005b6103e5610bb6565b005b61040160048036038101906103fc91906139a9565b610c30565b005b61041d60048036038101906104189190613893565b610cae565b005b61043960048036038101906104349190613cf6565b610cce565b005b610455600480360381019061045091906139e9565b610d4a565b005b610471600480360381019061046c9190613b77565b610d63565b005b61048d60048036038101906104889190613cf6565b610e09565b60405161049a91906146d2565b60405180910390f35b6104bd60048036038101906104b89190613ad0565b610e7a565b005b6104c7610f80565b6040516104d4919061431a565b60405180910390f35b6104f760048036038101906104f29190613cf6565b610f97565b60405161050491906142b3565b60405180910390f35b61052760048036038101906105229190613826565b611049565b60405161053491906146d2565b60405180910390f35b61055760048036038101906105529190613a58565b611101565b005b6105616111a7565b60405161056e9190614335565b60405180910390f35b61057f6111cb565b005b61059b60048036038101906105969190613c5c565b611245565b6040516105a891906142b3565b60405180910390f35b6105cb60048036038101906105c69190613c1c565b611274565b6040516105d8919061431a565b60405180910390f35b6105e96112de565b6040516105f69190614350565b60405180910390f35b610607611370565b6040516106149190614335565b60405180910390f35b61063760048036038101906106329190613969565b611377565b005b610653600480360381019061064e91906138e6565b61138d565b005b61066f600480360381019061066a9190613cf6565b6113ef565b60405161067c9190614350565b60405180910390f35b61069f600480360381019061069a9190613bef565b611401565b6040516106ac91906146d2565b60405180910390f35b6106bd611425565b6040516106ca9190614335565b60405180910390f35b6106ed60048036038101906106e89190613c1c565b611449565b005b6106f761146a565b6040516107049190614335565b60405180910390f35b61072760048036038101906107229190613853565b61148e565b604051610734919061431a565b60405180910390f35b600061074882611632565b9050919050565b60606002805461075e90614a3a565b80601f016020809104026020016040519081016040528092919081815260200182805461078a90614a3a565b80156107d75780601f106107ac576101008083540402835291602001916107d7565b820191906000526020600020905b8154815290600101906020018083116107ba57829003601f168201915b5050505050905090565b60006107ec826116ac565b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061083282610f97565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089a906145b2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108c26116f7565b73ffffffffffffffffffffffffffffffffffffffff1614806108f157506108f0816108eb6116f7565b61148e565b5b610930576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092790614532565b60405180910390fd5b61093a83836116ff565b505050565b6109707f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c61096b6116f7565b611274565b6109af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a690614652565b60405180910390fd5b6109b982826117b8565b5050565b6000600a80549050905090565b6109db6109d56116f7565b8261182c565b610a1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1190614692565b60405180910390fd5b610a258383836118c1565b505050565b6000806000838152602001908152602001600020600101549050919050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b610a7682610a2a565b610a7f81611b28565b610a898383611b3c565b505050565b6000610a9983611049565b8210610ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad1906143b2565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b3b6116f7565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9f906146b2565b60405180910390fd5b610bb28282611b70565b5050565b610be77f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610be26116f7565b611274565b610c26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1d90614632565b60405180910390fd5b610c2e611ba4565b565b610c617f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610c5c6116f7565b611274565b610ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9790614572565b60405180910390fd5b610caa8282611c07565b5050565b610cc98383836040518060200160405280600081525061138d565b505050565b610cff7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848610cfa6116f7565b611274565b610d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3590614672565b60405180910390fd5b610d4781611de1565b50565b610d548383610c30565b610d5e828261093f565b505050565b8051825114610da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9e90614612565b60405180910390fd5b60005b8251811015610e0457610df1838281518110610dc957610dc8614bd3565b5b6020026020010151838381518110610de457610de3614bd3565b5b602002602001015161093f565b8080610dfc90614a9d565b915050610daa565b505050565b6000610e136109bd565b8210610e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4b906145f2565b60405180910390fd5b600a8281548110610e6857610e67614bd3565b5b90600052602060002001549050919050565b8151835114610ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb590614492565b60405180910390fd5b8051835114610f02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef990614472565b60405180910390fd5b60005b8351811015610f7a57610f67848281518110610f2457610f23614bd3565b5b6020026020010151848381518110610f3f57610f3e614bd3565b5b6020026020010151848481518110610f5a57610f59614bd3565b5b6020026020010151610d4a565b8080610f7290614a9d565b915050610f05565b50505050565b6000600d60009054906101000a900460ff16905090565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103790614592565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b1906144f2565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b8051825114611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90614612565b60405180910390fd5b60005b82518110156111a25761118f83828151811061116757611166614bd3565b5b602002602001015183838151811061118257611181614bd3565b5b6020026020010151610c30565b808061119a90614a9d565b915050611148565b505050565b7f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c81565b6111fc7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6111f76116f7565b611274565b61123b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611232906144b2565b60405180910390fd5b611243611ded565b565b600061126c8260016000868152602001908152602001600020611e5090919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600380546112ed90614a3a565b80601f016020809104026020016040519081016040528092919081815260200182805461131990614a3a565b80156113665780601f1061133b57610100808354040283529160200191611366565b820191906000526020600020905b81548152906001019060200180831161134957829003601f168201915b5050505050905090565b6000801b81565b6113896113826116f7565b8383611e6a565b5050565b61139e6113986116f7565b8361182c565b6113dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d490614692565b60405180910390fd5b6113e984848484611fd7565b50505050565b60606113fa82612033565b9050919050565b600061141e60016000848152602001908152602001600020612146565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61145282610a2a565b61145b81611b28565b6114658383611b70565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61152c8282611274565b6115fe57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506115a36116f7565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600061162a836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61215b565b905092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806116a557506116a4826121cb565b5b9050919050565b6116b5816122ad565b6116f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116eb90614592565b60405180910390fd5b50565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661177283610f97565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6117c1826122ad565b611800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f790614512565b60405180910390fd5b80600c600084815260200190815260200160002090805190602001906118279291906133ed565b505050565b60008061183883610f97565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061187a5750611879818561148e565b5b806118b857508373ffffffffffffffffffffffffffffffffffffffff166118a0846107e1565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166118e182610f97565b73ffffffffffffffffffffffffffffffffffffffff1614611937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192e906143f2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199e90614432565b60405180910390fd5b6119b2838383612319565b6119bd6000826116ff565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a0d919061491c565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a64919061483b565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b23838383612371565b505050565b611b3981611b346116f7565b612376565b50565b611b468282611522565b611b6b816001600085815260200190815260200160002061160290919063ffffffff16565b505050565b611b7a8282612413565b611b9f81600160008581526020019081526020016000206124f490919063ffffffff16565b505050565b611bac612524565b6000600d60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611bf06116f7565b604051611bfd91906142b3565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6e90614552565b60405180910390fd5b611c80816122ad565b15611cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb790614412565b60405180910390fd5b611ccc60008383612319565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d1c919061483b565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611ddd60008383612371565b5050565b611dea8161256d565b50565b611df56125c0565b6001600d60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611e396116f7565b604051611e4691906142b3565b60405180910390a1565b6000611e5f836000018361260a565b60001c905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed090614452565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fca919061431a565b60405180910390a3505050565b611fe28484846118c1565b611fee84848484612635565b61202d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612024906143d2565b60405180910390fd5b50505050565b606061203e826116ac565b6000600c6000848152602001908152602001600020805461205e90614a3a565b80601f016020809104026020016040519081016040528092919081815260200182805461208a90614a3a565b80156120d75780601f106120ac576101008083540402835291602001916120d7565b820191906000526020600020905b8154815290600101906020018083116120ba57829003601f168201915b5050505050905060006120e86127cc565b90506000815114156120fe578192505050612141565b60008251111561213357808260405160200161211b929190614255565b60405160208183030381529060405292505050612141565b61213c846127e3565b925050505b919050565b60006121548260000161284b565b9050919050565b6000612167838361285c565b6121c05782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506121c5565b600090505b92915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061229657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806122a657506122a58261287f565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6123248383836128f9565b61232c610f80565b1561236c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612363906145d2565b60405180910390fd5b505050565b505050565b6123808282611274565b61240f576123a58173ffffffffffffffffffffffffffffffffffffffff166014612a0d565b6123b38360001c6020612a0d565b6040516020016123c4929190614279565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124069190614350565b60405180910390fd5b5050565b61241d8282611274565b156124f057600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506124956116f7565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600061251c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612c49565b905092915050565b61252c610f80565b61256b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256290614392565b60405180910390fd5b565b61257681612d5d565b6000600c6000838152602001908152602001600020805461259690614a3a565b9050146125bd57600c600082815260200190815260200160002060006125bc9190613473565b5b50565b6125c8610f80565b15612608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ff906144d2565b60405180910390fd5b565b600082600001828154811061262257612621614bd3565b5b9060005260206000200154905092915050565b60006126568473ffffffffffffffffffffffffffffffffffffffff16612e7a565b156127bf578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261267f6116f7565b8786866040518563ffffffff1660e01b81526004016126a194939291906142ce565b602060405180830381600087803b1580156126bb57600080fd5b505af19250505080156126ec57506040513d601f19601f820116820180604052508101906126e99190613cc9565b60015b61276f573d806000811461271c576040519150601f19603f3d011682016040523d82523d6000602084013e612721565b606091505b50600081511415612767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275e906143d2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127c4565b600190505b949350505050565b606060405180602001604052806000815250905090565b60606127ee826116ac565b60006127f86127cc565b905060008151116128185760405180602001604052806000815250612843565b8061282284612e9d565b604051602001612833929190614255565b6040516020818303038152906040525b915050919050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128f257506128f182612ffe565b5b9050919050565b612904838383613078565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612947576129428161307d565b612986565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146129855761298483826130c6565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129c9576129c481613233565b612a08565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612a0757612a068282613304565b5b5b505050565b606060006002836002612a2091906148c2565b612a2a919061483b565b67ffffffffffffffff811115612a4357612a42614c02565b5b6040519080825280601f01601f191660200182016040528015612a755781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612aad57612aac614bd3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612b1157612b10614bd3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612b5191906148c2565b612b5b919061483b565b90505b6001811115612bfb577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612b9d57612b9c614bd3565b5b1a60f81b828281518110612bb457612bb3614bd3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612bf490614a10565b9050612b5e565b5060008414612c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3690614372565b60405180910390fd5b8091505092915050565b60008083600101600084815260200190815260200160002054905060008114612d51576000600182612c7b919061491c565b9050600060018660000180549050612c93919061491c565b9050818114612d02576000866000018281548110612cb457612cb3614bd3565b5b9060005260206000200154905080876000018481548110612cd857612cd7614bd3565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480612d1657612d15614ba4565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612d57565b60009150505b92915050565b6000612d6882610f97565b9050612d7681600084612319565b612d816000836116ff565b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612dd1919061491c565b925050819055506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e7681600084612371565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60606000821415612ee5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ff9565b600082905060005b60008214612f17578080612f0090614a9d565b915050600a82612f109190614891565b9150612eed565b60008167ffffffffffffffff811115612f3357612f32614c02565b5b6040519080825280601f01601f191660200182016040528015612f655781602001600182028036833780820191505090505b5090505b60008514612ff257600182612f7e919061491c565b9150600a85612f8d9190614ae6565b6030612f99919061483b565b60f81b818381518110612faf57612fae614bd3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612feb9190614891565b9450612f69565b8093505050505b919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613071575061307082613383565b5b9050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016130d384611049565b6130dd919061491c565b90506000600960008481526020019081526020016000205490508181146131c2576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a80549050613247919061491c565b90506000600b60008481526020019081526020016000205490506000600a838154811061327757613276614bd3565b5b9060005260206000200154905080600a838154811061329957613298614bd3565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a8054806132e8576132e7614ba4565b5b6001900381819060005260206000200160009055905550505050565b600061330f83611049565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8280546133f990614a3a565b90600052602060002090601f01602090048101928261341b5760008555613462565b82601f1061343457805160ff1916838001178555613462565b82800160010185558215613462579182015b82811115613461578251825591602001919060010190613446565b5b50905061346f91906134b3565b5090565b50805461347f90614a3a565b6000825580601f1061349157506134b0565b601f0160209004906000526020600020908101906134af91906134b3565b5b50565b5b808211156134cc5760008160009055506001016134b4565b5090565b60006134e36134de84614712565b6146ed565b9050808382526020820190508285602086028201111561350657613505614c36565b5b60005b85811015613536578161351c88826136c2565b845260208401935060208301925050600181019050613509565b5050509392505050565b600061355361354e8461473e565b6146ed565b9050808382526020820190508285602086028201111561357657613575614c36565b5b60005b858110156135c457813567ffffffffffffffff81111561359c5761359b614c31565b5b8086016135a989826137e3565b85526020850194506020840193505050600181019050613579565b5050509392505050565b60006135e16135dc8461476a565b6146ed565b9050808382526020820190508285602086028201111561360457613603614c36565b5b60005b85811015613634578161361a8882613811565b845260208401935060208301925050600181019050613607565b5050509392505050565b600061365161364c84614796565b6146ed565b90508281526020810184848401111561366d5761366c614c3b565b5b6136788482856149ce565b509392505050565b600061369361368e846147c7565b6146ed565b9050828152602081018484840111156136af576136ae614c3b565b5b6136ba8482856149ce565b509392505050565b6000813590506136d181615314565b92915050565b600082601f8301126136ec576136eb614c31565b5b81356136fc8482602086016134d0565b91505092915050565b600082601f83011261371a57613719614c31565b5b813561372a848260208601613540565b91505092915050565b600082601f83011261374857613747614c31565b5b81356137588482602086016135ce565b91505092915050565b6000813590506137708161532b565b92915050565b60008135905061378581615342565b92915050565b60008135905061379a81615359565b92915050565b6000815190506137af81615359565b92915050565b600082601f8301126137ca576137c9614c31565b5b81356137da84826020860161363e565b91505092915050565b600082601f8301126137f8576137f7614c31565b5b8135613808848260208601613680565b91505092915050565b60008135905061382081615370565b92915050565b60006020828403121561383c5761383b614c45565b5b600061384a848285016136c2565b91505092915050565b6000806040838503121561386a57613869614c45565b5b6000613878858286016136c2565b9250506020613889858286016136c2565b9150509250929050565b6000806000606084860312156138ac576138ab614c45565b5b60006138ba868287016136c2565b93505060206138cb868287016136c2565b92505060406138dc86828701613811565b9150509250925092565b60008060008060808587031215613900576138ff614c45565b5b600061390e878288016136c2565b945050602061391f878288016136c2565b935050604061393087828801613811565b925050606085013567ffffffffffffffff81111561395157613950614c40565b5b61395d878288016137b5565b91505092959194509250565b600080604083850312156139805761397f614c45565b5b600061398e858286016136c2565b925050602061399f85828601613761565b9150509250929050565b600080604083850312156139c0576139bf614c45565b5b60006139ce858286016136c2565b92505060206139df85828601613811565b9150509250929050565b600080600060608486031215613a0257613a01614c45565b5b6000613a10868287016136c2565b9350506020613a2186828701613811565b925050604084013567ffffffffffffffff811115613a4257613a41614c40565b5b613a4e868287016137e3565b9150509250925092565b60008060408385031215613a6f57613a6e614c45565b5b600083013567ffffffffffffffff811115613a8d57613a8c614c40565b5b613a99858286016136d7565b925050602083013567ffffffffffffffff811115613aba57613ab9614c40565b5b613ac685828601613733565b9150509250929050565b600080600060608486031215613ae957613ae8614c45565b5b600084013567ffffffffffffffff811115613b0757613b06614c40565b5b613b13868287016136d7565b935050602084013567ffffffffffffffff811115613b3457613b33614c40565b5b613b4086828701613733565b925050604084013567ffffffffffffffff811115613b6157613b60614c40565b5b613b6d86828701613705565b9150509250925092565b60008060408385031215613b8e57613b8d614c45565b5b600083013567ffffffffffffffff811115613bac57613bab614c40565b5b613bb885828601613733565b925050602083013567ffffffffffffffff811115613bd957613bd8614c40565b5b613be585828601613705565b9150509250929050565b600060208284031215613c0557613c04614c45565b5b6000613c1384828501613776565b91505092915050565b60008060408385031215613c3357613c32614c45565b5b6000613c4185828601613776565b9250506020613c52858286016136c2565b9150509250929050565b60008060408385031215613c7357613c72614c45565b5b6000613c8185828601613776565b9250506020613c9285828601613811565b9150509250929050565b600060208284031215613cb257613cb1614c45565b5b6000613cc08482850161378b565b91505092915050565b600060208284031215613cdf57613cde614c45565b5b6000613ced848285016137a0565b91505092915050565b600060208284031215613d0c57613d0b614c45565b5b6000613d1a84828501613811565b91505092915050565b60008060408385031215613d3a57613d39614c45565b5b6000613d4885828601613811565b925050602083013567ffffffffffffffff811115613d6957613d68614c40565b5b613d75858286016137e3565b9150509250929050565b613d8881614950565b82525050565b613d9781614962565b82525050565b613da68161496e565b82525050565b6000613db7826147f8565b613dc1818561480e565b9350613dd18185602086016149dd565b613dda81614c4a565b840191505092915050565b6000613df082614803565b613dfa818561481f565b9350613e0a8185602086016149dd565b613e1381614c4a565b840191505092915050565b6000613e2982614803565b613e338185614830565b9350613e438185602086016149dd565b80840191505092915050565b6000613e5c60208361481f565b9150613e6782614c5b565b602082019050919050565b6000613e7f60148361481f565b9150613e8a82614c84565b602082019050919050565b6000613ea2602b8361481f565b9150613ead82614cad565b604082019050919050565b6000613ec560328361481f565b9150613ed082614cfc565b604082019050919050565b6000613ee860258361481f565b9150613ef382614d4b565b604082019050919050565b6000613f0b601c8361481f565b9150613f1682614d9a565b602082019050919050565b6000613f2e60248361481f565b9150613f3982614dc3565b604082019050919050565b6000613f5160198361481f565b9150613f5c82614e12565b602082019050919050565b6000613f7460228361481f565b9150613f7f82614e3b565b604082019050919050565b6000613f9760208361481f565b9150613fa282614e8a565b602082019050919050565b6000613fba601e8361481f565b9150613fc582614eb3565b602082019050919050565b6000613fdd60108361481f565b9150613fe882614edc565b602082019050919050565b600061400060298361481f565b915061400b82614f05565b604082019050919050565b6000614023602e8361481f565b915061402e82614f54565b604082019050919050565b6000614046603e8361481f565b915061405182614fa3565b604082019050919050565b600061406960208361481f565b915061407482614ff2565b602082019050919050565b600061408c601d8361481f565b91506140978261501b565b602082019050919050565b60006140af60188361481f565b91506140ba82615044565b602082019050919050565b60006140d260218361481f565b91506140dd8261506d565b604082019050919050565b60006140f5601b8361481f565b9150614100826150bc565b602082019050919050565b6000614118602c8361481f565b9150614123826150e5565b604082019050919050565b600061413b60218361481f565b915061414682615134565b604082019050919050565b600061415e601783614830565b915061416982615183565b601782019050919050565b600061418160208361481f565b915061418c826151ac565b602082019050919050565b60006141a4602a8361481f565b91506141af826151d5565b604082019050919050565b60006141c760208361481f565b91506141d282615224565b602082019050919050565b60006141ea602e8361481f565b91506141f58261524d565b604082019050919050565b600061420d601183614830565b91506142188261529c565b601182019050919050565b6000614230602f8361481f565b915061423b826152c5565b604082019050919050565b61424f816149c4565b82525050565b60006142618285613e1e565b915061426d8284613e1e565b91508190509392505050565b600061428482614151565b91506142908285613e1e565b915061429b82614200565b91506142a78284613e1e565b91508190509392505050565b60006020820190506142c86000830184613d7f565b92915050565b60006080820190506142e36000830187613d7f565b6142f06020830186613d7f565b6142fd6040830185614246565b818103606083015261430f8184613dac565b905095945050505050565b600060208201905061432f6000830184613d8e565b92915050565b600060208201905061434a6000830184613d9d565b92915050565b6000602082019050818103600083015261436a8184613de5565b905092915050565b6000602082019050818103600083015261438b81613e4f565b9050919050565b600060208201905081810360008301526143ab81613e72565b9050919050565b600060208201905081810360008301526143cb81613e95565b9050919050565b600060208201905081810360008301526143eb81613eb8565b9050919050565b6000602082019050818103600083015261440b81613edb565b9050919050565b6000602082019050818103600083015261442b81613efe565b9050919050565b6000602082019050818103600083015261444b81613f21565b9050919050565b6000602082019050818103600083015261446b81613f44565b9050919050565b6000602082019050818103600083015261448b81613f67565b9050919050565b600060208201905081810360008301526144ab81613f8a565b9050919050565b600060208201905081810360008301526144cb81613fad565b9050919050565b600060208201905081810360008301526144eb81613fd0565b9050919050565b6000602082019050818103600083015261450b81613ff3565b9050919050565b6000602082019050818103600083015261452b81614016565b9050919050565b6000602082019050818103600083015261454b81614039565b9050919050565b6000602082019050818103600083015261456b8161405c565b9050919050565b6000602082019050818103600083015261458b8161407f565b9050919050565b600060208201905081810360008301526145ab816140a2565b9050919050565b600060208201905081810360008301526145cb816140c5565b9050919050565b600060208201905081810360008301526145eb816140e8565b9050919050565b6000602082019050818103600083015261460b8161410b565b9050919050565b6000602082019050818103600083015261462b8161412e565b9050919050565b6000602082019050818103600083015261464b81614174565b9050919050565b6000602082019050818103600083015261466b81614197565b9050919050565b6000602082019050818103600083015261468b816141ba565b9050919050565b600060208201905081810360008301526146ab816141dd565b9050919050565b600060208201905081810360008301526146cb81614223565b9050919050565b60006020820190506146e76000830184614246565b92915050565b60006146f7614708565b90506147038282614a6c565b919050565b6000604051905090565b600067ffffffffffffffff82111561472d5761472c614c02565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561475957614758614c02565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561478557614784614c02565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156147b1576147b0614c02565b5b6147ba82614c4a565b9050602081019050919050565b600067ffffffffffffffff8211156147e2576147e1614c02565b5b6147eb82614c4a565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614846826149c4565b9150614851836149c4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561488657614885614b17565b5b828201905092915050565b600061489c826149c4565b91506148a7836149c4565b9250826148b7576148b6614b46565b5b828204905092915050565b60006148cd826149c4565b91506148d8836149c4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561491157614910614b17565b5b828202905092915050565b6000614927826149c4565b9150614932836149c4565b92508282101561494557614944614b17565b5b828203905092915050565b600061495b826149a4565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156149fb5780820151818401526020810190506149e0565b83811115614a0a576000848401525b50505050565b6000614a1b826149c4565b91506000821415614a2f57614a2e614b17565b5b600182039050919050565b60006002820490506001821680614a5257607f821691505b60208210811415614a6657614a65614b75565b5b50919050565b614a7582614c4a565b810181811067ffffffffffffffff82111715614a9457614a93614c02565b5b80604052505050565b6000614aa8826149c4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614adb57614ada614b17565b5b600182019050919050565b6000614af1826149c4565b9150614afc836149c4565b925082614b0c57614b0b614b46565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f746f7320616e64205f746f6b656e55524973206c656e677468206d69736d617460008201527f6368000000000000000000000000000000000000000000000000000000000000602082015250565b7f746f7320616e6420746f6b656e494473206c656e677468206d69736d61746368600082015250565b7f4d75737420686176652070617573657220726f6c6520746f2070617573650000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4d7573742068617665206d696e74657220726f6c6520746f206d696e74000000600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f546f6b656e207472616e73666572207768696c65207061757365640000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f746f6b656e49647320616e642075726973206c656e677468206d69736d61746360008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f4d75737420686176652070617573657220726f6c6520746f20756e7061757365600082015250565b7f4d7573742068617665207572695f73657474657220726f6c6520746f2073657460008201527f20546f6b656e2055524900000000000000000000000000000000000000000000602082015250565b7f4d7573742068617665206275726e657220726f6c6520746f20756e7061757365600082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b61531d81614950565b811461532857600080fd5b50565b61533481614962565b811461533f57600080fd5b50565b61534b8161496e565b811461535657600080fd5b50565b61536281614978565b811461536d57600080fd5b50565b615379816149c4565b811461538457600080fd5b5056fea2646970667358221220ccd40deadc262298fecd5fa0c9e14e5b4c1a1641ec11359359fe2169f1b129da64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a23313430396a756e79610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054a494e4654000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102325760003560e01c806352e274551161013057806395d89b41116100b8578063ca15c8731161007c578063ca15c87314610685578063d5391393146106b5578063d547741f146106d3578063e63ab1e9146106ef578063e985e9c51461070d57610232565b806395d89b41146105e1578063a217fddf146105ff578063a22cb4651461061d578063b88d4fde14610639578063c87b56dd1461065557610232565b80637c88e3d9116100ff5780637c88e3d91461053d5780637f345710146105595780638456cb59146105775780639010d07c1461058157806391d14854146105b157610232565b806352e27455146104a35780635c975abb146104bf5780636352211e146104dd57806370a082311461050d57610232565b80632f2ff15d116101be57806342842e0e1161018257806342842e0e1461040357806342966c681461041f5780634a99950b1461043b5780634bb99351146104575780634f6ccce71461047357610232565b80632f2ff15d146103755780632f745c591461039157806336568abe146103c15780633f4ba83a146103dd57806340c10f19146103e757610232565b8063162094c411610205578063162094c4146102d157806318160ddd146102ed57806323b872dd1461030b578063248a9ca314610327578063282c51f31461035757610232565b806301ffc9a71461023757806306fdde0314610267578063081812fc14610285578063095ea7b3146102b5575b600080fd5b610251600480360381019061024c9190613c9c565b61073d565b60405161025e919061431a565b60405180910390f35b61026f61074f565b60405161027c9190614350565b60405180910390f35b61029f600480360381019061029a9190613cf6565b6107e1565b6040516102ac91906142b3565b60405180910390f35b6102cf60048036038101906102ca91906139a9565b610827565b005b6102eb60048036038101906102e69190613d23565b61093f565b005b6102f56109bd565b60405161030291906146d2565b60405180910390f35b61032560048036038101906103209190613893565b6109ca565b005b610341600480360381019061033c9190613bef565b610a2a565b60405161034e9190614335565b60405180910390f35b61035f610a49565b60405161036c9190614335565b60405180910390f35b61038f600480360381019061038a9190613c1c565b610a6d565b005b6103ab60048036038101906103a691906139a9565b610a8e565b6040516103b891906146d2565b60405180910390f35b6103db60048036038101906103d69190613c1c565b610b33565b005b6103e5610bb6565b005b61040160048036038101906103fc91906139a9565b610c30565b005b61041d60048036038101906104189190613893565b610cae565b005b61043960048036038101906104349190613cf6565b610cce565b005b610455600480360381019061045091906139e9565b610d4a565b005b610471600480360381019061046c9190613b77565b610d63565b005b61048d60048036038101906104889190613cf6565b610e09565b60405161049a91906146d2565b60405180910390f35b6104bd60048036038101906104b89190613ad0565b610e7a565b005b6104c7610f80565b6040516104d4919061431a565b60405180910390f35b6104f760048036038101906104f29190613cf6565b610f97565b60405161050491906142b3565b60405180910390f35b61052760048036038101906105229190613826565b611049565b60405161053491906146d2565b60405180910390f35b61055760048036038101906105529190613a58565b611101565b005b6105616111a7565b60405161056e9190614335565b60405180910390f35b61057f6111cb565b005b61059b60048036038101906105969190613c5c565b611245565b6040516105a891906142b3565b60405180910390f35b6105cb60048036038101906105c69190613c1c565b611274565b6040516105d8919061431a565b60405180910390f35b6105e96112de565b6040516105f69190614350565b60405180910390f35b610607611370565b6040516106149190614335565b60405180910390f35b61063760048036038101906106329190613969565b611377565b005b610653600480360381019061064e91906138e6565b61138d565b005b61066f600480360381019061066a9190613cf6565b6113ef565b60405161067c9190614350565b60405180910390f35b61069f600480360381019061069a9190613bef565b611401565b6040516106ac91906146d2565b60405180910390f35b6106bd611425565b6040516106ca9190614335565b60405180910390f35b6106ed60048036038101906106e89190613c1c565b611449565b005b6106f761146a565b6040516107049190614335565b60405180910390f35b61072760048036038101906107229190613853565b61148e565b604051610734919061431a565b60405180910390f35b600061074882611632565b9050919050565b60606002805461075e90614a3a565b80601f016020809104026020016040519081016040528092919081815260200182805461078a90614a3a565b80156107d75780601f106107ac576101008083540402835291602001916107d7565b820191906000526020600020905b8154815290600101906020018083116107ba57829003601f168201915b5050505050905090565b60006107ec826116ac565b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061083282610f97565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089a906145b2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108c26116f7565b73ffffffffffffffffffffffffffffffffffffffff1614806108f157506108f0816108eb6116f7565b61148e565b5b610930576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092790614532565b60405180910390fd5b61093a83836116ff565b505050565b6109707f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c61096b6116f7565b611274565b6109af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a690614652565b60405180910390fd5b6109b982826117b8565b5050565b6000600a80549050905090565b6109db6109d56116f7565b8261182c565b610a1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1190614692565b60405180910390fd5b610a258383836118c1565b505050565b6000806000838152602001908152602001600020600101549050919050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b610a7682610a2a565b610a7f81611b28565b610a898383611b3c565b505050565b6000610a9983611049565b8210610ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad1906143b2565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610b3b6116f7565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9f906146b2565b60405180910390fd5b610bb28282611b70565b5050565b610be77f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610be26116f7565b611274565b610c26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1d90614632565b60405180910390fd5b610c2e611ba4565b565b610c617f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610c5c6116f7565b611274565b610ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9790614572565b60405180910390fd5b610caa8282611c07565b5050565b610cc98383836040518060200160405280600081525061138d565b505050565b610cff7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848610cfa6116f7565b611274565b610d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3590614672565b60405180910390fd5b610d4781611de1565b50565b610d548383610c30565b610d5e828261093f565b505050565b8051825114610da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9e90614612565b60405180910390fd5b60005b8251811015610e0457610df1838281518110610dc957610dc8614bd3565b5b6020026020010151838381518110610de457610de3614bd3565b5b602002602001015161093f565b8080610dfc90614a9d565b915050610daa565b505050565b6000610e136109bd565b8210610e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4b906145f2565b60405180910390fd5b600a8281548110610e6857610e67614bd3565b5b90600052602060002001549050919050565b8151835114610ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb590614492565b60405180910390fd5b8051835114610f02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef990614472565b60405180910390fd5b60005b8351811015610f7a57610f67848281518110610f2457610f23614bd3565b5b6020026020010151848381518110610f3f57610f3e614bd3565b5b6020026020010151848481518110610f5a57610f59614bd3565b5b6020026020010151610d4a565b8080610f7290614a9d565b915050610f05565b50505050565b6000600d60009054906101000a900460ff16905090565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103790614592565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b1906144f2565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b8051825114611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90614612565b60405180910390fd5b60005b82518110156111a25761118f83828151811061116757611166614bd3565b5b602002602001015183838151811061118257611181614bd3565b5b6020026020010151610c30565b808061119a90614a9d565b915050611148565b505050565b7f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c81565b6111fc7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6111f76116f7565b611274565b61123b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611232906144b2565b60405180910390fd5b611243611ded565b565b600061126c8260016000868152602001908152602001600020611e5090919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600380546112ed90614a3a565b80601f016020809104026020016040519081016040528092919081815260200182805461131990614a3a565b80156113665780601f1061133b57610100808354040283529160200191611366565b820191906000526020600020905b81548152906001019060200180831161134957829003601f168201915b5050505050905090565b6000801b81565b6113896113826116f7565b8383611e6a565b5050565b61139e6113986116f7565b8361182c565b6113dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d490614692565b60405180910390fd5b6113e984848484611fd7565b50505050565b60606113fa82612033565b9050919050565b600061141e60016000848152602001908152602001600020612146565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61145282610a2a565b61145b81611b28565b6114658383611b70565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61152c8282611274565b6115fe57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506115a36116f7565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600061162a836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61215b565b905092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806116a557506116a4826121cb565b5b9050919050565b6116b5816122ad565b6116f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116eb90614592565b60405180910390fd5b50565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661177283610f97565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6117c1826122ad565b611800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f790614512565b60405180910390fd5b80600c600084815260200190815260200160002090805190602001906118279291906133ed565b505050565b60008061183883610f97565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061187a5750611879818561148e565b5b806118b857508373ffffffffffffffffffffffffffffffffffffffff166118a0846107e1565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166118e182610f97565b73ffffffffffffffffffffffffffffffffffffffff1614611937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192e906143f2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199e90614432565b60405180910390fd5b6119b2838383612319565b6119bd6000826116ff565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a0d919061491c565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a64919061483b565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b23838383612371565b505050565b611b3981611b346116f7565b612376565b50565b611b468282611522565b611b6b816001600085815260200190815260200160002061160290919063ffffffff16565b505050565b611b7a8282612413565b611b9f81600160008581526020019081526020016000206124f490919063ffffffff16565b505050565b611bac612524565b6000600d60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611bf06116f7565b604051611bfd91906142b3565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6e90614552565b60405180910390fd5b611c80816122ad565b15611cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb790614412565b60405180910390fd5b611ccc60008383612319565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d1c919061483b565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611ddd60008383612371565b5050565b611dea8161256d565b50565b611df56125c0565b6001600d60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611e396116f7565b604051611e4691906142b3565b60405180910390a1565b6000611e5f836000018361260a565b60001c905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed090614452565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fca919061431a565b60405180910390a3505050565b611fe28484846118c1565b611fee84848484612635565b61202d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612024906143d2565b60405180910390fd5b50505050565b606061203e826116ac565b6000600c6000848152602001908152602001600020805461205e90614a3a565b80601f016020809104026020016040519081016040528092919081815260200182805461208a90614a3a565b80156120d75780601f106120ac576101008083540402835291602001916120d7565b820191906000526020600020905b8154815290600101906020018083116120ba57829003601f168201915b5050505050905060006120e86127cc565b90506000815114156120fe578192505050612141565b60008251111561213357808260405160200161211b929190614255565b60405160208183030381529060405292505050612141565b61213c846127e3565b925050505b919050565b60006121548260000161284b565b9050919050565b6000612167838361285c565b6121c05782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506121c5565b600090505b92915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061229657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806122a657506122a58261287f565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6123248383836128f9565b61232c610f80565b1561236c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612363906145d2565b60405180910390fd5b505050565b505050565b6123808282611274565b61240f576123a58173ffffffffffffffffffffffffffffffffffffffff166014612a0d565b6123b38360001c6020612a0d565b6040516020016123c4929190614279565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124069190614350565b60405180910390fd5b5050565b61241d8282611274565b156124f057600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506124956116f7565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600061251c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612c49565b905092915050565b61252c610f80565b61256b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256290614392565b60405180910390fd5b565b61257681612d5d565b6000600c6000838152602001908152602001600020805461259690614a3a565b9050146125bd57600c600082815260200190815260200160002060006125bc9190613473565b5b50565b6125c8610f80565b15612608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ff906144d2565b60405180910390fd5b565b600082600001828154811061262257612621614bd3565b5b9060005260206000200154905092915050565b60006126568473ffffffffffffffffffffffffffffffffffffffff16612e7a565b156127bf578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261267f6116f7565b8786866040518563ffffffff1660e01b81526004016126a194939291906142ce565b602060405180830381600087803b1580156126bb57600080fd5b505af19250505080156126ec57506040513d601f19601f820116820180604052508101906126e99190613cc9565b60015b61276f573d806000811461271c576040519150601f19603f3d011682016040523d82523d6000602084013e612721565b606091505b50600081511415612767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275e906143d2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127c4565b600190505b949350505050565b606060405180602001604052806000815250905090565b60606127ee826116ac565b60006127f86127cc565b905060008151116128185760405180602001604052806000815250612843565b8061282284612e9d565b604051602001612833929190614255565b6040516020818303038152906040525b915050919050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128f257506128f182612ffe565b5b9050919050565b612904838383613078565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612947576129428161307d565b612986565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146129855761298483826130c6565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129c9576129c481613233565b612a08565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612a0757612a068282613304565b5b5b505050565b606060006002836002612a2091906148c2565b612a2a919061483b565b67ffffffffffffffff811115612a4357612a42614c02565b5b6040519080825280601f01601f191660200182016040528015612a755781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612aad57612aac614bd3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612b1157612b10614bd3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612b5191906148c2565b612b5b919061483b565b90505b6001811115612bfb577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612b9d57612b9c614bd3565b5b1a60f81b828281518110612bb457612bb3614bd3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612bf490614a10565b9050612b5e565b5060008414612c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3690614372565b60405180910390fd5b8091505092915050565b60008083600101600084815260200190815260200160002054905060008114612d51576000600182612c7b919061491c565b9050600060018660000180549050612c93919061491c565b9050818114612d02576000866000018281548110612cb457612cb3614bd3565b5b9060005260206000200154905080876000018481548110612cd857612cd7614bd3565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480612d1657612d15614ba4565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612d57565b60009150505b92915050565b6000612d6882610f97565b9050612d7681600084612319565b612d816000836116ff565b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612dd1919061491c565b925050819055506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e7681600084612371565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60606000821415612ee5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ff9565b600082905060005b60008214612f17578080612f0090614a9d565b915050600a82612f109190614891565b9150612eed565b60008167ffffffffffffffff811115612f3357612f32614c02565b5b6040519080825280601f01601f191660200182016040528015612f655781602001600182028036833780820191505090505b5090505b60008514612ff257600182612f7e919061491c565b9150600a85612f8d9190614ae6565b6030612f99919061483b565b60f81b818381518110612faf57612fae614bd3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612feb9190614891565b9450612f69565b8093505050505b919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613071575061307082613383565b5b9050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016130d384611049565b6130dd919061491c565b90506000600960008481526020019081526020016000205490508181146131c2576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a80549050613247919061491c565b90506000600b60008481526020019081526020016000205490506000600a838154811061327757613276614bd3565b5b9060005260206000200154905080600a838154811061329957613298614bd3565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a8054806132e8576132e7614ba4565b5b6001900381819060005260206000200160009055905550505050565b600061330f83611049565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8280546133f990614a3a565b90600052602060002090601f01602090048101928261341b5760008555613462565b82601f1061343457805160ff1916838001178555613462565b82800160010185558215613462579182015b82811115613461578251825591602001919060010190613446565b5b50905061346f91906134b3565b5090565b50805461347f90614a3a565b6000825580601f1061349157506134b0565b601f0160209004906000526020600020908101906134af91906134b3565b5b50565b5b808211156134cc5760008160009055506001016134b4565b5090565b60006134e36134de84614712565b6146ed565b9050808382526020820190508285602086028201111561350657613505614c36565b5b60005b85811015613536578161351c88826136c2565b845260208401935060208301925050600181019050613509565b5050509392505050565b600061355361354e8461473e565b6146ed565b9050808382526020820190508285602086028201111561357657613575614c36565b5b60005b858110156135c457813567ffffffffffffffff81111561359c5761359b614c31565b5b8086016135a989826137e3565b85526020850194506020840193505050600181019050613579565b5050509392505050565b60006135e16135dc8461476a565b6146ed565b9050808382526020820190508285602086028201111561360457613603614c36565b5b60005b85811015613634578161361a8882613811565b845260208401935060208301925050600181019050613607565b5050509392505050565b600061365161364c84614796565b6146ed565b90508281526020810184848401111561366d5761366c614c3b565b5b6136788482856149ce565b509392505050565b600061369361368e846147c7565b6146ed565b9050828152602081018484840111156136af576136ae614c3b565b5b6136ba8482856149ce565b509392505050565b6000813590506136d181615314565b92915050565b600082601f8301126136ec576136eb614c31565b5b81356136fc8482602086016134d0565b91505092915050565b600082601f83011261371a57613719614c31565b5b813561372a848260208601613540565b91505092915050565b600082601f83011261374857613747614c31565b5b81356137588482602086016135ce565b91505092915050565b6000813590506137708161532b565b92915050565b60008135905061378581615342565b92915050565b60008135905061379a81615359565b92915050565b6000815190506137af81615359565b92915050565b600082601f8301126137ca576137c9614c31565b5b81356137da84826020860161363e565b91505092915050565b600082601f8301126137f8576137f7614c31565b5b8135613808848260208601613680565b91505092915050565b60008135905061382081615370565b92915050565b60006020828403121561383c5761383b614c45565b5b600061384a848285016136c2565b91505092915050565b6000806040838503121561386a57613869614c45565b5b6000613878858286016136c2565b9250506020613889858286016136c2565b9150509250929050565b6000806000606084860312156138ac576138ab614c45565b5b60006138ba868287016136c2565b93505060206138cb868287016136c2565b92505060406138dc86828701613811565b9150509250925092565b60008060008060808587031215613900576138ff614c45565b5b600061390e878288016136c2565b945050602061391f878288016136c2565b935050604061393087828801613811565b925050606085013567ffffffffffffffff81111561395157613950614c40565b5b61395d878288016137b5565b91505092959194509250565b600080604083850312156139805761397f614c45565b5b600061398e858286016136c2565b925050602061399f85828601613761565b9150509250929050565b600080604083850312156139c0576139bf614c45565b5b60006139ce858286016136c2565b92505060206139df85828601613811565b9150509250929050565b600080600060608486031215613a0257613a01614c45565b5b6000613a10868287016136c2565b9350506020613a2186828701613811565b925050604084013567ffffffffffffffff811115613a4257613a41614c40565b5b613a4e868287016137e3565b9150509250925092565b60008060408385031215613a6f57613a6e614c45565b5b600083013567ffffffffffffffff811115613a8d57613a8c614c40565b5b613a99858286016136d7565b925050602083013567ffffffffffffffff811115613aba57613ab9614c40565b5b613ac685828601613733565b9150509250929050565b600080600060608486031215613ae957613ae8614c45565b5b600084013567ffffffffffffffff811115613b0757613b06614c40565b5b613b13868287016136d7565b935050602084013567ffffffffffffffff811115613b3457613b33614c40565b5b613b4086828701613733565b925050604084013567ffffffffffffffff811115613b6157613b60614c40565b5b613b6d86828701613705565b9150509250925092565b60008060408385031215613b8e57613b8d614c45565b5b600083013567ffffffffffffffff811115613bac57613bab614c40565b5b613bb885828601613733565b925050602083013567ffffffffffffffff811115613bd957613bd8614c40565b5b613be585828601613705565b9150509250929050565b600060208284031215613c0557613c04614c45565b5b6000613c1384828501613776565b91505092915050565b60008060408385031215613c3357613c32614c45565b5b6000613c4185828601613776565b9250506020613c52858286016136c2565b9150509250929050565b60008060408385031215613c7357613c72614c45565b5b6000613c8185828601613776565b9250506020613c9285828601613811565b9150509250929050565b600060208284031215613cb257613cb1614c45565b5b6000613cc08482850161378b565b91505092915050565b600060208284031215613cdf57613cde614c45565b5b6000613ced848285016137a0565b91505092915050565b600060208284031215613d0c57613d0b614c45565b5b6000613d1a84828501613811565b91505092915050565b60008060408385031215613d3a57613d39614c45565b5b6000613d4885828601613811565b925050602083013567ffffffffffffffff811115613d6957613d68614c40565b5b613d75858286016137e3565b9150509250929050565b613d8881614950565b82525050565b613d9781614962565b82525050565b613da68161496e565b82525050565b6000613db7826147f8565b613dc1818561480e565b9350613dd18185602086016149dd565b613dda81614c4a565b840191505092915050565b6000613df082614803565b613dfa818561481f565b9350613e0a8185602086016149dd565b613e1381614c4a565b840191505092915050565b6000613e2982614803565b613e338185614830565b9350613e438185602086016149dd565b80840191505092915050565b6000613e5c60208361481f565b9150613e6782614c5b565b602082019050919050565b6000613e7f60148361481f565b9150613e8a82614c84565b602082019050919050565b6000613ea2602b8361481f565b9150613ead82614cad565b604082019050919050565b6000613ec560328361481f565b9150613ed082614cfc565b604082019050919050565b6000613ee860258361481f565b9150613ef382614d4b565b604082019050919050565b6000613f0b601c8361481f565b9150613f1682614d9a565b602082019050919050565b6000613f2e60248361481f565b9150613f3982614dc3565b604082019050919050565b6000613f5160198361481f565b9150613f5c82614e12565b602082019050919050565b6000613f7460228361481f565b9150613f7f82614e3b565b604082019050919050565b6000613f9760208361481f565b9150613fa282614e8a565b602082019050919050565b6000613fba601e8361481f565b9150613fc582614eb3565b602082019050919050565b6000613fdd60108361481f565b9150613fe882614edc565b602082019050919050565b600061400060298361481f565b915061400b82614f05565b604082019050919050565b6000614023602e8361481f565b915061402e82614f54565b604082019050919050565b6000614046603e8361481f565b915061405182614fa3565b604082019050919050565b600061406960208361481f565b915061407482614ff2565b602082019050919050565b600061408c601d8361481f565b91506140978261501b565b602082019050919050565b60006140af60188361481f565b91506140ba82615044565b602082019050919050565b60006140d260218361481f565b91506140dd8261506d565b604082019050919050565b60006140f5601b8361481f565b9150614100826150bc565b602082019050919050565b6000614118602c8361481f565b9150614123826150e5565b604082019050919050565b600061413b60218361481f565b915061414682615134565b604082019050919050565b600061415e601783614830565b915061416982615183565b601782019050919050565b600061418160208361481f565b915061418c826151ac565b602082019050919050565b60006141a4602a8361481f565b91506141af826151d5565b604082019050919050565b60006141c760208361481f565b91506141d282615224565b602082019050919050565b60006141ea602e8361481f565b91506141f58261524d565b604082019050919050565b600061420d601183614830565b91506142188261529c565b601182019050919050565b6000614230602f8361481f565b915061423b826152c5565b604082019050919050565b61424f816149c4565b82525050565b60006142618285613e1e565b915061426d8284613e1e565b91508190509392505050565b600061428482614151565b91506142908285613e1e565b915061429b82614200565b91506142a78284613e1e565b91508190509392505050565b60006020820190506142c86000830184613d7f565b92915050565b60006080820190506142e36000830187613d7f565b6142f06020830186613d7f565b6142fd6040830185614246565b818103606083015261430f8184613dac565b905095945050505050565b600060208201905061432f6000830184613d8e565b92915050565b600060208201905061434a6000830184613d9d565b92915050565b6000602082019050818103600083015261436a8184613de5565b905092915050565b6000602082019050818103600083015261438b81613e4f565b9050919050565b600060208201905081810360008301526143ab81613e72565b9050919050565b600060208201905081810360008301526143cb81613e95565b9050919050565b600060208201905081810360008301526143eb81613eb8565b9050919050565b6000602082019050818103600083015261440b81613edb565b9050919050565b6000602082019050818103600083015261442b81613efe565b9050919050565b6000602082019050818103600083015261444b81613f21565b9050919050565b6000602082019050818103600083015261446b81613f44565b9050919050565b6000602082019050818103600083015261448b81613f67565b9050919050565b600060208201905081810360008301526144ab81613f8a565b9050919050565b600060208201905081810360008301526144cb81613fad565b9050919050565b600060208201905081810360008301526144eb81613fd0565b9050919050565b6000602082019050818103600083015261450b81613ff3565b9050919050565b6000602082019050818103600083015261452b81614016565b9050919050565b6000602082019050818103600083015261454b81614039565b9050919050565b6000602082019050818103600083015261456b8161405c565b9050919050565b6000602082019050818103600083015261458b8161407f565b9050919050565b600060208201905081810360008301526145ab816140a2565b9050919050565b600060208201905081810360008301526145cb816140c5565b9050919050565b600060208201905081810360008301526145eb816140e8565b9050919050565b6000602082019050818103600083015261460b8161410b565b9050919050565b6000602082019050818103600083015261462b8161412e565b9050919050565b6000602082019050818103600083015261464b81614174565b9050919050565b6000602082019050818103600083015261466b81614197565b9050919050565b6000602082019050818103600083015261468b816141ba565b9050919050565b600060208201905081810360008301526146ab816141dd565b9050919050565b600060208201905081810360008301526146cb81614223565b9050919050565b60006020820190506146e76000830184614246565b92915050565b60006146f7614708565b90506147038282614a6c565b919050565b6000604051905090565b600067ffffffffffffffff82111561472d5761472c614c02565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561475957614758614c02565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561478557614784614c02565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156147b1576147b0614c02565b5b6147ba82614c4a565b9050602081019050919050565b600067ffffffffffffffff8211156147e2576147e1614c02565b5b6147eb82614c4a565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614846826149c4565b9150614851836149c4565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561488657614885614b17565b5b828201905092915050565b600061489c826149c4565b91506148a7836149c4565b9250826148b7576148b6614b46565b5b828204905092915050565b60006148cd826149c4565b91506148d8836149c4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561491157614910614b17565b5b828202905092915050565b6000614927826149c4565b9150614932836149c4565b92508282101561494557614944614b17565b5b828203905092915050565b600061495b826149a4565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156149fb5780820151818401526020810190506149e0565b83811115614a0a576000848401525b50505050565b6000614a1b826149c4565b91506000821415614a2f57614a2e614b17565b5b600182039050919050565b60006002820490506001821680614a5257607f821691505b60208210811415614a6657614a65614b75565b5b50919050565b614a7582614c4a565b810181811067ffffffffffffffff82111715614a9457614a93614c02565b5b80604052505050565b6000614aa8826149c4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614adb57614ada614b17565b5b600182019050919050565b6000614af1826149c4565b9150614afc836149c4565b925082614b0c57614b0b614b46565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f746f7320616e64205f746f6b656e55524973206c656e677468206d69736d617460008201527f6368000000000000000000000000000000000000000000000000000000000000602082015250565b7f746f7320616e6420746f6b656e494473206c656e677468206d69736d61746368600082015250565b7f4d75737420686176652070617573657220726f6c6520746f2070617573650000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4d7573742068617665206d696e74657220726f6c6520746f206d696e74000000600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f546f6b656e207472616e73666572207768696c65207061757365640000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f746f6b656e49647320616e642075726973206c656e677468206d69736d61746360008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f4d75737420686176652070617573657220726f6c6520746f20756e7061757365600082015250565b7f4d7573742068617665207572695f73657474657220726f6c6520746f2073657460008201527f20546f6b656e2055524900000000000000000000000000000000000000000000602082015250565b7f4d7573742068617665206275726e657220726f6c6520746f20756e7061757365600082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b61531d81614950565b811461532857600080fd5b50565b61533481614962565b811461533f57600080fd5b50565b61534b8161496e565b811461535657600080fd5b50565b61536281614978565b811461536d57600080fd5b50565b615379816149c4565b811461538457600080fd5b5056fea2646970667358221220ccd40deadc262298fecd5fa0c9e14e5b4c1a1641ec11359359fe2169f1b129da64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a23313430396a756e79610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054a494e4654000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): #1409junya
Arg [1] : symbol (string): JINFT
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [3] : 23313430396a756e796100000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [5] : 4a494e4654000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
76816:5158:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81260:254;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54756:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56269:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55786:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78010:227;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70623:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56969:336;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39411:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77015:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39852:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70291:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40996:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80673:153;;;:::i;:::-;;78750:184;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57376:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81522:163;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79455:160;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78296:313;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70813:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79825:419;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22463:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54467:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54198:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78986:274;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77153:70;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80385:147;;;:::i;:::-;;44649:153;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37871:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54925:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36976:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56512:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57632:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81816:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44976:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76946:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40292:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77084:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56738:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81260:254;81441:4;81470:36;81494:11;81470:23;:36::i;:::-;81463:43;;81260:254;;;:::o;54756:100::-;54810:13;54843:5;54836:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54756:100;:::o;56269:171::-;56345:7;56365:23;56380:7;56365:14;:23::i;:::-;56408:15;:24;56424:7;56408:24;;;;;;;;;;;;;;;;;;;;;56401:31;;56269:171;;;:::o;55786:417::-;55867:13;55883:23;55898:7;55883:14;:23::i;:::-;55867:39;;55931:5;55925:11;;:2;:11;;;;55917:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;56025:5;56009:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;56034:37;56051:5;56058:12;:10;:12::i;:::-;56034:16;:37::i;:::-;56009:62;55987:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;56174:21;56183:2;56187:7;56174:8;:21::i;:::-;55856:347;55786:417;;:::o;78010:227::-;78099:38;77195:28;78124:12;:10;:12::i;:::-;78099:7;:38::i;:::-;78091:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;78197:32;78210:7;78219:9;78197:12;:32::i;:::-;78010:227;;:::o;70623:113::-;70684:7;70711:10;:17;;;;70704:24;;70623:113;:::o;56969:336::-;57164:41;57183:12;:10;:12::i;:::-;57197:7;57164:18;:41::i;:::-;57156:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;57269:28;57279:4;57285:2;57289:7;57269:9;:28::i;:::-;56969:336;;;:::o;39411:131::-;39485:7;39512:6;:12;39519:4;39512:12;;;;;;;;;;;:22;;;39505:29;;39411:131;;;:::o;77015:62::-;77053:24;77015:62;:::o;39852:147::-;39935:18;39948:4;39935:12;:18::i;:::-;37467:16;37478:4;37467:10;:16::i;:::-;39966:25:::1;39977:4;39983:7;39966:10;:25::i;:::-;39852:147:::0;;;:::o;70291:256::-;70388:7;70424:23;70441:5;70424:16;:23::i;:::-;70416:5;:31;70408:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;70513:12;:19;70526:5;70513:19;;;;;;;;;;;;;;;:26;70533:5;70513:26;;;;;;;;;;;;70506:33;;70291:256;;;;:::o;40996:218::-;41103:12;:10;:12::i;:::-;41092:23;;:7;:23;;;41084:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;41180:26;41192:4;41198:7;41180:11;:26::i;:::-;40996:218;;:::o;80673:153::-;80726:34;77122:24;80747:12;:10;:12::i;:::-;80726:7;:34::i;:::-;80718:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;80808:10;:8;:10::i;:::-;80673:153::o;78750:184::-;78827:34;76984:24;78848:12;:10;:12::i;:::-;78827:7;:34::i;:::-;78819:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;78908:18;78914:2;78918:7;78908:5;:18::i;:::-;78750:184;;:::o;57376:185::-;57514:39;57531:4;57537:2;57541:7;57514:39;;;;;;;;;;;;:16;:39::i;:::-;57376:185;;;:::o;81522:163::-;81579:34;77053:24;81600:12;:10;:12::i;:::-;81579:7;:34::i;:::-;81571:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;81663:14;81669:7;81663:5;:14::i;:::-;81522:163;:::o;79455:160::-;79548:17;79553:2;79557:7;79548:4;:17::i;:::-;79576:31;79588:7;79597:9;79576:11;:31::i;:::-;79455:160;;;:::o;78296:313::-;78422:10;:17;78403:8;:15;:36;78395:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;78495:9;78490:112;78514:8;:15;78510:1;:19;78490:112;;;78551:39;78563:8;78572:1;78563:11;;;;;;;;:::i;:::-;;;;;;;;78576:10;78587:1;78576:13;;;;;;;;:::i;:::-;;;;;;;;78551:11;:39::i;:::-;78531:3;;;;;:::i;:::-;;;;78490:112;;;;78296:313;;:::o;70813:233::-;70888:7;70924:30;:28;:30::i;:::-;70916:5;:38;70908:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;71021:10;71032:5;71021:17;;;;;;;;:::i;:::-;;;;;;;;;;71014:24;;70813:233;;;:::o;79825:419::-;79968:8;:15;79954:3;:10;:29;79946:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;80053:10;:17;80039:3;:10;:31;80031:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;80127:9;80122:115;80146:3;:10;80142:1;:14;80122:115;;;80178:47;80190:3;80194:1;80190:6;;;;;;;;:::i;:::-;;;;;;;;80198:8;80207:1;80198:11;;;;;;;;:::i;:::-;;;;;;;;80211:10;80222:1;80211:13;;;;;;;;:::i;:::-;;;;;;;;80178:11;:47::i;:::-;80158:3;;;;;:::i;:::-;;;;80122:115;;;;79825:419;;;:::o;22463:86::-;22510:4;22534:7;;;;;;;;;;;22527:14;;22463:86;:::o;54467:222::-;54539:7;54559:13;54575:7;:16;54583:7;54575:16;;;;;;;;;;;;;;;;;;;;;54559:32;;54627:1;54610:19;;:5;:19;;;;54602:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;54676:5;54669:12;;;54467:222;;;:::o;54198:207::-;54270:7;54315:1;54298:19;;:5;:19;;;;54290:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54381:9;:16;54391:5;54381:16;;;;;;;;;;;;;;;;54374:23;;54198:207;;;:::o;78986:274::-;79094:8;:15;79080:3;:10;:29;79072:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;79165:9;79160:93;79184:3;:10;79180:1;:14;79160:93;;;79216:25;79221:3;79225:1;79221:6;;;;;;;;:::i;:::-;;;;;;;;79229:8;79238:1;79229:11;;;;;;;;:::i;:::-;;;;;;;;79216:4;:25::i;:::-;79196:3;;;;;:::i;:::-;;;;79160:93;;;;78986:274;;:::o;77153:70::-;77195:28;77153:70;:::o;80385:147::-;80436:34;77122:24;80457:12;:10;:12::i;:::-;80436:7;:34::i;:::-;80428:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;80516:8;:6;:8::i;:::-;80385:147::o;44649:153::-;44739:7;44766:28;44788:5;44766:12;:18;44779:4;44766:18;;;;;;;;;;;:21;;:28;;;;:::i;:::-;44759:35;;44649:153;;;;:::o;37871:147::-;37957:4;37981:6;:12;37988:4;37981:12;;;;;;;;;;;:20;;:29;38002:7;37981:29;;;;;;;;;;;;;;;;;;;;;;;;;37974:36;;37871:147;;;;:::o;54925:104::-;54981:13;55014:7;55007:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54925:104;:::o;36976:49::-;37021:4;36976:49;;;:::o;56512:155::-;56607:52;56626:12;:10;:12::i;:::-;56640:8;56650;56607:18;:52::i;:::-;56512:155;;:::o;57632:323::-;57806:41;57825:12;:10;:12::i;:::-;57839:7;57806:18;:41::i;:::-;57798:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;57909:38;57923:4;57929:2;57933:7;57942:4;57909:13;:38::i;:::-;57632:323;;;;:::o;81816:155::-;81907:13;81940:23;81955:7;81940:14;:23::i;:::-;81933:30;;81816:155;;;:::o;44976:142::-;45056:7;45083:27;:12;:18;45096:4;45083:18;;;;;;;;;;;:25;:27::i;:::-;45076:34;;44976:142;;;:::o;76946:62::-;76984:24;76946:62;:::o;40292:149::-;40376:18;40389:4;40376:12;:18::i;:::-;37467:16;37478:4;37467:10;:16::i;:::-;40407:26:::1;40419:4;40425:7;40407:11;:26::i;:::-;40292:149:::0;;;:::o;77084:62::-;77122:24;77084:62;:::o;56738:164::-;56835:4;56859:18;:25;56878:5;56859:25;;;;;;;;;;;;;;;:35;56885:8;56859:35;;;;;;;;;;;;;;;;;;;;;;;;;56852:42;;56738:164;;;;:::o;42593:238::-;42677:22;42685:4;42691:7;42677;:22::i;:::-;42672:152;;42748:4;42716:6;:12;42723:4;42716:12;;;;;;;;;;;:20;;:29;42737:7;42716:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;42799:12;:10;:12::i;:::-;42772:40;;42790:7;42772:40;;42784:4;42772:40;;;;;;;;;;42672:152;42593:238;;:::o;8296:152::-;8366:4;8390:50;8395:3;:10;;8431:5;8415:23;;8407:32;;8390:4;:50::i;:::-;8383:57;;8296:152;;;;:::o;69983:224::-;70085:4;70124:35;70109:50;;;:11;:50;;;;:90;;;;70163:36;70187:11;70163:23;:36::i;:::-;70109:90;70102:97;;69983:224;;;:::o;64244:135::-;64326:16;64334:7;64326;:16::i;:::-;64318:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;64244:135;:::o;20576:98::-;20629:7;20656:10;20649:17;;20576:98;:::o;63523:174::-;63625:2;63598:15;:24;63614:7;63598:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;63681:7;63677:2;63643:46;;63652:23;63667:7;63652:14;:23::i;:::-;63643:46;;;;;;;;;;;;63523:174;;:::o;68317:217::-;68417:16;68425:7;68417;:16::i;:::-;68409:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;68517:9;68495:10;:19;68506:7;68495:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;68317:217;;:::o;59756:264::-;59849:4;59866:13;59882:23;59897:7;59882:14;:23::i;:::-;59866:39;;59935:5;59924:16;;:7;:16;;;:52;;;;59944:32;59961:5;59968:7;59944:16;:32::i;:::-;59924:52;:87;;;;60004:7;59980:31;;:20;59992:7;59980:11;:20::i;:::-;:31;;;59924:87;59916:96;;;59756:264;;;;:::o;62779:625::-;62938:4;62911:31;;:23;62926:7;62911:14;:23::i;:::-;:31;;;62903:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;63017:1;63003:16;;:2;:16;;;;62995:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;63073:39;63094:4;63100:2;63104:7;63073:20;:39::i;:::-;63177:29;63194:1;63198:7;63177:8;:29::i;:::-;63238:1;63219:9;:15;63229:4;63219:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;63267:1;63250:9;:13;63260:2;63250:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;63298:2;63279:7;:16;63287:7;63279:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;63337:7;63333:2;63318:27;;63327:4;63318:27;;;;;;;;;;;;63358:38;63378:4;63384:2;63388:7;63358:19;:38::i;:::-;62779:625;;;:::o;38322:105::-;38389:30;38400:4;38406:12;:10;:12::i;:::-;38389:10;:30::i;:::-;38322:105;:::o;45211:169::-;45299:31;45316:4;45322:7;45299:16;:31::i;:::-;45341;45364:7;45341:12;:18;45354:4;45341:18;;;;;;;;;;;:22;;:31;;;;:::i;:::-;;45211:169;;:::o;45474:174::-;45563:32;45581:4;45587:7;45563:17;:32::i;:::-;45606:34;45632:7;45606:12;:18;45619:4;45606:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;45474:174;;:::o;23318:120::-;22327:16;:14;:16::i;:::-;23387:5:::1;23377:7;;:15;;;;;;;;;;;;;;;;;;23408:22;23417:12;:10;:12::i;:::-;23408:22;;;;;;:::i;:::-;;;;;;;;23318:120::o:0;61354:439::-;61448:1;61434:16;;:2;:16;;;;61426:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;61507:16;61515:7;61507;:16::i;:::-;61506:17;61498:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;61569:45;61598:1;61602:2;61606:7;61569:20;:45::i;:::-;61644:1;61627:9;:13;61637:2;61627:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;61675:2;61656:7;:16;61664:7;61656:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;61720:7;61716:2;61695:33;;61712:1;61695:33;;;;;;;;;;;;61741:44;61769:1;61773:2;61777:7;61741:19;:44::i;:::-;61354:439;;:::o;81693:115::-;81780:20;81792:7;81780:11;:20::i;:::-;81693:115;:::o;23059:118::-;22068:19;:17;:19::i;:::-;23129:4:::1;23119:7;;:14;;;;;;;;;;;;;;;;;;23149:20;23156:12;:10;:12::i;:::-;23149:20;;;;;;:::i;:::-;;;;;;;;23059:118::o:0;9592:158::-;9666:7;9717:22;9721:3;:10;;9733:5;9717:3;:22::i;:::-;9709:31;;9686:56;;9592:158;;;;:::o;63840:315::-;63995:8;63986:17;;:5;:17;;;;63978:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;64082:8;64044:18;:25;64063:5;64044:25;;;;;;;;;;;;;;;:35;64070:8;64044:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;64128:8;64106:41;;64121:5;64106:41;;;64138:8;64106:41;;;;;;:::i;:::-;;;;;;;;63840:315;;;:::o;58836:313::-;58992:28;59002:4;59008:2;59012:7;58992:9;:28::i;:::-;59039:47;59062:4;59068:2;59072:7;59081:4;59039:22;:47::i;:::-;59031:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;58836:313;;;;:::o;67537:624::-;67610:13;67636:23;67651:7;67636:14;:23::i;:::-;67672;67698:10;:19;67709:7;67698:19;;;;;;;;;;;67672:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67728:18;67749:10;:8;:10::i;:::-;67728:31;;67857:1;67841:4;67835:18;:23;67831:72;;;67882:9;67875:16;;;;;;67831:72;68033:1;68013:9;68007:23;:27;68003:108;;;68082:4;68088:9;68065:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68051:48;;;;;;68003:108;68130:23;68145:7;68130:14;:23::i;:::-;68123:30;;;;67537:624;;;;:::o;9121:117::-;9184:7;9211:19;9219:3;:10;;9211:7;:19::i;:::-;9204:26;;9121:117;;;:::o;2211:414::-;2274:4;2296:21;2306:3;2311:5;2296:9;:21::i;:::-;2291:327;;2334:3;:11;;2351:5;2334:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2517:3;:11;;:18;;;;2495:3;:12;;:19;2508:5;2495:19;;;;;;;;;;;:40;;;;2557:4;2550:11;;;;2291:327;2601:5;2594:12;;2211:414;;;;;:::o;53829:305::-;53931:4;53983:25;53968:40;;;:11;:40;;;;:105;;;;54040:33;54025:48;;;:11;:48;;;;53968:105;:158;;;;54090:36;54114:11;54090:23;:36::i;:::-;53968:158;53948:178;;53829:305;;;:::o;59462:127::-;59527:4;59579:1;59551:30;;:7;:16;59559:7;59551:16;;;;;;;;;;;;;;;;;;;;;:30;;;;59544:37;;59462:127;;;:::o;80892:296::-;81068:50;81095:4;81101:2;81105:12;81068:26;:50::i;:::-;81140:8;:6;:8::i;:::-;81139:9;81131:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;80892:296;;;:::o;66879:125::-;;;;:::o;38717:505::-;38806:22;38814:4;38820:7;38806;:22::i;:::-;38801:414;;38994:41;39022:7;38994:41;;39032:2;38994:19;:41::i;:::-;39108:38;39136:4;39128:13;;39143:2;39108:19;:38::i;:::-;38899:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38845:358;;;;;;;;;;;:::i;:::-;;;;;;;;38801:414;38717:505;;:::o;43011:239::-;43095:22;43103:4;43109:7;43095;:22::i;:::-;43091:152;;;43166:5;43134:6;:12;43141:4;43134:12;;;;;;;;;;;:20;;:29;43155:7;43134:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;43218:12;:10;:12::i;:::-;43191:40;;43209:7;43191:40;;43203:4;43191:40;;;;;;;;;;43091:152;43011:239;;:::o;8624:158::-;8697:4;8721:53;8729:3;:10;;8765:5;8749:23;;8741:32;;8721:7;:53::i;:::-;8714:60;;8624:158;;;;:::o;22807:108::-;22874:8;:6;:8::i;:::-;22866:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;22807:108::o;68759:206::-;68828:20;68840:7;68828:11;:20::i;:::-;68902:1;68871:10;:19;68882:7;68871:19;;;;;;;;;;;68865:33;;;;;:::i;:::-;;;:38;68861:97;;68927:10;:19;68938:7;68927:19;;;;;;;;;;;;68920:26;;;;:::i;:::-;68861:97;68759:206;:::o;22622:108::-;22693:8;:6;:8::i;:::-;22692:9;22684:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;22622:108::o;4985:120::-;5052:7;5079:3;:11;;5091:5;5079:18;;;;;;;;:::i;:::-;;;;;;;;;;5072:25;;4985:120;;;;:::o;64943:853::-;65097:4;65118:15;:2;:13;;;:15::i;:::-;65114:675;;;65170:2;65154:36;;;65191:12;:10;:12::i;:::-;65205:4;65211:7;65220:4;65154:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;65150:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65412:1;65395:6;:13;:18;65391:328;;;65438:60;;;;;;;;;;:::i;:::-;;;;;;;;65391:328;65669:6;65663:13;65654:6;65650:2;65646:15;65639:38;65150:584;65286:41;;;65276:51;;;:6;:51;;;;65269:58;;;;;65114:675;65773:4;65766:11;;64943:853;;;;;;;:::o;55630:94::-;55681:13;55707:9;;;;;;;;;;;;;;55630:94;:::o;55100:281::-;55173:13;55199:23;55214:7;55199:14;:23::i;:::-;55235:21;55259:10;:8;:10::i;:::-;55235:34;;55311:1;55293:7;55287:21;:25;:86;;;;;;;;;;;;;;;;;55339:7;55348:18;:7;:16;:18::i;:::-;55322:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55287:86;55280:93;;;55100:281;;;:::o;4522:109::-;4578:7;4605:3;:11;;:18;;;;4598:25;;4522:109;;;:::o;4307:129::-;4380:4;4427:1;4404:3;:12;;:19;4417:5;4404:19;;;;;;;;;;;;:24;;4397:31;;4307:129;;;;:::o;43836:214::-;43921:4;43960:42;43945:57;;;:11;:57;;;;:97;;;;44006:36;44030:11;44006:23;:36::i;:::-;43945:97;43938:104;;43836:214;;;:::o;71659:589::-;71803:45;71830:4;71836:2;71840:7;71803:26;:45::i;:::-;71881:1;71865:18;;:4;:18;;;71861:187;;;71900:40;71932:7;71900:31;:40::i;:::-;71861:187;;;71970:2;71962:10;;:4;:10;;;71958:90;;71989:47;72022:4;72028:7;71989:32;:47::i;:::-;71958:90;71861:187;72076:1;72062:16;;:2;:16;;;72058:183;;;72095:45;72132:7;72095:36;:45::i;:::-;72058:183;;;72168:4;72162:10;;:2;:10;;;72158:83;;72189:40;72217:2;72221:7;72189:27;:40::i;:::-;72158:83;72058:183;71659:589;;;:::o;19131:451::-;19206:13;19232:19;19277:1;19268:6;19264:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;19254:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19232:47;;19290:15;:6;19297:1;19290:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;19316;:6;19323:1;19316:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;19347:9;19372:1;19363:6;19359:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;19347:26;;19342:135;19379:1;19375;:5;19342:135;;;19414:12;19435:3;19427:5;:11;19414:25;;;;;;;:::i;:::-;;;;;19402:6;19409:1;19402:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;19464:1;19454:11;;;;;19382:3;;;;:::i;:::-;;;19342:135;;;;19504:1;19495:5;:10;19487:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;19567:6;19553:21;;;19131:451;;;;:::o;2801:1420::-;2867:4;2985:18;3006:3;:12;;:19;3019:5;3006:19;;;;;;;;;;;;2985:40;;3056:1;3042:10;:15;3038:1176;;3417:21;3454:1;3441:10;:14;;;;:::i;:::-;3417:38;;3470:17;3511:1;3490:3;:11;;:18;;;;:22;;;;:::i;:::-;3470:42;;3546:13;3533:9;:26;3529:405;;3580:17;3600:3;:11;;3612:9;3600:22;;;;;;;;:::i;:::-;;;;;;;;;;3580:42;;3754:9;3725:3;:11;;3737:13;3725:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;3865:10;3839:3;:12;;:23;3852:9;3839:23;;;;;;;;;;;:36;;;;3561:373;3529:405;4015:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4110:3;:12;;:19;4123:5;4110:19;;;;;;;;;;;4103:26;;;4153:4;4146:11;;;;;;;3038:1176;4197:5;4190:12;;;2801:1420;;;;;:::o;62022:420::-;62082:13;62098:23;62113:7;62098:14;:23::i;:::-;62082:39;;62134:48;62155:5;62170:1;62174:7;62134:20;:48::i;:::-;62223:29;62240:1;62244:7;62223:8;:29::i;:::-;62285:1;62265:9;:16;62275:5;62265:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;62304:7;:16;62312:7;62304:16;;;;;;;;;;;;62297:23;;;;;;;;;;;62366:7;62362:1;62338:36;;62347:5;62338:36;;;;;;;;;;;;62387:47;62407:5;62422:1;62426:7;62387:19;:47::i;:::-;62071:371;62022:420;:::o;24678:326::-;24738:4;24995:1;24973:7;:19;;;:23;24966:30;;24678:326;;;:::o;17830:723::-;17886:13;18116:1;18107:5;:10;18103:53;;;18134:10;;;;;;;;;;;;;;;;;;;;;18103:53;18166:12;18181:5;18166:20;;18197:14;18222:78;18237:1;18229:4;:9;18222:78;;18255:8;;;;;:::i;:::-;;;;18286:2;18278:10;;;;;:::i;:::-;;;18222:78;;;18310:19;18342:6;18332:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18310:39;;18360:154;18376:1;18367:5;:10;18360:154;;18404:1;18394:11;;;;;:::i;:::-;;;18471:2;18463:5;:10;;;;:::i;:::-;18450:2;:24;;;;:::i;:::-;18437:39;;18420:6;18427;18420:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18500:2;18491:11;;;;;:::i;:::-;;;18360:154;;;18538:6;18524:21;;;;;17830:723;;;;:::o;37575:204::-;37660:4;37699:32;37684:47;;;:11;:47;;;;:87;;;;37735:36;37759:11;37735:23;:36::i;:::-;37684:87;37677:94;;37575:204;;;:::o;66368:126::-;;;;:::o;72971:164::-;73075:10;:17;;;;73048:15;:24;73064:7;73048:24;;;;;;;;;;;:44;;;;73103:10;73119:7;73103:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72971:164;:::o;73762:988::-;74028:22;74078:1;74053:22;74070:4;74053:16;:22::i;:::-;:26;;;;:::i;:::-;74028:51;;74090:18;74111:17;:26;74129:7;74111:26;;;;;;;;;;;;74090:47;;74258:14;74244:10;:28;74240:328;;74289:19;74311:12;:18;74324:4;74311:18;;;;;;;;;;;;;;;:34;74330:14;74311:34;;;;;;;;;;;;74289:56;;74395:11;74362:12;:18;74375:4;74362:18;;;;;;;;;;;;;;;:30;74381:10;74362:30;;;;;;;;;;;:44;;;;74512:10;74479:17;:30;74497:11;74479:30;;;;;;;;;;;:43;;;;74274:294;74240:328;74664:17;:26;74682:7;74664:26;;;;;;;;;;;74657:33;;;74708:12;:18;74721:4;74708:18;;;;;;;;;;;;;;;:34;74727:14;74708:34;;;;;;;;;;;74701:41;;;73843:907;;73762:988;;:::o;75045:1079::-;75298:22;75343:1;75323:10;:17;;;;:21;;;;:::i;:::-;75298:46;;75355:18;75376:15;:24;75392:7;75376:24;;;;;;;;;;;;75355:45;;75727:19;75749:10;75760:14;75749:26;;;;;;;;:::i;:::-;;;;;;;;;;75727:48;;75813:11;75788:10;75799;75788:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;75924:10;75893:15;:28;75909:11;75893:28;;;;;;;;;;;:41;;;;76065:15;:24;76081:7;76065:24;;;;;;;;;;;76058:31;;;76100:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;75116:1008;;;75045:1079;:::o;72549:221::-;72634:14;72651:20;72668:2;72651:16;:20::i;:::-;72634:37;;72709:7;72682:12;:16;72695:2;72682:16;;;;;;;;;;;;;;;:24;72699:6;72682:24;;;;;;;;;;;:34;;;;72756:6;72727:17;:26;72745:7;72727:26;;;;;;;;;;;:35;;;;72623:147;72549:221;;:::o;34834:157::-;34919:4;34958:25;34943:40;;;:11;:40;;;;34936:47;;34834:157;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;768:957::-;874:5;899:91;915:74;982:6;915:74;:::i;:::-;899:91;:::i;:::-;890:100;;1010:5;1039:6;1032:5;1025:21;1073:4;1066:5;1062:16;1055:23;;1099:6;1149:3;1141:4;1133:6;1129:17;1124:3;1120:27;1117:36;1114:143;;;1168:79;;:::i;:::-;1114:143;1281:1;1266:453;1291:6;1288:1;1285:13;1266:453;;;1373:3;1360:17;1409:18;1396:11;1393:35;1390:122;;;1431:79;;:::i;:::-;1390:122;1555:11;1547:6;1543:24;1593:47;1636:3;1624:10;1593:47;:::i;:::-;1588:3;1581:60;1670:4;1665:3;1661:14;1654:21;;1704:4;1699:3;1695:14;1688:21;;1326:393;;1313:1;1310;1306:9;1301:14;;1266:453;;;1270:14;880:845;;768:957;;;;;:::o;1748:722::-;1844:5;1869:81;1885:64;1942:6;1885:64;:::i;:::-;1869:81;:::i;:::-;1860:90;;1970:5;1999:6;1992:5;1985:21;2033:4;2026:5;2022:16;2015:23;;2059:6;2109:3;2101:4;2093:6;2089:17;2084:3;2080:27;2077:36;2074:143;;;2128:79;;:::i;:::-;2074:143;2241:1;2226:238;2251:6;2248:1;2245:13;2226:238;;;2319:3;2348:37;2381:3;2369:10;2348:37;:::i;:::-;2343:3;2336:50;2415:4;2410:3;2406:14;2399:21;;2449:4;2444:3;2440:14;2433:21;;2286:178;2273:1;2270;2266:9;2261:14;;2226:238;;;2230:14;1850:620;;1748:722;;;;;:::o;2476:410::-;2553:5;2578:65;2594:48;2635:6;2594:48;:::i;:::-;2578:65;:::i;:::-;2569:74;;2666:6;2659:5;2652:21;2704:4;2697:5;2693:16;2742:3;2733:6;2728:3;2724:16;2721:25;2718:112;;;2749:79;;:::i;:::-;2718:112;2839:41;2873:6;2868:3;2863;2839:41;:::i;:::-;2559:327;2476:410;;;;;:::o;2892:412::-;2970:5;2995:66;3011:49;3053:6;3011:49;:::i;:::-;2995:66;:::i;:::-;2986:75;;3084:6;3077:5;3070:21;3122:4;3115:5;3111:16;3160:3;3151:6;3146:3;3142:16;3139:25;3136:112;;;3167:79;;:::i;:::-;3136:112;3257:41;3291:6;3286:3;3281;3257:41;:::i;:::-;2976:328;2892:412;;;;;:::o;3310:139::-;3356:5;3394:6;3381:20;3372:29;;3410:33;3437:5;3410:33;:::i;:::-;3310:139;;;;:::o;3472:370::-;3543:5;3592:3;3585:4;3577:6;3573:17;3569:27;3559:122;;3600:79;;:::i;:::-;3559:122;3717:6;3704:20;3742:94;3832:3;3824:6;3817:4;3809:6;3805:17;3742:94;:::i;:::-;3733:103;;3549:293;3472:370;;;;:::o;3864:390::-;3945:5;3994:3;3987:4;3979:6;3975:17;3971:27;3961:122;;4002:79;;:::i;:::-;3961:122;4119:6;4106:20;4144:104;4244:3;4236:6;4229:4;4221:6;4217:17;4144:104;:::i;:::-;4135:113;;3951:303;3864:390;;;;:::o;4277:370::-;4348:5;4397:3;4390:4;4382:6;4378:17;4374:27;4364:122;;4405:79;;:::i;:::-;4364:122;4522:6;4509:20;4547:94;4637:3;4629:6;4622:4;4614:6;4610:17;4547:94;:::i;:::-;4538:103;;4354:293;4277:370;;;;:::o;4653:133::-;4696:5;4734:6;4721:20;4712:29;;4750:30;4774:5;4750:30;:::i;:::-;4653:133;;;;:::o;4792:139::-;4838:5;4876:6;4863:20;4854:29;;4892:33;4919:5;4892:33;:::i;:::-;4792:139;;;;:::o;4937:137::-;4982:5;5020:6;5007:20;4998:29;;5036:32;5062:5;5036:32;:::i;:::-;4937:137;;;;:::o;5080:141::-;5136:5;5167:6;5161:13;5152:22;;5183:32;5209:5;5183:32;:::i;:::-;5080:141;;;;:::o;5240:338::-;5295:5;5344:3;5337:4;5329:6;5325:17;5321:27;5311:122;;5352:79;;:::i;:::-;5311:122;5469:6;5456:20;5494:78;5568:3;5560:6;5553:4;5545:6;5541:17;5494:78;:::i;:::-;5485:87;;5301:277;5240:338;;;;:::o;5598:340::-;5654:5;5703:3;5696:4;5688:6;5684:17;5680:27;5670:122;;5711:79;;:::i;:::-;5670:122;5828:6;5815:20;5853:79;5928:3;5920:6;5913:4;5905:6;5901:17;5853:79;:::i;:::-;5844:88;;5660:278;5598:340;;;;:::o;5944:139::-;5990:5;6028:6;6015:20;6006:29;;6044:33;6071:5;6044:33;:::i;:::-;5944:139;;;;:::o;6089:329::-;6148:6;6197:2;6185:9;6176:7;6172:23;6168:32;6165:119;;;6203:79;;:::i;:::-;6165:119;6323:1;6348:53;6393:7;6384:6;6373:9;6369:22;6348:53;:::i;:::-;6338:63;;6294:117;6089:329;;;;:::o;6424:474::-;6492:6;6500;6549:2;6537:9;6528:7;6524:23;6520:32;6517:119;;;6555:79;;:::i;:::-;6517:119;6675:1;6700:53;6745:7;6736:6;6725:9;6721:22;6700:53;:::i;:::-;6690:63;;6646:117;6802:2;6828:53;6873:7;6864:6;6853:9;6849:22;6828:53;:::i;:::-;6818:63;;6773:118;6424:474;;;;;:::o;6904:619::-;6981:6;6989;6997;7046:2;7034:9;7025:7;7021:23;7017:32;7014:119;;;7052:79;;:::i;:::-;7014:119;7172:1;7197:53;7242:7;7233:6;7222:9;7218:22;7197:53;:::i;:::-;7187:63;;7143:117;7299:2;7325:53;7370:7;7361:6;7350:9;7346:22;7325:53;:::i;:::-;7315:63;;7270:118;7427:2;7453:53;7498:7;7489:6;7478:9;7474:22;7453:53;:::i;:::-;7443:63;;7398:118;6904:619;;;;;:::o;7529:943::-;7624:6;7632;7640;7648;7697:3;7685:9;7676:7;7672:23;7668:33;7665:120;;;7704:79;;:::i;:::-;7665:120;7824:1;7849:53;7894:7;7885:6;7874:9;7870:22;7849:53;:::i;:::-;7839:63;;7795:117;7951:2;7977:53;8022:7;8013:6;8002:9;7998:22;7977:53;:::i;:::-;7967:63;;7922:118;8079:2;8105:53;8150:7;8141:6;8130:9;8126:22;8105:53;:::i;:::-;8095:63;;8050:118;8235:2;8224:9;8220:18;8207:32;8266:18;8258:6;8255:30;8252:117;;;8288:79;;:::i;:::-;8252:117;8393:62;8447:7;8438:6;8427:9;8423:22;8393:62;:::i;:::-;8383:72;;8178:287;7529:943;;;;;;;:::o;8478:468::-;8543:6;8551;8600:2;8588:9;8579:7;8575:23;8571:32;8568:119;;;8606:79;;:::i;:::-;8568:119;8726:1;8751:53;8796:7;8787:6;8776:9;8772:22;8751:53;:::i;:::-;8741:63;;8697:117;8853:2;8879:50;8921:7;8912:6;8901:9;8897:22;8879:50;:::i;:::-;8869:60;;8824:115;8478:468;;;;;:::o;8952:474::-;9020:6;9028;9077:2;9065:9;9056:7;9052:23;9048:32;9045:119;;;9083:79;;:::i;:::-;9045:119;9203:1;9228:53;9273:7;9264:6;9253:9;9249:22;9228:53;:::i;:::-;9218:63;;9174:117;9330:2;9356:53;9401:7;9392:6;9381:9;9377:22;9356:53;:::i;:::-;9346:63;;9301:118;8952:474;;;;;:::o;9432:799::-;9519:6;9527;9535;9584:2;9572:9;9563:7;9559:23;9555:32;9552:119;;;9590:79;;:::i;:::-;9552:119;9710:1;9735:53;9780:7;9771:6;9760:9;9756:22;9735:53;:::i;:::-;9725:63;;9681:117;9837:2;9863:53;9908:7;9899:6;9888:9;9884:22;9863:53;:::i;:::-;9853:63;;9808:118;9993:2;9982:9;9978:18;9965:32;10024:18;10016:6;10013:30;10010:117;;;10046:79;;:::i;:::-;10010:117;10151:63;10206:7;10197:6;10186:9;10182:22;10151:63;:::i;:::-;10141:73;;9936:288;9432:799;;;;;:::o;10237:894::-;10355:6;10363;10412:2;10400:9;10391:7;10387:23;10383:32;10380:119;;;10418:79;;:::i;:::-;10380:119;10566:1;10555:9;10551:17;10538:31;10596:18;10588:6;10585:30;10582:117;;;10618:79;;:::i;:::-;10582:117;10723:78;10793:7;10784:6;10773:9;10769:22;10723:78;:::i;:::-;10713:88;;10509:302;10878:2;10867:9;10863:18;10850:32;10909:18;10901:6;10898:30;10895:117;;;10931:79;;:::i;:::-;10895:117;11036:78;11106:7;11097:6;11086:9;11082:22;11036:78;:::i;:::-;11026:88;;10821:303;10237:894;;;;;:::o;11137:1269::-;11299:6;11307;11315;11364:2;11352:9;11343:7;11339:23;11335:32;11332:119;;;11370:79;;:::i;:::-;11332:119;11518:1;11507:9;11503:17;11490:31;11548:18;11540:6;11537:30;11534:117;;;11570:79;;:::i;:::-;11534:117;11675:78;11745:7;11736:6;11725:9;11721:22;11675:78;:::i;:::-;11665:88;;11461:302;11830:2;11819:9;11815:18;11802:32;11861:18;11853:6;11850:30;11847:117;;;11883:79;;:::i;:::-;11847:117;11988:78;12058:7;12049:6;12038:9;12034:22;11988:78;:::i;:::-;11978:88;;11773:303;12143:2;12132:9;12128:18;12115:32;12174:18;12166:6;12163:30;12160:117;;;12196:79;;:::i;:::-;12160:117;12301:88;12381:7;12372:6;12361:9;12357:22;12301:88;:::i;:::-;12291:98;;12086:313;11137:1269;;;;;:::o;12412:914::-;12540:6;12548;12597:2;12585:9;12576:7;12572:23;12568:32;12565:119;;;12603:79;;:::i;:::-;12565:119;12751:1;12740:9;12736:17;12723:31;12781:18;12773:6;12770:30;12767:117;;;12803:79;;:::i;:::-;12767:117;12908:78;12978:7;12969:6;12958:9;12954:22;12908:78;:::i;:::-;12898:88;;12694:302;13063:2;13052:9;13048:18;13035:32;13094:18;13086:6;13083:30;13080:117;;;13116:79;;:::i;:::-;13080:117;13221:88;13301:7;13292:6;13281:9;13277:22;13221:88;:::i;:::-;13211:98;;13006:313;12412:914;;;;;:::o;13332:329::-;13391:6;13440:2;13428:9;13419:7;13415:23;13411:32;13408:119;;;13446:79;;:::i;:::-;13408:119;13566:1;13591:53;13636:7;13627:6;13616:9;13612:22;13591:53;:::i;:::-;13581:63;;13537:117;13332:329;;;;:::o;13667:474::-;13735:6;13743;13792:2;13780:9;13771:7;13767:23;13763:32;13760:119;;;13798:79;;:::i;:::-;13760:119;13918:1;13943:53;13988:7;13979:6;13968:9;13964:22;13943:53;:::i;:::-;13933:63;;13889:117;14045:2;14071:53;14116:7;14107:6;14096:9;14092:22;14071:53;:::i;:::-;14061:63;;14016:118;13667:474;;;;;:::o;14147:::-;14215:6;14223;14272:2;14260:9;14251:7;14247:23;14243:32;14240:119;;;14278:79;;:::i;:::-;14240:119;14398:1;14423:53;14468:7;14459:6;14448:9;14444:22;14423:53;:::i;:::-;14413:63;;14369:117;14525:2;14551:53;14596:7;14587:6;14576:9;14572:22;14551:53;:::i;:::-;14541:63;;14496:118;14147:474;;;;;:::o;14627:327::-;14685:6;14734:2;14722:9;14713:7;14709:23;14705:32;14702:119;;;14740:79;;:::i;:::-;14702:119;14860:1;14885:52;14929:7;14920:6;14909:9;14905:22;14885:52;:::i;:::-;14875:62;;14831:116;14627:327;;;;:::o;14960:349::-;15029:6;15078:2;15066:9;15057:7;15053:23;15049:32;15046:119;;;15084:79;;:::i;:::-;15046:119;15204:1;15229:63;15284:7;15275:6;15264:9;15260:22;15229:63;:::i;:::-;15219:73;;15175:127;14960:349;;;;:::o;15315:329::-;15374:6;15423:2;15411:9;15402:7;15398:23;15394:32;15391:119;;;15429:79;;:::i;:::-;15391:119;15549:1;15574:53;15619:7;15610:6;15599:9;15595:22;15574:53;:::i;:::-;15564:63;;15520:117;15315:329;;;;:::o;15650:654::-;15728:6;15736;15785:2;15773:9;15764:7;15760:23;15756:32;15753:119;;;15791:79;;:::i;:::-;15753:119;15911:1;15936:53;15981:7;15972:6;15961:9;15957:22;15936:53;:::i;:::-;15926:63;;15882:117;16066:2;16055:9;16051:18;16038:32;16097:18;16089:6;16086:30;16083:117;;;16119:79;;:::i;:::-;16083:117;16224:63;16279:7;16270:6;16259:9;16255:22;16224:63;:::i;:::-;16214:73;;16009:288;15650:654;;;;;:::o;16310:118::-;16397:24;16415:5;16397:24;:::i;:::-;16392:3;16385:37;16310:118;;:::o;16434:109::-;16515:21;16530:5;16515:21;:::i;:::-;16510:3;16503:34;16434:109;;:::o;16549:118::-;16636:24;16654:5;16636:24;:::i;:::-;16631:3;16624:37;16549:118;;:::o;16673:360::-;16759:3;16787:38;16819:5;16787:38;:::i;:::-;16841:70;16904:6;16899:3;16841:70;:::i;:::-;16834:77;;16920:52;16965:6;16960:3;16953:4;16946:5;16942:16;16920:52;:::i;:::-;16997:29;17019:6;16997:29;:::i;:::-;16992:3;16988:39;16981:46;;16763:270;16673:360;;;;:::o;17039:364::-;17127:3;17155:39;17188:5;17155:39;:::i;:::-;17210:71;17274:6;17269:3;17210:71;:::i;:::-;17203:78;;17290:52;17335:6;17330:3;17323:4;17316:5;17312:16;17290:52;:::i;:::-;17367:29;17389:6;17367:29;:::i;:::-;17362:3;17358:39;17351:46;;17131:272;17039:364;;;;:::o;17409:377::-;17515:3;17543:39;17576:5;17543:39;:::i;:::-;17598:89;17680:6;17675:3;17598:89;:::i;:::-;17591:96;;17696:52;17741:6;17736:3;17729:4;17722:5;17718:16;17696:52;:::i;:::-;17773:6;17768:3;17764:16;17757:23;;17519:267;17409:377;;;;:::o;17792:366::-;17934:3;17955:67;18019:2;18014:3;17955:67;:::i;:::-;17948:74;;18031:93;18120:3;18031:93;:::i;:::-;18149:2;18144:3;18140:12;18133:19;;17792:366;;;:::o;18164:::-;18306:3;18327:67;18391:2;18386:3;18327:67;:::i;:::-;18320:74;;18403:93;18492:3;18403:93;:::i;:::-;18521:2;18516:3;18512:12;18505:19;;18164:366;;;:::o;18536:::-;18678:3;18699:67;18763:2;18758:3;18699:67;:::i;:::-;18692:74;;18775:93;18864:3;18775:93;:::i;:::-;18893:2;18888:3;18884:12;18877:19;;18536:366;;;:::o;18908:::-;19050:3;19071:67;19135:2;19130:3;19071:67;:::i;:::-;19064:74;;19147:93;19236:3;19147:93;:::i;:::-;19265:2;19260:3;19256:12;19249:19;;18908:366;;;:::o;19280:::-;19422:3;19443:67;19507:2;19502:3;19443:67;:::i;:::-;19436:74;;19519:93;19608:3;19519:93;:::i;:::-;19637:2;19632:3;19628:12;19621:19;;19280:366;;;:::o;19652:::-;19794:3;19815:67;19879:2;19874:3;19815:67;:::i;:::-;19808:74;;19891:93;19980:3;19891:93;:::i;:::-;20009:2;20004:3;20000:12;19993:19;;19652:366;;;:::o;20024:::-;20166:3;20187:67;20251:2;20246:3;20187:67;:::i;:::-;20180:74;;20263:93;20352:3;20263:93;:::i;:::-;20381:2;20376:3;20372:12;20365:19;;20024:366;;;:::o;20396:::-;20538:3;20559:67;20623:2;20618:3;20559:67;:::i;:::-;20552:74;;20635:93;20724:3;20635:93;:::i;:::-;20753:2;20748:3;20744:12;20737:19;;20396:366;;;:::o;20768:::-;20910:3;20931:67;20995:2;20990:3;20931:67;:::i;:::-;20924:74;;21007:93;21096:3;21007:93;:::i;:::-;21125:2;21120:3;21116:12;21109:19;;20768:366;;;:::o;21140:::-;21282:3;21303:67;21367:2;21362:3;21303:67;:::i;:::-;21296:74;;21379:93;21468:3;21379:93;:::i;:::-;21497:2;21492:3;21488:12;21481:19;;21140:366;;;:::o;21512:::-;21654:3;21675:67;21739:2;21734:3;21675:67;:::i;:::-;21668:74;;21751:93;21840:3;21751:93;:::i;:::-;21869:2;21864:3;21860:12;21853:19;;21512:366;;;:::o;21884:::-;22026:3;22047:67;22111:2;22106:3;22047:67;:::i;:::-;22040:74;;22123:93;22212:3;22123:93;:::i;:::-;22241:2;22236:3;22232:12;22225:19;;21884:366;;;:::o;22256:::-;22398:3;22419:67;22483:2;22478:3;22419:67;:::i;:::-;22412:74;;22495:93;22584:3;22495:93;:::i;:::-;22613:2;22608:3;22604:12;22597:19;;22256:366;;;:::o;22628:::-;22770:3;22791:67;22855:2;22850:3;22791:67;:::i;:::-;22784:74;;22867:93;22956:3;22867:93;:::i;:::-;22985:2;22980:3;22976:12;22969:19;;22628:366;;;:::o;23000:::-;23142:3;23163:67;23227:2;23222:3;23163:67;:::i;:::-;23156:74;;23239:93;23328:3;23239:93;:::i;:::-;23357:2;23352:3;23348:12;23341:19;;23000:366;;;:::o;23372:::-;23514:3;23535:67;23599:2;23594:3;23535:67;:::i;:::-;23528:74;;23611:93;23700:3;23611:93;:::i;:::-;23729:2;23724:3;23720:12;23713:19;;23372:366;;;:::o;23744:::-;23886:3;23907:67;23971:2;23966:3;23907:67;:::i;:::-;23900:74;;23983:93;24072:3;23983:93;:::i;:::-;24101:2;24096:3;24092:12;24085:19;;23744:366;;;:::o;24116:::-;24258:3;24279:67;24343:2;24338:3;24279:67;:::i;:::-;24272:74;;24355:93;24444:3;24355:93;:::i;:::-;24473:2;24468:3;24464:12;24457:19;;24116:366;;;:::o;24488:::-;24630:3;24651:67;24715:2;24710:3;24651:67;:::i;:::-;24644:74;;24727:93;24816:3;24727:93;:::i;:::-;24845:2;24840:3;24836:12;24829:19;;24488:366;;;:::o;24860:::-;25002:3;25023:67;25087:2;25082:3;25023:67;:::i;:::-;25016:74;;25099:93;25188:3;25099:93;:::i;:::-;25217:2;25212:3;25208:12;25201:19;;24860:366;;;:::o;25232:::-;25374:3;25395:67;25459:2;25454:3;25395:67;:::i;:::-;25388:74;;25471:93;25560:3;25471:93;:::i;:::-;25589:2;25584:3;25580:12;25573:19;;25232:366;;;:::o;25604:::-;25746:3;25767:67;25831:2;25826:3;25767:67;:::i;:::-;25760:74;;25843:93;25932:3;25843:93;:::i;:::-;25961:2;25956:3;25952:12;25945:19;;25604:366;;;:::o;25976:402::-;26136:3;26157:85;26239:2;26234:3;26157:85;:::i;:::-;26150:92;;26251:93;26340:3;26251:93;:::i;:::-;26369:2;26364:3;26360:12;26353:19;;25976:402;;;:::o;26384:366::-;26526:3;26547:67;26611:2;26606:3;26547:67;:::i;:::-;26540:74;;26623:93;26712:3;26623:93;:::i;:::-;26741:2;26736:3;26732:12;26725:19;;26384:366;;;:::o;26756:::-;26898:3;26919:67;26983:2;26978:3;26919:67;:::i;:::-;26912:74;;26995:93;27084:3;26995:93;:::i;:::-;27113:2;27108:3;27104:12;27097:19;;26756:366;;;:::o;27128:::-;27270:3;27291:67;27355:2;27350:3;27291:67;:::i;:::-;27284:74;;27367:93;27456:3;27367:93;:::i;:::-;27485:2;27480:3;27476:12;27469:19;;27128:366;;;:::o;27500:::-;27642:3;27663:67;27727:2;27722:3;27663:67;:::i;:::-;27656:74;;27739:93;27828:3;27739:93;:::i;:::-;27857:2;27852:3;27848:12;27841:19;;27500:366;;;:::o;27872:402::-;28032:3;28053:85;28135:2;28130:3;28053:85;:::i;:::-;28046:92;;28147:93;28236:3;28147:93;:::i;:::-;28265:2;28260:3;28256:12;28249:19;;27872:402;;;:::o;28280:366::-;28422:3;28443:67;28507:2;28502:3;28443:67;:::i;:::-;28436:74;;28519:93;28608:3;28519:93;:::i;:::-;28637:2;28632:3;28628:12;28621:19;;28280:366;;;:::o;28652:118::-;28739:24;28757:5;28739:24;:::i;:::-;28734:3;28727:37;28652:118;;:::o;28776:435::-;28956:3;28978:95;29069:3;29060:6;28978:95;:::i;:::-;28971:102;;29090:95;29181:3;29172:6;29090:95;:::i;:::-;29083:102;;29202:3;29195:10;;28776:435;;;;;:::o;29217:967::-;29599:3;29621:148;29765:3;29621:148;:::i;:::-;29614:155;;29786:95;29877:3;29868:6;29786:95;:::i;:::-;29779:102;;29898:148;30042:3;29898:148;:::i;:::-;29891:155;;30063:95;30154:3;30145:6;30063:95;:::i;:::-;30056:102;;30175:3;30168:10;;29217:967;;;;;:::o;30190:222::-;30283:4;30321:2;30310:9;30306:18;30298:26;;30334:71;30402:1;30391:9;30387:17;30378:6;30334:71;:::i;:::-;30190:222;;;;:::o;30418:640::-;30613:4;30651:3;30640:9;30636:19;30628:27;;30665:71;30733:1;30722:9;30718:17;30709:6;30665:71;:::i;:::-;30746:72;30814:2;30803:9;30799:18;30790:6;30746:72;:::i;:::-;30828;30896:2;30885:9;30881:18;30872:6;30828:72;:::i;:::-;30947:9;30941:4;30937:20;30932:2;30921:9;30917:18;30910:48;30975:76;31046:4;31037:6;30975:76;:::i;:::-;30967:84;;30418:640;;;;;;;:::o;31064:210::-;31151:4;31189:2;31178:9;31174:18;31166:26;;31202:65;31264:1;31253:9;31249:17;31240:6;31202:65;:::i;:::-;31064:210;;;;:::o;31280:222::-;31373:4;31411:2;31400:9;31396:18;31388:26;;31424:71;31492:1;31481:9;31477:17;31468:6;31424:71;:::i;:::-;31280:222;;;;:::o;31508:313::-;31621:4;31659:2;31648:9;31644:18;31636:26;;31708:9;31702:4;31698:20;31694:1;31683:9;31679:17;31672:47;31736:78;31809:4;31800:6;31736:78;:::i;:::-;31728:86;;31508:313;;;;:::o;31827:419::-;31993:4;32031:2;32020:9;32016:18;32008:26;;32080:9;32074:4;32070:20;32066:1;32055:9;32051:17;32044:47;32108:131;32234:4;32108:131;:::i;:::-;32100:139;;31827:419;;;:::o;32252:::-;32418:4;32456:2;32445:9;32441:18;32433:26;;32505:9;32499:4;32495:20;32491:1;32480:9;32476:17;32469:47;32533:131;32659:4;32533:131;:::i;:::-;32525:139;;32252:419;;;:::o;32677:::-;32843:4;32881:2;32870:9;32866:18;32858:26;;32930:9;32924:4;32920:20;32916:1;32905:9;32901:17;32894:47;32958:131;33084:4;32958:131;:::i;:::-;32950:139;;32677:419;;;:::o;33102:::-;33268:4;33306:2;33295:9;33291:18;33283:26;;33355:9;33349:4;33345:20;33341:1;33330:9;33326:17;33319:47;33383:131;33509:4;33383:131;:::i;:::-;33375:139;;33102:419;;;:::o;33527:::-;33693:4;33731:2;33720:9;33716:18;33708:26;;33780:9;33774:4;33770:20;33766:1;33755:9;33751:17;33744:47;33808:131;33934:4;33808:131;:::i;:::-;33800:139;;33527:419;;;:::o;33952:::-;34118:4;34156:2;34145:9;34141:18;34133:26;;34205:9;34199:4;34195:20;34191:1;34180:9;34176:17;34169:47;34233:131;34359:4;34233:131;:::i;:::-;34225:139;;33952:419;;;:::o;34377:::-;34543:4;34581:2;34570:9;34566:18;34558:26;;34630:9;34624:4;34620:20;34616:1;34605:9;34601:17;34594:47;34658:131;34784:4;34658:131;:::i;:::-;34650:139;;34377:419;;;:::o;34802:::-;34968:4;35006:2;34995:9;34991:18;34983:26;;35055:9;35049:4;35045:20;35041:1;35030:9;35026:17;35019:47;35083:131;35209:4;35083:131;:::i;:::-;35075:139;;34802:419;;;:::o;35227:::-;35393:4;35431:2;35420:9;35416:18;35408:26;;35480:9;35474:4;35470:20;35466:1;35455:9;35451:17;35444:47;35508:131;35634:4;35508:131;:::i;:::-;35500:139;;35227:419;;;:::o;35652:::-;35818:4;35856:2;35845:9;35841:18;35833:26;;35905:9;35899:4;35895:20;35891:1;35880:9;35876:17;35869:47;35933:131;36059:4;35933:131;:::i;:::-;35925:139;;35652:419;;;:::o;36077:::-;36243:4;36281:2;36270:9;36266:18;36258:26;;36330:9;36324:4;36320:20;36316:1;36305:9;36301:17;36294:47;36358:131;36484:4;36358:131;:::i;:::-;36350:139;;36077:419;;;:::o;36502:::-;36668:4;36706:2;36695:9;36691:18;36683:26;;36755:9;36749:4;36745:20;36741:1;36730:9;36726:17;36719:47;36783:131;36909:4;36783:131;:::i;:::-;36775:139;;36502:419;;;:::o;36927:::-;37093:4;37131:2;37120:9;37116:18;37108:26;;37180:9;37174:4;37170:20;37166:1;37155:9;37151:17;37144:47;37208:131;37334:4;37208:131;:::i;:::-;37200:139;;36927:419;;;:::o;37352:::-;37518:4;37556:2;37545:9;37541:18;37533:26;;37605:9;37599:4;37595:20;37591:1;37580:9;37576:17;37569:47;37633:131;37759:4;37633:131;:::i;:::-;37625:139;;37352:419;;;:::o;37777:::-;37943:4;37981:2;37970:9;37966:18;37958:26;;38030:9;38024:4;38020:20;38016:1;38005:9;38001:17;37994:47;38058:131;38184:4;38058:131;:::i;:::-;38050:139;;37777:419;;;:::o;38202:::-;38368:4;38406:2;38395:9;38391:18;38383:26;;38455:9;38449:4;38445:20;38441:1;38430:9;38426:17;38419:47;38483:131;38609:4;38483:131;:::i;:::-;38475:139;;38202:419;;;:::o;38627:::-;38793:4;38831:2;38820:9;38816:18;38808:26;;38880:9;38874:4;38870:20;38866:1;38855:9;38851:17;38844:47;38908:131;39034:4;38908:131;:::i;:::-;38900:139;;38627:419;;;:::o;39052:::-;39218:4;39256:2;39245:9;39241:18;39233:26;;39305:9;39299:4;39295:20;39291:1;39280:9;39276:17;39269:47;39333:131;39459:4;39333:131;:::i;:::-;39325:139;;39052:419;;;:::o;39477:::-;39643:4;39681:2;39670:9;39666:18;39658:26;;39730:9;39724:4;39720:20;39716:1;39705:9;39701:17;39694:47;39758:131;39884:4;39758:131;:::i;:::-;39750:139;;39477:419;;;:::o;39902:::-;40068:4;40106:2;40095:9;40091:18;40083:26;;40155:9;40149:4;40145:20;40141:1;40130:9;40126:17;40119:47;40183:131;40309:4;40183:131;:::i;:::-;40175:139;;39902:419;;;:::o;40327:::-;40493:4;40531:2;40520:9;40516:18;40508:26;;40580:9;40574:4;40570:20;40566:1;40555:9;40551:17;40544:47;40608:131;40734:4;40608:131;:::i;:::-;40600:139;;40327:419;;;:::o;40752:::-;40918:4;40956:2;40945:9;40941:18;40933:26;;41005:9;40999:4;40995:20;40991:1;40980:9;40976:17;40969:47;41033:131;41159:4;41033:131;:::i;:::-;41025:139;;40752:419;;;:::o;41177:::-;41343:4;41381:2;41370:9;41366:18;41358:26;;41430:9;41424:4;41420:20;41416:1;41405:9;41401:17;41394:47;41458:131;41584:4;41458:131;:::i;:::-;41450:139;;41177:419;;;:::o;41602:::-;41768:4;41806:2;41795:9;41791:18;41783:26;;41855:9;41849:4;41845:20;41841:1;41830:9;41826:17;41819:47;41883:131;42009:4;41883:131;:::i;:::-;41875:139;;41602:419;;;:::o;42027:::-;42193:4;42231:2;42220:9;42216:18;42208:26;;42280:9;42274:4;42270:20;42266:1;42255:9;42251:17;42244:47;42308:131;42434:4;42308:131;:::i;:::-;42300:139;;42027:419;;;:::o;42452:::-;42618:4;42656:2;42645:9;42641:18;42633:26;;42705:9;42699:4;42695:20;42691:1;42680:9;42676:17;42669:47;42733:131;42859:4;42733:131;:::i;:::-;42725:139;;42452:419;;;:::o;42877:::-;43043:4;43081:2;43070:9;43066:18;43058:26;;43130:9;43124:4;43120:20;43116:1;43105:9;43101:17;43094:47;43158:131;43284:4;43158:131;:::i;:::-;43150:139;;42877:419;;;:::o;43302:222::-;43395:4;43433:2;43422:9;43418:18;43410:26;;43446:71;43514:1;43503:9;43499:17;43490:6;43446:71;:::i;:::-;43302:222;;;;:::o;43530:129::-;43564:6;43591:20;;:::i;:::-;43581:30;;43620:33;43648:4;43640:6;43620:33;:::i;:::-;43530:129;;;:::o;43665:75::-;43698:6;43731:2;43725:9;43715:19;;43665:75;:::o;43746:311::-;43823:4;43913:18;43905:6;43902:30;43899:56;;;43935:18;;:::i;:::-;43899:56;43985:4;43977:6;43973:17;43965:25;;44045:4;44039;44035:15;44027:23;;43746:311;;;:::o;44063:321::-;44150:4;44240:18;44232:6;44229:30;44226:56;;;44262:18;;:::i;:::-;44226:56;44312:4;44304:6;44300:17;44292:25;;44372:4;44366;44362:15;44354:23;;44063:321;;;:::o;44390:311::-;44467:4;44557:18;44549:6;44546:30;44543:56;;;44579:18;;:::i;:::-;44543:56;44629:4;44621:6;44617:17;44609:25;;44689:4;44683;44679:15;44671:23;;44390:311;;;:::o;44707:307::-;44768:4;44858:18;44850:6;44847:30;44844:56;;;44880:18;;:::i;:::-;44844:56;44918:29;44940:6;44918:29;:::i;:::-;44910:37;;45002:4;44996;44992:15;44984:23;;44707:307;;;:::o;45020:308::-;45082:4;45172:18;45164:6;45161:30;45158:56;;;45194:18;;:::i;:::-;45158:56;45232:29;45254:6;45232:29;:::i;:::-;45224:37;;45316:4;45310;45306:15;45298:23;;45020:308;;;:::o;45334:98::-;45385:6;45419:5;45413:12;45403:22;;45334:98;;;:::o;45438:99::-;45490:6;45524:5;45518:12;45508:22;;45438:99;;;:::o;45543:168::-;45626:11;45660:6;45655:3;45648:19;45700:4;45695:3;45691:14;45676:29;;45543:168;;;;:::o;45717:169::-;45801:11;45835:6;45830:3;45823:19;45875:4;45870:3;45866:14;45851:29;;45717:169;;;;:::o;45892:148::-;45994:11;46031:3;46016:18;;45892:148;;;;:::o;46046:305::-;46086:3;46105:20;46123:1;46105:20;:::i;:::-;46100:25;;46139:20;46157:1;46139:20;:::i;:::-;46134:25;;46293:1;46225:66;46221:74;46218:1;46215:81;46212:107;;;46299:18;;:::i;:::-;46212:107;46343:1;46340;46336:9;46329:16;;46046:305;;;;:::o;46357:185::-;46397:1;46414:20;46432:1;46414:20;:::i;:::-;46409:25;;46448:20;46466:1;46448:20;:::i;:::-;46443:25;;46487:1;46477:35;;46492:18;;:::i;:::-;46477:35;46534:1;46531;46527:9;46522:14;;46357:185;;;;:::o;46548:348::-;46588:7;46611:20;46629:1;46611:20;:::i;:::-;46606:25;;46645:20;46663:1;46645:20;:::i;:::-;46640:25;;46833:1;46765:66;46761:74;46758:1;46755:81;46750:1;46743:9;46736:17;46732:105;46729:131;;;46840:18;;:::i;:::-;46729:131;46888:1;46885;46881:9;46870:20;;46548:348;;;;:::o;46902:191::-;46942:4;46962:20;46980:1;46962:20;:::i;:::-;46957:25;;46996:20;47014:1;46996:20;:::i;:::-;46991:25;;47035:1;47032;47029:8;47026:34;;;47040:18;;:::i;:::-;47026:34;47085:1;47082;47078:9;47070:17;;46902:191;;;;:::o;47099:96::-;47136:7;47165:24;47183:5;47165:24;:::i;:::-;47154:35;;47099:96;;;:::o;47201:90::-;47235:7;47278:5;47271:13;47264:21;47253:32;;47201:90;;;:::o;47297:77::-;47334:7;47363:5;47352:16;;47297:77;;;:::o;47380:149::-;47416:7;47456:66;47449:5;47445:78;47434:89;;47380:149;;;:::o;47535:126::-;47572:7;47612:42;47605:5;47601:54;47590:65;;47535:126;;;:::o;47667:77::-;47704:7;47733:5;47722:16;;47667:77;;;:::o;47750:154::-;47834:6;47829:3;47824;47811:30;47896:1;47887:6;47882:3;47878:16;47871:27;47750:154;;;:::o;47910:307::-;47978:1;47988:113;48002:6;47999:1;47996:13;47988:113;;;48087:1;48082:3;48078:11;48072:18;48068:1;48063:3;48059:11;48052:39;48024:2;48021:1;48017:10;48012:15;;47988:113;;;48119:6;48116:1;48113:13;48110:101;;;48199:1;48190:6;48185:3;48181:16;48174:27;48110:101;47959:258;47910:307;;;:::o;48223:171::-;48262:3;48285:24;48303:5;48285:24;:::i;:::-;48276:33;;48331:4;48324:5;48321:15;48318:41;;;48339:18;;:::i;:::-;48318:41;48386:1;48379:5;48375:13;48368:20;;48223:171;;;:::o;48400:320::-;48444:6;48481:1;48475:4;48471:12;48461:22;;48528:1;48522:4;48518:12;48549:18;48539:81;;48605:4;48597:6;48593:17;48583:27;;48539:81;48667:2;48659:6;48656:14;48636:18;48633:38;48630:84;;;48686:18;;:::i;:::-;48630:84;48451:269;48400:320;;;:::o;48726:281::-;48809:27;48831:4;48809:27;:::i;:::-;48801:6;48797:40;48939:6;48927:10;48924:22;48903:18;48891:10;48888:34;48885:62;48882:88;;;48950:18;;:::i;:::-;48882:88;48990:10;48986:2;48979:22;48769:238;48726:281;;:::o;49013:233::-;49052:3;49075:24;49093:5;49075:24;:::i;:::-;49066:33;;49121:66;49114:5;49111:77;49108:103;;;49191:18;;:::i;:::-;49108:103;49238:1;49231:5;49227:13;49220:20;;49013:233;;;:::o;49252:176::-;49284:1;49301:20;49319:1;49301:20;:::i;:::-;49296:25;;49335:20;49353:1;49335:20;:::i;:::-;49330:25;;49374:1;49364:35;;49379:18;;:::i;:::-;49364:35;49420:1;49417;49413:9;49408:14;;49252:176;;;;:::o;49434:180::-;49482:77;49479:1;49472:88;49579:4;49576:1;49569:15;49603:4;49600:1;49593:15;49620:180;49668:77;49665:1;49658:88;49765:4;49762:1;49755:15;49789:4;49786:1;49779:15;49806:180;49854:77;49851:1;49844:88;49951:4;49948:1;49941:15;49975:4;49972:1;49965:15;49992:180;50040:77;50037:1;50030:88;50137:4;50134:1;50127:15;50161:4;50158:1;50151:15;50178:180;50226:77;50223:1;50216:88;50323:4;50320:1;50313:15;50347:4;50344:1;50337:15;50364:180;50412:77;50409:1;50402:88;50509:4;50506:1;50499:15;50533:4;50530:1;50523:15;50550:117;50659:1;50656;50649:12;50673:117;50782:1;50779;50772:12;50796:117;50905:1;50902;50895:12;50919:117;51028:1;51025;51018:12;51042:117;51151:1;51148;51141:12;51165:102;51206:6;51257:2;51253:7;51248:2;51241:5;51237:14;51233:28;51223:38;;51165:102;;;:::o;51273:182::-;51413:34;51409:1;51401:6;51397:14;51390:58;51273:182;:::o;51461:170::-;51601:22;51597:1;51589:6;51585:14;51578:46;51461:170;:::o;51637:230::-;51777:34;51773:1;51765:6;51761:14;51754:58;51846:13;51841:2;51833:6;51829:15;51822:38;51637:230;:::o;51873:237::-;52013:34;52009:1;52001:6;51997:14;51990:58;52082:20;52077:2;52069:6;52065:15;52058:45;51873:237;:::o;52116:224::-;52256:34;52252:1;52244:6;52240:14;52233:58;52325:7;52320:2;52312:6;52308:15;52301:32;52116:224;:::o;52346:178::-;52486:30;52482:1;52474:6;52470:14;52463:54;52346:178;:::o;52530:223::-;52670:34;52666:1;52658:6;52654:14;52647:58;52739:6;52734:2;52726:6;52722:15;52715:31;52530:223;:::o;52759:175::-;52899:27;52895:1;52887:6;52883:14;52876:51;52759:175;:::o;52940:221::-;53080:34;53076:1;53068:6;53064:14;53057:58;53149:4;53144:2;53136:6;53132:15;53125:29;52940:221;:::o;53167:182::-;53307:34;53303:1;53295:6;53291:14;53284:58;53167:182;:::o;53355:180::-;53495:32;53491:1;53483:6;53479:14;53472:56;53355:180;:::o;53541:166::-;53681:18;53677:1;53669:6;53665:14;53658:42;53541:166;:::o;53713:228::-;53853:34;53849:1;53841:6;53837:14;53830:58;53922:11;53917:2;53909:6;53905:15;53898:36;53713:228;:::o;53947:233::-;54087:34;54083:1;54075:6;54071:14;54064:58;54156:16;54151:2;54143:6;54139:15;54132:41;53947:233;:::o;54186:249::-;54326:34;54322:1;54314:6;54310:14;54303:58;54395:32;54390:2;54382:6;54378:15;54371:57;54186:249;:::o;54441:182::-;54581:34;54577:1;54569:6;54565:14;54558:58;54441:182;:::o;54629:179::-;54769:31;54765:1;54757:6;54753:14;54746:55;54629:179;:::o;54814:174::-;54954:26;54950:1;54942:6;54938:14;54931:50;54814:174;:::o;54994:220::-;55134:34;55130:1;55122:6;55118:14;55111:58;55203:3;55198:2;55190:6;55186:15;55179:28;54994:220;:::o;55220:177::-;55360:29;55356:1;55348:6;55344:14;55337:53;55220:177;:::o;55403:231::-;55543:34;55539:1;55531:6;55527:14;55520:58;55612:14;55607:2;55599:6;55595:15;55588:39;55403:231;:::o;55640:220::-;55780:34;55776:1;55768:6;55764:14;55757:58;55849:3;55844:2;55836:6;55832:15;55825:28;55640:220;:::o;55866:173::-;56006:25;56002:1;55994:6;55990:14;55983:49;55866:173;:::o;56045:182::-;56185:34;56181:1;56173:6;56169:14;56162:58;56045:182;:::o;56233:229::-;56373:34;56369:1;56361:6;56357:14;56350:58;56442:12;56437:2;56429:6;56425:15;56418:37;56233:229;:::o;56468:182::-;56608:34;56604:1;56596:6;56592:14;56585:58;56468:182;:::o;56656:233::-;56796:34;56792:1;56784:6;56780:14;56773:58;56865:16;56860:2;56852:6;56848:15;56841:41;56656:233;:::o;56895:167::-;57035:19;57031:1;57023:6;57019:14;57012:43;56895:167;:::o;57068:234::-;57208:34;57204:1;57196:6;57192:14;57185:58;57277:17;57272:2;57264:6;57260:15;57253:42;57068:234;:::o;57308:122::-;57381:24;57399:5;57381:24;:::i;:::-;57374:5;57371:35;57361:63;;57420:1;57417;57410:12;57361:63;57308:122;:::o;57436:116::-;57506:21;57521:5;57506:21;:::i;:::-;57499:5;57496:32;57486:60;;57542:1;57539;57532:12;57486:60;57436:116;:::o;57558:122::-;57631:24;57649:5;57631:24;:::i;:::-;57624:5;57621:35;57611:63;;57670:1;57667;57660:12;57611:63;57558:122;:::o;57686:120::-;57758:23;57775:5;57758:23;:::i;:::-;57751:5;57748:34;57738:62;;57796:1;57793;57786:12;57738:62;57686:120;:::o;57812:122::-;57885:24;57903:5;57885:24;:::i;:::-;57878:5;57875:35;57865:63;;57924:1;57921;57914:12;57865:63;57812:122;:::o
Swarm Source
ipfs://ccd40deadc262298fecd5fa0c9e14e5b4c1a1641ec11359359fe2169f1b129da
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.