ERC-721
Overview
Max Total Supply
338 WUMBO
Holders
313
Total Transfers
-
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
WumboPass
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-05 */ // File contracts/IERC165.sol // SPDX-License-Identifier: MIT // 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 contracts/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/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] // 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/utils/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File contracts/ERC721A.sol // Creator: Chiru Labs pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintedQueryForZeroAddress(); error BurnedQueryForZeroAddress(); error AuxQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerIndexOutOfBounds(); error OwnerQueryForNonexistentToken(); error TokenIndexOutOfBounds(); 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; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // 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 See {IERC721Enumerable-totalSupply}. * @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) { if (owner == address(0)) revert MintedQueryForZeroAddress(); return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { if (owner == address(0)) revert BurnedQueryForZeroAddress(); 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) { if (owner == address(0)) revert AuxQueryForZeroAddress(); 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 { if (owner == address(0)) revert AuxQueryForZeroAddress(); _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, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public 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 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; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, 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, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @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, bytes memory _data, bool safe ) 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; if (safe && 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 { 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); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || isApprovedForAll(prevOwnership.addr, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // 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; _ownerships[tokenId].addr = to; _ownerships[tokenId].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; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { TokenOwnership memory prevOwnership = ownershipOf(tokenId); _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // 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[prevOwnership.addr].balance -= 1; _addressData[prevOwnership.addr].numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. _ownerships[tokenId].addr = prevOwnership.addr; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); _ownerships[tokenId].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; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(prevOwnership.addr, address(0), tokenId); _afterTokenTransfers(prevOwnership.addr, 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 contracts/extensions/ERC721ABurnable.sol // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @title ERC721A Burnable Token * @dev ERC721A Token that can be irreversibly burned (destroyed). */ abstract contract ERC721ABurnable is Context, ERC721A { /** * @dev Burns `tokenId`. See {ERC721A-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || isApprovedForAll(prevOwnership.addr, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); _burn(tokenId); } } // File contracts/extensions/ERC721AOwnersExplicit.sol // Creator: Chiru Labs pragma solidity ^0.8.4; error AllOwnershipsHaveBeenSet(); error QuantityMustBeNonZero(); error NoTokensMintedYet(); abstract contract ERC721AOwnersExplicit is ERC721A { uint256 public nextOwnerToExplicitlySet; /** * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { if (quantity == 0) revert QuantityMustBeNonZero(); if (_currentIndex == _startTokenId()) revert NoTokensMintedYet(); uint256 _nextOwnerToExplicitlySet = nextOwnerToExplicitlySet; if (_nextOwnerToExplicitlySet == 0) { _nextOwnerToExplicitlySet = _startTokenId(); } if (_nextOwnerToExplicitlySet >= _currentIndex) revert AllOwnershipsHaveBeenSet(); // Index underflow is impossible. // Counter or index overflow is incredibly unrealistic. unchecked { uint256 endIndex = _nextOwnerToExplicitlySet + quantity - 1; // Set the end index to be the last token index if (endIndex + 1 > _currentIndex) { endIndex = _currentIndex - 1; } for (uint256 i = _nextOwnerToExplicitlySet; i <= endIndex; i++) { if (_ownerships[i].addr == address(0) && !_ownerships[i].burned) { TokenOwnership memory ownership = ownershipOf(i); _ownerships[i].addr = ownership.addr; _ownerships[i].startTimestamp = ownership.startTimestamp; } } nextOwnerToExplicitlySet = endIndex + 1; } } } // File contracts/mocks/ERC721ABurnableMock.sol // Creators: Chiru Labs pragma solidity ^0.8.4; contract ERC721ABurnableMock is ERC721A, ERC721ABurnable { constructor(string memory name_, string memory symbol_) ERC721A(name_, symbol_) {} function exists(uint256 tokenId) public view returns (bool) { return _exists(tokenId); } function safeMint(address to, uint256 quantity) public { _safeMint(to, quantity); } function getOwnershipAt(uint256 index) public view returns (TokenOwnership memory) { return _ownerships[index]; } function totalMinted() public view returns (uint256) { return _totalMinted(); } } // File contracts/mocks/ERC721ABurnableOwnersExplicitMock.sol // Creators: Chiru Labs pragma solidity ^0.8.4; contract ERC721ABurnableOwnersExplicitMock is ERC721A, ERC721ABurnable, ERC721AOwnersExplicit { constructor(string memory name_, string memory symbol_) ERC721A(name_, symbol_) {} function exists(uint256 tokenId) public view returns (bool) { return _exists(tokenId); } function safeMint(address to, uint256 quantity) public { _safeMint(to, quantity); } function setOwnersExplicit(uint256 quantity) public { _setOwnersExplicit(quantity); } function getOwnershipAt(uint256 index) public view returns (TokenOwnership memory) { return _ownerships[index]; } } // File contracts/mocks/StartTokenIdHelper.sol // Creators: Chiru Labs pragma solidity ^0.8.4; /** * This Helper is used to return a dynmamic value in the overriden _startTokenId() function. * Extending this Helper before the ERC721A contract give us access to the herein set `startTokenId` * to be returned by the overriden `_startTokenId()` function of ERC721A in the ERC721AStartTokenId mocks. */ contract StartTokenIdHelper { uint256 public immutable startTokenId; constructor(uint256 startTokenId_) { startTokenId = startTokenId_; } } // File contracts/mocks/ERC721AGasReporterMock.sol // Creators: Chiru Labs pragma solidity ^0.8.4; contract ERC721AGasReporterMock is ERC721A { constructor(string memory name_, string memory symbol_) ERC721A(name_, symbol_) {} function safeMintOne(address to) public { _safeMint(to, 1); } function mintOne(address to) public { _mint(to, 1, '', false); } function safeMintTen(address to) public { _safeMint(to, 10); } function mintTen(address to) public { _mint(to, 10, '', false); } } // File contracts/mocks/ERC721AMock.sol // Creators: Chiru Labs pragma solidity ^0.8.4; contract ERC721AMock is ERC721A { constructor(string memory name_, string memory symbol_) ERC721A(name_, symbol_) {} function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function totalMinted() public view returns (uint256) { return _totalMinted(); } function getAux(address owner) public view returns (uint64) { return _getAux(owner); } function setAux(address owner, uint64 aux) public { _setAux(owner, aux); } function baseURI() public view returns (string memory) { return _baseURI(); } function exists(uint256 tokenId) public view returns (bool) { return _exists(tokenId); } function safeMint(address to, uint256 quantity) public { _safeMint(to, quantity); } function safeMint( address to, uint256 quantity, bytes memory _data ) public { _safeMint(to, quantity, _data); } function mint( address to, uint256 quantity, bytes memory _data, bool safe ) public { _mint(to, quantity, _data, safe); } } // File contracts/mocks/ERC721AOwnersExplicitMock.sol // Creators: Chiru Labs pragma solidity ^0.8.4; contract ERC721AOwnersExplicitMock is ERC721AOwnersExplicit { constructor(string memory name_, string memory symbol_) ERC721A(name_, symbol_) {} function safeMint(address to, uint256 quantity) public { _safeMint(to, quantity); } function setOwnersExplicit(uint256 quantity) public { _setOwnersExplicit(quantity); } function getOwnershipAt(uint256 tokenId) public view returns (TokenOwnership memory) { return _ownerships[tokenId]; } } // File contracts/mocks/ERC721ReceiverMock.sol // Creators: Chiru Labs pragma solidity ^0.8.4; contract ERC721ReceiverMock is IERC721Receiver { enum Error { None, RevertWithMessage, RevertWithoutMessage, Panic } bytes4 private immutable _retval; event Received(address operator, address from, uint256 tokenId, bytes data, uint256 gas); constructor(bytes4 retval) { _retval = retval; } function onERC721Received( address operator, address from, uint256 tokenId, bytes memory data ) public override returns (bytes4) { emit Received(operator, from, tokenId, data, 20000); return _retval; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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/interfaces/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File @openzeppelin/contracts/token/common/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File @openzeppelin/contracts/utils/cryptography/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File contracts/WumboPass.sol /** ╔╦═╦╦╦╦═╦═╦══╦═╗╔═╦══╦══╦══╗ ║║║║║║║║║║║╔╗║║║║╬║╔╗║══╣══╣ ║║║║║║║║║║║╔╗║║║║╔╣╠╣╠══╠══║ ╚═╩═╩═╩╩═╩╩══╩═╝╚╝╚╝╚╩══╩══╝ by @wumbolabs **/ pragma solidity ^0.8.4; contract WumboPass is ERC721A, ERC2981, Ownable { using Strings for uint256; uint256 public ALLOW_LIST_PRICE = 0.1 ether; uint256 public MINT_PRICE = 0.1 ether; uint256 constant CLAIM_SUPPLY = 222; uint256 constant MINT_SUPPLY = 777; uint256 constant MAX_PER_WALLET = 1; mapping(address => bool) public whitelist; enum Status { NOT_LIVE, PRESALE, LIVE, CLAIM, ENDED } // minting variables string public baseURI = "ipfs://QmTDw49hJRhKXX9g8fyNuj1sdzVB4ku1xBBHWmQxtTr9jp/"; Status public state = Status.NOT_LIVE; uint256 public mintCount = 0; uint256 public claimCount = 0; constructor() ERC721A("Wumbo Pass", "WUMBO") { } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function mint() external payable { require(state == Status.LIVE || state == Status.PRESALE, "Wumbo Pass: Mint Not Active"); if(state == Status.PRESALE){ require(whitelist[msg.sender], "Not in whitelist"); } require(mintCount < MINT_SUPPLY, "Wumbo Pass: Mint Supply Exceeded"); require(msg.value >= (state == Status.LIVE ? MINT_PRICE : ALLOW_LIST_PRICE), "Wumbo Pass: Insufficient ETH"); require(_numberMinted(msg.sender) < MAX_PER_WALLET, "Wumbo Pass: Exceeds Max Per Wallet"); mintCount += 1; _safeMint(msg.sender, 1); } function claim() external { require(state == Status.CLAIM, "Wumbo Pass: Claim Not Active"); require(claimCount < CLAIM_SUPPLY, "Wumbo Pass: Mint Supply Exceeded"); require(_numberMinted(msg.sender) < MAX_PER_WALLET, "Wumbo Pass: Exceeds Max Per Wallet"); require(whitelist[msg.sender], "Not in whitelist"); claimCount += 1; _safeMint(msg.sender, 1); } function setAllowList(address[] calldata addresses) external onlyOwner { for (uint256 i = 0; i < addresses.length; i++) { whitelist[addresses[i]] = true; } } function resetAllowList(address[] calldata addresses) external onlyOwner { for (uint256 i = 0; i < addresses.length; i++) { whitelist[addresses[i]] = false; } } function addWhitelist(address _newEntry) external onlyOwner { require(!whitelist[_newEntry], "Already in whitelist"); whitelist[_newEntry] = true; } function removeWhitelist(address _newEntry) external onlyOwner { require(whitelist[_newEntry], "Previous not in whitelist"); whitelist[_newEntry] = false; } function setBaseURI(string memory _newBaseURI) external onlyOwner { baseURI = _newBaseURI; } function setState(Status _state) external onlyOwner { state = _state; } function sendRemainingToTreasury(uint256 _qty) external onlyOwner { require(state == Status.ENDED, "Wumbo Pass: Cannot Claim Unminted Tokens If Sale Live"); require(totalSupply() + _qty <= CLAIM_SUPPLY + MINT_SUPPLY, "Wumbo Pass: Total Supply Minted"); _safeMint(0x823D8C84126Da1756BE69421c78482d0D24d907e, _qty); } function tokenURI(uint256 _tokenId) public view override returns (string memory) { require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory base = _baseURI(); return string(abi.encodePacked(base, "wumbopass", ".json")); } function setMintCost(uint256 _newCost) external onlyOwner { MINT_PRICE = _newCost; } function setAllowListCost(uint256 _newCost) external onlyOwner { ALLOW_LIST_PRICE = _newCost; } /* * @dev See {ERC2981-_setDefaultRoyalty}. */ function setDefaultRoyalty(address receiver, uint96 feeNumerator) external onlyOwner { _setDefaultRoyalty(receiver, feeNumerator); } /** * @dev See {ERC2981-_deleteDefaultRoyalty}. */ function deleteDefaultRoyalty() external onlyOwner { _deleteDefaultRoyalty(); } /** * @dev See {ERC2981-_setTokenRoyalty}. */ function setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) external onlyOwner { _setTokenRoyalty(tokenId, receiver, feeNumerator); } /** * @dev See {ERC2981-_resetTokenRoyalty}. */ function resetTokenRoyalty(uint256 tokenId) external onlyOwner { _resetTokenRoyalty(tokenId); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } function withdraw() external onlyOwner { (bool success, ) = msg.sender.call{value: address(this).balance}(""); require(success, "Withdraw failed."); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"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":"MintedQueryForZeroAddress","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"},{"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":[],"name":"ALLOW_LIST_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newEntry","type":"address"}],"name":"addWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deleteDefaultRoyalty","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":"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":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"address","name":"_newEntry","type":"address"}],"name":"removeWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"resetAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"resetTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":"uint256","name":"_qty","type":"uint256"}],"name":"sendRemainingToTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setAllowListCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setMintCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum WumboPass.Status","name":"_state","type":"uint8"}],"name":"setState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"state","outputs":[{"internalType":"enum WumboPass.Status","name":"","type":"uint8"}],"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":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
67016345785d8a0000600b819055600c5560e06040526036608081815290620027eb60a03980516200003a91600e916020909101906200012d565b50600f805460ff19169055600060108190556011553480156200005c57600080fd5b50604080518082018252600a81526957756d626f205061737360b01b60208083019182528351808501909452600584526457554d424f60d81b908401528151919291620000ac916002916200012d565b508051620000c29060039060208401906200012d565b5050600160005550620000d533620000db565b62000210565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200013b90620001d3565b90600052602060002090601f0160209004810192826200015f5760008555620001aa565b82601f106200017a57805160ff1916838001178555620001aa565b82800160010185558215620001aa579182015b82811115620001aa5782518255916020019190600101906200018d565b50620001b8929150620001bc565b5090565b5b80821115620001b85760008155600101620001bd565b600181811c90821680620001e857607f821691505b602082108114156200020a57634e487b7160e01b600052602260045260246000fd5b50919050565b6125cb80620002206000396000f3fe6080604052600436106102465760003560e01c806370a08231116101395780639b19251a116100b6578063c002d23d1161007a578063c002d23d14610698578063c19d93fb146106ae578063c87b56dd146106d5578063e985e9c5146106f5578063f2fde38b1461073e578063f80f5dd51461075e57600080fd5b80639b19251a146105fd578063a22cb4651461062d578063aa1b103f1461064d578063ad570dd514610662578063b88d4fde1461067857600080fd5b80638a616bc0116100fd5780638a616bc01461057e5780638da4d3c91461059e5780638da5cb5b146105b457806395d89b41146105d25780639659867e146105e757600080fd5b806370a08231146104e9578063715018a61461050957806378c8cda71461051e5780637f41bf431461053e5780638545f4ea1461055e57600080fd5b80633ccfd60b116101c75780635944c7531161018b5780635944c753146104545780636352211e146104745780636447c35d146104945780636550385b146104b45780636c0360eb146104d457600080fd5b80633ccfd60b146103ca57806342842e0e146103df5780634e71d92d146103ff57806355f804b31461041457806356de96db1461043457600080fd5b80631249c58b1161020e5780631249c58b1461031c57806318160ddd1461032457806323b872dd1461034b5780632995d6c81461036b5780632a55205a1461038b57600080fd5b806301ffc9a71461024b57806304634d8d1461028057806306fdde03146102a2578063081812fc146102c4578063095ea7b3146102fc575b600080fd5b34801561025757600080fd5b5061026b6102663660046121c6565b61077e565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102a061029b366004612127565b61078f565b005b3480156102ae57600080fd5b506102b76107a5565b60405161027791906123ad565b3480156102d057600080fd5b506102e46102df36600461226a565b610837565b6040516001600160a01b039091168152602001610277565b34801561030857600080fd5b506102a06103173660046120fd565b61087b565b6102a0610909565b34801561033057600080fd5b5060015460005403600019015b604051908152602001610277565b34801561035757600080fd5b506102a0610366366004612009565b610b20565b34801561037757600080fd5b506102a061038636600461226a565b610b2b565b34801561039757600080fd5b506103ab6103a63660046122bf565b610c4b565b604080516001600160a01b039093168352602083019190915201610277565b3480156103d657600080fd5b506102a0610cf7565b3480156103eb57600080fd5b506102a06103fa366004612009565b610d8a565b34801561040b57600080fd5b506102a0610da5565b34801561042057600080fd5b506102a061042f366004612221565b610eea565b34801561044057600080fd5b506102a061044f366004612200565b610f05565b34801561046057600080fd5b506102a061046f366004612283565b610f34565b34801561048057600080fd5b506102e461048f36600461226a565b610f47565b3480156104a057600080fd5b506102a06104af366004612151565b610f59565b3480156104c057600080fd5b506102a06104cf36600461226a565b610fd3565b3480156104e057600080fd5b506102b7610fe0565b3480156104f557600080fd5b5061033d610504366004611fb4565b61106e565b34801561051557600080fd5b506102a06110bd565b34801561052a57600080fd5b506102a0610539366004611fb4565b6110cf565b34801561054a57600080fd5b506102a0610559366004612151565b611160565b34801561056a57600080fd5b506102a061057936600461226a565b6111da565b34801561058a57600080fd5b506102a061059936600461226a565b6111e7565b3480156105aa57600080fd5b5061033d60115481565b3480156105c057600080fd5b50600a546001600160a01b03166102e4565b3480156105de57600080fd5b506102b7611200565b3480156105f357600080fd5b5061033d60105481565b34801561060957600080fd5b5061026b610618366004611fb4565b600d6020526000908152604090205460ff1681565b34801561063957600080fd5b506102a06106483660046120c1565b61120f565b34801561065957600080fd5b506102a06112a5565b34801561066e57600080fd5b5061033d600b5481565b34801561068457600080fd5b506102a0610693366004612045565b6112b7565b3480156106a457600080fd5b5061033d600c5481565b3480156106ba57600080fd5b50600f546106c89060ff1681565b6040516102779190612385565b3480156106e157600080fd5b506102b76106f036600461226a565b611308565b34801561070157600080fd5b5061026b610710366004611fd6565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561074a57600080fd5b506102a0610759366004611fb4565b6113ab565b34801561076a57600080fd5b506102a0610779366004611fb4565b611421565b6000610789826114ad565b92915050565b6107976114d2565b6107a1828261152c565b5050565b6060600280546107b4906124d1565b80601f01602080910402602001604051908101604052809291908181526020018280546107e0906124d1565b801561082d5780601f106108025761010080835404028352916020019161082d565b820191906000526020600020905b81548152906001019060200180831161081057829003601f168201915b5050505050905090565b6000610842826115e6565b61085f576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061088682610f47565b9050806001600160a01b0316836001600160a01b031614156108bb5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906108db57506108d98133610710565b155b156108f9576040516367d9dca160e11b815260040160405180910390fd5b61090483838361161f565b505050565b6002600f5460ff1660048111156109225761092261253d565b148061094457506001600f5460ff1660048111156109425761094261253d565b145b6109955760405162461bcd60e51b815260206004820152601b60248201527f57756d626f20506173733a204d696e74204e6f7420416374697665000000000060448201526064015b60405180910390fd5b6001600f5460ff1660048111156109ae576109ae61253d565b1415610a0657336000908152600d602052604090205460ff16610a065760405162461bcd60e51b815260206004820152601060248201526f139bdd081a5b881dda1a5d195b1a5cdd60821b604482015260640161098c565b61030960105410610a595760405162461bcd60e51b815260206004820181905260248201527f57756d626f20506173733a204d696e7420537570706c79204578636565646564604482015260640161098c565b6002600f5460ff166004811115610a7257610a7261253d565b14610a7f57600b54610a83565b600c545b341015610ad25760405162461bcd60e51b815260206004820152601c60248201527f57756d626f20506173733a20496e73756666696369656e742045544800000000604482015260640161098c565b6001610add3361167b565b10610afa5760405162461bcd60e51b815260040161098c906123c0565b600160106000828254610b0d919061244c565b90915550610b1e90503360016116d1565b565b6109048383836116eb565b610b336114d2565b6004600f5460ff166004811115610b4c57610b4c61253d565b14610bb75760405162461bcd60e51b815260206004820152603560248201527f57756d626f20506173733a2043616e6e6f7420436c61696d20556e6d696e74656044820152746420546f6b656e732049662053616c65204c69766560581b606482015260840161098c565b610bc461030960de61244c565b6001546000548391900360001901610bdc919061244c565b1115610c2a5760405162461bcd60e51b815260206004820152601f60248201527f57756d626f20506173733a20546f74616c20537570706c79204d696e74656400604482015260640161098c565b610c4873823d8c84126da1756be69421c78482d0d24d907e826116d1565b50565b60008281526009602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610cc05750604080518082019091526008546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610cdf906001600160601b031687612486565b610ce99190612464565b915196919550909350505050565b610cff6114d2565b604051600090339047908381818185875af1925050503d8060008114610d41576040519150601f19603f3d011682016040523d82523d6000602084013e610d46565b606091505b5050905080610c485760405162461bcd60e51b815260206004820152601060248201526f2bb4ba34323930bb903330b4b632b21760811b604482015260640161098c565b610904838383604051806020016040528060008152506112b7565b6003600f5460ff166004811115610dbe57610dbe61253d565b14610e0b5760405162461bcd60e51b815260206004820152601c60248201527f57756d626f20506173733a20436c61696d204e6f742041637469766500000000604482015260640161098c565b60de60115410610e5d5760405162461bcd60e51b815260206004820181905260248201527f57756d626f20506173733a204d696e7420537570706c79204578636565646564604482015260640161098c565b6001610e683361167b565b10610e855760405162461bcd60e51b815260040161098c906123c0565b336000908152600d602052604090205460ff16610ed75760405162461bcd60e51b815260206004820152601060248201526f139bdd081a5b881dda1a5d195b1a5cdd60821b604482015260640161098c565b600160116000828254610b0d919061244c565b610ef26114d2565b80516107a190600e906020840190611e72565b610f0d6114d2565b600f805482919060ff19166001836004811115610f2c57610f2c61253d565b021790555050565b610f3c6114d2565b610904838383611901565b6000610f52826119cc565b5192915050565b610f616114d2565b60005b81811015610904576001600d6000858585818110610f8457610f84612553565b9050602002016020810190610f999190611fb4565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610fcb8161250c565b915050610f64565b610fdb6114d2565b600b55565b600e8054610fed906124d1565b80601f0160208091040260200160405190810160405280929190818152602001828054611019906124d1565b80156110665780601f1061103b57610100808354040283529160200191611066565b820191906000526020600020905b81548152906001019060200180831161104957829003601f168201915b505050505081565b60006001600160a01b038216611097576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6110c56114d2565b610b1e6000611af5565b6110d76114d2565b6001600160a01b0381166000908152600d602052604090205460ff1661113f5760405162461bcd60e51b815260206004820152601960248201527f50726576696f7573206e6f7420696e2077686974656c69737400000000000000604482015260640161098c565b6001600160a01b03166000908152600d60205260409020805460ff19169055565b6111686114d2565b60005b81811015610904576000600d600085858581811061118b5761118b612553565b90506020020160208101906111a09190611fb4565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806111d28161250c565b91505061116b565b6111e26114d2565b600c55565b6111ef6114d2565b600090815260096020526040812055565b6060600380546107b4906124d1565b6001600160a01b0382163314156112395760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6112ad6114d2565b610b1e6000600855565b6112c28484846116eb565b6001600160a01b0383163b151580156112e457506112e284848484611b47565b155b15611302576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060611313826115e6565b6113775760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161098c565b6000611381611c3f565b905080604051602001611394919061230d565b604051602081830303815290604052915050919050565b6113b36114d2565b6001600160a01b0381166114185760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161098c565b610c4881611af5565b6114296114d2565b6001600160a01b0381166000908152600d602052604090205460ff16156114895760405162461bcd60e51b8152602060048201526014602482015273105b1c9958591e481a5b881dda1a5d195b1a5cdd60621b604482015260640161098c565b6001600160a01b03166000908152600d60205260409020805460ff19166001179055565b60006001600160e01b0319821663152a902d60e11b1480610789575061078982611c4e565b600a546001600160a01b03163314610b1e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161098c565b6127106001600160601b03821611156115575760405162461bcd60e51b815260040161098c90612402565b6001600160a01b0382166115ad5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640161098c565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600855565b6000816001111580156115fa575060005482105b8015610789575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006001600160a01b0382166116a4576040516335ebb31960e01b815260040160405180910390fd5b506001600160a01b0316600090815260056020526040902054600160401b900467ffffffffffffffff1690565b6107a1828260405180602001604052806000815250611c9e565b60006116f6826119cc565b80519091506000906001600160a01b0316336001600160a01b03161480611724575081516117249033610710565b8061173f57503361173484610837565b6001600160a01b0316145b90508061175f57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146117945760405162a1148160e81b815260040160405180910390fd5b6001600160a01b0384166117bb57604051633a954ecd60e21b815260040160405180910390fd5b6117cb600084846000015161161f565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102179092559086018083529120549091166118b7576000548110156118b7578251600082815260046020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b6127106001600160601b038216111561192c5760405162461bcd60e51b815260040161098c90612402565b6001600160a01b0382166119825760405162461bcd60e51b815260206004820152601b60248201527f455243323938313a20496e76616c696420706172616d65746572730000000000604482015260640161098c565b6040805180820182526001600160a01b0393841681526001600160601b0392831660208083019182526000968752600990529190942093519051909116600160a01b029116179055565b604080516060810182526000808252602082018190529181019190915281806001111580156119fc575060005481105b15611adc57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff16151591810182905290611ada5780516001600160a01b031615611a70579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215611ad5579392505050565b611a70565b505b604051636f96cda160e11b815260040160405180910390fd5b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611b7c903390899088908890600401612348565b602060405180830381600087803b158015611b9657600080fd5b505af1925050508015611bc6575060408051601f3d908101601f19168201909252611bc3918101906121e3565b60015b611c21573d808015611bf4576040519150601f19603f3d011682016040523d82523d6000602084013e611bf9565b606091505b508051611c19576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600e80546107b4906124d1565b60006001600160e01b031982166380ac58cd60e01b1480611c7f57506001600160e01b03198216635b5e139f60e01b145b8061078957506301ffc9a760e01b6001600160e01b0319831614610789565b61090483838360016000546001600160a01b038516611ccf57604051622e076360e81b815260040160405180910390fd5b83611ced5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b429092169190910217905580808501838015611d9a57506001600160a01b0387163b15155b15611e23575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611deb6000888480600101955088611b47565b611e08576040516368d2bf6b60e11b815260040160405180910390fd5b80821415611da0578260005414611e1e57600080fd5b611e69565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415611e24575b506000556118fa565b828054611e7e906124d1565b90600052602060002090601f016020900481019282611ea05760008555611ee6565b82601f10611eb957805160ff1916838001178555611ee6565b82800160010185558215611ee6579182015b82811115611ee6578251825591602001919060010190611ecb565b50611ef2929150611ef6565b5090565b5b80821115611ef25760008155600101611ef7565b600067ffffffffffffffff80841115611f2657611f26612569565b604051601f8501601f19908116603f01168101908282118183101715611f4e57611f4e612569565b81604052809350858152868686011115611f6757600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114611f9857600080fd5b919050565b80356001600160601b0381168114611f9857600080fd5b600060208284031215611fc657600080fd5b611fcf82611f81565b9392505050565b60008060408385031215611fe957600080fd5b611ff283611f81565b915061200060208401611f81565b90509250929050565b60008060006060848603121561201e57600080fd5b61202784611f81565b925061203560208501611f81565b9150604084013590509250925092565b6000806000806080858703121561205b57600080fd5b61206485611f81565b935061207260208601611f81565b925060408501359150606085013567ffffffffffffffff81111561209557600080fd5b8501601f810187136120a657600080fd5b6120b587823560208401611f0b565b91505092959194509250565b600080604083850312156120d457600080fd5b6120dd83611f81565b9150602083013580151581146120f257600080fd5b809150509250929050565b6000806040838503121561211057600080fd5b61211983611f81565b946020939093013593505050565b6000806040838503121561213a57600080fd5b61214383611f81565b915061200060208401611f9d565b6000806020838503121561216457600080fd5b823567ffffffffffffffff8082111561217c57600080fd5b818501915085601f83011261219057600080fd5b81358181111561219f57600080fd5b8660208260051b85010111156121b457600080fd5b60209290920196919550909350505050565b6000602082840312156121d857600080fd5b8135611fcf8161257f565b6000602082840312156121f557600080fd5b8151611fcf8161257f565b60006020828403121561221257600080fd5b813560058110611fcf57600080fd5b60006020828403121561223357600080fd5b813567ffffffffffffffff81111561224a57600080fd5b8201601f8101841361225b57600080fd5b611c3784823560208401611f0b565b60006020828403121561227c57600080fd5b5035919050565b60008060006060848603121561229857600080fd5b833592506122a860208501611f81565b91506122b660408501611f9d565b90509250925092565b600080604083850312156122d257600080fd5b50508035926020909101359150565b600081518084526122f98160208601602086016124a5565b601f01601f19169290920160200192915050565b6000825161231f8184602087016124a5565b6877756d626f7061737360b81b92019182525064173539b7b760d91b6009820152600e01919050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061237b908301846122e1565b9695505050505050565b60208101600583106123a757634e487b7160e01b600052602160045260246000fd5b91905290565b602081526000611fcf60208301846122e1565b60208082526022908201527f57756d626f20506173733a2045786365656473204d6178205065722057616c6c604082015261195d60f21b606082015260800190565b6020808252602a908201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646040820152692073616c65507269636560b01b606082015260800190565b6000821982111561245f5761245f612527565b500190565b60008261248157634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156124a0576124a0612527565b500290565b60005b838110156124c05781810151838201526020016124a8565b838111156113025750506000910152565b600181811c908216806124e557607f821691505b6020821081141561250657634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561252057612520612527565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610c4857600080fdfea2646970667358221220980190c452cd3f90854d243823d1ab1d5c86e855b9f3e6fc9694337714378c2564736f6c63430008070033697066733a2f2f516d5444773439684a52684b585839673866794e756a3173647a5642346b753178424248576d5178745472396a702f
Deployed Bytecode
0x6080604052600436106102465760003560e01c806370a08231116101395780639b19251a116100b6578063c002d23d1161007a578063c002d23d14610698578063c19d93fb146106ae578063c87b56dd146106d5578063e985e9c5146106f5578063f2fde38b1461073e578063f80f5dd51461075e57600080fd5b80639b19251a146105fd578063a22cb4651461062d578063aa1b103f1461064d578063ad570dd514610662578063b88d4fde1461067857600080fd5b80638a616bc0116100fd5780638a616bc01461057e5780638da4d3c91461059e5780638da5cb5b146105b457806395d89b41146105d25780639659867e146105e757600080fd5b806370a08231146104e9578063715018a61461050957806378c8cda71461051e5780637f41bf431461053e5780638545f4ea1461055e57600080fd5b80633ccfd60b116101c75780635944c7531161018b5780635944c753146104545780636352211e146104745780636447c35d146104945780636550385b146104b45780636c0360eb146104d457600080fd5b80633ccfd60b146103ca57806342842e0e146103df5780634e71d92d146103ff57806355f804b31461041457806356de96db1461043457600080fd5b80631249c58b1161020e5780631249c58b1461031c57806318160ddd1461032457806323b872dd1461034b5780632995d6c81461036b5780632a55205a1461038b57600080fd5b806301ffc9a71461024b57806304634d8d1461028057806306fdde03146102a2578063081812fc146102c4578063095ea7b3146102fc575b600080fd5b34801561025757600080fd5b5061026b6102663660046121c6565b61077e565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102a061029b366004612127565b61078f565b005b3480156102ae57600080fd5b506102b76107a5565b60405161027791906123ad565b3480156102d057600080fd5b506102e46102df36600461226a565b610837565b6040516001600160a01b039091168152602001610277565b34801561030857600080fd5b506102a06103173660046120fd565b61087b565b6102a0610909565b34801561033057600080fd5b5060015460005403600019015b604051908152602001610277565b34801561035757600080fd5b506102a0610366366004612009565b610b20565b34801561037757600080fd5b506102a061038636600461226a565b610b2b565b34801561039757600080fd5b506103ab6103a63660046122bf565b610c4b565b604080516001600160a01b039093168352602083019190915201610277565b3480156103d657600080fd5b506102a0610cf7565b3480156103eb57600080fd5b506102a06103fa366004612009565b610d8a565b34801561040b57600080fd5b506102a0610da5565b34801561042057600080fd5b506102a061042f366004612221565b610eea565b34801561044057600080fd5b506102a061044f366004612200565b610f05565b34801561046057600080fd5b506102a061046f366004612283565b610f34565b34801561048057600080fd5b506102e461048f36600461226a565b610f47565b3480156104a057600080fd5b506102a06104af366004612151565b610f59565b3480156104c057600080fd5b506102a06104cf36600461226a565b610fd3565b3480156104e057600080fd5b506102b7610fe0565b3480156104f557600080fd5b5061033d610504366004611fb4565b61106e565b34801561051557600080fd5b506102a06110bd565b34801561052a57600080fd5b506102a0610539366004611fb4565b6110cf565b34801561054a57600080fd5b506102a0610559366004612151565b611160565b34801561056a57600080fd5b506102a061057936600461226a565b6111da565b34801561058a57600080fd5b506102a061059936600461226a565b6111e7565b3480156105aa57600080fd5b5061033d60115481565b3480156105c057600080fd5b50600a546001600160a01b03166102e4565b3480156105de57600080fd5b506102b7611200565b3480156105f357600080fd5b5061033d60105481565b34801561060957600080fd5b5061026b610618366004611fb4565b600d6020526000908152604090205460ff1681565b34801561063957600080fd5b506102a06106483660046120c1565b61120f565b34801561065957600080fd5b506102a06112a5565b34801561066e57600080fd5b5061033d600b5481565b34801561068457600080fd5b506102a0610693366004612045565b6112b7565b3480156106a457600080fd5b5061033d600c5481565b3480156106ba57600080fd5b50600f546106c89060ff1681565b6040516102779190612385565b3480156106e157600080fd5b506102b76106f036600461226a565b611308565b34801561070157600080fd5b5061026b610710366004611fd6565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561074a57600080fd5b506102a0610759366004611fb4565b6113ab565b34801561076a57600080fd5b506102a0610779366004611fb4565b611421565b6000610789826114ad565b92915050565b6107976114d2565b6107a1828261152c565b5050565b6060600280546107b4906124d1565b80601f01602080910402602001604051908101604052809291908181526020018280546107e0906124d1565b801561082d5780601f106108025761010080835404028352916020019161082d565b820191906000526020600020905b81548152906001019060200180831161081057829003601f168201915b5050505050905090565b6000610842826115e6565b61085f576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061088682610f47565b9050806001600160a01b0316836001600160a01b031614156108bb5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906108db57506108d98133610710565b155b156108f9576040516367d9dca160e11b815260040160405180910390fd5b61090483838361161f565b505050565b6002600f5460ff1660048111156109225761092261253d565b148061094457506001600f5460ff1660048111156109425761094261253d565b145b6109955760405162461bcd60e51b815260206004820152601b60248201527f57756d626f20506173733a204d696e74204e6f7420416374697665000000000060448201526064015b60405180910390fd5b6001600f5460ff1660048111156109ae576109ae61253d565b1415610a0657336000908152600d602052604090205460ff16610a065760405162461bcd60e51b815260206004820152601060248201526f139bdd081a5b881dda1a5d195b1a5cdd60821b604482015260640161098c565b61030960105410610a595760405162461bcd60e51b815260206004820181905260248201527f57756d626f20506173733a204d696e7420537570706c79204578636565646564604482015260640161098c565b6002600f5460ff166004811115610a7257610a7261253d565b14610a7f57600b54610a83565b600c545b341015610ad25760405162461bcd60e51b815260206004820152601c60248201527f57756d626f20506173733a20496e73756666696369656e742045544800000000604482015260640161098c565b6001610add3361167b565b10610afa5760405162461bcd60e51b815260040161098c906123c0565b600160106000828254610b0d919061244c565b90915550610b1e90503360016116d1565b565b6109048383836116eb565b610b336114d2565b6004600f5460ff166004811115610b4c57610b4c61253d565b14610bb75760405162461bcd60e51b815260206004820152603560248201527f57756d626f20506173733a2043616e6e6f7420436c61696d20556e6d696e74656044820152746420546f6b656e732049662053616c65204c69766560581b606482015260840161098c565b610bc461030960de61244c565b6001546000548391900360001901610bdc919061244c565b1115610c2a5760405162461bcd60e51b815260206004820152601f60248201527f57756d626f20506173733a20546f74616c20537570706c79204d696e74656400604482015260640161098c565b610c4873823d8c84126da1756be69421c78482d0d24d907e826116d1565b50565b60008281526009602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610cc05750604080518082019091526008546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610cdf906001600160601b031687612486565b610ce99190612464565b915196919550909350505050565b610cff6114d2565b604051600090339047908381818185875af1925050503d8060008114610d41576040519150601f19603f3d011682016040523d82523d6000602084013e610d46565b606091505b5050905080610c485760405162461bcd60e51b815260206004820152601060248201526f2bb4ba34323930bb903330b4b632b21760811b604482015260640161098c565b610904838383604051806020016040528060008152506112b7565b6003600f5460ff166004811115610dbe57610dbe61253d565b14610e0b5760405162461bcd60e51b815260206004820152601c60248201527f57756d626f20506173733a20436c61696d204e6f742041637469766500000000604482015260640161098c565b60de60115410610e5d5760405162461bcd60e51b815260206004820181905260248201527f57756d626f20506173733a204d696e7420537570706c79204578636565646564604482015260640161098c565b6001610e683361167b565b10610e855760405162461bcd60e51b815260040161098c906123c0565b336000908152600d602052604090205460ff16610ed75760405162461bcd60e51b815260206004820152601060248201526f139bdd081a5b881dda1a5d195b1a5cdd60821b604482015260640161098c565b600160116000828254610b0d919061244c565b610ef26114d2565b80516107a190600e906020840190611e72565b610f0d6114d2565b600f805482919060ff19166001836004811115610f2c57610f2c61253d565b021790555050565b610f3c6114d2565b610904838383611901565b6000610f52826119cc565b5192915050565b610f616114d2565b60005b81811015610904576001600d6000858585818110610f8457610f84612553565b9050602002016020810190610f999190611fb4565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610fcb8161250c565b915050610f64565b610fdb6114d2565b600b55565b600e8054610fed906124d1565b80601f0160208091040260200160405190810160405280929190818152602001828054611019906124d1565b80156110665780601f1061103b57610100808354040283529160200191611066565b820191906000526020600020905b81548152906001019060200180831161104957829003601f168201915b505050505081565b60006001600160a01b038216611097576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6110c56114d2565b610b1e6000611af5565b6110d76114d2565b6001600160a01b0381166000908152600d602052604090205460ff1661113f5760405162461bcd60e51b815260206004820152601960248201527f50726576696f7573206e6f7420696e2077686974656c69737400000000000000604482015260640161098c565b6001600160a01b03166000908152600d60205260409020805460ff19169055565b6111686114d2565b60005b81811015610904576000600d600085858581811061118b5761118b612553565b90506020020160208101906111a09190611fb4565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806111d28161250c565b91505061116b565b6111e26114d2565b600c55565b6111ef6114d2565b600090815260096020526040812055565b6060600380546107b4906124d1565b6001600160a01b0382163314156112395760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6112ad6114d2565b610b1e6000600855565b6112c28484846116eb565b6001600160a01b0383163b151580156112e457506112e284848484611b47565b155b15611302576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060611313826115e6565b6113775760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161098c565b6000611381611c3f565b905080604051602001611394919061230d565b604051602081830303815290604052915050919050565b6113b36114d2565b6001600160a01b0381166114185760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161098c565b610c4881611af5565b6114296114d2565b6001600160a01b0381166000908152600d602052604090205460ff16156114895760405162461bcd60e51b8152602060048201526014602482015273105b1c9958591e481a5b881dda1a5d195b1a5cdd60621b604482015260640161098c565b6001600160a01b03166000908152600d60205260409020805460ff19166001179055565b60006001600160e01b0319821663152a902d60e11b1480610789575061078982611c4e565b600a546001600160a01b03163314610b1e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161098c565b6127106001600160601b03821611156115575760405162461bcd60e51b815260040161098c90612402565b6001600160a01b0382166115ad5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640161098c565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600855565b6000816001111580156115fa575060005482105b8015610789575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006001600160a01b0382166116a4576040516335ebb31960e01b815260040160405180910390fd5b506001600160a01b0316600090815260056020526040902054600160401b900467ffffffffffffffff1690565b6107a1828260405180602001604052806000815250611c9e565b60006116f6826119cc565b80519091506000906001600160a01b0316336001600160a01b03161480611724575081516117249033610710565b8061173f57503361173484610837565b6001600160a01b0316145b90508061175f57604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146117945760405162a1148160e81b815260040160405180910390fd5b6001600160a01b0384166117bb57604051633a954ecd60e21b815260040160405180910390fd5b6117cb600084846000015161161f565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102179092559086018083529120549091166118b7576000548110156118b7578251600082815260046020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b6127106001600160601b038216111561192c5760405162461bcd60e51b815260040161098c90612402565b6001600160a01b0382166119825760405162461bcd60e51b815260206004820152601b60248201527f455243323938313a20496e76616c696420706172616d65746572730000000000604482015260640161098c565b6040805180820182526001600160a01b0393841681526001600160601b0392831660208083019182526000968752600990529190942093519051909116600160a01b029116179055565b604080516060810182526000808252602082018190529181019190915281806001111580156119fc575060005481105b15611adc57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff16151591810182905290611ada5780516001600160a01b031615611a70579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215611ad5579392505050565b611a70565b505b604051636f96cda160e11b815260040160405180910390fd5b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611b7c903390899088908890600401612348565b602060405180830381600087803b158015611b9657600080fd5b505af1925050508015611bc6575060408051601f3d908101601f19168201909252611bc3918101906121e3565b60015b611c21573d808015611bf4576040519150601f19603f3d011682016040523d82523d6000602084013e611bf9565b606091505b508051611c19576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600e80546107b4906124d1565b60006001600160e01b031982166380ac58cd60e01b1480611c7f57506001600160e01b03198216635b5e139f60e01b145b8061078957506301ffc9a760e01b6001600160e01b0319831614610789565b61090483838360016000546001600160a01b038516611ccf57604051622e076360e81b815260040160405180910390fd5b83611ced5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b429092169190910217905580808501838015611d9a57506001600160a01b0387163b15155b15611e23575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611deb6000888480600101955088611b47565b611e08576040516368d2bf6b60e11b815260040160405180910390fd5b80821415611da0578260005414611e1e57600080fd5b611e69565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415611e24575b506000556118fa565b828054611e7e906124d1565b90600052602060002090601f016020900481019282611ea05760008555611ee6565b82601f10611eb957805160ff1916838001178555611ee6565b82800160010185558215611ee6579182015b82811115611ee6578251825591602001919060010190611ecb565b50611ef2929150611ef6565b5090565b5b80821115611ef25760008155600101611ef7565b600067ffffffffffffffff80841115611f2657611f26612569565b604051601f8501601f19908116603f01168101908282118183101715611f4e57611f4e612569565b81604052809350858152868686011115611f6757600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114611f9857600080fd5b919050565b80356001600160601b0381168114611f9857600080fd5b600060208284031215611fc657600080fd5b611fcf82611f81565b9392505050565b60008060408385031215611fe957600080fd5b611ff283611f81565b915061200060208401611f81565b90509250929050565b60008060006060848603121561201e57600080fd5b61202784611f81565b925061203560208501611f81565b9150604084013590509250925092565b6000806000806080858703121561205b57600080fd5b61206485611f81565b935061207260208601611f81565b925060408501359150606085013567ffffffffffffffff81111561209557600080fd5b8501601f810187136120a657600080fd5b6120b587823560208401611f0b565b91505092959194509250565b600080604083850312156120d457600080fd5b6120dd83611f81565b9150602083013580151581146120f257600080fd5b809150509250929050565b6000806040838503121561211057600080fd5b61211983611f81565b946020939093013593505050565b6000806040838503121561213a57600080fd5b61214383611f81565b915061200060208401611f9d565b6000806020838503121561216457600080fd5b823567ffffffffffffffff8082111561217c57600080fd5b818501915085601f83011261219057600080fd5b81358181111561219f57600080fd5b8660208260051b85010111156121b457600080fd5b60209290920196919550909350505050565b6000602082840312156121d857600080fd5b8135611fcf8161257f565b6000602082840312156121f557600080fd5b8151611fcf8161257f565b60006020828403121561221257600080fd5b813560058110611fcf57600080fd5b60006020828403121561223357600080fd5b813567ffffffffffffffff81111561224a57600080fd5b8201601f8101841361225b57600080fd5b611c3784823560208401611f0b565b60006020828403121561227c57600080fd5b5035919050565b60008060006060848603121561229857600080fd5b833592506122a860208501611f81565b91506122b660408501611f9d565b90509250925092565b600080604083850312156122d257600080fd5b50508035926020909101359150565b600081518084526122f98160208601602086016124a5565b601f01601f19169290920160200192915050565b6000825161231f8184602087016124a5565b6877756d626f7061737360b81b92019182525064173539b7b760d91b6009820152600e01919050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061237b908301846122e1565b9695505050505050565b60208101600583106123a757634e487b7160e01b600052602160045260246000fd5b91905290565b602081526000611fcf60208301846122e1565b60208082526022908201527f57756d626f20506173733a2045786365656473204d6178205065722057616c6c604082015261195d60f21b606082015260800190565b6020808252602a908201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646040820152692073616c65507269636560b01b606082015260800190565b6000821982111561245f5761245f612527565b500190565b60008261248157634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156124a0576124a0612527565b500290565b60005b838110156124c05781810151838201526020016124a8565b838111156113025750506000910152565b600181811c908216806124e557607f821691505b6020821081141561250657634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561252057612520612527565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610c4857600080fdfea2646970667358221220980190c452cd3f90854d243823d1ab1d5c86e855b9f3e6fc9694337714378c2564736f6c63430008070033
Deployed Bytecode Sourcemap
69491:5044:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74175:176;;;;;;;;;;-1:-1:-1;74175:176:0;;;;;:::i;:::-;;:::i;:::-;;;8176:14:1;;8169:22;8151:41;;8139:2;8124:18;74175:176:0;;;;;;;;73333:146;;;;;;;;;;-1:-1:-1;73333:146:0;;;;;:::i;:::-;;:::i;:::-;;29569:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;31072:204::-;;;;;;;;;;-1:-1:-1;31072:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7195:32:1;;;7177:51;;7165:2;7150:18;31072:204:0;7031:203:1;30635:371:0;;;;;;;;;;-1:-1:-1;30635:371:0;;;;;:::i;:::-;;:::i;70369:611::-;;;:::i;25431:303::-;;;;;;;;;;-1:-1:-1;25238:1:0;25685:12;25475:7;25669:13;:28;-1:-1:-1;;25669:46:0;25431:303;;;15231:25:1;;;15219:2;15204:18;25431:303:0;15085:177:1;31929:170:0;;;;;;;;;;-1:-1:-1;31929:170:0;;;;;:::i;:::-;;:::i;72390:349::-;;;;;;;;;;-1:-1:-1;72390:349:0;;;;;:::i;:::-;;:::i;56917:442::-;;;;;;;;;;-1:-1:-1;56917:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;7924:32:1;;;7906:51;;7988:2;7973:18;;7966:34;;;;7879:18;56917:442:0;7732:274:1;74359:173:0;;;;;;;;;;;;;:::i;32170:185::-;;;;;;;;;;-1:-1:-1;32170:185:0;;;;;:::i;:::-;;:::i;70988:410::-;;;;;;;;;;;;;:::i;72183:106::-;;;;;;;;;;-1:-1:-1;72183:106:0;;;;;:::i;:::-;;:::i;72297:85::-;;;;;;;;;;-1:-1:-1;72297:85:0;;;;;:::i;:::-;;:::i;73719:202::-;;;;;;;;;;-1:-1:-1;73719:202:0;;;;;:::i;:::-;;:::i;29378:124::-;;;;;;;;;;-1:-1:-1;29378:124:0;;;;;:::i;:::-;;:::i;71406:193::-;;;;;;;;;;-1:-1:-1;71406:193:0;;;;;:::i;:::-;;:::i;73152:109::-;;;;;;;;;;-1:-1:-1;73152:109:0;;;;;:::i;:::-;;:::i;69988:80::-;;;;;;;;;;;;;:::i;26551:206::-;;;;;;;;;;-1:-1:-1;26551:206:0;;;;;:::i;:::-;;:::i;53538:103::-;;;;;;;;;;;;;:::i;71996:179::-;;;;;;;;;;-1:-1:-1;71996:179:0;;;;;:::i;:::-;;:::i;71607:196::-;;;;;;;;;;-1:-1:-1;71607:196:0;;;;;:::i;:::-;;:::i;73046:98::-;;;;;;;;;;-1:-1:-1;73046:98:0;;;;;:::i;:::-;;:::i;73994:109::-;;;;;;;;;;-1:-1:-1;73994:109:0;;;;;:::i;:::-;;:::i;70154:29::-;;;;;;;;;;;;;;;;52890:87;;;;;;;;;;-1:-1:-1;52963:6:0;;-1:-1:-1;;;;;52963:6:0;52890:87;;29738:104;;;;;;;;;;;;;:::i;70119:28::-;;;;;;;;;;;;;;;;69801:41;;;;;;;;;;-1:-1:-1;69801:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;31348:279;;;;;;;;;;-1:-1:-1;31348:279:0;;;;;:::i;:::-;;:::i;73555:93::-;;;;;;;;;;;;;:::i;69580:43::-;;;;;;;;;;;;;;;;32426:369;;;;;;;;;;-1:-1:-1;32426:369:0;;;;;:::i;:::-;;:::i;69630:37::-;;;;;;;;;;;;;;;;70075;;;;;;;;;;-1:-1:-1;70075:37:0;;;;;;;;;;;;;;;:::i;72747:291::-;;;;;;;;;;-1:-1:-1;72747:291:0;;;;;:::i;:::-;;:::i;31698:164::-;;;;;;;;;;-1:-1:-1;31698:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;31819:25:0;;;31795:4;31819:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;31698:164;53796:201;;;;;;;;;;-1:-1:-1;53796:201:0;;;;;:::i;:::-;;:::i;71815:171::-;;;;;;;;;;-1:-1:-1;71815:171:0;;;;;:::i;:::-;;:::i;74175:176::-;74278:4;74307:36;74331:11;74307:23;:36::i;:::-;74300:43;74175:176;-1:-1:-1;;74175:176:0:o;73333:146::-;52776:13;:11;:13::i;:::-;73429:42:::1;73448:8;73458:12;73429:18;:42::i;:::-;73333:146:::0;;:::o;29569:100::-;29623:13;29656:5;29649:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29569:100;:::o;31072:204::-;31140:7;31165:16;31173:7;31165;:16::i;:::-;31160:64;;31190:34;;-1:-1:-1;;;31190:34:0;;;;;;;;;;;31160:64;-1:-1:-1;31244:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;31244:24:0;;31072:204::o;30635:371::-;30708:13;30724:24;30740:7;30724:15;:24::i;:::-;30708:40;;30769:5;-1:-1:-1;;;;;30763:11:0;:2;-1:-1:-1;;;;;30763:11:0;;30759:48;;;30783:24;;-1:-1:-1;;;30783:24:0;;;;;;;;;;;30759:48;19066:10;-1:-1:-1;;;;;30824:21:0;;;;;;:63;;-1:-1:-1;30850:37:0;30867:5;19066:10;31698:164;:::i;30850:37::-;30849:38;30824:63;30820:138;;;30911:35;;-1:-1:-1;;;30911:35:0;;;;;;;;;;;30820:138;30970:28;30979:2;30983:7;30992:5;30970:8;:28::i;:::-;30697:309;30635:371;;:::o;70369:611::-;70430:11;70421:5;;;;:20;;;;;;;;:::i;:::-;;:47;;;-1:-1:-1;70454:14:0;70445:5;;;;:23;;;;;;;;:::i;:::-;;70421:47;70413:87;;;;-1:-1:-1;;;70413:87:0;;10850:2:1;70413:87:0;;;10832:21:1;10889:2;10869:18;;;10862:30;10928:29;10908:18;;;10901:57;10975:18;;70413:87:0;;;;;;;;;70523:14;70514:5;;;;:23;;;;;;;;:::i;:::-;;70511:104;;;70571:10;70561:21;;;;:9;:21;;;;;;;;70553:50;;;;-1:-1:-1;;;70553:50:0;;11563:2:1;70553:50:0;;;11545:21:1;11602:2;11582:18;;;11575:30;-1:-1:-1;;;11621:18:1;;;11614:46;11677:18;;70553:50:0;11361:340:1;70553:50:0;69747:3;70633:9;;:23;70625:68;;;;-1:-1:-1;;;70625:68:0;;11908:2:1;70625:68:0;;;11890:21:1;;;11927:18;;;11920:30;11986:34;11966:18;;;11959:62;12038:18;;70625:68:0;11706:356:1;70625:68:0;70735:11;70726:5;;;;:20;;;;;;;;:::i;:::-;;:52;;70762:16;;70726:52;;;70749:10;;70726:52;70712:9;:67;;70704:108;;;;-1:-1:-1;;;70704:108:0;;12269:2:1;70704:108:0;;;12251:21:1;12308:2;12288:18;;;12281:30;12347;12327:18;;;12320:58;12395:18;;70704:108:0;12067:352:1;70704:108:0;69791:1;70831:25;70845:10;70831:13;:25::i;:::-;:42;70823:89;;;;-1:-1:-1;;;70823:89:0;;;;;;;:::i;:::-;70936:1;70923:9;;:14;;;;;;;:::i;:::-;;;;-1:-1:-1;70948:24:0;;-1:-1:-1;70958:10:0;70970:1;70948:9;:24::i;:::-;70369:611::o;31929:170::-;32063:28;32073:4;32079:2;32083:7;32063:9;:28::i;72390:349::-;52776:13;:11;:13::i;:::-;72484:12:::1;72475:5;::::0;::::1;;:21;::::0;::::1;;;;;;:::i;:::-;;72467:87;;;::::0;-1:-1:-1;;;72467:87:0;;10083:2:1;72467:87:0::1;::::0;::::1;10065:21:1::0;10122:2;10102:18;;;10095:30;10161:34;10141:18;;;10134:62;-1:-1:-1;;;10212:18:1;;;10205:51;10273:19;;72467:87:0::1;9881:417:1::0;72467:87:0::1;72597:26;69747:3;69706;72597:26;:::i;:::-;25238:1:::0;25685:12;25475:7;25669:13;72589:4;;25669:28;;-1:-1:-1;;25669:46:0;72573:20:::1;;;;:::i;:::-;:50;;72565:94;;;::::0;-1:-1:-1;;;72565:94:0;;13806:2:1;72565:94:0::1;::::0;::::1;13788:21:1::0;13845:2;13825:18;;;13818:30;13884:33;13864:18;;;13857:61;13935:18;;72565:94:0::1;13604:355:1::0;72565:94:0::1;72672:59;72682:42;72726:4;72672:9;:59::i;:::-;72390:349:::0;:::o;56917:442::-;57014:7;57072:27;;;:17;:27;;;;;;;;57043:56;;;;;;;;;-1:-1:-1;;;;;57043:56:0;;;;;-1:-1:-1;;;57043:56:0;;;-1:-1:-1;;;;;57043:56:0;;;;;;;;57014:7;;57112:92;;-1:-1:-1;57163:29:0;;;;;;;;;57173:19;57163:29;-1:-1:-1;;;;;57163:29:0;;;;-1:-1:-1;;;57163:29:0;;-1:-1:-1;;;;;57163:29:0;;;;;57112:92;57254:23;;;;57216:21;;57725:5;;57241:36;;-1:-1:-1;;;;;57241:36:0;:10;:36;:::i;:::-;57240:58;;;;:::i;:::-;57319:16;;;;;-1:-1:-1;56917:442:0;;-1:-1:-1;;;;56917:442:0:o;74359:173::-;52776:13;:11;:13::i;:::-;74428:49:::1;::::0;74410:12:::1;::::0;74428:10:::1;::::0;74451:21:::1;::::0;74410:12;74428:49;74410:12;74428:49;74451:21;74428:10;:49:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74409:68;;;74496:7;74488:36;;;::::0;-1:-1:-1;;;74488:36:0;;10505:2:1;74488:36:0::1;::::0;::::1;10487:21:1::0;10544:2;10524:18;;;10517:30;-1:-1:-1;;;10563:18:1;;;10556:46;10619:18;;74488:36:0::1;10303:340:1::0;32170:185:0;32308:39;32325:4;32331:2;32335:7;32308:39;;;;;;;;;;;;:16;:39::i;70988:410::-;71042:12;71033:5;;;;:21;;;;;;;;:::i;:::-;;71025:62;;;;-1:-1:-1;;;71025:62:0;;11206:2:1;71025:62:0;;;11188:21:1;11245:2;11225:18;;;11218:30;11284;11264:18;;;11257:58;11332:18;;71025:62:0;11004:352:1;71025:62:0;69706:3;71106:10;;:25;71098:70;;;;-1:-1:-1;;;71098:70:0;;11908:2:1;71098:70:0;;;11890:21:1;;;11927:18;;;11920:30;11986:34;11966:18;;;11959:62;12038:18;;71098:70:0;11706:356:1;71098:70:0;69791:1;71187:25;71201:10;71187:13;:25::i;:::-;:42;71179:89;;;;-1:-1:-1;;;71179:89:0;;;;;;;:::i;:::-;71297:10;71287:21;;;;:9;:21;;;;;;;;71279:50;;;;-1:-1:-1;;;71279:50:0;;11563:2:1;71279:50:0;;;11545:21:1;11602:2;11582:18;;;11575:30;-1:-1:-1;;;11621:18:1;;;11614:46;11677:18;;71279:50:0;11361:340:1;71279:50:0;71354:1;71340:10;;:15;;;;;;;:::i;72183:106::-;52776:13;:11;:13::i;:::-;72260:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;72297:85::-:0;52776:13;:11;:13::i;:::-;72360:5:::1;:14:::0;;72368:6;;72360:5;-1:-1:-1;;72360:14:0::1;::::0;72368:6;72360:14:::1;::::0;::::1;;;;;;:::i;:::-;;;;;;72297:85:::0;:::o;73719:202::-;52776:13;:11;:13::i;:::-;73864:49:::1;73881:7;73890:8;73900:12;73864:16;:49::i;29378:124::-:0;29442:7;29469:20;29481:7;29469:11;:20::i;:::-;:25;;29378:124;-1:-1:-1;;29378:124:0:o;71406:193::-;52776:13;:11;:13::i;:::-;71493:9:::1;71488:104;71508:20:::0;;::::1;71488:104;;;71576:4;71550:9;:23;71560:9;;71570:1;71560:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;71550:23:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;71550:23:0;:30;;-1:-1:-1;;71550:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;71530:3;::::1;::::0;::::1;:::i;:::-;;;;71488:104;;73152:109:::0;52776:13;:11;:13::i;:::-;73226:16:::1;:27:::0;73152:109::o;69988:80::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26551:206::-;26615:7;-1:-1:-1;;;;;26639:19:0;;26635:60;;26667:28;;-1:-1:-1;;;26667:28:0;;;;;;;;;;;26635:60;-1:-1:-1;;;;;;26721:19:0;;;;;:12;:19;;;;;:27;;;;26551:206::o;53538:103::-;52776:13;:11;:13::i;:::-;53603:30:::1;53630:1;53603:18;:30::i;71996:179::-:0;52776:13;:11;:13::i;:::-;-1:-1:-1;;;;;72078:20:0;::::1;;::::0;;;:9:::1;:20;::::0;;;;;::::1;;72070:58;;;::::0;-1:-1:-1;;;72070:58:0;;9380:2:1;72070:58:0::1;::::0;::::1;9362:21:1::0;9419:2;9399:18;;;9392:30;9458:27;9438:18;;;9431:55;9503:18;;72070:58:0::1;9178:349:1::0;72070:58:0::1;-1:-1:-1::0;;;;;72139:20:0::1;72162:5;72139:20:::0;;;:9:::1;:20;::::0;;;;:28;;-1:-1:-1;;72139:28:0::1;::::0;;71996:179::o;71607:196::-;52776:13;:11;:13::i;:::-;71696:9:::1;71691:105;71711:20:::0;;::::1;71691:105;;;71779:5;71753:9;:23;71763:9;;71773:1;71763:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;71753:23:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;71753:23:0;:31;;-1:-1:-1;;71753:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;71733:3;::::1;::::0;::::1;:::i;:::-;;;;71691:105;;73046:98:::0;52776:13;:11;:13::i;:::-;73115:10:::1;:21:::0;73046:98::o;73994:109::-;52776:13;:11;:13::i;:::-;59373:26;;;;:17;:26;;;;;59366:33;72390:349::o;29738:104::-;29794:13;29827:7;29820:14;;;;;:::i;31348:279::-;-1:-1:-1;;;;;31439:24:0;;19066:10;31439:24;31435:54;;;31472:17;;-1:-1:-1;;;31472:17:0;;;;;;;;;;;31435:54;19066:10;31502:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;31502:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;31502:53:0;;;;;;;;;;31571:48;;8151:41:1;;;31502:42:0;;19066:10;31571:48;;8124:18:1;31571:48:0;;;;;;;31348:279;;:::o;73555:93::-;52776:13;:11;:13::i;:::-;73617:23:::1;58485:19:::0;;58478:26;58417:95;32426:369;32593:28;32603:4;32609:2;32613:7;32593:9;:28::i;:::-;-1:-1:-1;;;;;32636:13:0;;11276:19;:23;;32636:76;;;;;32656:56;32687:4;32693:2;32697:7;32706:5;32656:30;:56::i;:::-;32655:57;32636:76;32632:156;;;32736:40;;-1:-1:-1;;;32736:40:0;;;;;;;;;;;32632:156;32426:369;;;;:::o;72747:291::-;72813:13;72847:17;72855:8;72847:7;:17::i;:::-;72839:77;;;;-1:-1:-1;;;72839:77:0;;12987:2:1;72839:77:0;;;12969:21:1;13026:2;13006:18;;;12999:30;13065:34;13045:18;;;13038:62;-1:-1:-1;;;13116:18:1;;;13109:45;13171:19;;72839:77:0;12785:411:1;72839:77:0;72927:18;72948:10;:8;:10::i;:::-;72927:31;;73002:4;72985:44;;;;;;;;:::i;:::-;;;;;;;;;;;;;72971:59;;;72747:291;;;:::o;53796:201::-;52776:13;:11;:13::i;:::-;-1:-1:-1;;;;;53885:22:0;::::1;53877:73;;;::::0;-1:-1:-1;;;53877:73:0;;8973:2:1;53877:73:0::1;::::0;::::1;8955:21:1::0;9012:2;8992:18;;;8985:30;9051:34;9031:18;;;9024:62;-1:-1:-1;;;9102:18:1;;;9095:36;9148:19;;53877:73:0::1;8771:402:1::0;53877:73:0::1;53961:28;53980:8;53961:18;:28::i;71815:171::-:0;52776:13;:11;:13::i;:::-;-1:-1:-1;;;;;71895:20:0;::::1;;::::0;;;:9:::1;:20;::::0;;;;;::::1;;71894:21;71886:54;;;::::0;-1:-1:-1;;;71886:54:0;;9734:2:1;71886:54:0::1;::::0;::::1;9716:21:1::0;9773:2;9753:18;;;9746:30;-1:-1:-1;;;9792:18:1;;;9785:50;9852:18;;71886:54:0::1;9532:344:1::0;71886:54:0::1;-1:-1:-1::0;;;;;71951:20:0::1;;::::0;;;:9:::1;:20;::::0;;;;:27;;-1:-1:-1;;71951:27:0::1;71974:4;71951:27;::::0;;71815:171::o;56647:215::-;56749:4;-1:-1:-1;;;;;;56773:41:0;;-1:-1:-1;;;56773:41:0;;:81;;;56818:36;56842:11;56818:23;:36::i;53055:132::-;52963:6;;-1:-1:-1;;;;;52963:6:0;19066:10;53119:23;53111:68;;;;-1:-1:-1;;;53111:68:0;;12626:2:1;53111:68:0;;;12608:21:1;;;12645:18;;;12638:30;12704:34;12684:18;;;12677:62;12756:18;;53111:68:0;12424:356:1;58009:332:0;57725:5;-1:-1:-1;;;;;58112:33:0;;;;58104:88;;;;-1:-1:-1;;;58104:88:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;58211:22:0;;58203:60;;;;-1:-1:-1;;;58203:60:0;;14933:2:1;58203:60:0;;;14915:21:1;14972:2;14952:18;;;14945:30;15011:27;14991:18;;;14984:55;15056:18;;58203:60:0;14731:349:1;58203:60:0;58298:35;;;;;;;;;-1:-1:-1;;;;;58298:35:0;;;;;;-1:-1:-1;;;;;58298:35:0;;;;;;;;;;-1:-1:-1;;;58276:57:0;;;;:19;:57;58009:332::o;33050:187::-;33107:4;33150:7;25238:1;33131:26;;:53;;;;;33171:13;;33161:7;:23;33131:53;:98;;;;-1:-1:-1;;33202:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;33202:27:0;;;;33201:28;;33050:187::o;40661:196::-;40776:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;40776:29:0;-1:-1:-1;;;;;40776:29:0;;;;;;;;;40821:28;;40776:24;;40821:28;;;;;;;40661:196;;;:::o;26839:207::-;26900:7;-1:-1:-1;;;;;26924:19:0;;26920:59;;26952:27;;-1:-1:-1;;;26952:27:0;;;;;;;;;;;26920:59;-1:-1:-1;;;;;;27005:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;27005:32:0;;;;;26839:207::o;33245:104::-;33314:27;33324:2;33328:8;33314:27;;;;;;;;;;;;:9;:27::i;36163:2112::-;36278:35;36316:20;36328:7;36316:11;:20::i;:::-;36391:18;;36278:58;;-1:-1:-1;36349:22:0;;-1:-1:-1;;;;;36375:34:0;19066:10;-1:-1:-1;;;;;36375:34:0;;:101;;;-1:-1:-1;36443:18:0;;36426:50;;19066:10;31698:164;:::i;36426:50::-;36375:154;;;-1:-1:-1;19066:10:0;36493:20;36505:7;36493:11;:20::i;:::-;-1:-1:-1;;;;;36493:36:0;;36375:154;36349:181;;36548:17;36543:66;;36574:35;;-1:-1:-1;;;36574:35:0;;;;;;;;;;;36543:66;36646:4;-1:-1:-1;;;;;36624:26:0;:13;:18;;;-1:-1:-1;;;;;36624:26:0;;36620:67;;36659:28;;-1:-1:-1;;;36659:28:0;;;;;;;;;;;36620:67;-1:-1:-1;;;;;36702:16:0;;36698:52;;36727:23;;-1:-1:-1;;;36727:23:0;;;;;;;;;;;36698:52;36871:49;36888:1;36892:7;36901:13;:18;;;36871:8;:49::i;:::-;-1:-1:-1;;;;;37216:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;37216:31:0;;;;;;;-1:-1:-1;;37216:31:0;;;;;;;37262:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;37262:29:0;;;;;;;;;;;37308:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;37353:61:0;;;;-1:-1:-1;;;37398:15:0;37353:61;;;;;;;;;;;37688:11;;;37718:24;;;;;:29;37688:11;;37718:29;37714:445;;37943:13;;37929:11;:27;37925:219;;;38013:18;;;37981:24;;;:11;:24;;;;;;;;:50;;38096:28;;;;38054:70;;-1:-1:-1;;;38054:70:0;-1:-1:-1;;;;;;38054:70:0;;;-1:-1:-1;;;;;37981:50:0;;;38054:70;;;;;;;37925:219;37191:979;38206:7;38202:2;-1:-1:-1;;;;;38187:27:0;38196:4;-1:-1:-1;;;;;38187:27:0;;;;;;;;;;;38225:42;36267:2008;;36163:2112;;;:::o;58792:390::-;57725:5;-1:-1:-1;;;;;58944:33:0;;;;58936:88;;;;-1:-1:-1;;;58936:88:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;59043:22:0;;59035:62;;;;-1:-1:-1;;;59035:62:0;;14166:2:1;59035:62:0;;;14148:21:1;14205:2;14185:18;;;14178:30;14244:29;14224:18;;;14217:57;14291:18;;59035:62:0;13964:351:1;59035:62:0;59139:35;;;;;;;;-1:-1:-1;;;;;59139:35:0;;;;;-1:-1:-1;;;;;59139:35:0;;;;;;;;;;-1:-1:-1;59110:26:0;;;:17;:26;;;;;;:64;;;;;;;-1:-1:-1;;;59110:64:0;;;;;;58792:390::o;28208:1108::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;28318:7:0;;25238:1;28367:23;;:47;;;;;28401:13;;28394:4;:20;28367:47;28363:886;;;28435:31;28469:17;;;:11;:17;;;;;;;;;28435:51;;;;;;;;;-1:-1:-1;;;;;28435:51:0;;;;-1:-1:-1;;;28435:51:0;;;;;;;;;;;-1:-1:-1;;;28435:51:0;;;;;;;;;;;;;;28505:729;;28555:14;;-1:-1:-1;;;;;28555:28:0;;28551:101;;28619:9;28208:1108;-1:-1:-1;;;28208:1108:0:o;28551:101::-;-1:-1:-1;;;28994:6:0;29039:17;;;;:11;:17;;;;;;;;;29027:29;;;;;;;;;-1:-1:-1;;;;;29027:29:0;;;;;-1:-1:-1;;;29027:29:0;;;;;;;;;;;-1:-1:-1;;;29027:29:0;;;;;;;;;;;;;29087:28;29083:109;;29155:9;28208:1108;-1:-1:-1;;;28208:1108:0:o;29083:109::-;28954:261;;;28416:833;28363:886;29277:31;;-1:-1:-1;;;29277:31:0;;;;;;;;;;;54157:191;54250:6;;;-1:-1:-1;;;;;54267:17:0;;;-1:-1:-1;;;;;;54267:17:0;;;;;;;54300:40;;54250:6;;;54267:17;54250:6;;54300:40;;54231:16;;54300:40;54220:128;54157:191;:::o;41349:667::-;41533:72;;-1:-1:-1;;;41533:72:0;;41512:4;;-1:-1:-1;;;;;41533:36:0;;;;;:72;;19066:10;;41584:4;;41590:7;;41599:5;;41533:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41533:72:0;;;;;;;;-1:-1:-1;;41533:72:0;;;;;;;;;;;;:::i;:::-;;;41529:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41767:13:0;;41763:235;;41813:40;;-1:-1:-1;;;41813:40:0;;;;;;;;;;;41763:235;41956:6;41950:13;41941:6;41937:2;41933:15;41926:38;41529:480;-1:-1:-1;;;;;;41652:55:0;-1:-1:-1;;;41652:55:0;;-1:-1:-1;41529:480:0;41349:667;;;;;;:::o;70253:108::-;70313:13;70346:7;70339:14;;;;;:::i;26182:305::-;26284:4;-1:-1:-1;;;;;;26321:40:0;;-1:-1:-1;;;26321:40:0;;:105;;-1:-1:-1;;;;;;;26378:48:0;;-1:-1:-1;;;26378:48:0;26321:105;:158;;;-1:-1:-1;;;;;;;;;;1850:40:0;;;26443:36;1741:157;33712:163;33835:32;33841:2;33845:8;33855:5;33862:4;34273:20;34296:13;-1:-1:-1;;;;;34324:16:0;;34320:48;;34349:19;;-1:-1:-1;;;34349:19:0;;;;;;;;;;;34320:48;34383:13;34379:44;;34405:18;;-1:-1:-1;;;34405:18:0;;;;;;;;;;;34379:44;-1:-1:-1;;;;;34774:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;34833:49:0;;34774:44;;;;;;;;34833:49;;;-1:-1:-1;;;;;34774:44:0;;;;;;34833:49;;;;;;;;;;;;;;;;34899:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;34949:66:0;;;;-1:-1:-1;;;34999:15:0;34949:66;;;;;;;;;;34899:25;35096:23;;;35140:4;:23;;;;-1:-1:-1;;;;;;35148:13:0;;11276:19;:23;;35148:15;35136:641;;;35184:314;35215:38;;35240:12;;-1:-1:-1;;;;;35215:38:0;;;35232:1;;35215:38;;35232:1;;35215:38;35281:69;35320:1;35324:2;35328:14;;;;;;35344:5;35281:30;:69::i;:::-;35276:174;;35386:40;;-1:-1:-1;;;35386:40:0;;;;;;;;;;;35276:174;35493:3;35477:12;:19;;35184:314;;35579:12;35562:13;;:29;35558:43;;35593:8;;;35558:43;35136:641;;;35642:120;35673:40;;35698:14;;;;;-1:-1:-1;;;;;35673:40:0;;;35690:1;;35673:40;;35690:1;;35673:40;35757:3;35741:12;:19;;35642:120;;35136:641;-1:-1:-1;35791:13:0;:28;35841:60;32426:369;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:179::-;895:20;;-1:-1:-1;;;;;944:38:1;;934:49;;924:77;;997:1;994;987:12;1012:186;1071:6;1124:2;1112:9;1103:7;1099:23;1095:32;1092:52;;;1140:1;1137;1130:12;1092:52;1163:29;1182:9;1163:29;:::i;:::-;1153:39;1012:186;-1:-1:-1;;;1012:186:1:o;1203:260::-;1271:6;1279;1332:2;1320:9;1311:7;1307:23;1303:32;1300:52;;;1348:1;1345;1338:12;1300:52;1371:29;1390:9;1371:29;:::i;:::-;1361:39;;1419:38;1453:2;1442:9;1438:18;1419:38;:::i;:::-;1409:48;;1203:260;;;;;:::o;1468:328::-;1545:6;1553;1561;1614:2;1602:9;1593:7;1589:23;1585:32;1582:52;;;1630:1;1627;1620:12;1582:52;1653:29;1672:9;1653:29;:::i;:::-;1643:39;;1701:38;1735:2;1724:9;1720:18;1701:38;:::i;:::-;1691:48;;1786:2;1775:9;1771:18;1758:32;1748:42;;1468:328;;;;;:::o;1801:666::-;1896:6;1904;1912;1920;1973:3;1961:9;1952:7;1948:23;1944:33;1941:53;;;1990:1;1987;1980:12;1941:53;2013:29;2032:9;2013:29;:::i;:::-;2003:39;;2061:38;2095:2;2084:9;2080:18;2061:38;:::i;:::-;2051:48;;2146:2;2135:9;2131:18;2118:32;2108:42;;2201:2;2190:9;2186:18;2173:32;2228:18;2220:6;2217:30;2214:50;;;2260:1;2257;2250:12;2214:50;2283:22;;2336:4;2328:13;;2324:27;-1:-1:-1;2314:55:1;;2365:1;2362;2355:12;2314:55;2388:73;2453:7;2448:2;2435:16;2430:2;2426;2422:11;2388:73;:::i;:::-;2378:83;;;1801:666;;;;;;;:::o;2472:347::-;2537:6;2545;2598:2;2586:9;2577:7;2573:23;2569:32;2566:52;;;2614:1;2611;2604:12;2566:52;2637:29;2656:9;2637:29;:::i;:::-;2627:39;;2716:2;2705:9;2701:18;2688:32;2763:5;2756:13;2749:21;2742:5;2739:32;2729:60;;2785:1;2782;2775:12;2729:60;2808:5;2798:15;;;2472:347;;;;;:::o;2824:254::-;2892:6;2900;2953:2;2941:9;2932:7;2928:23;2924:32;2921:52;;;2969:1;2966;2959:12;2921:52;2992:29;3011:9;2992:29;:::i;:::-;2982:39;3068:2;3053:18;;;;3040:32;;-1:-1:-1;;;2824:254:1:o;3083:258::-;3150:6;3158;3211:2;3199:9;3190:7;3186:23;3182:32;3179:52;;;3227:1;3224;3217:12;3179:52;3250:29;3269:9;3250:29;:::i;:::-;3240:39;;3298:37;3331:2;3320:9;3316:18;3298:37;:::i;3346:615::-;3432:6;3440;3493:2;3481:9;3472:7;3468:23;3464:32;3461:52;;;3509:1;3506;3499:12;3461:52;3549:9;3536:23;3578:18;3619:2;3611:6;3608:14;3605:34;;;3635:1;3632;3625:12;3605:34;3673:6;3662:9;3658:22;3648:32;;3718:7;3711:4;3707:2;3703:13;3699:27;3689:55;;3740:1;3737;3730:12;3689:55;3780:2;3767:16;3806:2;3798:6;3795:14;3792:34;;;3822:1;3819;3812:12;3792:34;3875:7;3870:2;3860:6;3857:1;3853:14;3849:2;3845:23;3841:32;3838:45;3835:65;;;3896:1;3893;3886:12;3835:65;3927:2;3919:11;;;;;3949:6;;-1:-1:-1;3346:615:1;;-1:-1:-1;;;;3346:615:1:o;3966:245::-;4024:6;4077:2;4065:9;4056:7;4052:23;4048:32;4045:52;;;4093:1;4090;4083:12;4045:52;4132:9;4119:23;4151:30;4175:5;4151:30;:::i;4216:249::-;4285:6;4338:2;4326:9;4317:7;4313:23;4309:32;4306:52;;;4354:1;4351;4344:12;4306:52;4386:9;4380:16;4405:30;4429:5;4405:30;:::i;4470:267::-;4540:6;4593:2;4581:9;4572:7;4568:23;4564:32;4561:52;;;4609:1;4606;4599:12;4561:52;4648:9;4635:23;4687:1;4680:5;4677:12;4667:40;;4703:1;4700;4693:12;4742:450;4811:6;4864:2;4852:9;4843:7;4839:23;4835:32;4832:52;;;4880:1;4877;4870:12;4832:52;4920:9;4907:23;4953:18;4945:6;4942:30;4939:50;;;4985:1;4982;4975:12;4939:50;5008:22;;5061:4;5053:13;;5049:27;-1:-1:-1;5039:55:1;;5090:1;5087;5080:12;5039:55;5113:73;5178:7;5173:2;5160:16;5155:2;5151;5147:11;5113:73;:::i;5197:180::-;5256:6;5309:2;5297:9;5288:7;5284:23;5280:32;5277:52;;;5325:1;5322;5315:12;5277:52;-1:-1:-1;5348:23:1;;5197:180;-1:-1:-1;5197:180:1:o;5382:326::-;5458:6;5466;5474;5527:2;5515:9;5506:7;5502:23;5498:32;5495:52;;;5543:1;5540;5533:12;5495:52;5579:9;5566:23;5556:33;;5608:38;5642:2;5631:9;5627:18;5608:38;:::i;:::-;5598:48;;5665:37;5698:2;5687:9;5683:18;5665:37;:::i;:::-;5655:47;;5382:326;;;;;:::o;5713:248::-;5781:6;5789;5842:2;5830:9;5821:7;5817:23;5813:32;5810:52;;;5858:1;5855;5848:12;5810:52;-1:-1:-1;;5881:23:1;;;5951:2;5936:18;;;5923:32;;-1:-1:-1;5713:248:1:o;5966:257::-;6007:3;6045:5;6039:12;6072:6;6067:3;6060:19;6088:63;6144:6;6137:4;6132:3;6128:14;6121:4;6114:5;6110:16;6088:63;:::i;:::-;6205:2;6184:15;-1:-1:-1;;6180:29:1;6171:39;;;;6212:4;6167:50;;5966:257;-1:-1:-1;;5966:257:1:o;6228:588::-;6561:3;6599:6;6593:13;6615:53;6661:6;6656:3;6649:4;6641:6;6637:17;6615:53;:::i;:::-;-1:-1:-1;;;6690:16:1;;6715:26;;;-1:-1:-1;;;;6768:1:1;6757:13;;6750:30;6807:2;6796:14;;6228:588;-1:-1:-1;6228:588:1:o;7239:488::-;-1:-1:-1;;;;;7508:15:1;;;7490:34;;7560:15;;7555:2;7540:18;;7533:43;7607:2;7592:18;;7585:34;;;7655:3;7650:2;7635:18;;7628:31;;;7433:4;;7676:45;;7701:19;;7693:6;7676:45;:::i;:::-;7668:53;7239:488;-1:-1:-1;;;;;;7239:488:1:o;8203:339::-;8346:2;8331:18;;8379:1;8368:13;;8358:144;;8424:10;8419:3;8415:20;8412:1;8405:31;8459:4;8456:1;8449:15;8487:4;8484:1;8477:15;8358:144;8511:25;;;8203:339;:::o;8547:219::-;8696:2;8685:9;8678:21;8659:4;8716:44;8756:2;8745:9;8741:18;8733:6;8716:44;:::i;13201:398::-;13403:2;13385:21;;;13442:2;13422:18;;;13415:30;13481:34;13476:2;13461:18;;13454:62;-1:-1:-1;;;13547:2:1;13532:18;;13525:32;13589:3;13574:19;;13201:398::o;14320:406::-;14522:2;14504:21;;;14561:2;14541:18;;;14534:30;14600:34;14595:2;14580:18;;14573:62;-1:-1:-1;;;14666:2:1;14651:18;;14644:40;14716:3;14701:19;;14320:406::o;15267:128::-;15307:3;15338:1;15334:6;15331:1;15328:13;15325:39;;;15344:18;;:::i;:::-;-1:-1:-1;15380:9:1;;15267:128::o;15400:217::-;15440:1;15466;15456:132;;15510:10;15505:3;15501:20;15498:1;15491:31;15545:4;15542:1;15535:15;15573:4;15570:1;15563:15;15456:132;-1:-1:-1;15602:9:1;;15400:217::o;15622:168::-;15662:7;15728:1;15724;15720:6;15716:14;15713:1;15710:21;15705:1;15698:9;15691:17;15687:45;15684:71;;;15735:18;;:::i;:::-;-1:-1:-1;15775:9:1;;15622:168::o;15795:258::-;15867:1;15877:113;15891:6;15888:1;15885:13;15877:113;;;15967:11;;;15961:18;15948:11;;;15941:39;15913:2;15906:10;15877:113;;;16008:6;16005:1;16002:13;15999:48;;;-1:-1:-1;;16043:1:1;16025:16;;16018:27;15795:258::o;16058:380::-;16137:1;16133:12;;;;16180;;;16201:61;;16255:4;16247:6;16243:17;16233:27;;16201:61;16308:2;16300:6;16297:14;16277:18;16274:38;16271:161;;;16354:10;16349:3;16345:20;16342:1;16335:31;16389:4;16386:1;16379:15;16417:4;16414:1;16407:15;16271:161;;16058:380;;;:::o;16443:135::-;16482:3;-1:-1:-1;;16503:17:1;;16500:43;;;16523:18;;:::i;:::-;-1:-1:-1;16570:1:1;16559:13;;16443:135::o;16583:127::-;16644:10;16639:3;16635:20;16632:1;16625:31;16675:4;16672:1;16665:15;16699:4;16696:1;16689:15;16715:127;16776:10;16771:3;16767:20;16764:1;16757:31;16807:4;16804:1;16797:15;16831:4;16828:1;16821:15;16847:127;16908:10;16903:3;16899:20;16896:1;16889:31;16939:4;16936:1;16929:15;16963:4;16960:1;16953:15;16979:127;17040:10;17035:3;17031:20;17028:1;17021:31;17071:4;17068:1;17061:15;17095:4;17092:1;17085:15;17111:131;-1:-1:-1;;;;;;17185:32:1;;17175:43;;17165:71;;17232:1;17229;17222:12
Swarm Source
ipfs://980190c452cd3f90854d243823d1ab1d5c86e855b9f3e6fc9694337714378c25
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.