ERC-721
Overview
Max Total Supply
5,001 RCATS
Holders
2,160
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 RCATSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
RainbowCats
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-01-08 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/introspection/IERC165.sol pragma solidity ^0.8.11; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.8.11; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol pragma solidity ^0.8.11; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.11; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.11; /** * @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); } } } } // File: @openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.11; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.11; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.11; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.11; /** * @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 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 {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol pragma solidity ^0.8.11; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.8.11; /** * @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); } } pragma solidity >=0.8.11; contract RainbowCats is ERC721Enumerable, Ownable { using Strings for uint256; string public baseURI; string public baseExtension = ".json"; string public notRevealedUri; uint256 public cost = 0.0 ether; uint256 public maxSupply = 5000; uint256 public maxMintAmount = 5; uint256 public reserved = 150; uint256 public nftPerAddressLimit = 1; bool public isPublicSaleActive = false; bool public isWhitelistSaleActive = false; bool public revealed = false; bool public onlyWhitelisted = true; address[] public whitelistedAddresses; mapping(address => uint256) public addressMintedBalance; constructor ( string memory _initBaseURI, string memory _initNotRevealedUri) ERC721 ("Rainbow Cats", "RCATS") { setBaseURI(_initBaseURI); setNotRevealedURI(_initNotRevealedUri); } // internal function _baseURI() internal view virtual override returns (string memory) { return baseURI; } // public function mint(uint256 _mintAmount) public payable { require(isPublicSaleActive, "Main Sale is Paused"); uint256 supply = totalSupply(); require(_mintAmount > 0, "need to mint at least 1 NFT"); require(_mintAmount <= maxMintAmount, "max mint amount per session exceeded"); require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded"); for (uint256 i = 1; i <= _mintAmount; i++) { addressMintedBalance[msg.sender]++; _safeMint(msg.sender, supply + i); } } function mintPresale(uint256 _mintAmount) external payable { require(isWhitelistSaleActive, "Whitelist sale is still inactive"); uint256 supply = totalSupply(); require(isWhitelisted(msg.sender), "user is not whitelisted"); uint256 ownerMintedCount = addressMintedBalance[msg.sender]; require(ownerMintedCount + _mintAmount <= nftPerAddressLimit, "max NFT per address exceeded"); require(msg.value >= cost * _mintAmount, "insufficient funds"); for (uint256 i = 1; i <= _mintAmount; i++) { addressMintedBalance[msg.sender]++; _safeMint(msg.sender, supply + i); } } function isWhitelisted(address _user) public view returns (bool) { for (uint i = 0; i < whitelistedAddresses.length; i++) { if (whitelistedAddresses[i] == _user) { return true; } } return false; } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](ownerTokenCount); for (uint256 i; i < ownerTokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); if(revealed == false) { return notRevealedUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension)) : ""; } //only owner function reveal() public onlyOwner { revealed = true; } function setNftPerAddressLimit(uint256 _limit) public onlyOwner { nftPerAddressLimit = _limit; } function setCost(uint256 _newCost) public onlyOwner { cost = _newCost; } function checkWhiteList(address addr) external view returns (uint256) { return addressMintedBalance[addr]; } function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner { maxMintAmount = _newmaxMintAmount; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner { notRevealedUri = _notRevealedURI; } function setPublicSaleStatus(bool val) public onlyOwner { isPublicSaleActive = val; } function setWhiteListSaleStatus(bool val) public onlyOwner { isWhitelistSaleActive = val; } function setOnlyWhitelisted(bool _state) public onlyOwner { onlyWhitelisted = _state; } function whitelistUsers(address[] calldata _users) public onlyOwner { delete whitelistedAddresses; whitelistedAddresses = _users; } function mintReserved(uint256 _amount) public onlyOwner { require( _amount <= reserved, "Can't reserve more than set amount" ); reserved -= _amount; uint256 supply = totalSupply(); for(uint256 i; i < _amount; i++){ _safeMint( msg.sender, supply + i ); } } function withdraw() public payable onlyOwner { (bool dc, ) = payable(owner()).call{value: address(this).balance}(""); require(dc); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","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":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"checkWhiteList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhitelistSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"setPublicSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"setWhiteListSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","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":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60c06040526005608081905264173539b7b760d91b60a09081526200002891600c919062000241565b506000600e55611388600f556005601055609660115560016012556013805463ffffffff191663010000001790553480156200006357600080fd5b5060405162003140380380620031408339810160408190526200008691620003b4565b604080518082018252600c81526b5261696e626f77204361747360a01b602080830191825283518085019094526005845264524341545360d81b908401528151919291620000d79160009162000241565b508051620000ed90600190602084019062000241565b5050506200010a620001046200012860201b60201c565b6200012c565b62000115826200017e565b6200012081620001e6565b50506200045b565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a546001600160a01b03163314620001cd5760405162461bcd60e51b815260206004820181905260248201526000805160206200312083398151915260448201526064015b60405180910390fd5b8051620001e290600b90602084019062000241565b5050565b600a546001600160a01b03163314620002315760405162461bcd60e51b81526020600482018190526024820152600080516020620031208339815191526044820152606401620001c4565b8051620001e290600d9060208401905b8280546200024f906200041e565b90600052602060002090601f016020900481019282620002735760008555620002be565b82601f106200028e57805160ff1916838001178555620002be565b82800160010185558215620002be579182015b82811115620002be578251825591602001919060010190620002a1565b50620002cc929150620002d0565b5090565b5b80821115620002cc5760008155600101620002d1565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200030f57600080fd5b81516001600160401b03808211156200032c576200032c620002e7565b604051601f8301601f19908116603f01168101908282118183101715620003575762000357620002e7565b816040528381526020925086838588010111156200037457600080fd5b600091505b8382101562000398578582018301518183018401529082019062000379565b83821115620003aa5760008385830101525b9695505050505050565b60008060408385031215620003c857600080fd5b82516001600160401b0380821115620003e057600080fd5b620003ee86838701620002fd565b935060208501519150808211156200040557600080fd5b506200041485828601620002fd565b9150509250929050565b600181811c908216806200043357607f821691505b602082108114156200045557634e487b7160e01b600052602260045260246000fd5b50919050565b612cb5806200046b6000396000f3fe6080604052600436106102e45760003560e01c80637f00c7a611610190578063ba7d2c76116100dc578063da3ef23f11610095578063f2c4ce1e1161006f578063f2c4ce1e146108bf578063f2fde38b146108df578063f759867a146108ff578063fe60d12c1461091257600080fd5b8063da3ef23f14610836578063e985e9c514610856578063edec5f271461089f57600080fd5b8063ba7d2c7614610795578063c6682862146107ab578063c87b56dd146107c0578063d0eb26b0146107e0578063d55690cc14610800578063d5abeb011461082057600080fd5b8063a0712d6811610149578063b423fe6711610123578063b423fe6714610716578063b88d4fde14610736578063b98451cf14610756578063ba4e5c491461077557600080fd5b8063a0712d68146106ce578063a22cb465146106e1578063a475b5dd1461070157600080fd5b80637f00c7a6146106045780638da5cb5b1461062457806395d89b41146106425780639a5d140b146106575780639c70b512146106775780639cce37c61461069857600080fd5b80633af32abf1161024f5780634f6ccce7116102085780636352211e116101e25780636352211e1461059a5780636c0360eb146105ba57806370a08231146105cf578063715018a6146105ef57600080fd5b80634f6ccce71461053a578063518302271461055a57806355f804b31461057a57600080fd5b80633af32abf146104855780633c952764146104a55780633ccfd60b146104c557806342842e0e146104cd578063438b6300146104ed57806344a0d68a1461051a57600080fd5b806318160ddd116102a157806318160ddd146103d357806318cae269146103e85780631e84c41314610415578063239c70ae1461042f57806323b872dd146104455780632f745c591461046557600080fd5b806301ffc9a7146102e957806306fdde031461031e578063081812fc14610340578063081c8c4414610378578063095ea7b31461038d57806313faede6146103af575b600080fd5b3480156102f557600080fd5b50610309610304366004612595565b610928565b60405190151581526020015b60405180910390f35b34801561032a57600080fd5b50610333610953565b604051610315919061260a565b34801561034c57600080fd5b5061036061035b36600461261d565b6109e5565b6040516001600160a01b039091168152602001610315565b34801561038457600080fd5b50610333610a7f565b34801561039957600080fd5b506103ad6103a8366004612652565b610b0d565b005b3480156103bb57600080fd5b506103c5600e5481565b604051908152602001610315565b3480156103df57600080fd5b506008546103c5565b3480156103f457600080fd5b506103c561040336600461267c565b60156020526000908152604090205481565b34801561042157600080fd5b506013546103099060ff1681565b34801561043b57600080fd5b506103c560105481565b34801561045157600080fd5b506103ad610460366004612697565b610c23565b34801561047157600080fd5b506103c5610480366004612652565b610c54565b34801561049157600080fd5b506103096104a036600461267c565b610cea565b3480156104b157600080fd5b506103ad6104c03660046126e3565b610d54565b6103ad610d9c565b3480156104d957600080fd5b506103ad6104e8366004612697565b610e3a565b3480156104f957600080fd5b5061050d61050836600461267c565b610e55565b60405161031591906126fe565b34801561052657600080fd5b506103ad61053536600461261d565b610ef7565b34801561054657600080fd5b506103c561055536600461261d565b610f26565b34801561056657600080fd5b506013546103099062010000900460ff1681565b34801561058657600080fd5b506103ad6105953660046127ce565b610fb9565b3480156105a657600080fd5b506103606105b536600461261d565b610ffa565b3480156105c657600080fd5b50610333611071565b3480156105db57600080fd5b506103c56105ea36600461267c565b61107e565b3480156105fb57600080fd5b506103ad611105565b34801561061057600080fd5b506103ad61061f36600461261d565b61113b565b34801561063057600080fd5b50600a546001600160a01b0316610360565b34801561064e57600080fd5b5061033361116a565b34801561066357600080fd5b506103ad61067236600461261d565b611179565b34801561068357600080fd5b50601354610309906301000000900460ff1681565b3480156106a457600080fd5b506103c56106b336600461267c565b6001600160a01b031660009081526015602052604090205490565b6103ad6106dc36600461261d565b61124a565b3480156106ed57600080fd5b506103ad6106fc366004612817565b6113ec565b34801561070d57600080fd5b506103ad6114b1565b34801561072257600080fd5b506103ad6107313660046126e3565b6114ee565b34801561074257600080fd5b506103ad61075136600461284a565b61152b565b34801561076257600080fd5b5060135461030990610100900460ff1681565b34801561078157600080fd5b5061036061079036600461261d565b611563565b3480156107a157600080fd5b506103c560125481565b3480156107b757600080fd5b5061033361158d565b3480156107cc57600080fd5b506103336107db36600461261d565b61159a565b3480156107ec57600080fd5b506103ad6107fb36600461261d565b61171a565b34801561080c57600080fd5b506103ad61081b3660046126e3565b611749565b34801561082c57600080fd5b506103c5600f5481565b34801561084257600080fd5b506103ad6108513660046127ce565b61178d565b34801561086257600080fd5b506103096108713660046128c6565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108ab57600080fd5b506103ad6108ba3660046128f0565b6117ca565b3480156108cb57600080fd5b506103ad6108da3660046127ce565b61180c565b3480156108eb57600080fd5b506103ad6108fa36600461267c565b611849565b6103ad61090d36600461261d565b6118e1565b34801561091e57600080fd5b506103c560115481565b60006001600160e01b0319821663780e9d6360e01b148061094d575061094d82611aa2565b92915050565b60606000805461096290612965565b80601f016020809104026020016040519081016040528092919081815260200182805461098e90612965565b80156109db5780601f106109b0576101008083540402835291602001916109db565b820191906000526020600020905b8154815290600101906020018083116109be57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610a635760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600d8054610a8c90612965565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab890612965565b8015610b055780601f10610ada57610100808354040283529160200191610b05565b820191906000526020600020905b815481529060010190602001808311610ae857829003601f168201915b505050505081565b6000610b1882610ffa565b9050806001600160a01b0316836001600160a01b03161415610b865760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a5a565b336001600160a01b0382161480610ba25750610ba28133610871565b610c145760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a5a565b610c1e8383611af2565b505050565b610c2d3382611b60565b610c495760405162461bcd60e51b8152600401610a5a906129a0565b610c1e838383611c57565b6000610c5f8361107e565b8210610cc15760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610a5a565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000805b601454811015610d4b57826001600160a01b031660148281548110610d1557610d156129f1565b6000918252602090912001546001600160a01b03161415610d395750600192915050565b80610d4381612a1d565b915050610cee565b50600092915050565b600a546001600160a01b03163314610d7e5760405162461bcd60e51b8152600401610a5a90612a38565b6013805491151563010000000263ff00000019909216919091179055565b600a546001600160a01b03163314610dc65760405162461bcd60e51b8152600401610a5a90612a38565b6000610dda600a546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610e24576040519150601f19603f3d011682016040523d82523d6000602084013e610e29565b606091505b5050905080610e3757600080fd5b50565b610c1e8383836040518060200160405280600081525061152b565b60606000610e628361107e565b905060008167ffffffffffffffff811115610e7f57610e7f612742565b604051908082528060200260200182016040528015610ea8578160200160208202803683370190505b50905060005b82811015610eef57610ec08582610c54565b828281518110610ed257610ed26129f1565b602090810291909101015280610ee781612a1d565b915050610eae565b509392505050565b600a546001600160a01b03163314610f215760405162461bcd60e51b8152600401610a5a90612a38565b600e55565b6000610f3160085490565b8210610f945760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610a5a565b60088281548110610fa757610fa76129f1565b90600052602060002001549050919050565b600a546001600160a01b03163314610fe35760405162461bcd60e51b8152600401610a5a90612a38565b8051610ff690600b906020840190612475565b5050565b6000818152600260205260408120546001600160a01b03168061094d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610a5a565b600b8054610a8c90612965565b60006001600160a01b0382166110e95760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610a5a565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b0316331461112f5760405162461bcd60e51b8152600401610a5a90612a38565b6111396000611e02565b565b600a546001600160a01b031633146111655760405162461bcd60e51b8152600401610a5a90612a38565b601055565b60606001805461096290612965565b600a546001600160a01b031633146111a35760405162461bcd60e51b8152600401610a5a90612a38565b6011548111156112005760405162461bcd60e51b815260206004820152602260248201527f43616e27742072657365727665206d6f7265207468616e2073657420616d6f756044820152611b9d60f21b6064820152608401610a5a565b80601160008282546112129190612a6d565b909155505060085460005b82811015610c1e57611238336112338385612a84565b611e54565b8061124281612a1d565b91505061121d565b60135460ff166112925760405162461bcd60e51b815260206004820152601360248201527213585a5b8814d85b19481a5cc814185d5cd959606a1b6044820152606401610a5a565b600061129d60085490565b9050600082116112ef5760405162461bcd60e51b815260206004820152601b60248201527f6e65656420746f206d696e74206174206c656173742031204e465400000000006044820152606401610a5a565b60105482111561134d5760405162461bcd60e51b8152602060048201526024808201527f6d6178206d696e7420616d6f756e74207065722073657373696f6e20657863656044820152631959195960e21b6064820152608401610a5a565b600f5461135a8383612a84565b11156113a15760405162461bcd60e51b81526020600482015260166024820152751b585e08139195081b1a5b5a5d08195e18d95959195960521b6044820152606401610a5a565b60015b828111610c1e573360009081526015602052604081208054916113c683612a1d565b909155506113da9050336112338385612a84565b806113e481612a1d565b9150506113a4565b6001600160a01b0382163314156114455760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a5a565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146114db5760405162461bcd60e51b8152600401610a5a90612a38565b6013805462ff0000191662010000179055565b600a546001600160a01b031633146115185760405162461bcd60e51b8152600401610a5a90612a38565b6013805460ff1916911515919091179055565b6115353383611b60565b6115515760405162461bcd60e51b8152600401610a5a906129a0565b61155d84848484611e6e565b50505050565b6014818154811061157357600080fd5b6000918252602090912001546001600160a01b0316905081565b600c8054610a8c90612965565b6000818152600260205260409020546060906001600160a01b03166116195760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a5a565b60135462010000900460ff166116bb57600d805461163690612965565b80601f016020809104026020016040519081016040528092919081815260200182805461166290612965565b80156116af5780601f10611684576101008083540402835291602001916116af565b820191906000526020600020905b81548152906001019060200180831161169257829003601f168201915b50505050509050919050565b60006116c5611ea1565b905060008151116116e55760405180602001604052806000815250611713565b806116ef84611eb0565b600c60405160200161170393929190612a9c565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146117445760405162461bcd60e51b8152600401610a5a90612a38565b601255565b600a546001600160a01b031633146117735760405162461bcd60e51b8152600401610a5a90612a38565b601380549115156101000261ff0019909216919091179055565b600a546001600160a01b031633146117b75760405162461bcd60e51b8152600401610a5a90612a38565b8051610ff690600c906020840190612475565b600a546001600160a01b031633146117f45760405162461bcd60e51b8152600401610a5a90612a38565b611800601460006124f9565b610c1e60148383612517565b600a546001600160a01b031633146118365760405162461bcd60e51b8152600401610a5a90612a38565b8051610ff690600d906020840190612475565b600a546001600160a01b031633146118735760405162461bcd60e51b8152600401610a5a90612a38565b6001600160a01b0381166118d85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a5a565b610e3781611e02565b601354610100900460ff166119385760405162461bcd60e51b815260206004820181905260248201527f57686974656c6973742073616c65206973207374696c6c20696e6163746976656044820152606401610a5a565b600061194360085490565b905061194e33610cea565b61199a5760405162461bcd60e51b815260206004820152601760248201527f75736572206973206e6f742077686974656c69737465640000000000000000006044820152606401610a5a565b336000908152601560205260409020546012546119b78483612a84565b1115611a055760405162461bcd60e51b815260206004820152601c60248201527f6d6178204e4654207065722061646472657373206578636565646564000000006044820152606401610a5a565b82600e54611a139190612b60565b341015611a575760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610a5a565b60015b83811161155d57336000908152601560205260408120805491611a7c83612a1d565b90915550611a909050336112338386612a84565b80611a9a81612a1d565b915050611a5a565b60006001600160e01b031982166380ac58cd60e01b1480611ad357506001600160e01b03198216635b5e139f60e01b145b8061094d57506301ffc9a760e01b6001600160e01b031983161461094d565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611b2782610ffa565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611bd95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a5a565b6000611be483610ffa565b9050806001600160a01b0316846001600160a01b03161480611c1f5750836001600160a01b0316611c14846109e5565b6001600160a01b0316145b80611c4f57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611c6a82610ffa565b6001600160a01b031614611cd25760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610a5a565b6001600160a01b038216611d345760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a5a565b611d3f838383611fae565b611d4a600082611af2565b6001600160a01b0383166000908152600360205260408120805460019290611d73908490612a6d565b90915550506001600160a01b0382166000908152600360205260408120805460019290611da1908490612a84565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610ff6828260405180602001604052806000815250612066565b611e79848484611c57565b611e8584848484612099565b61155d5760405162461bcd60e51b8152600401610a5a90612b7f565b6060600b805461096290612965565b606081611ed45750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611efe5780611ee881612a1d565b9150611ef79050600a83612be7565b9150611ed8565b60008167ffffffffffffffff811115611f1957611f19612742565b6040519080825280601f01601f191660200182016040528015611f43576020820181803683370190505b5090505b8415611c4f57611f58600183612a6d565b9150611f65600a86612bfb565b611f70906030612a84565b60f81b818381518110611f8557611f856129f1565b60200101906001600160f81b031916908160001a905350611fa7600a86612be7565b9450611f47565b6001600160a01b0383166120095761200481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61202c565b816001600160a01b0316836001600160a01b03161461202c5761202c8382612197565b6001600160a01b03821661204357610c1e81612234565b826001600160a01b0316826001600160a01b031614610c1e57610c1e82826122e3565b6120708383612327565b61207d6000848484612099565b610c1e5760405162461bcd60e51b8152600401610a5a90612b7f565b60006001600160a01b0384163b1561218c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906120dd903390899088908890600401612c0f565b6020604051808303816000875af1925050508015612118575060408051601f3d908101601f1916820190925261211591810190612c4c565b60015b612172573d808015612146576040519150601f19603f3d011682016040523d82523d6000602084013e61214b565b606091505b50805161216a5760405162461bcd60e51b8152600401610a5a90612b7f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c4f565b506001949350505050565b600060016121a48461107e565b6121ae9190612a6d565b600083815260076020526040902054909150808214612201576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061224690600190612a6d565b6000838152600960205260408120546008805493945090928490811061226e5761226e6129f1565b90600052602060002001549050806008838154811061228f5761228f6129f1565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806122c7576122c7612c69565b6001900381819060005260206000200160009055905550505050565b60006122ee8361107e565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821661237d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a5a565b6000818152600260205260409020546001600160a01b0316156123e25760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a5a565b6123ee60008383611fae565b6001600160a01b0382166000908152600360205260408120805460019290612417908490612a84565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461248190612965565b90600052602060002090601f0160209004810192826124a357600085556124e9565b82601f106124bc57805160ff19168380011785556124e9565b828001600101855582156124e9579182015b828111156124e95782518255916020019190600101906124ce565b506124f592915061256a565b5090565b5080546000825590600052602060002090810190610e37919061256a565b8280548282559060005260206000209081019282156124e9579160200282015b828111156124e95781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612537565b5b808211156124f5576000815560010161256b565b6001600160e01b031981168114610e3757600080fd5b6000602082840312156125a757600080fd5b81356117138161257f565b60005b838110156125cd5781810151838201526020016125b5565b8381111561155d5750506000910152565b600081518084526125f68160208601602086016125b2565b601f01601f19169290920160200192915050565b60208152600061171360208301846125de565b60006020828403121561262f57600080fd5b5035919050565b80356001600160a01b038116811461264d57600080fd5b919050565b6000806040838503121561266557600080fd5b61266e83612636565b946020939093013593505050565b60006020828403121561268e57600080fd5b61171382612636565b6000806000606084860312156126ac57600080fd5b6126b584612636565b92506126c360208501612636565b9150604084013590509250925092565b8035801515811461264d57600080fd5b6000602082840312156126f557600080fd5b611713826126d3565b6020808252825182820181905260009190848201906040850190845b818110156127365783518352928401929184019160010161271a565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561277357612773612742565b604051601f8501601f19908116603f0116810190828211818310171561279b5761279b612742565b816040528093508581528686860111156127b457600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156127e057600080fd5b813567ffffffffffffffff8111156127f757600080fd5b8201601f8101841361280857600080fd5b611c4f84823560208401612758565b6000806040838503121561282a57600080fd5b61283383612636565b9150612841602084016126d3565b90509250929050565b6000806000806080858703121561286057600080fd5b61286985612636565b935061287760208601612636565b925060408501359150606085013567ffffffffffffffff81111561289a57600080fd5b8501601f810187136128ab57600080fd5b6128ba87823560208401612758565b91505092959194509250565b600080604083850312156128d957600080fd5b6128e283612636565b915061284160208401612636565b6000806020838503121561290357600080fd5b823567ffffffffffffffff8082111561291b57600080fd5b818501915085601f83011261292f57600080fd5b81358181111561293e57600080fd5b8660208260051b850101111561295357600080fd5b60209290920196919550909350505050565b600181811c9082168061297957607f821691505b6020821081141561299a57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612a3157612a31612a07565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082821015612a7f57612a7f612a07565b500390565b60008219821115612a9757612a97612a07565b500190565b600084516020612aaf8285838a016125b2565b855191840191612ac28184848a016125b2565b8554920191600090600181811c9080831680612adf57607f831692505b858310811415612afd57634e487b7160e01b85526022600452602485fd5b808015612b115760018114612b2257612b4f565b60ff19851688528388019550612b4f565b60008b81526020902060005b85811015612b475781548a820152908401908801612b2e565b505083880195505b50939b9a5050505050505050505050565b6000816000190483118215151615612b7a57612b7a612a07565b500290565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612bf657612bf6612bd1565b500490565b600082612c0a57612c0a612bd1565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612c42908301846125de565b9695505050505050565b600060208284031215612c5e57600080fd5b81516117138161257f565b634e487b7160e01b600052603160045260246000fdfea264697066735822122033c8c043ef49f5309f2be77dfd39cdc877bea1bd3c292fd0f445355c94dbe68564736f6c634300080b00334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d635772463855677866386e653534636745666954354d51326179464a3775394c634d534372474d52614367792f000000000000000000000000000000000000000000000000000000000000000000000000000000000043697066733a2f2f516d516d324a53694a53476242705571575131554b4848317a524356736f53796a5032597744456e65524c576e622f4d657461646174612e6a736f6e0000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102e45760003560e01c80637f00c7a611610190578063ba7d2c76116100dc578063da3ef23f11610095578063f2c4ce1e1161006f578063f2c4ce1e146108bf578063f2fde38b146108df578063f759867a146108ff578063fe60d12c1461091257600080fd5b8063da3ef23f14610836578063e985e9c514610856578063edec5f271461089f57600080fd5b8063ba7d2c7614610795578063c6682862146107ab578063c87b56dd146107c0578063d0eb26b0146107e0578063d55690cc14610800578063d5abeb011461082057600080fd5b8063a0712d6811610149578063b423fe6711610123578063b423fe6714610716578063b88d4fde14610736578063b98451cf14610756578063ba4e5c491461077557600080fd5b8063a0712d68146106ce578063a22cb465146106e1578063a475b5dd1461070157600080fd5b80637f00c7a6146106045780638da5cb5b1461062457806395d89b41146106425780639a5d140b146106575780639c70b512146106775780639cce37c61461069857600080fd5b80633af32abf1161024f5780634f6ccce7116102085780636352211e116101e25780636352211e1461059a5780636c0360eb146105ba57806370a08231146105cf578063715018a6146105ef57600080fd5b80634f6ccce71461053a578063518302271461055a57806355f804b31461057a57600080fd5b80633af32abf146104855780633c952764146104a55780633ccfd60b146104c557806342842e0e146104cd578063438b6300146104ed57806344a0d68a1461051a57600080fd5b806318160ddd116102a157806318160ddd146103d357806318cae269146103e85780631e84c41314610415578063239c70ae1461042f57806323b872dd146104455780632f745c591461046557600080fd5b806301ffc9a7146102e957806306fdde031461031e578063081812fc14610340578063081c8c4414610378578063095ea7b31461038d57806313faede6146103af575b600080fd5b3480156102f557600080fd5b50610309610304366004612595565b610928565b60405190151581526020015b60405180910390f35b34801561032a57600080fd5b50610333610953565b604051610315919061260a565b34801561034c57600080fd5b5061036061035b36600461261d565b6109e5565b6040516001600160a01b039091168152602001610315565b34801561038457600080fd5b50610333610a7f565b34801561039957600080fd5b506103ad6103a8366004612652565b610b0d565b005b3480156103bb57600080fd5b506103c5600e5481565b604051908152602001610315565b3480156103df57600080fd5b506008546103c5565b3480156103f457600080fd5b506103c561040336600461267c565b60156020526000908152604090205481565b34801561042157600080fd5b506013546103099060ff1681565b34801561043b57600080fd5b506103c560105481565b34801561045157600080fd5b506103ad610460366004612697565b610c23565b34801561047157600080fd5b506103c5610480366004612652565b610c54565b34801561049157600080fd5b506103096104a036600461267c565b610cea565b3480156104b157600080fd5b506103ad6104c03660046126e3565b610d54565b6103ad610d9c565b3480156104d957600080fd5b506103ad6104e8366004612697565b610e3a565b3480156104f957600080fd5b5061050d61050836600461267c565b610e55565b60405161031591906126fe565b34801561052657600080fd5b506103ad61053536600461261d565b610ef7565b34801561054657600080fd5b506103c561055536600461261d565b610f26565b34801561056657600080fd5b506013546103099062010000900460ff1681565b34801561058657600080fd5b506103ad6105953660046127ce565b610fb9565b3480156105a657600080fd5b506103606105b536600461261d565b610ffa565b3480156105c657600080fd5b50610333611071565b3480156105db57600080fd5b506103c56105ea36600461267c565b61107e565b3480156105fb57600080fd5b506103ad611105565b34801561061057600080fd5b506103ad61061f36600461261d565b61113b565b34801561063057600080fd5b50600a546001600160a01b0316610360565b34801561064e57600080fd5b5061033361116a565b34801561066357600080fd5b506103ad61067236600461261d565b611179565b34801561068357600080fd5b50601354610309906301000000900460ff1681565b3480156106a457600080fd5b506103c56106b336600461267c565b6001600160a01b031660009081526015602052604090205490565b6103ad6106dc36600461261d565b61124a565b3480156106ed57600080fd5b506103ad6106fc366004612817565b6113ec565b34801561070d57600080fd5b506103ad6114b1565b34801561072257600080fd5b506103ad6107313660046126e3565b6114ee565b34801561074257600080fd5b506103ad61075136600461284a565b61152b565b34801561076257600080fd5b5060135461030990610100900460ff1681565b34801561078157600080fd5b5061036061079036600461261d565b611563565b3480156107a157600080fd5b506103c560125481565b3480156107b757600080fd5b5061033361158d565b3480156107cc57600080fd5b506103336107db36600461261d565b61159a565b3480156107ec57600080fd5b506103ad6107fb36600461261d565b61171a565b34801561080c57600080fd5b506103ad61081b3660046126e3565b611749565b34801561082c57600080fd5b506103c5600f5481565b34801561084257600080fd5b506103ad6108513660046127ce565b61178d565b34801561086257600080fd5b506103096108713660046128c6565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108ab57600080fd5b506103ad6108ba3660046128f0565b6117ca565b3480156108cb57600080fd5b506103ad6108da3660046127ce565b61180c565b3480156108eb57600080fd5b506103ad6108fa36600461267c565b611849565b6103ad61090d36600461261d565b6118e1565b34801561091e57600080fd5b506103c560115481565b60006001600160e01b0319821663780e9d6360e01b148061094d575061094d82611aa2565b92915050565b60606000805461096290612965565b80601f016020809104026020016040519081016040528092919081815260200182805461098e90612965565b80156109db5780601f106109b0576101008083540402835291602001916109db565b820191906000526020600020905b8154815290600101906020018083116109be57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610a635760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600d8054610a8c90612965565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab890612965565b8015610b055780601f10610ada57610100808354040283529160200191610b05565b820191906000526020600020905b815481529060010190602001808311610ae857829003601f168201915b505050505081565b6000610b1882610ffa565b9050806001600160a01b0316836001600160a01b03161415610b865760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a5a565b336001600160a01b0382161480610ba25750610ba28133610871565b610c145760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a5a565b610c1e8383611af2565b505050565b610c2d3382611b60565b610c495760405162461bcd60e51b8152600401610a5a906129a0565b610c1e838383611c57565b6000610c5f8361107e565b8210610cc15760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610a5a565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000805b601454811015610d4b57826001600160a01b031660148281548110610d1557610d156129f1565b6000918252602090912001546001600160a01b03161415610d395750600192915050565b80610d4381612a1d565b915050610cee565b50600092915050565b600a546001600160a01b03163314610d7e5760405162461bcd60e51b8152600401610a5a90612a38565b6013805491151563010000000263ff00000019909216919091179055565b600a546001600160a01b03163314610dc65760405162461bcd60e51b8152600401610a5a90612a38565b6000610dda600a546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610e24576040519150601f19603f3d011682016040523d82523d6000602084013e610e29565b606091505b5050905080610e3757600080fd5b50565b610c1e8383836040518060200160405280600081525061152b565b60606000610e628361107e565b905060008167ffffffffffffffff811115610e7f57610e7f612742565b604051908082528060200260200182016040528015610ea8578160200160208202803683370190505b50905060005b82811015610eef57610ec08582610c54565b828281518110610ed257610ed26129f1565b602090810291909101015280610ee781612a1d565b915050610eae565b509392505050565b600a546001600160a01b03163314610f215760405162461bcd60e51b8152600401610a5a90612a38565b600e55565b6000610f3160085490565b8210610f945760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610a5a565b60088281548110610fa757610fa76129f1565b90600052602060002001549050919050565b600a546001600160a01b03163314610fe35760405162461bcd60e51b8152600401610a5a90612a38565b8051610ff690600b906020840190612475565b5050565b6000818152600260205260408120546001600160a01b03168061094d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610a5a565b600b8054610a8c90612965565b60006001600160a01b0382166110e95760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610a5a565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b0316331461112f5760405162461bcd60e51b8152600401610a5a90612a38565b6111396000611e02565b565b600a546001600160a01b031633146111655760405162461bcd60e51b8152600401610a5a90612a38565b601055565b60606001805461096290612965565b600a546001600160a01b031633146111a35760405162461bcd60e51b8152600401610a5a90612a38565b6011548111156112005760405162461bcd60e51b815260206004820152602260248201527f43616e27742072657365727665206d6f7265207468616e2073657420616d6f756044820152611b9d60f21b6064820152608401610a5a565b80601160008282546112129190612a6d565b909155505060085460005b82811015610c1e57611238336112338385612a84565b611e54565b8061124281612a1d565b91505061121d565b60135460ff166112925760405162461bcd60e51b815260206004820152601360248201527213585a5b8814d85b19481a5cc814185d5cd959606a1b6044820152606401610a5a565b600061129d60085490565b9050600082116112ef5760405162461bcd60e51b815260206004820152601b60248201527f6e65656420746f206d696e74206174206c656173742031204e465400000000006044820152606401610a5a565b60105482111561134d5760405162461bcd60e51b8152602060048201526024808201527f6d6178206d696e7420616d6f756e74207065722073657373696f6e20657863656044820152631959195960e21b6064820152608401610a5a565b600f5461135a8383612a84565b11156113a15760405162461bcd60e51b81526020600482015260166024820152751b585e08139195081b1a5b5a5d08195e18d95959195960521b6044820152606401610a5a565b60015b828111610c1e573360009081526015602052604081208054916113c683612a1d565b909155506113da9050336112338385612a84565b806113e481612a1d565b9150506113a4565b6001600160a01b0382163314156114455760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a5a565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146114db5760405162461bcd60e51b8152600401610a5a90612a38565b6013805462ff0000191662010000179055565b600a546001600160a01b031633146115185760405162461bcd60e51b8152600401610a5a90612a38565b6013805460ff1916911515919091179055565b6115353383611b60565b6115515760405162461bcd60e51b8152600401610a5a906129a0565b61155d84848484611e6e565b50505050565b6014818154811061157357600080fd5b6000918252602090912001546001600160a01b0316905081565b600c8054610a8c90612965565b6000818152600260205260409020546060906001600160a01b03166116195760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a5a565b60135462010000900460ff166116bb57600d805461163690612965565b80601f016020809104026020016040519081016040528092919081815260200182805461166290612965565b80156116af5780601f10611684576101008083540402835291602001916116af565b820191906000526020600020905b81548152906001019060200180831161169257829003601f168201915b50505050509050919050565b60006116c5611ea1565b905060008151116116e55760405180602001604052806000815250611713565b806116ef84611eb0565b600c60405160200161170393929190612a9c565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146117445760405162461bcd60e51b8152600401610a5a90612a38565b601255565b600a546001600160a01b031633146117735760405162461bcd60e51b8152600401610a5a90612a38565b601380549115156101000261ff0019909216919091179055565b600a546001600160a01b031633146117b75760405162461bcd60e51b8152600401610a5a90612a38565b8051610ff690600c906020840190612475565b600a546001600160a01b031633146117f45760405162461bcd60e51b8152600401610a5a90612a38565b611800601460006124f9565b610c1e60148383612517565b600a546001600160a01b031633146118365760405162461bcd60e51b8152600401610a5a90612a38565b8051610ff690600d906020840190612475565b600a546001600160a01b031633146118735760405162461bcd60e51b8152600401610a5a90612a38565b6001600160a01b0381166118d85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a5a565b610e3781611e02565b601354610100900460ff166119385760405162461bcd60e51b815260206004820181905260248201527f57686974656c6973742073616c65206973207374696c6c20696e6163746976656044820152606401610a5a565b600061194360085490565b905061194e33610cea565b61199a5760405162461bcd60e51b815260206004820152601760248201527f75736572206973206e6f742077686974656c69737465640000000000000000006044820152606401610a5a565b336000908152601560205260409020546012546119b78483612a84565b1115611a055760405162461bcd60e51b815260206004820152601c60248201527f6d6178204e4654207065722061646472657373206578636565646564000000006044820152606401610a5a565b82600e54611a139190612b60565b341015611a575760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610a5a565b60015b83811161155d57336000908152601560205260408120805491611a7c83612a1d565b90915550611a909050336112338386612a84565b80611a9a81612a1d565b915050611a5a565b60006001600160e01b031982166380ac58cd60e01b1480611ad357506001600160e01b03198216635b5e139f60e01b145b8061094d57506301ffc9a760e01b6001600160e01b031983161461094d565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611b2782610ffa565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611bd95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a5a565b6000611be483610ffa565b9050806001600160a01b0316846001600160a01b03161480611c1f5750836001600160a01b0316611c14846109e5565b6001600160a01b0316145b80611c4f57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611c6a82610ffa565b6001600160a01b031614611cd25760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610a5a565b6001600160a01b038216611d345760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a5a565b611d3f838383611fae565b611d4a600082611af2565b6001600160a01b0383166000908152600360205260408120805460019290611d73908490612a6d565b90915550506001600160a01b0382166000908152600360205260408120805460019290611da1908490612a84565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610ff6828260405180602001604052806000815250612066565b611e79848484611c57565b611e8584848484612099565b61155d5760405162461bcd60e51b8152600401610a5a90612b7f565b6060600b805461096290612965565b606081611ed45750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611efe5780611ee881612a1d565b9150611ef79050600a83612be7565b9150611ed8565b60008167ffffffffffffffff811115611f1957611f19612742565b6040519080825280601f01601f191660200182016040528015611f43576020820181803683370190505b5090505b8415611c4f57611f58600183612a6d565b9150611f65600a86612bfb565b611f70906030612a84565b60f81b818381518110611f8557611f856129f1565b60200101906001600160f81b031916908160001a905350611fa7600a86612be7565b9450611f47565b6001600160a01b0383166120095761200481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61202c565b816001600160a01b0316836001600160a01b03161461202c5761202c8382612197565b6001600160a01b03821661204357610c1e81612234565b826001600160a01b0316826001600160a01b031614610c1e57610c1e82826122e3565b6120708383612327565b61207d6000848484612099565b610c1e5760405162461bcd60e51b8152600401610a5a90612b7f565b60006001600160a01b0384163b1561218c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906120dd903390899088908890600401612c0f565b6020604051808303816000875af1925050508015612118575060408051601f3d908101601f1916820190925261211591810190612c4c565b60015b612172573d808015612146576040519150601f19603f3d011682016040523d82523d6000602084013e61214b565b606091505b50805161216a5760405162461bcd60e51b8152600401610a5a90612b7f565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c4f565b506001949350505050565b600060016121a48461107e565b6121ae9190612a6d565b600083815260076020526040902054909150808214612201576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061224690600190612a6d565b6000838152600960205260408120546008805493945090928490811061226e5761226e6129f1565b90600052602060002001549050806008838154811061228f5761228f6129f1565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806122c7576122c7612c69565b6001900381819060005260206000200160009055905550505050565b60006122ee8361107e565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821661237d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a5a565b6000818152600260205260409020546001600160a01b0316156123e25760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a5a565b6123ee60008383611fae565b6001600160a01b0382166000908152600360205260408120805460019290612417908490612a84565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461248190612965565b90600052602060002090601f0160209004810192826124a357600085556124e9565b82601f106124bc57805160ff19168380011785556124e9565b828001600101855582156124e9579182015b828111156124e95782518255916020019190600101906124ce565b506124f592915061256a565b5090565b5080546000825590600052602060002090810190610e37919061256a565b8280548282559060005260206000209081019282156124e9579160200282015b828111156124e95781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612537565b5b808211156124f5576000815560010161256b565b6001600160e01b031981168114610e3757600080fd5b6000602082840312156125a757600080fd5b81356117138161257f565b60005b838110156125cd5781810151838201526020016125b5565b8381111561155d5750506000910152565b600081518084526125f68160208601602086016125b2565b601f01601f19169290920160200192915050565b60208152600061171360208301846125de565b60006020828403121561262f57600080fd5b5035919050565b80356001600160a01b038116811461264d57600080fd5b919050565b6000806040838503121561266557600080fd5b61266e83612636565b946020939093013593505050565b60006020828403121561268e57600080fd5b61171382612636565b6000806000606084860312156126ac57600080fd5b6126b584612636565b92506126c360208501612636565b9150604084013590509250925092565b8035801515811461264d57600080fd5b6000602082840312156126f557600080fd5b611713826126d3565b6020808252825182820181905260009190848201906040850190845b818110156127365783518352928401929184019160010161271a565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561277357612773612742565b604051601f8501601f19908116603f0116810190828211818310171561279b5761279b612742565b816040528093508581528686860111156127b457600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156127e057600080fd5b813567ffffffffffffffff8111156127f757600080fd5b8201601f8101841361280857600080fd5b611c4f84823560208401612758565b6000806040838503121561282a57600080fd5b61283383612636565b9150612841602084016126d3565b90509250929050565b6000806000806080858703121561286057600080fd5b61286985612636565b935061287760208601612636565b925060408501359150606085013567ffffffffffffffff81111561289a57600080fd5b8501601f810187136128ab57600080fd5b6128ba87823560208401612758565b91505092959194509250565b600080604083850312156128d957600080fd5b6128e283612636565b915061284160208401612636565b6000806020838503121561290357600080fd5b823567ffffffffffffffff8082111561291b57600080fd5b818501915085601f83011261292f57600080fd5b81358181111561293e57600080fd5b8660208260051b850101111561295357600080fd5b60209290920196919550909350505050565b600181811c9082168061297957607f821691505b6020821081141561299a57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415612a3157612a31612a07565b5060010190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082821015612a7f57612a7f612a07565b500390565b60008219821115612a9757612a97612a07565b500190565b600084516020612aaf8285838a016125b2565b855191840191612ac28184848a016125b2565b8554920191600090600181811c9080831680612adf57607f831692505b858310811415612afd57634e487b7160e01b85526022600452602485fd5b808015612b115760018114612b2257612b4f565b60ff19851688528388019550612b4f565b60008b81526020902060005b85811015612b475781548a820152908401908801612b2e565b505083880195505b50939b9a5050505050505050505050565b6000816000190483118215151615612b7a57612b7a612a07565b500290565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612bf657612bf6612bd1565b500490565b600082612c0a57612c0a612bd1565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612c42908301846125de565b9695505050505050565b600060208284031215612c5e57600080fd5b81516117138161257f565b634e487b7160e01b600052603160045260246000fdfea264697066735822122033c8c043ef49f5309f2be77dfd39cdc877bea1bd3c292fd0f445355c94dbe68564736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d635772463855677866386e653534636745666954354d51326179464a3775394c634d534372474d52614367792f000000000000000000000000000000000000000000000000000000000000000000000000000000000043697066733a2f2f516d516d324a53694a53476242705571575131554b4848317a524356736f53796a5032597744456e65524c576e622f4d657461646174612e6a736f6e0000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _initBaseURI (string): ipfs://QmcWrF8Ugxf8ne54cgEfiT5MQ2ayFJ7u9LcMSCrGMRaCgy/
Arg [1] : _initNotRevealedUri (string): ipfs://QmQm2JSiJSGbBpUqWQ1UKHH1zRCVsoSyjP2YwDEneRLWnb/Metadata.json
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [3] : 697066733a2f2f516d635772463855677866386e653534636745666954354d51
Arg [4] : 326179464a3775394c634d534372474d52614367792f00000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [6] : 697066733a2f2f516d516d324a53694a53476242705571575131554b4848317a
Arg [7] : 524356736f53796a5032597744456e65524c576e622f4d657461646174612e6a
Arg [8] : 736f6e0000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
43114:5127:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34668:224;;;;;;;;;;-1:-1:-1;34668:224:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;34668:224:0;;;;;;;;22559:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24118:221::-;;;;;;;;;;-1:-1:-1;24118:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;24118:221:0;1528:203:1;43269:28:0;;;;;;;;;;;;;:::i;23641:411::-;;;;;;;;;;-1:-1:-1;23641:411:0;;;;;:::i;:::-;;:::i;:::-;;43302:31;;;;;;;;;;;;;;;;;;;2319:25:1;;;2307:2;2292:18;43302:31:0;2173:177:1;35308:113:0;;;;;;;;;;-1:-1:-1;35396:10:0;:17;35308:113;;43690:55;;;;;;;;;;-1:-1:-1;43690:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;43487:38;;;;;;;;;;-1:-1:-1;43487:38:0;;;;;;;;43374:32;;;;;;;;;;;;;;;;25008:339;;;;;;;;;;-1:-1:-1;25008:339:0;;;;;:::i;:::-;;:::i;34976:256::-;;;;;;;;;;-1:-1:-1;34976:256:0;;;;;:::i;:::-;;:::i;45296:239::-;;;;;;;;;;-1:-1:-1;45296:239:0;;;;;:::i;:::-;;:::i;47515:95::-;;;;;;;;;;-1:-1:-1;47515:95:0;;;;;:::i;:::-;;:::i;48093:145::-;;;:::i;25418:185::-;;;;;;;;;;-1:-1:-1;25418:185:0;;;;;:::i;:::-;;:::i;45541:348::-;;;;;;;;;;-1:-1:-1;45541:348:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;46599:80::-;;;;;;;;;;-1:-1:-1;46599:80:0;;;;;:::i;:::-;;:::i;35498:233::-;;;;;;;;;;-1:-1:-1;35498:233:0;;;;;:::i;:::-;;:::i;43576:28::-;;;;;;;;;;-1:-1:-1;43576:28:0;;;;;;;;;;;46935:98;;;;;;;;;;-1:-1:-1;46935:98:0;;;;;:::i;:::-;;:::i;22253:239::-;;;;;;;;;;-1:-1:-1;22253:239:0;;;;;:::i;:::-;;:::i;43201:21::-;;;;;;;;;;;;;:::i;21983:208::-;;;;;;;;;;-1:-1:-1;21983:208:0;;;;;:::i;:::-;;:::i;42456:94::-;;;;;;;;;;;;;:::i;46813:116::-;;;;;;;;;;-1:-1:-1;46813:116:0;;;;;:::i;:::-;;:::i;41805:87::-;;;;;;;;;;-1:-1:-1;41878:6:0;;-1:-1:-1;;;;;41878:6:0;41805:87;;22728:104;;;;;;;;;;;;;:::i;47768:318::-;;;;;;;;;;-1:-1:-1;47768:318:0;;;;;:::i;:::-;;:::i;43609:34::-;;;;;;;;;;-1:-1:-1;43609:34:0;;;;;;;;;;;46685:122;;;;;;;;;;-1:-1:-1;46685:122:0;;;;;:::i;:::-;-1:-1:-1;;;;;46773:26:0;46746:7;46773:26;;;:20;:26;;;;;;;46685:122;44113:515;;;;;;:::i;:::-;;:::i;24411:295::-;;;;;;;;;;-1:-1:-1;24411:295:0;;;;;:::i;:::-;;:::i;46414:65::-;;;;;;;;;;;;;:::i;47295:99::-;;;;;;;;;;-1:-1:-1;47295:99:0;;;;;:::i;:::-;;:::i;25674:328::-;;;;;;;;;;-1:-1:-1;25674:328:0;;;;;:::i;:::-;;:::i;43530:41::-;;;;;;;;;;-1:-1:-1;43530:41:0;;;;;;;;;;;43648:37;;;;;;;;;;-1:-1:-1;43648:37:0;;;;;:::i;:::-;;:::i;43445:::-;;;;;;;;;;;;;;;;43227;;;;;;;;;;;;;:::i;45895:497::-;;;;;;;;;;-1:-1:-1;45895:497:0;;;;;:::i;:::-;;:::i;46487:104::-;;;;;;;;;;-1:-1:-1;46487:104:0;;;;;:::i;:::-;;:::i;47400:105::-;;;;;;;;;;-1:-1:-1;47400:105:0;;;;;:::i;:::-;;:::i;43338:31::-;;;;;;;;;;;;;;;;47039:122;;;;;;;;;;-1:-1:-1;47039:122:0;;;;;:::i;:::-;;:::i;24777:164::-;;;;;;;;;;-1:-1:-1;24777:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;24898:25:0;;;24874:4;24898:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24777:164;47618:144;;;;;;;;;;-1:-1:-1;47618:144:0;;;;;:::i;:::-;;:::i;47169:120::-;;;;;;;;;;-1:-1:-1;47169:120:0;;;;;:::i;:::-;;:::i;42705:192::-;;;;;;;;;;-1:-1:-1;42705:192:0;;;;;:::i;:::-;;:::i;44638:650::-;;;;;;:::i;:::-;;:::i;43411:29::-;;;;;;;;;;;;;;;;34668:224;34770:4;-1:-1:-1;;;;;;34794:50:0;;-1:-1:-1;;;34794:50:0;;:90;;;34848:36;34872:11;34848:23;:36::i;:::-;34787:97;34668:224;-1:-1:-1;;34668:224:0:o;22559:100::-;22613:13;22646:5;22639:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22559:100;:::o;24118:221::-;24194:7;27601:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27601:16:0;24214:73;;;;-1:-1:-1;;;24214:73:0;;7494:2:1;24214:73:0;;;7476:21:1;7533:2;7513:18;;;7506:30;7572:34;7552:18;;;7545:62;-1:-1:-1;;;7623:18:1;;;7616:42;7675:19;;24214:73:0;;;;;;;;;-1:-1:-1;24307:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24307:24:0;;24118:221::o;43269:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23641:411::-;23722:13;23738:23;23753:7;23738:14;:23::i;:::-;23722:39;;23786:5;-1:-1:-1;;;;;23780:11:0;:2;-1:-1:-1;;;;;23780:11:0;;;23772:57;;;;-1:-1:-1;;;23772:57:0;;7907:2:1;23772:57:0;;;7889:21:1;7946:2;7926:18;;;7919:30;7985:34;7965:18;;;7958:62;-1:-1:-1;;;8036:18:1;;;8029:31;8077:19;;23772:57:0;7705:397:1;23772:57:0;18472:10;-1:-1:-1;;;;;23864:21:0;;;;:62;;-1:-1:-1;23889:37:0;23906:5;18472:10;24777:164;:::i;23889:37::-;23842:168;;;;-1:-1:-1;;;23842:168:0;;8309:2:1;23842:168:0;;;8291:21:1;8348:2;8328:18;;;8321:30;8387:34;8367:18;;;8360:62;8458:26;8438:18;;;8431:54;8502:19;;23842:168:0;8107:420:1;23842:168:0;24023:21;24032:2;24036:7;24023:8;:21::i;:::-;23711:341;23641:411;;:::o;25008:339::-;25203:41;18472:10;25236:7;25203:18;:41::i;:::-;25195:103;;;;-1:-1:-1;;;25195:103:0;;;;;;;:::i;:::-;25311:28;25321:4;25327:2;25331:7;25311:9;:28::i;34976:256::-;35073:7;35109:23;35126:5;35109:16;:23::i;:::-;35101:5;:31;35093:87;;;;-1:-1:-1;;;35093:87:0;;9152:2:1;35093:87:0;;;9134:21:1;9191:2;9171:18;;;9164:30;9230:34;9210:18;;;9203:62;-1:-1:-1;;;9281:18:1;;;9274:41;9332:19;;35093:87:0;8950:407:1;35093:87:0;-1:-1:-1;;;;;;35198:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;34976:256::o;45296:239::-;45355:4;;45368:143;45389:20;:27;45385:31;;45368:143;;;45463:5;-1:-1:-1;;;;;45436:32:0;:20;45457:1;45436:23;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;45436:23:0;:32;45432:72;;;-1:-1:-1;45490:4:0;;45296:239;-1:-1:-1;;45296:239:0:o;45432:72::-;45418:3;;;;:::i;:::-;;;;45368:143;;;-1:-1:-1;45524:5:0;;45296:239;-1:-1:-1;;45296:239:0:o;47515:95::-;41878:6;;-1:-1:-1;;;;;41878:6:0;18472:10;42025:23;42017:68;;;;-1:-1:-1;;;42017:68:0;;;;;;;:::i;:::-;47580:15:::1;:24:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;47580:24:0;;::::1;::::0;;;::::1;::::0;;47515:95::o;48093:145::-;41878:6;;-1:-1:-1;;;;;41878:6:0;18472:10;42025:23;42017:68;;;;-1:-1:-1;;;42017:68:0;;;;;;;:::i;:::-;48146:7:::1;48167;41878:6:::0;;-1:-1:-1;;;;;41878:6:0;;41805:87;48167:7:::1;-1:-1:-1::0;;;;;48159:21:0::1;48188;48159:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48145:69;;;48229:2;48221:11;;;::::0;::::1;;48138:100;48093:145::o:0;25418:185::-;25556:39;25573:4;25579:2;25583:7;25556:39;;;;;;;;;;;;:16;:39::i;45541:348::-;45616:16;45644:23;45670:17;45680:6;45670:9;:17::i;:::-;45644:43;;45694:25;45736:15;45722:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45722:30:0;;45694:58;;45764:9;45759:103;45779:15;45775:1;:19;45759:103;;;45824:30;45844:6;45852:1;45824:19;:30::i;:::-;45810:8;45819:1;45810:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;45796:3;;;;:::i;:::-;;;;45759:103;;;-1:-1:-1;45875:8:0;45541:348;-1:-1:-1;;;45541:348:0:o;46599:80::-;41878:6;;-1:-1:-1;;;;;41878:6:0;18472:10;42025:23;42017:68;;;;-1:-1:-1;;;42017:68:0;;;;;;;:::i;:::-;46658:4:::1;:15:::0;46599:80::o;35498:233::-;35573:7;35609:30;35396:10;:17;;35308:113;35609:30;35601:5;:38;35593:95;;;;-1:-1:-1;;;35593:95:0;;10539:2:1;35593:95:0;;;10521:21:1;10578:2;10558:18;;;10551:30;10617:34;10597:18;;;10590:62;-1:-1:-1;;;10668:18:1;;;10661:42;10720:19;;35593:95:0;10337:408:1;35593:95:0;35706:10;35717:5;35706:17;;;;;;;;:::i;:::-;;;;;;;;;35699:24;;35498:233;;;:::o;46935:98::-;41878:6;;-1:-1:-1;;;;;41878:6:0;18472:10;42025:23;42017:68;;;;-1:-1:-1;;;42017:68:0;;;;;;;:::i;:::-;47006:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;46935:98:::0;:::o;22253:239::-;22325:7;22361:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22361:16:0;22396:19;22388:73;;;;-1:-1:-1;;;22388:73:0;;10952:2:1;22388:73:0;;;10934:21:1;10991:2;10971:18;;;10964:30;11030:34;11010:18;;;11003:62;-1:-1:-1;;;11081:18:1;;;11074:39;11130:19;;22388:73:0;10750:405:1;43201:21:0;;;;;;;:::i;21983:208::-;22055:7;-1:-1:-1;;;;;22083:19:0;;22075:74;;;;-1:-1:-1;;;22075:74:0;;11362:2:1;22075:74:0;;;11344:21:1;11401:2;11381:18;;;11374:30;11440:34;11420:18;;;11413:62;-1:-1:-1;;;11491:18:1;;;11484:40;11541:19;;22075:74:0;11160:406:1;22075:74:0;-1:-1:-1;;;;;;22167:16:0;;;;;:9;:16;;;;;;;21983:208::o;42456:94::-;41878:6;;-1:-1:-1;;;;;41878:6:0;18472:10;42025:23;42017:68;;;;-1:-1:-1;;;42017:68:0;;;;;;;:::i;:::-;42521:21:::1;42539:1;42521:9;:21::i;:::-;42456:94::o:0;46813:116::-;41878:6;;-1:-1:-1;;;;;41878:6:0;18472:10;42025:23;42017:68;;;;-1:-1:-1;;;42017:68:0;;;;;;;:::i;:::-;46890:13:::1;:33:::0;46813:116::o;22728:104::-;22784:13;22817:7;22810:14;;;;;:::i;47768:318::-;41878:6;;-1:-1:-1;;;;;41878:6:0;18472:10;42025:23;42017:68;;;;-1:-1:-1;;;42017:68:0;;;;;;;:::i;:::-;47855:8:::1;;47844:7;:19;;47835:68;;;::::0;-1:-1:-1;;;47835:68:0;;11773:2:1;47835:68:0::1;::::0;::::1;11755:21:1::0;11812:2;11792:18;;;11785:30;11851:34;11831:18;;;11824:62;-1:-1:-1;;;11902:18:1;;;11895:32;11944:19;;47835:68:0::1;11571:398:1::0;47835:68:0::1;47926:7;47914:8;;:19;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;35396:10:0;:17;47989:9:::1;47985:94;48004:7;48000:1;:11;47985:94;;;48032:35;48043:10;48055;48064:1:::0;48055:6;:10:::1;:::i;:::-;48032:9;:35::i;:::-;48013:3:::0;::::1;::::0;::::1;:::i;:::-;;;;47985:94;;44113:515:::0;44178:18;;;;44170:50;;;;-1:-1:-1;;;44170:50:0;;12439:2:1;44170:50:0;;;12421:21:1;12478:2;12458:18;;;12451:30;-1:-1:-1;;;12497:18:1;;;12490:49;12556:18;;44170:50:0;12237:343:1;44170:50:0;44227:14;44244:13;35396:10;:17;;35308:113;44244:13;44227:30;;44286:1;44272:11;:15;44264:55;;;;-1:-1:-1;;;44264:55:0;;12787:2:1;44264:55:0;;;12769:21:1;12826:2;12806:18;;;12799:30;12865:29;12845:18;;;12838:57;12912:18;;44264:55:0;12585:351:1;44264:55:0;44349:13;;44334:11;:28;;44326:77;;;;-1:-1:-1;;;44326:77:0;;13143:2:1;44326:77:0;;;13125:21:1;13182:2;13162:18;;;13155:30;13221:34;13201:18;;;13194:62;-1:-1:-1;;;13272:18:1;;;13265:34;13316:19;;44326:77:0;12941:400:1;44326:77:0;44442:9;;44418:20;44427:11;44418:6;:20;:::i;:::-;:33;;44410:68;;;;-1:-1:-1;;;44410:68:0;;13548:2:1;44410:68:0;;;13530:21:1;13587:2;13567:18;;;13560:30;-1:-1:-1;;;13606:18:1;;;13599:52;13668:18;;44410:68:0;13346:346:1;44410:68:0;44502:1;44485:138;44510:11;44505:1;:16;44485:138;;44560:10;44539:32;;;;:20;:32;;;;;:34;;;;;;:::i;:::-;;;;-1:-1:-1;44582:33:0;;-1:-1:-1;44592:10:0;44604;44613:1;44604:6;:10;:::i;44582:33::-;44523:3;;;;:::i;:::-;;;;44485:138;;24411:295;-1:-1:-1;;;;;24514:24:0;;18472:10;24514:24;;24506:62;;;;-1:-1:-1;;;24506:62:0;;13899:2:1;24506:62:0;;;13881:21:1;13938:2;13918:18;;;13911:30;13977:27;13957:18;;;13950:55;14022:18;;24506:62:0;13697:349:1;24506:62:0;18472:10;24581:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;24581:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;24581:53:0;;;;;;;;;;24650:48;;540:41:1;;;24581:42:0;;18472:10;24650:48;;513:18:1;24650:48:0;;;;;;;24411:295;;:::o;46414:65::-;41878:6;;-1:-1:-1;;;;;41878:6:0;18472:10;42025:23;42017:68;;;;-1:-1:-1;;;42017:68:0;;;;;;;:::i;:::-;46458:8:::1;:15:::0;;-1:-1:-1;;46458:15:0::1;::::0;::::1;::::0;;46414:65::o;47295:99::-;41878:6;;-1:-1:-1;;;;;41878:6:0;18472:10;42025:23;42017:68;;;;-1:-1:-1;;;42017:68:0;;;;;;;:::i;:::-;47362:18:::1;:24:::0;;-1:-1:-1;;47362:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47295:99::o;25674:328::-;25849:41;18472:10;25882:7;25849:18;:41::i;:::-;25841:103;;;;-1:-1:-1;;;25841:103:0;;;;;;;:::i;:::-;25955:39;25969:4;25975:2;25979:7;25988:5;25955:13;:39::i;:::-;25674:328;;;;:::o;43648:37::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43648:37:0;;-1:-1:-1;43648:37:0;:::o;43227:::-;;;;;;;:::i;45895:497::-;27577:4;27601:16;;;:7;:16;;;;;;45993:13;;-1:-1:-1;;;;;27601:16:0;46018:97;;;;-1:-1:-1;;;46018:97:0;;14253:2:1;46018:97:0;;;14235:21:1;14292:2;14272:18;;;14265:30;14331:34;14311:18;;;14304:62;-1:-1:-1;;;14382:18:1;;;14375:45;14437:19;;46018:97:0;14051:411:1;46018:97:0;46131:8;;;;;;;46128:62;;46168:14;46161:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45895:497;;;:::o;46128:62::-;46198:28;46229:10;:8;:10::i;:::-;46198:41;;46284:1;46259:14;46253:28;:32;:133;;;;;;;;;;;;;;;;;46321:14;46337:18;:7;:16;:18::i;:::-;46357:13;46304:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46253:133;46246:140;45895:497;-1:-1:-1;;;45895:497:0:o;46487:104::-;41878:6;;-1:-1:-1;;;;;41878:6:0;18472:10;42025:23;42017:68;;;;-1:-1:-1;;;42017:68:0;;;;;;;:::i;:::-;46558:18:::1;:27:::0;46487:104::o;47400:105::-;41878:6;;-1:-1:-1;;;;;41878:6:0;18472:10;42025:23;42017:68;;;;-1:-1:-1;;;42017:68:0;;;;;;;:::i;:::-;47470:21:::1;:27:::0;;;::::1;;;;-1:-1:-1::0;;47470:27:0;;::::1;::::0;;;::::1;::::0;;47400:105::o;47039:122::-;41878:6;;-1:-1:-1;;;;;41878:6:0;18472:10;42025:23;42017:68;;;;-1:-1:-1;;;42017:68:0;;;;;;;:::i;:::-;47122:33;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;47618:144::-:0;41878:6;;-1:-1:-1;;;;;41878:6:0;18472:10;42025:23;42017:68;;;;-1:-1:-1;;;42017:68:0;;;;;;;:::i;:::-;47693:27:::1;47700:20;;47693:27;:::i;:::-;47727:29;:20;47750:6:::0;;47727:29:::1;:::i;47169:120::-:0;41878:6;;-1:-1:-1;;;;;41878:6:0;18472:10;42025:23;42017:68;;;;-1:-1:-1;;;42017:68:0;;;;;;;:::i;:::-;47251:32;;::::1;::::0;:14:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;42705:192::-:0;41878:6;;-1:-1:-1;;;;;41878:6:0;18472:10;42025:23;42017:68;;;;-1:-1:-1;;;42017:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42794:22:0;::::1;42786:73;;;::::0;-1:-1:-1;;;42786:73:0;;16327:2:1;42786:73:0::1;::::0;::::1;16309:21:1::0;16366:2;16346:18;;;16339:30;16405:34;16385:18;;;16378:62;-1:-1:-1;;;16456:18:1;;;16449:36;16502:19;;42786:73:0::1;16125:402:1::0;42786:73:0::1;42870:19;42880:8;42870:9;:19::i;44638:650::-:0;44716:21;;;;;;;44708:66;;;;-1:-1:-1;;;44708:66:0;;16734:2:1;44708:66:0;;;16716:21:1;;;16753:18;;;16746:30;16812:34;16792:18;;;16785:62;16864:18;;44708:66:0;16532:356:1;44708:66:0;44785:14;44802:13;35396:10;:17;;35308:113;44802:13;44785:30;;44834:25;44848:10;44834:13;:25::i;:::-;44826:61;;;;-1:-1:-1;;;44826:61:0;;17095:2:1;44826:61:0;;;17077:21:1;17134:2;17114:18;;;17107:30;17173:25;17153:18;;;17146:53;17216:18;;44826:61:0;16893:347:1;44826:61:0;44946:10;44898:24;44925:32;;;:20;:32;;;;;;45010:18;;44976:30;44995:11;44925:32;44976:30;:::i;:::-;:52;;44968:93;;;;-1:-1:-1;;;44968:93:0;;17447:2:1;44968:93:0;;;17429:21:1;17486:2;17466:18;;;17459:30;17525;17505:18;;;17498:58;17573:18;;44968:93:0;17245:352:1;44968:93:0;45100:11;45093:4;;:18;;;;:::i;:::-;45080:9;:31;;45072:62;;;;-1:-1:-1;;;45072:62:0;;17977:2:1;45072:62:0;;;17959:21:1;18016:2;17996:18;;;17989:30;-1:-1:-1;;;18035:18:1;;;18028:48;18093:18;;45072:62:0;17775:342:1;45072:62:0;45162:1;45145:138;45170:11;45165:1;:16;45145:138;;45220:10;45199:32;;;;:20;:32;;;;;:34;;;;;;:::i;:::-;;;;-1:-1:-1;45242:33:0;;-1:-1:-1;45252:10:0;45264;45273:1;45264:6;:10;:::i;45242:33::-;45183:3;;;;:::i;:::-;;;;45145:138;;21614:305;21716:4;-1:-1:-1;;;;;;21753:40:0;;-1:-1:-1;;;21753:40:0;;:105;;-1:-1:-1;;;;;;;21810:48:0;;-1:-1:-1;;;21810:48:0;21753:105;:158;;;-1:-1:-1;;;;;;;;;;7551:40:0;;;21875:36;7442:157;31494:174;31569:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31569:29:0;-1:-1:-1;;;;;31569:29:0;;;;;;;;:24;;31623:23;31569:24;31623:14;:23::i;:::-;-1:-1:-1;;;;;31614:46:0;;;;;;;;;;;31494:174;;:::o;27806:348::-;27899:4;27601:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27601:16:0;27916:73;;;;-1:-1:-1;;;27916:73:0;;18324:2:1;27916:73:0;;;18306:21:1;18363:2;18343:18;;;18336:30;18402:34;18382:18;;;18375:62;-1:-1:-1;;;18453:18:1;;;18446:42;18505:19;;27916:73:0;18122:408:1;27916:73:0;28000:13;28016:23;28031:7;28016:14;:23::i;:::-;28000:39;;28069:5;-1:-1:-1;;;;;28058:16:0;:7;-1:-1:-1;;;;;28058:16:0;;:51;;;;28102:7;-1:-1:-1;;;;;28078:31:0;:20;28090:7;28078:11;:20::i;:::-;-1:-1:-1;;;;;28078:31:0;;28058:51;:87;;;-1:-1:-1;;;;;;24898:25:0;;;24874:4;24898:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;28113:32;28050:96;27806:348;-1:-1:-1;;;;27806:348:0:o;30798:578::-;30957:4;-1:-1:-1;;;;;30930:31:0;:23;30945:7;30930:14;:23::i;:::-;-1:-1:-1;;;;;30930:31:0;;30922:85;;;;-1:-1:-1;;;30922:85:0;;18737:2:1;30922:85:0;;;18719:21:1;18776:2;18756:18;;;18749:30;18815:34;18795:18;;;18788:62;-1:-1:-1;;;18866:18:1;;;18859:39;18915:19;;30922:85:0;18535:405:1;30922:85:0;-1:-1:-1;;;;;31026:16:0;;31018:65;;;;-1:-1:-1;;;31018:65:0;;19147:2:1;31018:65:0;;;19129:21:1;19186:2;19166:18;;;19159:30;19225:34;19205:18;;;19198:62;-1:-1:-1;;;19276:18:1;;;19269:34;19320:19;;31018:65:0;18945:400:1;31018:65:0;31096:39;31117:4;31123:2;31127:7;31096:20;:39::i;:::-;31200:29;31217:1;31221:7;31200:8;:29::i;:::-;-1:-1:-1;;;;;31242:15:0;;;;;;:9;:15;;;;;:20;;31261:1;;31242:15;:20;;31261:1;;31242:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31273:13:0;;;;;;:9;:13;;;;;:18;;31290:1;;31273:13;:18;;31290:1;;31273:18;:::i;:::-;;;;-1:-1:-1;;31302:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31302:21:0;-1:-1:-1;;;;;31302:21:0;;;;;;;;;31341:27;;31302:16;;31341:27;;;;;;;30798:578;;;:::o;42905:173::-;42980:6;;;-1:-1:-1;;;;;42997:17:0;;;-1:-1:-1;;;;;;42997:17:0;;;;;;;43030:40;;42980:6;;;42997:17;42980:6;;43030:40;;42961:16;;43030:40;42950:128;42905:173;:::o;28496:110::-;28572:26;28582:2;28586:7;28572:26;;;;;;;;;;;;:9;:26::i;26884:315::-;27041:28;27051:4;27057:2;27061:7;27041:9;:28::i;:::-;27088:48;27111:4;27117:2;27121:7;27130:5;27088:22;:48::i;:::-;27080:111;;;;-1:-1:-1;;;27080:111:0;;;;;;;:::i;43992:102::-;44052:13;44081:7;44074:14;;;;;:::i;7917:723::-;7973:13;8194:10;8190:53;;-1:-1:-1;;8221:10:0;;;;;;;;;;;;-1:-1:-1;;;8221:10:0;;;;;7917:723::o;8190:53::-;8268:5;8253:12;8309:78;8316:9;;8309:78;;8342:8;;;;:::i;:::-;;-1:-1:-1;8365:10:0;;-1:-1:-1;8373:2:0;8365:10;;:::i;:::-;;;8309:78;;;8397:19;8429:6;8419:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8419:17:0;;8397:39;;8447:154;8454:10;;8447:154;;8481:11;8491:1;8481:11;;:::i;:::-;;-1:-1:-1;8550:10:0;8558:2;8550:5;:10;:::i;:::-;8537:24;;:2;:24;:::i;:::-;8524:39;;8507:6;8514;8507:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;8507:56:0;;;;;;;;-1:-1:-1;8578:11:0;8587:2;8578:11;;:::i;:::-;;;8447:154;;36344:589;-1:-1:-1;;;;;36550:18:0;;36546:187;;36585:40;36617:7;37760:10;:17;;37733:24;;;;:15;:24;;;;;:44;;;37788:24;;;;;;;;;;;;37656:164;36585:40;36546:187;;;36655:2;-1:-1:-1;;;;;36647:10:0;:4;-1:-1:-1;;;;;36647:10:0;;36643:90;;36674:47;36707:4;36713:7;36674:32;:47::i;:::-;-1:-1:-1;;;;;36747:16:0;;36743:183;;36780:45;36817:7;36780:36;:45::i;36743:183::-;36853:4;-1:-1:-1;;;;;36847:10:0;:2;-1:-1:-1;;;;;36847:10:0;;36843:83;;36874:40;36902:2;36906:7;36874:27;:40::i;28833:321::-;28963:18;28969:2;28973:7;28963:5;:18::i;:::-;29014:54;29045:1;29049:2;29053:7;29062:5;29014:22;:54::i;:::-;28992:154;;;;-1:-1:-1;;;28992:154:0;;;;;;;:::i;32233:799::-;32388:4;-1:-1:-1;;;;;32409:13:0;;10766:20;10814:8;32405:620;;32445:72;;-1:-1:-1;;;32445:72:0;;-1:-1:-1;;;;;32445:36:0;;;;;:72;;18472:10;;32496:4;;32502:7;;32511:5;;32445:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32445:72:0;;;;;;;;-1:-1:-1;;32445:72:0;;;;;;;;;;;;:::i;:::-;;;32441:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32687:13:0;;32683:272;;32730:60;;-1:-1:-1;;;32730:60:0;;;;;;;:::i;32683:272::-;32905:6;32899:13;32890:6;32886:2;32882:15;32875:38;32441:529;-1:-1:-1;;;;;;32568:51:0;-1:-1:-1;;;32568:51:0;;-1:-1:-1;32561:58:0;;32405:620;-1:-1:-1;33009:4:0;32233:799;;;;;;:::o;38447:988::-;38713:22;38763:1;38738:22;38755:4;38738:16;:22::i;:::-;:26;;;;:::i;:::-;38775:18;38796:26;;;:17;:26;;;;;;38713:51;;-1:-1:-1;38929:28:0;;;38925:328;;-1:-1:-1;;;;;38996:18:0;;38974:19;38996:18;;;:12;:18;;;;;;;;:34;;;;;;;;;39047:30;;;;;;:44;;;39164:30;;:17;:30;;;;;:43;;;38925:328;-1:-1:-1;39349:26:0;;;;:17;:26;;;;;;;;39342:33;;;-1:-1:-1;;;;;39393:18:0;;;;;:12;:18;;;;;:34;;;;;;;39386:41;38447:988::o;39730:1079::-;40008:10;:17;39983:22;;40008:21;;40028:1;;40008:21;:::i;:::-;40040:18;40061:24;;;:15;:24;;;;;;40434:10;:26;;39983:46;;-1:-1:-1;40061:24:0;;39983:46;;40434:26;;;;;;:::i;:::-;;;;;;;;;40412:48;;40498:11;40473:10;40484;40473:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;40578:28;;;:15;:28;;;;;;;:41;;;40750:24;;;;;40743:31;40785:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;39801:1008;;;39730:1079;:::o;37234:221::-;37319:14;37336:20;37353:2;37336:16;:20::i;:::-;-1:-1:-1;;;;;37367:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;37412:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;37234:221:0:o;29490:382::-;-1:-1:-1;;;;;29570:16:0;;29562:61;;;;-1:-1:-1;;;29562:61:0;;21225:2:1;29562:61:0;;;21207:21:1;;;21244:18;;;21237:30;21303:34;21283:18;;;21276:62;21355:18;;29562:61:0;21023:356:1;29562:61:0;27577:4;27601:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27601:16:0;:30;29634:58;;;;-1:-1:-1;;;29634:58:0;;21586:2:1;29634:58:0;;;21568:21:1;21625:2;21605:18;;;21598:30;21664;21644:18;;;21637:58;21712:18;;29634:58:0;21384:352:1;29634:58:0;29705:45;29734:1;29738:2;29742:7;29705:20;:45::i;:::-;-1:-1:-1;;;;;29763:13:0;;;;;;:9;:13;;;;;:18;;29780:1;;29763:13;:18;;29780:1;;29763:18;:::i;:::-;;;;-1:-1:-1;;29792:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29792:21:0;-1:-1:-1;;;;;29792:21:0;;;;;;;;29831:33;;29792:16;;;29831:33;;29792:16;;29831:33;29490:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2355:186::-;2414:6;2467:2;2455:9;2446:7;2442:23;2438:32;2435:52;;;2483:1;2480;2473:12;2435:52;2506:29;2525:9;2506:29;:::i;2546:328::-;2623:6;2631;2639;2692:2;2680:9;2671:7;2667:23;2663:32;2660:52;;;2708:1;2705;2698:12;2660:52;2731:29;2750:9;2731:29;:::i;:::-;2721:39;;2779:38;2813:2;2802:9;2798:18;2779:38;:::i;:::-;2769:48;;2864:2;2853:9;2849:18;2836:32;2826:42;;2546:328;;;;;:::o;2879:160::-;2944:20;;3000:13;;2993:21;2983:32;;2973:60;;3029:1;3026;3019:12;3044:180;3100:6;3153:2;3141:9;3132:7;3128:23;3124:32;3121:52;;;3169:1;3166;3159:12;3121:52;3192:26;3208:9;3192:26;:::i;3229:632::-;3400:2;3452:21;;;3522:13;;3425:18;;;3544:22;;;3371:4;;3400:2;3623:15;;;;3597:2;3582:18;;;3371:4;3666:169;3680:6;3677:1;3674:13;3666:169;;;3741:13;;3729:26;;3810:15;;;;3775:12;;;;3702:1;3695:9;3666:169;;;-1:-1:-1;3852:3:1;;3229:632;-1:-1:-1;;;;;;3229:632:1:o;3866:127::-;3927:10;3922:3;3918:20;3915:1;3908:31;3958:4;3955:1;3948:15;3982:4;3979:1;3972:15;3998:632;4063:5;4093:18;4134:2;4126:6;4123:14;4120:40;;;4140:18;;:::i;:::-;4215:2;4209:9;4183:2;4269:15;;-1:-1:-1;;4265:24:1;;;4291:2;4261:33;4257:42;4245:55;;;4315:18;;;4335:22;;;4312:46;4309:72;;;4361:18;;:::i;:::-;4401:10;4397:2;4390:22;4430:6;4421:15;;4460:6;4452;4445:22;4500:3;4491:6;4486:3;4482:16;4479:25;4476:45;;;4517:1;4514;4507:12;4476:45;4567:6;4562:3;4555:4;4547:6;4543:17;4530:44;4622:1;4615:4;4606:6;4598;4594:19;4590:30;4583:41;;;;3998:632;;;;;:::o;4635:451::-;4704:6;4757:2;4745:9;4736:7;4732:23;4728:32;4725:52;;;4773:1;4770;4763:12;4725:52;4813:9;4800:23;4846:18;4838:6;4835:30;4832:50;;;4878:1;4875;4868:12;4832:50;4901:22;;4954:4;4946:13;;4942:27;-1:-1:-1;4932:55:1;;4983:1;4980;4973:12;4932:55;5006:74;5072:7;5067:2;5054:16;5049:2;5045;5041:11;5006:74;:::i;5091:254::-;5156:6;5164;5217:2;5205:9;5196:7;5192:23;5188:32;5185:52;;;5233:1;5230;5223:12;5185:52;5256:29;5275:9;5256:29;:::i;:::-;5246:39;;5304:35;5335:2;5324:9;5320:18;5304:35;:::i;:::-;5294:45;;5091:254;;;;;:::o;5350:667::-;5445:6;5453;5461;5469;5522:3;5510:9;5501:7;5497:23;5493:33;5490:53;;;5539:1;5536;5529:12;5490:53;5562:29;5581:9;5562:29;:::i;:::-;5552:39;;5610:38;5644:2;5633:9;5629:18;5610:38;:::i;:::-;5600:48;;5695:2;5684:9;5680:18;5667:32;5657:42;;5750:2;5739:9;5735:18;5722:32;5777:18;5769:6;5766:30;5763:50;;;5809:1;5806;5799:12;5763:50;5832:22;;5885:4;5877:13;;5873:27;-1:-1:-1;5863:55:1;;5914:1;5911;5904:12;5863:55;5937:74;6003:7;5998:2;5985:16;5980:2;5976;5972:11;5937:74;:::i;:::-;5927:84;;;5350:667;;;;;;;:::o;6022:260::-;6090:6;6098;6151:2;6139:9;6130:7;6126:23;6122:32;6119:52;;;6167:1;6164;6157:12;6119:52;6190:29;6209:9;6190:29;:::i;:::-;6180:39;;6238:38;6272:2;6261:9;6257:18;6238:38;:::i;6287:615::-;6373:6;6381;6434:2;6422:9;6413:7;6409:23;6405:32;6402:52;;;6450:1;6447;6440:12;6402:52;6490:9;6477:23;6519:18;6560:2;6552:6;6549:14;6546:34;;;6576:1;6573;6566:12;6546:34;6614:6;6603:9;6599:22;6589:32;;6659:7;6652:4;6648:2;6644:13;6640:27;6630:55;;6681:1;6678;6671:12;6630:55;6721:2;6708:16;6747:2;6739:6;6736:14;6733:34;;;6763:1;6760;6753:12;6733:34;6816:7;6811:2;6801:6;6798:1;6794:14;6790:2;6786:23;6782:32;6779:45;6776:65;;;6837:1;6834;6827:12;6776:65;6868:2;6860:11;;;;;6890:6;;-1:-1:-1;6287:615:1;;-1:-1:-1;;;;6287:615:1:o;6907:380::-;6986:1;6982:12;;;;7029;;;7050:61;;7104:4;7096:6;7092:17;7082:27;;7050:61;7157:2;7149:6;7146:14;7126:18;7123:38;7120:161;;;7203:10;7198:3;7194:20;7191:1;7184:31;7238:4;7235:1;7228:15;7266:4;7263:1;7256:15;7120:161;;6907:380;;;:::o;8532:413::-;8734:2;8716:21;;;8773:2;8753:18;;;8746:30;8812:34;8807:2;8792:18;;8785:62;-1:-1:-1;;;8878:2:1;8863:18;;8856:47;8935:3;8920:19;;8532:413::o;9362:127::-;9423:10;9418:3;9414:20;9411:1;9404:31;9454:4;9451:1;9444:15;9478:4;9475:1;9468:15;9494:127;9555:10;9550:3;9546:20;9543:1;9536:31;9586:4;9583:1;9576:15;9610:4;9607:1;9600:15;9626:135;9665:3;-1:-1:-1;;9686:17:1;;9683:43;;;9706:18;;:::i;:::-;-1:-1:-1;9753:1:1;9742:13;;9626:135::o;9766:356::-;9968:2;9950:21;;;9987:18;;;9980:30;10046:34;10041:2;10026:18;;10019:62;10113:2;10098:18;;9766:356::o;11974:125::-;12014:4;12042:1;12039;12036:8;12033:34;;;12047:18;;:::i;:::-;-1:-1:-1;12084:9:1;;11974:125::o;12104:128::-;12144:3;12175:1;12171:6;12168:1;12165:13;12162:39;;;12181:18;;:::i;:::-;-1:-1:-1;12217:9:1;;12104:128::o;14593:1527::-;14817:3;14855:6;14849:13;14881:4;14894:51;14938:6;14933:3;14928:2;14920:6;14916:15;14894:51;:::i;:::-;15008:13;;14967:16;;;;15030:55;15008:13;14967:16;15052:15;;;15030:55;:::i;:::-;15174:13;;15107:20;;;15147:1;;15234;15256:18;;;;15309;;;;15336:93;;15414:4;15404:8;15400:19;15388:31;;15336:93;15477:2;15467:8;15464:16;15444:18;15441:40;15438:167;;;-1:-1:-1;;;15504:33:1;;15560:4;15557:1;15550:15;15590:4;15511:3;15578:17;15438:167;15621:18;15648:110;;;;15772:1;15767:328;;;;15614:481;;15648:110;-1:-1:-1;;15683:24:1;;15669:39;;15728:20;;;;-1:-1:-1;15648:110:1;;15767:328;14540:1;14533:14;;;14577:4;14564:18;;15862:1;15876:169;15890:8;15887:1;15884:15;15876:169;;;15972:14;;15957:13;;;15950:37;16015:16;;;;15907:10;;15876:169;;;15880:3;;16076:8;16069:5;16065:20;16058:27;;15614:481;-1:-1:-1;16111:3:1;;14593:1527;-1:-1:-1;;;;;;;;;;;14593:1527:1:o;17602:168::-;17642:7;17708:1;17704;17700:6;17696:14;17693:1;17690:21;17685:1;17678:9;17671:17;17667:45;17664:71;;;17715:18;;:::i;:::-;-1:-1:-1;17755:9:1;;17602:168::o;19350:414::-;19552:2;19534:21;;;19591:2;19571:18;;;19564:30;19630:34;19625:2;19610:18;;19603:62;-1:-1:-1;;;19696:2:1;19681:18;;19674:48;19754:3;19739:19;;19350:414::o;19769:127::-;19830:10;19825:3;19821:20;19818:1;19811:31;19861:4;19858:1;19851:15;19885:4;19882:1;19875:15;19901:120;19941:1;19967;19957:35;;19972:18;;:::i;:::-;-1:-1:-1;20006:9:1;;19901:120::o;20026:112::-;20058:1;20084;20074:35;;20089:18;;:::i;:::-;-1:-1:-1;20123:9:1;;20026:112::o;20143:489::-;-1:-1:-1;;;;;20412:15:1;;;20394:34;;20464:15;;20459:2;20444:18;;20437:43;20511:2;20496:18;;20489:34;;;20559:3;20554:2;20539:18;;20532:31;;;20337:4;;20580:46;;20606:19;;20598:6;20580:46;:::i;:::-;20572:54;20143:489;-1:-1:-1;;;;;;20143:489:1:o;20637:249::-;20706:6;20759:2;20747:9;20738:7;20734:23;20730:32;20727:52;;;20775:1;20772;20765:12;20727:52;20807:9;20801:16;20826:30;20850:5;20826:30;:::i;20891:127::-;20952:10;20947:3;20943:20;20940:1;20933:31;20983:4;20980:1;20973:15;21007:4;21004:1;20997:15
Swarm Source
ipfs://33c8c043ef49f5309f2be77dfd39cdc877bea1bd3c292fd0f445355c94dbe685
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.