Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 105 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 20447662 | 124 days ago | IN | 0 ETH | 0.00007196 | ||||
Set Approval For... | 18764346 | 359 days ago | IN | 0 ETH | 0.00212883 | ||||
Set Approval For... | 17437980 | 545 days ago | IN | 0 ETH | 0.00095902 | ||||
Update Base URI | 16472208 | 681 days ago | IN | 0 ETH | 0.00076147 | ||||
Set Mint Active | 16472140 | 681 days ago | IN | 0 ETH | 0.00040783 | ||||
Withdraw Eth | 16472129 | 681 days ago | IN | 0 ETH | 0.00060568 | ||||
Negate | 16472030 | 681 days ago | IN | 0.025 ETH | 0.00568306 | ||||
Negate | 16471940 | 681 days ago | IN | 0.025 ETH | 0.00404762 | ||||
Set Mint Active | 16471937 | 681 days ago | IN | 0 ETH | 0.00089414 | ||||
Set Mint Active | 16465794 | 682 days ago | IN | 0 ETH | 0.00036984 | ||||
Update Base URI | 16465739 | 682 days ago | IN | 0 ETH | 0.00063338 | ||||
Negate | 16456606 | 683 days ago | IN | 0.025 ETH | 0.00339662 | ||||
Negate | 16456600 | 683 days ago | IN | 0.025 ETH | 0.00411811 | ||||
Set Approval For... | 15682873 | 792 days ago | IN | 0 ETH | 0.00246749 | ||||
Transfer From | 14985823 | 901 days ago | IN | 0 ETH | 0.00448796 | ||||
Update Base URI | 14778005 | 935 days ago | IN | 0 ETH | 0.00066377 | ||||
Update Base URI | 14777992 | 935 days ago | IN | 0 ETH | 0.00066998 | ||||
Update Base URI | 14777859 | 935 days ago | IN | 0 ETH | 0.00091518 | ||||
Withdraw Eth | 14699859 | 947 days ago | IN | 0 ETH | 0.00276022 | ||||
Negate | 14611331 | 961 days ago | IN | 0.025 ETH | 0.00790428 | ||||
Set Approval For... | 14380325 | 997 days ago | IN | 0 ETH | 0.0014802 | ||||
Negate | 14044797 | 1049 days ago | IN | 0.025 ETH | 0.02882515 | ||||
Update Base URI | 13949693 | 1064 days ago | IN | 0 ETH | 0.00380885 | ||||
Negate | 13901194 | 1072 days ago | IN | 0.025 ETH | 0.02636148 | ||||
Negate | 13864406 | 1077 days ago | IN | 0.025 ETH | 0.01495628 |
Loading...
Loading
Contract Name:
Negative721
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-21 */ /** NEGATIVE Loucas Braconnier/Figure31, contract by Jonathan Chomko December 2021 **/ // File: @openzeppelin/contracts/utils/EnumerableSet.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 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"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/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 GSN 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/AccessControl.sol // File @openzeppelin/contracts/access/[email protected] 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() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: @openzeppelin/contracts/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/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`, 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 Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @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; } // File: @openzeppelin/contracts/token/ERC721/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/IERC721Enumerable.sol pragma solidity ^0.8.0; // /** // * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension // * @dev See https://eips.ethereum.org/EIPS/eip-721 // */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/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 `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } // File: @openzeppelin/contracts/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ abstract contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } // File: @openzeppelin/contracts/utils/EnumerableMap.sol pragma solidity ^0.8.0; /** * @dev Library for managing an enumerable variant of Solidity's * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`] * type. * * Maps have the following properties: * * - Entries are added, removed, and checked for existence in constant time * (O(1)). * - Entries are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableMap for EnumerableMap.UintToAddressMap; * * // Declare a set state variable * EnumerableMap.UintToAddressMap private myMap; * } * ``` * * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are * supported. */ library EnumerableMap { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Map type with // bytes32 keys and values. // The Map implementation uses private functions, and user-facing // implementations (such as Uint256ToAddressMap) are just wrappers around // the underlying Map. // This means that we can only create new EnumerableMaps for types that fit // in bytes32. struct MapEntry { bytes32 _key; bytes32 _value; } struct Map { // Storage of map keys and values MapEntry[] _entries; // Position of the entry defined by a key in the `entries` array, plus 1 // because index 0 means a key is not in the map. mapping (bytes32 => uint256) _indexes; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) { // Equivalent to !contains(map, key) map._entries.push(MapEntry({ _key: key, _value: value })); // The entry is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value map._indexes[key] = map._entries.length; return true; } else { map._entries[keyIndex - 1]._value = value; return false; } } /** * @dev Removes a key-value pair from a map. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function _remove(Map storage map, bytes32 key) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex != 0) { // Equivalent to contains(map, key) // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one // in the array, and then remove the last entry (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = keyIndex - 1; uint256 lastIndex = map._entries.length - 1; // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. MapEntry storage lastEntry = map._entries[lastIndex]; // Move the last entry to the index where the entry to delete is map._entries[toDeleteIndex] = lastEntry; // Update the index for the moved entry map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved entry was stored map._entries.pop(); // Delete the index for the deleted slot delete map._indexes[key]; return true; } else { return false; } } /** * @dev Returns true if the key is in the map. O(1). */ function _contains(Map storage map, bytes32 key) private view returns (bool) { return map._indexes[key] != 0; } /** * @dev Returns the number of key-value pairs in the map. O(1). */ function _length(Map storage map) private view returns (uint256) { return map._entries.length; } /** * @dev Returns the key-value pair stored at position `index` in the map. O(1). * * Note that there are no guarantees on the ordering of entries inside the * array, and it may change when more entries are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) { require(map._entries.length > index, "EnumerableMap: index out of bounds"); MapEntry storage entry = map._entries[index]; return (entry._key, entry._value); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. */ function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) { uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key) return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function _get(Map storage map, bytes32 key) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } /** * @dev Same as {_get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {_tryGet}. */ function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } // UintToAddressMap struct UintToAddressMap { Map _inner; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) { return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) { return _remove(map._inner, bytes32(key)); } /** * @dev Returns true if the key is in the map. O(1). */ function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) { return _contains(map._inner, bytes32(key)); } /** * @dev Returns the number of elements in the map. O(1). */ function length(UintToAddressMap storage map) internal view returns (uint256) { return _length(map._inner); } /** * @dev Returns the element stored at position `index` in the set. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) { (bytes32 key, bytes32 value) = _at(map._inner, index); return (uint256(key), address(uint160(uint256(value)))); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. * * _Available since v3.4._ */ function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) { (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key)); return (success, address(uint160(uint256(value)))); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function get(UintToAddressMap storage map, uint256 key) internal view returns (address) { return address(uint160(uint256(_get(map._inner, bytes32(key))))); } /** * @dev Same as {get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryGet}. */ function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) { return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage)))); } } 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/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using EnumerableSet for EnumerableSet.UintSet; using EnumerableMap for EnumerableMap.UintToAddressMap; using Strings for uint256; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from holder address to their (enumerable) set of owned tokens mapping (address => EnumerableSet.UintSet) private _holderTokens; // Enumerable mapping from token ids to their owners EnumerableMap.UintToAddressMap private _tokenOwners; // 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; // Token name string private _name; // Token symbol string private _symbol; // Optional mapping for token URIs - not used with on-chain // mapping (uint256 => string) private _tokenURIs; // Base URI string private _baseURI; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; /* * bytes4(keccak256('name()')) == 0x06fdde03 * bytes4(keccak256('symbol()')) == 0x95d89b41 * bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd * * => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f */ bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; /* * bytes4(keccak256('totalSupply()')) == 0x18160ddd * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59 * bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7 * * => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63 */ bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); _registerInterface(_INTERFACE_ID_ERC721_METADATA); _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _holderTokens[owner].length(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token"); } /** * @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) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); // return json from folder // string memory output = string(abi.encodePacked(baseURI(), tokenId.toString(), ".json")); // return string(abi.encodePacked(baseURI(), tokenId.toString(), ".json")); return string(abi.encodePacked(baseURI(),tokenId.toString(),".json")); // return "hello"; } //Return contract metadata for opensea view function contractURI() public view returns (string memory) { return string(abi.encodePacked(baseURI(), "contract_metadata", '.json')); } /** * @dev Returns the base URI set via {_setBaseURI}. This will be * automatically added as a prefix in {tokenURI} to each token's URI, or * to the token ID if no specific URI is set for that token ID. */ function baseURI() public view virtual returns (string memory) { return _baseURI; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { return _holderTokens[owner].at(index); } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds return _tokenOwners.length(); } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { (uint256 tokenId, ) = _tokenOwners.at(index); return tokenId; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || ERC721.isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _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 { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _tokenOwners.contains(tokenId); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || ERC721.isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: d* * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); // internal owner _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); // Clear metadata (if any) // if (bytes(_tokenURIs[tokenId]).length != 0) { // delete _tokenURIs[tokenId]; // } _holderTokens[owner].remove(tokenId); _tokenOwners.remove(tokenId); emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); // internal owner require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _holderTokens[from].remove(tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(from, to, tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ // function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { // require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token"); // _tokenURIs[tokenId] = _tokenURI; // } /** * @dev Internal function to set the base URI for all token IDs. It is * automatically added as a prefix to the value returned in {tokenURI}, * or to the token ID if {tokenURI} is empty. */ function _setBaseURI(string memory baseURI_) internal virtual { _baseURI = baseURI_; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (!to.isContract()) { return true; } bytes memory returndata = to.functionCall(abi.encodeWithSelector( IERC721Receiver(to).onERC721Received.selector, _msgSender(), from, tokenId, _data ), "ERC721: transfer to non ERC721Receiver implementer"); bytes4 retval = abi.decode(returndata, (bytes4)); return (retval == _ERC721_RECEIVED); } function _approve(address to, uint256 tokenId) private { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); // internal owner } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { } } // File: contracts/Rocks721.sol pragma solidity ^0.8.0; /** * @dev {ERC721} token, including: * * - ability for holders to burn (destroy) their tokens * - a minter role that allows for token minting (creation) * - token ID and URI autogeneration * * This contract uses {AccessControl} to lock permissioned functions using the * different roles - head to its documentation for details. * * The account that deploys the contract will be granted the minter and pauser * roles, as well as the default admin role, which will let it grant both minter * and pauser roles to other accounts. */ contract Negative721 is Context, ERC721, Ownable { address payable public withdrawalAddress; uint256 public tokenCounter; bool public mintActive; uint256 public pricePerPiece; mapping (bytes32 => bool) public negatedTokens; event Negate(address minter, uint256 price, address contractToNegate, uint256 tokenIdToNegate); event MetadataUpdated(string newTokenUriBase); constructor( uint256 givenPricePerPiece, address payable givenWithdrawalAddress, string memory givenTokenURIBase ) ERC721("NEGATIVE", "-") { pricePerPiece = givenPricePerPiece; withdrawalAddress = givenWithdrawalAddress; _setBaseURI(givenTokenURIBase); tokenCounter = 0; } //Change base uri function updateBaseURI(string memory givenTokenURIBase) public onlyOwner{ _setBaseURI(givenTokenURIBase); } function setMintActive(bool isActive) public onlyOwner { mintActive = isActive; } //Price setting function setPrice(uint256 givenPrice) external onlyOwner { pricePerPiece = givenPrice; } //Withdrawal function setWithdrawalAddress(address payable givenWithdrawalAddress) public onlyOwner { withdrawalAddress = givenWithdrawalAddress; } function withdrawEth() public onlyOwner { Address.sendValue(withdrawalAddress, address(this).balance); } //Owner info function tokenInfo(uint256 tokenId) public view returns (address) { return (ownerOf(tokenId)); } function getOwners(uint256 start, uint256 end) public view returns (address[] memory){ address[] memory re = new address[](end - start); for (uint256 i = start; i < end; i++) { re[i - start] = ownerOf(i); } return re; } function negate(address contractToNegate, uint256 tokenIdToNegate) public payable returns(uint256){ require(msg.value >= pricePerPiece, "not enough eth sent"); require(mintActive || msg.sender == owner(), "sale not open"); require(!negatedTokens[keccak256(abi.encodePacked(contractToNegate, tokenIdToNegate))], "token is already minted"); negatedTokens[keccak256(abi.encodePacked(contractToNegate, tokenIdToNegate))] = true; emit Negate(msg.sender, pricePerPiece, contractToNegate, tokenIdToNegate); uint256 tokenToMint = tokenCounter; _safeMint(msg.sender, tokenToMint); tokenCounter ++; return tokenToMint; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"givenPricePerPiece","type":"uint256"},{"internalType":"address payable","name":"givenWithdrawalAddress","type":"address"},{"internalType":"string","name":"givenTokenURIBase","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"newTokenUriBase","type":"string"}],"name":"MetadataUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"address","name":"contractToNegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenIdToNegate","type":"uint256"}],"name":"Negate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"getOwners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractToNegate","type":"address"},{"internalType":"uint256","name":"tokenIdToNegate","type":"uint256"}],"name":"negate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"negatedTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricePerPiece","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isActive","type":"bool"}],"name":"setMintActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"givenPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"givenWithdrawalAddress","type":"address"}],"name":"setWithdrawalAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenInfo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"givenTokenURIBase","type":"string"}],"name":"updateBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawalAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162005009380380620050098339818101604052810190620000379190620004aa565b6040518060400160405280600881526020017f4e454741544956450000000000000000000000000000000000000000000000008152506040518060400160405280600181526020017f2d00000000000000000000000000000000000000000000000000000000000000815250620000bb6301ffc9a760e01b6200025260201b60201c565b8160069080519060200190620000d39291906200034e565b508060079080519060200190620000ec9291906200034e565b50620001056380ac58cd60e01b6200025260201b60201c565b6200011d635b5e139f60e01b6200025260201b60201c565b6200013563780e9d6360e01b6200025260201b60201c565b50506000620001496200032a60201b60201c565b905080600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35082600d8190555081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000241816200033260201b60201c565b6000600b819055505050506200079e565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415620002be576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002b5906200054c565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b80600890805190602001906200034a9291906200034e565b5050565b8280546200035c9062000652565b90600052602060002090601f016020900481019282620003805760008555620003cc565b82601f106200039b57805160ff1916838001178555620003cc565b82800160010185558215620003cc579182015b82811115620003cb578251825591602001919060010190620003ae565b5b509050620003db9190620003df565b5090565b5b80821115620003fa576000816000905550600101620003e0565b5090565b6000620004156200040f8462000597565b6200056e565b90508281526020810184848401111562000434576200043362000721565b5b620004418482856200061c565b509392505050565b6000815190506200045a816200076a565b92915050565b600082601f8301126200047857620004776200071c565b5b81516200048a848260208601620003fe565b91505092915050565b600081519050620004a48162000784565b92915050565b600080600060608486031215620004c657620004c56200072b565b5b6000620004d68682870162000493565b9350506020620004e98682870162000449565b925050604084015167ffffffffffffffff8111156200050d576200050c62000726565b5b6200051b8682870162000460565b9150509250925092565b600062000534601c83620005cd565b9150620005418262000741565b602082019050919050565b60006020820190508181036000830152620005678162000525565b9050919050565b60006200057a6200058d565b905062000588828262000688565b919050565b6000604051905090565b600067ffffffffffffffff821115620005b557620005b4620006ed565b5b620005c08262000730565b9050602081019050919050565b600082825260208201905092915050565b6000620005eb82620005f2565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200063c5780820151818401526020810190506200061f565b838111156200064c576000848401525b50505050565b600060028204905060018216806200066b57607f821691505b60208210811415620006825762000681620006be565b5b50919050565b620006938262000730565b810181811067ffffffffffffffff82111715620006b557620006b4620006ed565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433136353a20696e76616c696420696e7465726661636520696400000000600082015250565b6200077581620005de565b81146200078157600080fd5b50565b6200078f8162000612565b81146200079b57600080fd5b50565b61485b80620007ae6000396000f3fe6080604052600436106101f95760003560e01c8063715018a61161010d578063c87b56dd116100a0578063e8a3d4851161006f578063e8a3d4851461075e578063e985e9c514610789578063ee1cc944146107c6578063f2bcd022146107ef578063f2fde38b1461081a576101f9565b8063c87b56dd14610689578063cc33c875146106c6578063d082e38114610703578063e2ca52181461072e576101f9565b806395d89b41116100dc57806395d89b41146105f5578063a0ef91df14610620578063a22cb46514610637578063b88d4fde14610660576101f9565b8063715018a6146105615780638da5cb5b1461057857806391b7f5ed146105a3578063931688cb146105cc576101f9565b806323b872dd116101905780634f6ccce71161015f5780634f6ccce714610454578063575ca2c7146104915780636352211e146104bc5780636c0360eb146104f957806370a0823114610524576101f9565b806323b872dd1461039a57806325fd90f3146103c35780632f745c59146103ee57806342842e0e1461042b576101f9565b8063081812fc116101cc578063081812fc146102e0578063095ea7b31461031d57806318160ddd1461034657806321b8092e14610371576101f9565b806301ffc9a7146101fe578063048220581461023b57806305196db01461027857806306fdde03146102b5575b600080fd5b34801561020a57600080fd5b506102256004803603810190610220919061306e565b610843565b604051610232919061388f565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d919061313e565b6108aa565b60405161026f919061386d565b60405180910390f35b34801561028457600080fd5b5061029f600480360381019061029a9190613041565b610991565b6040516102ac919061388f565b60405180910390f35b3480156102c157600080fd5b506102ca6109b1565b6040516102d791906138aa565b60405180910390f35b3480156102ec57600080fd5b5061030760048036038101906103029190613111565b610a43565b60405161031491906137a6565b60405180910390f35b34801561032957600080fd5b50610344600480360381019061033f9190612fd4565b610ac8565b005b34801561035257600080fd5b5061035b610be0565b6040516103689190613bcc565b60405180910390f35b34801561037d57600080fd5b5061039860048036038101906103939190612e51565b610bf1565b005b3480156103a657600080fd5b506103c160048036038101906103bc9190612ebe565b610cb1565b005b3480156103cf57600080fd5b506103d8610d11565b6040516103e5919061388f565b60405180910390f35b3480156103fa57600080fd5b5061041560048036038101906104109190612fd4565b610d24565b6040516104229190613bcc565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d9190612ebe565b610d7f565b005b34801561046057600080fd5b5061047b60048036038101906104769190613111565b610d9f565b6040516104889190613bcc565b60405180910390f35b34801561049d57600080fd5b506104a6610dc2565b6040516104b39190613bcc565b60405180910390f35b3480156104c857600080fd5b506104e360048036038101906104de9190613111565b610dc8565b6040516104f091906137a6565b60405180910390f35b34801561050557600080fd5b5061050e610dff565b60405161051b91906138aa565b60405180910390f35b34801561053057600080fd5b5061054b60048036038101906105469190612e24565b610e91565b6040516105589190613bcc565b60405180910390f35b34801561056d57600080fd5b50610576610f50565b005b34801561058457600080fd5b5061058d61108d565b60405161059a91906137a6565b60405180910390f35b3480156105af57600080fd5b506105ca60048036038101906105c59190613111565b6110b7565b005b3480156105d857600080fd5b506105f360048036038101906105ee91906130c8565b61113d565b005b34801561060157600080fd5b5061060a6111c5565b60405161061791906138aa565b60405180910390f35b34801561062c57600080fd5b50610635611257565b005b34801561064357600080fd5b5061065e60048036038101906106599190612f94565b611301565b005b34801561066c57600080fd5b5061068760048036038101906106829190612f11565b611482565b005b34801561069557600080fd5b506106b060048036038101906106ab9190613111565b6114e4565b6040516106bd91906138aa565b60405180910390f35b3480156106d257600080fd5b506106ed60048036038101906106e89190613111565b611566565b6040516106fa91906137a6565b60405180910390f35b34801561070f57600080fd5b50610718611578565b6040516107259190613bcc565b60405180910390f35b61074860048036038101906107439190612fd4565b61157e565b6040516107559190613bcc565b60405180910390f35b34801561076a57600080fd5b506107736117a0565b60405161078091906138aa565b60405180910390f35b34801561079557600080fd5b506107b060048036038101906107ab9190612e7e565b6117ce565b6040516107bd919061388f565b60405180910390f35b3480156107d257600080fd5b506107ed60048036038101906107e89190613014565b611862565b005b3480156107fb57600080fd5b506108046118fb565b60405161081191906137c1565b60405180910390f35b34801561082657600080fd5b50610841600480360381019061083c9190612e24565b611921565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060600083836108ba9190613d7c565b67ffffffffffffffff8111156108d3576108d2614078565b5b6040519080825280602002602001820160405280156109015781602001602082028036833780820191505090505b50905060008490505b838110156109865761091b81610dc8565b8286836109289190613d7c565b8151811061093957610938614049565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050808061097e90613ee5565b91505061090a565b508091505092915050565b600e6020528060005260406000206000915054906101000a900460ff1681565b6060600680546109c090613e82565b80601f01602080910402602001604051908101604052809291908181526020018280546109ec90613e82565b8015610a395780601f10610a0e57610100808354040283529160200191610a39565b820191906000526020600020905b815481529060010190602001808311610a1c57829003601f168201915b5050505050905090565b6000610a4e82611acd565b610a8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8490613a8c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ad382610dc8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3b90613b2c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b63611aea565b73ffffffffffffffffffffffffffffffffffffffff161480610b925750610b9181610b8c611aea565b6117ce565b5b610bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc890613a0c565b60405180910390fd5b610bdb8383611af2565b505050565b6000610bec6002611bab565b905090565b610bf9611aea565b73ffffffffffffffffffffffffffffffffffffffff16610c1761108d565b73ffffffffffffffffffffffffffffffffffffffff1614610c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6490613aac565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610cc2610cbc611aea565b82611bc0565b610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf890613b4c565b60405180910390fd5b610d0c838383611c9e565b505050565b600c60009054906101000a900460ff1681565b6000610d7782600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611eb590919063ffffffff16565b905092915050565b610d9a83838360405180602001604052806000815250611482565b505050565b600080610db6836002611ecf90919063ffffffff16565b50905080915050919050565b600d5481565b6000610df8826040518060600160405280602981526020016147fd602991396002611efb9092919063ffffffff16565b9050919050565b606060088054610e0e90613e82565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3a90613e82565b8015610e875780601f10610e5c57610100808354040283529160200191610e87565b820191906000526020600020905b815481529060010190602001808311610e6a57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef990613a2c565b60405180910390fd5b610f49600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611f1a565b9050919050565b610f58611aea565b73ffffffffffffffffffffffffffffffffffffffff16610f7661108d565b73ffffffffffffffffffffffffffffffffffffffff1614610fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc390613aac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6110bf611aea565b73ffffffffffffffffffffffffffffffffffffffff166110dd61108d565b73ffffffffffffffffffffffffffffffffffffffff1614611133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112a90613aac565b60405180910390fd5b80600d8190555050565b611145611aea565b73ffffffffffffffffffffffffffffffffffffffff1661116361108d565b73ffffffffffffffffffffffffffffffffffffffff16146111b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b090613aac565b60405180910390fd5b6111c281611f2f565b50565b6060600780546111d490613e82565b80601f016020809104026020016040519081016040528092919081815260200182805461120090613e82565b801561124d5780601f106112225761010080835404028352916020019161124d565b820191906000526020600020905b81548152906001019060200180831161123057829003601f168201915b5050505050905090565b61125f611aea565b73ffffffffffffffffffffffffffffffffffffffff1661127d61108d565b73ffffffffffffffffffffffffffffffffffffffff16146112d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ca90613aac565b60405180910390fd5b6112ff600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1647611f49565b565b611309611aea565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611377576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136e9061396c565b60405180910390fd5b8060056000611384611aea565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611431611aea565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611476919061388f565b60405180910390a35050565b61149361148d611aea565b83611bc0565b6114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c990613b4c565b60405180910390fd5b6114de8484848461203d565b50505050565b60606114ef82611acd565b61152e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152590613aec565b60405180910390fd5b611536610dff565b61153f83612099565b604051602001611550929190613735565b6040516020818303038152906040529050919050565b600061157182610dc8565b9050919050565b600b5481565b6000600d543410156115c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bc90613b8c565b60405180910390fd5b600c60009054906101000a900460ff168061161257506115e361108d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611651576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164890613b0c565b60405180910390fd5b600e600084846040516020016116689291906136f2565b60405160208183030381529060405280519060200120815260200190815260200160002060009054906101000a900460ff16156116da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d190613bac565b60405180910390fd5b6001600e600085856040516020016116f39291906136f2565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff0219169083151502179055507f5fb040992534e913b8cbaf2d36e32901b12d29863486cf17f824f1d06bd6f77533600d5485856040516117659493929190613828565b60405180910390a16000600b54905061177e33826121fa565b600b600081548092919061179190613ee5565b91905055508091505092915050565b60606117aa610dff565b6040516020016117ba9190613764565b604051602081830303815290604052905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61186a611aea565b73ffffffffffffffffffffffffffffffffffffffff1661188861108d565b73ffffffffffffffffffffffffffffffffffffffff16146118de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d590613aac565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611929611aea565b73ffffffffffffffffffffffffffffffffffffffff1661194761108d565b73ffffffffffffffffffffffffffffffffffffffff161461199d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199490613aac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a049061390c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611ae382600261221890919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b6583610dc8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611bb982600001612232565b9050919050565b6000611bcb82611acd565b611c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c01906139ec565b60405180910390fd5b6000611c1583610dc8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c8457508373ffffffffffffffffffffffffffffffffffffffff16611c6c84610a43565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c955750611c9481856117ce565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611cbe82610dc8565b73ffffffffffffffffffffffffffffffffffffffff1614611d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0b90613acc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7b9061394c565b60405180910390fd5b611d8f838383612243565b611d9a600082611af2565b611deb81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061224890919063ffffffff16565b50611e3d81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061226290919063ffffffff16565b50611e548183600261227c9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000611ec483600001836122b1565b60001c905092915050565b600080600080611ee28660000186612325565b915091508160001c8160001c9350935050509250929050565b6000611f0e846000018460001b846123af565b60001c90509392505050565b6000611f2882600001612450565b9050919050565b8060089080519060200190611f45929190612c0e565b5050565b80471015611f8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f83906139ac565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611fb290613791565b60006040518083038185875af1925050503d8060008114611fef576040519150601f19603f3d011682016040523d82523d6000602084013e611ff4565b606091505b5050905080612038576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202f9061398c565b60405180910390fd5b505050565b612048848484611c9e565b61205484848484612461565b612093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208a906138ec565b60405180910390fd5b50505050565b606060008214156120e1576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506121f5565b600082905060005b600082146121135780806120fc90613ee5565b915050600a8261210c9190613d4b565b91506120e9565b60008167ffffffffffffffff81111561212f5761212e614078565b5b6040519080825280601f01601f1916602001820160405280156121615781602001600182028036833780820191505090505b5090505b600085146121ee5760018261217a9190613d7c565b9150600a856121899190613f5c565b60306121959190613cf5565b60f81b8183815181106121ab576121aa614049565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121e79190613d4b565b9450612165565b8093505050505b919050565b6122148282604051806020016040528060008152506125c5565b5050565b600061222a836000018360001b612620565b905092915050565b600081600001805490509050919050565b505050565b600061225a836000018360001b612643565b905092915050565b6000612274836000018360001b61275b565b905092915050565b60006122a8846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b6127cb565b90509392505050565b6000818360000180549050116122fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f3906138cc565b60405180910390fd5b82600001828154811061231257612311614049565b5b9060005260206000200154905092915050565b60008082846000018054905011612371576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236890613a4c565b60405180910390fd5b600084600001848154811061238957612388614049565b5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240891906138aa565b60405180910390fd5b50846000016001826124239190613d7c565b8154811061243457612433614049565b5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b60006124828473ffffffffffffffffffffffffffffffffffffffff166128b7565b61248f57600190506125bd565b600061255663150b7a0260e01b6124a4611aea565b8887876040516024016124ba94939291906137dc565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518060600160405280603281526020016147cb603291398773ffffffffffffffffffffffffffffffffffffffff166128ca9092919063ffffffff16565b905060008180602001905181019061256e919061309b565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b6125cf83836128e2565b6125dc6000848484612461565b61261b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612612906138ec565b60405180910390fd5b505050565b600080836001016000848152602001908152602001600020541415905092915050565b6000808360010160008481526020019081526020016000205490506000811461274f5760006001826126759190613d7c565b905060006001866000018054905061268d9190613d7c565b905060008660000182815481106126a7576126a6614049565b5b90600052602060002001549050808760000184815481106126cb576126ca614049565b5b90600052602060002001819055506001836126e69190613cf5565b87600101600083815260200190815260200160002081905550866000018054806127135761271261401a565b5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612755565b60009150505b92915050565b60006127678383612a70565b6127c05782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506127c5565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415612872578460000160405180604001604052808681526020018581525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505084600001805490508560010160008681526020019081526020016000208190555060019150506128b0565b82856000016001836128849190613d7c565b8154811061289557612894614049565b5b90600052602060002090600202016001018190555060009150505b9392505050565b600080823b905060008111915050919050565b60606128d98484600085612a93565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294990613a6c565b60405180910390fd5b61295b81611acd565b1561299b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129929061392c565b60405180910390fd5b6129a760008383612243565b6129f881600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061226290919063ffffffff16565b50612a0f8183600261227c9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080836001016000848152602001908152602001600020541415905092915050565b606082471015612ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acf906139cc565b60405180910390fd5b612ae1856128b7565b612b20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1790613b6c565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612b49919061371e565b60006040518083038185875af1925050503d8060008114612b86576040519150601f19603f3d011682016040523d82523d6000602084013e612b8b565b606091505b5091509150612b9b828286612ba7565b92505050949350505050565b60608315612bb757829050612c07565b600083511115612bca5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfe91906138aa565b60405180910390fd5b9392505050565b828054612c1a90613e82565b90600052602060002090601f016020900481019282612c3c5760008555612c83565b82601f10612c5557805160ff1916838001178555612c83565b82800160010185558215612c83579182015b82811115612c82578251825591602001919060010190612c67565b5b509050612c909190612c94565b5090565b5b80821115612cad576000816000905550600101612c95565b5090565b6000612cc4612cbf84613c0c565b613be7565b905082815260208101848484011115612ce057612cdf6140ac565b5b612ceb848285613e40565b509392505050565b6000612d06612d0184613c3d565b613be7565b905082815260208101848484011115612d2257612d216140ac565b5b612d2d848285613e40565b509392505050565b600081359050612d4481614740565b92915050565b600081359050612d5981614757565b92915050565b600081359050612d6e8161476e565b92915050565b600081359050612d8381614785565b92915050565b600081359050612d988161479c565b92915050565b600081519050612dad8161479c565b92915050565b600082601f830112612dc857612dc76140a7565b5b8135612dd8848260208601612cb1565b91505092915050565b600082601f830112612df657612df56140a7565b5b8135612e06848260208601612cf3565b91505092915050565b600081359050612e1e816147b3565b92915050565b600060208284031215612e3a57612e396140b6565b5b6000612e4884828501612d35565b91505092915050565b600060208284031215612e6757612e666140b6565b5b6000612e7584828501612d4a565b91505092915050565b60008060408385031215612e9557612e946140b6565b5b6000612ea385828601612d35565b9250506020612eb485828601612d35565b9150509250929050565b600080600060608486031215612ed757612ed66140b6565b5b6000612ee586828701612d35565b9350506020612ef686828701612d35565b9250506040612f0786828701612e0f565b9150509250925092565b60008060008060808587031215612f2b57612f2a6140b6565b5b6000612f3987828801612d35565b9450506020612f4a87828801612d35565b9350506040612f5b87828801612e0f565b925050606085013567ffffffffffffffff811115612f7c57612f7b6140b1565b5b612f8887828801612db3565b91505092959194509250565b60008060408385031215612fab57612faa6140b6565b5b6000612fb985828601612d35565b9250506020612fca85828601612d5f565b9150509250929050565b60008060408385031215612feb57612fea6140b6565b5b6000612ff985828601612d35565b925050602061300a85828601612e0f565b9150509250929050565b60006020828403121561302a576130296140b6565b5b600061303884828501612d5f565b91505092915050565b600060208284031215613057576130566140b6565b5b600061306584828501612d74565b91505092915050565b600060208284031215613084576130836140b6565b5b600061309284828501612d89565b91505092915050565b6000602082840312156130b1576130b06140b6565b5b60006130bf84828501612d9e565b91505092915050565b6000602082840312156130de576130dd6140b6565b5b600082013567ffffffffffffffff8111156130fc576130fb6140b1565b5b61310884828501612de1565b91505092915050565b600060208284031215613127576131266140b6565b5b600061313584828501612e0f565b91505092915050565b60008060408385031215613155576131546140b6565b5b600061316385828601612e0f565b925050602061317485828601612e0f565b9150509250929050565b600061318a83836131a5565b60208301905092915050565b61319f81613dc2565b82525050565b6131ae81613db0565b82525050565b6131bd81613db0565b82525050565b6131d46131cf82613db0565b613f2e565b82525050565b60006131e582613c7e565b6131ef8185613cac565b93506131fa83613c6e565b8060005b8381101561322b578151613212888261317e565b975061321d83613c9f565b9250506001810190506131fe565b5085935050505092915050565b61324181613dd4565b82525050565b600061325282613c89565b61325c8185613cbd565b935061326c818560208601613e4f565b613275816140bb565b840191505092915050565b600061328b82613c89565b6132958185613cce565b93506132a5818560208601613e4f565b80840191505092915050565b60006132bc82613c94565b6132c68185613cd9565b93506132d6818560208601613e4f565b6132df816140bb565b840191505092915050565b60006132f582613c94565b6132ff8185613cea565b935061330f818560208601613e4f565b80840191505092915050565b6000613328602283613cd9565b9150613333826140d9565b604082019050919050565b600061334b603283613cd9565b915061335682614128565b604082019050919050565b600061336e602683613cd9565b915061337982614177565b604082019050919050565b6000613391601c83613cd9565b915061339c826141c6565b602082019050919050565b60006133b4602483613cd9565b91506133bf826141ef565b604082019050919050565b60006133d7601983613cd9565b91506133e28261423e565b602082019050919050565b60006133fa603a83613cd9565b915061340582614267565b604082019050919050565b600061341d601d83613cd9565b9150613428826142b6565b602082019050919050565b6000613440602683613cd9565b915061344b826142df565b604082019050919050565b6000613463602c83613cd9565b915061346e8261432e565b604082019050919050565b6000613486601183613cea565b91506134918261437d565b601182019050919050565b60006134a9603883613cd9565b91506134b4826143a6565b604082019050919050565b60006134cc602a83613cd9565b91506134d7826143f5565b604082019050919050565b60006134ef602283613cd9565b91506134fa82614444565b604082019050919050565b6000613512602083613cd9565b915061351d82614493565b602082019050919050565b6000613535602c83613cd9565b9150613540826144bc565b604082019050919050565b6000613558600583613cea565b91506135638261450b565b600582019050919050565b600061357b602083613cd9565b915061358682614534565b602082019050919050565b600061359e602983613cd9565b91506135a98261455d565b604082019050919050565b60006135c1602f83613cd9565b91506135cc826145ac565b604082019050919050565b60006135e4600d83613cd9565b91506135ef826145fb565b602082019050919050565b6000613607602183613cd9565b915061361282614624565b604082019050919050565b600061362a600083613cce565b915061363582614673565b600082019050919050565b600061364d603183613cd9565b915061365882614676565b604082019050919050565b6000613670601d83613cd9565b915061367b826146c5565b602082019050919050565b6000613693601383613cd9565b915061369e826146ee565b602082019050919050565b60006136b6601783613cd9565b91506136c182614717565b602082019050919050565b6136d581613e36565b82525050565b6136ec6136e782613e36565b613f52565b82525050565b60006136fe82856131c3565b60148201915061370e82846136db565b6020820191508190509392505050565b600061372a8284613280565b915081905092915050565b600061374182856132ea565b915061374d82846132ea565b91506137588261354b565b91508190509392505050565b600061377082846132ea565b915061377b82613479565b91506137868261354b565b915081905092915050565b600061379c8261361d565b9150819050919050565b60006020820190506137bb60008301846131b4565b92915050565b60006020820190506137d66000830184613196565b92915050565b60006080820190506137f160008301876131b4565b6137fe60208301866131b4565b61380b60408301856136cc565b818103606083015261381d8184613247565b905095945050505050565b600060808201905061383d60008301876131b4565b61384a60208301866136cc565b61385760408301856131b4565b61386460608301846136cc565b95945050505050565b6000602082019050818103600083015261388781846131da565b905092915050565b60006020820190506138a46000830184613238565b92915050565b600060208201905081810360008301526138c481846132b1565b905092915050565b600060208201905081810360008301526138e58161331b565b9050919050565b600060208201905081810360008301526139058161333e565b9050919050565b6000602082019050818103600083015261392581613361565b9050919050565b6000602082019050818103600083015261394581613384565b9050919050565b60006020820190508181036000830152613965816133a7565b9050919050565b60006020820190508181036000830152613985816133ca565b9050919050565b600060208201905081810360008301526139a5816133ed565b9050919050565b600060208201905081810360008301526139c581613410565b9050919050565b600060208201905081810360008301526139e581613433565b9050919050565b60006020820190508181036000830152613a0581613456565b9050919050565b60006020820190508181036000830152613a258161349c565b9050919050565b60006020820190508181036000830152613a45816134bf565b9050919050565b60006020820190508181036000830152613a65816134e2565b9050919050565b60006020820190508181036000830152613a8581613505565b9050919050565b60006020820190508181036000830152613aa581613528565b9050919050565b60006020820190508181036000830152613ac58161356e565b9050919050565b60006020820190508181036000830152613ae581613591565b9050919050565b60006020820190508181036000830152613b05816135b4565b9050919050565b60006020820190508181036000830152613b25816135d7565b9050919050565b60006020820190508181036000830152613b45816135fa565b9050919050565b60006020820190508181036000830152613b6581613640565b9050919050565b60006020820190508181036000830152613b8581613663565b9050919050565b60006020820190508181036000830152613ba581613686565b9050919050565b60006020820190508181036000830152613bc5816136a9565b9050919050565b6000602082019050613be160008301846136cc565b92915050565b6000613bf1613c02565b9050613bfd8282613eb4565b919050565b6000604051905090565b600067ffffffffffffffff821115613c2757613c26614078565b5b613c30826140bb565b9050602081019050919050565b600067ffffffffffffffff821115613c5857613c57614078565b5b613c61826140bb565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613d0082613e36565b9150613d0b83613e36565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d4057613d3f613f8d565b5b828201905092915050565b6000613d5682613e36565b9150613d6183613e36565b925082613d7157613d70613fbc565b5b828204905092915050565b6000613d8782613e36565b9150613d9283613e36565b925082821015613da557613da4613f8d565b5b828203905092915050565b6000613dbb82613e16565b9050919050565b6000613dcd82613e16565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613e6d578082015181840152602081019050613e52565b83811115613e7c576000848401525b50505050565b60006002820490506001821680613e9a57607f821691505b60208210811415613eae57613ead613feb565b5b50919050565b613ebd826140bb565b810181811067ffffffffffffffff82111715613edc57613edb614078565b5b80604052505050565b6000613ef082613e36565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f2357613f22613f8d565b5b600182019050919050565b6000613f3982613f40565b9050919050565b6000613f4b826140cc565b9050919050565b6000819050919050565b6000613f6782613e36565b9150613f7283613e36565b925082613f8257613f81613fbc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f636f6e74726163745f6d65746164617461000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f73616c65206e6f74206f70656e00000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f6e6f7420656e6f756768206574682073656e7400000000000000000000000000600082015250565b7f746f6b656e20697320616c7265616479206d696e746564000000000000000000600082015250565b61474981613db0565b811461475457600080fd5b50565b61476081613dc2565b811461476b57600080fd5b50565b61477781613dd4565b811461478257600080fd5b50565b61478e81613de0565b811461479957600080fd5b50565b6147a581613dea565b81146147b057600080fd5b50565b6147bc81613e36565b81146147c757600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220d2b21069746da17c1664dd534f079b1b1fde066eaf12249509fcce2d28af47e964736f6c634300080700330000000000000000000000000000000000000000000000000058d15e176280000000000000000000000000005a73badaee01abb988d12c5e030b1857437abad700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101f95760003560e01c8063715018a61161010d578063c87b56dd116100a0578063e8a3d4851161006f578063e8a3d4851461075e578063e985e9c514610789578063ee1cc944146107c6578063f2bcd022146107ef578063f2fde38b1461081a576101f9565b8063c87b56dd14610689578063cc33c875146106c6578063d082e38114610703578063e2ca52181461072e576101f9565b806395d89b41116100dc57806395d89b41146105f5578063a0ef91df14610620578063a22cb46514610637578063b88d4fde14610660576101f9565b8063715018a6146105615780638da5cb5b1461057857806391b7f5ed146105a3578063931688cb146105cc576101f9565b806323b872dd116101905780634f6ccce71161015f5780634f6ccce714610454578063575ca2c7146104915780636352211e146104bc5780636c0360eb146104f957806370a0823114610524576101f9565b806323b872dd1461039a57806325fd90f3146103c35780632f745c59146103ee57806342842e0e1461042b576101f9565b8063081812fc116101cc578063081812fc146102e0578063095ea7b31461031d57806318160ddd1461034657806321b8092e14610371576101f9565b806301ffc9a7146101fe578063048220581461023b57806305196db01461027857806306fdde03146102b5575b600080fd5b34801561020a57600080fd5b506102256004803603810190610220919061306e565b610843565b604051610232919061388f565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d919061313e565b6108aa565b60405161026f919061386d565b60405180910390f35b34801561028457600080fd5b5061029f600480360381019061029a9190613041565b610991565b6040516102ac919061388f565b60405180910390f35b3480156102c157600080fd5b506102ca6109b1565b6040516102d791906138aa565b60405180910390f35b3480156102ec57600080fd5b5061030760048036038101906103029190613111565b610a43565b60405161031491906137a6565b60405180910390f35b34801561032957600080fd5b50610344600480360381019061033f9190612fd4565b610ac8565b005b34801561035257600080fd5b5061035b610be0565b6040516103689190613bcc565b60405180910390f35b34801561037d57600080fd5b5061039860048036038101906103939190612e51565b610bf1565b005b3480156103a657600080fd5b506103c160048036038101906103bc9190612ebe565b610cb1565b005b3480156103cf57600080fd5b506103d8610d11565b6040516103e5919061388f565b60405180910390f35b3480156103fa57600080fd5b5061041560048036038101906104109190612fd4565b610d24565b6040516104229190613bcc565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d9190612ebe565b610d7f565b005b34801561046057600080fd5b5061047b60048036038101906104769190613111565b610d9f565b6040516104889190613bcc565b60405180910390f35b34801561049d57600080fd5b506104a6610dc2565b6040516104b39190613bcc565b60405180910390f35b3480156104c857600080fd5b506104e360048036038101906104de9190613111565b610dc8565b6040516104f091906137a6565b60405180910390f35b34801561050557600080fd5b5061050e610dff565b60405161051b91906138aa565b60405180910390f35b34801561053057600080fd5b5061054b60048036038101906105469190612e24565b610e91565b6040516105589190613bcc565b60405180910390f35b34801561056d57600080fd5b50610576610f50565b005b34801561058457600080fd5b5061058d61108d565b60405161059a91906137a6565b60405180910390f35b3480156105af57600080fd5b506105ca60048036038101906105c59190613111565b6110b7565b005b3480156105d857600080fd5b506105f360048036038101906105ee91906130c8565b61113d565b005b34801561060157600080fd5b5061060a6111c5565b60405161061791906138aa565b60405180910390f35b34801561062c57600080fd5b50610635611257565b005b34801561064357600080fd5b5061065e60048036038101906106599190612f94565b611301565b005b34801561066c57600080fd5b5061068760048036038101906106829190612f11565b611482565b005b34801561069557600080fd5b506106b060048036038101906106ab9190613111565b6114e4565b6040516106bd91906138aa565b60405180910390f35b3480156106d257600080fd5b506106ed60048036038101906106e89190613111565b611566565b6040516106fa91906137a6565b60405180910390f35b34801561070f57600080fd5b50610718611578565b6040516107259190613bcc565b60405180910390f35b61074860048036038101906107439190612fd4565b61157e565b6040516107559190613bcc565b60405180910390f35b34801561076a57600080fd5b506107736117a0565b60405161078091906138aa565b60405180910390f35b34801561079557600080fd5b506107b060048036038101906107ab9190612e7e565b6117ce565b6040516107bd919061388f565b60405180910390f35b3480156107d257600080fd5b506107ed60048036038101906107e89190613014565b611862565b005b3480156107fb57600080fd5b506108046118fb565b60405161081191906137c1565b60405180910390f35b34801561082657600080fd5b50610841600480360381019061083c9190612e24565b611921565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060600083836108ba9190613d7c565b67ffffffffffffffff8111156108d3576108d2614078565b5b6040519080825280602002602001820160405280156109015781602001602082028036833780820191505090505b50905060008490505b838110156109865761091b81610dc8565b8286836109289190613d7c565b8151811061093957610938614049565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050808061097e90613ee5565b91505061090a565b508091505092915050565b600e6020528060005260406000206000915054906101000a900460ff1681565b6060600680546109c090613e82565b80601f01602080910402602001604051908101604052809291908181526020018280546109ec90613e82565b8015610a395780601f10610a0e57610100808354040283529160200191610a39565b820191906000526020600020905b815481529060010190602001808311610a1c57829003601f168201915b5050505050905090565b6000610a4e82611acd565b610a8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8490613a8c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ad382610dc8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3b90613b2c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b63611aea565b73ffffffffffffffffffffffffffffffffffffffff161480610b925750610b9181610b8c611aea565b6117ce565b5b610bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc890613a0c565b60405180910390fd5b610bdb8383611af2565b505050565b6000610bec6002611bab565b905090565b610bf9611aea565b73ffffffffffffffffffffffffffffffffffffffff16610c1761108d565b73ffffffffffffffffffffffffffffffffffffffff1614610c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6490613aac565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610cc2610cbc611aea565b82611bc0565b610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf890613b4c565b60405180910390fd5b610d0c838383611c9e565b505050565b600c60009054906101000a900460ff1681565b6000610d7782600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611eb590919063ffffffff16565b905092915050565b610d9a83838360405180602001604052806000815250611482565b505050565b600080610db6836002611ecf90919063ffffffff16565b50905080915050919050565b600d5481565b6000610df8826040518060600160405280602981526020016147fd602991396002611efb9092919063ffffffff16565b9050919050565b606060088054610e0e90613e82565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3a90613e82565b8015610e875780601f10610e5c57610100808354040283529160200191610e87565b820191906000526020600020905b815481529060010190602001808311610e6a57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef990613a2c565b60405180910390fd5b610f49600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611f1a565b9050919050565b610f58611aea565b73ffffffffffffffffffffffffffffffffffffffff16610f7661108d565b73ffffffffffffffffffffffffffffffffffffffff1614610fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc390613aac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6110bf611aea565b73ffffffffffffffffffffffffffffffffffffffff166110dd61108d565b73ffffffffffffffffffffffffffffffffffffffff1614611133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112a90613aac565b60405180910390fd5b80600d8190555050565b611145611aea565b73ffffffffffffffffffffffffffffffffffffffff1661116361108d565b73ffffffffffffffffffffffffffffffffffffffff16146111b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b090613aac565b60405180910390fd5b6111c281611f2f565b50565b6060600780546111d490613e82565b80601f016020809104026020016040519081016040528092919081815260200182805461120090613e82565b801561124d5780601f106112225761010080835404028352916020019161124d565b820191906000526020600020905b81548152906001019060200180831161123057829003601f168201915b5050505050905090565b61125f611aea565b73ffffffffffffffffffffffffffffffffffffffff1661127d61108d565b73ffffffffffffffffffffffffffffffffffffffff16146112d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ca90613aac565b60405180910390fd5b6112ff600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1647611f49565b565b611309611aea565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611377576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136e9061396c565b60405180910390fd5b8060056000611384611aea565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611431611aea565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611476919061388f565b60405180910390a35050565b61149361148d611aea565b83611bc0565b6114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c990613b4c565b60405180910390fd5b6114de8484848461203d565b50505050565b60606114ef82611acd565b61152e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152590613aec565b60405180910390fd5b611536610dff565b61153f83612099565b604051602001611550929190613735565b6040516020818303038152906040529050919050565b600061157182610dc8565b9050919050565b600b5481565b6000600d543410156115c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bc90613b8c565b60405180910390fd5b600c60009054906101000a900460ff168061161257506115e361108d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611651576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164890613b0c565b60405180910390fd5b600e600084846040516020016116689291906136f2565b60405160208183030381529060405280519060200120815260200190815260200160002060009054906101000a900460ff16156116da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d190613bac565b60405180910390fd5b6001600e600085856040516020016116f39291906136f2565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff0219169083151502179055507f5fb040992534e913b8cbaf2d36e32901b12d29863486cf17f824f1d06bd6f77533600d5485856040516117659493929190613828565b60405180910390a16000600b54905061177e33826121fa565b600b600081548092919061179190613ee5565b91905055508091505092915050565b60606117aa610dff565b6040516020016117ba9190613764565b604051602081830303815290604052905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61186a611aea565b73ffffffffffffffffffffffffffffffffffffffff1661188861108d565b73ffffffffffffffffffffffffffffffffffffffff16146118de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d590613aac565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611929611aea565b73ffffffffffffffffffffffffffffffffffffffff1661194761108d565b73ffffffffffffffffffffffffffffffffffffffff161461199d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199490613aac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a049061390c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611ae382600261221890919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b6583610dc8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611bb982600001612232565b9050919050565b6000611bcb82611acd565b611c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c01906139ec565b60405180910390fd5b6000611c1583610dc8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c8457508373ffffffffffffffffffffffffffffffffffffffff16611c6c84610a43565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c955750611c9481856117ce565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611cbe82610dc8565b73ffffffffffffffffffffffffffffffffffffffff1614611d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0b90613acc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7b9061394c565b60405180910390fd5b611d8f838383612243565b611d9a600082611af2565b611deb81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061224890919063ffffffff16565b50611e3d81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061226290919063ffffffff16565b50611e548183600261227c9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000611ec483600001836122b1565b60001c905092915050565b600080600080611ee28660000186612325565b915091508160001c8160001c9350935050509250929050565b6000611f0e846000018460001b846123af565b60001c90509392505050565b6000611f2882600001612450565b9050919050565b8060089080519060200190611f45929190612c0e565b5050565b80471015611f8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f83906139ac565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611fb290613791565b60006040518083038185875af1925050503d8060008114611fef576040519150601f19603f3d011682016040523d82523d6000602084013e611ff4565b606091505b5050905080612038576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202f9061398c565b60405180910390fd5b505050565b612048848484611c9e565b61205484848484612461565b612093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208a906138ec565b60405180910390fd5b50505050565b606060008214156120e1576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506121f5565b600082905060005b600082146121135780806120fc90613ee5565b915050600a8261210c9190613d4b565b91506120e9565b60008167ffffffffffffffff81111561212f5761212e614078565b5b6040519080825280601f01601f1916602001820160405280156121615781602001600182028036833780820191505090505b5090505b600085146121ee5760018261217a9190613d7c565b9150600a856121899190613f5c565b60306121959190613cf5565b60f81b8183815181106121ab576121aa614049565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121e79190613d4b565b9450612165565b8093505050505b919050565b6122148282604051806020016040528060008152506125c5565b5050565b600061222a836000018360001b612620565b905092915050565b600081600001805490509050919050565b505050565b600061225a836000018360001b612643565b905092915050565b6000612274836000018360001b61275b565b905092915050565b60006122a8846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b6127cb565b90509392505050565b6000818360000180549050116122fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f3906138cc565b60405180910390fd5b82600001828154811061231257612311614049565b5b9060005260206000200154905092915050565b60008082846000018054905011612371576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236890613a4c565b60405180910390fd5b600084600001848154811061238957612388614049565b5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240891906138aa565b60405180910390fd5b50846000016001826124239190613d7c565b8154811061243457612433614049565b5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b60006124828473ffffffffffffffffffffffffffffffffffffffff166128b7565b61248f57600190506125bd565b600061255663150b7a0260e01b6124a4611aea565b8887876040516024016124ba94939291906137dc565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518060600160405280603281526020016147cb603291398773ffffffffffffffffffffffffffffffffffffffff166128ca9092919063ffffffff16565b905060008180602001905181019061256e919061309b565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b6125cf83836128e2565b6125dc6000848484612461565b61261b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612612906138ec565b60405180910390fd5b505050565b600080836001016000848152602001908152602001600020541415905092915050565b6000808360010160008481526020019081526020016000205490506000811461274f5760006001826126759190613d7c565b905060006001866000018054905061268d9190613d7c565b905060008660000182815481106126a7576126a6614049565b5b90600052602060002001549050808760000184815481106126cb576126ca614049565b5b90600052602060002001819055506001836126e69190613cf5565b87600101600083815260200190815260200160002081905550866000018054806127135761271261401a565b5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612755565b60009150505b92915050565b60006127678383612a70565b6127c05782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506127c5565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415612872578460000160405180604001604052808681526020018581525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505084600001805490508560010160008681526020019081526020016000208190555060019150506128b0565b82856000016001836128849190613d7c565b8154811061289557612894614049565b5b90600052602060002090600202016001018190555060009150505b9392505050565b600080823b905060008111915050919050565b60606128d98484600085612a93565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294990613a6c565b60405180910390fd5b61295b81611acd565b1561299b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129929061392c565b60405180910390fd5b6129a760008383612243565b6129f881600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061226290919063ffffffff16565b50612a0f8183600261227c9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080836001016000848152602001908152602001600020541415905092915050565b606082471015612ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acf906139cc565b60405180910390fd5b612ae1856128b7565b612b20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1790613b6c565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612b49919061371e565b60006040518083038185875af1925050503d8060008114612b86576040519150601f19603f3d011682016040523d82523d6000602084013e612b8b565b606091505b5091509150612b9b828286612ba7565b92505050949350505050565b60608315612bb757829050612c07565b600083511115612bca5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfe91906138aa565b60405180910390fd5b9392505050565b828054612c1a90613e82565b90600052602060002090601f016020900481019282612c3c5760008555612c83565b82601f10612c5557805160ff1916838001178555612c83565b82800160010185558215612c83579182015b82811115612c82578251825591602001919060010190612c67565b5b509050612c909190612c94565b5090565b5b80821115612cad576000816000905550600101612c95565b5090565b6000612cc4612cbf84613c0c565b613be7565b905082815260208101848484011115612ce057612cdf6140ac565b5b612ceb848285613e40565b509392505050565b6000612d06612d0184613c3d565b613be7565b905082815260208101848484011115612d2257612d216140ac565b5b612d2d848285613e40565b509392505050565b600081359050612d4481614740565b92915050565b600081359050612d5981614757565b92915050565b600081359050612d6e8161476e565b92915050565b600081359050612d8381614785565b92915050565b600081359050612d988161479c565b92915050565b600081519050612dad8161479c565b92915050565b600082601f830112612dc857612dc76140a7565b5b8135612dd8848260208601612cb1565b91505092915050565b600082601f830112612df657612df56140a7565b5b8135612e06848260208601612cf3565b91505092915050565b600081359050612e1e816147b3565b92915050565b600060208284031215612e3a57612e396140b6565b5b6000612e4884828501612d35565b91505092915050565b600060208284031215612e6757612e666140b6565b5b6000612e7584828501612d4a565b91505092915050565b60008060408385031215612e9557612e946140b6565b5b6000612ea385828601612d35565b9250506020612eb485828601612d35565b9150509250929050565b600080600060608486031215612ed757612ed66140b6565b5b6000612ee586828701612d35565b9350506020612ef686828701612d35565b9250506040612f0786828701612e0f565b9150509250925092565b60008060008060808587031215612f2b57612f2a6140b6565b5b6000612f3987828801612d35565b9450506020612f4a87828801612d35565b9350506040612f5b87828801612e0f565b925050606085013567ffffffffffffffff811115612f7c57612f7b6140b1565b5b612f8887828801612db3565b91505092959194509250565b60008060408385031215612fab57612faa6140b6565b5b6000612fb985828601612d35565b9250506020612fca85828601612d5f565b9150509250929050565b60008060408385031215612feb57612fea6140b6565b5b6000612ff985828601612d35565b925050602061300a85828601612e0f565b9150509250929050565b60006020828403121561302a576130296140b6565b5b600061303884828501612d5f565b91505092915050565b600060208284031215613057576130566140b6565b5b600061306584828501612d74565b91505092915050565b600060208284031215613084576130836140b6565b5b600061309284828501612d89565b91505092915050565b6000602082840312156130b1576130b06140b6565b5b60006130bf84828501612d9e565b91505092915050565b6000602082840312156130de576130dd6140b6565b5b600082013567ffffffffffffffff8111156130fc576130fb6140b1565b5b61310884828501612de1565b91505092915050565b600060208284031215613127576131266140b6565b5b600061313584828501612e0f565b91505092915050565b60008060408385031215613155576131546140b6565b5b600061316385828601612e0f565b925050602061317485828601612e0f565b9150509250929050565b600061318a83836131a5565b60208301905092915050565b61319f81613dc2565b82525050565b6131ae81613db0565b82525050565b6131bd81613db0565b82525050565b6131d46131cf82613db0565b613f2e565b82525050565b60006131e582613c7e565b6131ef8185613cac565b93506131fa83613c6e565b8060005b8381101561322b578151613212888261317e565b975061321d83613c9f565b9250506001810190506131fe565b5085935050505092915050565b61324181613dd4565b82525050565b600061325282613c89565b61325c8185613cbd565b935061326c818560208601613e4f565b613275816140bb565b840191505092915050565b600061328b82613c89565b6132958185613cce565b93506132a5818560208601613e4f565b80840191505092915050565b60006132bc82613c94565b6132c68185613cd9565b93506132d6818560208601613e4f565b6132df816140bb565b840191505092915050565b60006132f582613c94565b6132ff8185613cea565b935061330f818560208601613e4f565b80840191505092915050565b6000613328602283613cd9565b9150613333826140d9565b604082019050919050565b600061334b603283613cd9565b915061335682614128565b604082019050919050565b600061336e602683613cd9565b915061337982614177565b604082019050919050565b6000613391601c83613cd9565b915061339c826141c6565b602082019050919050565b60006133b4602483613cd9565b91506133bf826141ef565b604082019050919050565b60006133d7601983613cd9565b91506133e28261423e565b602082019050919050565b60006133fa603a83613cd9565b915061340582614267565b604082019050919050565b600061341d601d83613cd9565b9150613428826142b6565b602082019050919050565b6000613440602683613cd9565b915061344b826142df565b604082019050919050565b6000613463602c83613cd9565b915061346e8261432e565b604082019050919050565b6000613486601183613cea565b91506134918261437d565b601182019050919050565b60006134a9603883613cd9565b91506134b4826143a6565b604082019050919050565b60006134cc602a83613cd9565b91506134d7826143f5565b604082019050919050565b60006134ef602283613cd9565b91506134fa82614444565b604082019050919050565b6000613512602083613cd9565b915061351d82614493565b602082019050919050565b6000613535602c83613cd9565b9150613540826144bc565b604082019050919050565b6000613558600583613cea565b91506135638261450b565b600582019050919050565b600061357b602083613cd9565b915061358682614534565b602082019050919050565b600061359e602983613cd9565b91506135a98261455d565b604082019050919050565b60006135c1602f83613cd9565b91506135cc826145ac565b604082019050919050565b60006135e4600d83613cd9565b91506135ef826145fb565b602082019050919050565b6000613607602183613cd9565b915061361282614624565b604082019050919050565b600061362a600083613cce565b915061363582614673565b600082019050919050565b600061364d603183613cd9565b915061365882614676565b604082019050919050565b6000613670601d83613cd9565b915061367b826146c5565b602082019050919050565b6000613693601383613cd9565b915061369e826146ee565b602082019050919050565b60006136b6601783613cd9565b91506136c182614717565b602082019050919050565b6136d581613e36565b82525050565b6136ec6136e782613e36565b613f52565b82525050565b60006136fe82856131c3565b60148201915061370e82846136db565b6020820191508190509392505050565b600061372a8284613280565b915081905092915050565b600061374182856132ea565b915061374d82846132ea565b91506137588261354b565b91508190509392505050565b600061377082846132ea565b915061377b82613479565b91506137868261354b565b915081905092915050565b600061379c8261361d565b9150819050919050565b60006020820190506137bb60008301846131b4565b92915050565b60006020820190506137d66000830184613196565b92915050565b60006080820190506137f160008301876131b4565b6137fe60208301866131b4565b61380b60408301856136cc565b818103606083015261381d8184613247565b905095945050505050565b600060808201905061383d60008301876131b4565b61384a60208301866136cc565b61385760408301856131b4565b61386460608301846136cc565b95945050505050565b6000602082019050818103600083015261388781846131da565b905092915050565b60006020820190506138a46000830184613238565b92915050565b600060208201905081810360008301526138c481846132b1565b905092915050565b600060208201905081810360008301526138e58161331b565b9050919050565b600060208201905081810360008301526139058161333e565b9050919050565b6000602082019050818103600083015261392581613361565b9050919050565b6000602082019050818103600083015261394581613384565b9050919050565b60006020820190508181036000830152613965816133a7565b9050919050565b60006020820190508181036000830152613985816133ca565b9050919050565b600060208201905081810360008301526139a5816133ed565b9050919050565b600060208201905081810360008301526139c581613410565b9050919050565b600060208201905081810360008301526139e581613433565b9050919050565b60006020820190508181036000830152613a0581613456565b9050919050565b60006020820190508181036000830152613a258161349c565b9050919050565b60006020820190508181036000830152613a45816134bf565b9050919050565b60006020820190508181036000830152613a65816134e2565b9050919050565b60006020820190508181036000830152613a8581613505565b9050919050565b60006020820190508181036000830152613aa581613528565b9050919050565b60006020820190508181036000830152613ac58161356e565b9050919050565b60006020820190508181036000830152613ae581613591565b9050919050565b60006020820190508181036000830152613b05816135b4565b9050919050565b60006020820190508181036000830152613b25816135d7565b9050919050565b60006020820190508181036000830152613b45816135fa565b9050919050565b60006020820190508181036000830152613b6581613640565b9050919050565b60006020820190508181036000830152613b8581613663565b9050919050565b60006020820190508181036000830152613ba581613686565b9050919050565b60006020820190508181036000830152613bc5816136a9565b9050919050565b6000602082019050613be160008301846136cc565b92915050565b6000613bf1613c02565b9050613bfd8282613eb4565b919050565b6000604051905090565b600067ffffffffffffffff821115613c2757613c26614078565b5b613c30826140bb565b9050602081019050919050565b600067ffffffffffffffff821115613c5857613c57614078565b5b613c61826140bb565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613d0082613e36565b9150613d0b83613e36565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d4057613d3f613f8d565b5b828201905092915050565b6000613d5682613e36565b9150613d6183613e36565b925082613d7157613d70613fbc565b5b828204905092915050565b6000613d8782613e36565b9150613d9283613e36565b925082821015613da557613da4613f8d565b5b828203905092915050565b6000613dbb82613e16565b9050919050565b6000613dcd82613e16565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613e6d578082015181840152602081019050613e52565b83811115613e7c576000848401525b50505050565b60006002820490506001821680613e9a57607f821691505b60208210811415613eae57613ead613feb565b5b50919050565b613ebd826140bb565b810181811067ffffffffffffffff82111715613edc57613edb614078565b5b80604052505050565b6000613ef082613e36565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f2357613f22613f8d565b5b600182019050919050565b6000613f3982613f40565b9050919050565b6000613f4b826140cc565b9050919050565b6000819050919050565b6000613f6782613e36565b9150613f7283613e36565b925082613f8257613f81613fbc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f636f6e74726163745f6d65746164617461000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f73616c65206e6f74206f70656e00000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f6e6f7420656e6f756768206574682073656e7400000000000000000000000000600082015250565b7f746f6b656e20697320616c7265616479206d696e746564000000000000000000600082015250565b61474981613db0565b811461475457600080fd5b50565b61476081613dc2565b811461476b57600080fd5b50565b61477781613dd4565b811461478257600080fd5b50565b61478e81613de0565b811461479957600080fd5b50565b6147a581613dea565b81146147b057600080fd5b50565b6147bc81613e36565b81146147c757600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220d2b21069746da17c1664dd534f079b1b1fde066eaf12249509fcce2d28af47e964736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000058d15e176280000000000000000000000000005a73badaee01abb988d12c5e030b1857437abad700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : givenPricePerPiece (uint256): 25000000000000000
Arg [1] : givenWithdrawalAddress (address): 0x5A73baDaeE01aBB988d12C5E030B1857437abAd7
Arg [2] : givenTokenURIBase (string):
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000058d15e17628000
Arg [1] : 0000000000000000000000005a73badaee01abb988d12c5e030b1857437abad7
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
61396:2588:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30934:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62986:277;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61601:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47990:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50709:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50239:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49717:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62568:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51599:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61535:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49479:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51975:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50005:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61564:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47746:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49297:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47463:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21203:148;;;;;;;;;;;;;:::i;:::-;;20552:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62440:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62187:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48159:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62724:118;;;;;;;;;;;;;:::i;:::-;;51002:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52197:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48334:515;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62868:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61501:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63271:710;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48908:150;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51368:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62316:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61454:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21506:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30934:150;31019:4;31043:20;:33;31064:11;31043:33;;;;;;;;;;;;;;;;;;;;;;;;;;;31036:40;;30934:150;;;:::o;62986:277::-;63054:16;63082:19;63124:5;63118:3;:11;;;;:::i;:::-;63104:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63082:48;;63146:9;63158:5;63146:17;;63141:95;63169:3;63165:1;:7;63141:95;;;63214:10;63222:1;63214:7;:10::i;:::-;63198:2;63205:5;63201:1;:9;;;;:::i;:::-;63198:13;;;;;;;;:::i;:::-;;;;;;;:26;;;;;;;;;;;63174:3;;;;;:::i;:::-;;;;63141:95;;;;63253:2;63246:9;;;62986:277;;;;:::o;61601:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;47990:100::-;48044:13;48077:5;48070:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47990:100;:::o;50709:221::-;50785:7;50813:16;50821:7;50813;:16::i;:::-;50805:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;50898:15;:24;50914:7;50898:24;;;;;;;;;;;;;;;;;;;;;50891:31;;50709:221;;;:::o;50239:404::-;50320:13;50336:23;50351:7;50336:14;:23::i;:::-;50320:39;;50384:5;50378:11;;:2;:11;;;;50370:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;50464:5;50448:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;50473:44;50497:5;50504:12;:10;:12::i;:::-;50473:23;:44::i;:::-;50448:69;50440:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;50614:21;50623:2;50627:7;50614:8;:21::i;:::-;50309:334;50239:404;;:::o;49717:211::-;49778:7;49899:21;:12;:19;:21::i;:::-;49892:28;;49717:211;:::o;62568:148::-;20783:12;:10;:12::i;:::-;20772:23;;:7;:5;:7::i;:::-;:23;;;20764:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62686:22:::1;62666:17;;:42;;;;;;;;;;;;;;;;;;62568:148:::0;:::o;51599:305::-;51760:41;51779:12;:10;:12::i;:::-;51793:7;51760:18;:41::i;:::-;51752:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;51868:28;51878:4;51884:2;51888:7;51868:9;:28::i;:::-;51599:305;;;:::o;61535:22::-;;;;;;;;;;;;;:::o;49479:162::-;49576:7;49603:30;49627:5;49603:13;:20;49617:5;49603:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;49596:37;;49479:162;;;;:::o;51975:151::-;52079:39;52096:4;52102:2;52106:7;52079:39;;;;;;;;;;;;:16;:39::i;:::-;51975:151;;;:::o;50005:172::-;50080:7;50101:15;50122:22;50138:5;50122:12;:15;;:22;;;;:::i;:::-;50100:44;;;50162:7;50155:14;;;50005:172;;;:::o;61564:28::-;;;;:::o;47746:177::-;47818:7;47845:70;47862:7;47845:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;47838:77;;47746:177;;;:::o;49297:97::-;49345:13;49378:8;49371:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49297:97;:::o;47463:221::-;47535:7;47580:1;47563:19;;:5;:19;;;;47555:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;47647:29;:13;:20;47661:5;47647:20;;;;;;;;;;;;;;;:27;:29::i;:::-;47640:36;;47463:221;;;:::o;21203:148::-;20783:12;:10;:12::i;:::-;20772:23;;:7;:5;:7::i;:::-;:23;;;20764:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21310:1:::1;21273:40;;21294:6;;;;;;;;;;;21273:40;;;;;;;;;;;;21341:1;21324:6;;:19;;;;;;;;;;;;;;;;;;21203:148::o:0;20552:87::-;20598:7;20625:6;;;;;;;;;;;20618:13;;20552:87;:::o;62440:102::-;20783:12;:10;:12::i;:::-;20772:23;;:7;:5;:7::i;:::-;:23;;;20764:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62524:10:::1;62508:13;:26;;;;62440:102:::0;:::o;62187:121::-;20783:12;:10;:12::i;:::-;20772:23;;:7;:5;:7::i;:::-;:23;;;20764:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62270:30:::1;62282:17;62270:11;:30::i;:::-;62187:121:::0;:::o;48159:104::-;48215:13;48248:7;48241:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48159:104;:::o;62724:118::-;20783:12;:10;:12::i;:::-;20772:23;;:7;:5;:7::i;:::-;:23;;;20764:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62775:59:::1;62793:17;;;;;;;;;;;62812:21;62775:17;:59::i;:::-;62724:118::o:0;51002:295::-;51117:12;:10;:12::i;:::-;51105:24;;:8;:24;;;;51097:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;51217:8;51172:18;:32;51191:12;:10;:12::i;:::-;51172:32;;;;;;;;;;;;;;;:42;51205:8;51172:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;51270:8;51241:48;;51256:12;:10;:12::i;:::-;51241:48;;;51280:8;51241:48;;;;;;:::i;:::-;;;;;;;;51002:295;;:::o;52197:285::-;52329:41;52348:12;:10;:12::i;:::-;52362:7;52329:18;:41::i;:::-;52321:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;52435:39;52449:4;52455:2;52459:7;52468:5;52435:13;:39::i;:::-;52197:285;;;;:::o;48334:515::-;48407:13;48441:16;48449:7;48441;:16::i;:::-;48433:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;48773:9;:7;:9::i;:::-;48783:18;:7;:16;:18::i;:::-;48756:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48742:69;;48334:515;;;:::o;62868:110::-;62925:7;62953:16;62961:7;62953;:16::i;:::-;62945:25;;62868:110;;;:::o;61501:27::-;;;;:::o;63271:710::-;63361:7;63401:13;;63388:9;:26;;63380:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;63457:10;;;;;;;;;;;:35;;;;63485:7;:5;:7::i;:::-;63471:21;;:10;:21;;;63457:35;63449:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;63530:13;:77;63571:16;63589:15;63554:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63544:62;;;;;;63530:77;;;;;;;;;;;;;;;;;;;;;63529:78;63521:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;63736:4;63656:13;:77;63697:16;63715:15;63680:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63670:62;;;;;;63656:77;;;;;;;;;;;;:84;;;;;;;;;;;;;;;;;;63756:68;63763:10;63775:13;;63790:16;63808:15;63756:68;;;;;;;;;:::i;:::-;;;;;;;;63837:19;63859:12;;63837:34;;63882;63892:10;63904:11;63882:9;:34::i;:::-;63929:12;;:15;;;;;;;;;:::i;:::-;;;;;;63962:11;63955:18;;;63271:710;;;;:::o;48908:150::-;48952:13;49009:9;:7;:9::i;:::-;48992:57;;;;;;;;:::i;:::-;;;;;;;;;;;;;48978:72;;48908:150;:::o;51368:164::-;51465:4;51489:18;:25;51508:5;51489:25;;;;;;;;;;;;;;;:35;51515:8;51489:35;;;;;;;;;;;;;;;;;;;;;;;;;51482:42;;51368:164;;;;:::o;62316:95::-;20783:12;:10;:12::i;:::-;20772:23;;:7;:5;:7::i;:::-;:23;;;20764:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62395:8:::1;62382:10;;:21;;;;;;;;;;;;;;;;;;62316:95:::0;:::o;61454:40::-;;;;;;;;;;;;;:::o;21506:244::-;20783:12;:10;:12::i;:::-;20772:23;;:7;:5;:7::i;:::-;:23;;;20764:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21615:1:::1;21595:22;;:8;:22;;;;21587:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21705:8;21676:38;;21697:6;;;;;;;;;;;21676:38;;;;;;;;;;;;21734:8;21725:6;;:17;;;;;;;;;;;;;;;;;;21506:244:::0;:::o;53949:127::-;54014:4;54038:30;54060:7;54038:12;:21;;:30;;;;:::i;:::-;54031:37;;53949:127;;;:::o;19177:98::-;19230:7;19257:10;19250:17;;19177:98;:::o;59877:183::-;59970:2;59943:15;:24;59959:7;59943:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;60026:7;60022:2;59988:46;;59997:23;60012:7;59997:14;:23::i;:::-;59988:46;;;;;;;;;;;;59877:183;;:::o;39757:123::-;39826:7;39853:19;39861:3;:10;;39853:7;:19::i;:::-;39846:26;;39757:123;;;:::o;54243:355::-;54336:4;54361:16;54369:7;54361;:16::i;:::-;54353:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54437:13;54453:23;54468:7;54453:14;:23::i;:::-;54437:39;;54506:5;54495:16;;:7;:16;;;:51;;;;54539:7;54515:31;;:20;54527:7;54515:11;:20::i;:::-;:31;;;54495:51;:94;;;;54550:39;54574:5;54581:7;54550:23;:39::i;:::-;54495:94;54487:103;;;54243:355;;;;:::o;57388:599::-;57513:4;57486:31;;:23;57501:7;57486:14;:23::i;:::-;:31;;;57478:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;57614:1;57600:16;;:2;:16;;;;57592:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;57670:39;57691:4;57697:2;57701:7;57670:20;:39::i;:::-;57774:29;57791:1;57795:7;57774:8;:29::i;:::-;57816:35;57843:7;57816:13;:19;57830:4;57816:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;57862:30;57884:7;57862:13;:17;57876:2;57862:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;57905:29;57922:7;57931:2;57905:12;:16;;:29;;;;;:::i;:::-;;57971:7;57967:2;57952:27;;57961:4;57952:27;;;;;;;;;;;;57388:599;;;:::o;10375:137::-;10446:7;10481:22;10485:3;:10;;10497:5;10481:3;:22::i;:::-;10473:31;;10466:38;;10375:137;;;;:::o;40219:236::-;40299:7;40308;40329:11;40342:13;40359:22;40363:3;:10;;40375:5;40359:3;:22::i;:::-;40328:53;;;;40408:3;40400:12;;40438:5;40430:14;;40392:55;;;;;;40219:236;;;;;:::o;41505:213::-;41612:7;41663:44;41668:3;:10;;41688:3;41680:12;;41694;41663:4;:44::i;:::-;41655:53;;41632:78;;41505:213;;;;;:::o;9918:114::-;9978:7;10005:19;10013:3;:10;;10005:7;:19::i;:::-;9998:26;;9918:114;;;:::o;58600:100::-;58684:8;58673;:19;;;;;;;;;;;;:::i;:::-;;58600:100;:::o;12645:397::-;12760:6;12735:21;:31;;12727:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;12892:12;12910:9;:14;;12933:6;12910:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12891:54;;;12964:7;12956:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;12716:326;12645:397;;:::o;53364:272::-;53478:28;53488:4;53494:2;53498:7;53478:9;:28::i;:::-;53525:48;53548:4;53554:2;53558:7;53567:5;53525:22;:48::i;:::-;53517:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;53364:272;;;;:::o;41976:723::-;42032:13;42262:1;42253:5;:10;42249:53;;;42280:10;;;;;;;;;;;;;;;;;;;;;42249:53;42312:12;42327:5;42312:20;;42343:14;42368:78;42383:1;42375:4;:9;42368:78;;42401:8;;;;;:::i;:::-;;;;42432:2;42424:10;;;;;:::i;:::-;;;42368:78;;;42456:19;42488:6;42478:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42456:39;;42506:154;42522:1;42513:5;:10;42506:154;;42550:1;42540:11;;;;;:::i;:::-;;;42617:2;42609:5;:10;;;;:::i;:::-;42596:2;:24;;;;:::i;:::-;42583:39;;42566:6;42573;42566:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;42646:2;42637:11;;;;;:::i;:::-;;;42506:154;;;42684:6;42670:21;;;;;41976:723;;;;:::o;54941:110::-;55017:26;55027:2;55031:7;55017:26;;;;;;;;;;;;:9;:26::i;:::-;54941:110;;:::o;39518:151::-;39602:4;39626:35;39636:3;:10;;39656:3;39648:12;;39626:9;:35::i;:::-;39619:42;;39518:151;;;;:::o;36336:110::-;36392:7;36419:3;:12;;:19;;;;36412:26;;36336:110;;;:::o;60673:93::-;;;;:::o;9463:137::-;9533:4;9557:35;9565:3;:10;;9585:5;9577:14;;9557:7;:35::i;:::-;9550:42;;9463:137;;;;:::o;9156:131::-;9223:4;9247:32;9252:3;:10;;9272:5;9264:14;;9247:4;:32::i;:::-;9240:39;;9156:131;;;;:::o;38941:185::-;39030:4;39054:64;39059:3;:10;;39079:3;39071:12;;39109:5;39093:23;;39085:32;;39054:4;:64::i;:::-;39047:71;;38941:185;;;;;:::o;5416:204::-;5483:7;5532:5;5511:3;:11;;:18;;;;:26;5503:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5594:3;:11;;5606:5;5594:18;;;;;;;;:::i;:::-;;;;;;;;;;5587:25;;5416:204;;;;:::o;36801:279::-;36868:7;36877;36927:5;36905:3;:12;;:19;;;;:27;36897:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;36984:22;37009:3;:12;;37022:5;37009:19;;;;;;;;:::i;:::-;;;;;;;;;;;;36984:44;;37047:5;:10;;;37059:5;:12;;;37039:33;;;;;36801:279;;;;;:::o;38298:319::-;38392:7;38412:16;38431:3;:12;;:17;38444:3;38431:17;;;;;;;;;;;;38412:36;;38479:1;38467:8;:13;;38482:12;38459:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;38549:3;:12;;38573:1;38562:8;:12;;;;:::i;:::-;38549:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:33;;;38542:40;;;38298:319;;;;;:::o;4964:109::-;5020:7;5047:3;:11;;:18;;;;5040:25;;4964:109;;;:::o;59265:604::-;59386:4;59413:15;:2;:13;;;:15::i;:::-;59408:60;;59452:4;59445:11;;;;59408:60;59478:23;59504:252;59557:45;;;59617:12;:10;:12::i;:::-;59644:4;59663:7;59685:5;59520:181;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59504:252;;;;;;;;;;;;;;;;;:2;:15;;;;:252;;;;;:::i;:::-;59478:278;;59767:13;59794:10;59783:32;;;;;;;;;;;;:::i;:::-;59767:48;;44433:10;59844:16;;59834:26;;;:6;:26;;;;59826:35;;;;59265:604;;;;;;;:::o;55278:250::-;55374:18;55380:2;55384:7;55374:5;:18::i;:::-;55411:54;55442:1;55446:2;55450:7;55459:5;55411:22;:54::i;:::-;55403:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;55278:250;;;:::o;36116:125::-;36187:4;36232:1;36211:3;:12;;:17;36224:3;36211:17;;;;;;;;;;;;:22;;36204:29;;36116:125;;;;:::o;3119:1544::-;3185:4;3303:18;3324:3;:12;;:19;3337:5;3324:19;;;;;;;;;;;;3303:40;;3374:1;3360:10;:15;3356:1300;;3722:21;3759:1;3746:10;:14;;;;:::i;:::-;3722:38;;3775:17;3816:1;3795:3;:11;;:18;;;;:22;;;;:::i;:::-;3775:42;;4062:17;4082:3;:11;;4094:9;4082:22;;;;;;;;:::i;:::-;;;;;;;;;;4062:42;;4228:9;4199:3;:11;;4211:13;4199:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;4347:1;4331:13;:17;;;;:::i;:::-;4305:3;:12;;:23;4318:9;4305:23;;;;;;;;;;;:43;;;;4457:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4552:3;:12;;:19;4565:5;4552:19;;;;;;;;;;;4545:26;;;4595:4;4588:11;;;;;;;;3356:1300;4639:5;4632:12;;;3119:1544;;;;;:::o;2529:414::-;2592:4;2614:21;2624:3;2629:5;2614:9;:21::i;:::-;2609:327;;2652:3;:11;;2669:5;2652:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2835:3;:11;;:18;;;;2813:3;:12;;:19;2826:5;2813:19;;;;;;;;;;;:40;;;;2875:4;2868:11;;;;2609:327;2919:5;2912:12;;2529:414;;;;;:::o;33616:692::-;33692:4;33808:16;33827:3;:12;;:17;33840:3;33827:17;;;;;;;;;;;;33808:36;;33873:1;33861:8;:13;33857:444;;;33928:3;:12;;33946:38;;;;;;;;33963:3;33946:38;;;;33976:5;33946:38;;;33928:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34143:3;:12;;:19;;;;34123:3;:12;;:17;34136:3;34123:17;;;;;;;;;;;:39;;;;34184:4;34177:11;;;;;33857:444;34257:5;34221:3;:12;;34245:1;34234:8;:12;;;;:::i;:::-;34221:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:33;;:41;;;;34284:5;34277:12;;;33616:692;;;;;;:::o;11288:422::-;11348:4;11556:12;11667:7;11655:20;11647:28;;11701:1;11694:4;:8;11687:15;;;11288:422;;;:::o;14206:195::-;14309:12;14341:52;14363:6;14371:4;14377:1;14380:12;14341:21;:52::i;:::-;14334:59;;14206:195;;;;;:::o;55864:404::-;55958:1;55944:16;;:2;:16;;;;55936:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;56017:16;56025:7;56017;:16::i;:::-;56016:17;56008:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;56079:45;56108:1;56112:2;56116:7;56079:20;:45::i;:::-;56137:30;56159:7;56137:13;:17;56151:2;56137:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;56180:29;56197:7;56206:2;56180:12;:16;;:29;;;;;:::i;:::-;;56252:7;56248:2;56227:33;;56244:1;56227:33;;;;;;;;;;;;55864:404;;:::o;4749:129::-;4822:4;4869:1;4846:3;:12;;:19;4859:5;4846:19;;;;;;;;;;;;:24;;4839:31;;4749:129;;;;:::o;15258:530::-;15385:12;15443:5;15418:21;:30;;15410:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;15510:18;15521:6;15510:10;:18::i;:::-;15502:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;15636:12;15650:23;15677:6;:11;;15697:5;15705:4;15677:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15635:75;;;;15728:52;15746:7;15755:10;15767:12;15728:17;:52::i;:::-;15721:59;;;;15258:530;;;;;;:::o;17798:742::-;17913:12;17942:7;17938:595;;;17973:10;17966:17;;;;17938:595;18107:1;18087:10;:17;:21;18083:439;;;18350:10;18344:17;18411:15;18398:10;18394:2;18390:19;18383:44;18083:439;18493:12;18486:20;;;;;;;;;;;:::i;:::-;;;;;;;;17798:742;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:155::-;1040:5;1078:6;1065:20;1056:29;;1094:41;1129:5;1094:41;:::i;:::-;986:155;;;;:::o;1147:133::-;1190:5;1228:6;1215:20;1206:29;;1244:30;1268:5;1244:30;:::i;:::-;1147:133;;;;:::o;1286:139::-;1332:5;1370:6;1357:20;1348:29;;1386:33;1413:5;1386:33;:::i;:::-;1286:139;;;;:::o;1431:137::-;1476:5;1514:6;1501:20;1492:29;;1530:32;1556:5;1530:32;:::i;:::-;1431:137;;;;:::o;1574:141::-;1630:5;1661:6;1655:13;1646:22;;1677:32;1703:5;1677:32;:::i;:::-;1574:141;;;;:::o;1734:338::-;1789:5;1838:3;1831:4;1823:6;1819:17;1815:27;1805:122;;1846:79;;:::i;:::-;1805:122;1963:6;1950:20;1988:78;2062:3;2054:6;2047:4;2039:6;2035:17;1988:78;:::i;:::-;1979:87;;1795:277;1734:338;;;;:::o;2092:340::-;2148:5;2197:3;2190:4;2182:6;2178:17;2174:27;2164:122;;2205:79;;:::i;:::-;2164:122;2322:6;2309:20;2347:79;2422:3;2414:6;2407:4;2399:6;2395:17;2347:79;:::i;:::-;2338:88;;2154:278;2092:340;;;;:::o;2438:139::-;2484:5;2522:6;2509:20;2500:29;;2538:33;2565:5;2538:33;:::i;:::-;2438:139;;;;:::o;2583:329::-;2642:6;2691:2;2679:9;2670:7;2666:23;2662:32;2659:119;;;2697:79;;:::i;:::-;2659:119;2817:1;2842:53;2887:7;2878:6;2867:9;2863:22;2842:53;:::i;:::-;2832:63;;2788:117;2583:329;;;;:::o;2918:345::-;2985:6;3034:2;3022:9;3013:7;3009:23;3005:32;3002:119;;;3040:79;;:::i;:::-;3002:119;3160:1;3185:61;3238:7;3229:6;3218:9;3214:22;3185:61;:::i;:::-;3175:71;;3131:125;2918:345;;;;:::o;3269:474::-;3337:6;3345;3394:2;3382:9;3373:7;3369:23;3365:32;3362:119;;;3400:79;;:::i;:::-;3362:119;3520:1;3545:53;3590:7;3581:6;3570:9;3566:22;3545:53;:::i;:::-;3535:63;;3491:117;3647:2;3673:53;3718:7;3709:6;3698:9;3694:22;3673:53;:::i;:::-;3663:63;;3618:118;3269:474;;;;;:::o;3749:619::-;3826:6;3834;3842;3891:2;3879:9;3870:7;3866:23;3862:32;3859:119;;;3897:79;;:::i;:::-;3859:119;4017:1;4042:53;4087:7;4078:6;4067:9;4063:22;4042:53;:::i;:::-;4032:63;;3988:117;4144:2;4170:53;4215:7;4206:6;4195:9;4191:22;4170:53;:::i;:::-;4160:63;;4115:118;4272:2;4298:53;4343:7;4334:6;4323:9;4319:22;4298:53;:::i;:::-;4288:63;;4243:118;3749:619;;;;;:::o;4374:943::-;4469:6;4477;4485;4493;4542:3;4530:9;4521:7;4517:23;4513:33;4510:120;;;4549:79;;:::i;:::-;4510:120;4669:1;4694:53;4739:7;4730:6;4719:9;4715:22;4694:53;:::i;:::-;4684:63;;4640:117;4796:2;4822:53;4867:7;4858:6;4847:9;4843:22;4822:53;:::i;:::-;4812:63;;4767:118;4924:2;4950:53;4995:7;4986:6;4975:9;4971:22;4950:53;:::i;:::-;4940:63;;4895:118;5080:2;5069:9;5065:18;5052:32;5111:18;5103:6;5100:30;5097:117;;;5133:79;;:::i;:::-;5097:117;5238:62;5292:7;5283:6;5272:9;5268:22;5238:62;:::i;:::-;5228:72;;5023:287;4374:943;;;;;;;:::o;5323:468::-;5388:6;5396;5445:2;5433:9;5424:7;5420:23;5416:32;5413:119;;;5451:79;;:::i;:::-;5413:119;5571:1;5596:53;5641:7;5632:6;5621:9;5617:22;5596:53;:::i;:::-;5586:63;;5542:117;5698:2;5724:50;5766:7;5757:6;5746:9;5742:22;5724:50;:::i;:::-;5714:60;;5669:115;5323:468;;;;;:::o;5797:474::-;5865:6;5873;5922:2;5910:9;5901:7;5897:23;5893:32;5890:119;;;5928:79;;:::i;:::-;5890:119;6048:1;6073:53;6118:7;6109:6;6098:9;6094:22;6073:53;:::i;:::-;6063:63;;6019:117;6175:2;6201:53;6246:7;6237:6;6226:9;6222:22;6201:53;:::i;:::-;6191:63;;6146:118;5797:474;;;;;:::o;6277:323::-;6333:6;6382:2;6370:9;6361:7;6357:23;6353:32;6350:119;;;6388:79;;:::i;:::-;6350:119;6508:1;6533:50;6575:7;6566:6;6555:9;6551:22;6533:50;:::i;:::-;6523:60;;6479:114;6277:323;;;;:::o;6606:329::-;6665:6;6714:2;6702:9;6693:7;6689:23;6685:32;6682:119;;;6720:79;;:::i;:::-;6682:119;6840:1;6865:53;6910:7;6901:6;6890:9;6886:22;6865:53;:::i;:::-;6855:63;;6811:117;6606:329;;;;:::o;6941:327::-;6999:6;7048:2;7036:9;7027:7;7023:23;7019:32;7016:119;;;7054:79;;:::i;:::-;7016:119;7174:1;7199:52;7243:7;7234:6;7223:9;7219:22;7199:52;:::i;:::-;7189:62;;7145:116;6941:327;;;;:::o;7274:349::-;7343:6;7392:2;7380:9;7371:7;7367:23;7363:32;7360:119;;;7398:79;;:::i;:::-;7360:119;7518:1;7543:63;7598:7;7589:6;7578:9;7574:22;7543:63;:::i;:::-;7533:73;;7489:127;7274:349;;;;:::o;7629:509::-;7698:6;7747:2;7735:9;7726:7;7722:23;7718:32;7715:119;;;7753:79;;:::i;:::-;7715:119;7901:1;7890:9;7886:17;7873:31;7931:18;7923:6;7920:30;7917:117;;;7953:79;;:::i;:::-;7917:117;8058:63;8113:7;8104:6;8093:9;8089:22;8058:63;:::i;:::-;8048:73;;7844:287;7629:509;;;;:::o;8144:329::-;8203:6;8252:2;8240:9;8231:7;8227:23;8223:32;8220:119;;;8258:79;;:::i;:::-;8220:119;8378:1;8403:53;8448:7;8439:6;8428:9;8424:22;8403:53;:::i;:::-;8393:63;;8349:117;8144:329;;;;:::o;8479:474::-;8547:6;8555;8604:2;8592:9;8583:7;8579:23;8575:32;8572:119;;;8610:79;;:::i;:::-;8572:119;8730:1;8755:53;8800:7;8791:6;8780:9;8776:22;8755:53;:::i;:::-;8745:63;;8701:117;8857:2;8883:53;8928:7;8919:6;8908:9;8904:22;8883:53;:::i;:::-;8873:63;;8828:118;8479:474;;;;;:::o;8959:179::-;9028:10;9049:46;9091:3;9083:6;9049:46;:::i;:::-;9127:4;9122:3;9118:14;9104:28;;8959:179;;;;:::o;9144:142::-;9247:32;9273:5;9247:32;:::i;:::-;9242:3;9235:45;9144:142;;:::o;9292:108::-;9369:24;9387:5;9369:24;:::i;:::-;9364:3;9357:37;9292:108;;:::o;9406:118::-;9493:24;9511:5;9493:24;:::i;:::-;9488:3;9481:37;9406:118;;:::o;9530:157::-;9635:45;9655:24;9673:5;9655:24;:::i;:::-;9635:45;:::i;:::-;9630:3;9623:58;9530:157;;:::o;9723:732::-;9842:3;9871:54;9919:5;9871:54;:::i;:::-;9941:86;10020:6;10015:3;9941:86;:::i;:::-;9934:93;;10051:56;10101:5;10051:56;:::i;:::-;10130:7;10161:1;10146:284;10171:6;10168:1;10165:13;10146:284;;;10247:6;10241:13;10274:63;10333:3;10318:13;10274:63;:::i;:::-;10267:70;;10360:60;10413:6;10360:60;:::i;:::-;10350:70;;10206:224;10193:1;10190;10186:9;10181:14;;10146:284;;;10150:14;10446:3;10439:10;;9847:608;;;9723:732;;;;:::o;10461:109::-;10542:21;10557:5;10542:21;:::i;:::-;10537:3;10530:34;10461:109;;:::o;10576:360::-;10662:3;10690:38;10722:5;10690:38;:::i;:::-;10744:70;10807:6;10802:3;10744:70;:::i;:::-;10737:77;;10823:52;10868:6;10863:3;10856:4;10849:5;10845:16;10823:52;:::i;:::-;10900:29;10922:6;10900:29;:::i;:::-;10895:3;10891:39;10884:46;;10666:270;10576:360;;;;:::o;10942:373::-;11046:3;11074:38;11106:5;11074:38;:::i;:::-;11128:88;11209:6;11204:3;11128:88;:::i;:::-;11121:95;;11225:52;11270:6;11265:3;11258:4;11251:5;11247:16;11225:52;:::i;:::-;11302:6;11297:3;11293:16;11286:23;;11050:265;10942:373;;;;:::o;11321:364::-;11409:3;11437:39;11470:5;11437:39;:::i;:::-;11492:71;11556:6;11551:3;11492:71;:::i;:::-;11485:78;;11572:52;11617:6;11612:3;11605:4;11598:5;11594:16;11572:52;:::i;:::-;11649:29;11671:6;11649:29;:::i;:::-;11644:3;11640:39;11633:46;;11413:272;11321:364;;;;:::o;11691:377::-;11797:3;11825:39;11858:5;11825:39;:::i;:::-;11880:89;11962:6;11957:3;11880:89;:::i;:::-;11873:96;;11978:52;12023:6;12018:3;12011:4;12004:5;12000:16;11978:52;:::i;:::-;12055:6;12050:3;12046:16;12039:23;;11801:267;11691:377;;;;:::o;12074:366::-;12216:3;12237:67;12301:2;12296:3;12237:67;:::i;:::-;12230:74;;12313:93;12402:3;12313:93;:::i;:::-;12431:2;12426:3;12422:12;12415:19;;12074:366;;;:::o;12446:::-;12588:3;12609:67;12673:2;12668:3;12609:67;:::i;:::-;12602:74;;12685:93;12774:3;12685:93;:::i;:::-;12803:2;12798:3;12794:12;12787:19;;12446:366;;;:::o;12818:::-;12960:3;12981:67;13045:2;13040:3;12981:67;:::i;:::-;12974:74;;13057:93;13146:3;13057:93;:::i;:::-;13175:2;13170:3;13166:12;13159:19;;12818:366;;;:::o;13190:::-;13332:3;13353:67;13417:2;13412:3;13353:67;:::i;:::-;13346:74;;13429:93;13518:3;13429:93;:::i;:::-;13547:2;13542:3;13538:12;13531:19;;13190:366;;;:::o;13562:::-;13704:3;13725:67;13789:2;13784:3;13725:67;:::i;:::-;13718:74;;13801:93;13890:3;13801:93;:::i;:::-;13919:2;13914:3;13910:12;13903:19;;13562:366;;;:::o;13934:::-;14076:3;14097:67;14161:2;14156:3;14097:67;:::i;:::-;14090:74;;14173:93;14262:3;14173:93;:::i;:::-;14291:2;14286:3;14282:12;14275:19;;13934:366;;;:::o;14306:::-;14448:3;14469:67;14533:2;14528:3;14469:67;:::i;:::-;14462:74;;14545:93;14634:3;14545:93;:::i;:::-;14663:2;14658:3;14654:12;14647:19;;14306:366;;;:::o;14678:::-;14820:3;14841:67;14905:2;14900:3;14841:67;:::i;:::-;14834:74;;14917:93;15006:3;14917:93;:::i;:::-;15035:2;15030:3;15026:12;15019:19;;14678:366;;;:::o;15050:::-;15192:3;15213:67;15277:2;15272:3;15213:67;:::i;:::-;15206:74;;15289:93;15378:3;15289:93;:::i;:::-;15407:2;15402:3;15398:12;15391:19;;15050:366;;;:::o;15422:::-;15564:3;15585:67;15649:2;15644:3;15585:67;:::i;:::-;15578:74;;15661:93;15750:3;15661:93;:::i;:::-;15779:2;15774:3;15770:12;15763:19;;15422:366;;;:::o;15794:402::-;15954:3;15975:85;16057:2;16052:3;15975:85;:::i;:::-;15968:92;;16069:93;16158:3;16069:93;:::i;:::-;16187:2;16182:3;16178:12;16171:19;;15794:402;;;:::o;16202:366::-;16344:3;16365:67;16429:2;16424:3;16365:67;:::i;:::-;16358:74;;16441:93;16530:3;16441:93;:::i;:::-;16559:2;16554:3;16550:12;16543:19;;16202:366;;;:::o;16574:::-;16716:3;16737:67;16801:2;16796:3;16737:67;:::i;:::-;16730:74;;16813:93;16902:3;16813:93;:::i;:::-;16931:2;16926:3;16922:12;16915:19;;16574:366;;;:::o;16946:::-;17088:3;17109:67;17173:2;17168:3;17109:67;:::i;:::-;17102:74;;17185:93;17274:3;17185:93;:::i;:::-;17303:2;17298:3;17294:12;17287:19;;16946:366;;;:::o;17318:::-;17460:3;17481:67;17545:2;17540:3;17481:67;:::i;:::-;17474:74;;17557:93;17646:3;17557:93;:::i;:::-;17675:2;17670:3;17666:12;17659:19;;17318:366;;;:::o;17690:::-;17832:3;17853:67;17917:2;17912:3;17853:67;:::i;:::-;17846:74;;17929:93;18018:3;17929:93;:::i;:::-;18047:2;18042:3;18038:12;18031:19;;17690:366;;;:::o;18062:400::-;18222:3;18243:84;18325:1;18320:3;18243:84;:::i;:::-;18236:91;;18336:93;18425:3;18336:93;:::i;:::-;18454:1;18449:3;18445:11;18438:18;;18062:400;;;:::o;18468:366::-;18610:3;18631:67;18695:2;18690:3;18631:67;:::i;:::-;18624:74;;18707:93;18796:3;18707:93;:::i;:::-;18825:2;18820:3;18816:12;18809:19;;18468:366;;;:::o;18840:::-;18982:3;19003:67;19067:2;19062:3;19003:67;:::i;:::-;18996:74;;19079:93;19168:3;19079:93;:::i;:::-;19197:2;19192:3;19188:12;19181:19;;18840:366;;;:::o;19212:::-;19354:3;19375:67;19439:2;19434:3;19375:67;:::i;:::-;19368:74;;19451:93;19540:3;19451:93;:::i;:::-;19569:2;19564:3;19560:12;19553:19;;19212:366;;;:::o;19584:::-;19726:3;19747:67;19811:2;19806:3;19747:67;:::i;:::-;19740:74;;19823:93;19912:3;19823:93;:::i;:::-;19941:2;19936:3;19932:12;19925:19;;19584:366;;;:::o;19956:::-;20098:3;20119:67;20183:2;20178:3;20119:67;:::i;:::-;20112:74;;20195:93;20284:3;20195:93;:::i;:::-;20313:2;20308:3;20304:12;20297:19;;19956:366;;;:::o;20328:398::-;20487:3;20508:83;20589:1;20584:3;20508:83;:::i;:::-;20501:90;;20600:93;20689:3;20600:93;:::i;:::-;20718:1;20713:3;20709:11;20702:18;;20328:398;;;:::o;20732:366::-;20874:3;20895:67;20959:2;20954:3;20895:67;:::i;:::-;20888:74;;20971:93;21060:3;20971:93;:::i;:::-;21089:2;21084:3;21080:12;21073:19;;20732:366;;;:::o;21104:::-;21246:3;21267:67;21331:2;21326:3;21267:67;:::i;:::-;21260:74;;21343:93;21432:3;21343:93;:::i;:::-;21461:2;21456:3;21452:12;21445:19;;21104:366;;;:::o;21476:::-;21618:3;21639:67;21703:2;21698:3;21639:67;:::i;:::-;21632:74;;21715:93;21804:3;21715:93;:::i;:::-;21833:2;21828:3;21824:12;21817:19;;21476:366;;;:::o;21848:::-;21990:3;22011:67;22075:2;22070:3;22011:67;:::i;:::-;22004:74;;22087:93;22176:3;22087:93;:::i;:::-;22205:2;22200:3;22196:12;22189:19;;21848:366;;;:::o;22220:118::-;22307:24;22325:5;22307:24;:::i;:::-;22302:3;22295:37;22220:118;;:::o;22344:157::-;22449:45;22469:24;22487:5;22469:24;:::i;:::-;22449:45;:::i;:::-;22444:3;22437:58;22344:157;;:::o;22507:397::-;22647:3;22662:75;22733:3;22724:6;22662:75;:::i;:::-;22762:2;22757:3;22753:12;22746:19;;22775:75;22846:3;22837:6;22775:75;:::i;:::-;22875:2;22870:3;22866:12;22859:19;;22895:3;22888:10;;22507:397;;;;;:::o;22910:271::-;23040:3;23062:93;23151:3;23142:6;23062:93;:::i;:::-;23055:100;;23172:3;23165:10;;22910:271;;;;:::o;23187:701::-;23468:3;23490:95;23581:3;23572:6;23490:95;:::i;:::-;23483:102;;23602:95;23693:3;23684:6;23602:95;:::i;:::-;23595:102;;23714:148;23858:3;23714:148;:::i;:::-;23707:155;;23879:3;23872:10;;23187:701;;;;;:::o;23894:807::-;24228:3;24250:95;24341:3;24332:6;24250:95;:::i;:::-;24243:102;;24362:148;24506:3;24362:148;:::i;:::-;24355:155;;24527:148;24671:3;24527:148;:::i;:::-;24520:155;;24692:3;24685:10;;23894:807;;;;:::o;24707:379::-;24891:3;24913:147;25056:3;24913:147;:::i;:::-;24906:154;;25077:3;25070:10;;24707:379;;;:::o;25092:222::-;25185:4;25223:2;25212:9;25208:18;25200:26;;25236:71;25304:1;25293:9;25289:17;25280:6;25236:71;:::i;:::-;25092:222;;;;:::o;25320:254::-;25429:4;25467:2;25456:9;25452:18;25444:26;;25480:87;25564:1;25553:9;25549:17;25540:6;25480:87;:::i;:::-;25320:254;;;;:::o;25580:640::-;25775:4;25813:3;25802:9;25798:19;25790:27;;25827:71;25895:1;25884:9;25880:17;25871:6;25827:71;:::i;:::-;25908:72;25976:2;25965:9;25961:18;25952:6;25908:72;:::i;:::-;25990;26058:2;26047:9;26043:18;26034:6;25990:72;:::i;:::-;26109:9;26103:4;26099:20;26094:2;26083:9;26079:18;26072:48;26137:76;26208:4;26199:6;26137:76;:::i;:::-;26129:84;;25580:640;;;;;;;:::o;26226:553::-;26403:4;26441:3;26430:9;26426:19;26418:27;;26455:71;26523:1;26512:9;26508:17;26499:6;26455:71;:::i;:::-;26536:72;26604:2;26593:9;26589:18;26580:6;26536:72;:::i;:::-;26618;26686:2;26675:9;26671:18;26662:6;26618:72;:::i;:::-;26700;26768:2;26757:9;26753:18;26744:6;26700:72;:::i;:::-;26226:553;;;;;;;:::o;26785:373::-;26928:4;26966:2;26955:9;26951:18;26943:26;;27015:9;27009:4;27005:20;27001:1;26990:9;26986:17;26979:47;27043:108;27146:4;27137:6;27043:108;:::i;:::-;27035:116;;26785:373;;;;:::o;27164:210::-;27251:4;27289:2;27278:9;27274:18;27266:26;;27302:65;27364:1;27353:9;27349:17;27340:6;27302:65;:::i;:::-;27164:210;;;;:::o;27380:313::-;27493:4;27531:2;27520:9;27516:18;27508:26;;27580:9;27574:4;27570:20;27566:1;27555:9;27551:17;27544:47;27608:78;27681:4;27672:6;27608:78;:::i;:::-;27600:86;;27380:313;;;;:::o;27699:419::-;27865:4;27903:2;27892:9;27888:18;27880:26;;27952:9;27946:4;27942:20;27938:1;27927:9;27923:17;27916:47;27980:131;28106:4;27980:131;:::i;:::-;27972:139;;27699:419;;;:::o;28124:::-;28290:4;28328:2;28317:9;28313:18;28305:26;;28377:9;28371:4;28367:20;28363:1;28352:9;28348:17;28341:47;28405:131;28531:4;28405:131;:::i;:::-;28397:139;;28124:419;;;:::o;28549:::-;28715:4;28753:2;28742:9;28738:18;28730:26;;28802:9;28796:4;28792:20;28788:1;28777:9;28773:17;28766:47;28830:131;28956:4;28830:131;:::i;:::-;28822:139;;28549:419;;;:::o;28974:::-;29140:4;29178:2;29167:9;29163:18;29155:26;;29227:9;29221:4;29217:20;29213:1;29202:9;29198:17;29191:47;29255:131;29381:4;29255:131;:::i;:::-;29247:139;;28974:419;;;:::o;29399:::-;29565:4;29603:2;29592:9;29588:18;29580:26;;29652:9;29646:4;29642:20;29638:1;29627:9;29623:17;29616:47;29680:131;29806:4;29680:131;:::i;:::-;29672:139;;29399:419;;;:::o;29824:::-;29990:4;30028:2;30017:9;30013:18;30005:26;;30077:9;30071:4;30067:20;30063:1;30052:9;30048:17;30041:47;30105:131;30231:4;30105:131;:::i;:::-;30097:139;;29824:419;;;:::o;30249:::-;30415:4;30453:2;30442:9;30438:18;30430:26;;30502:9;30496:4;30492:20;30488:1;30477:9;30473:17;30466:47;30530:131;30656:4;30530:131;:::i;:::-;30522:139;;30249:419;;;:::o;30674:::-;30840:4;30878:2;30867:9;30863:18;30855:26;;30927:9;30921:4;30917:20;30913:1;30902:9;30898:17;30891:47;30955:131;31081:4;30955:131;:::i;:::-;30947:139;;30674:419;;;:::o;31099:::-;31265:4;31303:2;31292:9;31288:18;31280:26;;31352:9;31346:4;31342:20;31338:1;31327:9;31323:17;31316:47;31380:131;31506:4;31380:131;:::i;:::-;31372:139;;31099:419;;;:::o;31524:::-;31690:4;31728:2;31717:9;31713:18;31705:26;;31777:9;31771:4;31767:20;31763:1;31752:9;31748:17;31741:47;31805:131;31931:4;31805:131;:::i;:::-;31797:139;;31524:419;;;:::o;31949:::-;32115:4;32153:2;32142:9;32138:18;32130:26;;32202:9;32196:4;32192:20;32188:1;32177:9;32173:17;32166:47;32230:131;32356:4;32230:131;:::i;:::-;32222:139;;31949:419;;;:::o;32374:::-;32540:4;32578:2;32567:9;32563:18;32555:26;;32627:9;32621:4;32617:20;32613:1;32602:9;32598:17;32591:47;32655:131;32781:4;32655:131;:::i;:::-;32647:139;;32374:419;;;:::o;32799:::-;32965:4;33003:2;32992:9;32988:18;32980:26;;33052:9;33046:4;33042:20;33038:1;33027:9;33023:17;33016:47;33080:131;33206:4;33080:131;:::i;:::-;33072:139;;32799:419;;;:::o;33224:::-;33390:4;33428:2;33417:9;33413:18;33405:26;;33477:9;33471:4;33467:20;33463:1;33452:9;33448:17;33441:47;33505:131;33631:4;33505:131;:::i;:::-;33497:139;;33224:419;;;:::o;33649:::-;33815:4;33853:2;33842:9;33838:18;33830:26;;33902:9;33896:4;33892:20;33888:1;33877:9;33873:17;33866:47;33930:131;34056:4;33930:131;:::i;:::-;33922:139;;33649:419;;;:::o;34074:::-;34240:4;34278:2;34267:9;34263:18;34255:26;;34327:9;34321:4;34317:20;34313:1;34302:9;34298:17;34291:47;34355:131;34481:4;34355:131;:::i;:::-;34347:139;;34074:419;;;:::o;34499:::-;34665:4;34703:2;34692:9;34688:18;34680:26;;34752:9;34746:4;34742:20;34738:1;34727:9;34723:17;34716:47;34780:131;34906:4;34780:131;:::i;:::-;34772:139;;34499:419;;;:::o;34924:::-;35090:4;35128:2;35117:9;35113:18;35105:26;;35177:9;35171:4;35167:20;35163:1;35152:9;35148:17;35141:47;35205:131;35331:4;35205:131;:::i;:::-;35197:139;;34924:419;;;:::o;35349:::-;35515:4;35553:2;35542:9;35538:18;35530:26;;35602:9;35596:4;35592:20;35588:1;35577:9;35573:17;35566:47;35630:131;35756:4;35630:131;:::i;:::-;35622:139;;35349:419;;;:::o;35774:::-;35940:4;35978:2;35967:9;35963:18;35955:26;;36027:9;36021:4;36017:20;36013:1;36002:9;35998:17;35991:47;36055:131;36181:4;36055:131;:::i;:::-;36047:139;;35774:419;;;:::o;36199:::-;36365:4;36403:2;36392:9;36388:18;36380:26;;36452:9;36446:4;36442:20;36438:1;36427:9;36423:17;36416:47;36480:131;36606:4;36480:131;:::i;:::-;36472:139;;36199:419;;;:::o;36624:::-;36790:4;36828:2;36817:9;36813:18;36805:26;;36877:9;36871:4;36867:20;36863:1;36852:9;36848:17;36841:47;36905:131;37031:4;36905:131;:::i;:::-;36897:139;;36624:419;;;:::o;37049:::-;37215:4;37253:2;37242:9;37238:18;37230:26;;37302:9;37296:4;37292:20;37288:1;37277:9;37273:17;37266:47;37330:131;37456:4;37330:131;:::i;:::-;37322:139;;37049:419;;;:::o;37474:::-;37640:4;37678:2;37667:9;37663:18;37655:26;;37727:9;37721:4;37717:20;37713:1;37702:9;37698:17;37691:47;37755:131;37881:4;37755:131;:::i;:::-;37747:139;;37474:419;;;:::o;37899:222::-;37992:4;38030:2;38019:9;38015:18;38007:26;;38043:71;38111:1;38100:9;38096:17;38087:6;38043:71;:::i;:::-;37899:222;;;;:::o;38127:129::-;38161:6;38188:20;;:::i;:::-;38178:30;;38217:33;38245:4;38237:6;38217:33;:::i;:::-;38127:129;;;:::o;38262:75::-;38295:6;38328:2;38322:9;38312:19;;38262:75;:::o;38343:307::-;38404:4;38494:18;38486:6;38483:30;38480:56;;;38516:18;;:::i;:::-;38480:56;38554:29;38576:6;38554:29;:::i;:::-;38546:37;;38638:4;38632;38628:15;38620:23;;38343:307;;;:::o;38656:308::-;38718:4;38808:18;38800:6;38797:30;38794:56;;;38830:18;;:::i;:::-;38794:56;38868:29;38890:6;38868:29;:::i;:::-;38860:37;;38952:4;38946;38942:15;38934:23;;38656:308;;;:::o;38970:132::-;39037:4;39060:3;39052:11;;39090:4;39085:3;39081:14;39073:22;;38970:132;;;:::o;39108:114::-;39175:6;39209:5;39203:12;39193:22;;39108:114;;;:::o;39228:98::-;39279:6;39313:5;39307:12;39297:22;;39228:98;;;:::o;39332:99::-;39384:6;39418:5;39412:12;39402:22;;39332:99;;;:::o;39437:113::-;39507:4;39539;39534:3;39530:14;39522:22;;39437:113;;;:::o;39556:184::-;39655:11;39689:6;39684:3;39677:19;39729:4;39724:3;39720:14;39705:29;;39556:184;;;;:::o;39746:168::-;39829:11;39863:6;39858:3;39851:19;39903:4;39898:3;39894:14;39879:29;;39746:168;;;;:::o;39920:147::-;40021:11;40058:3;40043:18;;39920:147;;;;:::o;40073:169::-;40157:11;40191:6;40186:3;40179:19;40231:4;40226:3;40222:14;40207:29;;40073:169;;;;:::o;40248:148::-;40350:11;40387:3;40372:18;;40248:148;;;;:::o;40402:305::-;40442:3;40461:20;40479:1;40461:20;:::i;:::-;40456:25;;40495:20;40513:1;40495:20;:::i;:::-;40490:25;;40649:1;40581:66;40577:74;40574:1;40571:81;40568:107;;;40655:18;;:::i;:::-;40568:107;40699:1;40696;40692:9;40685:16;;40402:305;;;;:::o;40713:185::-;40753:1;40770:20;40788:1;40770:20;:::i;:::-;40765:25;;40804:20;40822:1;40804:20;:::i;:::-;40799:25;;40843:1;40833:35;;40848:18;;:::i;:::-;40833:35;40890:1;40887;40883:9;40878:14;;40713:185;;;;:::o;40904:191::-;40944:4;40964:20;40982:1;40964:20;:::i;:::-;40959:25;;40998:20;41016:1;40998:20;:::i;:::-;40993:25;;41037:1;41034;41031:8;41028:34;;;41042:18;;:::i;:::-;41028:34;41087:1;41084;41080:9;41072:17;;40904:191;;;;:::o;41101:96::-;41138:7;41167:24;41185:5;41167:24;:::i;:::-;41156:35;;41101:96;;;:::o;41203:104::-;41248:7;41277:24;41295:5;41277:24;:::i;:::-;41266:35;;41203:104;;;:::o;41313:90::-;41347:7;41390:5;41383:13;41376:21;41365:32;;41313:90;;;:::o;41409:77::-;41446:7;41475:5;41464:16;;41409:77;;;:::o;41492:149::-;41528:7;41568:66;41561:5;41557:78;41546:89;;41492:149;;;:::o;41647:126::-;41684:7;41724:42;41717:5;41713:54;41702:65;;41647:126;;;:::o;41779:77::-;41816:7;41845:5;41834:16;;41779:77;;;:::o;41862:154::-;41946:6;41941:3;41936;41923:30;42008:1;41999:6;41994:3;41990:16;41983:27;41862:154;;;:::o;42022:307::-;42090:1;42100:113;42114:6;42111:1;42108:13;42100:113;;;42199:1;42194:3;42190:11;42184:18;42180:1;42175:3;42171:11;42164:39;42136:2;42133:1;42129:10;42124:15;;42100:113;;;42231:6;42228:1;42225:13;42222:101;;;42311:1;42302:6;42297:3;42293:16;42286:27;42222:101;42071:258;42022:307;;;:::o;42335:320::-;42379:6;42416:1;42410:4;42406:12;42396:22;;42463:1;42457:4;42453:12;42484:18;42474:81;;42540:4;42532:6;42528:17;42518:27;;42474:81;42602:2;42594:6;42591:14;42571:18;42568:38;42565:84;;;42621:18;;:::i;:::-;42565:84;42386:269;42335:320;;;:::o;42661:281::-;42744:27;42766:4;42744:27;:::i;:::-;42736:6;42732:40;42874:6;42862:10;42859:22;42838:18;42826:10;42823:34;42820:62;42817:88;;;42885:18;;:::i;:::-;42817:88;42925:10;42921:2;42914:22;42704:238;42661:281;;:::o;42948:233::-;42987:3;43010:24;43028:5;43010:24;:::i;:::-;43001:33;;43056:66;43049:5;43046:77;43043:103;;;43126:18;;:::i;:::-;43043:103;43173:1;43166:5;43162:13;43155:20;;42948:233;;;:::o;43187:100::-;43226:7;43255:26;43275:5;43255:26;:::i;:::-;43244:37;;43187:100;;;:::o;43293:94::-;43332:7;43361:20;43375:5;43361:20;:::i;:::-;43350:31;;43293:94;;;:::o;43393:79::-;43432:7;43461:5;43450:16;;43393:79;;;:::o;43478:176::-;43510:1;43527:20;43545:1;43527:20;:::i;:::-;43522:25;;43561:20;43579:1;43561:20;:::i;:::-;43556:25;;43600:1;43590:35;;43605:18;;:::i;:::-;43590:35;43646:1;43643;43639:9;43634:14;;43478:176;;;;:::o;43660:180::-;43708:77;43705:1;43698:88;43805:4;43802:1;43795:15;43829:4;43826:1;43819:15;43846:180;43894:77;43891:1;43884:88;43991:4;43988:1;43981:15;44015:4;44012:1;44005:15;44032:180;44080:77;44077:1;44070:88;44177:4;44174:1;44167:15;44201:4;44198:1;44191:15;44218:180;44266:77;44263:1;44256:88;44363:4;44360:1;44353:15;44387:4;44384:1;44377:15;44404:180;44452:77;44449:1;44442:88;44549:4;44546:1;44539:15;44573:4;44570:1;44563:15;44590:180;44638:77;44635:1;44628:88;44735:4;44732:1;44725:15;44759:4;44756:1;44749:15;44776:117;44885:1;44882;44875:12;44899:117;45008:1;45005;44998:12;45022:117;45131:1;45128;45121:12;45145:117;45254:1;45251;45244:12;45268:102;45309:6;45360:2;45356:7;45351:2;45344:5;45340:14;45336:28;45326:38;;45268:102;;;:::o;45376:94::-;45409:8;45457:5;45453:2;45449:14;45428:35;;45376:94;;;:::o;45476:221::-;45616:34;45612:1;45604:6;45600:14;45593:58;45685:4;45680:2;45672:6;45668:15;45661:29;45476:221;:::o;45703:237::-;45843:34;45839:1;45831:6;45827:14;45820:58;45912:20;45907:2;45899:6;45895:15;45888:45;45703:237;:::o;45946:225::-;46086:34;46082:1;46074:6;46070:14;46063:58;46155:8;46150:2;46142:6;46138:15;46131:33;45946:225;:::o;46177:178::-;46317:30;46313:1;46305:6;46301:14;46294:54;46177:178;:::o;46361:223::-;46501:34;46497:1;46489:6;46485:14;46478:58;46570:6;46565:2;46557:6;46553:15;46546:31;46361:223;:::o;46590:175::-;46730:27;46726:1;46718:6;46714:14;46707:51;46590:175;:::o;46771:245::-;46911:34;46907:1;46899:6;46895:14;46888:58;46980:28;46975:2;46967:6;46963:15;46956:53;46771:245;:::o;47022:179::-;47162:31;47158:1;47150:6;47146:14;47139:55;47022:179;:::o;47207:225::-;47347:34;47343:1;47335:6;47331:14;47324:58;47416:8;47411:2;47403:6;47399:15;47392:33;47207:225;:::o;47438:231::-;47578:34;47574:1;47566:6;47562:14;47555:58;47647:14;47642:2;47634:6;47630:15;47623:39;47438:231;:::o;47675:167::-;47815:19;47811:1;47803:6;47799:14;47792:43;47675:167;:::o;47848:243::-;47988:34;47984:1;47976:6;47972:14;47965:58;48057:26;48052:2;48044:6;48040:15;48033:51;47848:243;:::o;48097:229::-;48237:34;48233:1;48225:6;48221:14;48214:58;48306:12;48301:2;48293:6;48289:15;48282:37;48097:229;:::o;48332:221::-;48472:34;48468:1;48460:6;48456:14;48449:58;48541:4;48536:2;48528:6;48524:15;48517:29;48332:221;:::o;48559:182::-;48699:34;48695:1;48687:6;48683:14;48676:58;48559:182;:::o;48747:231::-;48887:34;48883:1;48875:6;48871:14;48864:58;48956:14;48951:2;48943:6;48939:15;48932:39;48747:231;:::o;48984:155::-;49124:7;49120:1;49112:6;49108:14;49101:31;48984:155;:::o;49145:182::-;49285:34;49281:1;49273:6;49269:14;49262:58;49145:182;:::o;49333:228::-;49473:34;49469:1;49461:6;49457:14;49450:58;49542:11;49537:2;49529:6;49525:15;49518:36;49333:228;:::o;49567:234::-;49707:34;49703:1;49695:6;49691:14;49684:58;49776:17;49771:2;49763:6;49759:15;49752:42;49567:234;:::o;49807:163::-;49947:15;49943:1;49935:6;49931:14;49924:39;49807:163;:::o;49976:220::-;50116:34;50112:1;50104:6;50100:14;50093:58;50185:3;50180:2;50172:6;50168:15;50161:28;49976:220;:::o;50202:114::-;;:::o;50322:236::-;50462:34;50458:1;50450:6;50446:14;50439:58;50531:19;50526:2;50518:6;50514:15;50507:44;50322:236;:::o;50564:179::-;50704:31;50700:1;50692:6;50688:14;50681:55;50564:179;:::o;50749:169::-;50889:21;50885:1;50877:6;50873:14;50866:45;50749:169;:::o;50924:173::-;51064:25;51060:1;51052:6;51048:14;51041:49;50924:173;:::o;51103:122::-;51176:24;51194:5;51176:24;:::i;:::-;51169:5;51166:35;51156:63;;51215:1;51212;51205:12;51156:63;51103:122;:::o;51231:138::-;51312:32;51338:5;51312:32;:::i;:::-;51305:5;51302:43;51292:71;;51359:1;51356;51349:12;51292:71;51231:138;:::o;51375:116::-;51445:21;51460:5;51445:21;:::i;:::-;51438:5;51435:32;51425:60;;51481:1;51478;51471:12;51425:60;51375:116;:::o;51497:122::-;51570:24;51588:5;51570:24;:::i;:::-;51563:5;51560:35;51550:63;;51609:1;51606;51599:12;51550:63;51497:122;:::o;51625:120::-;51697:23;51714:5;51697:23;:::i;:::-;51690:5;51687:34;51677:62;;51735:1;51732;51725:12;51677:62;51625:120;:::o;51751:122::-;51824:24;51842:5;51824:24;:::i;:::-;51817:5;51814:35;51804:63;;51863:1;51860;51853:12;51804:63;51751:122;:::o
Swarm Source
ipfs://d2b21069746da17c1664dd534f079b1b1fde066eaf12249509fcce2d28af47e9
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.