Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
32 AIV
Holders
25
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 AIVLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
ArtWorks
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-11-15 */ // SPDX-License-Identifier: MIT 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); } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @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); } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @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; } } /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } /** * @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; } } /** * @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: balance query for the zero address"); 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: owner query for nonexistent token"); return owner; } /** * @dev Edit for rawOwnerOf token */ function rawOwnerOf(uint256 tokenId) public view returns (address) { return _owners[tokenId]; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _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) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, 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); } /** * @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); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); 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); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { 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 {} } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } /** * @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(); } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } contract ArtWorks is ERC721Enumerable, Ownable { uint256 private constant MAX_ELEMENTS = 256; uint256 private constant PRICE = 1 ether; string public baseTokenURI; struct DistribParameters { uint256 start; uint256 stop; uint256 max; } // The whitelist periods DistribParameters private _whitelistParams; // The presale periods DistribParameters private _presaleParams; // The sale periods DistribParameters private _saleParams; //Whitelist mapping(address => bool) private whiteList; uint256 private whiteList_index; constructor(string memory baseURI) ERC721("256AIVision", "AIV"){ setBaseURI(baseURI); } function mint(uint256 numberOfTokens) external payable { require((isWhiteList(msg.sender) && isPreSaleOpen()) || isSaleOpen(), "Closed sale"); require(numberOfTokens > 0, "Number of items below 1"); require((isPreSaleOpen() && numberOfTokens <= _presaleParams.max) || (isSaleOpen() && numberOfTokens <= _saleParams.max), "Over max limit per address"); require(totalSupply() + numberOfTokens <= MAX_ELEMENTS, "Mint would exceed max supply"); require(msg.value >= PRICE * numberOfTokens, "Ether value below price"); for(uint256 i = 0; i < numberOfTokens; i++){ uint256 mintId = totalSupply(); whiteList[_msgSender()] = false; _safeMint(_msgSender(), mintId); } } function walletOfOwner(address _owner) external view returns (uint256[] memory) { uint256 tokenCount = balanceOf(_owner); uint256[] memory tokensId = new uint256[](tokenCount); for (uint256 i = 0; i < tokenCount; i++) { tokensId[i] = tokenOfOwnerByIndex(_owner, i); } return tokensId; } function _baseURI() internal view virtual override returns (string memory) { return baseTokenURI; } function getWhitelistIndex() public view returns (uint256) { return whiteList_index; } function isPreSaleOpen() public view returns (bool) { return block.timestamp >= _presaleParams.start && block.timestamp <= _presaleParams.stop; } function isSaleOpen() public view returns (bool) { return block.timestamp >= _saleParams.start && block.timestamp <= _saleParams.stop; } function isWhiteListOpen() public view returns (bool) { return block.timestamp >= _whitelistParams.start && block.timestamp <= _whitelistParams.stop && whiteList_index < _whitelistParams.max; } function isWhiteList(address addr) public view returns (bool) { return whiteList[addr]; } function addToWhiteList(address beneficiary) external { require(isWhiteListOpen(), "Closed whitelist"); require(beneficiary != address(0), "Whitelist is the zero address"); require(!whiteList[beneficiary], "Duplicate whitelist address"); whiteList_index = whiteList_index + 1; whiteList[beneficiary] = true; } function ownerAddToWhiteList(address[] calldata entries) external onlyOwner { require(whiteList_index + entries.length <= _whitelistParams.max, "Whitelist would exceed max supply"); for(uint256 i = 0; i < entries.length; i++) { address entry = entries[i]; require(entry != address(0), "Whitelist is the zero address"); require(!whiteList[entry], "Duplicate whitelist address"); whiteList_index = whiteList_index + 1; whiteList[entry] = true; } } function mintUnsoldTokens(uint256 limit) external onlyOwner { uint256 start = totalSupply(); uint256 stop = start + limit; if (stop > MAX_ELEMENTS) { stop = MAX_ELEMENTS; } for (uint256 i = start; i < stop; i++) { _safeMint(_msgSender(), i); } } function setBaseURI(string memory baseURI) public onlyOwner { baseTokenURI = baseURI; } function setWhiteListParams(uint256 start, uint256 stop, uint256 max) public onlyOwner { _whitelistParams.start = start; _whitelistParams.stop = stop; _whitelistParams.max = max; } function setPreSaleParams(uint256 start, uint256 stop, uint256 max) public onlyOwner { _presaleParams.start = start; _presaleParams.stop = stop; _presaleParams.max = max; } function setSaleParams(uint256 start, uint256 stop, uint256 max) public onlyOwner { _saleParams.start = start; _saleParams.stop = stop; _saleParams.max = max; } function withdrawAll() external onlyOwner { payable(msg.sender).transfer(address(this).balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"addToWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelistIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"isPreSaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isWhiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhiteListOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"mintUnsoldTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"entries","type":"address[]"}],"name":"ownerAddToWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"rawOwnerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setPreSaleParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setSaleParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setWhiteListParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162002ba238038062002ba2833981016040819052620000349162000251565b604080518082018252600b81526a191a9b20a4ab34b9b4b7b760a91b60208083019182528351808501909452600384526220a4ab60e91b908401528151919291620000829160009162000195565b5080516200009890600190602084019062000195565b505050620000b5620000af620000c760201b60201c565b620000cb565b620000c0816200011d565b506200036a565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a546001600160a01b031633146200017c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b80516200019190600b90602084019062000195565b5050565b828054620001a3906200032d565b90600052602060002090601f016020900481019282620001c7576000855562000212565b82601f10620001e257805160ff191683800117855562000212565b8280016001018555821562000212579182015b8281111562000212578251825591602001919060010190620001f5565b506200022092915062000224565b5090565b5b8082111562000220576000815560010162000225565b634e487b7160e01b600052604160045260246000fd5b600060208083850312156200026557600080fd5b82516001600160401b03808211156200027d57600080fd5b818501915085601f8301126200029257600080fd5b815181811115620002a757620002a76200023b565b604051601f8201601f19908116603f01168101908382118183101715620002d257620002d26200023b565b816040528281528886848701011115620002eb57600080fd5b600093505b828410156200030f5784840186015181850187015292850192620002f0565b82841115620003215760008684830101525b98975050505050505050565b600181811c908216806200034257607f821691505b602082108114156200036457634e487b7160e01b600052602260045260246000fd5b50919050565b612828806200037a6000396000f3fe60806040526004361061020f5760003560e01c80636352211e1161011857806398ef5591116100a0578063c87b56dd1161006f578063c87b56dd146105eb578063d547cfb71461060b578063e985e9c514610620578063f2fde38b14610669578063f99031a71461068957600080fd5b806398ef559114610583578063a0712d6814610598578063a22cb465146105ab578063b88d4fde146105cb57600080fd5b80637a0796e1116100e75780637a0796e1146104e55780637f81be6914610505578063853828b61461053b5780638da5cb5b1461055057806395d89b411461056e57600080fd5b80636352211e1461047057806366474ff71461049057806370a08231146104b0578063715018a6146104d057600080fd5b806323b872dd1161019b578063472a14d61161016a578063472a14d6146103db57806347ee0394146103fb5780634f6ccce71461041b57806355f804b31461043b5780635f8a958c1461045b57600080fd5b806323b872dd1461034e5780632f745c591461036e57806342842e0e1461038e578063438b6300146103ae57600080fd5b8063095ea7b3116101e2578063095ea7b3146102c557806318160ddd146102e557806318d5e7a5146103045780631a081330146103245780631f281ace1461033957600080fd5b806301ffc9a71461021457806306fdde03146102495780630782cc6e1461026b578063081812fc1461028d575b600080fd5b34801561022057600080fd5b5061023461022f36600461218a565b6106c2565b60405190151581526020015b60405180910390f35b34801561025557600080fd5b5061025e6106ed565b60405161024091906121ff565b34801561027757600080fd5b5061028b610286366004612212565b61077f565b005b34801561029957600080fd5b506102ad6102a836600461223e565b6107c0565b6040516001600160a01b039091168152602001610240565b3480156102d157600080fd5b5061028b6102e0366004612273565b610855565b3480156102f157600080fd5b506008545b604051908152602001610240565b34801561031057600080fd5b5061028b61031f36600461229d565b61096b565b34801561033057600080fd5b50610234610b38565b34801561034557600080fd5b50610234610b54565b34801561035a57600080fd5b5061028b610369366004612312565b610b6e565b34801561037a57600080fd5b506102f6610389366004612273565b610b9f565b34801561039a57600080fd5b5061028b6103a9366004612312565b610c35565b3480156103ba57600080fd5b506103ce6103c936600461234e565b610c50565b6040516102409190612369565b3480156103e757600080fd5b5061028b6103f6366004612212565b610cf2565b34801561040757600080fd5b5061028b61041636600461234e565b610d2a565b34801561042757600080fd5b506102f661043636600461223e565b610e65565b34801561044757600080fd5b5061028b610456366004612439565b610ef8565b34801561046757600080fd5b50610234610f39565b34801561047c57600080fd5b506102ad61048b36600461223e565b610f62565b34801561049c57600080fd5b5061028b6104ab36600461223e565b610fd9565b3480156104bc57600080fd5b506102f66104cb36600461234e565b61105a565b3480156104dc57600080fd5b5061028b6110e1565b3480156104f157600080fd5b5061028b610500366004612212565b611117565b34801561051157600080fd5b506102ad61052036600461223e565b6000908152600260205260409020546001600160a01b031690565b34801561054757600080fd5b5061028b61114f565b34801561055c57600080fd5b50600a546001600160a01b03166102ad565b34801561057a57600080fd5b5061025e6111a8565b34801561058f57600080fd5b506016546102f6565b61028b6105a636600461223e565b6111b7565b3480156105b757600080fd5b5061028b6105c6366004612482565b611401565b3480156105d757600080fd5b5061028b6105e63660046124be565b6114c6565b3480156105f757600080fd5b5061025e61060636600461223e565b6114f8565b34801561061757600080fd5b5061025e6115d3565b34801561062c57600080fd5b5061023461063b36600461253a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561067557600080fd5b5061028b61068436600461234e565b611661565b34801561069557600080fd5b506102346106a436600461234e565b6001600160a01b031660009081526015602052604090205460ff1690565b60006001600160e01b0319821663780e9d6360e01b14806106e757506106e7826116f9565b92915050565b6060600080546106fc9061256d565b80601f01602080910402602001604051908101604052809291908181526020018280546107289061256d565b80156107755780601f1061074a57610100808354040283529160200191610775565b820191906000526020600020905b81548152906001019060200180831161075857829003601f168201915b5050505050905090565b600a546001600160a01b031633146107b25760405162461bcd60e51b81526004016107a9906125a8565b60405180910390fd5b600f92909255601055601155565b6000818152600260205260408120546001600160a01b03166108395760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107a9565b506000908152600460205260409020546001600160a01b031690565b600061086082610f62565b9050806001600160a01b0316836001600160a01b031614156108ce5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107a9565b336001600160a01b03821614806108ea57506108ea813361063b565b61095c5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107a9565b6109668383611749565b505050565b600a546001600160a01b031633146109955760405162461bcd60e51b81526004016107a9906125a8565b600e546016546109a69083906125f3565b11156109fe5760405162461bcd60e51b815260206004820152602160248201527f57686974656c69737420776f756c6420657863656564206d617820737570706c6044820152607960f81b60648201526084016107a9565b60005b81811015610966576000838383818110610a1d57610a1d61260b565b9050602002016020810190610a32919061234e565b90506001600160a01b038116610a8a5760405162461bcd60e51b815260206004820152601d60248201527f57686974656c69737420697320746865207a65726f206164647265737300000060448201526064016107a9565b6001600160a01b03811660009081526015602052604090205460ff1615610af35760405162461bcd60e51b815260206004820152601b60248201527f4475706c69636174652077686974656c6973742061646472657373000000000060448201526064016107a9565b601654610b019060016125f3565b6016556001600160a01b03166000908152601560205260409020805460ff1916600117905580610b3081612621565b915050610a01565b6012546000904210801590610b4f57506013544211155b905090565b600f546000904210801590610b4f57505060105442111590565b610b7833826117b7565b610b945760405162461bcd60e51b81526004016107a99061263c565b6109668383836118ae565b6000610baa8361105a565b8210610c0c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016107a9565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610966838383604051806020016040528060008152506114c6565b60606000610c5d8361105a565b905060008167ffffffffffffffff811115610c7a57610c7a6123ad565b604051908082528060200260200182016040528015610ca3578160200160208202803683370190505b50905060005b82811015610cea57610cbb8582610b9f565b828281518110610ccd57610ccd61260b565b602090810291909101015280610ce281612621565b915050610ca9565b509392505050565b600a546001600160a01b03163314610d1c5760405162461bcd60e51b81526004016107a9906125a8565b600c92909255600d55600e55565b610d32610f39565b610d715760405162461bcd60e51b815260206004820152601060248201526f10db1bdcd959081dda1a5d195b1a5cdd60821b60448201526064016107a9565b6001600160a01b038116610dc75760405162461bcd60e51b815260206004820152601d60248201527f57686974656c69737420697320746865207a65726f206164647265737300000060448201526064016107a9565b6001600160a01b03811660009081526015602052604090205460ff1615610e305760405162461bcd60e51b815260206004820152601b60248201527f4475706c69636174652077686974656c6973742061646472657373000000000060448201526064016107a9565b601654610e3e9060016125f3565b6016556001600160a01b03166000908152601560205260409020805460ff19166001179055565b6000610e7060085490565b8210610ed35760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016107a9565b60088281548110610ee657610ee661260b565b90600052602060002001549050919050565b600a546001600160a01b03163314610f225760405162461bcd60e51b81526004016107a9906125a8565b8051610f3590600b9060208401906120db565b5050565b600c546000904210801590610f505750600d544211155b8015610b4f575050600e546016541090565b6000818152600260205260408120546001600160a01b0316806106e75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107a9565b600a546001600160a01b031633146110035760405162461bcd60e51b81526004016107a9906125a8565b600061100e60085490565b9050600061101c83836125f3565b905061010081111561102d57506101005b815b8181101561105457611042335b82611a59565b8061104c81612621565b91505061102f565b50505050565b60006001600160a01b0382166110c55760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107a9565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b0316331461110b5760405162461bcd60e51b81526004016107a9906125a8565b6111156000611a73565b565b600a546001600160a01b031633146111415760405162461bcd60e51b81526004016107a9906125a8565b601292909255601355601455565b600a546001600160a01b031633146111795760405162461bcd60e51b81526004016107a9906125a8565b60405133904780156108fc02916000818181858888f193505050501580156111a5573d6000803e3d6000fd5b50565b6060600180546106fc9061256d565b3360009081526015602052604090205460ff1680156111d957506111d9610b54565b806111e757506111e7610b38565b6112215760405162461bcd60e51b815260206004820152600b60248201526a436c6f7365642073616c6560a81b60448201526064016107a9565b600081116112715760405162461bcd60e51b815260206004820152601760248201527f4e756d626572206f66206974656d732062656c6f77203100000000000000000060448201526064016107a9565b611279610b54565b801561128757506011548111155b806112a35750611295610b38565b80156112a357506014548111155b6112ef5760405162461bcd60e51b815260206004820152601a60248201527f4f766572206d6178206c696d697420706572206164647265737300000000000060448201526064016107a9565b610100816112fc60085490565b61130691906125f3565b11156113545760405162461bcd60e51b815260206004820152601c60248201527f4d696e7420776f756c6420657863656564206d617820737570706c790000000060448201526064016107a9565b61136681670de0b6b3a764000061268d565b3410156113b55760405162461bcd60e51b815260206004820152601760248201527f45746865722076616c75652062656c6f7720707269636500000000000000000060448201526064016107a9565b60005b81811015610f355760006113cb60085490565b336000818152601560205260409020805460ff191690559091506113ee9061103c565b50806113f981612621565b9150506113b8565b6001600160a01b03821633141561145a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107a9565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6114d033836117b7565b6114ec5760405162461bcd60e51b81526004016107a99061263c565b61105484848484611ac5565b6000818152600260205260409020546060906001600160a01b03166115775760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107a9565b6000611581611af8565b905060008151116115a157604051806020016040528060008152506115cc565b806115ab84611b07565b6040516020016115bc9291906126ac565b6040516020818303038152906040525b9392505050565b600b80546115e09061256d565b80601f016020809104026020016040519081016040528092919081815260200182805461160c9061256d565b80156116595780601f1061162e57610100808354040283529160200191611659565b820191906000526020600020905b81548152906001019060200180831161163c57829003601f168201915b505050505081565b600a546001600160a01b0316331461168b5760405162461bcd60e51b81526004016107a9906125a8565b6001600160a01b0381166116f05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107a9565b6111a581611a73565b60006001600160e01b031982166380ac58cd60e01b148061172a57506001600160e01b03198216635b5e139f60e01b145b806106e757506301ffc9a760e01b6001600160e01b03198316146106e7565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061177e82610f62565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166118305760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107a9565b600061183b83610f62565b9050806001600160a01b0316846001600160a01b031614806118765750836001600160a01b031661186b846107c0565b6001600160a01b0316145b806118a657506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166118c182610f62565b6001600160a01b0316146119295760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107a9565b6001600160a01b03821661198b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107a9565b611996838383611c05565b6119a1600082611749565b6001600160a01b03831660009081526003602052604081208054600192906119ca9084906126db565b90915550506001600160a01b03821660009081526003602052604081208054600192906119f89084906125f3565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610f35828260405180602001604052806000815250611cbd565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611ad08484846118ae565b611adc84848484611cf0565b6110545760405162461bcd60e51b81526004016107a9906126f2565b6060600b80546106fc9061256d565b606081611b2b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611b555780611b3f81612621565b9150611b4e9050600a8361275a565b9150611b2f565b60008167ffffffffffffffff811115611b7057611b706123ad565b6040519080825280601f01601f191660200182016040528015611b9a576020820181803683370190505b5090505b84156118a657611baf6001836126db565b9150611bbc600a8661276e565b611bc79060306125f3565b60f81b818381518110611bdc57611bdc61260b565b60200101906001600160f81b031916908160001a905350611bfe600a8661275a565b9450611b9e565b6001600160a01b038316611c6057611c5b81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611c83565b816001600160a01b0316836001600160a01b031614611c8357611c838382611dfd565b6001600160a01b038216611c9a5761096681611e9a565b826001600160a01b0316826001600160a01b031614610966576109668282611f49565b611cc78383611f8d565b611cd46000848484611cf0565b6109665760405162461bcd60e51b81526004016107a9906126f2565b60006001600160a01b0384163b15611df257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611d34903390899088908890600401612782565b602060405180830381600087803b158015611d4e57600080fd5b505af1925050508015611d7e575060408051601f3d908101601f19168201909252611d7b918101906127bf565b60015b611dd8573d808015611dac576040519150601f19603f3d011682016040523d82523d6000602084013e611db1565b606091505b508051611dd05760405162461bcd60e51b81526004016107a9906126f2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506118a6565b506001949350505050565b60006001611e0a8461105a565b611e1491906126db565b600083815260076020526040902054909150808214611e67576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611eac906001906126db565b60008381526009602052604081205460088054939450909284908110611ed457611ed461260b565b906000526020600020015490508060088381548110611ef557611ef561260b565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611f2d57611f2d6127dc565b6001900381819060005260206000200160009055905550505050565b6000611f548361105a565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216611fe35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107a9565b6000818152600260205260409020546001600160a01b0316156120485760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107a9565b61205460008383611c05565b6001600160a01b038216600090815260036020526040812080546001929061207d9084906125f3565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546120e79061256d565b90600052602060002090601f016020900481019282612109576000855561214f565b82601f1061212257805160ff191683800117855561214f565b8280016001018555821561214f579182015b8281111561214f578251825591602001919060010190612134565b5061215b92915061215f565b5090565b5b8082111561215b5760008155600101612160565b6001600160e01b0319811681146111a557600080fd5b60006020828403121561219c57600080fd5b81356115cc81612174565b60005b838110156121c25781810151838201526020016121aa565b838111156110545750506000910152565b600081518084526121eb8160208601602086016121a7565b601f01601f19169290920160200192915050565b6020815260006115cc60208301846121d3565b60008060006060848603121561222757600080fd5b505081359360208301359350604090920135919050565b60006020828403121561225057600080fd5b5035919050565b80356001600160a01b038116811461226e57600080fd5b919050565b6000806040838503121561228657600080fd5b61228f83612257565b946020939093013593505050565b600080602083850312156122b057600080fd5b823567ffffffffffffffff808211156122c857600080fd5b818501915085601f8301126122dc57600080fd5b8135818111156122eb57600080fd5b8660208260051b850101111561230057600080fd5b60209290920196919550909350505050565b60008060006060848603121561232757600080fd5b61233084612257565b925061233e60208501612257565b9150604084013590509250925092565b60006020828403121561236057600080fd5b6115cc82612257565b6020808252825182820181905260009190848201906040850190845b818110156123a157835183529284019291840191600101612385565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156123de576123de6123ad565b604051601f8501601f19908116603f01168101908282118183101715612406576124066123ad565b8160405280935085815286868601111561241f57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561244b57600080fd5b813567ffffffffffffffff81111561246257600080fd5b8201601f8101841361247357600080fd5b6118a6848235602084016123c3565b6000806040838503121561249557600080fd5b61249e83612257565b9150602083013580151581146124b357600080fd5b809150509250929050565b600080600080608085870312156124d457600080fd5b6124dd85612257565b93506124eb60208601612257565b925060408501359150606085013567ffffffffffffffff81111561250e57600080fd5b8501601f8101871361251f57600080fd5b61252e878235602084016123c3565b91505092959194509250565b6000806040838503121561254d57600080fd5b61255683612257565b915061256460208401612257565b90509250929050565b600181811c9082168061258157607f821691505b602082108114156125a257634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612606576126066125dd565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415612635576126356125dd565b5060010190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008160001904831182151516156126a7576126a76125dd565b500290565b600083516126be8184602088016121a7565b8351908301906126d28183602088016121a7565b01949350505050565b6000828210156126ed576126ed6125dd565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261276957612769612744565b500490565b60008261277d5761277d612744565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906127b5908301846121d3565b9695505050505050565b6000602082840312156127d157600080fd5b81516115cc81612174565b634e487b7160e01b600052603160045260246000fdfea26469706673582212205971f49976e51632123078d174b6cc7fd9fb2defb7893abc26eabb2a12a2e13f64736f6c634300080900330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002268747470733a2f2f6170692e626974746f7563682e6172742f6169762f6d6574612f000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061020f5760003560e01c80636352211e1161011857806398ef5591116100a0578063c87b56dd1161006f578063c87b56dd146105eb578063d547cfb71461060b578063e985e9c514610620578063f2fde38b14610669578063f99031a71461068957600080fd5b806398ef559114610583578063a0712d6814610598578063a22cb465146105ab578063b88d4fde146105cb57600080fd5b80637a0796e1116100e75780637a0796e1146104e55780637f81be6914610505578063853828b61461053b5780638da5cb5b1461055057806395d89b411461056e57600080fd5b80636352211e1461047057806366474ff71461049057806370a08231146104b0578063715018a6146104d057600080fd5b806323b872dd1161019b578063472a14d61161016a578063472a14d6146103db57806347ee0394146103fb5780634f6ccce71461041b57806355f804b31461043b5780635f8a958c1461045b57600080fd5b806323b872dd1461034e5780632f745c591461036e57806342842e0e1461038e578063438b6300146103ae57600080fd5b8063095ea7b3116101e2578063095ea7b3146102c557806318160ddd146102e557806318d5e7a5146103045780631a081330146103245780631f281ace1461033957600080fd5b806301ffc9a71461021457806306fdde03146102495780630782cc6e1461026b578063081812fc1461028d575b600080fd5b34801561022057600080fd5b5061023461022f36600461218a565b6106c2565b60405190151581526020015b60405180910390f35b34801561025557600080fd5b5061025e6106ed565b60405161024091906121ff565b34801561027757600080fd5b5061028b610286366004612212565b61077f565b005b34801561029957600080fd5b506102ad6102a836600461223e565b6107c0565b6040516001600160a01b039091168152602001610240565b3480156102d157600080fd5b5061028b6102e0366004612273565b610855565b3480156102f157600080fd5b506008545b604051908152602001610240565b34801561031057600080fd5b5061028b61031f36600461229d565b61096b565b34801561033057600080fd5b50610234610b38565b34801561034557600080fd5b50610234610b54565b34801561035a57600080fd5b5061028b610369366004612312565b610b6e565b34801561037a57600080fd5b506102f6610389366004612273565b610b9f565b34801561039a57600080fd5b5061028b6103a9366004612312565b610c35565b3480156103ba57600080fd5b506103ce6103c936600461234e565b610c50565b6040516102409190612369565b3480156103e757600080fd5b5061028b6103f6366004612212565b610cf2565b34801561040757600080fd5b5061028b61041636600461234e565b610d2a565b34801561042757600080fd5b506102f661043636600461223e565b610e65565b34801561044757600080fd5b5061028b610456366004612439565b610ef8565b34801561046757600080fd5b50610234610f39565b34801561047c57600080fd5b506102ad61048b36600461223e565b610f62565b34801561049c57600080fd5b5061028b6104ab36600461223e565b610fd9565b3480156104bc57600080fd5b506102f66104cb36600461234e565b61105a565b3480156104dc57600080fd5b5061028b6110e1565b3480156104f157600080fd5b5061028b610500366004612212565b611117565b34801561051157600080fd5b506102ad61052036600461223e565b6000908152600260205260409020546001600160a01b031690565b34801561054757600080fd5b5061028b61114f565b34801561055c57600080fd5b50600a546001600160a01b03166102ad565b34801561057a57600080fd5b5061025e6111a8565b34801561058f57600080fd5b506016546102f6565b61028b6105a636600461223e565b6111b7565b3480156105b757600080fd5b5061028b6105c6366004612482565b611401565b3480156105d757600080fd5b5061028b6105e63660046124be565b6114c6565b3480156105f757600080fd5b5061025e61060636600461223e565b6114f8565b34801561061757600080fd5b5061025e6115d3565b34801561062c57600080fd5b5061023461063b36600461253a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561067557600080fd5b5061028b61068436600461234e565b611661565b34801561069557600080fd5b506102346106a436600461234e565b6001600160a01b031660009081526015602052604090205460ff1690565b60006001600160e01b0319821663780e9d6360e01b14806106e757506106e7826116f9565b92915050565b6060600080546106fc9061256d565b80601f01602080910402602001604051908101604052809291908181526020018280546107289061256d565b80156107755780601f1061074a57610100808354040283529160200191610775565b820191906000526020600020905b81548152906001019060200180831161075857829003601f168201915b5050505050905090565b600a546001600160a01b031633146107b25760405162461bcd60e51b81526004016107a9906125a8565b60405180910390fd5b600f92909255601055601155565b6000818152600260205260408120546001600160a01b03166108395760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107a9565b506000908152600460205260409020546001600160a01b031690565b600061086082610f62565b9050806001600160a01b0316836001600160a01b031614156108ce5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107a9565b336001600160a01b03821614806108ea57506108ea813361063b565b61095c5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107a9565b6109668383611749565b505050565b600a546001600160a01b031633146109955760405162461bcd60e51b81526004016107a9906125a8565b600e546016546109a69083906125f3565b11156109fe5760405162461bcd60e51b815260206004820152602160248201527f57686974656c69737420776f756c6420657863656564206d617820737570706c6044820152607960f81b60648201526084016107a9565b60005b81811015610966576000838383818110610a1d57610a1d61260b565b9050602002016020810190610a32919061234e565b90506001600160a01b038116610a8a5760405162461bcd60e51b815260206004820152601d60248201527f57686974656c69737420697320746865207a65726f206164647265737300000060448201526064016107a9565b6001600160a01b03811660009081526015602052604090205460ff1615610af35760405162461bcd60e51b815260206004820152601b60248201527f4475706c69636174652077686974656c6973742061646472657373000000000060448201526064016107a9565b601654610b019060016125f3565b6016556001600160a01b03166000908152601560205260409020805460ff1916600117905580610b3081612621565b915050610a01565b6012546000904210801590610b4f57506013544211155b905090565b600f546000904210801590610b4f57505060105442111590565b610b7833826117b7565b610b945760405162461bcd60e51b81526004016107a99061263c565b6109668383836118ae565b6000610baa8361105a565b8210610c0c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016107a9565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610966838383604051806020016040528060008152506114c6565b60606000610c5d8361105a565b905060008167ffffffffffffffff811115610c7a57610c7a6123ad565b604051908082528060200260200182016040528015610ca3578160200160208202803683370190505b50905060005b82811015610cea57610cbb8582610b9f565b828281518110610ccd57610ccd61260b565b602090810291909101015280610ce281612621565b915050610ca9565b509392505050565b600a546001600160a01b03163314610d1c5760405162461bcd60e51b81526004016107a9906125a8565b600c92909255600d55600e55565b610d32610f39565b610d715760405162461bcd60e51b815260206004820152601060248201526f10db1bdcd959081dda1a5d195b1a5cdd60821b60448201526064016107a9565b6001600160a01b038116610dc75760405162461bcd60e51b815260206004820152601d60248201527f57686974656c69737420697320746865207a65726f206164647265737300000060448201526064016107a9565b6001600160a01b03811660009081526015602052604090205460ff1615610e305760405162461bcd60e51b815260206004820152601b60248201527f4475706c69636174652077686974656c6973742061646472657373000000000060448201526064016107a9565b601654610e3e9060016125f3565b6016556001600160a01b03166000908152601560205260409020805460ff19166001179055565b6000610e7060085490565b8210610ed35760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016107a9565b60088281548110610ee657610ee661260b565b90600052602060002001549050919050565b600a546001600160a01b03163314610f225760405162461bcd60e51b81526004016107a9906125a8565b8051610f3590600b9060208401906120db565b5050565b600c546000904210801590610f505750600d544211155b8015610b4f575050600e546016541090565b6000818152600260205260408120546001600160a01b0316806106e75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107a9565b600a546001600160a01b031633146110035760405162461bcd60e51b81526004016107a9906125a8565b600061100e60085490565b9050600061101c83836125f3565b905061010081111561102d57506101005b815b8181101561105457611042335b82611a59565b8061104c81612621565b91505061102f565b50505050565b60006001600160a01b0382166110c55760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107a9565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b0316331461110b5760405162461bcd60e51b81526004016107a9906125a8565b6111156000611a73565b565b600a546001600160a01b031633146111415760405162461bcd60e51b81526004016107a9906125a8565b601292909255601355601455565b600a546001600160a01b031633146111795760405162461bcd60e51b81526004016107a9906125a8565b60405133904780156108fc02916000818181858888f193505050501580156111a5573d6000803e3d6000fd5b50565b6060600180546106fc9061256d565b3360009081526015602052604090205460ff1680156111d957506111d9610b54565b806111e757506111e7610b38565b6112215760405162461bcd60e51b815260206004820152600b60248201526a436c6f7365642073616c6560a81b60448201526064016107a9565b600081116112715760405162461bcd60e51b815260206004820152601760248201527f4e756d626572206f66206974656d732062656c6f77203100000000000000000060448201526064016107a9565b611279610b54565b801561128757506011548111155b806112a35750611295610b38565b80156112a357506014548111155b6112ef5760405162461bcd60e51b815260206004820152601a60248201527f4f766572206d6178206c696d697420706572206164647265737300000000000060448201526064016107a9565b610100816112fc60085490565b61130691906125f3565b11156113545760405162461bcd60e51b815260206004820152601c60248201527f4d696e7420776f756c6420657863656564206d617820737570706c790000000060448201526064016107a9565b61136681670de0b6b3a764000061268d565b3410156113b55760405162461bcd60e51b815260206004820152601760248201527f45746865722076616c75652062656c6f7720707269636500000000000000000060448201526064016107a9565b60005b81811015610f355760006113cb60085490565b336000818152601560205260409020805460ff191690559091506113ee9061103c565b50806113f981612621565b9150506113b8565b6001600160a01b03821633141561145a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107a9565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6114d033836117b7565b6114ec5760405162461bcd60e51b81526004016107a99061263c565b61105484848484611ac5565b6000818152600260205260409020546060906001600160a01b03166115775760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107a9565b6000611581611af8565b905060008151116115a157604051806020016040528060008152506115cc565b806115ab84611b07565b6040516020016115bc9291906126ac565b6040516020818303038152906040525b9392505050565b600b80546115e09061256d565b80601f016020809104026020016040519081016040528092919081815260200182805461160c9061256d565b80156116595780601f1061162e57610100808354040283529160200191611659565b820191906000526020600020905b81548152906001019060200180831161163c57829003601f168201915b505050505081565b600a546001600160a01b0316331461168b5760405162461bcd60e51b81526004016107a9906125a8565b6001600160a01b0381166116f05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107a9565b6111a581611a73565b60006001600160e01b031982166380ac58cd60e01b148061172a57506001600160e01b03198216635b5e139f60e01b145b806106e757506301ffc9a760e01b6001600160e01b03198316146106e7565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061177e82610f62565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166118305760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107a9565b600061183b83610f62565b9050806001600160a01b0316846001600160a01b031614806118765750836001600160a01b031661186b846107c0565b6001600160a01b0316145b806118a657506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166118c182610f62565b6001600160a01b0316146119295760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107a9565b6001600160a01b03821661198b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107a9565b611996838383611c05565b6119a1600082611749565b6001600160a01b03831660009081526003602052604081208054600192906119ca9084906126db565b90915550506001600160a01b03821660009081526003602052604081208054600192906119f89084906125f3565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610f35828260405180602001604052806000815250611cbd565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611ad08484846118ae565b611adc84848484611cf0565b6110545760405162461bcd60e51b81526004016107a9906126f2565b6060600b80546106fc9061256d565b606081611b2b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611b555780611b3f81612621565b9150611b4e9050600a8361275a565b9150611b2f565b60008167ffffffffffffffff811115611b7057611b706123ad565b6040519080825280601f01601f191660200182016040528015611b9a576020820181803683370190505b5090505b84156118a657611baf6001836126db565b9150611bbc600a8661276e565b611bc79060306125f3565b60f81b818381518110611bdc57611bdc61260b565b60200101906001600160f81b031916908160001a905350611bfe600a8661275a565b9450611b9e565b6001600160a01b038316611c6057611c5b81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611c83565b816001600160a01b0316836001600160a01b031614611c8357611c838382611dfd565b6001600160a01b038216611c9a5761096681611e9a565b826001600160a01b0316826001600160a01b031614610966576109668282611f49565b611cc78383611f8d565b611cd46000848484611cf0565b6109665760405162461bcd60e51b81526004016107a9906126f2565b60006001600160a01b0384163b15611df257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611d34903390899088908890600401612782565b602060405180830381600087803b158015611d4e57600080fd5b505af1925050508015611d7e575060408051601f3d908101601f19168201909252611d7b918101906127bf565b60015b611dd8573d808015611dac576040519150601f19603f3d011682016040523d82523d6000602084013e611db1565b606091505b508051611dd05760405162461bcd60e51b81526004016107a9906126f2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506118a6565b506001949350505050565b60006001611e0a8461105a565b611e1491906126db565b600083815260076020526040902054909150808214611e67576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611eac906001906126db565b60008381526009602052604081205460088054939450909284908110611ed457611ed461260b565b906000526020600020015490508060088381548110611ef557611ef561260b565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611f2d57611f2d6127dc565b6001900381819060005260206000200160009055905550505050565b6000611f548361105a565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216611fe35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107a9565b6000818152600260205260409020546001600160a01b0316156120485760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107a9565b61205460008383611c05565b6001600160a01b038216600090815260036020526040812080546001929061207d9084906125f3565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546120e79061256d565b90600052602060002090601f016020900481019282612109576000855561214f565b82601f1061212257805160ff191683800117855561214f565b8280016001018555821561214f579182015b8281111561214f578251825591602001919060010190612134565b5061215b92915061215f565b5090565b5b8082111561215b5760008155600101612160565b6001600160e01b0319811681146111a557600080fd5b60006020828403121561219c57600080fd5b81356115cc81612174565b60005b838110156121c25781810151838201526020016121aa565b838111156110545750506000910152565b600081518084526121eb8160208601602086016121a7565b601f01601f19169290920160200192915050565b6020815260006115cc60208301846121d3565b60008060006060848603121561222757600080fd5b505081359360208301359350604090920135919050565b60006020828403121561225057600080fd5b5035919050565b80356001600160a01b038116811461226e57600080fd5b919050565b6000806040838503121561228657600080fd5b61228f83612257565b946020939093013593505050565b600080602083850312156122b057600080fd5b823567ffffffffffffffff808211156122c857600080fd5b818501915085601f8301126122dc57600080fd5b8135818111156122eb57600080fd5b8660208260051b850101111561230057600080fd5b60209290920196919550909350505050565b60008060006060848603121561232757600080fd5b61233084612257565b925061233e60208501612257565b9150604084013590509250925092565b60006020828403121561236057600080fd5b6115cc82612257565b6020808252825182820181905260009190848201906040850190845b818110156123a157835183529284019291840191600101612385565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156123de576123de6123ad565b604051601f8501601f19908116603f01168101908282118183101715612406576124066123ad565b8160405280935085815286868601111561241f57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561244b57600080fd5b813567ffffffffffffffff81111561246257600080fd5b8201601f8101841361247357600080fd5b6118a6848235602084016123c3565b6000806040838503121561249557600080fd5b61249e83612257565b9150602083013580151581146124b357600080fd5b809150509250929050565b600080600080608085870312156124d457600080fd5b6124dd85612257565b93506124eb60208601612257565b925060408501359150606085013567ffffffffffffffff81111561250e57600080fd5b8501601f8101871361251f57600080fd5b61252e878235602084016123c3565b91505092959194509250565b6000806040838503121561254d57600080fd5b61255683612257565b915061256460208401612257565b90509250929050565b600181811c9082168061258157607f821691505b602082108114156125a257634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612606576126066125dd565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415612635576126356125dd565b5060010190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008160001904831182151516156126a7576126a76125dd565b500290565b600083516126be8184602088016121a7565b8351908301906126d28183602088016121a7565b01949350505050565b6000828210156126ed576126ed6125dd565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261276957612769612744565b500490565b60008261277d5761277d612744565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906127b5908301846121d3565b9695505050505050565b6000602082840312156127d157600080fd5b81516115cc81612174565b634e487b7160e01b600052603160045260246000fdfea26469706673582212205971f49976e51632123078d174b6cc7fd9fb2defb7893abc26eabb2a12a2e13f64736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002268747470733a2f2f6170692e626974746f7563682e6172742f6169762f6d6574612f000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : baseURI (string): https://api.bittouch.art/aiv/meta/
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000022
Arg [2] : 68747470733a2f2f6170692e626974746f7563682e6172742f6169762f6d6574
Arg [3] : 612f000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
42194:4946:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33852:224;;;;;;;;;;-1:-1:-1;33852:224:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;33852:224:0;;;;;;;;20980:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;46607:205::-;;;;;;;;;;-1:-1:-1;46607:205:0;;;;;:::i;:::-;;:::i;:::-;;22539:221;;;;;;;;;;-1:-1:-1;22539:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2013:32:1;;;1995:51;;1983:2;1968:18;22539:221:0;1849:203:1;22062:411:0;;;;;;;;;;-1:-1:-1;22062:411:0;;;;;:::i;:::-;;:::i;34492:113::-;;;;;;;;;;-1:-1:-1;34580:10:0;:17;34492:113;;;2640:25:1;;;2628:2;2613:18;34492:113:0;2494:177:1;45361:545:0;;;;;;;;;;-1:-1:-1;45361:545:0;;;;;:::i;:::-;;:::i;44502:150::-;;;;;;;;;;;;;:::i;44335:159::-;;;;;;;;;;;;;:::i;23429:339::-;;;;;;;;;;-1:-1:-1;23429:339:0;;;;;:::i;:::-;;:::i;34160:256::-;;;;;;;;;;-1:-1:-1;34160:256:0;;;;;:::i;:::-;;:::i;23839:185::-;;;;;;;;;;-1:-1:-1;23839:185:0;;;;;:::i;:::-;;:::i;43731:353::-;;;;;;;;;;-1:-1:-1;43731:353:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;46386:213::-;;;;;;;;;;-1:-1:-1;46386:213:0;;;;;:::i;:::-;;:::i;44990:359::-;;;;;;;;;;-1:-1:-1;44990:359:0;;;;;:::i;:::-;;:::i;34682:233::-;;;;;;;;;;-1:-1:-1;34682:233:0;;;;;:::i;:::-;;:::i;46277:101::-;;;;;;;;;;-1:-1:-1;46277:101:0;;;;;:::i;:::-;;:::i;44660:207::-;;;;;;;;;;;;;:::i;20496:239::-;;;;;;;;;;-1:-1:-1;20496:239:0;;;;;:::i;:::-;;:::i;45918:351::-;;;;;;;;;;-1:-1:-1;45918:351:0;;;;;:::i;:::-;;:::i;20226:208::-;;;;;;;;;;-1:-1:-1;20226:208:0;;;;;:::i;:::-;;:::i;41563:94::-;;;;;;;;;;;;;:::i;46820:193::-;;;;;;;;;;-1:-1:-1;46820:193:0;;;;;:::i;:::-;;:::i;20800:109::-;;;;;;;;;;-1:-1:-1;20800:109:0;;;;;:::i;:::-;20858:7;20885:16;;;:7;:16;;;;;;-1:-1:-1;;;;;20885:16:0;;20800:109;47021:112;;;;;;;;;;;;;:::i;40912:87::-;;;;;;;;;;-1:-1:-1;40985:6:0;;-1:-1:-1;;;;;40985:6:0;40912:87;;21149:104;;;;;;;;;;;;;:::i;44219:100::-;;;;;;;;;;-1:-1:-1;44296:15:0;;44219:100;;42954:769;;;;;;:::i;:::-;;:::i;22832:295::-;;;;;;;;;;-1:-1:-1;22832:295:0;;;;;:::i;:::-;;:::i;24095:328::-;;;;;;;;;;-1:-1:-1;24095:328:0;;;;;:::i;:::-;;:::i;21324:334::-;;;;;;;;;;-1:-1:-1;21324:334:0;;;;;:::i;:::-;;:::i;42349:26::-;;;;;;;;;;;;;:::i;23198:164::-;;;;;;;;;;-1:-1:-1;23198:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;23319:25:0;;;23295:4;23319:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23198:164;41812:192;;;;;;;;;;-1:-1:-1;41812:192:0;;;;;:::i;:::-;;:::i;44875:103::-;;;;;;;;;;-1:-1:-1;44875:103:0;;;;;:::i;:::-;-1:-1:-1;;;;;44955:15:0;44931:4;44955:15;;;:9;:15;;;;;;;;;44875:103;33852:224;33954:4;-1:-1:-1;;;;;;33978:50:0;;-1:-1:-1;;;33978:50:0;;:90;;;34032:36;34056:11;34032:23;:36::i;:::-;33971:97;33852:224;-1:-1:-1;;33852:224:0:o;20980:100::-;21034:13;21067:5;21060:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20980:100;:::o;46607:205::-;40985:6;;-1:-1:-1;;;;;40985:6:0;15643:10;41132:23;41124:68;;;;-1:-1:-1;;;41124:68:0;;;;;;;:::i;:::-;;;;;;;;;46703:14:::1;:28:::0;;;;46743:19;:26;46780:18;:24;46607:205::o;22539:221::-;22615:7;26022:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26022:16:0;22635:73;;;;-1:-1:-1;;;22635:73:0;;7919:2:1;22635:73:0;;;7901:21:1;7958:2;7938:18;;;7931:30;7997:34;7977:18;;;7970:62;-1:-1:-1;;;8048:18:1;;;8041:42;8100:19;;22635:73:0;7717:408:1;22635:73:0;-1:-1:-1;22728:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;22728:24:0;;22539:221::o;22062:411::-;22143:13;22159:23;22174:7;22159:14;:23::i;:::-;22143:39;;22207:5;-1:-1:-1;;;;;22201:11:0;:2;-1:-1:-1;;;;;22201:11:0;;;22193:57;;;;-1:-1:-1;;;22193:57:0;;8332:2:1;22193:57:0;;;8314:21:1;8371:2;8351:18;;;8344:30;8410:34;8390:18;;;8383:62;-1:-1:-1;;;8461:18:1;;;8454:31;8502:19;;22193:57:0;8130:397:1;22193:57:0;15643:10;-1:-1:-1;;;;;22285:21:0;;;;:62;;-1:-1:-1;22310:37:0;22327:5;15643:10;23198:164;:::i;22310:37::-;22263:168;;;;-1:-1:-1;;;22263:168:0;;8734:2:1;22263:168:0;;;8716:21:1;8773:2;8753:18;;;8746:30;8812:34;8792:18;;;8785:62;8883:26;8863:18;;;8856:54;8927:19;;22263:168:0;8532:420:1;22263:168:0;22444:21;22453:2;22457:7;22444:8;:21::i;:::-;22132:341;22062:411;;:::o;45361:545::-;40985:6;;-1:-1:-1;;;;;40985:6:0;15643:10;41132:23;41124:68;;;;-1:-1:-1;;;41124:68:0;;;;;;;:::i;:::-;45492:20;;45456:15:::1;::::0;:32:::1;::::0;45474:7;;45456:32:::1;:::i;:::-;:56;;45448:102;;;::::0;-1:-1:-1;;;45448:102:0;;9424:2:1;45448:102:0::1;::::0;::::1;9406:21:1::0;9463:2;9443:18;;;9436:30;9502:34;9482:18;;;9475:62;-1:-1:-1;;;9553:18:1;;;9546:31;9594:19;;45448:102:0::1;9222:397:1::0;45448:102:0::1;45565:9;45561:335;45580:18:::0;;::::1;45561:335;;;45620:13;45636:7;;45644:1;45636:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;45620:26:::0;-1:-1:-1;;;;;;45669:19:0;::::1;45661:61;;;::::0;-1:-1:-1;;;45661:61:0;;9958:2:1;45661:61:0::1;::::0;::::1;9940:21:1::0;9997:2;9977:18;;;9970:30;10036:31;10016:18;;;10009:59;10085:18;;45661:61:0::1;9756:353:1::0;45661:61:0::1;-1:-1:-1::0;;;;;45746:16:0;::::1;;::::0;;;:9:::1;:16;::::0;;;;;::::1;;45745:17;45737:57;;;::::0;-1:-1:-1;;;45737:57:0;;10316:2:1;45737:57:0::1;::::0;::::1;10298:21:1::0;10355:2;10335:18;;;10328:30;10394:29;10374:18;;;10367:57;10441:18;;45737:57:0::1;10114:351:1::0;45737:57:0::1;45827:15;::::0;:19:::1;::::0;45845:1:::1;45827:19;:::i;:::-;45809:15;:37:::0;-1:-1:-1;;;;;45861:16:0::1;;::::0;;;:9:::1;:16;::::0;;;;:23;;-1:-1:-1;;45861:23:0::1;45880:4;45861:23;::::0;;45600:3;::::1;::::0;::::1;:::i;:::-;;;;45561:335;;44502:150:::0;44588:11;:17;44545:4;;44569:15;:36;;;;:75;;-1:-1:-1;44628:16:0;;44609:15;:35;;44569:75;44562:82;;44502:150;:::o;44335:159::-;44424:14;:20;44381:4;;44405:15;:39;;;;:81;;-1:-1:-1;;44467:19:0;;44448:15;:38;;;44335:159::o;23429:339::-;23624:41;15643:10;23657:7;23624:18;:41::i;:::-;23616:103;;;;-1:-1:-1;;;23616:103:0;;;;;;;:::i;:::-;23732:28;23742:4;23748:2;23752:7;23732:9;:28::i;34160:256::-;34257:7;34293:23;34310:5;34293:16;:23::i;:::-;34285:5;:31;34277:87;;;;-1:-1:-1;;;34277:87:0;;11230:2:1;34277:87:0;;;11212:21:1;11269:2;11249:18;;;11242:30;11308:34;11288:18;;;11281:62;-1:-1:-1;;;11359:18:1;;;11352:41;11410:19;;34277:87:0;11028:407:1;34277:87:0;-1:-1:-1;;;;;;34382:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;34160:256::o;23839:185::-;23977:39;23994:4;24000:2;24004:7;23977:39;;;;;;;;;;;;:16;:39::i;43731:353::-;43793:16;43822:18;43843:17;43853:6;43843:9;:17::i;:::-;43822:38;;43873:25;43915:10;43901:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43901:25:0;;43873:53;;43942:9;43937:112;43961:10;43957:1;:14;43937:112;;;44007:30;44027:6;44035:1;44007:19;:30::i;:::-;43993:8;44002:1;43993:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;43973:3;;;;:::i;:::-;;;;43937:112;;;-1:-1:-1;44068:8:0;43731:353;-1:-1:-1;;;43731:353:0:o;46386:213::-;40985:6;;-1:-1:-1;;;;;40985:6:0;15643:10;41132:23;41124:68;;;;-1:-1:-1;;;41124:68:0;;;;;;;:::i;:::-;46484:16:::1;:30:::0;;;;46526:21;:28;46565:20;:26;46386:213::o;44990:359::-;45063:17;:15;:17::i;:::-;45055:46;;;;-1:-1:-1;;;45055:46:0;;11642:2:1;45055:46:0;;;11624:21:1;11681:2;11661:18;;;11654:30;-1:-1:-1;;;11700:18:1;;;11693:46;11756:18;;45055:46:0;11440:340:1;45055:46:0;-1:-1:-1;;;;;45120:25:0;;45112:67;;;;-1:-1:-1;;;45112:67:0;;9958:2:1;45112:67:0;;;9940:21:1;9997:2;9977:18;;;9970:30;10036:31;10016:18;;;10009:59;10085:18;;45112:67:0;9756:353:1;45112:67:0;-1:-1:-1;;;;;45199:22:0;;;;;;:9;:22;;;;;;;;45198:23;45190:63;;;;-1:-1:-1;;;45190:63:0;;10316:2:1;45190:63:0;;;10298:21:1;10355:2;10335:18;;;10328:30;10394:29;10374:18;;;10367:57;10441:18;;45190:63:0;10114:351:1;45190:63:0;45282:15;;:19;;45300:1;45282:19;:::i;:::-;45264:15;:37;-1:-1:-1;;;;;45312:22:0;;;;;:9;:22;;;;;:29;;-1:-1:-1;;45312:29:0;45337:4;45312:29;;;44990:359::o;34682:233::-;34757:7;34793:30;34580:10;:17;;34492:113;34793:30;34785:5;:38;34777:95;;;;-1:-1:-1;;;34777:95:0;;11987:2:1;34777:95:0;;;11969:21:1;12026:2;12006:18;;;11999:30;12065:34;12045:18;;;12038:62;-1:-1:-1;;;12116:18:1;;;12109:42;12168:19;;34777:95:0;11785:408:1;34777:95:0;34890:10;34901:5;34890:17;;;;;;;;:::i;:::-;;;;;;;;;34883:24;;34682:233;;;:::o;46277:101::-;40985:6;;-1:-1:-1;;;;;40985:6:0;15643:10;41132:23;41124:68;;;;-1:-1:-1;;;41124:68:0;;;;;;;:::i;:::-;46348:22;;::::1;::::0;:12:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;46277:101:::0;:::o;44660:207::-;44751:16;:22;44708:4;;44732:15;:41;;;;:85;;-1:-1:-1;44796:21:0;;44777:15;:40;;44732:85;:127;;;;-1:-1:-1;;44839:20:0;;44821:15;;:38;;44660:207::o;20496:239::-;20568:7;20604:16;;;:7;:16;;;;;;-1:-1:-1;;;;;20604:16:0;20639:19;20631:73;;;;-1:-1:-1;;;20631:73:0;;12400:2:1;20631:73:0;;;12382:21:1;12439:2;12419:18;;;12412:30;12478:34;12458:18;;;12451:62;-1:-1:-1;;;12529:18:1;;;12522:39;12578:19;;20631:73:0;12198:405:1;45918:351:0;40985:6;;-1:-1:-1;;;;;40985:6:0;15643:10;41132:23;41124:68;;;;-1:-1:-1;;;41124:68:0;;;;;;;:::i;:::-;45989:13:::1;46005;34580:10:::0;:17;;34492:113;46005:13:::1;45989:29:::0;-1:-1:-1;46029:12:0::1;46044:13;46052:5:::0;45989:29;46044:13:::1;:::i;:::-;46029:28;;42290:3;46082:4;:19;46078:71;;;-1:-1:-1::0;42290:3:0::1;46078:71;46187:5:::0;46170:92:::1;46198:4;46194:1;:8;46170:92;;;46224:26;15643:10:::0;46234:12:::1;46248:1;46224:9;:26::i;:::-;46204:3:::0;::::1;::::0;::::1;:::i;:::-;;;;46170:92;;;;45978:291;;45918:351:::0;:::o;20226:208::-;20298:7;-1:-1:-1;;;;;20326:19:0;;20318:74;;;;-1:-1:-1;;;20318:74:0;;12810:2:1;20318:74:0;;;12792:21:1;12849:2;12829:18;;;12822:30;12888:34;12868:18;;;12861:62;-1:-1:-1;;;12939:18:1;;;12932:40;12989:19;;20318:74:0;12608:406:1;20318:74:0;-1:-1:-1;;;;;;20410:16:0;;;;;:9;:16;;;;;;;20226:208::o;41563:94::-;40985:6;;-1:-1:-1;;;;;40985:6:0;15643:10;41132:23;41124:68;;;;-1:-1:-1;;;41124:68:0;;;;;;;:::i;:::-;41628:21:::1;41646:1;41628:9;:21::i;:::-;41563:94::o:0;46820:193::-;40985:6;;-1:-1:-1;;;;;40985:6:0;15643:10;41132:23;41124:68;;;;-1:-1:-1;;;41124:68:0;;;;;;;:::i;:::-;46913:11:::1;:25:::0;;;;46950:16;:23;46984:15;:21;46820:193::o;47021:112::-;40985:6;;-1:-1:-1;;;;;40985:6:0;15643:10;41132:23;41124:68;;;;-1:-1:-1;;;41124:68:0;;;;;;;:::i;:::-;47074:51:::1;::::0;47082:10:::1;::::0;47103:21:::1;47074:51:::0;::::1;;;::::0;::::1;::::0;;;47103:21;47082:10;47074:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;47021:112::o:0;21149:104::-;21205:13;21238:7;21231:14;;;;;:::i;42954:769::-;43041:10;44931:4;44955:15;;;:9;:15;;;;;;;;43029:42;;;;;43056:15;:13;:15::i;:::-;43028:60;;;;43076:12;:10;:12::i;:::-;43020:84;;;;-1:-1:-1;;;43020:84:0;;13221:2:1;43020:84:0;;;13203:21:1;13260:2;13240:18;;;13233:30;-1:-1:-1;;;13279:18:1;;;13272:41;13330:18;;43020:84:0;13019:335:1;43020:84:0;43140:1;43123:14;:18;43115:54;;;;-1:-1:-1;;;43115:54:0;;13561:2:1;43115:54:0;;;13543:21:1;13600:2;13580:18;;;13573:30;13639:25;13619:18;;;13612:53;13682:18;;43115:54:0;13359:347:1;43115:54:0;43189:15;:13;:15::i;:::-;:55;;;;-1:-1:-1;43226:18:0;;43208:36;;;43189:55;43188:112;;;;43250:12;:10;:12::i;:::-;:49;;;;-1:-1:-1;43284:15:0;;43266:33;;;43250:49;43180:151;;;;-1:-1:-1;;;43180:151:0;;13913:2:1;43180:151:0;;;13895:21:1;13952:2;13932:18;;;13925:30;13991:28;13971:18;;;13964:56;14037:18;;43180:151:0;13711:350:1;43180:151:0;42290:3;43366:14;43350:13;34580:10;:17;;34492:113;43350:13;:30;;;;:::i;:::-;:46;;43342:87;;;;-1:-1:-1;;;43342:87:0;;14268:2:1;43342:87:0;;;14250:21:1;14307:2;14287:18;;;14280:30;14346;14326:18;;;14319:58;14394:18;;43342:87:0;14066:352:1;43342:87:0;43461:22;43469:14;42333:7;43461:22;:::i;:::-;43448:9;:35;;43440:71;;;;-1:-1:-1;;;43440:71:0;;14798:2:1;43440:71:0;;;14780:21:1;14837:2;14817:18;;;14810:30;14876:25;14856:18;;;14849:53;14919:18;;43440:71:0;14596:347:1;43440:71:0;43528:9;43524:192;43547:14;43543:1;:18;43524:192;;;43582:14;43599:13;34580:10;:17;;34492:113;43599:13;15643:10;43653:5;43627:23;;;:9;:23;;;;;:31;;-1:-1:-1;;43627:31:0;;;43582:30;;-1:-1:-1;43673:31:0;;43683:12;15563:98;43673:31;-1:-1:-1;43563:3:0;;;;:::i;:::-;;;;43524:192;;22832:295;-1:-1:-1;;;;;22935:24:0;;15643:10;22935:24;;22927:62;;;;-1:-1:-1;;;22927:62:0;;15150:2:1;22927:62:0;;;15132:21:1;15189:2;15169:18;;;15162:30;15228:27;15208:18;;;15201:55;15273:18;;22927:62:0;14948:349:1;22927:62:0;15643:10;23002:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;23002:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;23002:53:0;;;;;;;;;;23071:48;;540:41:1;;;23002:42:0;;15643:10;23071:48;;513:18:1;23071:48:0;;;;;;;22832:295;;:::o;24095:328::-;24270:41;15643:10;24303:7;24270:18;:41::i;:::-;24262:103;;;;-1:-1:-1;;;24262:103:0;;;;;;;:::i;:::-;24376:39;24390:4;24396:2;24400:7;24409:5;24376:13;:39::i;21324:334::-;25998:4;26022:16;;;:7;:16;;;;;;21397:13;;-1:-1:-1;;;;;26022:16:0;21423:76;;;;-1:-1:-1;;;21423:76:0;;15504:2:1;21423:76:0;;;15486:21:1;15543:2;15523:18;;;15516:30;15582:34;15562:18;;;15555:62;-1:-1:-1;;;15633:18:1;;;15626:45;15688:19;;21423:76:0;15302:411:1;21423:76:0;21512:21;21536:10;:8;:10::i;:::-;21512:34;;21588:1;21570:7;21564:21;:25;:86;;;;;;;;;;;;;;;;;21616:7;21625:18;:7;:16;:18::i;:::-;21599:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21564:86;21557:93;21324:334;-1:-1:-1;;;21324:334:0:o;42349:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41812:192::-;40985:6;;-1:-1:-1;;;;;40985:6:0;15643:10;41132:23;41124:68;;;;-1:-1:-1;;;41124:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41901:22:0;::::1;41893:73;;;::::0;-1:-1:-1;;;41893:73:0;;16395:2:1;41893:73:0::1;::::0;::::1;16377:21:1::0;16434:2;16414:18;;;16407:30;16473:34;16453:18;;;16446:62;-1:-1:-1;;;16524:18:1;;;16517:36;16570:19;;41893:73:0::1;16193:402:1::0;41893:73:0::1;41977:19;41987:8;41977:9;:19::i;19857:305::-:0;19959:4;-1:-1:-1;;;;;;19996:40:0;;-1:-1:-1;;;19996:40:0;;:105;;-1:-1:-1;;;;;;;20053:48:0;;-1:-1:-1;;;20053:48:0;19996:105;:158;;;-1:-1:-1;;;;;;;;;;18573:40:0;;;20118:36;18464:157;29915:174;29990:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;29990:29:0;-1:-1:-1;;;;;29990:29:0;;;;;;;;:24;;30044:23;29990:24;30044:14;:23::i;:::-;-1:-1:-1;;;;;30035:46:0;;;;;;;;;;;29915:174;;:::o;26227:348::-;26320:4;26022:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26022:16:0;26337:73;;;;-1:-1:-1;;;26337:73:0;;16802:2:1;26337:73:0;;;16784:21:1;16841:2;16821:18;;;16814:30;16880:34;16860:18;;;16853:62;-1:-1:-1;;;16931:18:1;;;16924:42;16983:19;;26337:73:0;16600:408:1;26337:73:0;26421:13;26437:23;26452:7;26437:14;:23::i;:::-;26421:39;;26490:5;-1:-1:-1;;;;;26479:16:0;:7;-1:-1:-1;;;;;26479:16:0;;:51;;;;26523:7;-1:-1:-1;;;;;26499:31:0;:20;26511:7;26499:11;:20::i;:::-;-1:-1:-1;;;;;26499:31:0;;26479:51;:87;;;-1:-1:-1;;;;;;23319:25:0;;;23295:4;23319:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;26534:32;26471:96;26227:348;-1:-1:-1;;;;26227:348:0:o;29219:578::-;29378:4;-1:-1:-1;;;;;29351:31:0;:23;29366:7;29351:14;:23::i;:::-;-1:-1:-1;;;;;29351:31:0;;29343:85;;;;-1:-1:-1;;;29343:85:0;;17215:2:1;29343:85:0;;;17197:21:1;17254:2;17234:18;;;17227:30;17293:34;17273:18;;;17266:62;-1:-1:-1;;;17344:18:1;;;17337:39;17393:19;;29343:85:0;17013:405:1;29343:85:0;-1:-1:-1;;;;;29447:16:0;;29439:65;;;;-1:-1:-1;;;29439:65:0;;17625:2:1;29439:65:0;;;17607:21:1;17664:2;17644:18;;;17637:30;17703:34;17683:18;;;17676:62;-1:-1:-1;;;17754:18:1;;;17747:34;17798:19;;29439:65:0;17423:400:1;29439:65:0;29517:39;29538:4;29544:2;29548:7;29517:20;:39::i;:::-;29621:29;29638:1;29642:7;29621:8;:29::i;:::-;-1:-1:-1;;;;;29663:15:0;;;;;;:9;:15;;;;;:20;;29682:1;;29663:15;:20;;29682:1;;29663:20;:::i;:::-;;;;-1:-1:-1;;;;;;;29694:13:0;;;;;;:9;:13;;;;;:18;;29711:1;;29694:13;:18;;29711:1;;29694:18;:::i;:::-;;;;-1:-1:-1;;29723:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29723:21:0;-1:-1:-1;;;;;29723:21:0;;;;;;;;;29762:27;;29723:16;;29762:27;;;;;;;29219:578;;;:::o;26917:110::-;26993:26;27003:2;27007:7;26993:26;;;;;;;;;;;;:9;:26::i;42012:173::-;42087:6;;;-1:-1:-1;;;;;42104:17:0;;;-1:-1:-1;;;;;;42104:17:0;;;;;;;42137:40;;42087:6;;;42104:17;42087:6;;42137:40;;42068:16;;42137:40;42057:128;42012:173;:::o;25305:315::-;25462:28;25472:4;25478:2;25482:7;25462:9;:28::i;:::-;25509:48;25532:4;25538:2;25542:7;25551:5;25509:22;:48::i;:::-;25501:111;;;;-1:-1:-1;;;25501:111:0;;;;;;;:::i;44094:113::-;44154:13;44187:12;44180:19;;;;;:::i;16005:723::-;16061:13;16282:10;16278:53;;-1:-1:-1;;16309:10:0;;;;;;;;;;;;-1:-1:-1;;;16309:10:0;;;;;16005:723::o;16278:53::-;16356:5;16341:12;16397:78;16404:9;;16397:78;;16430:8;;;;:::i;:::-;;-1:-1:-1;16453:10:0;;-1:-1:-1;16461:2:0;16453:10;;:::i;:::-;;;16397:78;;;16485:19;16517:6;16507:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16507:17:0;;16485:39;;16535:154;16542:10;;16535:154;;16569:11;16579:1;16569:11;;:::i;:::-;;-1:-1:-1;16638:10:0;16646:2;16638:5;:10;:::i;:::-;16625:24;;:2;:24;:::i;:::-;16612:39;;16595:6;16602;16595:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;16595:56:0;;;;;;;;-1:-1:-1;16666:11:0;16675:2;16666:11;;:::i;:::-;;;16535:154;;35528:589;-1:-1:-1;;;;;35734:18:0;;35730:187;;35769:40;35801:7;36944:10;:17;;36917:24;;;;:15;:24;;;;;:44;;;36972:24;;;;;;;;;;;;36840:164;35769:40;35730:187;;;35839:2;-1:-1:-1;;;;;35831:10:0;:4;-1:-1:-1;;;;;35831:10:0;;35827:90;;35858:47;35891:4;35897:7;35858:32;:47::i;:::-;-1:-1:-1;;;;;35931:16:0;;35927:183;;35964:45;36001:7;35964:36;:45::i;35927:183::-;36037:4;-1:-1:-1;;;;;36031:10:0;:2;-1:-1:-1;;;;;36031:10:0;;36027:83;;36058:40;36086:2;36090:7;36058:27;:40::i;27254:321::-;27384:18;27390:2;27394:7;27384:5;:18::i;:::-;27435:54;27466:1;27470:2;27474:7;27483:5;27435:22;:54::i;:::-;27413:154;;;;-1:-1:-1;;;27413:154:0;;;;;;;:::i;30654:799::-;30809:4;-1:-1:-1;;;;;30830:13:0;;8013:20;8061:8;30826:620;;30866:72;;-1:-1:-1;;;30866:72:0;;-1:-1:-1;;;;;30866:36:0;;;;;:72;;15643:10;;30917:4;;30923:7;;30932:5;;30866:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30866:72:0;;;;;;;;-1:-1:-1;;30866:72:0;;;;;;;;;;;;:::i;:::-;;;30862:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31108:13:0;;31104:272;;31151:60;;-1:-1:-1;;;31151:60:0;;;;;;;:::i;31104:272::-;31326:6;31320:13;31311:6;31307:2;31303:15;31296:38;30862:529;-1:-1:-1;;;;;;30989:51:0;-1:-1:-1;;;30989:51:0;;-1:-1:-1;30982:58:0;;30826:620;-1:-1:-1;31430:4:0;30654:799;;;;;;:::o;37631:988::-;37897:22;37947:1;37922:22;37939:4;37922:16;:22::i;:::-;:26;;;;:::i;:::-;37959:18;37980:26;;;:17;:26;;;;;;37897:51;;-1:-1:-1;38113:28:0;;;38109:328;;-1:-1:-1;;;;;38180:18:0;;38158:19;38180:18;;;:12;:18;;;;;;;;:34;;;;;;;;;38231:30;;;;;;:44;;;38348:30;;:17;:30;;;;;:43;;;38109:328;-1:-1:-1;38533:26:0;;;;:17;:26;;;;;;;;38526:33;;;-1:-1:-1;;;;;38577:18:0;;;;;:12;:18;;;;;:34;;;;;;;38570:41;37631:988::o;38914:1079::-;39192:10;:17;39167:22;;39192:21;;39212:1;;39192:21;:::i;:::-;39224:18;39245:24;;;:15;:24;;;;;;39618:10;:26;;39167:46;;-1:-1:-1;39245:24:0;;39167:46;;39618:26;;;;;;:::i;:::-;;;;;;;;;39596:48;;39682:11;39657:10;39668;39657:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;39762:28;;;:15;:28;;;;;;;:41;;;39934:24;;;;;39927:31;39969:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;38985:1008;;;38914:1079;:::o;36418:221::-;36503:14;36520:20;36537:2;36520:16;:20::i;:::-;-1:-1:-1;;;;;36551:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;36596:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;36418:221:0:o;27911:382::-;-1:-1:-1;;;;;27991:16:0;;27983:61;;;;-1:-1:-1;;;27983:61:0;;19833:2:1;27983:61:0;;;19815:21:1;;;19852:18;;;19845:30;19911:34;19891:18;;;19884:62;19963:18;;27983:61:0;19631:356:1;27983:61:0;25998:4;26022:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26022:16:0;:30;28055:58;;;;-1:-1:-1;;;28055:58:0;;20194:2:1;28055:58:0;;;20176:21:1;20233:2;20213:18;;;20206:30;20272;20252:18;;;20245:58;20320:18;;28055:58:0;19992:352:1;28055:58:0;28126:45;28155:1;28159:2;28163:7;28126:20;:45::i;:::-;-1:-1:-1;;;;;28184:13:0;;;;;;:9;:13;;;;;:18;;28201:1;;28184:13;:18;;28201:1;;28184:18;:::i;:::-;;;;-1:-1:-1;;28213:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28213:21:0;-1:-1:-1;;;;;28213:21:0;;;;;;;;28252:33;;28213:16;;;28252:33;;28213:16;;28252:33;27911:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:316::-;1420:6;1428;1436;1489:2;1477:9;1468:7;1464:23;1460:32;1457:52;;;1505:1;1502;1495:12;1457:52;-1:-1:-1;;1528:23:1;;;1598:2;1583:18;;1570:32;;-1:-1:-1;1649:2:1;1634:18;;;1621:32;;1343:316;-1:-1:-1;1343:316:1:o;1664:180::-;1723:6;1776:2;1764:9;1755:7;1751:23;1747:32;1744:52;;;1792:1;1789;1782:12;1744:52;-1:-1:-1;1815:23:1;;1664:180;-1:-1:-1;1664:180:1:o;2057:173::-;2125:20;;-1:-1:-1;;;;;2174:31:1;;2164:42;;2154:70;;2220:1;2217;2210:12;2154:70;2057:173;;;:::o;2235:254::-;2303:6;2311;2364:2;2352:9;2343:7;2339:23;2335:32;2332:52;;;2380:1;2377;2370:12;2332:52;2403:29;2422:9;2403:29;:::i;:::-;2393:39;2479:2;2464:18;;;;2451:32;;-1:-1:-1;;;2235:254:1:o;2676:615::-;2762:6;2770;2823:2;2811:9;2802:7;2798:23;2794:32;2791:52;;;2839:1;2836;2829:12;2791:52;2879:9;2866:23;2908:18;2949:2;2941:6;2938:14;2935:34;;;2965:1;2962;2955:12;2935:34;3003:6;2992:9;2988:22;2978:32;;3048:7;3041:4;3037:2;3033:13;3029:27;3019:55;;3070:1;3067;3060:12;3019:55;3110:2;3097:16;3136:2;3128:6;3125:14;3122:34;;;3152:1;3149;3142:12;3122:34;3205:7;3200:2;3190:6;3187:1;3183:14;3179:2;3175:23;3171:32;3168:45;3165:65;;;3226:1;3223;3216:12;3165:65;3257:2;3249:11;;;;;3279:6;;-1:-1:-1;2676:615:1;;-1:-1:-1;;;;2676:615:1:o;3296:328::-;3373:6;3381;3389;3442:2;3430:9;3421:7;3417:23;3413:32;3410:52;;;3458:1;3455;3448:12;3410:52;3481:29;3500:9;3481:29;:::i;:::-;3471:39;;3529:38;3563:2;3552:9;3548:18;3529:38;:::i;:::-;3519:48;;3614:2;3603:9;3599:18;3586:32;3576:42;;3296:328;;;;;:::o;3629:186::-;3688:6;3741:2;3729:9;3720:7;3716:23;3712:32;3709:52;;;3757:1;3754;3747:12;3709:52;3780:29;3799:9;3780:29;:::i;3820:632::-;3991:2;4043:21;;;4113:13;;4016:18;;;4135:22;;;3962:4;;3991:2;4214:15;;;;4188:2;4173:18;;;3962:4;4257:169;4271:6;4268:1;4265:13;4257:169;;;4332:13;;4320:26;;4401:15;;;;4366:12;;;;4293:1;4286:9;4257:169;;;-1:-1:-1;4443:3:1;;3820:632;-1:-1:-1;;;;;;3820:632:1:o;4457:127::-;4518:10;4513:3;4509:20;4506:1;4499:31;4549:4;4546:1;4539:15;4573:4;4570:1;4563:15;4589:632;4654:5;4684:18;4725:2;4717:6;4714:14;4711:40;;;4731:18;;:::i;:::-;4806:2;4800:9;4774:2;4860:15;;-1:-1:-1;;4856:24:1;;;4882:2;4852:33;4848:42;4836:55;;;4906:18;;;4926:22;;;4903:46;4900:72;;;4952:18;;:::i;:::-;4992:10;4988:2;4981:22;5021:6;5012:15;;5051:6;5043;5036:22;5091:3;5082:6;5077:3;5073:16;5070:25;5067:45;;;5108:1;5105;5098:12;5067:45;5158:6;5153:3;5146:4;5138:6;5134:17;5121:44;5213:1;5206:4;5197:6;5189;5185:19;5181:30;5174:41;;;;4589:632;;;;;:::o;5226:451::-;5295:6;5348:2;5336:9;5327:7;5323:23;5319:32;5316:52;;;5364:1;5361;5354:12;5316:52;5404:9;5391:23;5437:18;5429:6;5426:30;5423:50;;;5469:1;5466;5459:12;5423:50;5492:22;;5545:4;5537:13;;5533:27;-1:-1:-1;5523:55:1;;5574:1;5571;5564:12;5523:55;5597:74;5663:7;5658:2;5645:16;5640:2;5636;5632:11;5597:74;:::i;5682:347::-;5747:6;5755;5808:2;5796:9;5787:7;5783:23;5779:32;5776:52;;;5824:1;5821;5814:12;5776:52;5847:29;5866:9;5847:29;:::i;:::-;5837:39;;5926:2;5915:9;5911:18;5898:32;5973:5;5966:13;5959:21;5952:5;5949:32;5939:60;;5995:1;5992;5985:12;5939:60;6018:5;6008:15;;;5682:347;;;;;:::o;6034:667::-;6129:6;6137;6145;6153;6206:3;6194:9;6185:7;6181:23;6177:33;6174:53;;;6223:1;6220;6213:12;6174:53;6246:29;6265:9;6246:29;:::i;:::-;6236:39;;6294:38;6328:2;6317:9;6313:18;6294:38;:::i;:::-;6284:48;;6379:2;6368:9;6364:18;6351:32;6341:42;;6434:2;6423:9;6419:18;6406:32;6461:18;6453:6;6450:30;6447:50;;;6493:1;6490;6483:12;6447:50;6516:22;;6569:4;6561:13;;6557:27;-1:-1:-1;6547:55:1;;6598:1;6595;6588:12;6547:55;6621:74;6687:7;6682:2;6669:16;6664:2;6660;6656:11;6621:74;:::i;:::-;6611:84;;;6034:667;;;;;;;:::o;6706:260::-;6774:6;6782;6835:2;6823:9;6814:7;6810:23;6806:32;6803:52;;;6851:1;6848;6841:12;6803:52;6874:29;6893:9;6874:29;:::i;:::-;6864:39;;6922:38;6956:2;6945:9;6941:18;6922:38;:::i;:::-;6912:48;;6706:260;;;;;:::o;6971:380::-;7050:1;7046:12;;;;7093;;;7114:61;;7168:4;7160:6;7156:17;7146:27;;7114:61;7221:2;7213:6;7210:14;7190:18;7187:38;7184:161;;;7267:10;7262:3;7258:20;7255:1;7248:31;7302:4;7299:1;7292:15;7330:4;7327:1;7320:15;7184:161;;6971:380;;;:::o;7356:356::-;7558:2;7540:21;;;7577:18;;;7570:30;7636:34;7631:2;7616:18;;7609:62;7703:2;7688:18;;7356:356::o;8957:127::-;9018:10;9013:3;9009:20;9006:1;8999:31;9049:4;9046:1;9039:15;9073:4;9070:1;9063:15;9089:128;9129:3;9160:1;9156:6;9153:1;9150:13;9147:39;;;9166:18;;:::i;:::-;-1:-1:-1;9202:9:1;;9089:128::o;9624:127::-;9685:10;9680:3;9676:20;9673:1;9666:31;9716:4;9713:1;9706:15;9740:4;9737:1;9730:15;10470:135;10509:3;-1:-1:-1;;10530:17:1;;10527:43;;;10550:18;;:::i;:::-;-1:-1:-1;10597:1:1;10586:13;;10470:135::o;10610:413::-;10812:2;10794:21;;;10851:2;10831:18;;;10824:30;10890:34;10885:2;10870:18;;10863:62;-1:-1:-1;;;10956:2:1;10941:18;;10934:47;11013:3;10998:19;;10610:413::o;14423:168::-;14463:7;14529:1;14525;14521:6;14517:14;14514:1;14511:21;14506:1;14499:9;14492:17;14488:45;14485:71;;;14536:18;;:::i;:::-;-1:-1:-1;14576:9:1;;14423:168::o;15718:470::-;15897:3;15935:6;15929:13;15951:53;15997:6;15992:3;15985:4;15977:6;15973:17;15951:53;:::i;:::-;16067:13;;16026:16;;;;16089:57;16067:13;16026:16;16123:4;16111:17;;16089:57;:::i;:::-;16162:20;;15718:470;-1:-1:-1;;;;15718:470:1:o;17828:125::-;17868:4;17896:1;17893;17890:8;17887:34;;;17901:18;;:::i;:::-;-1:-1:-1;17938:9:1;;17828:125::o;17958:414::-;18160:2;18142:21;;;18199:2;18179:18;;;18172:30;18238:34;18233:2;18218:18;;18211:62;-1:-1:-1;;;18304:2:1;18289:18;;18282:48;18362:3;18347:19;;17958:414::o;18377:127::-;18438:10;18433:3;18429:20;18426:1;18419:31;18469:4;18466:1;18459:15;18493:4;18490:1;18483:15;18509:120;18549:1;18575;18565:35;;18580:18;;:::i;:::-;-1:-1:-1;18614:9:1;;18509:120::o;18634:112::-;18666:1;18692;18682:35;;18697:18;;:::i;:::-;-1:-1:-1;18731:9:1;;18634:112::o;18751:489::-;-1:-1:-1;;;;;19020:15:1;;;19002:34;;19072:15;;19067:2;19052:18;;19045:43;19119:2;19104:18;;19097:34;;;19167:3;19162:2;19147:18;;19140:31;;;18945:4;;19188:46;;19214:19;;19206:6;19188:46;:::i;:::-;19180:54;18751:489;-1:-1:-1;;;;;;18751:489:1:o;19245:249::-;19314:6;19367:2;19355:9;19346:7;19342:23;19338:32;19335:52;;;19383:1;19380;19373:12;19335:52;19415:9;19409:16;19434:30;19458:5;19434:30;:::i;19499:127::-;19560:10;19555:3;19551:20;19548:1;19541:31;19591:4;19588:1;19581:15;19615:4;19612:1;19605:15
Swarm Source
ipfs://5971f49976e51632123078d174b6cc7fd9fb2defb7893abc26eabb2a12a2e13f
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.