Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
10,000 NANA
Holders
1,473
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
4 NANALoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
FUNANA
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-01-30 */ // ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡠⢴⠒⡖⢫⡙⣍⠫⢝⡒⡲⢤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ // ⠀⠀⠀⠀⠀⠀⠀⢀⣀⢤⠤⡤⢤⣀⠀⠀⠀⣠⠞⡍⡜⢢⡙⢌⠥⡒⢬⡘⢆⡱⢡⢣⠙⡶⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ // ⠀⠀⠀⠀⣀⡴⡚⢭⡘⢆⢓⡘⠆⣎⠳⣄⡞⠥⢋⠴⣨⣧⢾⣮⢶⣍⣦⡘⢢⡑⢎⣴⣩⣴⡽⢦⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ // ⠀⠀⠀⣾⣵⣢⡙⢤⠚⡌⠦⣉⠞⡠⢍⢻⣌⠣⣍⡾⠋⠴⠁⠀⠀⠀⠉⠉⠉⠉⠉⠉⠁⠀⠈⠛⠓⠿⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ // ⠀⠀⠀⠈⢧⠈⠙⣧⠾⣞⡓⠓⠺⣥⣊⠜⣧⢃⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⣙⠲⠦⣄⠀⠀⠀⠀⠀⠀ // ⠀⠀⠀⠀⡼⠀⠀⢻⠐⢤⡀⠰⠖⠂⠹⡜⣧⢻⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⠷⣮⠒⢭⡘⢧⠀⠀⠀⠀⠀ // ⠀⠀⠀⠈⣗⠦⣄⣿⠸⡄⢽⠀⡐⢧⠀⡟⣼⡙⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⡏⢰⢸⡝⣾⣃⠞⡇⠀⠀⠀⠀ // ⠀⠀⠀⢀⡇⠀⣸⣄⠳⣅⣈⣧⡀⠀⣾⡙⠼⣇⢿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠁⣠⡌⣿⢫⣧⠚⡇⠀⠀⠀⠀ // ⠀⠀⣤⠊⢀⡴⠛⢈⡟⢀⡏⢻⠈⠁⢹⡜⢢⣏⠾⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⡤⠒⣉⣱⢦⠤⢤⣼⣄⣴⢃⠆⢠⢿⢩⡇⠀⠀⠀⠀ // ⡠⠔⣁⡽⣏⠠⣆⠀⣇⠸⡄⡎⢀⡼⣰⡋⢆⠫⡜⢿⡀⠀⠀⠀⠀⠀⢀⡴⠋⡥⣶⣾⠟⠂⠛⢿⣶⣤⡈⠻⡏⣦⢈⣾⢡⡇⠀⠀⠀⠀ // ⢻⡚⢭⡘⢻⡠⡄⠘⠞⢦⡵⠁⠠⣴⢣⡙⠬⡑⡜⢌⠷⣄⣀⣀⣀⣤⣾⡀⢺⣸⠟⡏⠀⠀⠀⠀⠻⠷⠃⢰⣇⠀⣸⡟⣼⠇⠀⠀⠀⠀ // ⠘⣏⠆⡜⡩⢷⡙⠀⢤⠃⡇⠸⠄⣿⠰⢌⢣⠱⡘⣌⠚⡤⢋⣭⠟⠚⠉⠉⠓⢦⠀⠹⡄⠀⠀⠀⠉⠳⡤⠟⠚⠮⢼⣇⡿⠀⠀⠀⠀⠀ // ⠀⠹⣎⠴⢡⢋⢷⣄⢬⡀⠄⠂⢀⡟⡱⢊⢆⢣⡑⢢⠍⣶⠋⠀⠀⠀⠀⠀⠀⠈⢧⠀⡗⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠒⢤⡀⠀⠀ // ⠀⠀⠘⢷⣅⢎⠢⣍⠳⣭⢤⡼⢫⠱⣡⢃⠎⢆⡜⣡⢺⡇⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⠙⢦⠀ // ⠀⠀⠀⠀⠈⠓⠧⣬⡑⢆⠲⢌⢣⡑⠆⡎⢜⢢⠒⣤⢿⡇⠀⠀⠀⠀⠀⣠⣴⣖⠂⠀⠀⠀⠀⠀⠀⠀⠐⠉⢩⢶⣤⠀⢰⠋⠸⣇⢈⡇ // ⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⠺⢬⡒⢬⠱⡘⡌⢆⡿⠁⠈⣧⠀⠀⠀⢀⡞⠁⠈⢻⣧⠀⠀⠀⠀⠀⠀⠀⠀⢠⠏⠈⣿⠀⢺⠀⠀⠙⠛⣧ // ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⣦⠣⡱⢌⡿⠀⠀⠀⣿⠀⠀⠀⣾⠀⠀⠀⠀⣿⡆⠀⠀⠀⠀⢸⡄⠀⢸⠀⠀⢸⠀⠈⢧⠀⠀⠀⣿ // ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⠰⣑⢺⡇⠀⠀⠀⣿⠀⠀⠀⡇⠀⠀⠀⠀⣿⠀⠀⠀⠀⡄⢸⠇⠀⢸⠀⠀⠘⢆⣀⡼⠀⠀⢀⡟ // ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⡧⣸⠼⢷⡀⠀⠀⣿⠀⠀⠀⡇⠀⠀⠀⠀⡏⠀⠀⠀⠀⣏⡼⠀⢀⡞⠀⠀⠀⠀⠁⠀⠀⠀⣼⠁ // ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠁⠀⠈⠳⣄⠀⣿⠀⠀⠀⣷⠀⠀⠀⢸⡅⠀⠀⠀⠀⠉⢁⡴⠋⠀⠀⠀⠀⠀⠀⠀⢀⡾⠁⠀ // ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢷⣿⡀⠀⠀⣿⠀⠀⠀⢸⡄⠀⠀⠀⠀⣰⠋⠀⠀⠀⠀⠀⠀⠀⣀⡶⠋⠀⠀⠀ // ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⡇⠀⠀⢿⡀⠀⠀⠀⢣⡄⡆⠀⢀⡇⠀⠀⠀⢀⣀⣤⡶⠟⠉⠀⠀⠀⠀⠀ // ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⡄⠀⢸⠛⠓⠦⠦⠤⣼⡇⠀⢸⡷⠶⠿⠟⠛⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀ // ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠦⠞⠀⠀⠀⠀⠀⠀⡇⠀⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ // ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠳⣀⡸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ // File: lib/Constants.sol pragma solidity ^0.8.17; address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E; address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6; // File: IOperatorFilterRegistry.sol pragma solidity ^0.8.13; interface IOperatorFilterRegistry { /** * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns * true if supplied registrant address is not registered. */ function isOperatorAllowed(address registrant, address operator) external view returns (bool); /** * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner. */ function register(address registrant) external; /** * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes. */ function registerAndSubscribe(address registrant, address subscription) external; /** * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another * address without subscribing. */ function registerAndCopyEntries(address registrant, address registrantToCopy) external; /** * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner. * Note that this does not remove any filtered addresses or codeHashes. * Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes. */ function unregister(address addr) external; /** * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered. */ function updateOperator(address registrant, address operator, bool filtered) external; /** * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates. */ function updateOperators(address registrant, address[] calldata operators, bool filtered) external; /** * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered. */ function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; /** * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates. */ function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; /** * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous * subscription if present. * Note that accounts with subscriptions may go on to subscribe to other accounts - in this case, * subscriptions will not be forwarded. Instead the former subscription's existing entries will still be * used. */ function subscribe(address registrant, address registrantToSubscribe) external; /** * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes. */ function unsubscribe(address registrant, bool copyExistingEntries) external; /** * @notice Get the subscription address of a given registrant, if any. */ function subscriptionOf(address addr) external returns (address registrant); /** * @notice Get the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscribers(address registrant) external returns (address[] memory); /** * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscriberAt(address registrant, uint256 index) external returns (address); /** * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr. */ function copyEntriesOf(address registrant, address registrantToCopy) external; /** * @notice Returns true if operator is filtered by a given address or its subscription. */ function isOperatorFiltered(address registrant, address operator) external returns (bool); /** * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription. */ function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); /** * @notice Returns true if a codeHash is filtered by a given address or its subscription. */ function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); /** * @notice Returns a list of filtered operators for a given address or its subscription. */ function filteredOperators(address addr) external returns (address[] memory); /** * @notice Returns the set of filtered codeHashes for a given address or its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashes(address addr) external returns (bytes32[] memory); /** * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredOperatorAt(address registrant, uint256 index) external returns (address); /** * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); /** * @notice Returns true if an address has registered */ function isRegistered(address addr) external returns (bool); /** * @dev Convenience method to compute the code hash of an arbitrary contract */ function codeHashOf(address addr) external returns (bytes32); } // File: OperatorFilterer.sol pragma solidity ^0.8.13; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. * Please note that if your token contract does not provide an owner with EIP-173, it must provide * administration methods on the contract itself to interact with the registry otherwise the subscription * will be locked to the options set during construction. */ abstract contract OperatorFilterer { /// @dev Emitted when an operator is not allowed. error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS); /// @dev The constructor that is called when the contract is being deployed. constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } /** * @dev A helper function to check if an operator is allowed. */ modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } /** * @dev A helper function to check if an operator approval is allowed. */ modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } /** * @dev A helper function to check if an operator is allowed. */ function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { // under normal circumstances, this function will revert rather than return false, but inheriting contracts // may specify their own OperatorFilterRegistry implementations, which may behave differently if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } } // File: DefaultOperatorFilterer.sol pragma solidity ^0.8.13; /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. * @dev Please note that if your token contract does not provide an owner with EIP-173, it must provide * administration methods on the contract itself to interact with the registry otherwise the subscription * will be locked to the options set during construction. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { /// @dev The constructor that is called when the contract is being deployed. constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {} } // File: banana.sol // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @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); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.6.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 be 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: contracts/finalcontract.sol pragma solidity ^0.8.0; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintedQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerIndexOutOfBounds(); error OwnerQueryForNonexistentToken(); error TokenIndexOutOfBounds(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error UnableDetermineTokenOwner(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Does not support burning tokens to address(0). * * Assumes that an owner cannot have more than the 2**128 - 1 (max value of uint128) of supply */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 internal _currentIndex; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { if (index >= totalSupply()) revert TokenIndexOutOfBounds(); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds(); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx; address currOwnershipAddr; // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar. unchecked { for (uint256 i; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } } // Execution should never reach this point. assert(false); return tokenIdsIdx; } /** * @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 || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { if (owner == address(0)) revert MintedQueryForZeroAddress(); return uint256(_addressData[owner].numberMinted); } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { if (!_exists(tokenId)) revert OwnerQueryForNonexistentToken(); unchecked { for (uint256 curr = tokenId; curr >= 0; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } revert UnableDetermineTokenOwner(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @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) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); 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 overriden 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 = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) revert ApprovalCallerNotOwnerNorApproved(); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_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 { _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 { _transfer(from, to, tokenId); if (!_checkOnERC721Received(from, to, tokenId, _data)) revert TransferToNonERC721ReceiverImplementer(); } /** * @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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < _currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.56e77 (2**256) - 1 unchecked { _addressData[to].balance += uint128(quantity); _addressData[to].numberMinted += uint128(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; for (uint256 i; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) { revert TransferToNonERC721ReceiverImplementer(); } updatedIndex++; } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @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(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) revert TransferToNonERC721ReceiverImplementer(); else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } contract FUNANA is DefaultOperatorFilterer, ERC721A, Ownable{ using Strings for uint256; uint256 public constant MAX_SUPPLY = 10000; uint256 public constant MAX_PUBLIC_MINT = 10; uint256 public PUBLIC_SALE_PRICE = 0.0033 ether; uint256 public WL_SALE_PRICE = 0.0033 ether; string private baseTokenUri; string public placeholderTokenUri; bool public isRevealed; bool public publicSale = false; bool public whiteListSale = false; bool public pause; bytes32 public merkleRoot; mapping(address => uint256) public totalPublicMint; mapping(address=>uint256) public WL_MINTS; constructor() ERC721A("FUNANAS", "NANA"){ } function mint(address to, uint256 _quantity) external payable{ require(publicSale, "NOT_OPEN"); require((totalSupply() + _quantity) <= MAX_SUPPLY, "MAX_SUPPLY"); require((totalPublicMint[to] +_quantity) <= MAX_PUBLIC_MINT, "MAX_MINT"); require(msg.value >= (PUBLIC_SALE_PRICE * _quantity), "INVALID_PRICE"); totalPublicMint[to] += _quantity; _safeMint(to, _quantity); } function whitelistMint(uint256 _quantity, uint256 maxQuantity, bytes32[] calldata _merkleProof) external payable{ require(whiteListSale, "NOT_OPEN"); bytes32 leaf = keccak256(abi.encodePacked(msg.sender, maxQuantity)); require( MerkleProof.verify(_merkleProof, merkleRoot, leaf), "Invalid Merkle Proof." ); require(WL_MINTS[msg.sender] + _quantity <= maxQuantity, "MAX WL MINTS"); require((totalSupply() + _quantity) <= MAX_SUPPLY, "MAX_SUPPLY"); require(msg.value >= (WL_SALE_PRICE * _quantity), "INVALID_PRICE"); WL_MINTS[msg.sender] += _quantity; _safeMint(msg.sender, _quantity); } function setApprovalForAll(address operator, bool approved) public virtual override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public virtual override onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } function _baseURI() internal view virtual override returns (string memory) { return baseTokenUri; } //return uri for certain token function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } function setTokenUri(string memory _baseTokenUri) external onlyOwner{ baseTokenUri = _baseTokenUri; } function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner{ merkleRoot = _merkleRoot; } function togglePause() external onlyOwner{ pause = !pause; } function toggleWhiteListSale() external onlyOwner{ whiteListSale = true; publicSale = false; } function togglePublicSale() external onlyOwner{ whiteListSale = false; publicSale = true; } function update_public_price(uint price) external onlyOwner { PUBLIC_SALE_PRICE = price; } function AirDrop(address[] memory _wallets, uint _count) public onlyOwner{ require(_wallets.length > 0, "INVALID_WALLET"); require(totalSupply() + _wallets.length <= MAX_SUPPLY, "MAX_SUPPLY"); for (uint i = 0; i < _wallets.length; i++) { _safeMint(_wallets[i], _count); } } function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } function withdraw() external payable onlyOwner { uint _balance = address(this).balance; payable(owner()).transfer(_balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"UnableDetermineTokenOwner","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"_wallets","type":"address[]"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"AirDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"MAX_PUBLIC_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"WL_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WL_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"placeholderTokenUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenUri","type":"string"}],"name":"setTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhiteListSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalPublicMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"update_public_price","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whiteListSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"uint256","name":"maxQuantity","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
6080604052660bb9551fc24000600855660bb9551fc240006009556000600c60016101000a81548160ff0219169083151502179055506000600c60026101000a81548160ff0219169083151502179055503480156200005d57600080fd5b506040518060400160405280600781526020017f46554e414e4153000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4e414e4100000000000000000000000000000000000000000000000000000000815250733cc6cdda760b79bafa08df41ecfa224f810dceb6600160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620002d65780156200019c576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200016292919062000437565b600060405180830381600087803b1580156200017d57600080fd5b505af115801562000192573d6000803e3d6000fd5b50505050620002d5565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000256576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200021c92919062000437565b600060405180830381600087803b1580156200023757600080fd5b505af11580156200024c573d6000803e3d6000fd5b50505050620002d4565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200029f919062000464565b600060405180830381600087803b158015620002ba57600080fd5b505af1158015620002cf573d6000803e3d6000fd5b505050505b5b5b50508160019081620002e99190620006fb565b508060029081620002fb9190620006fb565b5050506200031e620003126200032460201b60201c565b6200032c60201b60201c565b620007e2565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200041f82620003f2565b9050919050565b620004318162000412565b82525050565b60006040820190506200044e600083018562000426565b6200045d602083018462000426565b9392505050565b60006020820190506200047b600083018462000426565b92915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200050357607f821691505b602082108103620005195762000518620004bb565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000544565b6200058f868362000544565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005dc620005d6620005d084620005a7565b620005b1565b620005a7565b9050919050565b6000819050919050565b620005f883620005bb565b620006106200060782620005e3565b84845462000551565b825550505050565b600090565b6200062762000618565b62000634818484620005ed565b505050565b5b818110156200065c57620006506000826200061d565b6001810190506200063a565b5050565b601f821115620006ab5762000675816200051f565b620006808462000534565b8101602085101562000690578190505b620006a86200069f8562000534565b83018262000639565b50505b505050565b600082821c905092915050565b6000620006d060001984600802620006b0565b1980831691505092915050565b6000620006eb8383620006bd565b9150826002028217905092915050565b620007068262000481565b67ffffffffffffffff8111156200072257620007216200048c565b5b6200072e8254620004ea565b6200073b82828562000660565b600060209050601f8311600181146200077357600084156200075e578287015190505b6200076a8582620006dd565b865550620007da565b601f19841662000783866200051f565b60005b82811015620007ad5784890151825560018201915060208501945060208101905062000786565b86831015620007cd5784890151620007c9601f891682620006bd565b8355505b6001600288020188555050505b505050505050565b6146d380620007f26000396000f3fe6080604052600436106102515760003560e01c80636352211e11610139578063a22cb465116100b6578063c87b56dd1161007a578063c87b56dd14610869578063e222c7f9146108a6578063e2a70eaf146108bd578063e985e9c5146108e6578063eeb9052f14610923578063f2fde38b1461094c57610251565b8063a22cb465146107a7578063b88d4fde146107d0578063bf9c41cd146107f9578063c4ae316814610836578063c4be5b591461084d57610251565b80638456cb59116100fd5780638456cb59146106e457806386a173ee1461070f5780638bb64a8c1461073a5780638da5cb5b1461075157806395d89b411461077c57610251565b80636352211e146105ff57806365f130971461063c57806370a0823114610667578063715018a6146106a45780637cb64759146106bb57610251565b80632eb4a7ab116101d257806340c10f191161019657806340c10f19146104fc57806341f434341461051857806342842e0e146105435780634cf5f7a41461056c5780634f6ccce71461059757806354214f69146105d457610251565b80632eb4a7ab146104345780632f745c591461045f57806332cb6b0c1461049c57806333bc1c5c146104c75780633ccfd60b146104f257610251565b8063081812fc11610219578063081812fc1461033d578063095ea7b31461037a57806318160ddd146103a35780631c16521c146103ce57806323b872dd1461040b57610251565b806301ffc9a7146102565780630675b7c61461029357806306fdde03146102bc57806307ca9734146102e757806307e89ec014610312575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613317565b610975565b60405161028a919061335f565b60405180910390f35b34801561029f57600080fd5b506102ba60048036038101906102b591906134c0565b610abf565b005b3480156102c857600080fd5b506102d1610b4e565b6040516102de9190613588565b60405180910390f35b3480156102f357600080fd5b506102fc610be0565b60405161030991906135c3565b60405180910390f35b34801561031e57600080fd5b50610327610be6565b60405161033491906135c3565b60405180910390f35b34801561034957600080fd5b50610364600480360381019061035f919061360a565b610bec565b6040516103719190613678565b60405180910390f35b34801561038657600080fd5b506103a1600480360381019061039c91906136bf565b610c68565b005b3480156103af57600080fd5b506103b8610c81565b6040516103c591906135c3565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f091906136ff565b610c8a565b60405161040291906135c3565b60405180910390f35b34801561041757600080fd5b50610432600480360381019061042d919061372c565b610ca2565b005b34801561044057600080fd5b50610449610cf1565b6040516104569190613798565b60405180910390f35b34801561046b57600080fd5b50610486600480360381019061048191906136bf565b610cf7565b60405161049391906135c3565b60405180910390f35b3480156104a857600080fd5b506104b1610eb9565b6040516104be91906135c3565b60405180910390f35b3480156104d357600080fd5b506104dc610ebf565b6040516104e9919061335f565b60405180910390f35b6104fa610ed2565b005b610516600480360381019061051191906136bf565b610fa4565b005b34801561052457600080fd5b5061052d61118c565b60405161053a9190613812565b60405180910390f35b34801561054f57600080fd5b5061056a6004803603810190610565919061372c565b61119e565b005b34801561057857600080fd5b506105816111ed565b60405161058e9190613588565b60405180910390f35b3480156105a357600080fd5b506105be60048036038101906105b9919061360a565b61127b565b6040516105cb91906135c3565b60405180910390f35b3480156105e057600080fd5b506105e96112c5565b6040516105f6919061335f565b60405180910390f35b34801561060b57600080fd5b506106266004803603810190610621919061360a565b6112d8565b6040516106339190613678565b60405180910390f35b34801561064857600080fd5b506106516112ee565b60405161065e91906135c3565b60405180910390f35b34801561067357600080fd5b5061068e600480360381019061068991906136ff565b6112f3565b60405161069b91906135c3565b60405180910390f35b3480156106b057600080fd5b506106b96113d2565b005b3480156106c757600080fd5b506106e260048036038101906106dd9190613859565b61145a565b005b3480156106f057600080fd5b506106f96114e0565b604051610706919061335f565b60405180910390f35b34801561071b57600080fd5b506107246114f3565b604051610731919061335f565b60405180910390f35b34801561074657600080fd5b5061074f611506565b005b34801561075d57600080fd5b506107666115ba565b6040516107739190613678565b60405180910390f35b34801561078857600080fd5b506107916115e4565b60405161079e9190613588565b60405180910390f35b3480156107b357600080fd5b506107ce60048036038101906107c991906138b2565b611676565b005b3480156107dc57600080fd5b506107f760048036038101906107f29190613993565b61168f565b005b34801561080557600080fd5b50610820600480360381019061081b91906136ff565b6116e0565b60405161082d91906135c3565b60405180910390f35b34801561084257600080fd5b5061084b6116f8565b005b61086760048036038101906108629190613a76565b6117a0565b005b34801561087557600080fd5b50610890600480360381019061088b919061360a565b611a44565b60405161089d9190613588565b60405180910390f35b3480156108b257600080fd5b506108bb611ae2565b005b3480156108c957600080fd5b506108e460048036038101906108df919061360a565b611b96565b005b3480156108f257600080fd5b5061090d60048036038101906109089190613aea565b611c1c565b60405161091a919061335f565b60405180910390f35b34801561092f57600080fd5b5061094a60048036038101906109459190613bed565b611cb0565b005b34801561095857600080fd5b50610973600480360381019061096e91906136ff565b611e10565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a4057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aa857507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ab85750610ab782611f07565b5b9050919050565b610ac7611f71565b73ffffffffffffffffffffffffffffffffffffffff16610ae56115ba565b73ffffffffffffffffffffffffffffffffffffffff1614610b3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3290613c95565b60405180910390fd5b80600a9081610b4a9190613eb7565b5050565b606060018054610b5d90613ce4565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8990613ce4565b8015610bd65780601f10610bab57610100808354040283529160200191610bd6565b820191906000526020600020905b815481529060010190602001808311610bb957829003601f168201915b5050505050905090565b60095481565b60085481565b6000610bf782611f79565b610c2d576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610c7281611f86565b610c7c8383612083565b505050565b60008054905090565b600e6020528060005260406000206000915090505481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ce057610cdf33611f86565b5b610ceb84848461218d565b50505050565b600d5481565b6000610d02836112f3565b8210610d3a576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610d44610c81565b905060008060005b83811015610e9c576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610e3e57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e8e57868403610e85578195505050505050610eb3565b83806001019450505b508080600101915050610d4c565b506000610eac57610eab613f89565b5b8193505050505b92915050565b61271081565b600c60019054906101000a900460ff1681565b610eda611f71565b73ffffffffffffffffffffffffffffffffffffffff16610ef86115ba565b73ffffffffffffffffffffffffffffffffffffffff1614610f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4590613c95565b60405180910390fd5b6000479050610f5b6115ba565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610fa0573d6000803e3d6000fd5b5050565b600c60019054906101000a900460ff16610ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fea90614004565b60405180910390fd5b61271081610fff610c81565b6110099190614053565b111561104a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611041906140d3565b60405180910390fd5b600a81600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110979190614053565b11156110d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cf9061413f565b60405180910390fd5b806008546110e6919061415f565b341015611128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111f906141ed565b60405180910390fd5b80600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111779190614053565b92505081905550611188828261219d565b5050565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146111dc576111db33611f86565b5b6111e78484846121bb565b50505050565b600b80546111fa90613ce4565b80601f016020809104026020016040519081016040528092919081815260200182805461122690613ce4565b80156112735780601f1061124857610100808354040283529160200191611273565b820191906000526020600020905b81548152906001019060200180831161125657829003601f168201915b505050505081565b6000611285610c81565b82106112bd576040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b819050919050565b600c60009054906101000a900460ff1681565b60006112e3826121db565b600001519050919050565b600a81565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361135a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6113da611f71565b73ffffffffffffffffffffffffffffffffffffffff166113f86115ba565b73ffffffffffffffffffffffffffffffffffffffff161461144e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144590613c95565b60405180910390fd5b6114586000612363565b565b611462611f71565b73ffffffffffffffffffffffffffffffffffffffff166114806115ba565b73ffffffffffffffffffffffffffffffffffffffff16146114d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cd90613c95565b60405180910390fd5b80600d8190555050565b600c60039054906101000a900460ff1681565b600c60029054906101000a900460ff1681565b61150e611f71565b73ffffffffffffffffffffffffffffffffffffffff1661152c6115ba565b73ffffffffffffffffffffffffffffffffffffffff1614611582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157990613c95565b60405180910390fd5b6001600c60026101000a81548160ff0219169083151502179055506000600c60016101000a81548160ff021916908315150217905550565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546115f390613ce4565b80601f016020809104026020016040519081016040528092919081815260200182805461161f90613ce4565b801561166c5780601f106116415761010080835404028352916020019161166c565b820191906000526020600020905b81548152906001019060200180831161164f57829003601f168201915b5050505050905090565b8161168081611f86565b61168a8383612429565b505050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116cd576116cc33611f86565b5b6116d9858585856125a0565b5050505050565b600f6020528060005260406000206000915090505481565b611700611f71565b73ffffffffffffffffffffffffffffffffffffffff1661171e6115ba565b73ffffffffffffffffffffffffffffffffffffffff1614611774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176b90613c95565b60405180910390fd5b600c60039054906101000a900460ff1615600c60036101000a81548160ff021916908315150217905550565b600c60029054906101000a900460ff166117ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e690614004565b60405180910390fd5b60003384604051602001611804929190614276565b60405160208183030381529060405280519060200120905061186a838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d54836125f3565b6118a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a0906142ee565b60405180910390fd5b8385600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118f59190614053565b1115611936576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192d9061435a565b60405180910390fd5b61271085611942610c81565b61194c9190614053565b111561198d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611984906140d3565b60405180910390fd5b8460095461199b919061415f565b3410156119dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d4906141ed565b60405180910390fd5b84600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a2c9190614053565b92505081905550611a3d338661219d565b5050505050565b6060611a4f82611f79565b611a85576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611a8f61260a565b90506000815103611aaf5760405180602001604052806000815250611ada565b80611ab98461269c565b604051602001611aca9291906143b6565b6040516020818303038152906040525b915050919050565b611aea611f71565b73ffffffffffffffffffffffffffffffffffffffff16611b086115ba565b73ffffffffffffffffffffffffffffffffffffffff1614611b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5590613c95565b60405180910390fd5b6000600c60026101000a81548160ff0219169083151502179055506001600c60016101000a81548160ff021916908315150217905550565b611b9e611f71565b73ffffffffffffffffffffffffffffffffffffffff16611bbc6115ba565b73ffffffffffffffffffffffffffffffffffffffff1614611c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0990613c95565b60405180910390fd5b8060088190555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611cb8611f71565b73ffffffffffffffffffffffffffffffffffffffff16611cd66115ba565b73ffffffffffffffffffffffffffffffffffffffff1614611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2390613c95565b60405180910390fd5b6000825111611d70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6790614426565b60405180910390fd5b6127108251611d7d610c81565b611d879190614053565b1115611dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbf906140d3565b60405180910390fd5b60005b8251811015611e0b57611df8838281518110611dea57611de9614446565b5b60200260200101518361219d565b8080611e0390614475565b915050611dcb565b505050565b611e18611f71565b73ffffffffffffffffffffffffffffffffffffffff16611e366115ba565b73ffffffffffffffffffffffffffffffffffffffff1614611e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8390613c95565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef29061452f565b60405180910390fd5b611f0481612363565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000805482109050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612080576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611ffd92919061454f565b602060405180830381865afa15801561201a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203e919061458d565b61207f57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016120769190613678565b60405180910390fd5b5b50565b600061208e826112d8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036120f5576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16612114611f71565b73ffffffffffffffffffffffffffffffffffffffff161415801561214657506121448161213f611f71565b611c1c565b155b1561217d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121888383836126ec565b505050565b61219883838361279e565b505050565b6121b7828260405180602001604052806000815250612cc1565b5050565b6121d68383836040518060200160405280600081525061168f565b505050565b6121e3613271565b6121ec82611f79565b612222576040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008290505b6000811061232b576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461231c57809250505061235e565b50808060019003915050612228565b506040517fe7c0edfb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612431611f71565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612495576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600660006124a2611f71565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661254f611f71565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612594919061335f565b60405180910390a35050565b6125ab84848461279e565b6125b784848484612cd3565b6125ed576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000826126008584612e51565b1490509392505050565b6060600a805461261990613ce4565b80601f016020809104026020016040519081016040528092919081815260200182805461264590613ce4565b80156126925780601f1061266757610100808354040283529160200191612692565b820191906000526020600020905b81548152906001019060200180831161267557829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b6001156126d757600184039350600a81066030018453600a81049050806126b5575b50828103602084039350808452505050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006127a9826121db565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166127d0611f71565b73ffffffffffffffffffffffffffffffffffffffff16148061282c57506127f5611f71565b73ffffffffffffffffffffffffffffffffffffffff1661281484610bec565b73ffffffffffffffffffffffffffffffffffffffff16145b8061284857506128478260000151612842611f71565b611c1c565b5b905080612881576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146128ea576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612950576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61295d8585856001612ec6565b61296d60008484600001516126ec565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612c5157612bb081611f79565b15612c505782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cba8585856001612ecc565b5050505050565b612cce8383836001612ed2565b505050565b6000612cf48473ffffffffffffffffffffffffffffffffffffffff16613237565b15612e44578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d1d611f71565b8786866040518563ffffffff1660e01b8152600401612d3f949392919061460f565b6020604051808303816000875af1925050508015612d7b57506040513d601f19601f82011682018060405250810190612d789190614670565b60015b612df4573d8060008114612dab576040519150601f19603f3d011682016040523d82523d6000602084013e612db0565b606091505b506000815103612dec576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e49565b600190505b949350505050565b60008082905060005b8451811015612ebb576000858281518110612e7857612e77614446565b5b60200260200101519050808311612e9a57612e93838261325a565b9250612ea7565b612ea4818461325a565b92505b508080612eb390614475565b915050612e5a565b508091505092915050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612f3e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403612f78576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f856000868387612ec6565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561321a57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48380156131ce57506131cc6000888488612cd3565b155b15613205576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050613153565b5080600081905550506132306000868387612ecc565b5050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132f4816132bf565b81146132ff57600080fd5b50565b600081359050613311816132eb565b92915050565b60006020828403121561332d5761332c6132b5565b5b600061333b84828501613302565b91505092915050565b60008115159050919050565b61335981613344565b82525050565b60006020820190506133746000830184613350565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6133cd82613384565b810181811067ffffffffffffffff821117156133ec576133eb613395565b5b80604052505050565b60006133ff6132ab565b905061340b82826133c4565b919050565b600067ffffffffffffffff82111561342b5761342a613395565b5b61343482613384565b9050602081019050919050565b82818337600083830152505050565b600061346361345e84613410565b6133f5565b90508281526020810184848401111561347f5761347e61337f565b5b61348a848285613441565b509392505050565b600082601f8301126134a7576134a661337a565b5b81356134b7848260208601613450565b91505092915050565b6000602082840312156134d6576134d56132b5565b5b600082013567ffffffffffffffff8111156134f4576134f36132ba565b5b61350084828501613492565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613543578082015181840152602081019050613528565b60008484015250505050565b600061355a82613509565b6135648185613514565b9350613574818560208601613525565b61357d81613384565b840191505092915050565b600060208201905081810360008301526135a2818461354f565b905092915050565b6000819050919050565b6135bd816135aa565b82525050565b60006020820190506135d860008301846135b4565b92915050565b6135e7816135aa565b81146135f257600080fd5b50565b600081359050613604816135de565b92915050565b6000602082840312156136205761361f6132b5565b5b600061362e848285016135f5565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061366282613637565b9050919050565b61367281613657565b82525050565b600060208201905061368d6000830184613669565b92915050565b61369c81613657565b81146136a757600080fd5b50565b6000813590506136b981613693565b92915050565b600080604083850312156136d6576136d56132b5565b5b60006136e4858286016136aa565b92505060206136f5858286016135f5565b9150509250929050565b600060208284031215613715576137146132b5565b5b6000613723848285016136aa565b91505092915050565b600080600060608486031215613745576137446132b5565b5b6000613753868287016136aa565b9350506020613764868287016136aa565b9250506040613775868287016135f5565b9150509250925092565b6000819050919050565b6137928161377f565b82525050565b60006020820190506137ad6000830184613789565b92915050565b6000819050919050565b60006137d86137d36137ce84613637565b6137b3565b613637565b9050919050565b60006137ea826137bd565b9050919050565b60006137fc826137df565b9050919050565b61380c816137f1565b82525050565b60006020820190506138276000830184613803565b92915050565b6138368161377f565b811461384157600080fd5b50565b6000813590506138538161382d565b92915050565b60006020828403121561386f5761386e6132b5565b5b600061387d84828501613844565b91505092915050565b61388f81613344565b811461389a57600080fd5b50565b6000813590506138ac81613886565b92915050565b600080604083850312156138c9576138c86132b5565b5b60006138d7858286016136aa565b92505060206138e88582860161389d565b9150509250929050565b600067ffffffffffffffff82111561390d5761390c613395565b5b61391682613384565b9050602081019050919050565b6000613936613931846138f2565b6133f5565b9050828152602081018484840111156139525761395161337f565b5b61395d848285613441565b509392505050565b600082601f83011261397a5761397961337a565b5b813561398a848260208601613923565b91505092915050565b600080600080608085870312156139ad576139ac6132b5565b5b60006139bb878288016136aa565b94505060206139cc878288016136aa565b93505060406139dd878288016135f5565b925050606085013567ffffffffffffffff8111156139fe576139fd6132ba565b5b613a0a87828801613965565b91505092959194509250565b600080fd5b600080fd5b60008083601f840112613a3657613a3561337a565b5b8235905067ffffffffffffffff811115613a5357613a52613a16565b5b602083019150836020820283011115613a6f57613a6e613a1b565b5b9250929050565b60008060008060608587031215613a9057613a8f6132b5565b5b6000613a9e878288016135f5565b9450506020613aaf878288016135f5565b935050604085013567ffffffffffffffff811115613ad057613acf6132ba565b5b613adc87828801613a20565b925092505092959194509250565b60008060408385031215613b0157613b006132b5565b5b6000613b0f858286016136aa565b9250506020613b20858286016136aa565b9150509250929050565b600067ffffffffffffffff821115613b4557613b44613395565b5b602082029050602081019050919050565b6000613b69613b6484613b2a565b6133f5565b90508083825260208201905060208402830185811115613b8c57613b8b613a1b565b5b835b81811015613bb55780613ba188826136aa565b845260208401935050602081019050613b8e565b5050509392505050565b600082601f830112613bd457613bd361337a565b5b8135613be4848260208601613b56565b91505092915050565b60008060408385031215613c0457613c036132b5565b5b600083013567ffffffffffffffff811115613c2257613c216132ba565b5b613c2e85828601613bbf565b9250506020613c3f858286016135f5565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613c7f602083613514565b9150613c8a82613c49565b602082019050919050565b60006020820190508181036000830152613cae81613c72565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613cfc57607f821691505b602082108103613d0f57613d0e613cb5565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613d777fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613d3a565b613d818683613d3a565b95508019841693508086168417925050509392505050565b6000613db4613daf613daa846135aa565b6137b3565b6135aa565b9050919050565b6000819050919050565b613dce83613d99565b613de2613dda82613dbb565b848454613d47565b825550505050565b600090565b613df7613dea565b613e02818484613dc5565b505050565b5b81811015613e2657613e1b600082613def565b600181019050613e08565b5050565b601f821115613e6b57613e3c81613d15565b613e4584613d2a565b81016020851015613e54578190505b613e68613e6085613d2a565b830182613e07565b50505b505050565b600082821c905092915050565b6000613e8e60001984600802613e70565b1980831691505092915050565b6000613ea78383613e7d565b9150826002028217905092915050565b613ec082613509565b67ffffffffffffffff811115613ed957613ed8613395565b5b613ee38254613ce4565b613eee828285613e2a565b600060209050601f831160018114613f215760008415613f0f578287015190505b613f198582613e9b565b865550613f81565b601f198416613f2f86613d15565b60005b82811015613f5757848901518255600182019150602085019450602081019050613f32565b86831015613f745784890151613f70601f891682613e7d565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b7f4e4f545f4f50454e000000000000000000000000000000000000000000000000600082015250565b6000613fee600883613514565b9150613ff982613fb8565b602082019050919050565b6000602082019050818103600083015261401d81613fe1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061405e826135aa565b9150614069836135aa565b925082820190508082111561408157614080614024565b5b92915050565b7f4d41585f535550504c5900000000000000000000000000000000000000000000600082015250565b60006140bd600a83613514565b91506140c882614087565b602082019050919050565b600060208201905081810360008301526140ec816140b0565b9050919050565b7f4d41585f4d494e54000000000000000000000000000000000000000000000000600082015250565b6000614129600883613514565b9150614134826140f3565b602082019050919050565b600060208201905081810360008301526141588161411c565b9050919050565b600061416a826135aa565b9150614175836135aa565b9250828202614183816135aa565b9150828204841483151761419a57614199614024565b5b5092915050565b7f494e56414c49445f505249434500000000000000000000000000000000000000600082015250565b60006141d7600d83613514565b91506141e2826141a1565b602082019050919050565b60006020820190508181036000830152614206816141ca565b9050919050565b60008160601b9050919050565b60006142258261420d565b9050919050565b60006142378261421a565b9050919050565b61424f61424a82613657565b61422c565b82525050565b6000819050919050565b61427061426b826135aa565b614255565b82525050565b6000614282828561423e565b601482019150614292828461425f565b6020820191508190509392505050565b7f496e76616c6964204d65726b6c652050726f6f662e0000000000000000000000600082015250565b60006142d8601583613514565b91506142e3826142a2565b602082019050919050565b60006020820190508181036000830152614307816142cb565b9050919050565b7f4d415820574c204d494e54530000000000000000000000000000000000000000600082015250565b6000614344600c83613514565b915061434f8261430e565b602082019050919050565b6000602082019050818103600083015261437381614337565b9050919050565b600081905092915050565b600061439082613509565b61439a818561437a565b93506143aa818560208601613525565b80840191505092915050565b60006143c28285614385565b91506143ce8284614385565b91508190509392505050565b7f494e56414c49445f57414c4c4554000000000000000000000000000000000000600082015250565b6000614410600e83613514565b915061441b826143da565b602082019050919050565b6000602082019050818103600083015261443f81614403565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614480826135aa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144b2576144b1614024565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614519602683613514565b9150614524826144bd565b604082019050919050565b600060208201905081810360008301526145488161450c565b9050919050565b60006040820190506145646000830185613669565b6145716020830184613669565b9392505050565b60008151905061458781613886565b92915050565b6000602082840312156145a3576145a26132b5565b5b60006145b184828501614578565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60006145e1826145ba565b6145eb81856145c5565b93506145fb818560208601613525565b61460481613384565b840191505092915050565b60006080820190506146246000830187613669565b6146316020830186613669565b61463e60408301856135b4565b818103606083015261465081846145d6565b905095945050505050565b60008151905061466a816132eb565b92915050565b600060208284031215614686576146856132b5565b5b60006146948482850161465b565b9150509291505056fea26469706673582212201e39997e7e76ee19c1e01d0098c1f795ef24057741ee11f7cb8b661002c0be6964736f6c63430008110033
Deployed Bytecode
0x6080604052600436106102515760003560e01c80636352211e11610139578063a22cb465116100b6578063c87b56dd1161007a578063c87b56dd14610869578063e222c7f9146108a6578063e2a70eaf146108bd578063e985e9c5146108e6578063eeb9052f14610923578063f2fde38b1461094c57610251565b8063a22cb465146107a7578063b88d4fde146107d0578063bf9c41cd146107f9578063c4ae316814610836578063c4be5b591461084d57610251565b80638456cb59116100fd5780638456cb59146106e457806386a173ee1461070f5780638bb64a8c1461073a5780638da5cb5b1461075157806395d89b411461077c57610251565b80636352211e146105ff57806365f130971461063c57806370a0823114610667578063715018a6146106a45780637cb64759146106bb57610251565b80632eb4a7ab116101d257806340c10f191161019657806340c10f19146104fc57806341f434341461051857806342842e0e146105435780634cf5f7a41461056c5780634f6ccce71461059757806354214f69146105d457610251565b80632eb4a7ab146104345780632f745c591461045f57806332cb6b0c1461049c57806333bc1c5c146104c75780633ccfd60b146104f257610251565b8063081812fc11610219578063081812fc1461033d578063095ea7b31461037a57806318160ddd146103a35780631c16521c146103ce57806323b872dd1461040b57610251565b806301ffc9a7146102565780630675b7c61461029357806306fdde03146102bc57806307ca9734146102e757806307e89ec014610312575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613317565b610975565b60405161028a919061335f565b60405180910390f35b34801561029f57600080fd5b506102ba60048036038101906102b591906134c0565b610abf565b005b3480156102c857600080fd5b506102d1610b4e565b6040516102de9190613588565b60405180910390f35b3480156102f357600080fd5b506102fc610be0565b60405161030991906135c3565b60405180910390f35b34801561031e57600080fd5b50610327610be6565b60405161033491906135c3565b60405180910390f35b34801561034957600080fd5b50610364600480360381019061035f919061360a565b610bec565b6040516103719190613678565b60405180910390f35b34801561038657600080fd5b506103a1600480360381019061039c91906136bf565b610c68565b005b3480156103af57600080fd5b506103b8610c81565b6040516103c591906135c3565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f091906136ff565b610c8a565b60405161040291906135c3565b60405180910390f35b34801561041757600080fd5b50610432600480360381019061042d919061372c565b610ca2565b005b34801561044057600080fd5b50610449610cf1565b6040516104569190613798565b60405180910390f35b34801561046b57600080fd5b50610486600480360381019061048191906136bf565b610cf7565b60405161049391906135c3565b60405180910390f35b3480156104a857600080fd5b506104b1610eb9565b6040516104be91906135c3565b60405180910390f35b3480156104d357600080fd5b506104dc610ebf565b6040516104e9919061335f565b60405180910390f35b6104fa610ed2565b005b610516600480360381019061051191906136bf565b610fa4565b005b34801561052457600080fd5b5061052d61118c565b60405161053a9190613812565b60405180910390f35b34801561054f57600080fd5b5061056a6004803603810190610565919061372c565b61119e565b005b34801561057857600080fd5b506105816111ed565b60405161058e9190613588565b60405180910390f35b3480156105a357600080fd5b506105be60048036038101906105b9919061360a565b61127b565b6040516105cb91906135c3565b60405180910390f35b3480156105e057600080fd5b506105e96112c5565b6040516105f6919061335f565b60405180910390f35b34801561060b57600080fd5b506106266004803603810190610621919061360a565b6112d8565b6040516106339190613678565b60405180910390f35b34801561064857600080fd5b506106516112ee565b60405161065e91906135c3565b60405180910390f35b34801561067357600080fd5b5061068e600480360381019061068991906136ff565b6112f3565b60405161069b91906135c3565b60405180910390f35b3480156106b057600080fd5b506106b96113d2565b005b3480156106c757600080fd5b506106e260048036038101906106dd9190613859565b61145a565b005b3480156106f057600080fd5b506106f96114e0565b604051610706919061335f565b60405180910390f35b34801561071b57600080fd5b506107246114f3565b604051610731919061335f565b60405180910390f35b34801561074657600080fd5b5061074f611506565b005b34801561075d57600080fd5b506107666115ba565b6040516107739190613678565b60405180910390f35b34801561078857600080fd5b506107916115e4565b60405161079e9190613588565b60405180910390f35b3480156107b357600080fd5b506107ce60048036038101906107c991906138b2565b611676565b005b3480156107dc57600080fd5b506107f760048036038101906107f29190613993565b61168f565b005b34801561080557600080fd5b50610820600480360381019061081b91906136ff565b6116e0565b60405161082d91906135c3565b60405180910390f35b34801561084257600080fd5b5061084b6116f8565b005b61086760048036038101906108629190613a76565b6117a0565b005b34801561087557600080fd5b50610890600480360381019061088b919061360a565b611a44565b60405161089d9190613588565b60405180910390f35b3480156108b257600080fd5b506108bb611ae2565b005b3480156108c957600080fd5b506108e460048036038101906108df919061360a565b611b96565b005b3480156108f257600080fd5b5061090d60048036038101906109089190613aea565b611c1c565b60405161091a919061335f565b60405180910390f35b34801561092f57600080fd5b5061094a60048036038101906109459190613bed565b611cb0565b005b34801561095857600080fd5b50610973600480360381019061096e91906136ff565b611e10565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a4057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aa857507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ab85750610ab782611f07565b5b9050919050565b610ac7611f71565b73ffffffffffffffffffffffffffffffffffffffff16610ae56115ba565b73ffffffffffffffffffffffffffffffffffffffff1614610b3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3290613c95565b60405180910390fd5b80600a9081610b4a9190613eb7565b5050565b606060018054610b5d90613ce4565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8990613ce4565b8015610bd65780601f10610bab57610100808354040283529160200191610bd6565b820191906000526020600020905b815481529060010190602001808311610bb957829003601f168201915b5050505050905090565b60095481565b60085481565b6000610bf782611f79565b610c2d576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610c7281611f86565b610c7c8383612083565b505050565b60008054905090565b600e6020528060005260406000206000915090505481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ce057610cdf33611f86565b5b610ceb84848461218d565b50505050565b600d5481565b6000610d02836112f3565b8210610d3a576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610d44610c81565b905060008060005b83811015610e9c576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610e3e57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e8e57868403610e85578195505050505050610eb3565b83806001019450505b508080600101915050610d4c565b506000610eac57610eab613f89565b5b8193505050505b92915050565b61271081565b600c60019054906101000a900460ff1681565b610eda611f71565b73ffffffffffffffffffffffffffffffffffffffff16610ef86115ba565b73ffffffffffffffffffffffffffffffffffffffff1614610f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4590613c95565b60405180910390fd5b6000479050610f5b6115ba565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610fa0573d6000803e3d6000fd5b5050565b600c60019054906101000a900460ff16610ff3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fea90614004565b60405180910390fd5b61271081610fff610c81565b6110099190614053565b111561104a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611041906140d3565b60405180910390fd5b600a81600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110979190614053565b11156110d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cf9061413f565b60405180910390fd5b806008546110e6919061415f565b341015611128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111f906141ed565b60405180910390fd5b80600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111779190614053565b92505081905550611188828261219d565b5050565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146111dc576111db33611f86565b5b6111e78484846121bb565b50505050565b600b80546111fa90613ce4565b80601f016020809104026020016040519081016040528092919081815260200182805461122690613ce4565b80156112735780601f1061124857610100808354040283529160200191611273565b820191906000526020600020905b81548152906001019060200180831161125657829003601f168201915b505050505081565b6000611285610c81565b82106112bd576040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b819050919050565b600c60009054906101000a900460ff1681565b60006112e3826121db565b600001519050919050565b600a81565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361135a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6113da611f71565b73ffffffffffffffffffffffffffffffffffffffff166113f86115ba565b73ffffffffffffffffffffffffffffffffffffffff161461144e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144590613c95565b60405180910390fd5b6114586000612363565b565b611462611f71565b73ffffffffffffffffffffffffffffffffffffffff166114806115ba565b73ffffffffffffffffffffffffffffffffffffffff16146114d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cd90613c95565b60405180910390fd5b80600d8190555050565b600c60039054906101000a900460ff1681565b600c60029054906101000a900460ff1681565b61150e611f71565b73ffffffffffffffffffffffffffffffffffffffff1661152c6115ba565b73ffffffffffffffffffffffffffffffffffffffff1614611582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157990613c95565b60405180910390fd5b6001600c60026101000a81548160ff0219169083151502179055506000600c60016101000a81548160ff021916908315150217905550565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546115f390613ce4565b80601f016020809104026020016040519081016040528092919081815260200182805461161f90613ce4565b801561166c5780601f106116415761010080835404028352916020019161166c565b820191906000526020600020905b81548152906001019060200180831161164f57829003601f168201915b5050505050905090565b8161168081611f86565b61168a8383612429565b505050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116cd576116cc33611f86565b5b6116d9858585856125a0565b5050505050565b600f6020528060005260406000206000915090505481565b611700611f71565b73ffffffffffffffffffffffffffffffffffffffff1661171e6115ba565b73ffffffffffffffffffffffffffffffffffffffff1614611774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176b90613c95565b60405180910390fd5b600c60039054906101000a900460ff1615600c60036101000a81548160ff021916908315150217905550565b600c60029054906101000a900460ff166117ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e690614004565b60405180910390fd5b60003384604051602001611804929190614276565b60405160208183030381529060405280519060200120905061186a838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d54836125f3565b6118a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a0906142ee565b60405180910390fd5b8385600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118f59190614053565b1115611936576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192d9061435a565b60405180910390fd5b61271085611942610c81565b61194c9190614053565b111561198d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611984906140d3565b60405180910390fd5b8460095461199b919061415f565b3410156119dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d4906141ed565b60405180910390fd5b84600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a2c9190614053565b92505081905550611a3d338661219d565b5050505050565b6060611a4f82611f79565b611a85576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611a8f61260a565b90506000815103611aaf5760405180602001604052806000815250611ada565b80611ab98461269c565b604051602001611aca9291906143b6565b6040516020818303038152906040525b915050919050565b611aea611f71565b73ffffffffffffffffffffffffffffffffffffffff16611b086115ba565b73ffffffffffffffffffffffffffffffffffffffff1614611b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5590613c95565b60405180910390fd5b6000600c60026101000a81548160ff0219169083151502179055506001600c60016101000a81548160ff021916908315150217905550565b611b9e611f71565b73ffffffffffffffffffffffffffffffffffffffff16611bbc6115ba565b73ffffffffffffffffffffffffffffffffffffffff1614611c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0990613c95565b60405180910390fd5b8060088190555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611cb8611f71565b73ffffffffffffffffffffffffffffffffffffffff16611cd66115ba565b73ffffffffffffffffffffffffffffffffffffffff1614611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2390613c95565b60405180910390fd5b6000825111611d70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6790614426565b60405180910390fd5b6127108251611d7d610c81565b611d879190614053565b1115611dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbf906140d3565b60405180910390fd5b60005b8251811015611e0b57611df8838281518110611dea57611de9614446565b5b60200260200101518361219d565b8080611e0390614475565b915050611dcb565b505050565b611e18611f71565b73ffffffffffffffffffffffffffffffffffffffff16611e366115ba565b73ffffffffffffffffffffffffffffffffffffffff1614611e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8390613c95565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef29061452f565b60405180910390fd5b611f0481612363565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000805482109050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612080576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611ffd92919061454f565b602060405180830381865afa15801561201a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203e919061458d565b61207f57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016120769190613678565b60405180910390fd5b5b50565b600061208e826112d8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036120f5576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16612114611f71565b73ffffffffffffffffffffffffffffffffffffffff161415801561214657506121448161213f611f71565b611c1c565b155b1561217d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121888383836126ec565b505050565b61219883838361279e565b505050565b6121b7828260405180602001604052806000815250612cc1565b5050565b6121d68383836040518060200160405280600081525061168f565b505050565b6121e3613271565b6121ec82611f79565b612222576040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008290505b6000811061232b576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461231c57809250505061235e565b50808060019003915050612228565b506040517fe7c0edfb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612431611f71565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612495576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600660006124a2611f71565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661254f611f71565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612594919061335f565b60405180910390a35050565b6125ab84848461279e565b6125b784848484612cd3565b6125ed576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000826126008584612e51565b1490509392505050565b6060600a805461261990613ce4565b80601f016020809104026020016040519081016040528092919081815260200182805461264590613ce4565b80156126925780601f1061266757610100808354040283529160200191612692565b820191906000526020600020905b81548152906001019060200180831161267557829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b6001156126d757600184039350600a81066030018453600a81049050806126b5575b50828103602084039350808452505050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006127a9826121db565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166127d0611f71565b73ffffffffffffffffffffffffffffffffffffffff16148061282c57506127f5611f71565b73ffffffffffffffffffffffffffffffffffffffff1661281484610bec565b73ffffffffffffffffffffffffffffffffffffffff16145b8061284857506128478260000151612842611f71565b611c1c565b5b905080612881576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146128ea576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612950576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61295d8585856001612ec6565b61296d60008484600001516126ec565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612c5157612bb081611f79565b15612c505782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cba8585856001612ecc565b5050505050565b612cce8383836001612ed2565b505050565b6000612cf48473ffffffffffffffffffffffffffffffffffffffff16613237565b15612e44578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d1d611f71565b8786866040518563ffffffff1660e01b8152600401612d3f949392919061460f565b6020604051808303816000875af1925050508015612d7b57506040513d601f19601f82011682018060405250810190612d789190614670565b60015b612df4573d8060008114612dab576040519150601f19603f3d011682016040523d82523d6000602084013e612db0565b606091505b506000815103612dec576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e49565b600190505b949350505050565b60008082905060005b8451811015612ebb576000858281518110612e7857612e77614446565b5b60200260200101519050808311612e9a57612e93838261325a565b9250612ea7565b612ea4818461325a565b92505b508080612eb390614475565b915050612e5a565b508091505092915050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612f3e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403612f78576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f856000868387612ec6565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561321a57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48380156131ce57506131cc6000888488612cd3565b155b15613205576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050613153565b5080600081905550506132306000868387612ecc565b5050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132f4816132bf565b81146132ff57600080fd5b50565b600081359050613311816132eb565b92915050565b60006020828403121561332d5761332c6132b5565b5b600061333b84828501613302565b91505092915050565b60008115159050919050565b61335981613344565b82525050565b60006020820190506133746000830184613350565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6133cd82613384565b810181811067ffffffffffffffff821117156133ec576133eb613395565b5b80604052505050565b60006133ff6132ab565b905061340b82826133c4565b919050565b600067ffffffffffffffff82111561342b5761342a613395565b5b61343482613384565b9050602081019050919050565b82818337600083830152505050565b600061346361345e84613410565b6133f5565b90508281526020810184848401111561347f5761347e61337f565b5b61348a848285613441565b509392505050565b600082601f8301126134a7576134a661337a565b5b81356134b7848260208601613450565b91505092915050565b6000602082840312156134d6576134d56132b5565b5b600082013567ffffffffffffffff8111156134f4576134f36132ba565b5b61350084828501613492565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613543578082015181840152602081019050613528565b60008484015250505050565b600061355a82613509565b6135648185613514565b9350613574818560208601613525565b61357d81613384565b840191505092915050565b600060208201905081810360008301526135a2818461354f565b905092915050565b6000819050919050565b6135bd816135aa565b82525050565b60006020820190506135d860008301846135b4565b92915050565b6135e7816135aa565b81146135f257600080fd5b50565b600081359050613604816135de565b92915050565b6000602082840312156136205761361f6132b5565b5b600061362e848285016135f5565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061366282613637565b9050919050565b61367281613657565b82525050565b600060208201905061368d6000830184613669565b92915050565b61369c81613657565b81146136a757600080fd5b50565b6000813590506136b981613693565b92915050565b600080604083850312156136d6576136d56132b5565b5b60006136e4858286016136aa565b92505060206136f5858286016135f5565b9150509250929050565b600060208284031215613715576137146132b5565b5b6000613723848285016136aa565b91505092915050565b600080600060608486031215613745576137446132b5565b5b6000613753868287016136aa565b9350506020613764868287016136aa565b9250506040613775868287016135f5565b9150509250925092565b6000819050919050565b6137928161377f565b82525050565b60006020820190506137ad6000830184613789565b92915050565b6000819050919050565b60006137d86137d36137ce84613637565b6137b3565b613637565b9050919050565b60006137ea826137bd565b9050919050565b60006137fc826137df565b9050919050565b61380c816137f1565b82525050565b60006020820190506138276000830184613803565b92915050565b6138368161377f565b811461384157600080fd5b50565b6000813590506138538161382d565b92915050565b60006020828403121561386f5761386e6132b5565b5b600061387d84828501613844565b91505092915050565b61388f81613344565b811461389a57600080fd5b50565b6000813590506138ac81613886565b92915050565b600080604083850312156138c9576138c86132b5565b5b60006138d7858286016136aa565b92505060206138e88582860161389d565b9150509250929050565b600067ffffffffffffffff82111561390d5761390c613395565b5b61391682613384565b9050602081019050919050565b6000613936613931846138f2565b6133f5565b9050828152602081018484840111156139525761395161337f565b5b61395d848285613441565b509392505050565b600082601f83011261397a5761397961337a565b5b813561398a848260208601613923565b91505092915050565b600080600080608085870312156139ad576139ac6132b5565b5b60006139bb878288016136aa565b94505060206139cc878288016136aa565b93505060406139dd878288016135f5565b925050606085013567ffffffffffffffff8111156139fe576139fd6132ba565b5b613a0a87828801613965565b91505092959194509250565b600080fd5b600080fd5b60008083601f840112613a3657613a3561337a565b5b8235905067ffffffffffffffff811115613a5357613a52613a16565b5b602083019150836020820283011115613a6f57613a6e613a1b565b5b9250929050565b60008060008060608587031215613a9057613a8f6132b5565b5b6000613a9e878288016135f5565b9450506020613aaf878288016135f5565b935050604085013567ffffffffffffffff811115613ad057613acf6132ba565b5b613adc87828801613a20565b925092505092959194509250565b60008060408385031215613b0157613b006132b5565b5b6000613b0f858286016136aa565b9250506020613b20858286016136aa565b9150509250929050565b600067ffffffffffffffff821115613b4557613b44613395565b5b602082029050602081019050919050565b6000613b69613b6484613b2a565b6133f5565b90508083825260208201905060208402830185811115613b8c57613b8b613a1b565b5b835b81811015613bb55780613ba188826136aa565b845260208401935050602081019050613b8e565b5050509392505050565b600082601f830112613bd457613bd361337a565b5b8135613be4848260208601613b56565b91505092915050565b60008060408385031215613c0457613c036132b5565b5b600083013567ffffffffffffffff811115613c2257613c216132ba565b5b613c2e85828601613bbf565b9250506020613c3f858286016135f5565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613c7f602083613514565b9150613c8a82613c49565b602082019050919050565b60006020820190508181036000830152613cae81613c72565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613cfc57607f821691505b602082108103613d0f57613d0e613cb5565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613d777fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613d3a565b613d818683613d3a565b95508019841693508086168417925050509392505050565b6000613db4613daf613daa846135aa565b6137b3565b6135aa565b9050919050565b6000819050919050565b613dce83613d99565b613de2613dda82613dbb565b848454613d47565b825550505050565b600090565b613df7613dea565b613e02818484613dc5565b505050565b5b81811015613e2657613e1b600082613def565b600181019050613e08565b5050565b601f821115613e6b57613e3c81613d15565b613e4584613d2a565b81016020851015613e54578190505b613e68613e6085613d2a565b830182613e07565b50505b505050565b600082821c905092915050565b6000613e8e60001984600802613e70565b1980831691505092915050565b6000613ea78383613e7d565b9150826002028217905092915050565b613ec082613509565b67ffffffffffffffff811115613ed957613ed8613395565b5b613ee38254613ce4565b613eee828285613e2a565b600060209050601f831160018114613f215760008415613f0f578287015190505b613f198582613e9b565b865550613f81565b601f198416613f2f86613d15565b60005b82811015613f5757848901518255600182019150602085019450602081019050613f32565b86831015613f745784890151613f70601f891682613e7d565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b7f4e4f545f4f50454e000000000000000000000000000000000000000000000000600082015250565b6000613fee600883613514565b9150613ff982613fb8565b602082019050919050565b6000602082019050818103600083015261401d81613fe1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061405e826135aa565b9150614069836135aa565b925082820190508082111561408157614080614024565b5b92915050565b7f4d41585f535550504c5900000000000000000000000000000000000000000000600082015250565b60006140bd600a83613514565b91506140c882614087565b602082019050919050565b600060208201905081810360008301526140ec816140b0565b9050919050565b7f4d41585f4d494e54000000000000000000000000000000000000000000000000600082015250565b6000614129600883613514565b9150614134826140f3565b602082019050919050565b600060208201905081810360008301526141588161411c565b9050919050565b600061416a826135aa565b9150614175836135aa565b9250828202614183816135aa565b9150828204841483151761419a57614199614024565b5b5092915050565b7f494e56414c49445f505249434500000000000000000000000000000000000000600082015250565b60006141d7600d83613514565b91506141e2826141a1565b602082019050919050565b60006020820190508181036000830152614206816141ca565b9050919050565b60008160601b9050919050565b60006142258261420d565b9050919050565b60006142378261421a565b9050919050565b61424f61424a82613657565b61422c565b82525050565b6000819050919050565b61427061426b826135aa565b614255565b82525050565b6000614282828561423e565b601482019150614292828461425f565b6020820191508190509392505050565b7f496e76616c6964204d65726b6c652050726f6f662e0000000000000000000000600082015250565b60006142d8601583613514565b91506142e3826142a2565b602082019050919050565b60006020820190508181036000830152614307816142cb565b9050919050565b7f4d415820574c204d494e54530000000000000000000000000000000000000000600082015250565b6000614344600c83613514565b915061434f8261430e565b602082019050919050565b6000602082019050818103600083015261437381614337565b9050919050565b600081905092915050565b600061439082613509565b61439a818561437a565b93506143aa818560208601613525565b80840191505092915050565b60006143c28285614385565b91506143ce8284614385565b91508190509392505050565b7f494e56414c49445f57414c4c4554000000000000000000000000000000000000600082015250565b6000614410600e83613514565b915061441b826143da565b602082019050919050565b6000602082019050818103600083015261443f81614403565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614480826135aa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144b2576144b1614024565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614519602683613514565b9150614524826144bd565b604082019050919050565b600060208201905081810360008301526145488161450c565b9050919050565b60006040820190506145646000830185613669565b6145716020830184613669565b9392505050565b60008151905061458781613886565b92915050565b6000602082840312156145a3576145a26132b5565b5b60006145b184828501614578565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60006145e1826145ba565b6145eb81856145c5565b93506145fb818560208601613525565b61460481613384565b840191505092915050565b60006080820190506146246000830187613669565b6146316020830186613669565b61463e60408301856135b4565b818103606083015261465081846145d6565b905095945050505050565b60008151905061466a816132eb565b92915050565b600060208284031215614686576146856132b5565b5b60006146948482850161465b565b9150509291505056fea26469706673582212201e39997e7e76ee19c1e01d0098c1f795ef24057741ee11f7cb8b661002c0be6964736f6c63430008110033
Deployed Bytecode Sourcemap
58255:6235:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45506:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61568:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47322:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58510:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58456:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48807:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60318:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43744:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58804:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60491:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58770:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44398:1036;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58356:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58667:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64341:146;;;:::i;:::-;;58967:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11568:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60662:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58596:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43922:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58638:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47131:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58405:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45942:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22242:103;;;;;;;;;;;;;:::i;:::-;;61691:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58744:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58704:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61886:117;;;;;;;;;;;;;:::i;:::-;;21591:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47491:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60126:184;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60849:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58861:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61804:74;;;;;;;;;;;;;:::i;:::-;;59417:697;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61242:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62011:114;;;;;;;;;;;;;:::i;:::-;;62134:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49441:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62242:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22500:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45506:372;45608:4;45660:25;45645:40;;;:11;:40;;;;:105;;;;45717:33;45702:48;;;:11;:48;;;;45645:105;:172;;;;45782:35;45767:50;;;:11;:50;;;;45645:172;:225;;;;45834:36;45858:11;45834:23;:36::i;:::-;45645:225;45625:245;;45506:372;;;:::o;61568:115::-;21822:12;:10;:12::i;:::-;21811:23;;:7;:5;:7::i;:::-;:23;;;21803:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61662:13:::1;61647:12;:28;;;;;;:::i;:::-;;61568:115:::0;:::o;47322:100::-;47376:13;47409:5;47402:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47322:100;:::o;58510:43::-;;;;:::o;58456:47::-;;;;:::o;48807:204::-;48875:7;48900:16;48908:7;48900;:16::i;:::-;48895:64;;48925:34;;;;;;;;;;;;;;48895:64;48979:15;:24;48995:7;48979:24;;;;;;;;;;;;;;;;;;;;;48972:31;;48807:204;;;:::o;60318:165::-;60422:8;13350:30;13371:8;13350:20;:30::i;:::-;60443:32:::1;60457:8;60467:7;60443:13;:32::i;:::-;60318:165:::0;;;:::o;43744:101::-;43797:7;43824:13;;43817:20;;43744:101;:::o;58804:50::-;;;;;;;;;;;;;;;;;:::o;60491:163::-;60592:4;13084:10;13076:18;;:4;:18;;;13072:83;;13111:32;13132:10;13111:20;:32::i;:::-;13072:83;60609:37:::1;60628:4;60634:2;60638:7;60609:18;:37::i;:::-;60491:163:::0;;;;:::o;58770:25::-;;;;:::o;44398:1036::-;44487:7;44520:16;44530:5;44520:9;:16::i;:::-;44511:5;:25;44507:61;;44545:23;;;;;;;;;;;;;;44507:61;44579:22;44604:13;:11;:13::i;:::-;44579:38;;44628:19;44658:25;44847:9;44842:466;44862:14;44858:1;:18;44842:466;;;44902:31;44936:11;:14;44948:1;44936:14;;;;;;;;;;;44902:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44999:1;44973:28;;:9;:14;;;:28;;;44969:111;;45046:9;:14;;;45026:34;;44969:111;45123:5;45102:26;;:17;:26;;;45098:195;;45172:5;45157:11;:20;45153:85;;45213:1;45206:8;;;;;;;;;45153:85;45260:13;;;;;;;45098:195;44883:425;44878:3;;;;;;;44842:466;;;;45391:5;45384:13;;;;:::i;:::-;;45415:11;45408:18;;;;;44398:1036;;;;;:::o;58356:42::-;58393:5;58356:42;:::o;58667:30::-;;;;;;;;;;;;;:::o;64341:146::-;21822:12;:10;:12::i;:::-;21811:23;;:7;:5;:7::i;:::-;:23;;;21803:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64400:13:::1;64416:21;64400:37;;64452:7;:5;:7::i;:::-;64444:25;;:35;64470:8;64444:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;64393:94;64341:146::o:0;58967:442::-;59057:10;;;;;;;;;;;59049:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;58393:5;59116:9;59100:13;:11;:13::i;:::-;:25;;;;:::i;:::-;59099:41;;59091:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;58447:2;59196:9;59175:15;:19;59191:2;59175:19;;;;;;;;;;;;;;;;:30;;;;:::i;:::-;59174:51;;59166:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;59291:9;59271:17;;:29;;;;:::i;:::-;59257:9;:44;;59249:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;59355:9;59332:15;:19;59348:2;59332:19;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;59375:24;59385:2;59389:9;59375;:24::i;:::-;58967:442;;:::o;11568:143::-;4042:42;11568:143;:::o;60662:179::-;60775:4;13084:10;13076:18;;:4;:18;;;13072:83;;13111:32;13132:10;13111:20;:32::i;:::-;13072:83;60792:41:::1;60815:4;60821:2;60825:7;60792:22;:41::i;:::-;60662:179:::0;;;;:::o;58596:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43922:176::-;43989:7;44022:13;:11;:13::i;:::-;44013:5;:22;44009:58;;44044:23;;;;;;;;;;;;;;44009:58;44085:5;44078:12;;43922:176;;;:::o;58638:22::-;;;;;;;;;;;;;:::o;47131:124::-;47195:7;47222:20;47234:7;47222:11;:20::i;:::-;:25;;;47215:32;;47131:124;;;:::o;58405:44::-;58447:2;58405:44;:::o;45942:206::-;46006:7;46047:1;46030:19;;:5;:19;;;46026:60;;46058:28;;;;;;;;;;;;;;46026:60;46112:12;:19;46125:5;46112:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;46104:36;;46097:43;;45942:206;;;:::o;22242:103::-;21822:12;:10;:12::i;:::-;21811:23;;:7;:5;:7::i;:::-;:23;;;21803:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22307:30:::1;22334:1;22307:18;:30::i;:::-;22242:103::o:0;61691:105::-;21822:12;:10;:12::i;:::-;21811:23;;:7;:5;:7::i;:::-;:23;;;21803:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61777:11:::1;61764:10;:24;;;;61691:105:::0;:::o;58744:17::-;;;;;;;;;;;;;:::o;58704:33::-;;;;;;;;;;;;;:::o;61886:117::-;21822:12;:10;:12::i;:::-;21811:23;;:7;:5;:7::i;:::-;:23;;;21803:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61962:4:::1;61946:13;;:20;;;;;;;;;;;;;;;;;;61990:5;61977:10;;:18;;;;;;;;;;;;;;;;;;61886:117::o:0;21591:87::-;21637:7;21664:6;;;;;;;;;;;21657:13;;21591:87;:::o;47491:104::-;47547:13;47580:7;47573:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47491:104;:::o;60126:184::-;60238:8;13350:30;13371:8;13350:20;:30::i;:::-;60259:43:::1;60283:8;60293;60259:23;:43::i;:::-;60126:184:::0;;;:::o;60849:228::-;61000:4;13084:10;13076:18;;:4;:18;;;13072:83;;13111:32;13132:10;13111:20;:32::i;:::-;13072:83;61022:47:::1;61045:4;61051:2;61055:7;61064:4;61022:22;:47::i;:::-;60849:228:::0;;;;;:::o;58861:41::-;;;;;;;;;;;;;;;;;:::o;61804:74::-;21822:12;:10;:12::i;:::-;21811:23;;:7;:5;:7::i;:::-;:23;;;21803:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61865:5:::1;;;;;;;;;;;61864:6;61856:5;;:14;;;;;;;;;;;;;;;;;;61804:74::o:0;59417:697::-;59548:13;;;;;;;;;;;59540:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;59585:12;59627:10;59639:11;59610:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59600:52;;;;;;59585:67;;59685:50;59704:12;;59685:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59718:10;;59730:4;59685:18;:50::i;:::-;59663:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;59839:11;59826:9;59803:8;:20;59812:10;59803:20;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;:47;;59795:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;58393:5;59903:9;59887:13;:11;:13::i;:::-;:25;;;;:::i;:::-;59886:41;;59878:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;59991:9;59975:13;;:25;;;;:::i;:::-;59961:9;:40;;59953:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;60054:9;60030:8;:20;60039:10;60030:20;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;60074:32;60084:10;60096:9;60074;:32::i;:::-;59529:585;59417:697;;;;:::o;61242:318::-;61315:13;61346:16;61354:7;61346;:16::i;:::-;61341:59;;61371:29;;;;;;;;;;;;;;61341:59;61413:21;61437:10;:8;:10::i;:::-;61413:34;;61490:1;61471:7;61465:21;:26;:87;;;;;;;;;;;;;;;;;61518:7;61527:18;61537:7;61527:9;:18::i;:::-;61501:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61465:87;61458:94;;;61242:318;;;:::o;62011:114::-;21822:12;:10;:12::i;:::-;21811:23;;:7;:5;:7::i;:::-;:23;;;21803:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62084:5:::1;62068:13;;:21;;;;;;;;;;;;;;;;;;62113:4;62100:10;;:17;;;;;;;;;;;;;;;;;;62011:114::o:0;62134:104::-;21822:12;:10;:12::i;:::-;21811:23;;:7;:5;:7::i;:::-;:23;;;21803:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62225:5:::1;62205:17;:25;;;;62134:104:::0;:::o;49441:164::-;49538:4;49562:18;:25;49581:5;49562:25;;;;;;;;;;;;;;;:35;49588:8;49562:35;;;;;;;;;;;;;;;;;;;;;;;;;49555:42;;49441:164;;;;:::o;62242:336::-;21822:12;:10;:12::i;:::-;21811:23;;:7;:5;:7::i;:::-;:23;;;21803:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62352:1:::1;62334:8;:15;:19;62326:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;58393:5;62407:8;:15;62391:13;:11;:13::i;:::-;:31;;;;:::i;:::-;:45;;62383:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62467:6;62462:109;62483:8;:15;62479:1;:19;62462:109;;;62529:30;62539:8;62548:1;62539:11;;;;;;;;:::i;:::-;;;;;;;;62552:6;62529:9;:30::i;:::-;62500:3;;;;;:::i;:::-;;;;62462:109;;;;62242:336:::0;;:::o;22500:201::-;21822:12;:10;:12::i;:::-;21811:23;;:7;:5;:7::i;:::-;:23;;;21803:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22609:1:::1;22589:22;;:8;:22;;::::0;22581:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;22665:28;22684:8;22665:18;:28::i;:::-;22500:201:::0;:::o;34398:157::-;34483:4;34522:25;34507:40;;;:11;:40;;;;34500:47;;34398:157;;;:::o;20315:98::-;20368:7;20395:10;20388:17;;20315:98;:::o;50740:112::-;50797:4;50831:13;;50821:7;:23;50814:30;;50740:112;;;:::o;13493:647::-;13732:1;4042:42;13684:45;;;:49;13680:453;;;4042:42;13983;;;14034:4;14041:8;13983:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13978:144;;14097:8;14078:28;;;;;;;;;;;:::i;:::-;;;;;;;;13978:144;13680:453;13493:647;:::o;48388:353::-;48469:13;48485:24;48501:7;48485:15;:24::i;:::-;48469:40;;48530:5;48524:11;;:2;:11;;;48520:48;;48544:24;;;;;;;;;;;;;;48520:48;48601:5;48585:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;48611:37;48628:5;48635:12;:10;:12::i;:::-;48611:16;:37::i;:::-;48610:38;48585:63;48581:111;;;48657:35;;;;;;;;;;;;;;48581:111;48705:28;48714:2;48718:7;48727:5;48705:8;:28::i;:::-;48458:283;48388:353;;:::o;49672:170::-;49806:28;49816:4;49822:2;49826:7;49806:9;:28::i;:::-;49672:170;;;:::o;50860:104::-;50929:27;50939:2;50943:8;50929:27;;;;;;;;;;;;:9;:27::i;:::-;50860:104;;:::o;49913:185::-;50051:39;50068:4;50074:2;50078:7;50051:39;;;;;;;;;;;;:16;:39::i;:::-;49913:185;;;:::o;46565:504::-;46626:21;;:::i;:::-;46665:16;46673:7;46665;:16::i;:::-;46660:61;;46690:31;;;;;;;;;;;;;;46660:61;46764:12;46779:7;46764:22;;46759:245;46796:1;46788:4;:9;46759:245;;46826:31;46860:11;:17;46872:4;46860:17;;;;;;;;;;;46826:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46926:1;46900:28;;:9;:14;;;:28;;;46896:93;;46960:9;46953:16;;;;;;46896:93;46807:197;46799:6;;;;;;;;46759:245;;;;47034:27;;;;;;;;;;;;;;46565:504;;;;:::o;22861:191::-;22935:16;22954:6;;;;;;;;;;;22935:25;;22980:8;22971:6;;:17;;;;;;;;;;;;;;;;;;23035:8;23004:40;;23025:8;23004:40;;;;;;;;;;;;22924:128;22861:191;:::o;49083:287::-;49194:12;:10;:12::i;:::-;49182:24;;:8;:24;;;49178:54;;49215:17;;;;;;;;;;;;;;49178:54;49290:8;49245:18;:32;49264:12;:10;:12::i;:::-;49245:32;;;;;;;;;;;;;;;:42;49278:8;49245:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;49343:8;49314:48;;49329:12;:10;:12::i;:::-;49314:48;;;49353:8;49314:48;;;;;;:::i;:::-;;;;;;;;49083:287;;:::o;50169:316::-;50336:28;50346:4;50352:2;50356:7;50336:9;:28::i;:::-;50380:48;50403:4;50409:2;50413:7;50422:5;50380:22;:48::i;:::-;50375:102;;50437:40;;;;;;;;;;;;;;50375:102;50169:316;;;;:::o;16047:190::-;16172:4;16225;16196:25;16209:5;16216:4;16196:12;:25::i;:::-;:33;16189:40;;16047:190;;;;;:::o;61085:113::-;61145:13;61178:12;61171:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61085:113;:::o;62588:1745::-;62653:17;63087:4;63080;63074:11;63070:22;63179:1;63173:4;63166:15;63254:4;63251:1;63247:12;63240:19;;63336:1;63331:3;63324:14;63440:3;63679:5;63661:428;63687:1;63661:428;;;63727:1;63722:3;63718:11;63711:18;;63898:2;63892:4;63888:13;63884:2;63880:22;63875:3;63867:36;63992:2;63986:4;63982:13;63974:21;;64059:4;63661:428;64049:25;63661:428;63665:21;64128:3;64123;64119:13;64243:4;64238:3;64234:14;64227:21;;64308:6;64303:3;64296:19;62692:1634;;;62588:1745;;;:::o;55503:196::-;55645:2;55618:15;:24;55634:7;55618:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;55683:7;55679:2;55663:28;;55672:5;55663:28;;;;;;;;;;;;55503:196;;;:::o;53423:1962::-;53538:35;53576:20;53588:7;53576:11;:20::i;:::-;53538:58;;53609:22;53651:13;:18;;;53635:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;53710:12;:10;:12::i;:::-;53686:36;;:20;53698:7;53686:11;:20::i;:::-;:36;;;53635:87;:154;;;;53739:50;53756:13;:18;;;53776:12;:10;:12::i;:::-;53739:16;:50::i;:::-;53635:154;53609:181;;53808:17;53803:66;;53834:35;;;;;;;;;;;;;;53803:66;53906:4;53884:26;;:13;:18;;;:26;;;53880:67;;53919:28;;;;;;;;;;;;;;53880:67;53976:1;53962:16;;:2;:16;;;53958:52;;53987:23;;;;;;;;;;;;;;53958:52;54023:43;54045:4;54051:2;54055:7;54064:1;54023:21;:43::i;:::-;54131:49;54148:1;54152:7;54161:13;:18;;;54131:8;:49::i;:::-;54506:1;54476:12;:18;54489:4;54476:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54550:1;54522:12;:16;54535:2;54522:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54596:2;54568:11;:20;54580:7;54568:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;54658:15;54613:11;:20;54625:7;54613:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;54926:19;54958:1;54948:7;:11;54926:33;;55019:1;54978:43;;:11;:24;54990:11;54978:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;54974:295;;55046:20;55054:11;55046:7;:20::i;:::-;55042:212;;;55123:13;:18;;;55091:11;:24;55103:11;55091:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;55206:13;:28;;;55164:11;:24;55176:11;55164:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;55042:212;54974:295;54451:829;55316:7;55312:2;55297:27;;55306:4;55297:27;;;;;;;;;;;;55335:42;55356:4;55362:2;55366:7;55375:1;55335:20;:42::i;:::-;53527:1858;;53423:1962;;;:::o;51327:163::-;51450:32;51456:2;51460:8;51470:5;51477:4;51450:5;:32::i;:::-;51327:163;;;:::o;56264:765::-;56419:4;56440:15;:2;:13;;;:15::i;:::-;56436:586;;;56492:2;56476:36;;;56513:12;:10;:12::i;:::-;56527:4;56533:7;56542:5;56476:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;56472:495;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56739:1;56722:6;:13;:18;56718:234;;56749:40;;;;;;;;;;;;;;56718:234;56902:6;56896:13;56887:6;56883:2;56879:15;56872:38;56472:495;56609:45;;;56599:55;;;:6;:55;;;;56592:62;;;;;56436:586;57006:4;56999:11;;56264:765;;;;;;;:::o;16598:675::-;16681:7;16701:20;16724:4;16701:27;;16744:9;16739:497;16763:5;:12;16759:1;:16;16739:497;;;16797:20;16820:5;16826:1;16820:8;;;;;;;;:::i;:::-;;;;;;;;16797:31;;16863:12;16847;:28;16843:382;;16990:42;17005:12;17019;16990:14;:42::i;:::-;16975:57;;16843:382;;;17167:42;17182:12;17196;17167:14;:42::i;:::-;17152:57;;16843:382;16782:454;16777:3;;;;;:::i;:::-;;;;16739:497;;;;17253:12;17246:19;;;16598:675;;;;:::o;57517:159::-;;;;;:::o;58088:158::-;;;;;:::o;51749:1420::-;51888:20;51911:13;;51888:36;;51953:1;51939:16;;:2;:16;;;51935:48;;51964:19;;;;;;;;;;;;;;51935:48;52010:1;51998:8;:13;51994:44;;52020:18;;;;;;;;;;;;;;51994:44;52051:61;52081:1;52085:2;52089:12;52103:8;52051:21;:61::i;:::-;52427:8;52391:12;:16;52404:2;52391:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52492:8;52451:12;:16;52464:2;52451:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52551:2;52518:11;:25;52530:12;52518:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;52618:15;52568:11;:25;52580:12;52568:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;52651:20;52674:12;52651:35;;52708:9;52703:330;52723:8;52719:1;:12;52703:330;;;52787:12;52783:2;52762:38;;52779:1;52762:38;;;;;;;;;;;;52823:4;:68;;;;;52832:59;52863:1;52867:2;52871:12;52885:5;52832:22;:59::i;:::-;52831:60;52823:68;52819:164;;;52923:40;;;;;;;;;;;;;;52819:164;53003:14;;;;;;;52733:3;;;;;;;52703:330;;;;53065:12;53049:13;:28;;;;52366:723;53101:60;53130:1;53134:2;53138:12;53152:8;53101:20;:60::i;:::-;51877:1292;51749:1420;;;;:::o;24292:326::-;24352:4;24609:1;24587:7;:19;;;:23;24580:30;;24292:326;;;:::o;17281:224::-;17349:13;17412:1;17406:4;17399:15;17441:1;17435:4;17428:15;17482:4;17476;17466:21;17457:30;;17281:224;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:117::-;1627:1;1624;1617:12;1641:117;1750:1;1747;1740:12;1764:102;1805:6;1856:2;1852:7;1847:2;1840:5;1836:14;1832:28;1822:38;;1764:102;;;:::o;1872:180::-;1920:77;1917:1;1910:88;2017:4;2014:1;2007:15;2041:4;2038:1;2031:15;2058:281;2141:27;2163:4;2141:27;:::i;:::-;2133:6;2129:40;2271:6;2259:10;2256:22;2235:18;2223:10;2220:34;2217:62;2214:88;;;2282:18;;:::i;:::-;2214:88;2322:10;2318:2;2311:22;2101:238;2058:281;;:::o;2345:129::-;2379:6;2406:20;;:::i;:::-;2396:30;;2435:33;2463:4;2455:6;2435:33;:::i;:::-;2345:129;;;:::o;2480:308::-;2542:4;2632:18;2624:6;2621:30;2618:56;;;2654:18;;:::i;:::-;2618:56;2692:29;2714:6;2692:29;:::i;:::-;2684:37;;2776:4;2770;2766:15;2758:23;;2480:308;;;:::o;2794:146::-;2891:6;2886:3;2881;2868:30;2932:1;2923:6;2918:3;2914:16;2907:27;2794:146;;;:::o;2946:425::-;3024:5;3049:66;3065:49;3107:6;3065:49;:::i;:::-;3049:66;:::i;:::-;3040:75;;3138:6;3131:5;3124:21;3176:4;3169:5;3165:16;3214:3;3205:6;3200:3;3196:16;3193:25;3190:112;;;3221:79;;:::i;:::-;3190:112;3311:54;3358:6;3353:3;3348;3311:54;:::i;:::-;3030:341;2946:425;;;;;:::o;3391:340::-;3447:5;3496:3;3489:4;3481:6;3477:17;3473:27;3463:122;;3504:79;;:::i;:::-;3463:122;3621:6;3608:20;3646:79;3721:3;3713:6;3706:4;3698:6;3694:17;3646:79;:::i;:::-;3637:88;;3453:278;3391:340;;;;:::o;3737:509::-;3806:6;3855:2;3843:9;3834:7;3830:23;3826:32;3823:119;;;3861:79;;:::i;:::-;3823:119;4009:1;3998:9;3994:17;3981:31;4039:18;4031:6;4028:30;4025:117;;;4061:79;;:::i;:::-;4025:117;4166:63;4221:7;4212:6;4201:9;4197:22;4166:63;:::i;:::-;4156:73;;3952:287;3737:509;;;;:::o;4252:99::-;4304:6;4338:5;4332:12;4322:22;;4252:99;;;:::o;4357:169::-;4441:11;4475:6;4470:3;4463:19;4515:4;4510:3;4506:14;4491:29;;4357:169;;;;:::o;4532:246::-;4613:1;4623:113;4637:6;4634:1;4631:13;4623:113;;;4722:1;4717:3;4713:11;4707:18;4703:1;4698:3;4694:11;4687:39;4659:2;4656:1;4652:10;4647:15;;4623:113;;;4770:1;4761:6;4756:3;4752:16;4745:27;4594:184;4532:246;;;:::o;4784:377::-;4872:3;4900:39;4933:5;4900:39;:::i;:::-;4955:71;5019:6;5014:3;4955:71;:::i;:::-;4948:78;;5035:65;5093:6;5088:3;5081:4;5074:5;5070:16;5035:65;:::i;:::-;5125:29;5147:6;5125:29;:::i;:::-;5120:3;5116:39;5109:46;;4876:285;4784:377;;;;:::o;5167:313::-;5280:4;5318:2;5307:9;5303:18;5295:26;;5367:9;5361:4;5357:20;5353:1;5342:9;5338:17;5331:47;5395:78;5468:4;5459:6;5395:78;:::i;:::-;5387:86;;5167:313;;;;:::o;5486:77::-;5523:7;5552:5;5541:16;;5486:77;;;:::o;5569:118::-;5656:24;5674:5;5656:24;:::i;:::-;5651:3;5644:37;5569:118;;:::o;5693:222::-;5786:4;5824:2;5813:9;5809:18;5801:26;;5837:71;5905:1;5894:9;5890:17;5881:6;5837:71;:::i;:::-;5693:222;;;;:::o;5921:122::-;5994:24;6012:5;5994:24;:::i;:::-;5987:5;5984:35;5974:63;;6033:1;6030;6023:12;5974:63;5921:122;:::o;6049:139::-;6095:5;6133:6;6120:20;6111:29;;6149:33;6176:5;6149:33;:::i;:::-;6049:139;;;;:::o;6194:329::-;6253:6;6302:2;6290:9;6281:7;6277:23;6273:32;6270:119;;;6308:79;;:::i;:::-;6270:119;6428:1;6453:53;6498:7;6489:6;6478:9;6474:22;6453:53;:::i;:::-;6443:63;;6399:117;6194:329;;;;:::o;6529:126::-;6566:7;6606:42;6599:5;6595:54;6584:65;;6529:126;;;:::o;6661:96::-;6698:7;6727:24;6745:5;6727:24;:::i;:::-;6716:35;;6661:96;;;:::o;6763:118::-;6850:24;6868:5;6850:24;:::i;:::-;6845:3;6838:37;6763:118;;:::o;6887:222::-;6980:4;7018:2;7007:9;7003:18;6995:26;;7031:71;7099:1;7088:9;7084:17;7075:6;7031:71;:::i;:::-;6887:222;;;;:::o;7115:122::-;7188:24;7206:5;7188:24;:::i;:::-;7181:5;7178:35;7168:63;;7227:1;7224;7217:12;7168:63;7115:122;:::o;7243:139::-;7289:5;7327:6;7314:20;7305:29;;7343:33;7370:5;7343:33;:::i;:::-;7243:139;;;;:::o;7388:474::-;7456:6;7464;7513:2;7501:9;7492:7;7488:23;7484:32;7481:119;;;7519:79;;:::i;:::-;7481:119;7639:1;7664:53;7709:7;7700:6;7689:9;7685:22;7664:53;:::i;:::-;7654:63;;7610:117;7766:2;7792:53;7837:7;7828:6;7817:9;7813:22;7792:53;:::i;:::-;7782:63;;7737:118;7388:474;;;;;:::o;7868:329::-;7927:6;7976:2;7964:9;7955:7;7951:23;7947:32;7944:119;;;7982:79;;:::i;:::-;7944:119;8102:1;8127:53;8172:7;8163:6;8152:9;8148:22;8127:53;:::i;:::-;8117:63;;8073:117;7868:329;;;;:::o;8203:619::-;8280:6;8288;8296;8345:2;8333:9;8324:7;8320:23;8316:32;8313:119;;;8351:79;;:::i;:::-;8313:119;8471:1;8496:53;8541:7;8532:6;8521:9;8517:22;8496:53;:::i;:::-;8486:63;;8442:117;8598:2;8624:53;8669:7;8660:6;8649:9;8645:22;8624:53;:::i;:::-;8614:63;;8569:118;8726:2;8752:53;8797:7;8788:6;8777:9;8773:22;8752:53;:::i;:::-;8742:63;;8697:118;8203:619;;;;;:::o;8828:77::-;8865:7;8894:5;8883:16;;8828:77;;;:::o;8911:118::-;8998:24;9016:5;8998:24;:::i;:::-;8993:3;8986:37;8911:118;;:::o;9035:222::-;9128:4;9166:2;9155:9;9151:18;9143:26;;9179:71;9247:1;9236:9;9232:17;9223:6;9179:71;:::i;:::-;9035:222;;;;:::o;9263:60::-;9291:3;9312:5;9305:12;;9263:60;;;:::o;9329:142::-;9379:9;9412:53;9430:34;9439:24;9457:5;9439:24;:::i;:::-;9430:34;:::i;:::-;9412:53;:::i;:::-;9399:66;;9329:142;;;:::o;9477:126::-;9527:9;9560:37;9591:5;9560:37;:::i;:::-;9547:50;;9477:126;;;:::o;9609:157::-;9690:9;9723:37;9754:5;9723:37;:::i;:::-;9710:50;;9609:157;;;:::o;9772:193::-;9890:68;9952:5;9890:68;:::i;:::-;9885:3;9878:81;9772:193;;:::o;9971:284::-;10095:4;10133:2;10122:9;10118:18;10110:26;;10146:102;10245:1;10234:9;10230:17;10221:6;10146:102;:::i;:::-;9971:284;;;;:::o;10261:122::-;10334:24;10352:5;10334:24;:::i;:::-;10327:5;10324:35;10314:63;;10373:1;10370;10363:12;10314:63;10261:122;:::o;10389:139::-;10435:5;10473:6;10460:20;10451:29;;10489:33;10516:5;10489:33;:::i;:::-;10389:139;;;;:::o;10534:329::-;10593:6;10642:2;10630:9;10621:7;10617:23;10613:32;10610:119;;;10648:79;;:::i;:::-;10610:119;10768:1;10793:53;10838:7;10829:6;10818:9;10814:22;10793:53;:::i;:::-;10783:63;;10739:117;10534:329;;;;:::o;10869:116::-;10939:21;10954:5;10939:21;:::i;:::-;10932:5;10929:32;10919:60;;10975:1;10972;10965:12;10919:60;10869:116;:::o;10991:133::-;11034:5;11072:6;11059:20;11050:29;;11088:30;11112:5;11088:30;:::i;:::-;10991:133;;;;:::o;11130:468::-;11195:6;11203;11252:2;11240:9;11231:7;11227:23;11223:32;11220:119;;;11258:79;;:::i;:::-;11220:119;11378:1;11403:53;11448:7;11439:6;11428:9;11424:22;11403:53;:::i;:::-;11393:63;;11349:117;11505:2;11531:50;11573:7;11564:6;11553:9;11549:22;11531:50;:::i;:::-;11521:60;;11476:115;11130:468;;;;;:::o;11604:307::-;11665:4;11755:18;11747:6;11744:30;11741:56;;;11777:18;;:::i;:::-;11741:56;11815:29;11837:6;11815:29;:::i;:::-;11807:37;;11899:4;11893;11889:15;11881:23;;11604:307;;;:::o;11917:423::-;11994:5;12019:65;12035:48;12076:6;12035:48;:::i;:::-;12019:65;:::i;:::-;12010:74;;12107:6;12100:5;12093:21;12145:4;12138:5;12134:16;12183:3;12174:6;12169:3;12165:16;12162:25;12159:112;;;12190:79;;:::i;:::-;12159:112;12280:54;12327:6;12322:3;12317;12280:54;:::i;:::-;12000:340;11917:423;;;;;:::o;12359:338::-;12414:5;12463:3;12456:4;12448:6;12444:17;12440:27;12430:122;;12471:79;;:::i;:::-;12430:122;12588:6;12575:20;12613:78;12687:3;12679:6;12672:4;12664:6;12660:17;12613:78;:::i;:::-;12604:87;;12420:277;12359:338;;;;:::o;12703:943::-;12798:6;12806;12814;12822;12871:3;12859:9;12850:7;12846:23;12842:33;12839:120;;;12878:79;;:::i;:::-;12839:120;12998:1;13023:53;13068:7;13059:6;13048:9;13044:22;13023:53;:::i;:::-;13013:63;;12969:117;13125:2;13151:53;13196:7;13187:6;13176:9;13172:22;13151:53;:::i;:::-;13141:63;;13096:118;13253:2;13279:53;13324:7;13315:6;13304:9;13300:22;13279:53;:::i;:::-;13269:63;;13224:118;13409:2;13398:9;13394:18;13381:32;13440:18;13432:6;13429:30;13426:117;;;13462:79;;:::i;:::-;13426:117;13567:62;13621:7;13612:6;13601:9;13597:22;13567:62;:::i;:::-;13557:72;;13352:287;12703:943;;;;;;;:::o;13652:117::-;13761:1;13758;13751:12;13775:117;13884:1;13881;13874:12;13915:568;13988:8;13998:6;14048:3;14041:4;14033:6;14029:17;14025:27;14015:122;;14056:79;;:::i;:::-;14015:122;14169:6;14156:20;14146:30;;14199:18;14191:6;14188:30;14185:117;;;14221:79;;:::i;:::-;14185:117;14335:4;14327:6;14323:17;14311:29;;14389:3;14381:4;14373:6;14369:17;14359:8;14355:32;14352:41;14349:128;;;14396:79;;:::i;:::-;14349:128;13915:568;;;;;:::o;14489:849::-;14593:6;14601;14609;14617;14666:2;14654:9;14645:7;14641:23;14637:32;14634:119;;;14672:79;;:::i;:::-;14634:119;14792:1;14817:53;14862:7;14853:6;14842:9;14838:22;14817:53;:::i;:::-;14807:63;;14763:117;14919:2;14945:53;14990:7;14981:6;14970:9;14966:22;14945:53;:::i;:::-;14935:63;;14890:118;15075:2;15064:9;15060:18;15047:32;15106:18;15098:6;15095:30;15092:117;;;15128:79;;:::i;:::-;15092:117;15241:80;15313:7;15304:6;15293:9;15289:22;15241:80;:::i;:::-;15223:98;;;;15018:313;14489:849;;;;;;;:::o;15344:474::-;15412:6;15420;15469:2;15457:9;15448:7;15444:23;15440:32;15437:119;;;15475:79;;:::i;:::-;15437:119;15595:1;15620:53;15665:7;15656:6;15645:9;15641:22;15620:53;:::i;:::-;15610:63;;15566:117;15722:2;15748:53;15793:7;15784:6;15773:9;15769:22;15748:53;:::i;:::-;15738:63;;15693:118;15344:474;;;;;:::o;15824:311::-;15901:4;15991:18;15983:6;15980:30;15977:56;;;16013:18;;:::i;:::-;15977:56;16063:4;16055:6;16051:17;16043:25;;16123:4;16117;16113:15;16105:23;;15824:311;;;:::o;16158:710::-;16254:5;16279:81;16295:64;16352:6;16295:64;:::i;:::-;16279:81;:::i;:::-;16270:90;;16380:5;16409:6;16402:5;16395:21;16443:4;16436:5;16432:16;16425:23;;16496:4;16488:6;16484:17;16476:6;16472:30;16525:3;16517:6;16514:15;16511:122;;;16544:79;;:::i;:::-;16511:122;16659:6;16642:220;16676:6;16671:3;16668:15;16642:220;;;16751:3;16780:37;16813:3;16801:10;16780:37;:::i;:::-;16775:3;16768:50;16847:4;16842:3;16838:14;16831:21;;16718:144;16702:4;16697:3;16693:14;16686:21;;16642:220;;;16646:21;16260:608;;16158:710;;;;;:::o;16891:370::-;16962:5;17011:3;17004:4;16996:6;16992:17;16988:27;16978:122;;17019:79;;:::i;:::-;16978:122;17136:6;17123:20;17161:94;17251:3;17243:6;17236:4;17228:6;17224:17;17161:94;:::i;:::-;17152:103;;16968:293;16891:370;;;;:::o;17267:684::-;17360:6;17368;17417:2;17405:9;17396:7;17392:23;17388:32;17385:119;;;17423:79;;:::i;:::-;17385:119;17571:1;17560:9;17556:17;17543:31;17601:18;17593:6;17590:30;17587:117;;;17623:79;;:::i;:::-;17587:117;17728:78;17798:7;17789:6;17778:9;17774:22;17728:78;:::i;:::-;17718:88;;17514:302;17855:2;17881:53;17926:7;17917:6;17906:9;17902:22;17881:53;:::i;:::-;17871:63;;17826:118;17267:684;;;;;:::o;17957:182::-;18097:34;18093:1;18085:6;18081:14;18074:58;17957:182;:::o;18145:366::-;18287:3;18308:67;18372:2;18367:3;18308:67;:::i;:::-;18301:74;;18384:93;18473:3;18384:93;:::i;:::-;18502:2;18497:3;18493:12;18486:19;;18145:366;;;:::o;18517:419::-;18683:4;18721:2;18710:9;18706:18;18698:26;;18770:9;18764:4;18760:20;18756:1;18745:9;18741:17;18734:47;18798:131;18924:4;18798:131;:::i;:::-;18790:139;;18517:419;;;:::o;18942:180::-;18990:77;18987:1;18980:88;19087:4;19084:1;19077:15;19111:4;19108:1;19101:15;19128:320;19172:6;19209:1;19203:4;19199:12;19189:22;;19256:1;19250:4;19246:12;19277:18;19267:81;;19333:4;19325:6;19321:17;19311:27;;19267:81;19395:2;19387:6;19384:14;19364:18;19361:38;19358:84;;19414:18;;:::i;:::-;19358:84;19179:269;19128:320;;;:::o;19454:141::-;19503:4;19526:3;19518:11;;19549:3;19546:1;19539:14;19583:4;19580:1;19570:18;19562:26;;19454:141;;;:::o;19601:93::-;19638:6;19685:2;19680;19673:5;19669:14;19665:23;19655:33;;19601:93;;;:::o;19700:107::-;19744:8;19794:5;19788:4;19784:16;19763:37;;19700:107;;;;:::o;19813:393::-;19882:6;19932:1;19920:10;19916:18;19955:97;19985:66;19974:9;19955:97;:::i;:::-;20073:39;20103:8;20092:9;20073:39;:::i;:::-;20061:51;;20145:4;20141:9;20134:5;20130:21;20121:30;;20194:4;20184:8;20180:19;20173:5;20170:30;20160:40;;19889:317;;19813:393;;;;;:::o;20212:142::-;20262:9;20295:53;20313:34;20322:24;20340:5;20322:24;:::i;:::-;20313:34;:::i;:::-;20295:53;:::i;:::-;20282:66;;20212:142;;;:::o;20360:75::-;20403:3;20424:5;20417:12;;20360:75;;;:::o;20441:269::-;20551:39;20582:7;20551:39;:::i;:::-;20612:91;20661:41;20685:16;20661:41;:::i;:::-;20653:6;20646:4;20640:11;20612:91;:::i;:::-;20606:4;20599:105;20517:193;20441:269;;;:::o;20716:73::-;20761:3;20716:73;:::o;20795:189::-;20872:32;;:::i;:::-;20913:65;20971:6;20963;20957:4;20913:65;:::i;:::-;20848:136;20795:189;;:::o;20990:186::-;21050:120;21067:3;21060:5;21057:14;21050:120;;;21121:39;21158:1;21151:5;21121:39;:::i;:::-;21094:1;21087:5;21083:13;21074:22;;21050:120;;;20990:186;;:::o;21182:543::-;21283:2;21278:3;21275:11;21272:446;;;21317:38;21349:5;21317:38;:::i;:::-;21401:29;21419:10;21401:29;:::i;:::-;21391:8;21387:44;21584:2;21572:10;21569:18;21566:49;;;21605:8;21590:23;;21566:49;21628:80;21684:22;21702:3;21684:22;:::i;:::-;21674:8;21670:37;21657:11;21628:80;:::i;:::-;21287:431;;21272:446;21182:543;;;:::o;21731:117::-;21785:8;21835:5;21829:4;21825:16;21804:37;;21731:117;;;;:::o;21854:169::-;21898:6;21931:51;21979:1;21975:6;21967:5;21964:1;21960:13;21931:51;:::i;:::-;21927:56;22012:4;22006;22002:15;21992:25;;21905:118;21854:169;;;;:::o;22028:295::-;22104:4;22250:29;22275:3;22269:4;22250:29;:::i;:::-;22242:37;;22312:3;22309:1;22305:11;22299:4;22296:21;22288:29;;22028:295;;;;:::o;22328:1395::-;22445:37;22478:3;22445:37;:::i;:::-;22547:18;22539:6;22536:30;22533:56;;;22569:18;;:::i;:::-;22533:56;22613:38;22645:4;22639:11;22613:38;:::i;:::-;22698:67;22758:6;22750;22744:4;22698:67;:::i;:::-;22792:1;22816:4;22803:17;;22848:2;22840:6;22837:14;22865:1;22860:618;;;;23522:1;23539:6;23536:77;;;23588:9;23583:3;23579:19;23573:26;23564:35;;23536:77;23639:67;23699:6;23692:5;23639:67;:::i;:::-;23633:4;23626:81;23495:222;22830:887;;22860:618;22912:4;22908:9;22900:6;22896:22;22946:37;22978:4;22946:37;:::i;:::-;23005:1;23019:208;23033:7;23030:1;23027:14;23019:208;;;23112:9;23107:3;23103:19;23097:26;23089:6;23082:42;23163:1;23155:6;23151:14;23141:24;;23210:2;23199:9;23195:18;23182:31;;23056:4;23053:1;23049:12;23044:17;;23019:208;;;23255:6;23246:7;23243:19;23240:179;;;23313:9;23308:3;23304:19;23298:26;23356:48;23398:4;23390:6;23386:17;23375:9;23356:48;:::i;:::-;23348:6;23341:64;23263:156;23240:179;23465:1;23461;23453:6;23449:14;23445:22;23439:4;23432:36;22867:611;;;22830:887;;22420:1303;;;22328:1395;;:::o;23729:180::-;23777:77;23774:1;23767:88;23874:4;23871:1;23864:15;23898:4;23895:1;23888:15;23915:158;24055:10;24051:1;24043:6;24039:14;24032:34;23915:158;:::o;24079:365::-;24221:3;24242:66;24306:1;24301:3;24242:66;:::i;:::-;24235:73;;24317:93;24406:3;24317:93;:::i;:::-;24435:2;24430:3;24426:12;24419:19;;24079:365;;;:::o;24450:419::-;24616:4;24654:2;24643:9;24639:18;24631:26;;24703:9;24697:4;24693:20;24689:1;24678:9;24674:17;24667:47;24731:131;24857:4;24731:131;:::i;:::-;24723:139;;24450:419;;;:::o;24875:180::-;24923:77;24920:1;24913:88;25020:4;25017:1;25010:15;25044:4;25041:1;25034:15;25061:191;25101:3;25120:20;25138:1;25120:20;:::i;:::-;25115:25;;25154:20;25172:1;25154:20;:::i;:::-;25149:25;;25197:1;25194;25190:9;25183:16;;25218:3;25215:1;25212:10;25209:36;;;25225:18;;:::i;:::-;25209:36;25061:191;;;;:::o;25258:160::-;25398:12;25394:1;25386:6;25382:14;25375:36;25258:160;:::o;25424:366::-;25566:3;25587:67;25651:2;25646:3;25587:67;:::i;:::-;25580:74;;25663:93;25752:3;25663:93;:::i;:::-;25781:2;25776:3;25772:12;25765:19;;25424:366;;;:::o;25796:419::-;25962:4;26000:2;25989:9;25985:18;25977:26;;26049:9;26043:4;26039:20;26035:1;26024:9;26020:17;26013:47;26077:131;26203:4;26077:131;:::i;:::-;26069:139;;25796:419;;;:::o;26221:158::-;26361:10;26357:1;26349:6;26345:14;26338:34;26221:158;:::o;26385:365::-;26527:3;26548:66;26612:1;26607:3;26548:66;:::i;:::-;26541:73;;26623:93;26712:3;26623:93;:::i;:::-;26741:2;26736:3;26732:12;26725:19;;26385:365;;;:::o;26756:419::-;26922:4;26960:2;26949:9;26945:18;26937:26;;27009:9;27003:4;26999:20;26995:1;26984:9;26980:17;26973:47;27037:131;27163:4;27037:131;:::i;:::-;27029:139;;26756:419;;;:::o;27181:410::-;27221:7;27244:20;27262:1;27244:20;:::i;:::-;27239:25;;27278:20;27296:1;27278:20;:::i;:::-;27273:25;;27333:1;27330;27326:9;27355:30;27373:11;27355:30;:::i;:::-;27344:41;;27534:1;27525:7;27521:15;27518:1;27515:22;27495:1;27488:9;27468:83;27445:139;;27564:18;;:::i;:::-;27445:139;27229:362;27181:410;;;;:::o;27597:163::-;27737:15;27733:1;27725:6;27721:14;27714:39;27597:163;:::o;27766:366::-;27908:3;27929:67;27993:2;27988:3;27929:67;:::i;:::-;27922:74;;28005:93;28094:3;28005:93;:::i;:::-;28123:2;28118:3;28114:12;28107:19;;27766:366;;;:::o;28138:419::-;28304:4;28342:2;28331:9;28327:18;28319:26;;28391:9;28385:4;28381:20;28377:1;28366:9;28362:17;28355:47;28419:131;28545:4;28419:131;:::i;:::-;28411:139;;28138:419;;;:::o;28563:94::-;28596:8;28644:5;28640:2;28636:14;28615:35;;28563:94;;;:::o;28663:::-;28702:7;28731:20;28745:5;28731:20;:::i;:::-;28720:31;;28663:94;;;:::o;28763:100::-;28802:7;28831:26;28851:5;28831:26;:::i;:::-;28820:37;;28763:100;;;:::o;28869:157::-;28974:45;28994:24;29012:5;28994:24;:::i;:::-;28974:45;:::i;:::-;28969:3;28962:58;28869:157;;:::o;29032:79::-;29071:7;29100:5;29089:16;;29032:79;;;:::o;29117:157::-;29222:45;29242:24;29260:5;29242:24;:::i;:::-;29222:45;:::i;:::-;29217:3;29210:58;29117:157;;:::o;29280:397::-;29420:3;29435:75;29506:3;29497:6;29435:75;:::i;:::-;29535:2;29530:3;29526:12;29519:19;;29548:75;29619:3;29610:6;29548:75;:::i;:::-;29648:2;29643:3;29639:12;29632:19;;29668:3;29661:10;;29280:397;;;;;:::o;29683:171::-;29823:23;29819:1;29811:6;29807:14;29800:47;29683:171;:::o;29860:366::-;30002:3;30023:67;30087:2;30082:3;30023:67;:::i;:::-;30016:74;;30099:93;30188:3;30099:93;:::i;:::-;30217:2;30212:3;30208:12;30201:19;;29860:366;;;:::o;30232:419::-;30398:4;30436:2;30425:9;30421:18;30413:26;;30485:9;30479:4;30475:20;30471:1;30460:9;30456:17;30449:47;30513:131;30639:4;30513:131;:::i;:::-;30505:139;;30232:419;;;:::o;30657:162::-;30797:14;30793:1;30785:6;30781:14;30774:38;30657:162;:::o;30825:366::-;30967:3;30988:67;31052:2;31047:3;30988:67;:::i;:::-;30981:74;;31064:93;31153:3;31064:93;:::i;:::-;31182:2;31177:3;31173:12;31166:19;;30825:366;;;:::o;31197:419::-;31363:4;31401:2;31390:9;31386:18;31378:26;;31450:9;31444:4;31440:20;31436:1;31425:9;31421:17;31414:47;31478:131;31604:4;31478:131;:::i;:::-;31470:139;;31197:419;;;:::o;31622:148::-;31724:11;31761:3;31746:18;;31622:148;;;;:::o;31776:390::-;31882:3;31910:39;31943:5;31910:39;:::i;:::-;31965:89;32047:6;32042:3;31965:89;:::i;:::-;31958:96;;32063:65;32121:6;32116:3;32109:4;32102:5;32098:16;32063:65;:::i;:::-;32153:6;32148:3;32144:16;32137:23;;31886:280;31776:390;;;;:::o;32172:435::-;32352:3;32374:95;32465:3;32456:6;32374:95;:::i;:::-;32367:102;;32486:95;32577:3;32568:6;32486:95;:::i;:::-;32479:102;;32598:3;32591:10;;32172:435;;;;;:::o;32613:164::-;32753:16;32749:1;32741:6;32737:14;32730:40;32613:164;:::o;32783:366::-;32925:3;32946:67;33010:2;33005:3;32946:67;:::i;:::-;32939:74;;33022:93;33111:3;33022:93;:::i;:::-;33140:2;33135:3;33131:12;33124:19;;32783:366;;;:::o;33155:419::-;33321:4;33359:2;33348:9;33344:18;33336:26;;33408:9;33402:4;33398:20;33394:1;33383:9;33379:17;33372:47;33436:131;33562:4;33436:131;:::i;:::-;33428:139;;33155:419;;;:::o;33580:180::-;33628:77;33625:1;33618:88;33725:4;33722:1;33715:15;33749:4;33746:1;33739:15;33766:233;33805:3;33828:24;33846:5;33828:24;:::i;:::-;33819:33;;33874:66;33867:5;33864:77;33861:103;;33944:18;;:::i;:::-;33861:103;33991:1;33984:5;33980:13;33973:20;;33766:233;;;:::o;34005:225::-;34145:34;34141:1;34133:6;34129:14;34122:58;34214:8;34209:2;34201:6;34197:15;34190:33;34005:225;:::o;34236:366::-;34378:3;34399:67;34463:2;34458:3;34399:67;:::i;:::-;34392:74;;34475:93;34564:3;34475:93;:::i;:::-;34593:2;34588:3;34584:12;34577:19;;34236:366;;;:::o;34608:419::-;34774:4;34812:2;34801:9;34797:18;34789:26;;34861:9;34855:4;34851:20;34847:1;34836:9;34832:17;34825:47;34889:131;35015:4;34889:131;:::i;:::-;34881:139;;34608:419;;;:::o;35033:332::-;35154:4;35192:2;35181:9;35177:18;35169:26;;35205:71;35273:1;35262:9;35258:17;35249:6;35205:71;:::i;:::-;35286:72;35354:2;35343:9;35339:18;35330:6;35286:72;:::i;:::-;35033:332;;;;;:::o;35371:137::-;35425:5;35456:6;35450:13;35441:22;;35472:30;35496:5;35472:30;:::i;:::-;35371:137;;;;:::o;35514:345::-;35581:6;35630:2;35618:9;35609:7;35605:23;35601:32;35598:119;;;35636:79;;:::i;:::-;35598:119;35756:1;35781:61;35834:7;35825:6;35814:9;35810:22;35781:61;:::i;:::-;35771:71;;35727:125;35514:345;;;;:::o;35865:98::-;35916:6;35950:5;35944:12;35934:22;;35865:98;;;:::o;35969:168::-;36052:11;36086:6;36081:3;36074:19;36126:4;36121:3;36117:14;36102:29;;35969:168;;;;:::o;36143:373::-;36229:3;36257:38;36289:5;36257:38;:::i;:::-;36311:70;36374:6;36369:3;36311:70;:::i;:::-;36304:77;;36390:65;36448:6;36443:3;36436:4;36429:5;36425:16;36390:65;:::i;:::-;36480:29;36502:6;36480:29;:::i;:::-;36475:3;36471:39;36464:46;;36233:283;36143:373;;;;:::o;36522:640::-;36717:4;36755:3;36744:9;36740:19;36732:27;;36769:71;36837:1;36826:9;36822:17;36813:6;36769:71;:::i;:::-;36850:72;36918:2;36907:9;36903:18;36894:6;36850:72;:::i;:::-;36932;37000:2;36989:9;36985:18;36976:6;36932:72;:::i;:::-;37051:9;37045:4;37041:20;37036:2;37025:9;37021:18;37014:48;37079:76;37150:4;37141:6;37079:76;:::i;:::-;37071:84;;36522:640;;;;;;;:::o;37168:141::-;37224:5;37255:6;37249:13;37240:22;;37271:32;37297:5;37271:32;:::i;:::-;37168:141;;;;:::o;37315:349::-;37384:6;37433:2;37421:9;37412:7;37408:23;37404:32;37401:119;;;37439:79;;:::i;:::-;37401:119;37559:1;37584:63;37639:7;37630:6;37619:9;37615:22;37584:63;:::i;:::-;37574:73;;37530:127;37315:349;;;;:::o
Swarm Source
ipfs://1e39997e7e76ee19c1e01d0098c1f795ef24057741ee11f7cb8b661002c0be69
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.