Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 14 from a total of 14 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Safe Mint | 15377522 | 926 days ago | IN | 0 ETH | 0.00067602 | ||||
Safe Mint | 15284333 | 941 days ago | IN | 0 ETH | 0.00267769 | ||||
Safe Mint | 15275909 | 942 days ago | IN | 0 ETH | 0.00050897 | ||||
Safe Mint | 15274776 | 942 days ago | IN | 0 ETH | 0.00074543 | ||||
Safe Mint | 15271806 | 943 days ago | IN | 0 ETH | 0.00043838 | ||||
Safe Mint | 15269294 | 943 days ago | IN | 0 ETH | 0.00215691 | ||||
Set Approval For... | 15246135 | 947 days ago | IN | 0 ETH | 0.00046285 | ||||
Set Approval For... | 15245903 | 947 days ago | IN | 0 ETH | 0.00067881 | ||||
Safe Mint | 15245903 | 947 days ago | IN | 0 ETH | 0.00373677 | ||||
Safe Mint | 15233948 | 949 days ago | IN | 0 ETH | 0.00237288 | ||||
Safe Mint | 15226555 | 950 days ago | IN | 0 ETH | 0.00553607 | ||||
Set Approval For... | 15224521 | 950 days ago | IN | 0 ETH | 0.00053391 | ||||
Safe Mint | 15224502 | 950 days ago | IN | 0 ETH | 0.00226643 | ||||
Safe Mint | 15224307 | 950 days ago | IN | 0 ETH | 0.00124412 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
TheCryptoTowers
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-01 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/[email protected]/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/[email protected]/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/[email protected]/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/[email protected]/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/[email protected]/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/[email protected]/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/[email protected]/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/[email protected]/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/[email protected]/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721URIStorage.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev See {ERC721-_burn}. This override additionally checks to see if a * token-specific URI was set for the token, and if so, it deletes the token URI from * the storage mapping. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contract-e741b85c3b.sol pragma solidity ^0.8.4; contract TheCryptoTowers is ERC721, ERC721Enumerable, ERC721URIStorage { using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; uint256 MAX_SUPPLY = 10000; constructor() ERC721("The Crypto Towers", "TCT") {} function safeMint(address to, string memory uri) public { uint256 tokenId = _tokenIdCounter.current(); require(tokenId <= MAX_SUPPLY, "I'm sorry all NFTs have been minted"); _tokenIdCounter.increment(); _safeMint(to, tokenId); _setTokenURI(tokenId, uri); } // The following functions are overrides required by Solidity. function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"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":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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"name":"safeMint","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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052612710600c553480156200001757600080fd5b506040518060400160405280601181526020017f5468652043727970746f20546f776572730000000000000000000000000000008152506040518060400160405280600381526020017f544354000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200009c929190620000be565b508060019080519060200190620000b5929190620000be565b505050620001d3565b828054620000cc906200016e565b90600052602060002090601f016020900481019282620000f057600085556200013c565b82601f106200010b57805160ff19168380011785556200013c565b828001600101855582156200013c579182015b828111156200013b5782518255916020019190600101906200011e565b5b5090506200014b91906200014f565b5090565b5b808211156200016a57600081600090555060010162000150565b5090565b600060028204905060018216806200018757607f821691505b602082108114156200019e576200019d620001a4565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6131ec80620001e36000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c80634f6ccce7116100a2578063a22cb46511610071578063a22cb465146102de578063b88d4fde146102fa578063c87b56dd14610316578063d204c45e14610346578063e985e9c5146103625761010b565b80634f6ccce7146102305780636352211e1461026057806370a082311461029057806395d89b41146102c05761010b565b806318160ddd116100de57806318160ddd146101aa57806323b872dd146101c85780632f745c59146101e457806342842e0e146102145761010b565b806301ffc9a71461011057806306fdde0314610140578063081812fc1461015e578063095ea7b31461018e575b600080fd5b61012a60048036038101906101259190612351565b610392565b6040516101379190612734565b60405180910390f35b6101486103a4565b604051610155919061274f565b60405180910390f35b610178600480360381019061017391906123a3565b610436565b60405161018591906126cd565b60405180910390f35b6101a860048036038101906101a39190612315565b61047c565b005b6101b2610594565b6040516101bf9190612951565b60405180910390f35b6101e260048036038101906101dd91906121bb565b6105a1565b005b6101fe60048036038101906101f99190612315565b610601565b60405161020b9190612951565b60405180910390f35b61022e600480360381019061022991906121bb565b6106a6565b005b61024a600480360381019061024591906123a3565b6106c6565b6040516102579190612951565b60405180910390f35b61027a600480360381019061027591906123a3565b61075d565b60405161028791906126cd565b60405180910390f35b6102aa60048036038101906102a59190612156565b61080f565b6040516102b79190612951565b60405180910390f35b6102c86108c7565b6040516102d5919061274f565b60405180910390f35b6102f860048036038101906102f39190612285565b610959565b005b610314600480360381019061030f919061220a565b61096f565b005b610330600480360381019061032b91906123a3565b6109d1565b60405161033d919061274f565b60405180910390f35b610360600480360381019061035b91906122c1565b6109e3565b005b61037c6004803603810190610377919061217f565b610a59565b6040516103899190612734565b60405180910390f35b600061039d82610aed565b9050919050565b6060600080546103b390612ba7565b80601f01602080910402602001604051908101604052809291908181526020018280546103df90612ba7565b801561042c5780601f106104015761010080835404028352916020019161042c565b820191906000526020600020905b81548152906001019060200180831161040f57829003601f168201915b5050505050905090565b600061044182610b67565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104878261075d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156104f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ef906128d1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610517610bb2565b73ffffffffffffffffffffffffffffffffffffffff161480610546575061054581610540610bb2565b610a59565b5b610585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161057c90612871565b60405180910390fd5b61058f8383610bba565b505050565b6000600880549050905090565b6105b26105ac610bb2565b82610c73565b6105f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e890612931565b60405180910390fd5b6105fc838383610d08565b505050565b600061060c8361080f565b821061064d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064490612771565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6106c18383836040518060200160405280600081525061096f565b505050565b60006106d0610594565b8210610711576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610708906128f1565b60405180910390fd5b6008828154811061074b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610806576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fd906128b1565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087790612831565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600180546108d690612ba7565b80601f016020809104026020016040519081016040528092919081815260200182805461090290612ba7565b801561094f5780601f106109245761010080835404028352916020019161094f565b820191906000526020600020905b81548152906001019060200180831161093257829003601f168201915b5050505050905090565b61096b610964610bb2565b8383610f6f565b5050565b61098061097a610bb2565b83610c73565b6109bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b690612931565b60405180910390fd5b6109cb848484846110dc565b50505050565b60606109dc82611138565b9050919050565b60006109ef600b61124b565b9050600c54811115610a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2d90612911565b60405180910390fd5b610a40600b611259565b610a4a838261126f565b610a54818361128d565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b605750610b5f82611301565b5b9050919050565b610b70816113e3565b610baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba6906128b1565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610c2d8361075d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610c7f8361075d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610cc15750610cc08185610a59565b5b80610cff57508373ffffffffffffffffffffffffffffffffffffffff16610ce784610436565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610d288261075d565b73ffffffffffffffffffffffffffffffffffffffff1614610d7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d75906127b1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610dee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de5906127f1565b60405180910390fd5b610df983838361144f565b610e04600082610bba565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e549190612abd565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610eab9190612a36565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f6a83838361145f565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd590612811565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110cf9190612734565b60405180910390a3505050565b6110e7848484610d08565b6110f384848484611464565b611132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112990612791565b60405180910390fd5b50505050565b606061114382610b67565b6000600a6000848152602001908152602001600020805461116390612ba7565b80601f016020809104026020016040519081016040528092919081815260200182805461118f90612ba7565b80156111dc5780601f106111b1576101008083540402835291602001916111dc565b820191906000526020600020905b8154815290600101906020018083116111bf57829003601f168201915b5050505050905060006111ed6115fb565b9050600081511415611203578192505050611246565b6000825111156112385780826040516020016112209291906126a9565b60405160208183030381529060405292505050611246565b61124184611612565b925050505b919050565b600081600001549050919050565b6001816000016000828254019250508190555050565b61128982826040518060200160405280600081525061167a565b5050565b611296826113e3565b6112d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cc90612851565b60405180910390fd5b80600a600084815260200190815260200160002090805190602001906112fc929190611f7a565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806113cc57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806113dc57506113db826116d5565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b61145a83838361173f565b505050565b505050565b60006114858473ffffffffffffffffffffffffffffffffffffffff16611853565b156115ee578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026114ae610bb2565b8786866040518563ffffffff1660e01b81526004016114d094939291906126e8565b602060405180830381600087803b1580156114ea57600080fd5b505af192505050801561151b57506040513d601f19601f82011682018060405250810190611518919061237a565b60015b61159e573d806000811461154b576040519150601f19603f3d011682016040523d82523d6000602084013e611550565b606091505b50600081511415611596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158d90612791565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506115f3565b600190505b949350505050565b606060405180602001604052806000815250905090565b606061161d82610b67565b60006116276115fb565b905060008151116116475760405180602001604052806000815250611672565b8061165184611876565b6040516020016116629291906126a9565b6040516020818303038152906040525b915050919050565b6116848383611a23565b6116916000848484611464565b6116d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c790612791565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61174a838383611bfd565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561178d5761178881611c02565b6117cc565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146117cb576117ca8382611c4b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561180f5761180a81611db8565b61184e565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461184d5761184c8282611efb565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606060008214156118be576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611a1e565b600082905060005b600082146118f05780806118d990612c0a565b915050600a826118e99190612a8c565b91506118c6565b60008167ffffffffffffffff811115611932577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156119645781602001600182028036833780820191505090505b5090505b60008514611a175760018261197d9190612abd565b9150600a8561198c9190612c53565b60306119989190612a36565b60f81b8183815181106119d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611a109190612a8c565b9450611968565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8a90612891565b60405180910390fd5b611a9c816113e3565b15611adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad3906127d1565b60405180910390fd5b611ae86000838361144f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b389190612a36565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611bf96000838361145f565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001611c588461080f565b611c629190612abd565b9050600060076000848152602001908152602001600020549050818114611d47576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050611dcc9190612abd565b9050600060096000848152602001908152602001600020549050600060088381548110611e22577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110611e6a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480611edf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000611f068361080f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054611f8690612ba7565b90600052602060002090601f016020900481019282611fa85760008555611fef565b82601f10611fc157805160ff1916838001178555611fef565b82800160010185558215611fef579182015b82811115611fee578251825591602001919060010190611fd3565b5b509050611ffc9190612000565b5090565b5b80821115612019576000816000905550600101612001565b5090565b600061203061202b84612991565b61296c565b90508281526020810184848401111561204857600080fd5b612053848285612b65565b509392505050565b600061206e612069846129c2565b61296c565b90508281526020810184848401111561208657600080fd5b612091848285612b65565b509392505050565b6000813590506120a88161315a565b92915050565b6000813590506120bd81613171565b92915050565b6000813590506120d281613188565b92915050565b6000815190506120e781613188565b92915050565b600082601f8301126120fe57600080fd5b813561210e84826020860161201d565b91505092915050565b600082601f83011261212857600080fd5b813561213884826020860161205b565b91505092915050565b6000813590506121508161319f565b92915050565b60006020828403121561216857600080fd5b600061217684828501612099565b91505092915050565b6000806040838503121561219257600080fd5b60006121a085828601612099565b92505060206121b185828601612099565b9150509250929050565b6000806000606084860312156121d057600080fd5b60006121de86828701612099565b93505060206121ef86828701612099565b925050604061220086828701612141565b9150509250925092565b6000806000806080858703121561222057600080fd5b600061222e87828801612099565b945050602061223f87828801612099565b935050604061225087828801612141565b925050606085013567ffffffffffffffff81111561226d57600080fd5b612279878288016120ed565b91505092959194509250565b6000806040838503121561229857600080fd5b60006122a685828601612099565b92505060206122b7858286016120ae565b9150509250929050565b600080604083850312156122d457600080fd5b60006122e285828601612099565b925050602083013567ffffffffffffffff8111156122ff57600080fd5b61230b85828601612117565b9150509250929050565b6000806040838503121561232857600080fd5b600061233685828601612099565b925050602061234785828601612141565b9150509250929050565b60006020828403121561236357600080fd5b6000612371848285016120c3565b91505092915050565b60006020828403121561238c57600080fd5b600061239a848285016120d8565b91505092915050565b6000602082840312156123b557600080fd5b60006123c384828501612141565b91505092915050565b6123d581612af1565b82525050565b6123e481612b03565b82525050565b60006123f5826129f3565b6123ff8185612a09565b935061240f818560208601612b74565b61241881612d40565b840191505092915050565b600061242e826129fe565b6124388185612a1a565b9350612448818560208601612b74565b61245181612d40565b840191505092915050565b6000612467826129fe565b6124718185612a2b565b9350612481818560208601612b74565b80840191505092915050565b600061249a602b83612a1a565b91506124a582612d51565b604082019050919050565b60006124bd603283612a1a565b91506124c882612da0565b604082019050919050565b60006124e0602583612a1a565b91506124eb82612def565b604082019050919050565b6000612503601c83612a1a565b915061250e82612e3e565b602082019050919050565b6000612526602483612a1a565b915061253182612e67565b604082019050919050565b6000612549601983612a1a565b915061255482612eb6565b602082019050919050565b600061256c602983612a1a565b915061257782612edf565b604082019050919050565b600061258f602e83612a1a565b915061259a82612f2e565b604082019050919050565b60006125b2603e83612a1a565b91506125bd82612f7d565b604082019050919050565b60006125d5602083612a1a565b91506125e082612fcc565b602082019050919050565b60006125f8601883612a1a565b915061260382612ff5565b602082019050919050565b600061261b602183612a1a565b91506126268261301e565b604082019050919050565b600061263e602c83612a1a565b91506126498261306d565b604082019050919050565b6000612661602383612a1a565b915061266c826130bc565b604082019050919050565b6000612684602e83612a1a565b915061268f8261310b565b604082019050919050565b6126a381612b5b565b82525050565b60006126b5828561245c565b91506126c1828461245c565b91508190509392505050565b60006020820190506126e260008301846123cc565b92915050565b60006080820190506126fd60008301876123cc565b61270a60208301866123cc565b612717604083018561269a565b818103606083015261272981846123ea565b905095945050505050565b600060208201905061274960008301846123db565b92915050565b600060208201905081810360008301526127698184612423565b905092915050565b6000602082019050818103600083015261278a8161248d565b9050919050565b600060208201905081810360008301526127aa816124b0565b9050919050565b600060208201905081810360008301526127ca816124d3565b9050919050565b600060208201905081810360008301526127ea816124f6565b9050919050565b6000602082019050818103600083015261280a81612519565b9050919050565b6000602082019050818103600083015261282a8161253c565b9050919050565b6000602082019050818103600083015261284a8161255f565b9050919050565b6000602082019050818103600083015261286a81612582565b9050919050565b6000602082019050818103600083015261288a816125a5565b9050919050565b600060208201905081810360008301526128aa816125c8565b9050919050565b600060208201905081810360008301526128ca816125eb565b9050919050565b600060208201905081810360008301526128ea8161260e565b9050919050565b6000602082019050818103600083015261290a81612631565b9050919050565b6000602082019050818103600083015261292a81612654565b9050919050565b6000602082019050818103600083015261294a81612677565b9050919050565b6000602082019050612966600083018461269a565b92915050565b6000612976612987565b90506129828282612bd9565b919050565b6000604051905090565b600067ffffffffffffffff8211156129ac576129ab612d11565b5b6129b582612d40565b9050602081019050919050565b600067ffffffffffffffff8211156129dd576129dc612d11565b5b6129e682612d40565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612a4182612b5b565b9150612a4c83612b5b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612a8157612a80612c84565b5b828201905092915050565b6000612a9782612b5b565b9150612aa283612b5b565b925082612ab257612ab1612cb3565b5b828204905092915050565b6000612ac882612b5b565b9150612ad383612b5b565b925082821015612ae657612ae5612c84565b5b828203905092915050565b6000612afc82612b3b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612b92578082015181840152602081019050612b77565b83811115612ba1576000848401525b50505050565b60006002820490506001821680612bbf57607f821691505b60208210811415612bd357612bd2612ce2565b5b50919050565b612be282612d40565b810181811067ffffffffffffffff82111715612c0157612c00612d11565b5b80604052505050565b6000612c1582612b5b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612c4857612c47612c84565b5b600182019050919050565b6000612c5e82612b5b565b9150612c6983612b5b565b925082612c7957612c78612cb3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f49276d20736f72727920616c6c204e4654732068617665206265656e206d696e60008201527f7465640000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b61316381612af1565b811461316e57600080fd5b50565b61317a81612b03565b811461318557600080fd5b50565b61319181612b0f565b811461319c57600080fd5b50565b6131a881612b5b565b81146131b357600080fd5b5056fea2646970667358221220299eac7b7e33889fc998fd83ffc6733439e05afe7545ac07dd15e4634882828564736f6c63430008040033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061010b5760003560e01c80634f6ccce7116100a2578063a22cb46511610071578063a22cb465146102de578063b88d4fde146102fa578063c87b56dd14610316578063d204c45e14610346578063e985e9c5146103625761010b565b80634f6ccce7146102305780636352211e1461026057806370a082311461029057806395d89b41146102c05761010b565b806318160ddd116100de57806318160ddd146101aa57806323b872dd146101c85780632f745c59146101e457806342842e0e146102145761010b565b806301ffc9a71461011057806306fdde0314610140578063081812fc1461015e578063095ea7b31461018e575b600080fd5b61012a60048036038101906101259190612351565b610392565b6040516101379190612734565b60405180910390f35b6101486103a4565b604051610155919061274f565b60405180910390f35b610178600480360381019061017391906123a3565b610436565b60405161018591906126cd565b60405180910390f35b6101a860048036038101906101a39190612315565b61047c565b005b6101b2610594565b6040516101bf9190612951565b60405180910390f35b6101e260048036038101906101dd91906121bb565b6105a1565b005b6101fe60048036038101906101f99190612315565b610601565b60405161020b9190612951565b60405180910390f35b61022e600480360381019061022991906121bb565b6106a6565b005b61024a600480360381019061024591906123a3565b6106c6565b6040516102579190612951565b60405180910390f35b61027a600480360381019061027591906123a3565b61075d565b60405161028791906126cd565b60405180910390f35b6102aa60048036038101906102a59190612156565b61080f565b6040516102b79190612951565b60405180910390f35b6102c86108c7565b6040516102d5919061274f565b60405180910390f35b6102f860048036038101906102f39190612285565b610959565b005b610314600480360381019061030f919061220a565b61096f565b005b610330600480360381019061032b91906123a3565b6109d1565b60405161033d919061274f565b60405180910390f35b610360600480360381019061035b91906122c1565b6109e3565b005b61037c6004803603810190610377919061217f565b610a59565b6040516103899190612734565b60405180910390f35b600061039d82610aed565b9050919050565b6060600080546103b390612ba7565b80601f01602080910402602001604051908101604052809291908181526020018280546103df90612ba7565b801561042c5780601f106104015761010080835404028352916020019161042c565b820191906000526020600020905b81548152906001019060200180831161040f57829003601f168201915b5050505050905090565b600061044182610b67565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104878261075d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156104f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ef906128d1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610517610bb2565b73ffffffffffffffffffffffffffffffffffffffff161480610546575061054581610540610bb2565b610a59565b5b610585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161057c90612871565b60405180910390fd5b61058f8383610bba565b505050565b6000600880549050905090565b6105b26105ac610bb2565b82610c73565b6105f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e890612931565b60405180910390fd5b6105fc838383610d08565b505050565b600061060c8361080f565b821061064d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064490612771565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6106c18383836040518060200160405280600081525061096f565b505050565b60006106d0610594565b8210610711576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610708906128f1565b60405180910390fd5b6008828154811061074b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610806576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fd906128b1565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087790612831565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600180546108d690612ba7565b80601f016020809104026020016040519081016040528092919081815260200182805461090290612ba7565b801561094f5780601f106109245761010080835404028352916020019161094f565b820191906000526020600020905b81548152906001019060200180831161093257829003601f168201915b5050505050905090565b61096b610964610bb2565b8383610f6f565b5050565b61098061097a610bb2565b83610c73565b6109bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b690612931565b60405180910390fd5b6109cb848484846110dc565b50505050565b60606109dc82611138565b9050919050565b60006109ef600b61124b565b9050600c54811115610a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2d90612911565b60405180910390fd5b610a40600b611259565b610a4a838261126f565b610a54818361128d565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b605750610b5f82611301565b5b9050919050565b610b70816113e3565b610baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba6906128b1565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610c2d8361075d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610c7f8361075d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610cc15750610cc08185610a59565b5b80610cff57508373ffffffffffffffffffffffffffffffffffffffff16610ce784610436565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610d288261075d565b73ffffffffffffffffffffffffffffffffffffffff1614610d7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d75906127b1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610dee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de5906127f1565b60405180910390fd5b610df983838361144f565b610e04600082610bba565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e549190612abd565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610eab9190612a36565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f6a83838361145f565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd590612811565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110cf9190612734565b60405180910390a3505050565b6110e7848484610d08565b6110f384848484611464565b611132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112990612791565b60405180910390fd5b50505050565b606061114382610b67565b6000600a6000848152602001908152602001600020805461116390612ba7565b80601f016020809104026020016040519081016040528092919081815260200182805461118f90612ba7565b80156111dc5780601f106111b1576101008083540402835291602001916111dc565b820191906000526020600020905b8154815290600101906020018083116111bf57829003601f168201915b5050505050905060006111ed6115fb565b9050600081511415611203578192505050611246565b6000825111156112385780826040516020016112209291906126a9565b60405160208183030381529060405292505050611246565b61124184611612565b925050505b919050565b600081600001549050919050565b6001816000016000828254019250508190555050565b61128982826040518060200160405280600081525061167a565b5050565b611296826113e3565b6112d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cc90612851565b60405180910390fd5b80600a600084815260200190815260200160002090805190602001906112fc929190611f7a565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806113cc57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806113dc57506113db826116d5565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b61145a83838361173f565b505050565b505050565b60006114858473ffffffffffffffffffffffffffffffffffffffff16611853565b156115ee578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026114ae610bb2565b8786866040518563ffffffff1660e01b81526004016114d094939291906126e8565b602060405180830381600087803b1580156114ea57600080fd5b505af192505050801561151b57506040513d601f19601f82011682018060405250810190611518919061237a565b60015b61159e573d806000811461154b576040519150601f19603f3d011682016040523d82523d6000602084013e611550565b606091505b50600081511415611596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158d90612791565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506115f3565b600190505b949350505050565b606060405180602001604052806000815250905090565b606061161d82610b67565b60006116276115fb565b905060008151116116475760405180602001604052806000815250611672565b8061165184611876565b6040516020016116629291906126a9565b6040516020818303038152906040525b915050919050565b6116848383611a23565b6116916000848484611464565b6116d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c790612791565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61174a838383611bfd565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561178d5761178881611c02565b6117cc565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146117cb576117ca8382611c4b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561180f5761180a81611db8565b61184e565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461184d5761184c8282611efb565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b606060008214156118be576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611a1e565b600082905060005b600082146118f05780806118d990612c0a565b915050600a826118e99190612a8c565b91506118c6565b60008167ffffffffffffffff811115611932577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156119645781602001600182028036833780820191505090505b5090505b60008514611a175760018261197d9190612abd565b9150600a8561198c9190612c53565b60306119989190612a36565b60f81b8183815181106119d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611a109190612a8c565b9450611968565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8a90612891565b60405180910390fd5b611a9c816113e3565b15611adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad3906127d1565b60405180910390fd5b611ae86000838361144f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b389190612a36565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611bf96000838361145f565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001611c588461080f565b611c629190612abd565b9050600060076000848152602001908152602001600020549050818114611d47576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050611dcc9190612abd565b9050600060096000848152602001908152602001600020549050600060088381548110611e22577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110611e6a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480611edf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000611f068361080f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054611f8690612ba7565b90600052602060002090601f016020900481019282611fa85760008555611fef565b82601f10611fc157805160ff1916838001178555611fef565b82800160010185558215611fef579182015b82811115611fee578251825591602001919060010190611fd3565b5b509050611ffc9190612000565b5090565b5b80821115612019576000816000905550600101612001565b5090565b600061203061202b84612991565b61296c565b90508281526020810184848401111561204857600080fd5b612053848285612b65565b509392505050565b600061206e612069846129c2565b61296c565b90508281526020810184848401111561208657600080fd5b612091848285612b65565b509392505050565b6000813590506120a88161315a565b92915050565b6000813590506120bd81613171565b92915050565b6000813590506120d281613188565b92915050565b6000815190506120e781613188565b92915050565b600082601f8301126120fe57600080fd5b813561210e84826020860161201d565b91505092915050565b600082601f83011261212857600080fd5b813561213884826020860161205b565b91505092915050565b6000813590506121508161319f565b92915050565b60006020828403121561216857600080fd5b600061217684828501612099565b91505092915050565b6000806040838503121561219257600080fd5b60006121a085828601612099565b92505060206121b185828601612099565b9150509250929050565b6000806000606084860312156121d057600080fd5b60006121de86828701612099565b93505060206121ef86828701612099565b925050604061220086828701612141565b9150509250925092565b6000806000806080858703121561222057600080fd5b600061222e87828801612099565b945050602061223f87828801612099565b935050604061225087828801612141565b925050606085013567ffffffffffffffff81111561226d57600080fd5b612279878288016120ed565b91505092959194509250565b6000806040838503121561229857600080fd5b60006122a685828601612099565b92505060206122b7858286016120ae565b9150509250929050565b600080604083850312156122d457600080fd5b60006122e285828601612099565b925050602083013567ffffffffffffffff8111156122ff57600080fd5b61230b85828601612117565b9150509250929050565b6000806040838503121561232857600080fd5b600061233685828601612099565b925050602061234785828601612141565b9150509250929050565b60006020828403121561236357600080fd5b6000612371848285016120c3565b91505092915050565b60006020828403121561238c57600080fd5b600061239a848285016120d8565b91505092915050565b6000602082840312156123b557600080fd5b60006123c384828501612141565b91505092915050565b6123d581612af1565b82525050565b6123e481612b03565b82525050565b60006123f5826129f3565b6123ff8185612a09565b935061240f818560208601612b74565b61241881612d40565b840191505092915050565b600061242e826129fe565b6124388185612a1a565b9350612448818560208601612b74565b61245181612d40565b840191505092915050565b6000612467826129fe565b6124718185612a2b565b9350612481818560208601612b74565b80840191505092915050565b600061249a602b83612a1a565b91506124a582612d51565b604082019050919050565b60006124bd603283612a1a565b91506124c882612da0565b604082019050919050565b60006124e0602583612a1a565b91506124eb82612def565b604082019050919050565b6000612503601c83612a1a565b915061250e82612e3e565b602082019050919050565b6000612526602483612a1a565b915061253182612e67565b604082019050919050565b6000612549601983612a1a565b915061255482612eb6565b602082019050919050565b600061256c602983612a1a565b915061257782612edf565b604082019050919050565b600061258f602e83612a1a565b915061259a82612f2e565b604082019050919050565b60006125b2603e83612a1a565b91506125bd82612f7d565b604082019050919050565b60006125d5602083612a1a565b91506125e082612fcc565b602082019050919050565b60006125f8601883612a1a565b915061260382612ff5565b602082019050919050565b600061261b602183612a1a565b91506126268261301e565b604082019050919050565b600061263e602c83612a1a565b91506126498261306d565b604082019050919050565b6000612661602383612a1a565b915061266c826130bc565b604082019050919050565b6000612684602e83612a1a565b915061268f8261310b565b604082019050919050565b6126a381612b5b565b82525050565b60006126b5828561245c565b91506126c1828461245c565b91508190509392505050565b60006020820190506126e260008301846123cc565b92915050565b60006080820190506126fd60008301876123cc565b61270a60208301866123cc565b612717604083018561269a565b818103606083015261272981846123ea565b905095945050505050565b600060208201905061274960008301846123db565b92915050565b600060208201905081810360008301526127698184612423565b905092915050565b6000602082019050818103600083015261278a8161248d565b9050919050565b600060208201905081810360008301526127aa816124b0565b9050919050565b600060208201905081810360008301526127ca816124d3565b9050919050565b600060208201905081810360008301526127ea816124f6565b9050919050565b6000602082019050818103600083015261280a81612519565b9050919050565b6000602082019050818103600083015261282a8161253c565b9050919050565b6000602082019050818103600083015261284a8161255f565b9050919050565b6000602082019050818103600083015261286a81612582565b9050919050565b6000602082019050818103600083015261288a816125a5565b9050919050565b600060208201905081810360008301526128aa816125c8565b9050919050565b600060208201905081810360008301526128ca816125eb565b9050919050565b600060208201905081810360008301526128ea8161260e565b9050919050565b6000602082019050818103600083015261290a81612631565b9050919050565b6000602082019050818103600083015261292a81612654565b9050919050565b6000602082019050818103600083015261294a81612677565b9050919050565b6000602082019050612966600083018461269a565b92915050565b6000612976612987565b90506129828282612bd9565b919050565b6000604051905090565b600067ffffffffffffffff8211156129ac576129ab612d11565b5b6129b582612d40565b9050602081019050919050565b600067ffffffffffffffff8211156129dd576129dc612d11565b5b6129e682612d40565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612a4182612b5b565b9150612a4c83612b5b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612a8157612a80612c84565b5b828201905092915050565b6000612a9782612b5b565b9150612aa283612b5b565b925082612ab257612ab1612cb3565b5b828204905092915050565b6000612ac882612b5b565b9150612ad383612b5b565b925082821015612ae657612ae5612c84565b5b828203905092915050565b6000612afc82612b3b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612b92578082015181840152602081019050612b77565b83811115612ba1576000848401525b50505050565b60006002820490506001821680612bbf57607f821691505b60208210811415612bd357612bd2612ce2565b5b50919050565b612be282612d40565b810181811067ffffffffffffffff82111715612c0157612c00612d11565b5b80604052505050565b6000612c1582612b5b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612c4857612c47612c84565b5b600182019050919050565b6000612c5e82612b5b565b9150612c6983612b5b565b925082612c7957612c78612cb3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f49276d20736f72727920616c6c204e4654732068617665206265656e206d696e60008201527f7465640000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b61316381612af1565b811461316e57600080fd5b50565b61317a81612b03565b811461318557600080fd5b50565b61319181612b0f565b811461319c57600080fd5b50565b6131a881612b5b565b81146131b357600080fd5b5056fea2646970667358221220299eac7b7e33889fc998fd83ffc6733439e05afe7545ac07dd15e4634882828564736f6c63430008040033
Deployed Bytecode Sourcemap
47068:1401:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48254:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25608:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27121:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26638:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41487:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27821:336;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41155:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28228:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41677:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25319:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25050:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25777:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27364:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28484:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48050:196;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47331:306;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27590:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48254:212;48393:4;48422:36;48446:11;48422:23;:36::i;:::-;48415:43;;48254:212;;;:::o;25608:100::-;25662:13;25695:5;25688:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25608:100;:::o;27121:171::-;27197:7;27217:23;27232:7;27217:14;:23::i;:::-;27260:15;:24;27276:7;27260:24;;;;;;;;;;;;;;;;;;;;;27253:31;;27121:171;;;:::o;26638:417::-;26719:13;26735:23;26750:7;26735:14;:23::i;:::-;26719:39;;26783:5;26777:11;;:2;:11;;;;26769:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26877:5;26861:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26886:37;26903:5;26910:12;:10;:12::i;:::-;26886:16;:37::i;:::-;26861:62;26839:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;27026:21;27035:2;27039:7;27026:8;:21::i;:::-;26638:417;;;:::o;41487:113::-;41548:7;41575:10;:17;;;;41568:24;;41487:113;:::o;27821:336::-;28016:41;28035:12;:10;:12::i;:::-;28049:7;28016:18;:41::i;:::-;28008:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;28121:28;28131:4;28137:2;28141:7;28121:9;:28::i;:::-;27821:336;;;:::o;41155:256::-;41252:7;41288:23;41305:5;41288:16;:23::i;:::-;41280:5;:31;41272:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;41377:12;:19;41390:5;41377:19;;;;;;;;;;;;;;;:26;41397:5;41377:26;;;;;;;;;;;;41370:33;;41155:256;;;;:::o;28228:185::-;28366:39;28383:4;28389:2;28393:7;28366:39;;;;;;;;;;;;:16;:39::i;:::-;28228:185;;;:::o;41677:233::-;41752:7;41788:30;:28;:30::i;:::-;41780:5;:38;41772:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;41885:10;41896:5;41885:17;;;;;;;;;;;;;;;;;;;;;;;;41878:24;;41677:233;;;:::o;25319:222::-;25391:7;25411:13;25427:7;:16;25435:7;25427:16;;;;;;;;;;;;;;;;;;;;;25411:32;;25479:1;25462:19;;:5;:19;;;;25454:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;25528:5;25521:12;;;25319:222;;;:::o;25050:207::-;25122:7;25167:1;25150:19;;:5;:19;;;;25142:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25233:9;:16;25243:5;25233:16;;;;;;;;;;;;;;;;25226:23;;25050:207;;;:::o;25777:104::-;25833:13;25866:7;25859:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25777:104;:::o;27364:155::-;27459:52;27478:12;:10;:12::i;:::-;27492:8;27502;27459:18;:52::i;:::-;27364:155;;:::o;28484:323::-;28658:41;28677:12;:10;:12::i;:::-;28691:7;28658:18;:41::i;:::-;28650:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;28761:38;28775:4;28781:2;28785:7;28794:4;28761:13;:38::i;:::-;28484:323;;;;:::o;48050:196::-;48177:13;48215:23;48230:7;48215:14;:23::i;:::-;48208:30;;48050:196;;;:::o;47331:306::-;47398:15;47416:25;:15;:23;:25::i;:::-;47398:43;;47471:10;;47460:7;:21;;47452:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;47532:27;:15;:25;:27::i;:::-;47570:22;47580:2;47584:7;47570:9;:22::i;:::-;47603:26;47616:7;47625:3;47603:12;:26::i;:::-;47331:306;;;:::o;27590:164::-;27687:4;27711:18;:25;27730:5;27711:25;;;;;;;;;;;;;;;:35;27737:8;27711:35;;;;;;;;;;;;;;;;;;;;;;;;;27704:42;;27590:164;;;;:::o;40847:224::-;40949:4;40988:35;40973:50;;;:11;:50;;;;:90;;;;41027:36;41051:11;41027:23;:36::i;:::-;40973:90;40966:97;;40847:224;;;:::o;35096:135::-;35178:16;35186:7;35178;:16::i;:::-;35170:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;35096:135;:::o;4692:98::-;4745:7;4772:10;4765:17;;4692:98;:::o;34375:174::-;34477:2;34450:15;:24;34466:7;34450:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34533:7;34529:2;34495:46;;34504:23;34519:7;34504:14;:23::i;:::-;34495:46;;;;;;;;;;;;34375:174;;:::o;30608:264::-;30701:4;30718:13;30734:23;30749:7;30734:14;:23::i;:::-;30718:39;;30787:5;30776:16;;:7;:16;;;:52;;;;30796:32;30813:5;30820:7;30796:16;:32::i;:::-;30776:52;:87;;;;30856:7;30832:31;;:20;30844:7;30832:11;:20::i;:::-;:31;;;30776:87;30768:96;;;30608:264;;;;:::o;33631:625::-;33790:4;33763:31;;:23;33778:7;33763:14;:23::i;:::-;:31;;;33755:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;33869:1;33855:16;;:2;:16;;;;33847:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33925:39;33946:4;33952:2;33956:7;33925:20;:39::i;:::-;34029:29;34046:1;34050:7;34029:8;:29::i;:::-;34090:1;34071:9;:15;34081:4;34071:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34119:1;34102:9;:13;34112:2;34102:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34150:2;34131:7;:16;34139:7;34131:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34189:7;34185:2;34170:27;;34179:4;34170:27;;;;;;;;;;;;34210:38;34230:4;34236:2;34240:7;34210:19;:38::i;:::-;33631:625;;;:::o;34692:315::-;34847:8;34838:17;;:5;:17;;;;34830:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;34934:8;34896:18;:25;34915:5;34896:25;;;;;;;;;;;;;;;:35;34922:8;34896:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;34980:8;34958:41;;34973:5;34958:41;;;34990:8;34958:41;;;;;;:::i;:::-;;;;;;;;34692:315;;;:::o;29688:313::-;29844:28;29854:4;29860:2;29864:7;29844:9;:28::i;:::-;29891:47;29914:4;29920:2;29924:7;29933:4;29891:22;:47::i;:::-;29883:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;29688:313;;;;:::o;38395:624::-;38468:13;38494:23;38509:7;38494:14;:23::i;:::-;38530;38556:10;:19;38567:7;38556:19;;;;;;;;;;;38530:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38586:18;38607:10;:8;:10::i;:::-;38586:31;;38715:1;38699:4;38693:18;:23;38689:72;;;38740:9;38733:16;;;;;;38689:72;38891:1;38871:9;38865:23;:27;38861:108;;;38940:4;38946:9;38923:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38909:48;;;;;;38861:108;38988:23;39003:7;38988:14;:23::i;:::-;38981:30;;;;38395:624;;;;:::o;911:114::-;976:7;1003;:14;;;996:21;;911:114;;;:::o;1033:127::-;1140:1;1122:7;:14;;;:19;;;;;;;;;;;1033:127;:::o;31214:110::-;31290:26;31300:2;31304:7;31290:26;;;;;;;;;;;;:9;:26::i;:::-;31214:110;;:::o;39175:217::-;39275:16;39283:7;39275;:16::i;:::-;39267:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;39375:9;39353:10;:19;39364:7;39353:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;39175:217;;:::o;24681:305::-;24783:4;24835:25;24820:40;;;:11;:40;;;;:105;;;;24892:33;24877:48;;;:11;:48;;;;24820:105;:158;;;;24942:36;24966:11;24942:23;:36::i;:::-;24820:158;24800:178;;24681:305;;;:::o;30314:127::-;30379:4;30431:1;30403:30;;:7;:16;30411:7;30403:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30396:37;;30314:127;;;:::o;47715:204::-;47866:45;47893:4;47899:2;47903:7;47866:26;:45::i;:::-;47715:204;;;:::o;37731:125::-;;;;:::o;35795:853::-;35949:4;35970:15;:2;:13;;;:15::i;:::-;35966:675;;;36022:2;36006:36;;;36043:12;:10;:12::i;:::-;36057:4;36063:7;36072:4;36006:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36002:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36264:1;36247:6;:13;:18;36243:328;;;36290:60;;;;;;;;;;:::i;:::-;;;;;;;;36243:328;36521:6;36515:13;36506:6;36502:2;36498:15;36491:38;36002:584;36138:41;;;36128:51;;;:6;:51;;;;36121:58;;;;;35966:675;36625:4;36618:11;;35795:853;;;;;;;:::o;26482:94::-;26533:13;26559:9;;;;;;;;;;;;;;26482:94;:::o;25952:281::-;26025:13;26051:23;26066:7;26051:14;:23::i;:::-;26087:21;26111:10;:8;:10::i;:::-;26087:34;;26163:1;26145:7;26139:21;:25;:86;;;;;;;;;;;;;;;;;26191:7;26200:18;:7;:16;:18::i;:::-;26174:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26139:86;26132:93;;;25952:281;;;:::o;31551:319::-;31680:18;31686:2;31690:7;31680:5;:18::i;:::-;31731:53;31762:1;31766:2;31770:7;31779:4;31731:22;:53::i;:::-;31709:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;31551:319;;;:::o;16319:157::-;16404:4;16443:25;16428:40;;;:11;:40;;;;16421:47;;16319:157;;;:::o;42523:589::-;42667:45;42694:4;42700:2;42704:7;42667:26;:45::i;:::-;42745:1;42729:18;;:4;:18;;;42725:187;;;42764:40;42796:7;42764:31;:40::i;:::-;42725:187;;;42834:2;42826:10;;:4;:10;;;42822:90;;42853:47;42886:4;42892:7;42853:32;:47::i;:::-;42822:90;42725:187;42940:1;42926:16;;:2;:16;;;42922:183;;;42959:45;42996:7;42959:36;:45::i;:::-;42922:183;;;43032:4;43026:10;;:2;:10;;;43022:83;;43053:40;43081:2;43085:7;43053:27;:40::i;:::-;43022:83;42922:183;42523:589;;;:::o;6145:326::-;6205:4;6462:1;6440:7;:19;;;:23;6433:30;;6145:326;;;:::o;1940:723::-;1996:13;2226:1;2217:5;:10;2213:53;;;2244:10;;;;;;;;;;;;;;;;;;;;;2213:53;2276:12;2291:5;2276:20;;2307:14;2332:78;2347:1;2339:4;:9;2332:78;;2365:8;;;;;:::i;:::-;;;;2396:2;2388:10;;;;;:::i;:::-;;;2332:78;;;2420:19;2452:6;2442:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2420:39;;2470:154;2486:1;2477:5;:10;2470:154;;2514:1;2504:11;;;;;:::i;:::-;;;2581:2;2573:5;:10;;;;:::i;:::-;2560:2;:24;;;;:::i;:::-;2547:39;;2530:6;2537;2530:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;2610:2;2601:11;;;;;:::i;:::-;;;2470:154;;;2648:6;2634:21;;;;;1940:723;;;;:::o;32206:439::-;32300:1;32286:16;;:2;:16;;;;32278:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32359:16;32367:7;32359;:16::i;:::-;32358:17;32350:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32421:45;32450:1;32454:2;32458:7;32421:20;:45::i;:::-;32496:1;32479:9;:13;32489:2;32479:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32527:2;32508:7;:16;32516:7;32508:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32572:7;32568:2;32547:33;;32564:1;32547:33;;;;;;;;;;;;32593:44;32621:1;32625:2;32629:7;32593:19;:44::i;:::-;32206:439;;:::o;37220:126::-;;;;:::o;43835:164::-;43939:10;:17;;;;43912:15;:24;43928:7;43912:24;;;;;;;;;;;:44;;;;43967:10;43983:7;43967:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43835:164;:::o;44626:988::-;44892:22;44942:1;44917:22;44934:4;44917:16;:22::i;:::-;:26;;;;:::i;:::-;44892:51;;44954:18;44975:17;:26;44993:7;44975:26;;;;;;;;;;;;44954:47;;45122:14;45108:10;:28;45104:328;;45153:19;45175:12;:18;45188:4;45175:18;;;;;;;;;;;;;;;:34;45194:14;45175:34;;;;;;;;;;;;45153:56;;45259:11;45226:12;:18;45239:4;45226:18;;;;;;;;;;;;;;;:30;45245:10;45226:30;;;;;;;;;;;:44;;;;45376:10;45343:17;:30;45361:11;45343:30;;;;;;;;;;;:43;;;;45104:328;;45528:17;:26;45546:7;45528:26;;;;;;;;;;;45521:33;;;45572:12;:18;45585:4;45572:18;;;;;;;;;;;;;;;:34;45591:14;45572:34;;;;;;;;;;;45565:41;;;44626:988;;;;:::o;45909:1079::-;46162:22;46207:1;46187:10;:17;;;;:21;;;;:::i;:::-;46162:46;;46219:18;46240:15;:24;46256:7;46240:24;;;;;;;;;;;;46219:45;;46591:19;46613:10;46624:14;46613:26;;;;;;;;;;;;;;;;;;;;;;;;46591:48;;46677:11;46652:10;46663;46652:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;46788:10;46757:15;:28;46773:11;46757:28;;;;;;;;;;;:41;;;;46929:15;:24;46945:7;46929:24;;;;;;;;;;;46922:31;;;46964:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45909:1079;;;;:::o;43413:221::-;43498:14;43515:20;43532:2;43515:16;:20::i;:::-;43498:37;;43573:7;43546:12;:16;43559:2;43546:16;;;;;;;;;;;;;;;:24;43563:6;43546:24;;;;;;;;;;;:34;;;;43620:6;43591:17;:26;43609:7;43591:26;;;;;;;;;;;:35;;;;43413:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343: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:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;1641:5;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;1910:5;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;2068:6;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;2345:6;2353;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;2767:6;2775;2783;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;3343:6;3351;3359;3367;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;4128:6;4136;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:520::-;4548:6;4556;4605:2;4593:9;4584:7;4580:23;4576:32;4573:2;;;4621:1;4618;4611:12;4573:2;4664:1;4689:53;4734:7;4725:6;4714:9;4710:22;4689:53;:::i;:::-;4679:63;;4635:117;4819:2;4808:9;4804:18;4791:32;4850:18;4842:6;4839:30;4836:2;;;4882:1;4879;4872:12;4836:2;4910:63;4965:7;4956:6;4945:9;4941:22;4910:63;:::i;:::-;4900:73;;4762:221;4563:427;;;;;:::o;4996:407::-;5064:6;5072;5121:2;5109:9;5100:7;5096:23;5092:32;5089:2;;;5137:1;5134;5127:12;5089:2;5180:1;5205:53;5250:7;5241:6;5230:9;5226:22;5205:53;:::i;:::-;5195:63;;5151:117;5307:2;5333:53;5378:7;5369:6;5358:9;5354:22;5333:53;:::i;:::-;5323:63;;5278:118;5079:324;;;;;:::o;5409:260::-;5467:6;5516:2;5504:9;5495:7;5491:23;5487:32;5484:2;;;5532:1;5529;5522:12;5484:2;5575:1;5600:52;5644:7;5635:6;5624:9;5620:22;5600:52;:::i;:::-;5590:62;;5546:116;5474:195;;;;:::o;5675:282::-;5744:6;5793:2;5781:9;5772:7;5768:23;5764:32;5761:2;;;5809:1;5806;5799:12;5761:2;5852:1;5877:63;5932:7;5923:6;5912:9;5908:22;5877:63;:::i;:::-;5867:73;;5823:127;5751:206;;;;:::o;5963:262::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:2;;;6087:1;6084;6077:12;6039:2;6130:1;6155:53;6200:7;6191:6;6180:9;6176:22;6155:53;:::i;:::-;6145:63;;6101:117;6029:196;;;;:::o;6231:118::-;6318:24;6336:5;6318:24;:::i;:::-;6313:3;6306:37;6296:53;;:::o;6355:109::-;6436:21;6451:5;6436:21;:::i;:::-;6431:3;6424:34;6414:50;;:::o;6470:360::-;6556:3;6584:38;6616:5;6584:38;:::i;:::-;6638:70;6701:6;6696:3;6638:70;:::i;:::-;6631:77;;6717:52;6762:6;6757:3;6750:4;6743:5;6739:16;6717:52;:::i;:::-;6794:29;6816:6;6794:29;:::i;:::-;6789:3;6785:39;6778:46;;6560:270;;;;;:::o;6836:364::-;6924:3;6952:39;6985:5;6952:39;:::i;:::-;7007:71;7071:6;7066:3;7007:71;:::i;:::-;7000:78;;7087:52;7132:6;7127:3;7120:4;7113:5;7109:16;7087:52;:::i;:::-;7164:29;7186:6;7164:29;:::i;:::-;7159:3;7155:39;7148:46;;6928:272;;;;;:::o;7206:377::-;7312:3;7340:39;7373:5;7340:39;:::i;:::-;7395:89;7477:6;7472:3;7395:89;:::i;:::-;7388:96;;7493:52;7538:6;7533:3;7526:4;7519:5;7515:16;7493:52;:::i;:::-;7570:6;7565:3;7561:16;7554:23;;7316:267;;;;;:::o;7589:366::-;7731:3;7752:67;7816:2;7811:3;7752:67;:::i;:::-;7745:74;;7828:93;7917:3;7828:93;:::i;:::-;7946:2;7941:3;7937:12;7930:19;;7735:220;;;:::o;7961:366::-;8103:3;8124:67;8188:2;8183:3;8124:67;:::i;:::-;8117:74;;8200:93;8289:3;8200:93;:::i;:::-;8318:2;8313:3;8309:12;8302:19;;8107:220;;;:::o;8333:366::-;8475:3;8496:67;8560:2;8555:3;8496:67;:::i;:::-;8489:74;;8572:93;8661:3;8572:93;:::i;:::-;8690:2;8685:3;8681:12;8674:19;;8479:220;;;:::o;8705:366::-;8847:3;8868:67;8932:2;8927:3;8868:67;:::i;:::-;8861:74;;8944:93;9033:3;8944:93;:::i;:::-;9062:2;9057:3;9053:12;9046:19;;8851:220;;;:::o;9077:366::-;9219:3;9240:67;9304:2;9299:3;9240:67;:::i;:::-;9233:74;;9316:93;9405:3;9316:93;:::i;:::-;9434:2;9429:3;9425:12;9418:19;;9223:220;;;:::o;9449:366::-;9591:3;9612:67;9676:2;9671:3;9612:67;:::i;:::-;9605:74;;9688:93;9777:3;9688:93;:::i;:::-;9806:2;9801:3;9797:12;9790:19;;9595:220;;;:::o;9821:366::-;9963:3;9984:67;10048:2;10043:3;9984:67;:::i;:::-;9977:74;;10060:93;10149:3;10060:93;:::i;:::-;10178:2;10173:3;10169:12;10162:19;;9967:220;;;:::o;10193:366::-;10335:3;10356:67;10420:2;10415:3;10356:67;:::i;:::-;10349:74;;10432:93;10521:3;10432:93;:::i;:::-;10550:2;10545:3;10541:12;10534:19;;10339:220;;;:::o;10565:366::-;10707:3;10728:67;10792:2;10787:3;10728:67;:::i;:::-;10721:74;;10804:93;10893:3;10804:93;:::i;:::-;10922:2;10917:3;10913:12;10906:19;;10711:220;;;:::o;10937:366::-;11079:3;11100:67;11164:2;11159:3;11100:67;:::i;:::-;11093:74;;11176:93;11265:3;11176:93;:::i;:::-;11294:2;11289:3;11285:12;11278:19;;11083:220;;;:::o;11309:366::-;11451:3;11472:67;11536:2;11531:3;11472:67;:::i;:::-;11465:74;;11548:93;11637:3;11548:93;:::i;:::-;11666:2;11661:3;11657:12;11650:19;;11455:220;;;:::o;11681:366::-;11823:3;11844:67;11908:2;11903:3;11844:67;:::i;:::-;11837:74;;11920:93;12009:3;11920:93;:::i;:::-;12038:2;12033:3;12029:12;12022:19;;11827:220;;;:::o;12053:366::-;12195:3;12216:67;12280:2;12275:3;12216:67;:::i;:::-;12209:74;;12292:93;12381:3;12292:93;:::i;:::-;12410:2;12405:3;12401:12;12394:19;;12199:220;;;:::o;12425:366::-;12567:3;12588:67;12652:2;12647:3;12588:67;:::i;:::-;12581:74;;12664:93;12753:3;12664:93;:::i;:::-;12782:2;12777:3;12773:12;12766:19;;12571:220;;;:::o;12797:366::-;12939:3;12960:67;13024:2;13019:3;12960:67;:::i;:::-;12953:74;;13036:93;13125:3;13036:93;:::i;:::-;13154:2;13149:3;13145:12;13138:19;;12943:220;;;:::o;13169:118::-;13256:24;13274:5;13256:24;:::i;:::-;13251:3;13244:37;13234:53;;:::o;13293:435::-;13473:3;13495:95;13586:3;13577:6;13495:95;:::i;:::-;13488:102;;13607:95;13698:3;13689:6;13607:95;:::i;:::-;13600:102;;13719:3;13712:10;;13477:251;;;;;:::o;13734:222::-;13827:4;13865:2;13854:9;13850:18;13842:26;;13878:71;13946:1;13935:9;13931:17;13922:6;13878:71;:::i;:::-;13832:124;;;;:::o;13962:640::-;14157:4;14195:3;14184:9;14180:19;14172:27;;14209:71;14277:1;14266:9;14262:17;14253:6;14209:71;:::i;:::-;14290:72;14358:2;14347:9;14343:18;14334:6;14290:72;:::i;:::-;14372;14440:2;14429:9;14425:18;14416:6;14372:72;:::i;:::-;14491:9;14485:4;14481:20;14476:2;14465:9;14461:18;14454:48;14519:76;14590:4;14581:6;14519:76;:::i;:::-;14511:84;;14162:440;;;;;;;:::o;14608:210::-;14695:4;14733:2;14722:9;14718:18;14710:26;;14746:65;14808:1;14797:9;14793:17;14784:6;14746:65;:::i;:::-;14700:118;;;;:::o;14824:313::-;14937:4;14975:2;14964:9;14960:18;14952:26;;15024:9;15018:4;15014:20;15010:1;14999:9;14995:17;14988:47;15052:78;15125:4;15116:6;15052:78;:::i;:::-;15044:86;;14942:195;;;;:::o;15143:419::-;15309:4;15347:2;15336:9;15332:18;15324:26;;15396:9;15390:4;15386:20;15382:1;15371:9;15367:17;15360:47;15424:131;15550:4;15424:131;:::i;:::-;15416:139;;15314:248;;;:::o;15568:419::-;15734:4;15772:2;15761:9;15757:18;15749:26;;15821:9;15815:4;15811:20;15807:1;15796:9;15792:17;15785:47;15849:131;15975:4;15849:131;:::i;:::-;15841:139;;15739:248;;;:::o;15993:419::-;16159:4;16197:2;16186:9;16182:18;16174:26;;16246:9;16240:4;16236:20;16232:1;16221:9;16217:17;16210:47;16274:131;16400:4;16274:131;:::i;:::-;16266:139;;16164:248;;;:::o;16418:419::-;16584:4;16622:2;16611:9;16607:18;16599:26;;16671:9;16665:4;16661:20;16657:1;16646:9;16642:17;16635:47;16699:131;16825:4;16699:131;:::i;:::-;16691:139;;16589:248;;;:::o;16843:419::-;17009:4;17047:2;17036:9;17032:18;17024:26;;17096:9;17090:4;17086:20;17082:1;17071:9;17067:17;17060:47;17124:131;17250:4;17124:131;:::i;:::-;17116:139;;17014:248;;;:::o;17268:419::-;17434:4;17472:2;17461:9;17457:18;17449:26;;17521:9;17515:4;17511:20;17507:1;17496:9;17492:17;17485:47;17549:131;17675:4;17549:131;:::i;:::-;17541:139;;17439:248;;;:::o;17693:419::-;17859:4;17897:2;17886:9;17882:18;17874:26;;17946:9;17940:4;17936:20;17932:1;17921:9;17917:17;17910:47;17974:131;18100:4;17974:131;:::i;:::-;17966:139;;17864:248;;;:::o;18118:419::-;18284:4;18322:2;18311:9;18307:18;18299:26;;18371:9;18365:4;18361:20;18357:1;18346:9;18342:17;18335:47;18399:131;18525:4;18399:131;:::i;:::-;18391:139;;18289:248;;;:::o;18543:419::-;18709:4;18747:2;18736:9;18732:18;18724:26;;18796:9;18790:4;18786:20;18782:1;18771:9;18767:17;18760:47;18824:131;18950:4;18824:131;:::i;:::-;18816:139;;18714:248;;;:::o;18968:419::-;19134:4;19172:2;19161:9;19157:18;19149:26;;19221:9;19215:4;19211:20;19207:1;19196:9;19192:17;19185:47;19249:131;19375:4;19249:131;:::i;:::-;19241:139;;19139:248;;;:::o;19393:419::-;19559:4;19597:2;19586:9;19582:18;19574:26;;19646:9;19640:4;19636:20;19632:1;19621:9;19617:17;19610:47;19674:131;19800:4;19674:131;:::i;:::-;19666:139;;19564:248;;;:::o;19818:419::-;19984:4;20022:2;20011:9;20007:18;19999:26;;20071:9;20065:4;20061:20;20057:1;20046:9;20042:17;20035:47;20099:131;20225:4;20099:131;:::i;:::-;20091:139;;19989:248;;;:::o;20243:419::-;20409:4;20447:2;20436:9;20432:18;20424:26;;20496:9;20490:4;20486:20;20482:1;20471:9;20467:17;20460:47;20524:131;20650:4;20524:131;:::i;:::-;20516:139;;20414:248;;;:::o;20668:419::-;20834:4;20872:2;20861:9;20857:18;20849:26;;20921:9;20915:4;20911:20;20907:1;20896:9;20892:17;20885:47;20949:131;21075:4;20949:131;:::i;:::-;20941:139;;20839:248;;;:::o;21093:419::-;21259:4;21297:2;21286:9;21282:18;21274:26;;21346:9;21340:4;21336:20;21332:1;21321:9;21317:17;21310:47;21374:131;21500:4;21374:131;:::i;:::-;21366:139;;21264:248;;;:::o;21518:222::-;21611:4;21649:2;21638:9;21634:18;21626:26;;21662:71;21730:1;21719:9;21715:17;21706:6;21662:71;:::i;:::-;21616:124;;;;:::o;21746:129::-;21780:6;21807:20;;:::i;:::-;21797:30;;21836:33;21864:4;21856:6;21836:33;:::i;:::-;21787:88;;;:::o;21881:75::-;21914:6;21947:2;21941:9;21931:19;;21921:35;:::o;21962:307::-;22023:4;22113:18;22105:6;22102:30;22099:2;;;22135:18;;:::i;:::-;22099:2;22173:29;22195:6;22173:29;:::i;:::-;22165:37;;22257:4;22251;22247:15;22239:23;;22028:241;;;:::o;22275:308::-;22337:4;22427:18;22419:6;22416:30;22413:2;;;22449:18;;:::i;:::-;22413:2;22487:29;22509:6;22487:29;:::i;:::-;22479:37;;22571:4;22565;22561:15;22553:23;;22342:241;;;:::o;22589:98::-;22640:6;22674:5;22668:12;22658:22;;22647:40;;;:::o;22693:99::-;22745:6;22779:5;22773:12;22763:22;;22752:40;;;:::o;22798:168::-;22881:11;22915:6;22910:3;22903:19;22955:4;22950:3;22946:14;22931:29;;22893:73;;;;:::o;22972:169::-;23056:11;23090:6;23085:3;23078:19;23130:4;23125:3;23121:14;23106:29;;23068:73;;;;:::o;23147:148::-;23249:11;23286:3;23271:18;;23261:34;;;;:::o;23301:305::-;23341:3;23360:20;23378:1;23360:20;:::i;:::-;23355:25;;23394:20;23412:1;23394:20;:::i;:::-;23389:25;;23548:1;23480:66;23476:74;23473:1;23470:81;23467:2;;;23554:18;;:::i;:::-;23467:2;23598:1;23595;23591:9;23584:16;;23345:261;;;;:::o;23612:185::-;23652:1;23669:20;23687:1;23669:20;:::i;:::-;23664:25;;23703:20;23721:1;23703:20;:::i;:::-;23698:25;;23742:1;23732:2;;23747:18;;:::i;:::-;23732:2;23789:1;23786;23782:9;23777:14;;23654:143;;;;:::o;23803:191::-;23843:4;23863:20;23881:1;23863:20;:::i;:::-;23858:25;;23897:20;23915:1;23897:20;:::i;:::-;23892:25;;23936:1;23933;23930:8;23927:2;;;23941:18;;:::i;:::-;23927:2;23986:1;23983;23979:9;23971:17;;23848:146;;;;:::o;24000:96::-;24037:7;24066:24;24084:5;24066:24;:::i;:::-;24055:35;;24045:51;;;:::o;24102:90::-;24136:7;24179:5;24172:13;24165:21;24154:32;;24144:48;;;:::o;24198:149::-;24234:7;24274:66;24267:5;24263:78;24252:89;;24242:105;;;:::o;24353:126::-;24390:7;24430:42;24423:5;24419:54;24408:65;;24398:81;;;:::o;24485:77::-;24522:7;24551:5;24540:16;;24530:32;;;:::o;24568:154::-;24652:6;24647:3;24642;24629:30;24714:1;24705:6;24700:3;24696:16;24689:27;24619:103;;;:::o;24728:307::-;24796:1;24806:113;24820:6;24817:1;24814:13;24806:113;;;24905:1;24900:3;24896:11;24890:18;24886:1;24881:3;24877:11;24870:39;24842:2;24839:1;24835:10;24830:15;;24806:113;;;24937:6;24934:1;24931:13;24928:2;;;25017:1;25008:6;25003:3;24999:16;24992:27;24928:2;24777:258;;;;:::o;25041:320::-;25085:6;25122:1;25116:4;25112:12;25102:22;;25169:1;25163:4;25159:12;25190:18;25180:2;;25246:4;25238:6;25234:17;25224:27;;25180:2;25308;25300:6;25297:14;25277:18;25274:38;25271:2;;;25327:18;;:::i;:::-;25271:2;25092:269;;;;:::o;25367:281::-;25450:27;25472:4;25450:27;:::i;:::-;25442:6;25438:40;25580:6;25568:10;25565:22;25544:18;25532:10;25529:34;25526:62;25523:2;;;25591:18;;:::i;:::-;25523:2;25631:10;25627:2;25620:22;25410:238;;;:::o;25654:233::-;25693:3;25716:24;25734:5;25716:24;:::i;:::-;25707:33;;25762:66;25755:5;25752:77;25749:2;;;25832:18;;:::i;:::-;25749:2;25879:1;25872:5;25868:13;25861:20;;25697:190;;;:::o;25893:176::-;25925:1;25942:20;25960:1;25942:20;:::i;:::-;25937:25;;25976:20;25994:1;25976:20;:::i;:::-;25971:25;;26015:1;26005:2;;26020:18;;:::i;:::-;26005:2;26061:1;26058;26054:9;26049:14;;25927:142;;;;:::o;26075:180::-;26123:77;26120:1;26113:88;26220:4;26217:1;26210:15;26244:4;26241:1;26234:15;26261:180;26309:77;26306:1;26299:88;26406:4;26403:1;26396:15;26430:4;26427:1;26420:15;26447:180;26495:77;26492:1;26485:88;26592:4;26589:1;26582:15;26616:4;26613:1;26606:15;26633:180;26681:77;26678:1;26671:88;26778:4;26775:1;26768:15;26802:4;26799:1;26792:15;26819:102;26860:6;26911:2;26907:7;26902:2;26895:5;26891:14;26887:28;26877:38;;26867:54;;;:::o;26927:230::-;27067:34;27063:1;27055:6;27051:14;27044:58;27136:13;27131:2;27123:6;27119:15;27112:38;27033:124;:::o;27163:237::-;27303:34;27299:1;27291:6;27287:14;27280:58;27372:20;27367:2;27359:6;27355:15;27348:45;27269:131;:::o;27406:224::-;27546:34;27542:1;27534:6;27530:14;27523:58;27615:7;27610:2;27602:6;27598:15;27591:32;27512:118;:::o;27636:178::-;27776:30;27772:1;27764:6;27760:14;27753:54;27742:72;:::o;27820:223::-;27960:34;27956:1;27948:6;27944:14;27937:58;28029:6;28024:2;28016:6;28012:15;28005:31;27926:117;:::o;28049:175::-;28189:27;28185:1;28177:6;28173:14;28166:51;28155:69;:::o;28230:228::-;28370:34;28366:1;28358:6;28354:14;28347:58;28439:11;28434:2;28426:6;28422:15;28415:36;28336:122;:::o;28464:233::-;28604:34;28600:1;28592:6;28588:14;28581:58;28673:16;28668:2;28660:6;28656:15;28649:41;28570:127;:::o;28703:249::-;28843:34;28839:1;28831:6;28827:14;28820:58;28912:32;28907:2;28899:6;28895:15;28888:57;28809:143;:::o;28958:182::-;29098:34;29094:1;29086:6;29082:14;29075:58;29064:76;:::o;29146:174::-;29286:26;29282:1;29274:6;29270:14;29263:50;29252:68;:::o;29326:220::-;29466:34;29462:1;29454:6;29450:14;29443:58;29535:3;29530:2;29522:6;29518:15;29511:28;29432:114;:::o;29552:231::-;29692:34;29688:1;29680:6;29676:14;29669:58;29761:14;29756:2;29748:6;29744:15;29737:39;29658:125;:::o;29789:222::-;29929:34;29925:1;29917:6;29913:14;29906:58;29998:5;29993:2;29985:6;29981:15;29974:30;29895:116;:::o;30017:233::-;30157:34;30153:1;30145:6;30141:14;30134:58;30226:16;30221:2;30213:6;30209:15;30202:41;30123:127;:::o;30256:122::-;30329:24;30347:5;30329:24;:::i;:::-;30322:5;30319:35;30309:2;;30368:1;30365;30358:12;30309:2;30299:79;:::o;30384:116::-;30454:21;30469:5;30454:21;:::i;:::-;30447:5;30444:32;30434:2;;30490:1;30487;30480:12;30434:2;30424:76;:::o;30506:120::-;30578:23;30595:5;30578:23;:::i;:::-;30571:5;30568:34;30558:2;;30616:1;30613;30606:12;30558:2;30548:78;:::o;30632:122::-;30705:24;30723:5;30705:24;:::i;:::-;30698:5;30695:35;30685:2;;30744:1;30741;30734:12;30685:2;30675:79;:::o
Swarm Source
ipfs://299eac7b7e33889fc998fd83ffc6733439e05afe7545ac07dd15e46348828285
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.