ERC-721
Overview
Max Total Supply
1,660 POT
Holders
752
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 POTLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
FatApePotion
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-01 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: ERC721A.sol // Creator: Chiru Labs pragma solidity ^0.8.0; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex = 1; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Type of potions enum PotionType { NONE, RED, BLUE, GREEN, PURPLE } // Keep track of what type the potion was assigned mapping(uint256 => PotionType) public potionStorage; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 1; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } function getPotionType(uint256 index) internal view returns (string memory) { if(potionStorage[index] == PotionType.BLUE) return "BLUE"; if(potionStorage[index] == PotionType.RED) return "RED"; if(potionStorage[index] == PotionType.GREEN) return "GREEN"; if(potionStorage[index] == PotionType.PURPLE) return "PURPLE"; return ""; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, getPotionType(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint8[] calldata _potionTypes, uint256 quantity) internal { _safeMint(to, _potionTypes, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint8[] calldata _potionTypes, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; uint256 arrayIndex = 0; if (to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { potionStorage[updatedIndex] = PotionType(_potionTypes[arrayIndex++]); emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } function _setPotionType(uint256 index, uint256 potionType) internal { potionStorage[index] = PotionType(potionType); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: Potion.sol pragma solidity ^0.8.0; contract FatApePotion is ERC721A, Ownable { using Strings for uint256; address public signer; address private villanContract; uint256 public maxSupply; bool public paused; string public uriPrefix = ''; mapping(address => bool) public potionsClaimed; constructor( string memory _tokenName, string memory _tokenSymbol, string memory _uriPrefix, uint256 _maxSupply, address _signer ) ERC721A(_tokenName, _tokenSymbol) { maxSupply = _maxSupply; signer = _signer; paused = false; uriPrefix = _uriPrefix; } modifier mintCompliance(uint256 _mintAmount) { require(_mintAmount > 0, 'Invalid mint amount!'); require(totalSupply() + _mintAmount <= maxSupply, 'Max supply exceeded!'); _; } function mint(uint256 _amount, uint8[] calldata _potionTypes, bytes memory _sig) public mintCompliance(_amount) { require(!paused, 'The mint is currently not active!'); require(verifyClaim(signer, _msgSender(), _amount, _potionTypes, _sig), 'Invalid proof!'); require(!potionsClaimed[_msgSender()], 'Address already claimed!'); potionsClaimed[_msgSender()] = true; _safeMint(_msgSender(), _potionTypes, _amount); } function burnPotion(uint256 potionId) external { require(msg.sender == villanContract, "Invalid burner address"); _burn(potionId); } function getTotalSupply() public view returns (string memory) { return totalSupply().toString(); } function getPotion(uint256 index) public view returns (string memory) { return getPotionType(index); } function setVillanContractAddress(address _contract) external onlyOwner { villanContract = _contract; } function setSigner(address _address) public onlyOwner { signer = _address; } function setMaxSupply(uint _supply) public onlyOwner { maxSupply = _supply; } function setPauseState(bool _state) public onlyOwner { paused = _state; } function setUriPrefix(string memory _uriPrefix) public onlyOwner { uriPrefix = _uriPrefix; } function _baseURI() internal view virtual override returns (string memory) { return uriPrefix; } function verifyClaim(address _signer, address reciver, uint256 _amount, uint8[] calldata _potionTypes, bytes memory _sig) internal pure returns (bool) { bytes32 messageHash = getMessageHash(reciver, _amount, _potionTypes); bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash); return recover(ethSignedMessageHash, _sig) == _signer; } function getMessageHash(address reciver, uint256 _amount, uint8[] calldata _potionTypes) internal pure returns (bytes32){ return keccak256(abi.encodePacked(reciver, _amount, _potionTypes)); } function getEthSignedMessageHash(bytes32 messageHash) internal pure returns (bytes32){ return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", messageHash)); } function recover(bytes32 _ethSignedMessageHash, bytes memory _sig) internal pure returns (address){ (bytes32 r, bytes32 s, uint8 v) = _split(_sig); return ecrecover(_ethSignedMessageHash, v, r, s); } function _split(bytes memory _sig) internal pure returns (bytes32 r, bytes32 s, uint8 v){ require(_sig.length == 65, "Invalid signature length"); assembly { r := mload(add(_sig, 32)) s := mload(add(_sig, 64)) v := byte(0, mload(add(_sig, 96))) } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"string","name":"_uriPrefix","type":"string"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"address","name":"_signer","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"potionId","type":"uint256"}],"name":"burnPotion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getPotion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalSupply","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint8[]","name":"_potionTypes","type":"uint8[]"},{"internalType":"bytes","name":"_sig","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"potionStorage","outputs":[{"internalType":"enum ERC721A.PotionType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"potionsClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPauseState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"setVillanContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6001600090815560a0604081905260808290526200002191600e919062000131565b503480156200002f57600080fd5b5060405162002526380380620025268339810160408190526200005291620002a4565b8451859085906200006b90600290602085019062000131565b5080516200008190600390602084019062000131565b50506001600055506200009433620000df565b600c829055600a80546001600160a01b0319166001600160a01b038316179055600d805460ff191690558251620000d390600e90602086019062000131565b5050505050506200039f565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200013f9062000363565b90600052602060002090601f016020900481019282620001635760008555620001ae565b82601f106200017e57805160ff1916838001178555620001ae565b82800160010185558215620001ae579182015b82811115620001ae57825182559160200191906001019062000191565b50620001bc929150620001c0565b5090565b5b80821115620001bc5760008155600101620001c1565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001ff57600080fd5b81516001600160401b03808211156200021c576200021c620001d7565b604051601f8301601f19908116603f01168101908282118183101715620002475762000247620001d7565b816040528381526020925086838588010111156200026457600080fd5b600091505b8382101562000288578582018301518183018401529082019062000269565b838211156200029a5760008385830101525b9695505050505050565b600080600080600060a08688031215620002bd57600080fd5b85516001600160401b0380821115620002d557600080fd5b620002e389838a01620001ed565b96506020880151915080821115620002fa57600080fd5b6200030889838a01620001ed565b955060408801519150808211156200031f57600080fd5b506200032e88828901620001ed565b60608801516080890151919550935090506001600160a01b03811681146200035557600080fd5b809150509295509295909350565b600181811c908216806200037857607f821691505b6020821081036200039957634e487b7160e01b600052602260045260246000fd5b50919050565b61217780620003af6000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c8063715018a61161010f578063c4e41b22116100a2578063d5abeb0111610071578063d5abeb011461043a578063e985e9c514610443578063f2fde38b1461047f578063f3cba9801461049257600080fd5b8063c4e41b22146103f9578063c87b56dd14610401578063cdb88ad114610414578063d0efc0b71461042757600080fd5b80639d7c2770116100de5780639d7c2770146103ad5780639fe6990e146103c0578063a22cb465146103d3578063b88d4fde146103e657600080fd5b8063715018a6146103795780637ec4a659146103815780638da5cb5b1461039457806395d89b41146103a557600080fd5b806342842e0e116101875780636352211e116101565780636352211e1461032d5780636c19e783146103405780636f8b44b01461035357806370a082311461036657600080fd5b806342842e0e146102e25780634e85b407146102f55780635c975abb1461031857806362b99ad41461032557600080fd5b806318160ddd116101c357806318160ddd14610272578063232b09871461028c578063238ac933146102bc57806323b872dd146102cf57600080fd5b806301ffc9a7146101f557806306fdde031461021d578063081812fc14610232578063095ea7b31461025d575b600080fd5b610208610203366004611afb565b6104a5565b60405190151581526020015b60405180910390f35b6102256104f7565b6040516102149190611b70565b610245610240366004611b83565b610589565b6040516001600160a01b039091168152602001610214565b61027061026b366004611bb8565b6105cd565b005b60015460005403600019015b604051908152602001610214565b6102af61029a366004611b83565b60046020526000908152604090205460ff1681565b6040516102149190611bf8565b600a54610245906001600160a01b031681565b6102706102dd366004611c20565b61065a565b6102706102f0366004611c20565b610665565b610208610303366004611c5c565b600f6020526000908152604090205460ff1681565b600d546102089060ff1681565b610225610680565b61024561033b366004611b83565b61070e565b61027061034e366004611c5c565b610720565b610270610361366004611b83565b610775565b61027e610374366004611c5c565b6107a4565b6102706107f2565b61027061038f366004611d02565b610828565b6009546001600160a01b0316610245565b610225610869565b6102256103bb366004611b83565b610878565b6102706103ce366004611c5c565b610883565b6102706103e1366004611d5a565b6108cf565b6102706103f4366004611dad565b610964565b6102256109b5565b61022561040f366004611b83565b6109d1565b610270610422366004611e14565b610a55565b610270610435366004611e2f565b610a92565b61027e600c5481565b610208610451366004611ec6565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b61027061048d366004611c5c565b610c7b565b6102706104a0366004611b83565b610d16565b60006001600160e01b031982166380ac58cd60e01b14806104d657506001600160e01b03198216635b5e139f60e01b145b806104f157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461050690611ef0565b80601f016020809104026020016040519081016040528092919081815260200182805461053290611ef0565b801561057f5780601f106105545761010080835404028352916020019161057f565b820191906000526020600020905b81548152906001019060200180831161056257829003601f168201915b5050505050905090565b600061059482610d72565b6105b1576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b60006105d88261070e565b9050806001600160a01b0316836001600160a01b03160361060c5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061062c575061062a8133610451565b155b1561064a576040516367d9dca160e11b815260040160405180910390fd5b610655838383610dab565b505050565b610655838383610e07565b61065583838360405180602001604052806000815250610964565b600e805461068d90611ef0565b80601f01602080910402602001604051908101604052809291908181526020018280546106b990611ef0565b80156107065780601f106106db57610100808354040283529160200191610706565b820191906000526020600020905b8154815290600101906020018083116106e957829003601f168201915b505050505081565b600061071982610fe0565b5192915050565b6009546001600160a01b031633146107535760405162461bcd60e51b815260040161074a90611f2a565b60405180910390fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b0316331461079f5760405162461bcd60e51b815260040161074a90611f2a565b600c55565b60006001600160a01b0382166107cd576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b6009546001600160a01b0316331461081c5760405162461bcd60e51b815260040161074a90611f2a565b6108266000611107565b565b6009546001600160a01b031633146108525760405162461bcd60e51b815260040161074a90611f2a565b805161086590600e906020840190611a4c565b5050565b60606003805461050690611ef0565b60606104f182611159565b6009546001600160a01b031633146108ad5760405162461bcd60e51b815260040161074a90611f2a565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b336001600160a01b038316036108f85760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61096f848484610e07565b6001600160a01b0383163b15158015610991575061098f8484848461129f565b155b156109af576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6001546000546060916109cc91036000190161138b565b905090565b60606109dc82610d72565b6109f957604051630a14c4b560e41b815260040160405180910390fd5b6000610a0361148b565b90508051600003610a235760405180602001604052806000815250610a4e565b80610a2d84611159565b604051602001610a3e929190611f5f565b6040516020818303038152906040525b9392505050565b6009546001600160a01b03163314610a7f5760405162461bcd60e51b815260040161074a90611f2a565b600d805460ff1916911515919091179055565b8360008111610ada5760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206d696e7420616d6f756e742160601b604482015260640161074a565b600c546001546000548391900360001901610af59190611fa4565b1115610b3a5760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b604482015260640161074a565b600d5460ff1615610b975760405162461bcd60e51b815260206004820152602160248201527f546865206d696e742069732063757272656e746c79206e6f74206163746976656044820152602160f81b606482015260840161074a565b600a54610bb1906001600160a01b0316338787878761149a565b610bee5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b604482015260640161074a565b336000908152600f602052604090205460ff1615610c4e5760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c726561647920636c61696d6564210000000000000000604482015260640161074a565b336000818152600f60205260409020805460ff19166001179055610c7490858588611531565b5050505050565b6009546001600160a01b03163314610ca55760405162461bcd60e51b815260040161074a90611f2a565b6001600160a01b038116610d0a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161074a565b610d1381611107565b50565b600b546001600160a01b03163314610d695760405162461bcd60e51b8152602060048201526016602482015275496e76616c6964206275726e6572206164647265737360501b604482015260640161074a565b610d138161154d565b600081600111158015610d86575060005482105b80156104f1575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000610e1282610fe0565b9050836001600160a01b031681600001516001600160a01b031614610e495760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480610e675750610e678533610451565b80610e82575033610e7784610589565b6001600160a01b0316145b905080610ea257604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416610ec957604051633a954ecd60e21b815260040160405180910390fd5b610ed560008487610dab565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116610fa9576000548214610fa957805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b031660008051602061212283398151915260405160405180910390a4610c74565b60408051606081018252600080825260208201819052918101919091528180600111158015611010575060005481105b156110ee57600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906110ec5780516001600160a01b031615611083579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156110e7579392505050565b611083565b505b604051636f96cda160e11b815260040160405180910390fd5b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060600260008381526004602081905260409091205460ff169081111561118257611182611be2565b036111a7575050604080518082019091526004815263424c554560e01b602082015290565b600160008381526004602081905260409091205460ff16908111156111ce576111ce611be2565b036111f257505060408051808201909152600381526214915160ea1b602082015290565b600360008381526004602081905260409091205460ff169081111561121957611219611be2565b0361123f57505060408051808201909152600581526423a922a2a760d91b602082015290565b60008281526004602081905260409091205460ff168181111561126457611264611be2565b0361128b575050604080518082019091526006815265505552504c4560d01b602082015290565b505060408051602081019091526000815290565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906112d4903390899088908890600401611fbc565b6020604051808303816000875af192505050801561130f575060408051601f3d908101601f1916820190925261130c91810190611ff9565b60015b61136d573d80801561133d576040519150601f19603f3d011682016040523d82523d6000602084013e611342565b606091505b508051600003611365576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816000036113b25750506040805180820190915260018152600360fc1b602082015290565b8160005b81156113dc57806113c681612016565b91506113d59050600a83612045565b91506113b6565b6000816001600160401b038111156113f6576113f6611c77565b6040519080825280601f01601f191660200182016040528015611420576020820181803683370190505b5090505b841561138357611435600183612059565b9150611442600a86612070565b61144d906030611fa4565b60f81b81838151811061146257611462612084565b60200101906001600160f81b031916908160001a905350611484600a86612045565b9450611424565b6060600e805461050690611ef0565b6000806114a987878787611558565b90506000611504826040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050886001600160a01b031661151a8286611591565b6001600160a01b0316149998505050505050505050565b6109af8484848460405180602001604052806000815250611610565b610d13816000611825565b60008484848460405160200161157194939291906120ab565b604051602081830303815290604052805190602001209050949350505050565b6000806000806115a0856119d8565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa1580156115fb573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b6000546001600160a01b03861661163957604051622e076360e81b815260040160405180910390fd5b8260000361165a5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038616600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b018116909202179091558584526005909252822080546001600160e01b0319168417600160a01b4290931692909202919091179055829182860191903b15611770575b60405183906001600160a01b038b1690600090600080516020612122833981519152908290a461173960008a858060010196508861129f565b611756576040516368d2bf6b60e11b815260040160405180910390fd5b81830361170057836000541461176b57600080fd5b611818565b87878280600101935081811061178857611788612084565b905060200201602081019061179d9190612106565b60ff1660048111156117b1576117b1611be2565b60008481526004602081905260409091208054909160ff199091169060019084908111156117e1576117e1611be2565b02179055506040516001840193906001600160a01b038b1690600090600080516020612122833981519152908290a4818303611770575b5050600055505050505050565b600061183083610fe0565b80519091508215611896576000336001600160a01b038316148061185957506118598233610451565b8061187457503361186986610589565b6001600160a01b0316145b90508061189457604051632ce44b5f60e11b815260040160405180910390fd5b505b6118a260008583610dab565b6001600160a01b0380821660008181526006602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526005909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b1785559189018084529220805491949091166119a05760005482146119a057805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b03841690600080516020612122833981519152908390a4505060018054810190555050565b60008060008351604114611a2e5760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207369676e6174757265206c656e6774680000000000000000604482015260640161074a565b50505060208101516040820151606090920151909260009190911a90565b828054611a5890611ef0565b90600052602060002090601f016020900481019282611a7a5760008555611ac0565b82601f10611a9357805160ff1916838001178555611ac0565b82800160010185558215611ac0579182015b82811115611ac0578251825591602001919060010190611aa5565b50611acc929150611ad0565b5090565b5b80821115611acc5760008155600101611ad1565b6001600160e01b031981168114610d1357600080fd5b600060208284031215611b0d57600080fd5b8135610a4e81611ae5565b60005b83811015611b33578181015183820152602001611b1b565b838111156109af5750506000910152565b60008151808452611b5c816020860160208601611b18565b601f01601f19169290920160200192915050565b602081526000610a4e6020830184611b44565b600060208284031215611b9557600080fd5b5035919050565b80356001600160a01b0381168114611bb357600080fd5b919050565b60008060408385031215611bcb57600080fd5b611bd483611b9c565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b6020810160058310611c1a57634e487b7160e01b600052602160045260246000fd5b91905290565b600080600060608486031215611c3557600080fd5b611c3e84611b9c565b9250611c4c60208501611b9c565b9150604084013590509250925092565b600060208284031215611c6e57600080fd5b610a4e82611b9c565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b0380841115611ca757611ca7611c77565b604051601f8501601f19908116603f01168101908282118183101715611ccf57611ccf611c77565b81604052809350858152868686011115611ce857600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611d1457600080fd5b81356001600160401b03811115611d2a57600080fd5b8201601f81018413611d3b57600080fd5b61138384823560208401611c8d565b80358015158114611bb357600080fd5b60008060408385031215611d6d57600080fd5b611d7683611b9c565b9150611d8460208401611d4a565b90509250929050565b600082601f830112611d9e57600080fd5b610a4e83833560208501611c8d565b60008060008060808587031215611dc357600080fd5b611dcc85611b9c565b9350611dda60208601611b9c565b92506040850135915060608501356001600160401b03811115611dfc57600080fd5b611e0887828801611d8d565b91505092959194509250565b600060208284031215611e2657600080fd5b610a4e82611d4a565b60008060008060608587031215611e4557600080fd5b8435935060208501356001600160401b0380821115611e6357600080fd5b818701915087601f830112611e7757600080fd5b813581811115611e8657600080fd5b8860208260051b8501011115611e9b57600080fd5b602083019550809450506040870135915080821115611eb957600080fd5b50611e0887828801611d8d565b60008060408385031215611ed957600080fd5b611ee283611b9c565b9150611d8460208401611b9c565b600181811c90821680611f0457607f821691505b602082108103611f2457634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008351611f71818460208801611b18565b835190830190611f85818360208801611b18565b01949350505050565b634e487b7160e01b600052601160045260246000fd5b60008219821115611fb757611fb7611f8e565b500190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611fef90830184611b44565b9695505050505050565b60006020828403121561200b57600080fd5b8151610a4e81611ae5565b60006001820161202857612028611f8e565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826120545761205461202f565b500490565b60008282101561206b5761206b611f8e565b500390565b60008261207f5761207f61202f565b500690565b634e487b7160e01b600052603260045260246000fd5b803560ff81168114611bb357600080fd5b6bffffffffffffffffffffffff198560601b1681528360148201526000603482018460005b858110156120f95760ff6120e38361209a565b16835260209283019291909101906001016120d0565b5090979650505050505050565b60006020828403121561211857600080fd5b610a4e8261209a56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220284b743efa3275cbccfab6444965ae3bbb57d25b78710fc7167c0b336fededc564736f6c634300080d003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000a8c000000000000000000000000ef23dc701b911c0f353091232a0d0389c90e7c400000000000000000000000000000000000000000000000000000000000000006504f54494f4e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003504f5400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5075576f634a31673657384e61434261626747623278396e516f3331777245644c754569564570594e7a44692f00000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101f05760003560e01c8063715018a61161010f578063c4e41b22116100a2578063d5abeb0111610071578063d5abeb011461043a578063e985e9c514610443578063f2fde38b1461047f578063f3cba9801461049257600080fd5b8063c4e41b22146103f9578063c87b56dd14610401578063cdb88ad114610414578063d0efc0b71461042757600080fd5b80639d7c2770116100de5780639d7c2770146103ad5780639fe6990e146103c0578063a22cb465146103d3578063b88d4fde146103e657600080fd5b8063715018a6146103795780637ec4a659146103815780638da5cb5b1461039457806395d89b41146103a557600080fd5b806342842e0e116101875780636352211e116101565780636352211e1461032d5780636c19e783146103405780636f8b44b01461035357806370a082311461036657600080fd5b806342842e0e146102e25780634e85b407146102f55780635c975abb1461031857806362b99ad41461032557600080fd5b806318160ddd116101c357806318160ddd14610272578063232b09871461028c578063238ac933146102bc57806323b872dd146102cf57600080fd5b806301ffc9a7146101f557806306fdde031461021d578063081812fc14610232578063095ea7b31461025d575b600080fd5b610208610203366004611afb565b6104a5565b60405190151581526020015b60405180910390f35b6102256104f7565b6040516102149190611b70565b610245610240366004611b83565b610589565b6040516001600160a01b039091168152602001610214565b61027061026b366004611bb8565b6105cd565b005b60015460005403600019015b604051908152602001610214565b6102af61029a366004611b83565b60046020526000908152604090205460ff1681565b6040516102149190611bf8565b600a54610245906001600160a01b031681565b6102706102dd366004611c20565b61065a565b6102706102f0366004611c20565b610665565b610208610303366004611c5c565b600f6020526000908152604090205460ff1681565b600d546102089060ff1681565b610225610680565b61024561033b366004611b83565b61070e565b61027061034e366004611c5c565b610720565b610270610361366004611b83565b610775565b61027e610374366004611c5c565b6107a4565b6102706107f2565b61027061038f366004611d02565b610828565b6009546001600160a01b0316610245565b610225610869565b6102256103bb366004611b83565b610878565b6102706103ce366004611c5c565b610883565b6102706103e1366004611d5a565b6108cf565b6102706103f4366004611dad565b610964565b6102256109b5565b61022561040f366004611b83565b6109d1565b610270610422366004611e14565b610a55565b610270610435366004611e2f565b610a92565b61027e600c5481565b610208610451366004611ec6565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b61027061048d366004611c5c565b610c7b565b6102706104a0366004611b83565b610d16565b60006001600160e01b031982166380ac58cd60e01b14806104d657506001600160e01b03198216635b5e139f60e01b145b806104f157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461050690611ef0565b80601f016020809104026020016040519081016040528092919081815260200182805461053290611ef0565b801561057f5780601f106105545761010080835404028352916020019161057f565b820191906000526020600020905b81548152906001019060200180831161056257829003601f168201915b5050505050905090565b600061059482610d72565b6105b1576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b60006105d88261070e565b9050806001600160a01b0316836001600160a01b03160361060c5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061062c575061062a8133610451565b155b1561064a576040516367d9dca160e11b815260040160405180910390fd5b610655838383610dab565b505050565b610655838383610e07565b61065583838360405180602001604052806000815250610964565b600e805461068d90611ef0565b80601f01602080910402602001604051908101604052809291908181526020018280546106b990611ef0565b80156107065780601f106106db57610100808354040283529160200191610706565b820191906000526020600020905b8154815290600101906020018083116106e957829003601f168201915b505050505081565b600061071982610fe0565b5192915050565b6009546001600160a01b031633146107535760405162461bcd60e51b815260040161074a90611f2a565b60405180910390fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b0316331461079f5760405162461bcd60e51b815260040161074a90611f2a565b600c55565b60006001600160a01b0382166107cd576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b6009546001600160a01b0316331461081c5760405162461bcd60e51b815260040161074a90611f2a565b6108266000611107565b565b6009546001600160a01b031633146108525760405162461bcd60e51b815260040161074a90611f2a565b805161086590600e906020840190611a4c565b5050565b60606003805461050690611ef0565b60606104f182611159565b6009546001600160a01b031633146108ad5760405162461bcd60e51b815260040161074a90611f2a565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b336001600160a01b038316036108f85760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61096f848484610e07565b6001600160a01b0383163b15158015610991575061098f8484848461129f565b155b156109af576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6001546000546060916109cc91036000190161138b565b905090565b60606109dc82610d72565b6109f957604051630a14c4b560e41b815260040160405180910390fd5b6000610a0361148b565b90508051600003610a235760405180602001604052806000815250610a4e565b80610a2d84611159565b604051602001610a3e929190611f5f565b6040516020818303038152906040525b9392505050565b6009546001600160a01b03163314610a7f5760405162461bcd60e51b815260040161074a90611f2a565b600d805460ff1916911515919091179055565b8360008111610ada5760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206d696e7420616d6f756e742160601b604482015260640161074a565b600c546001546000548391900360001901610af59190611fa4565b1115610b3a5760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b604482015260640161074a565b600d5460ff1615610b975760405162461bcd60e51b815260206004820152602160248201527f546865206d696e742069732063757272656e746c79206e6f74206163746976656044820152602160f81b606482015260840161074a565b600a54610bb1906001600160a01b0316338787878761149a565b610bee5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b604482015260640161074a565b336000908152600f602052604090205460ff1615610c4e5760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c726561647920636c61696d6564210000000000000000604482015260640161074a565b336000818152600f60205260409020805460ff19166001179055610c7490858588611531565b5050505050565b6009546001600160a01b03163314610ca55760405162461bcd60e51b815260040161074a90611f2a565b6001600160a01b038116610d0a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161074a565b610d1381611107565b50565b600b546001600160a01b03163314610d695760405162461bcd60e51b8152602060048201526016602482015275496e76616c6964206275726e6572206164647265737360501b604482015260640161074a565b610d138161154d565b600081600111158015610d86575060005482105b80156104f1575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000610e1282610fe0565b9050836001600160a01b031681600001516001600160a01b031614610e495760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480610e675750610e678533610451565b80610e82575033610e7784610589565b6001600160a01b0316145b905080610ea257604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416610ec957604051633a954ecd60e21b815260040160405180910390fd5b610ed560008487610dab565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116610fa9576000548214610fa957805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b031660008051602061212283398151915260405160405180910390a4610c74565b60408051606081018252600080825260208201819052918101919091528180600111158015611010575060005481105b156110ee57600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906110ec5780516001600160a01b031615611083579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156110e7579392505050565b611083565b505b604051636f96cda160e11b815260040160405180910390fd5b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060600260008381526004602081905260409091205460ff169081111561118257611182611be2565b036111a7575050604080518082019091526004815263424c554560e01b602082015290565b600160008381526004602081905260409091205460ff16908111156111ce576111ce611be2565b036111f257505060408051808201909152600381526214915160ea1b602082015290565b600360008381526004602081905260409091205460ff169081111561121957611219611be2565b0361123f57505060408051808201909152600581526423a922a2a760d91b602082015290565b60008281526004602081905260409091205460ff168181111561126457611264611be2565b0361128b575050604080518082019091526006815265505552504c4560d01b602082015290565b505060408051602081019091526000815290565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906112d4903390899088908890600401611fbc565b6020604051808303816000875af192505050801561130f575060408051601f3d908101601f1916820190925261130c91810190611ff9565b60015b61136d573d80801561133d576040519150601f19603f3d011682016040523d82523d6000602084013e611342565b606091505b508051600003611365576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816000036113b25750506040805180820190915260018152600360fc1b602082015290565b8160005b81156113dc57806113c681612016565b91506113d59050600a83612045565b91506113b6565b6000816001600160401b038111156113f6576113f6611c77565b6040519080825280601f01601f191660200182016040528015611420576020820181803683370190505b5090505b841561138357611435600183612059565b9150611442600a86612070565b61144d906030611fa4565b60f81b81838151811061146257611462612084565b60200101906001600160f81b031916908160001a905350611484600a86612045565b9450611424565b6060600e805461050690611ef0565b6000806114a987878787611558565b90506000611504826040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050886001600160a01b031661151a8286611591565b6001600160a01b0316149998505050505050505050565b6109af8484848460405180602001604052806000815250611610565b610d13816000611825565b60008484848460405160200161157194939291906120ab565b604051602081830303815290604052805190602001209050949350505050565b6000806000806115a0856119d8565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa1580156115fb573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b6000546001600160a01b03861661163957604051622e076360e81b815260040160405180910390fd5b8260000361165a5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038616600081815260066020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168b0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168b018116909202179091558584526005909252822080546001600160e01b0319168417600160a01b4290931692909202919091179055829182860191903b15611770575b60405183906001600160a01b038b1690600090600080516020612122833981519152908290a461173960008a858060010196508861129f565b611756576040516368d2bf6b60e11b815260040160405180910390fd5b81830361170057836000541461176b57600080fd5b611818565b87878280600101935081811061178857611788612084565b905060200201602081019061179d9190612106565b60ff1660048111156117b1576117b1611be2565b60008481526004602081905260409091208054909160ff199091169060019084908111156117e1576117e1611be2565b02179055506040516001840193906001600160a01b038b1690600090600080516020612122833981519152908290a4818303611770575b5050600055505050505050565b600061183083610fe0565b80519091508215611896576000336001600160a01b038316148061185957506118598233610451565b8061187457503361186986610589565b6001600160a01b0316145b90508061189457604051632ce44b5f60e11b815260040160405180910390fd5b505b6118a260008583610dab565b6001600160a01b0380821660008181526006602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526005909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b1785559189018084529220805491949091166119a05760005482146119a057805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b03841690600080516020612122833981519152908390a4505060018054810190555050565b60008060008351604114611a2e5760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207369676e6174757265206c656e6774680000000000000000604482015260640161074a565b50505060208101516040820151606090920151909260009190911a90565b828054611a5890611ef0565b90600052602060002090601f016020900481019282611a7a5760008555611ac0565b82601f10611a9357805160ff1916838001178555611ac0565b82800160010185558215611ac0579182015b82811115611ac0578251825591602001919060010190611aa5565b50611acc929150611ad0565b5090565b5b80821115611acc5760008155600101611ad1565b6001600160e01b031981168114610d1357600080fd5b600060208284031215611b0d57600080fd5b8135610a4e81611ae5565b60005b83811015611b33578181015183820152602001611b1b565b838111156109af5750506000910152565b60008151808452611b5c816020860160208601611b18565b601f01601f19169290920160200192915050565b602081526000610a4e6020830184611b44565b600060208284031215611b9557600080fd5b5035919050565b80356001600160a01b0381168114611bb357600080fd5b919050565b60008060408385031215611bcb57600080fd5b611bd483611b9c565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b6020810160058310611c1a57634e487b7160e01b600052602160045260246000fd5b91905290565b600080600060608486031215611c3557600080fd5b611c3e84611b9c565b9250611c4c60208501611b9c565b9150604084013590509250925092565b600060208284031215611c6e57600080fd5b610a4e82611b9c565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b0380841115611ca757611ca7611c77565b604051601f8501601f19908116603f01168101908282118183101715611ccf57611ccf611c77565b81604052809350858152868686011115611ce857600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611d1457600080fd5b81356001600160401b03811115611d2a57600080fd5b8201601f81018413611d3b57600080fd5b61138384823560208401611c8d565b80358015158114611bb357600080fd5b60008060408385031215611d6d57600080fd5b611d7683611b9c565b9150611d8460208401611d4a565b90509250929050565b600082601f830112611d9e57600080fd5b610a4e83833560208501611c8d565b60008060008060808587031215611dc357600080fd5b611dcc85611b9c565b9350611dda60208601611b9c565b92506040850135915060608501356001600160401b03811115611dfc57600080fd5b611e0887828801611d8d565b91505092959194509250565b600060208284031215611e2657600080fd5b610a4e82611d4a565b60008060008060608587031215611e4557600080fd5b8435935060208501356001600160401b0380821115611e6357600080fd5b818701915087601f830112611e7757600080fd5b813581811115611e8657600080fd5b8860208260051b8501011115611e9b57600080fd5b602083019550809450506040870135915080821115611eb957600080fd5b50611e0887828801611d8d565b60008060408385031215611ed957600080fd5b611ee283611b9c565b9150611d8460208401611b9c565b600181811c90821680611f0457607f821691505b602082108103611f2457634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008351611f71818460208801611b18565b835190830190611f85818360208801611b18565b01949350505050565b634e487b7160e01b600052601160045260246000fd5b60008219821115611fb757611fb7611f8e565b500190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611fef90830184611b44565b9695505050505050565b60006020828403121561200b57600080fd5b8151610a4e81611ae5565b60006001820161202857612028611f8e565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826120545761205461202f565b500490565b60008282101561206b5761206b611f8e565b500390565b60008261207f5761207f61202f565b500690565b634e487b7160e01b600052603260045260246000fd5b803560ff81168114611bb357600080fd5b6bffffffffffffffffffffffff198560601b1681528360148201526000603482018460005b858110156120f95760ff6120e38361209a565b16835260209283019291909101906001016120d0565b5090979650505050505050565b60006020828403121561211857600080fd5b610a4e8261209a56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220284b743efa3275cbccfab6444965ae3bbb57d25b78710fc7167c0b336fededc564736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000a8c000000000000000000000000ef23dc701b911c0f353091232a0d0389c90e7c400000000000000000000000000000000000000000000000000000000000000006504f54494f4e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003504f5400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5075576f634a31673657384e61434261626747623278396e516f3331777245644c754569564570594e7a44692f00000000000000000000
-----Decoded View---------------
Arg [0] : _tokenName (string): POTION
Arg [1] : _tokenSymbol (string): POT
Arg [2] : _uriPrefix (string): ipfs://QmPuWocJ1g6W8NaCBabgGb2x9nQo31wrEdLuEiVEpYNzDi/
Arg [3] : _maxSupply (uint256): 2700
Arg [4] : _signer (address): 0xef23DC701b911C0f353091232A0D0389c90e7c40
-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000a8c
Arg [4] : 000000000000000000000000ef23dc701b911c0f353091232a0d0389c90e7c40
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [6] : 504f54494f4e0000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [8] : 504f540000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [10] : 697066733a2f2f516d5075576f634a31673657384e6143426162674762327839
Arg [11] : 6e516f3331777245644c754569564570594e7a44692f00000000000000000000
Deployed Bytecode Sourcemap
46872:3596:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27197:305;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;27197:305:0;;;;;;;;30760:100;;;:::i;:::-;;;;;;;:::i;32267:204::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;32267:204:0;1528:203:1;31830:371:0;;;;;;:::i;:::-;;:::i;:::-;;26446:303;26303:1;26700:12;26490:7;26684:13;:28;-1:-1:-1;;26684:46:0;26446:303;;;2319:25:1;;;2307:2;2292:18;26446:303:0;2173:177:1;25317:51:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;46955:21::-;;;;;-1:-1:-1;;;;;46955:21:0;;;33132:170;;;;;;:::i;:::-;;:::i;33373:185::-;;;;;;:::i;:::-;;:::i;47113:46::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;47053:18;;;;;;;;;47078:28;;;:::i;30568:125::-;;;;;;:::i;:::-;;:::i;48679:86::-;;;;;;:::i;:::-;;:::i;48771:91::-;;;;;;:::i;:::-;;:::i;27566:206::-;;;;;;:::i;:::-;;:::i;4763:103::-;;;:::i;48961:100::-;;;;;;:::i;:::-;;:::i;4112:87::-;4185:6;;-1:-1:-1;;;;;4185:6:0;4112:87;;30929:104;;;:::i;48443:110::-;;;;;;:::i;:::-;;:::i;48559:114::-;;;;;;:::i;:::-;;:::i;32543:287::-;;;;;;:::i;:::-;;:::i;33629:369::-;;;;;;:::i;:::-;;:::i;48331:106::-;;;:::i;31104:322::-;;;;;;:::i;:::-;;:::i;48868:87::-;;;;;;:::i;:::-;;:::i;47715:444::-;;;;;;:::i;:::-;;:::i;47022:24::-;;;;;;32901:164;;;;;;:::i;:::-;-1:-1:-1;;;;;33022:25:0;;;32998:4;33022:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;32901:164;5021:201;;;;;;:::i;:::-;;:::i;48165:160::-;;;;;;:::i;:::-;;:::i;27197:305::-;27299:4;-1:-1:-1;;;;;;27336:40:0;;-1:-1:-1;;;27336:40:0;;:105;;-1:-1:-1;;;;;;;27393:48:0;;-1:-1:-1;;;27393:48:0;27336:105;:158;;;-1:-1:-1;;;;;;;;;;17005:40:0;;;27458:36;27316:178;27197:305;-1:-1:-1;;27197:305:0:o;30760:100::-;30814:13;30847:5;30840:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30760:100;:::o;32267:204::-;32335:7;32360:16;32368:7;32360;:16::i;:::-;32355:64;;32385:34;;-1:-1:-1;;;32385:34:0;;;;;;;;;;;32355:64;-1:-1:-1;32439:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;32439:24:0;;32267:204::o;31830:371::-;31903:13;31919:24;31935:7;31919:15;:24::i;:::-;31903:40;;31964:5;-1:-1:-1;;;;;31958:11:0;:2;-1:-1:-1;;;;;31958:11:0;;31954:48;;31978:24;;-1:-1:-1;;;31978:24:0;;;;;;;;;;;31954:48;2916:10;-1:-1:-1;;;;;32019:21:0;;;;;;:63;;-1:-1:-1;32045:37:0;32062:5;2916:10;32901:164;:::i;32045:37::-;32044:38;32019:63;32015:138;;;32106:35;;-1:-1:-1;;;32106:35:0;;;;;;;;;;;32015:138;32165:28;32174:2;32178:7;32187:5;32165:8;:28::i;:::-;31892:309;31830:371;;:::o;33132:170::-;33266:28;33276:4;33282:2;33286:7;33266:9;:28::i;33373:185::-;33511:39;33528:4;33534:2;33538:7;33511:39;;;;;;;;;;;;:16;:39::i;47078:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30568:125::-;30632:7;30659:21;30672:7;30659:12;:21::i;:::-;:26;;30568:125;-1:-1:-1;;30568:125:0:o;48679:86::-;4185:6;;-1:-1:-1;;;;;4185:6:0;2916:10;4332:23;4324:68;;;;-1:-1:-1;;;4324:68:0;;;;;;;:::i;:::-;;;;;;;;;48742:6:::1;:17:::0;;-1:-1:-1;;;;;;48742:17:0::1;-1:-1:-1::0;;;;;48742:17:0;;;::::1;::::0;;;::::1;::::0;;48679:86::o;48771:91::-;4185:6;;-1:-1:-1;;;;;4185:6:0;2916:10;4332:23;4324:68;;;;-1:-1:-1;;;4324:68:0;;;;;;;:::i;:::-;48837:9:::1;:19:::0;48771:91::o;27566:206::-;27630:7;-1:-1:-1;;;;;27654:19:0;;27650:60;;27682:28;;-1:-1:-1;;;27682:28:0;;;;;;;;;;;27650:60;-1:-1:-1;;;;;;27736:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;27736:27:0;;27566:206::o;4763:103::-;4185:6;;-1:-1:-1;;;;;4185:6:0;2916:10;4332:23;4324:68;;;;-1:-1:-1;;;4324:68:0;;;;;;;:::i;:::-;4828:30:::1;4855:1;4828:18;:30::i;:::-;4763:103::o:0;48961:100::-;4185:6;;-1:-1:-1;;;;;4185:6:0;2916:10;4332:23;4324:68;;;;-1:-1:-1;;;4324:68:0;;;;;;;:::i;:::-;49033:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;48961:100:::0;:::o;30929:104::-;30985:13;31018:7;31011:14;;;;;:::i;48443:110::-;48498:13;48527:20;48541:5;48527:13;:20::i;48559:114::-;4185:6;;-1:-1:-1;;;;;4185:6:0;2916:10;4332:23;4324:68;;;;-1:-1:-1;;;4324:68:0;;;;;;;:::i;:::-;48641:14:::1;:26:::0;;-1:-1:-1;;;;;;48641:26:0::1;-1:-1:-1::0;;;;;48641:26:0;;;::::1;::::0;;;::::1;::::0;;48559:114::o;32543:287::-;2916:10;-1:-1:-1;;;;;32642:24:0;;;32638:54;;32675:17;;-1:-1:-1;;;32675:17:0;;;;;;;;;;;32638:54;2916:10;32705:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;32705:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;32705:53:0;;;;;;;;;;32774:48;;540:41:1;;;32705:42:0;;2916:10;32774:48;;513:18:1;32774:48:0;;;;;;;32543:287;;:::o;33629:369::-;33796:28;33806:4;33812:2;33816:7;33796:9;:28::i;:::-;-1:-1:-1;;;;;33839:13:0;;7108:19;:23;;33839:76;;;;;33859:56;33890:4;33896:2;33900:7;33909:5;33859:30;:56::i;:::-;33858:57;33839:76;33835:156;;;33939:40;;-1:-1:-1;;;33939:40:0;;;;;;;;;;;33835:156;33629:369;;;;:::o;48331:106::-;26303:1;26700:12;26490:7;26684:13;48378;;48407:24;;26684:28;-1:-1:-1;;26684:46:0;48407:22;:24::i;:::-;48400:31;;48331:106;:::o;31104:322::-;31177:13;31208:16;31216:7;31208;:16::i;:::-;31203:59;;31233:29;;-1:-1:-1;;;31233:29:0;;;;;;;;;;;31203:59;31275:21;31299:10;:8;:10::i;:::-;31275:34;;31333:7;31327:21;31352:1;31327:26;:91;;;;;;;;;;;;;;;;;31380:7;31389:22;31403:7;31389:13;:22::i;:::-;31363:49;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31327:91;31320:98;31104:322;-1:-1:-1;;;31104:322:0:o;48868:87::-;4185:6;;-1:-1:-1;;;;;4185:6:0;2916:10;4332:23;4324:68;;;;-1:-1:-1;;;4324:68:0;;;;;;;:::i;:::-;48934:6:::1;:15:::0;;-1:-1:-1;;48934:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;48868:87::o;47715:444::-;47818:7;47589:1;47575:11;:15;47567:48;;;;-1:-1:-1;;;47567:48:0;;8532:2:1;47567:48:0;;;8514:21:1;8571:2;8551:18;;;8544:30;-1:-1:-1;;;8590:18:1;;;8583:50;8650:18;;47567:48:0;8330:344:1;47567:48:0;47661:9;;26303:1;26700:12;26490:7;26684:13;47646:11;;26684:28;;-1:-1:-1;;26684:46:0;47630:27;;;;:::i;:::-;:40;;47622:73;;;;-1:-1:-1;;;47622:73:0;;9146:2:1;47622:73:0;;;9128:21:1;9185:2;9165:18;;;9158:30;-1:-1:-1;;;9204:18:1;;;9197:50;9264:18;;47622:73:0;8944:344:1;47622:73:0;47843:6:::1;::::0;::::1;;47842:7;47834:53;;;::::0;-1:-1:-1;;;47834:53:0;;9495:2:1;47834:53:0::1;::::0;::::1;9477:21:1::0;9534:2;9514:18;;;9507:30;9573:34;9553:18;;;9546:62;-1:-1:-1;;;9624:18:1;;;9617:31;9665:19;;47834:53:0::1;9293:397:1::0;47834:53:0::1;47914:6;::::0;47902:62:::1;::::0;-1:-1:-1;;;;;47914:6:0::1;2916:10:::0;47936:7:::1;47945:12;;47959:4;47902:11;:62::i;:::-;47894:89;;;::::0;-1:-1:-1;;;47894:89:0;;9897:2:1;47894:89:0::1;::::0;::::1;9879:21:1::0;9936:2;9916:18;;;9909:30;-1:-1:-1;;;9955:18:1;;;9948:44;10009:18;;47894:89:0::1;9695:338:1::0;47894:89:0::1;2916:10:::0;47999:28:::1;::::0;;;:14:::1;:28;::::0;;;;;::::1;;47998:29;47990:66;;;::::0;-1:-1:-1;;;47990:66:0;;10240:2:1;47990:66:0::1;::::0;::::1;10222:21:1::0;10279:2;10259:18;;;10252:30;10318:26;10298:18;;;10291:54;10362:18;;47990:66:0::1;10038:348:1::0;47990:66:0::1;2916:10:::0;48065:28:::1;::::0;;;:14:::1;:28;::::0;;;;:35;;-1:-1:-1;;48065:35:0::1;48096:4;48065:35;::::0;;48107:46:::1;::::0;48131:12;;48145:7;48107:9:::1;:46::i;:::-;47715:444:::0;;;;;:::o;5021:201::-;4185:6;;-1:-1:-1;;;;;4185:6:0;2916:10;4332:23;4324:68;;;;-1:-1:-1;;;4324:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5110:22:0;::::1;5102:73;;;::::0;-1:-1:-1;;;5102:73:0;;10593:2:1;5102:73:0::1;::::0;::::1;10575:21:1::0;10632:2;10612:18;;;10605:30;10671:34;10651:18;;;10644:62;-1:-1:-1;;;10722:18:1;;;10715:36;10768:19;;5102:73:0::1;10391:402:1::0;5102:73:0::1;5186:28;5205:8;5186:18;:28::i;:::-;5021:201:::0;:::o;48165:160::-;48250:14;;-1:-1:-1;;;;;48250:14:0;48236:10;:28;48228:63;;;;-1:-1:-1;;;48228:63:0;;11000:2:1;48228:63:0;;;10982:21:1;11039:2;11019:18;;;11012:30;-1:-1:-1;;;11058:18:1;;;11051:52;11120:18;;48228:63:0;10798:346:1;48228:63:0;48302:15;48308:8;48302:5;:15::i;34253:174::-;34310:4;34353:7;26303:1;34334:26;;:53;;;;;34374:13;;34364:7;:23;34334:53;:85;;;;-1:-1:-1;;34392:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;34392:27:0;;;;34391:28;;34253:174::o;43832:196::-;43947:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;43947:29:0;-1:-1:-1;;;;;43947:29:0;;;;;;;;;43992:28;;43947:24;;43992:28;;;;;;;43832:196;;;:::o;38780:2130::-;38895:35;38933:21;38946:7;38933:12;:21::i;:::-;38895:59;;38993:4;-1:-1:-1;;;;;38971:26:0;:13;:18;;;-1:-1:-1;;;;;38971:26:0;;38967:67;;39006:28;;-1:-1:-1;;;39006:28:0;;;;;;;;;;;38967:67;39047:22;2916:10;-1:-1:-1;;;;;39073:20:0;;;;:73;;-1:-1:-1;39110:36:0;39127:4;2916:10;32901:164;:::i;39110:36::-;39073:126;;;-1:-1:-1;2916:10:0;39163:20;39175:7;39163:11;:20::i;:::-;-1:-1:-1;;;;;39163:36:0;;39073:126;39047:153;;39218:17;39213:66;;39244:35;;-1:-1:-1;;;39244:35:0;;;;;;;;;;;39213:66;-1:-1:-1;;;;;39294:16:0;;39290:52;;39319:23;;-1:-1:-1;;;39319:23:0;;;;;;;;;;;39290:52;39463:35;39480:1;39484:7;39493:4;39463:8;:35::i;:::-;-1:-1:-1;;;;;39794:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;39794:31:0;;;-1:-1:-1;;;;;39794:31:0;;;-1:-1:-1;;39794:31:0;;;;;;;39840:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;39840:29:0;;;;;;;;;;;39920:20;;;:11;:20;;;;;;39955:18;;-1:-1:-1;;;;;;39988:49:0;;;;-1:-1:-1;;;40021:15:0;39988:49;;;;;;;;;;40311:11;;40371:24;;;;;40414:13;;39920:20;;40371:24;;40414:13;40410:384;;40624:13;;40609:11;:28;40605:174;;40662:20;;40731:28;;;;-1:-1:-1;;;;;40705:54:0;-1:-1:-1;;;40705:54:0;-1:-1:-1;;;;;;40705:54:0;;;-1:-1:-1;;;;;40662:20:0;;40705:54;;;;40605:174;39769:1036;;;40841:7;40837:2;-1:-1:-1;;;;;40822:27:0;40831:4;-1:-1:-1;;;;;40822:27:0;-1:-1:-1;;;;;;;;;;;40822:27:0;;;;;;;;;40860:42;33629:369;29397:1109;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;29508:7:0;;26303:1;29557:23;;:47;;;;;29591:13;;29584:4;:20;29557:47;29553:886;;;29625:31;29659:17;;;:11;:17;;;;;;;;;29625:51;;;;;;;;;-1:-1:-1;;;;;29625:51:0;;;;-1:-1:-1;;;29625:51:0;;-1:-1:-1;;;;;29625:51:0;;;;;;;;-1:-1:-1;;;29625:51:0;;;;;;;;;;;;;;29695:729;;29745:14;;-1:-1:-1;;;;;29745:28:0;;29741:101;;29809:9;29397:1109;-1:-1:-1;;;29397:1109:0:o;29741:101::-;-1:-1:-1;;;30184:6:0;30229:17;;;;:11;:17;;;;;;;;;30217:29;;;;;;;;;-1:-1:-1;;;;;30217:29:0;;;;;-1:-1:-1;;;30217:29:0;;-1:-1:-1;;;;;30217:29:0;;;;;;;;-1:-1:-1;;;30217:29:0;;;;;;;;;;;;;30277:28;30273:109;;30345:9;29397:1109;-1:-1:-1;;;29397:1109:0:o;30273:109::-;30144:261;;;29606:833;29553:886;30467:31;;-1:-1:-1;;;30467:31:0;;;;;;;;;;;5382:191;5475:6;;;-1:-1:-1;;;;;5492:17:0;;;-1:-1:-1;;;;;;5492:17:0;;;;;;;5525:40;;5475:6;;;5492:17;5475:6;;5525:40;;5456:16;;5525:40;5445:128;5382:191;:::o;27999:442::-;28060:13;28113:15;28089:20;;;;:13;:20;;;;;;;;;;;;:39;;;;;;;:::i;:::-;;28086:70;;-1:-1:-1;;28143:13:0;;;;;;;;;;;;-1:-1:-1;;;28143:13:0;;;;;27999:442::o;28086:70::-;28194:14;28170:20;;;;:13;:20;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;28167:68;;-1:-1:-1;;28223:12:0;;;;;;;;;;;;-1:-1:-1;;;28223:12:0;;;;;27999:442::o;28167:68::-;28273:16;28249:20;;;;:13;:20;;;;;;;;;;;;:40;;;;;;;:::i;:::-;;28246:72;;-1:-1:-1;;28304:14:0;;;;;;;;;;;;-1:-1:-1;;;28304:14:0;;;;;27999:442::o;28246:72::-;28332:20;;;;28356:17;28332:20;;;;;;;;;;;:41;;;;;;;;:::i;:::-;;28329:74;;-1:-1:-1;;28388:15:0;;;;;;;;;;;;-1:-1:-1;;;28388:15:0;;;;;27999:442::o;28329:74::-;-1:-1:-1;;28424:9:0;;;;;;;;;-1:-1:-1;28424:9:0;;;27999:442::o;44520:667::-;44704:72;;-1:-1:-1;;;44704:72:0;;44683:4;;-1:-1:-1;;;;;44704:36:0;;;;;:72;;2916:10;;44755:4;;44761:7;;44770:5;;44704:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44704:72:0;;;;;;;;-1:-1:-1;;44704:72:0;;;;;;;;;;;;:::i;:::-;;;44700:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44938:6;:13;44955:1;44938:18;44934:235;;44984:40;;-1:-1:-1;;;44984:40:0;;;;;;;;;;;44934:235;45127:6;45121:13;45112:6;45108:2;45104:15;45097:38;44700:480;-1:-1:-1;;;;;;44823:55:0;-1:-1:-1;;;44823:55:0;;-1:-1:-1;44700:480:0;44520:667;;;;;;:::o;398:723::-;454:13;675:5;684:1;675:10;671:53;;-1:-1:-1;;702:10:0;;;;;;;;;;;;-1:-1:-1;;;702:10:0;;;;;398:723::o;671:53::-;749:5;734:12;790:78;797:9;;790:78;;823:8;;;;:::i;:::-;;-1:-1:-1;846:10:0;;-1:-1:-1;854:2:0;846:10;;:::i;:::-;;;790:78;;;878:19;910:6;-1:-1:-1;;;;;900:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;900:17:0;;878:39;;928:154;935:10;;928:154;;962:11;972:1;962:11;;:::i;:::-;;-1:-1:-1;1031:10:0;1039:2;1031:5;:10;:::i;:::-;1018:24;;:2;:24;:::i;:::-;1005:39;;988:6;995;988:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;988:56:0;;;;;;;;-1:-1:-1;1059:11:0;1068:2;1059:11;;:::i;:::-;;;928:154;;49069:104;49129:13;49158:9;49151:16;;;;;:::i;49179:374::-;49324:4;49339:19;49361:46;49376:7;49385;49394:12;;49361:14;:46::i;:::-;49339:68;;49416:28;49447:36;49471:11;49877:65;;13790:66:1;49877:65:0;;;13778:79:1;13873:12;;;13866:28;;;49845:7:0;;13910:12:1;;49877:65:0;;;;;;;;;;;;49867:76;;;;;;49860:83;;49768:181;;;;49447:36;49416:67;;49540:7;-1:-1:-1;;;;;49501:46:0;:35;49509:20;49531:4;49501:7;:35::i;:::-;-1:-1:-1;;;;;49501:46:0;;;49179:374;-1:-1:-1;;;;;;;;;49179:374:0:o;34511:149::-;34611:41;34621:2;34625:12;;34639:8;34611:41;;;;;;;;;;;;:9;:41::i;40988:89::-;41048:21;41054:7;41063:5;41048;:21::i;49559:203::-;49671:7;49724;49733;49742:12;;49707:48;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49697:59;;;;;;49690:66;;49559:203;;;;;;:::o;49955:216::-;50045:7;50063:9;50074;50085:7;50096:12;50103:4;50096:6;:12::i;:::-;50124:41;;;;;;;;;;;;14160:25:1;;;14233:4;14221:17;;14201:18;;;14194:45;;;;14255:18;;;14248:34;;;14298:18;;;14291:34;;;50062:46:0;;-1:-1:-1;50062:46:0;;-1:-1:-1;50062:46:0;-1:-1:-1;50124:41:0;;14132:19:1;;50124:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50124:41:0;;-1:-1:-1;;50124:41:0;;;49955:216;-1:-1:-1;;;;;;;49955:216:0:o;35034:1919::-;35197:20;35220:13;-1:-1:-1;;;;;35248:16:0;;35244:48;;35273:19;;-1:-1:-1;;;35273:19:0;;;;;;;;;;;35244:48;35307:8;35319:1;35307:13;35303:44;;35329:18;;-1:-1:-1;;;35329:18:0;;;;;;;;;;;35303:44;-1:-1:-1;;;;;35698:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;35757:49:0;;-1:-1:-1;;;;;35698:44:0;;;;;;;35757:49;;;;-1:-1:-1;;35698:44:0;;;;;;35757:49;;;;;;;;;;;;;;;;35823:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;35873:66:0;;;-1:-1:-1;;;35923:15:0;35873:66;;;;;;;;;;;;;35823:25;;36020:23;;;;35698:16;7108:19;:23;36097:724;;36137:314;36168:38;;36193:12;;-1:-1:-1;;;;;36168:38:0;;;36185:1;;-1:-1:-1;;;;;;;;;;;36168:38:0;36185:1;;36168:38;36234:69;36273:1;36277:2;36281:14;;;;;;36297:5;36234:30;:69::i;:::-;36229:174;;36339:40;;-1:-1:-1;;;36339:40:0;;;;;;;;;;;36229:174;36446:3;36430:12;:19;36137:314;;36532:12;36515:13;;:29;36511:43;;36546:8;;;36511:43;36097:724;;;36662:12;;36675;;;;;;36662:26;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;36651:38;;;;;;;;;;:::i;:::-;36621:27;;;;:13;:27;;;;;;;;:68;;:27;;-1:-1:-1;;36621:68:0;;;;;;;;;;;;;;;:::i;:::-;;;;;-1:-1:-1;36717:40:0;;36742:14;;;;;-1:-1:-1;;;;;36717:40:0;;;36734:1;;-1:-1:-1;;;;;;;;;;;36717:40:0;36734:1;;36717:40;36801:3;36785:12;:19;36595:211;;36097:724;-1:-1:-1;;36835:13:0;:28;35186:1767;35034:1919;;;;;:::o;41306:2408::-;41386:35;41424:21;41437:7;41424:12;:21::i;:::-;41473:18;;41386:59;;-1:-1:-1;41504:290:0;;;;41538:22;2916:10;-1:-1:-1;;;;;41564:20:0;;;;:77;;-1:-1:-1;41605:36:0;41622:4;2916:10;32901:164;:::i;41605:36::-;41564:134;;;-1:-1:-1;2916:10:0;41662:20;41674:7;41662:11;:20::i;:::-;-1:-1:-1;;;;;41662:36:0;;41564:134;41538:161;;41721:17;41716:66;;41747:35;;-1:-1:-1;;;41747:35:0;;;;;;;;;;;41716:66;41523:271;41504:290;41922:35;41939:1;41943:7;41952:4;41922:8;:35::i;:::-;-1:-1:-1;;;;;42287:18:0;;;42253:31;42287:18;;;:12;:18;;;;;;;;42320:24;;-1:-1:-1;;;;;;;;;;42320:24:0;;;;;;;;;-1:-1:-1;;42320:24:0;;;;42359:29;;;;;42343:1;42359:29;;;;;;;;-1:-1:-1;;42359:29:0;;;;;;;;;;42521:20;;;:11;:20;;;;;;42556;;-1:-1:-1;;;;42624:15:0;42591:49;;;-1:-1:-1;;;42591:49:0;-1:-1:-1;;;;;;42591:49:0;;;;;;;;;;42655:22;-1:-1:-1;;;42655:22:0;;;42947:11;;;43007:24;;;;;43050:13;;42287:18;;43007:24;;43050:13;43046:384;;43260:13;;43245:11;:28;43241:174;;43298:20;;43367:28;;;;-1:-1:-1;;;;;43341:54:0;-1:-1:-1;;;43341:54:0;-1:-1:-1;;;;;;43341:54:0;;;-1:-1:-1;;;;;43298:20:0;;43341:54;;;;43241:174;-1:-1:-1;;43458:35:0;;43485:7;;-1:-1:-1;43481:1:0;;-1:-1:-1;;;;;;43458:35:0;;;-1:-1:-1;;;;;;;;;;;43458:35:0;43481:1;;43458:35;-1:-1:-1;;43681:12:0;:14;;;;;;-1:-1:-1;;41306:2408:0:o;50177:288::-;50235:9;50246;50257:7;50280:4;:11;50295:2;50280:17;50272:54;;;;-1:-1:-1;;;50272:54:0;;14725:2:1;50272:54:0;;;14707:21:1;14764:2;14744:18;;;14737:30;14803:26;14783:18;;;14776:54;14847:18;;50272:54:0;14523:348:1;50272:54:0;-1:-1:-1;;;50374:2:0;50364:13;;50358:20;50407:2;50397:13;;50391:20;50448:2;50438:13;;;50432:20;50358;;50429:1;50424:29;;;;;50177:288::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343: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:127::-;2416:10;2411:3;2407:20;2404:1;2397:31;2447:4;2444:1;2437:15;2471:4;2468:1;2461:15;2487:342;2633:2;2618:18;;2666:1;2655:13;;2645:144;;2711:10;2706:3;2702:20;2699:1;2692:31;2746:4;2743:1;2736:15;2774:4;2771:1;2764:15;2645:144;2798:25;;;2487:342;:::o;2834:328::-;2911:6;2919;2927;2980:2;2968:9;2959:7;2955:23;2951:32;2948:52;;;2996:1;2993;2986:12;2948:52;3019:29;3038:9;3019:29;:::i;:::-;3009:39;;3067:38;3101:2;3090:9;3086:18;3067:38;:::i;:::-;3057:48;;3152:2;3141:9;3137:18;3124:32;3114:42;;2834:328;;;;;:::o;3167:186::-;3226:6;3279:2;3267:9;3258:7;3254:23;3250:32;3247:52;;;3295:1;3292;3285:12;3247:52;3318:29;3337:9;3318:29;:::i;3358:127::-;3419:10;3414:3;3410:20;3407:1;3400:31;3450:4;3447:1;3440:15;3474:4;3471:1;3464:15;3490:632;3555:5;-1:-1:-1;;;;;3626:2:1;3618:6;3615:14;3612:40;;;3632:18;;:::i;:::-;3707:2;3701:9;3675:2;3761:15;;-1:-1:-1;;3757:24:1;;;3783:2;3753:33;3749:42;3737:55;;;3807:18;;;3827:22;;;3804:46;3801:72;;;3853:18;;:::i;:::-;3893:10;3889:2;3882:22;3922:6;3913:15;;3952:6;3944;3937:22;3992:3;3983:6;3978:3;3974:16;3971:25;3968:45;;;4009:1;4006;3999:12;3968:45;4059:6;4054:3;4047:4;4039:6;4035:17;4022:44;4114:1;4107:4;4098:6;4090;4086:19;4082:30;4075:41;;;;3490:632;;;;;:::o;4127:451::-;4196:6;4249:2;4237:9;4228:7;4224:23;4220:32;4217:52;;;4265:1;4262;4255:12;4217:52;4305:9;4292:23;-1:-1:-1;;;;;4330:6:1;4327:30;4324:50;;;4370:1;4367;4360:12;4324:50;4393:22;;4446:4;4438:13;;4434:27;-1:-1:-1;4424:55:1;;4475:1;4472;4465:12;4424:55;4498:74;4564:7;4559:2;4546:16;4541:2;4537;4533:11;4498:74;:::i;4583:160::-;4648:20;;4704:13;;4697:21;4687:32;;4677:60;;4733:1;4730;4723:12;4748:254;4813:6;4821;4874:2;4862:9;4853:7;4849:23;4845:32;4842:52;;;4890:1;4887;4880:12;4842:52;4913:29;4932:9;4913:29;:::i;:::-;4903:39;;4961:35;4992:2;4981:9;4977:18;4961:35;:::i;:::-;4951:45;;4748:254;;;;;:::o;5007:221::-;5049:5;5102:3;5095:4;5087:6;5083:17;5079:27;5069:55;;5120:1;5117;5110:12;5069:55;5142:80;5218:3;5209:6;5196:20;5189:4;5181:6;5177:17;5142:80;:::i;5233:537::-;5328:6;5336;5344;5352;5405:3;5393:9;5384:7;5380:23;5376:33;5373:53;;;5422:1;5419;5412:12;5373:53;5445:29;5464:9;5445:29;:::i;:::-;5435:39;;5493:38;5527:2;5516:9;5512:18;5493:38;:::i;:::-;5483:48;;5578:2;5567:9;5563:18;5550:32;5540:42;;5633:2;5622:9;5618:18;5605:32;-1:-1:-1;;;;;5652:6:1;5649:30;5646:50;;;5692:1;5689;5682:12;5646:50;5715:49;5756:7;5747:6;5736:9;5732:22;5715:49;:::i;:::-;5705:59;;;5233:537;;;;;;;:::o;5775:180::-;5831:6;5884:2;5872:9;5863:7;5859:23;5855:32;5852:52;;;5900:1;5897;5890:12;5852:52;5923:26;5939:9;5923:26;:::i;5960:879::-;6071:6;6079;6087;6095;6148:2;6136:9;6127:7;6123:23;6119:32;6116:52;;;6164:1;6161;6154:12;6116:52;6200:9;6187:23;6177:33;;6261:2;6250:9;6246:18;6233:32;-1:-1:-1;;;;;6325:2:1;6317:6;6314:14;6311:34;;;6341:1;6338;6331:12;6311:34;6379:6;6368:9;6364:22;6354:32;;6424:7;6417:4;6413:2;6409:13;6405:27;6395:55;;6446:1;6443;6436:12;6395:55;6486:2;6473:16;6512:2;6504:6;6501:14;6498:34;;;6528:1;6525;6518:12;6498:34;6581:7;6576:2;6566:6;6563:1;6559:14;6555:2;6551:23;6547:32;6544:45;6541:65;;;6602:1;6599;6592:12;6541:65;6633:2;6629;6625:11;6615:21;;6655:6;6645:16;;;6714:2;6703:9;6699:18;6686:32;6670:48;;6743:2;6733:8;6730:16;6727:36;;;6759:1;6756;6749:12;6727:36;;6782:51;6825:7;6814:8;6803:9;6799:24;6782:51;:::i;6844:260::-;6912:6;6920;6973:2;6961:9;6952:7;6948:23;6944:32;6941:52;;;6989:1;6986;6979:12;6941:52;7012:29;7031:9;7012:29;:::i;:::-;7002:39;;7060:38;7094:2;7083:9;7079:18;7060:38;:::i;7109:380::-;7188:1;7184:12;;;;7231;;;7252:61;;7306:4;7298:6;7294:17;7284:27;;7252:61;7359:2;7351:6;7348:14;7328:18;7325:38;7322:161;;7405:10;7400:3;7396:20;7393:1;7386:31;7440:4;7437:1;7430:15;7468:4;7465:1;7458:15;7322:161;;7109:380;;;:::o;7494:356::-;7696:2;7678:21;;;7715:18;;;7708:30;7774:34;7769:2;7754:18;;7747:62;7841:2;7826:18;;7494:356::o;7855:470::-;8034:3;8072:6;8066:13;8088:53;8134:6;8129:3;8122:4;8114:6;8110:17;8088:53;:::i;:::-;8204:13;;8163:16;;;;8226:57;8204:13;8163:16;8260:4;8248:17;;8226:57;:::i;:::-;8299:20;;7855:470;-1:-1:-1;;;;7855:470:1:o;8679:127::-;8740:10;8735:3;8731:20;8728:1;8721:31;8771:4;8768:1;8761:15;8795:4;8792:1;8785:15;8811:128;8851:3;8882:1;8878:6;8875:1;8872:13;8869:39;;;8888:18;;:::i;:::-;-1:-1:-1;8924:9:1;;8811:128::o;11149:489::-;-1:-1:-1;;;;;11418:15:1;;;11400:34;;11470:15;;11465:2;11450:18;;11443:43;11517:2;11502:18;;11495:34;;;11565:3;11560:2;11545:18;;11538:31;;;11343:4;;11586:46;;11612:19;;11604:6;11586:46;:::i;:::-;11578:54;11149:489;-1:-1:-1;;;;;;11149:489:1:o;11643:249::-;11712:6;11765:2;11753:9;11744:7;11740:23;11736:32;11733:52;;;11781:1;11778;11771:12;11733:52;11813:9;11807:16;11832:30;11856:5;11832:30;:::i;11897:135::-;11936:3;11957:17;;;11954:43;;11977:18;;:::i;:::-;-1:-1:-1;12024:1:1;12013:13;;11897:135::o;12037:127::-;12098:10;12093:3;12089:20;12086:1;12079:31;12129:4;12126:1;12119:15;12153:4;12150:1;12143:15;12169:120;12209:1;12235;12225:35;;12240:18;;:::i;:::-;-1:-1:-1;12274:9:1;;12169:120::o;12294:125::-;12334:4;12362:1;12359;12356:8;12353:34;;;12367:18;;:::i;:::-;-1:-1:-1;12404:9:1;;12294:125::o;12424:112::-;12456:1;12482;12472:35;;12487:18;;:::i;:::-;-1:-1:-1;12521:9:1;;12424:112::o;12541:127::-;12602:10;12597:3;12593:20;12590:1;12583:31;12633:4;12630:1;12623:15;12657:4;12654:1;12647:15;12673:156;12739:20;;12799:4;12788:16;;12778:27;;12768:55;;12819:1;12816;12809:12;12834:709;13112:26;13108:31;13099:6;13095:2;13091:15;13087:53;13082:3;13075:66;13171:6;13166:2;13161:3;13157:12;13150:28;13057:3;13209:2;13204:3;13200:12;13258:6;13282:1;13292:224;13306:6;13303:1;13300:13;13292:224;;;13399:4;13373:24;13390:6;13373:24;:::i;:::-;13369:35;13355:50;;13428:4;13454:14;;;;13491:15;;;;;13328:1;13321:9;13292:224;;;-1:-1:-1;13532:5:1;;12834:709;-1:-1:-1;;;;;;;12834:709:1:o;14336:182::-;14393:6;14446:2;14434:9;14425:7;14421:23;14417:32;14414:52;;;14462:1;14459;14452:12;14414:52;14485:27;14502:9;14485:27;:::i
Swarm Source
ipfs://284b743efa3275cbccfab6444965ae3bbb57d25b78710fc7167c0b336fededc5
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.