Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
1,218 ADVB
Holders
491
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 ADVBLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
HalflingsContractClaim
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-19 */ /** *Submitted for verification at Etherscan.io on 2022-06-24 */ //*********************************************************************// //*********************************************************************// // // ___ ____ _ _________ __________ ______ ____ __ _______ ____ _________ ________________ // / | / __ \ | / / ____/ | / /_ __/ / / / __ \/ __ \/ / / / ___/ / __ )/ ____/ | / ___/_ __/ ___/ // / /| | / / / / | / / __/ / |/ / / / / / / / /_/ / / / / / / /\__ \ / __ / __/ / /| | \__ \ / / \__ \ // / ___ |/ /_/ /| |/ / /___/ /| / / / / /_/ / _, _/ /_/ / /_/ /___/ / / /_/ / /___/ ___ |___/ // / ___/ / ///_/ |_/_____/ |___/_____/_/ |_/ /_/ \____/_/ |_|\____/\____//____/ /_____/_____/_/ |_/____//_/ /____/ // // //*********************************************************************// //*********************************************************************// //-------------DEPENDENCIES--------------------------// // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if account is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, isContract will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on isContract to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's transfer: sends amount wei to * recipient, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by transfer, making them unable to receive funds via * transfer. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to recipient, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level call. A * plain call is an unsafe replacement for a function call: use this * function instead. * * If target reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[abi.decode]. * * Requirements: * * - target must be a contract. * - calling target with data must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[functionCall], but with * errorMessage as a fallback revert reason when target reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[functionCall], * but also transferring value wei to target. * * Requirements: * * - the calling contract must have an ETH balance of at least value. * - the called Solidity function must be payable. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[functionCallWithValue], but * with errorMessage as a fallback revert reason when target reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[functionCall], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[functionCall], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[functionCall], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[functionCall], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} tokenId token is transferred to this contract via {IERC721-safeTransferFrom} * by operator from from, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with IERC721.onERC721Received.selector. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } //File : @openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol /** * @dev Implementation of the {IERC721Receiver} interface. * * Accepts all token transfers. * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}. */ contract ERC721Holder is IERC721Receiver { /** * @dev See {IERC721Receiver-onERC721Received}. * * Always returns `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address, address, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC721Received.selector; } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * interfaceId. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when tokenId token is transferred from from to to. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when owner enables approved to manage the tokenId token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when owner enables or disables (approved) operator to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in owner's account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the tokenId token. * * Requirements: * * - tokenId must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers tokenId token from from to to, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - from cannot be the zero address. * - to cannot be the zero address. * - tokenId token must exist and be owned by from. * - If the caller is not from, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If to refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers tokenId token from from to to. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - from cannot be the zero address. * - to cannot be the zero address. * - tokenId token must be owned by from. * - If the caller is not from, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to to to transfer tokenId token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - tokenId must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for tokenId token. * * Requirements: * * - tokenId must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove operator as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The operator cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the operator is allowed to manage all of the assets of owner. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers tokenId token from from to to. * * Requirements: * * - from cannot be the zero address. * - to cannot be the zero address. * - tokenId token must exist and be owned by from. * - If the caller is not from, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If to refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by owner at a given index of its token list. * Use along with {balanceOf} to enumerate all of owner's tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given index of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for tokenId token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a uint256 to its ASCII string hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a uint256 to its ASCII string hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from ReentrancyGuard will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single nonReentrant guard, functions marked as * nonReentrant may not call one another. This can be worked around by making * those functions private, and then adding external nonReentrant entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a nonReentrant function from another nonReentrant * function is not supported. It is possible to prevent this from happening * by making the nonReentrant function external, and making it call a * private function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * onlyOwner, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * onlyOwner functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (newOwner). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (newOwner). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } //-------------END DEPENDENCIES------------------------// /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable 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 the number of issuable tokens (collection size) is capped and fits in a uint128. * * Does not support burning tokens to address(0). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } // uint256 private currentIndex; uint256 public immutable collectionSize; uint256 public maxBatchSize; // 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) private _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; mapping(uint8=>uint256) public currentIndexCollections; struct NFTRange{ uint256 start; uint256 end; } mapping(uint8=>NFTRange) public collectionRange; uint256 private _totalSupply; /** * @dev * maxBatchSize refers to how much a minter can mint at a time. * collectionSize_ refers to how many tokens are in the collection. */ constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_, uint256 collectionSize_ ) { require( collectionSize_ > 0, "ERC721A: collection must have a nonzero supply" ); require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero"); _name = name_; _symbol = symbol_; maxBatchSize = maxBatchSize_; collectionSize = collectionSize_; } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 1; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalMinted(); } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { unchecked { return _totalSupply; } } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721A: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721A: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert("ERC721A: unable to get token of owner by index"); } /** * @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 || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), "ERC721A: balance query for the zero address"); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require( owner != address(0), "ERC721A: number minted query for the zero address" ); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { uint8 _type = getType(tokenId); if (collectionRange[_type].start <= curr && curr < currentIndexCollections[_type]) { TokenOwnership memory ownership = _ownerships[curr]; 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("ERC721A: unable to determine the owner of token"); } /** * @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) { 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); require(to != owner, "ERC721A: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721A: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "ERC721A: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether tokenId exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (_mint), */ function _exists(uint256 tokenId) internal view returns (bool) { uint8 _type = getType(tokenId); return collectionRange[_type].start <= tokenId && tokenId < currentIndexCollections[_type]; } function _safeMint(uint256 startTokenId,address to, uint256 quantity, bool isAdminMint) internal { _safeMint(startTokenId,to, quantity, isAdminMint, ""); } function getType(uint256 tokenId) public pure returns(uint8 _type) { if(tokenId>=1 && tokenId<=3332) { return 0; } else if(tokenId>=3333 && tokenId<=4444) { return 1; }else if(tokenId>=4445 && tokenId<=5112) { return 2; } } /** * @dev Mints quantity tokens and transfers them to to. * * Requirements: * * - there must be quantity tokens remaining unminted in the total collection. * - to cannot be the zero address. * - quantity cannot be larger than the max batch size. * * Emits a {Transfer} event. */ function _safeMint( uint256 startTokenId, address to, uint256 quantity, bool isAdminMint, bytes memory _data ) internal { require(to != address(0), "ERC721A: mint to the zero address"); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), "ERC721A: token already minted"); // For admin mints we do not want to enforce the maxBatchSize limit if (isAdminMint == false) { require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high"); } _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + (isAdminMint ? 0 : uint128(quantity)) ); _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); require( _checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); updatedIndex++; _totalSupply++; } _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 || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require( isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved" ); require( prevOwnership.addr == from, "ERC721A: transfer from incorrect owner" ); require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = TokenOwnership(to, 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)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership( prevOwnership.addr, prevOwnership.startTimestamp ); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @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); } uint256 public nextOwnerToExplicitlySet = 0; // /** // * @dev Explicitly set owners to eliminate loops in future calls of ownerOf(). // */ // function _setOwnersExplicit(uint256 quantity) internal { // uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet; // require(quantity > 0, "quantity must be nonzero"); // if (currentIndex == _startTokenId()) revert('No Tokens Minted Yet'); // uint256 endIndex = oldNextOwnerToSet + quantity - 1; // if (endIndex > collectionSize - 1) { // endIndex = collectionSize - 1; // } // // We know if the last one in the group exists, all in the group exist, due to serial ordering. // require(_exists(endIndex), "not enough minted yet for this cleanup"); // for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) { // if (_ownerships[i].addr == address(0)) { // TokenOwnership memory ownership = ownershipOf(i); // _ownerships[i] = TokenOwnership( // ownership.addr, // ownership.startTimestamp // ); // } // } // nextOwnerToExplicitlySet = endIndex + 1; // } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721A: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * 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. */ 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. * * 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 and to are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } interface IERC20 { function transfer(address _to, uint256 _amount) external returns (bool); function balanceOf(address account) external view returns (uint256); } abstract contract RamppERC721A is Ownable, ERC721A, ReentrancyGuard { constructor( string memory tokenName, string memory tokenSymbol ) ERC721A(tokenName, tokenSymbol, 3, 10000) { collectionRange[0] = NFTRange(1,3332); collectionRange[1] = NFTRange(3333,4444); collectionRange[2] = NFTRange(4445,5112); currentIndexCollections[0] = 1; currentIndexCollections[1] = 3333; currentIndexCollections[2] = 4445; } uint8 public CONTRACT_VERSION = 2; string public _baseTokenURI = "ipfs://QmT6S1CNmbLLrH7su16M3mDYNuhurXoqtu42pE7GbduWeM/"; bool public mintingOpen = false; /////////////// Admin Mint Functions /** * @dev Mints a token to an address with a tokenURI. * This is owner only and allows a fee-free drop * @param _to address of the future owner of the token * @param _qty amount of tokens to drop the owner */ function mintToAdminV2(address _to, uint256 _qty,uint8 _type) public onlyOwner{ require(_qty > 0, "Must mint at least 1 token."); require(_type<3,"invalid category"); require(currentIndexCollections[_type] + (_qty-1) <= collectionRange[_type].end,"All minted"); _safeMint(currentIndexCollections[_type],_to, _qty, true); currentIndexCollections[_type] +=_qty; } /////////////// GENERIC MINT FUNCTIONS /** * @dev Mints a single token to an address. * fee may or may not be required* * @param _to address of the future owner of the token */ function mintTo(address _to,uint8 _type) internal { require(collectionRange[_type].start>0,"invalid type"); require(currentIndexCollections[_type] <= collectionRange[_type].end,"All minted"); _safeMint(currentIndexCollections[_type],_to, 1, false); currentIndexCollections[_type] +=1; } /** * @dev Allows owner to set Max mints per tx * @param _newMaxMint maximum amount of tokens allowed to mint per tx. Must be >= 1 */ function setMaxMint(uint256 _newMaxMint) public onlyOwner { require(_newMaxMint >= 1, "Max mint must be at least 1"); maxBatchSize = _newMaxMint; } function _baseURI() internal view virtual override returns(string memory) { return _baseTokenURI; } function baseTokenURI() public view returns(string memory) { return _baseTokenURI; } function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } function getOwnershipData(uint256 tokenId) external view returns(TokenOwnership memory) { return ownershipOf(tokenId); } } // File: contracts/HalflingsContract.sol //SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract HalflingsContractClaim is RamppERC721A,ERC721Holder { constructor() RamppERC721A("Adventurous Beasts", "ADVB"){} uint256[] private NFTsToStake = [1,3,5]; uint256[] public timeToStake = [3 days,5 days,7 days]; uint256[] public maxStakingAvailable = [3332,1111,667]; uint256[] public nftStakedCount = [0,0,0]; mapping(uint256=>bool) public claimed; IERC721 public HALFLINGSNFT = IERC721(0x5266c5aca260818Be013C80bd9ed5ba0F3D49070); event Stake(uint256[] nftIds,uint256 timestamp,uint8 _type); event Claim(uint256 nftId,address user); struct Deposit{ uint256 start; uint256[] nftIds; uint8 forType; bool isClaimed; } struct User{ Deposit[] deposits; uint256 totalClaimed; } mapping(address=>User) public users; function stake(uint256[] calldata _nftId,uint8 _type) external { require(_nftId.length==NFTsToStake[_type],"Need more nfts"); require(nftStakedCount[_type]<maxStakingAvailable[_type],"All nfts claimed"); require(_type<3,"Invalid collection type"); for(uint i=0; i < _nftId.length; i++ ) { require(!claimed[_nftId[i]] && _nftId[i]>0,"Invalid NFT"); HALFLINGSNFT.safeTransferFrom(msg.sender,address(this),_nftId[i]); claimed[_nftId[i]]=true; } users[msg.sender].deposits.push(Deposit( block.timestamp, _nftId, _type, false )); nftStakedCount[_type]++; emit Stake(_nftId,block.timestamp,_type); } function claimNFT(uint256 index) external { Deposit storage dep = users[msg.sender].deposits[index]; require(!dep.isClaimed,"Allready claimed"); require(block.timestamp>=(dep.start+(timeToStake[dep.forType])),"Not available"); emit Claim(currentIndexCollections[dep.forType],msg.sender); mintTo(msg.sender,dep.forType); for(uint i=0; i < dep.nftIds.length; i++ ) { HALFLINGSNFT.safeTransferFrom(address(this),msg.sender,dep.nftIds[i]); } dep.isClaimed = true; } function userInfo(address userAddress) external view returns(Deposit[] memory deposits) { return users[userAddress].deposits; } function depositeByIndex(address userAddress,uint256 index) external view returns(Deposit memory deposits) { return users[userAddress].deposits[index]; } function totalStaked(address userAddress) external view returns(uint256 count) { return users[userAddress].deposits.length; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"nftId","type":"uint256"},{"indexed":false,"internalType":"address","name":"user","type":"address"}],"name":"Claim","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":false,"internalType":"uint256[]","name":"nftIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"_type","type":"uint8"}],"name":"Stake","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":"CONTRACT_VERSION","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HALFLINGSNFT","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"claimNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"collectionRange","outputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"currentIndexCollections","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"depositeByIndex","outputs":[{"components":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"},{"internalType":"uint8","name":"forType","type":"uint8"},{"internalType":"bool","name":"isClaimed","type":"bool"}],"internalType":"struct HalflingsContractClaim.Deposit","name":"deposits","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getType","outputs":[{"internalType":"uint8","name":"_type","type":"uint8"}],"stateMutability":"pure","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":"maxBatchSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxStakingAvailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_qty","type":"uint256"},{"internalType":"uint8","name":"_type","type":"uint8"}],"name":"mintToAdminV2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftStakedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMint","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_nftId","type":"uint256[]"},{"internalType":"uint8","name":"_type","type":"uint8"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"timeToStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"}],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"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":"userAddress","type":"address"}],"name":"userInfo","outputs":[{"components":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"},{"internalType":"uint8","name":"forType","type":"uint8"},{"internalType":"bool","name":"isClaimed","type":"bool"}],"internalType":"struct HalflingsContractClaim.Deposit[]","name":"deposits","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"users","outputs":[{"internalType":"uint256","name":"totalClaimed","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6000600b55600d805460ff19166002179055610100604052603660a0818152906200353f60c03980516200003c91600e91602090910190620004b1565b50600f805460ff19169055604080516060810182526001815260036020820181905260059282019290925262000076916010919062000540565b50604080516060810182526203f480815262069780602082015262093a8091810191909152620000ab90601190600362000583565b5060408051606081018252610d048152610457602082015261029b91810191909152620000dd906012906003620005c8565b5060408051606081018252600080825260208201819052918101919091526200010b90601390600362000540565b50601580546001600160a01b031916735266c5aca260818be013c80bd9ed5ba0f3d490701790553480156200013f57600080fd5b5060405180604001604052806012815260200171416476656e7475726f75732042656173747360701b8152506040518060400160405280600481526020016320a22b2160e11b81525081816003612710620001a9620001a36200045d60201b60201c565b62000461565b60008111620002165760405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b60648201526084015b60405180910390fd5b60008211620002785760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b60648201526084016200020d565b83516200028d906002906020870190620004b1565b508251620002a3906003906020860190620004b1565b506001918255608052600c819055604080518082018252828152610d0460208083019182526000808052600980835293517fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b5591517fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6c5583518085018552610d0580825261115c82840190815287855285845291517f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a365590517f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a3755845180860190955261115d8086526113f8868401908152600290945293825293517f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c35590517f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c455600890527f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c7929092557fad67d757c34507f157cacfa2e3153e9f260a2244f30428821be7be64587ac55f557f6add646517a5b0f6793cd5891b7937d28a5b2981a5d88ebc7cd776088fea904155506200066092505050565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620004bf9062000623565b90600052602060002090601f016020900481019282620004e357600085556200052e565b82601f10620004fe57805160ff19168380011785556200052e565b828001600101855582156200052e579182015b828111156200052e57825182559160200191906001019062000511565b506200053c9291506200060c565b5090565b8280548282559060005260206000209081019282156200052e579160200282015b828111156200052e578251829060ff1690559160200191906001019062000561565b8280548282559060005260206000209081019282156200052e579160200282015b828111156200052e578251829062ffffff16905591602001919060010190620005a4565b8280548282559060005260206000209081019282156200052e579160200282015b828111156200052e578251829061ffff16905591602001919060010190620005e9565b5b808211156200053c57600081556001016200060d565b600181811c908216806200063857607f821691505b602082108114156200065a57634e487b7160e01b600052602260045260246000fd5b50919050565b608051612ec36200067c600039600061045e0152612ec36000f3fe608060405234801561001057600080fd5b506004361061027f5760003560e01c806370a082311161015c578063b88d4fde116100ce578063d7224ba011610087578063d7224ba01461063c578063dbe7e3bd14610645578063e92b4cda14610668578063e985e9c51461067b578063f2fde38b146106b7578063fe5c873a146106ca57600080fd5b8063b88d4fde146105e0578063b8ccd4c2146105f3578063c87b56dd14610606578063cfc86f7b14610619578063d1ca41a914610621578063d547cfb71461063457600080fd5b806395d89b411161012057806395d89b41146105465780639bfd8d611461054e5780639d38e3ae146105775780639f526dfc14610597578063a22cb465146105aa578063a87430ba146105bd57600080fd5b806370a08231146104cc578063715018a6146104df5780638da5cb5b146104e75780638f4bb497146104f85780639231ab2a1461050557600080fd5b80633693b0f5116101f557806342842e0e116101b957806342842e0e1461044657806345c0f533146104595780634f6ccce714610480578063547520fe1461049357806355f804b3146104a65780636352211e146104b957600080fd5b80633693b0f5146103a557806338b90333146103e1578063393c3ba6146104005780633ed6fe76146104135780634036ab781461043357600080fd5b8063150b7a0211610247578063150b7a021461032257806318160ddd1461034e5780631959a0021461035657806323b872dd146103765780632913daa0146103895780632f745c591461039257600080fd5b806301ffc9a7146102845780630396eed3146102ac57806306fdde03146102cd578063081812fc146102e2578063095ea7b31461030d575b600080fd5b6102976102923660046129b0565b6106dd565b60405190151581526020015b60405180910390f35b6102bf6102ba366004612a5c565b61074a565b6040519081526020016102a3565b6102d561076b565b6040516102a39190612c4e565b6102f56102f0366004612a5c565b6107fd565b6040516001600160a01b0390911681526020016102a3565b61032061031b3660046128cf565b61088b565b005b6103356103303660046127b7565b6109a3565b6040516001600160e01b031990911681526020016102a3565b6102bf6109b4565b61036961036436600461272d565b6109c4565b6040516102a39190612b9b565b61032061038436600461277b565b610ac2565b6102bf60015481565b6102bf6103a03660046128cf565b610acd565b6103cc6103b3366004612a75565b6009602052600090815260409020805460019091015482565b604080519283526020830191909152016102a3565b600d546103ee9060ff1681565b60405160ff90911681526020016102a3565b6102bf61040e366004612a5c565b610c45565b6102bf610421366004612a75565b60086020526000908152604090205481565b6103ee610441366004612a5c565b610c55565b61032061045436600461277b565b610cbe565b6102bf7f000000000000000000000000000000000000000000000000000000000000000081565b6102bf61048e366004612a5c565b610cd9565b6103206104a1366004612a5c565b610d41565b6103206104b43660046129ea565b610dc1565b6102f56104c7366004612a5c565b610df7565b6102bf6104da36600461272d565b610e09565b610320610e9a565b6000546001600160a01b03166102f5565b600f546102979060ff1681565b610518610513366004612a5c565b610ed0565b6040805182516001600160a01b0316815260209283015167ffffffffffffffff1692810192909252016102a3565b6102d5610eed565b6102bf61055c36600461272d565b6001600160a01b031660009081526016602052604090205490565b61058a6105853660046128cf565b610efc565b6040516102a39190612ce9565b6103206105a53660046128f9565b610ff7565b6103206105b8366004612893565b61117e565b6102bf6105cb36600461272d565b60166020526000908152604090206001015481565b6103206105ee3660046127b7565b611243565b6102bf610601366004612a5c565b61127c565b6102d5610614366004612a5c565b61128c565b6102d56112ea565b61032061062f366004612935565b611378565b6102d5611778565b6102bf600b5481565b610297610653366004612a5c565b60146020526000908152604090205460ff1681565b6015546102f5906001600160a01b031681565b610297610689366004612748565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6103206106c536600461272d565b611787565b6103206106d8366004612a5c565b611822565b60006001600160e01b031982166380ac58cd60e01b148061070e57506001600160e01b03198216635b5e139f60e01b145b8061072957506001600160e01b0319821663780e9d6360e01b145b8061074457506301ffc9a760e01b6001600160e01b03198316145b92915050565b6012818154811061075a57600080fd5b600091825260209091200154905081565b60606002805461077a90612db5565b80601f01602080910402602001604051908101604052809291908181526020018280546107a690612db5565b80156107f35780601f106107c8576101008083540402835291602001916107f3565b820191906000526020600020905b8154815290600101906020018083116107d657829003601f168201915b5050505050905090565b600061080882611a5a565b61086f5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061089682610df7565b9050806001600160a01b0316836001600160a01b031614156109055760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610866565b336001600160a01b038216148061092157506109218133610689565b6109935760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610866565b61099e838383611aa0565b505050565b630a85bd0160e11b5b949350505050565b60006109bf600a5490565b905090565b6001600160a01b0381166000908152601660209081526040808320805482518185028101850190935280835260609492939192909184015b82821015610ab757838290600052602060002090600302016040518060800160405290816000820154815260200160018201805480602002602001604051908101604052809291908181526020018280548015610a7857602002820191906000526020600020905b815481526020019060010190808311610a64575b50505091835250506002919091015460ff80821660208085019190915261010090920416151560409092019190915290825260019290920191016109fc565b505050509050919050565b61099e838383611afc565b6000610ad883610e09565b8210610b315760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610866565b6000610b3b6109b4565b905060008060005b83811015610be5576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610b9657805192505b876001600160a01b0316836001600160a01b03161415610bd25786841415610bc45750935061074492505050565b83610bce81612df0565b9450505b5080610bdd81612df0565b915050610b43565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610866565b6011818154811061075a57600080fd5b600060018210158015610c6a5750610d048211155b15610c7757506000919050565b610d058210158015610c8b575061115c8211155b15610c9857506001919050565b61115d8210158015610cac57506113f88211155b15610cb957506002919050565b919050565b61099e83838360405180602001604052806000815250611243565b6000610ce36109b4565b8210610d3d5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610866565b5090565b6000546001600160a01b03163314610d6b5760405162461bcd60e51b815260040161086690612c61565b6001811015610dbc5760405162461bcd60e51b815260206004820152601b60248201527f4d6178206d696e74206d757374206265206174206c65617374203100000000006044820152606401610866565b600155565b6000546001600160a01b03163314610deb5760405162461bcd60e51b815260040161086690612c61565b61099e600e8383612635565b6000610e0282611e81565b5192915050565b60006001600160a01b038216610e755760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610866565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b6000546001600160a01b03163314610ec45760405162461bcd60e51b815260040161086690612c61565b610ece6000611fe9565b565b604080518082019091526000808252602082015261074482611e81565b60606003805461077a90612db5565b610f2c60405180608001604052806000815260200160608152602001600060ff1681526020016000151581525090565b6001600160a01b0383166000908152601660205260409020805483908110610f5657610f56612e4b565b90600052602060002090600302016040518060800160405290816000820154815260200160018201805480602002602001604051908101604052809291908181526020018280548015610fc857602002820191906000526020600020905b815481526020019060010190808311610fb4575b50505091835250506002919091015460ff80821660208401526101009091041615156040909101529392505050565b6000546001600160a01b031633146110215760405162461bcd60e51b815260040161086690612c61565b600082116110715760405162461bcd60e51b815260206004820152601b60248201527f4d757374206d696e74206174206c65617374203120746f6b656e2e00000000006044820152606401610866565b60038160ff16106110b75760405162461bcd60e51b815260206004820152601060248201526f696e76616c69642063617465676f727960801b6044820152606401610866565b60ff81166000908152600960205260409020600190810154906110da9084612d72565b60ff83166000908152600860205260409020546110f79190612d1e565b11156111325760405162461bcd60e51b815260206004820152600a602482015269105b1b081b5a5b9d195960b21b6044820152606401610866565b60ff81166000908152600860205260409020546111529084846001612039565b60ff811660009081526008602052604081208054849290611174908490612d1e565b9091555050505050565b6001600160a01b0382163314156111d75760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610866565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61124e848484611afc565b61125a84848484612055565b6112765760405162461bcd60e51b815260040161086690612c96565b50505050565b6013818154811061075a57600080fd5b60606000611298611778565b905060008151116112b857604051806020016040528060008152506112e3565b806112c28461215f565b6040516020016112d3929190612b2f565b6040516020818303038152906040525b9392505050565b600e80546112f790612db5565b80601f016020809104026020016040519081016040528092919081815260200182805461132390612db5565b80156113705780601f1061134557610100808354040283529160200191611370565b820191906000526020600020905b81548152906001019060200180831161135357829003601f168201915b505050505081565b60108160ff168154811061138e5761138e612e4b565b60009182526020909120015482146113d95760405162461bcd60e51b815260206004820152600e60248201526d4e656564206d6f7265206e66747360901b6044820152606401610866565b60128160ff16815481106113ef576113ef612e4b565b906000526020600020015460138260ff168154811061141057611410612e4b565b90600052602060002001541061145b5760405162461bcd60e51b815260206004820152601060248201526f105b1b081b999d1cc818db185a5b595960821b6044820152606401610866565b60038160ff16106114ae5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420636f6c6c656374696f6e20747970650000000000000000006044820152606401610866565b60005b8281101561163657601460008585848181106114cf576114cf612e4b565b602090810292909201358352508101919091526040016000205460ff161580156115115750600084848381811061150857611508612e4b565b90506020020135115b61154b5760405162461bcd60e51b815260206004820152600b60248201526a125b9d985b1a590813919560aa1b6044820152606401610866565b6015546001600160a01b03166342842e0e333087878681811061157057611570612e4b565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b1580156115c757600080fd5b505af11580156115db573d6000803e3d6000fd5b505050506001601460008686858181106115f7576115f7612e4b565b90506020020135815260200190815260200160002060006101000a81548160ff021916908315150217905550808061162e90612df0565b9150506114b1565b5033600090815260166020908152604091829020825160808101845242815283518684028181018501909552868152919390928381019291889188918291850190849080828437600092018290525093855250505060ff85166020808401919091526040909201819052835460018181018655948252908290208351600390920201908155828201518051939491936116d7939285019291909101906126b5565b5060408201516002909101805460609093015115156101000261ffff1990931660ff9283161792909217909155601380549091831690811061171b5761171b612e4b565b6000918252602082200180549161173183612df0565b91905055507f51c7a0e579da28773f4d4c4a22a0c861b7c755357ac17a68918a4f38f651e35b8383428460405161176b9493929190612bfd565b60405180910390a1505050565b6060600e805461077a90612db5565b6000546001600160a01b031633146117b15760405162461bcd60e51b815260040161086690612c61565b6001600160a01b0381166118165760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610866565b61181f81611fe9565b50565b33600090815260166020526040812080548390811061184357611843612e4b565b906000526020600020906003020190508060020160019054906101000a900460ff16156118a55760405162461bcd60e51b815260206004820152601060248201526f105b1b1c9958591e4818db185a5b595960821b6044820152606401610866565b600281015460118054909160ff169081106118c2576118c2612e4b565b906000526020600020015481600001546118dc9190612d1e565b42101561191b5760405162461bcd60e51b815260206004820152600d60248201526c4e6f7420617661696c61626c6560981b6044820152606401610866565b600281015460ff1660009081526008602090815260409182902054825190815233918101919091527f35538759d80c1fd7bb450a0d05601db5a99fa8b5d073a07c847a9fd61029b107910160405180910390a1600281015461198190339060ff1661225d565b60005b6001820154811015611a46576015546001830180546001600160a01b03909216916342842e0e913091339190869081106119c0576119c0612e4b565b6000918252602090912001546040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015611a1b57600080fd5b505af1158015611a2f573d6000803e3d6000fd5b505050508080611a3e90612df0565b915050611984565b50600201805461ff00191661010017905550565b600080611a6683610c55565b60ff811660009081526009602052604090205490915083108015906112e3575060ff16600090815260086020526040902054909110919050565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b0782611e81565b80519091506000906001600160a01b0316336001600160a01b03161480611b3e575033611b33846107fd565b6001600160a01b0316145b80611b5057508151611b509033610689565b905080611bba5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610866565b846001600160a01b031682600001516001600160a01b031614611c2e5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610866565b6001600160a01b038416611c925760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610866565b611ca26000848460000151611aa0565b6001600160a01b0385166000908152600560205260408120805460019290611cd49084906001600160801b0316612d4a565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526005602052604081208054600194509092611d2091859116612cfc565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526004909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055611da8846001612d1e565b6000818152600460205260409020549091506001600160a01b0316611e3857611dd081611a5a565b15611e385760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600490935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6040805180820190915260008082526020820152816000611ea182610c55565b60ff81166000908152600960205260409020549091508210801590611ed7575060ff811660009081526008602052604090205482105b15611f88576000828152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611f2a57949350505050565b50600019919091016000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915291929115611f8357949350505050565b611f2a565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610866565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6112768484848460405180602001604052806000815250612355565b60006001600160a01b0384163b1561215757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612099903390899088908890600401612b5e565b602060405180830381600087803b1580156120b357600080fd5b505af19250505080156120e3575060408051601f3d908101601f191682019092526120e0918101906129cd565b60015b61213d573d808015612111576040519150601f19603f3d011682016040523d82523d6000602084013e612116565b606091505b5080516121355760405162461bcd60e51b815260040161086690612c96565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506109ac565b5060016109ac565b6060816121835750506040805180820190915260018152600360fc1b602082015290565b8160005b81156121ad578061219781612df0565b91506121a69050600a83612d36565b9150612187565b60008167ffffffffffffffff8111156121c8576121c8612e61565b6040519080825280601f01601f1916602001820160405280156121f2576020820181803683370190505b5090505b84156109ac57612207600183612d72565b9150612214600a86612e0b565b61221f906030612d1e565b60f81b81838151811061223457612234612e4b565b60200101906001600160f81b031916908160001a905350612256600a86612d36565b94506121f6565b60ff81166000908152600960205260409020546122ab5760405162461bcd60e51b815260206004820152600c60248201526b696e76616c6964207479706560a01b6044820152606401610866565b60ff811660009081526009602090815260408083206001015460089092529091205411156123085760405162461bcd60e51b815260206004820152600a602482015269105b1b081b5a5b9d195960b21b6044820152606401610866565b60ff8116600090815260086020526040812054612329918490600190612039565b60ff8116600090815260086020526040812080546001929061234c908490612d1e565b90915550505050565b6001600160a01b0384166123b55760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610866565b6123be85611a5a565b1561240b5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610866565b8161246d5760015483111561246d5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401610866565b6001600160a01b0384166000908152600560209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906124c9908790612cfc565b6001600160801b03168152602001846124e257856124e5565b60005b83602001516124f49190612cfc565b6001600160801b039081169091526001600160a01b0380881660008181526005602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528c83526004909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915586905b8581101561262b5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46125d86000888487612055565b6125f45760405162461bcd60e51b815260040161086690612c96565b816125fe81612df0565b600a8054919450909150600061261383612df0565b9190505550808061262390612df0565b91505061258b565b5050505050505050565b82805461264190612db5565b90600052602060002090601f01602090048101928261266357600085556126a9565b82601f1061267c5782800160ff198235161785556126a9565b828001600101855582156126a9579182015b828111156126a957823582559160200191906001019061268e565b50610d3d9291506126f0565b8280548282559060005260206000209081019282156126a9579160200282015b828111156126a95782518255916020019190600101906126d5565b5b80821115610d3d57600081556001016126f1565b80356001600160a01b0381168114610cb957600080fd5b803560ff81168114610cb957600080fd5b60006020828403121561273f57600080fd5b6112e382612705565b6000806040838503121561275b57600080fd5b61276483612705565b915061277260208401612705565b90509250929050565b60008060006060848603121561279057600080fd5b61279984612705565b92506127a760208501612705565b9150604084013590509250925092565b600080600080608085870312156127cd57600080fd5b6127d685612705565b93506127e460208601612705565b925060408501359150606085013567ffffffffffffffff8082111561280857600080fd5b818701915087601f83011261281c57600080fd5b81358181111561282e5761282e612e61565b604051601f8201601f19908116603f0116810190838211818310171561285657612856612e61565b816040528281528a602084870101111561286f57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156128a657600080fd5b6128af83612705565b9150602083013580151581146128c457600080fd5b809150509250929050565b600080604083850312156128e257600080fd5b6128eb83612705565b946020939093013593505050565b60008060006060848603121561290e57600080fd5b61291784612705565b92506020840135915061292c6040850161271c565b90509250925092565b60008060006040848603121561294a57600080fd5b833567ffffffffffffffff8082111561296257600080fd5b818601915086601f83011261297657600080fd5b81358181111561298557600080fd5b8760208260051b850101111561299a57600080fd5b60209283019550935061292c918601905061271c565b6000602082840312156129c257600080fd5b81356112e381612e77565b6000602082840312156129df57600080fd5b81516112e381612e77565b600080602083850312156129fd57600080fd5b823567ffffffffffffffff80821115612a1557600080fd5b818501915085601f830112612a2957600080fd5b813581811115612a3857600080fd5b866020828501011115612a4a57600080fd5b60209290920196919550909350505050565b600060208284031215612a6e57600080fd5b5035919050565b600060208284031215612a8757600080fd5b6112e38261271c565b60008151808452612aa8816020860160208601612d89565b601f01601f19169290920160200192915050565b6000608083018251845260208084015160808287015282815180855260a0880191508383019450600092505b80831015612b085784518252938301936001929092019190830190612ae8565b5060ff60408701511660408801526060860151151560608801528094505050505092915050565b60008351612b41818460208801612d89565b835190830190612b55818360208801612d89565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b9190830184612a90565b9695505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015612bf057603f19888603018452612bde858351612abc565b94509285019290850190600101612bc2565b5092979650505050505050565b6060808252810184905260006001600160fb1b03851115612c1d57600080fd5b8460051b80876080850137600090830160800190815260208301949094525060ff9190911660409091015292915050565b6020815260006112e36020830184612a90565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6020815260006112e36020830184612abc565b60006001600160801b03808316818516808303821115612b5557612b55612e1f565b60008219821115612d3157612d31612e1f565b500190565b600082612d4557612d45612e35565b500490565b60006001600160801b0383811690831681811015612d6a57612d6a612e1f565b039392505050565b600082821015612d8457612d84612e1f565b500390565b60005b83811015612da4578181015183820152602001612d8c565b838111156112765750506000910152565b600181811c90821680612dc957607f821691505b60208210811415612dea57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612e0457612e04612e1f565b5060010190565b600082612e1a57612e1a612e35565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461181f57600080fdfea26469706673582212205d680cd5111c550dde45c2230322fbc669a4b0429ac1f90a4dde8057ee882b1264736f6c63430008070033697066733a2f2f516d54365331434e6d624c4c724837737531364d336d44594e75687572586f71747534327045374762647557654d2f
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061027f5760003560e01c806370a082311161015c578063b88d4fde116100ce578063d7224ba011610087578063d7224ba01461063c578063dbe7e3bd14610645578063e92b4cda14610668578063e985e9c51461067b578063f2fde38b146106b7578063fe5c873a146106ca57600080fd5b8063b88d4fde146105e0578063b8ccd4c2146105f3578063c87b56dd14610606578063cfc86f7b14610619578063d1ca41a914610621578063d547cfb71461063457600080fd5b806395d89b411161012057806395d89b41146105465780639bfd8d611461054e5780639d38e3ae146105775780639f526dfc14610597578063a22cb465146105aa578063a87430ba146105bd57600080fd5b806370a08231146104cc578063715018a6146104df5780638da5cb5b146104e75780638f4bb497146104f85780639231ab2a1461050557600080fd5b80633693b0f5116101f557806342842e0e116101b957806342842e0e1461044657806345c0f533146104595780634f6ccce714610480578063547520fe1461049357806355f804b3146104a65780636352211e146104b957600080fd5b80633693b0f5146103a557806338b90333146103e1578063393c3ba6146104005780633ed6fe76146104135780634036ab781461043357600080fd5b8063150b7a0211610247578063150b7a021461032257806318160ddd1461034e5780631959a0021461035657806323b872dd146103765780632913daa0146103895780632f745c591461039257600080fd5b806301ffc9a7146102845780630396eed3146102ac57806306fdde03146102cd578063081812fc146102e2578063095ea7b31461030d575b600080fd5b6102976102923660046129b0565b6106dd565b60405190151581526020015b60405180910390f35b6102bf6102ba366004612a5c565b61074a565b6040519081526020016102a3565b6102d561076b565b6040516102a39190612c4e565b6102f56102f0366004612a5c565b6107fd565b6040516001600160a01b0390911681526020016102a3565b61032061031b3660046128cf565b61088b565b005b6103356103303660046127b7565b6109a3565b6040516001600160e01b031990911681526020016102a3565b6102bf6109b4565b61036961036436600461272d565b6109c4565b6040516102a39190612b9b565b61032061038436600461277b565b610ac2565b6102bf60015481565b6102bf6103a03660046128cf565b610acd565b6103cc6103b3366004612a75565b6009602052600090815260409020805460019091015482565b604080519283526020830191909152016102a3565b600d546103ee9060ff1681565b60405160ff90911681526020016102a3565b6102bf61040e366004612a5c565b610c45565b6102bf610421366004612a75565b60086020526000908152604090205481565b6103ee610441366004612a5c565b610c55565b61032061045436600461277b565b610cbe565b6102bf7f000000000000000000000000000000000000000000000000000000000000271081565b6102bf61048e366004612a5c565b610cd9565b6103206104a1366004612a5c565b610d41565b6103206104b43660046129ea565b610dc1565b6102f56104c7366004612a5c565b610df7565b6102bf6104da36600461272d565b610e09565b610320610e9a565b6000546001600160a01b03166102f5565b600f546102979060ff1681565b610518610513366004612a5c565b610ed0565b6040805182516001600160a01b0316815260209283015167ffffffffffffffff1692810192909252016102a3565b6102d5610eed565b6102bf61055c36600461272d565b6001600160a01b031660009081526016602052604090205490565b61058a6105853660046128cf565b610efc565b6040516102a39190612ce9565b6103206105a53660046128f9565b610ff7565b6103206105b8366004612893565b61117e565b6102bf6105cb36600461272d565b60166020526000908152604090206001015481565b6103206105ee3660046127b7565b611243565b6102bf610601366004612a5c565b61127c565b6102d5610614366004612a5c565b61128c565b6102d56112ea565b61032061062f366004612935565b611378565b6102d5611778565b6102bf600b5481565b610297610653366004612a5c565b60146020526000908152604090205460ff1681565b6015546102f5906001600160a01b031681565b610297610689366004612748565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6103206106c536600461272d565b611787565b6103206106d8366004612a5c565b611822565b60006001600160e01b031982166380ac58cd60e01b148061070e57506001600160e01b03198216635b5e139f60e01b145b8061072957506001600160e01b0319821663780e9d6360e01b145b8061074457506301ffc9a760e01b6001600160e01b03198316145b92915050565b6012818154811061075a57600080fd5b600091825260209091200154905081565b60606002805461077a90612db5565b80601f01602080910402602001604051908101604052809291908181526020018280546107a690612db5565b80156107f35780601f106107c8576101008083540402835291602001916107f3565b820191906000526020600020905b8154815290600101906020018083116107d657829003601f168201915b5050505050905090565b600061080882611a5a565b61086f5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061089682610df7565b9050806001600160a01b0316836001600160a01b031614156109055760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610866565b336001600160a01b038216148061092157506109218133610689565b6109935760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610866565b61099e838383611aa0565b505050565b630a85bd0160e11b5b949350505050565b60006109bf600a5490565b905090565b6001600160a01b0381166000908152601660209081526040808320805482518185028101850190935280835260609492939192909184015b82821015610ab757838290600052602060002090600302016040518060800160405290816000820154815260200160018201805480602002602001604051908101604052809291908181526020018280548015610a7857602002820191906000526020600020905b815481526020019060010190808311610a64575b50505091835250506002919091015460ff80821660208085019190915261010090920416151560409092019190915290825260019290920191016109fc565b505050509050919050565b61099e838383611afc565b6000610ad883610e09565b8210610b315760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610866565b6000610b3b6109b4565b905060008060005b83811015610be5576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610b9657805192505b876001600160a01b0316836001600160a01b03161415610bd25786841415610bc45750935061074492505050565b83610bce81612df0565b9450505b5080610bdd81612df0565b915050610b43565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610866565b6011818154811061075a57600080fd5b600060018210158015610c6a5750610d048211155b15610c7757506000919050565b610d058210158015610c8b575061115c8211155b15610c9857506001919050565b61115d8210158015610cac57506113f88211155b15610cb957506002919050565b919050565b61099e83838360405180602001604052806000815250611243565b6000610ce36109b4565b8210610d3d5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610866565b5090565b6000546001600160a01b03163314610d6b5760405162461bcd60e51b815260040161086690612c61565b6001811015610dbc5760405162461bcd60e51b815260206004820152601b60248201527f4d6178206d696e74206d757374206265206174206c65617374203100000000006044820152606401610866565b600155565b6000546001600160a01b03163314610deb5760405162461bcd60e51b815260040161086690612c61565b61099e600e8383612635565b6000610e0282611e81565b5192915050565b60006001600160a01b038216610e755760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610866565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b6000546001600160a01b03163314610ec45760405162461bcd60e51b815260040161086690612c61565b610ece6000611fe9565b565b604080518082019091526000808252602082015261074482611e81565b60606003805461077a90612db5565b610f2c60405180608001604052806000815260200160608152602001600060ff1681526020016000151581525090565b6001600160a01b0383166000908152601660205260409020805483908110610f5657610f56612e4b565b90600052602060002090600302016040518060800160405290816000820154815260200160018201805480602002602001604051908101604052809291908181526020018280548015610fc857602002820191906000526020600020905b815481526020019060010190808311610fb4575b50505091835250506002919091015460ff80821660208401526101009091041615156040909101529392505050565b6000546001600160a01b031633146110215760405162461bcd60e51b815260040161086690612c61565b600082116110715760405162461bcd60e51b815260206004820152601b60248201527f4d757374206d696e74206174206c65617374203120746f6b656e2e00000000006044820152606401610866565b60038160ff16106110b75760405162461bcd60e51b815260206004820152601060248201526f696e76616c69642063617465676f727960801b6044820152606401610866565b60ff81166000908152600960205260409020600190810154906110da9084612d72565b60ff83166000908152600860205260409020546110f79190612d1e565b11156111325760405162461bcd60e51b815260206004820152600a602482015269105b1b081b5a5b9d195960b21b6044820152606401610866565b60ff81166000908152600860205260409020546111529084846001612039565b60ff811660009081526008602052604081208054849290611174908490612d1e565b9091555050505050565b6001600160a01b0382163314156111d75760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610866565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61124e848484611afc565b61125a84848484612055565b6112765760405162461bcd60e51b815260040161086690612c96565b50505050565b6013818154811061075a57600080fd5b60606000611298611778565b905060008151116112b857604051806020016040528060008152506112e3565b806112c28461215f565b6040516020016112d3929190612b2f565b6040516020818303038152906040525b9392505050565b600e80546112f790612db5565b80601f016020809104026020016040519081016040528092919081815260200182805461132390612db5565b80156113705780601f1061134557610100808354040283529160200191611370565b820191906000526020600020905b81548152906001019060200180831161135357829003601f168201915b505050505081565b60108160ff168154811061138e5761138e612e4b565b60009182526020909120015482146113d95760405162461bcd60e51b815260206004820152600e60248201526d4e656564206d6f7265206e66747360901b6044820152606401610866565b60128160ff16815481106113ef576113ef612e4b565b906000526020600020015460138260ff168154811061141057611410612e4b565b90600052602060002001541061145b5760405162461bcd60e51b815260206004820152601060248201526f105b1b081b999d1cc818db185a5b595960821b6044820152606401610866565b60038160ff16106114ae5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420636f6c6c656374696f6e20747970650000000000000000006044820152606401610866565b60005b8281101561163657601460008585848181106114cf576114cf612e4b565b602090810292909201358352508101919091526040016000205460ff161580156115115750600084848381811061150857611508612e4b565b90506020020135115b61154b5760405162461bcd60e51b815260206004820152600b60248201526a125b9d985b1a590813919560aa1b6044820152606401610866565b6015546001600160a01b03166342842e0e333087878681811061157057611570612e4b565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b1580156115c757600080fd5b505af11580156115db573d6000803e3d6000fd5b505050506001601460008686858181106115f7576115f7612e4b565b90506020020135815260200190815260200160002060006101000a81548160ff021916908315150217905550808061162e90612df0565b9150506114b1565b5033600090815260166020908152604091829020825160808101845242815283518684028181018501909552868152919390928381019291889188918291850190849080828437600092018290525093855250505060ff85166020808401919091526040909201819052835460018181018655948252908290208351600390920201908155828201518051939491936116d7939285019291909101906126b5565b5060408201516002909101805460609093015115156101000261ffff1990931660ff9283161792909217909155601380549091831690811061171b5761171b612e4b565b6000918252602082200180549161173183612df0565b91905055507f51c7a0e579da28773f4d4c4a22a0c861b7c755357ac17a68918a4f38f651e35b8383428460405161176b9493929190612bfd565b60405180910390a1505050565b6060600e805461077a90612db5565b6000546001600160a01b031633146117b15760405162461bcd60e51b815260040161086690612c61565b6001600160a01b0381166118165760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610866565b61181f81611fe9565b50565b33600090815260166020526040812080548390811061184357611843612e4b565b906000526020600020906003020190508060020160019054906101000a900460ff16156118a55760405162461bcd60e51b815260206004820152601060248201526f105b1b1c9958591e4818db185a5b595960821b6044820152606401610866565b600281015460118054909160ff169081106118c2576118c2612e4b565b906000526020600020015481600001546118dc9190612d1e565b42101561191b5760405162461bcd60e51b815260206004820152600d60248201526c4e6f7420617661696c61626c6560981b6044820152606401610866565b600281015460ff1660009081526008602090815260409182902054825190815233918101919091527f35538759d80c1fd7bb450a0d05601db5a99fa8b5d073a07c847a9fd61029b107910160405180910390a1600281015461198190339060ff1661225d565b60005b6001820154811015611a46576015546001830180546001600160a01b03909216916342842e0e913091339190869081106119c0576119c0612e4b565b6000918252602090912001546040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015611a1b57600080fd5b505af1158015611a2f573d6000803e3d6000fd5b505050508080611a3e90612df0565b915050611984565b50600201805461ff00191661010017905550565b600080611a6683610c55565b60ff811660009081526009602052604090205490915083108015906112e3575060ff16600090815260086020526040902054909110919050565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b0782611e81565b80519091506000906001600160a01b0316336001600160a01b03161480611b3e575033611b33846107fd565b6001600160a01b0316145b80611b5057508151611b509033610689565b905080611bba5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610866565b846001600160a01b031682600001516001600160a01b031614611c2e5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610866565b6001600160a01b038416611c925760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610866565b611ca26000848460000151611aa0565b6001600160a01b0385166000908152600560205260408120805460019290611cd49084906001600160801b0316612d4a565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526005602052604081208054600194509092611d2091859116612cfc565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526004909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055611da8846001612d1e565b6000818152600460205260409020549091506001600160a01b0316611e3857611dd081611a5a565b15611e385760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600490935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6040805180820190915260008082526020820152816000611ea182610c55565b60ff81166000908152600960205260409020549091508210801590611ed7575060ff811660009081526008602052604090205482105b15611f88576000828152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611f2a57949350505050565b50600019919091016000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915291929115611f8357949350505050565b611f2a565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610866565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6112768484848460405180602001604052806000815250612355565b60006001600160a01b0384163b1561215757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612099903390899088908890600401612b5e565b602060405180830381600087803b1580156120b357600080fd5b505af19250505080156120e3575060408051601f3d908101601f191682019092526120e0918101906129cd565b60015b61213d573d808015612111576040519150601f19603f3d011682016040523d82523d6000602084013e612116565b606091505b5080516121355760405162461bcd60e51b815260040161086690612c96565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506109ac565b5060016109ac565b6060816121835750506040805180820190915260018152600360fc1b602082015290565b8160005b81156121ad578061219781612df0565b91506121a69050600a83612d36565b9150612187565b60008167ffffffffffffffff8111156121c8576121c8612e61565b6040519080825280601f01601f1916602001820160405280156121f2576020820181803683370190505b5090505b84156109ac57612207600183612d72565b9150612214600a86612e0b565b61221f906030612d1e565b60f81b81838151811061223457612234612e4b565b60200101906001600160f81b031916908160001a905350612256600a86612d36565b94506121f6565b60ff81166000908152600960205260409020546122ab5760405162461bcd60e51b815260206004820152600c60248201526b696e76616c6964207479706560a01b6044820152606401610866565b60ff811660009081526009602090815260408083206001015460089092529091205411156123085760405162461bcd60e51b815260206004820152600a602482015269105b1b081b5a5b9d195960b21b6044820152606401610866565b60ff8116600090815260086020526040812054612329918490600190612039565b60ff8116600090815260086020526040812080546001929061234c908490612d1e565b90915550505050565b6001600160a01b0384166123b55760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610866565b6123be85611a5a565b1561240b5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610866565b8161246d5760015483111561246d5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401610866565b6001600160a01b0384166000908152600560209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906124c9908790612cfc565b6001600160801b03168152602001846124e257856124e5565b60005b83602001516124f49190612cfc565b6001600160801b039081169091526001600160a01b0380881660008181526005602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528c83526004909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915586905b8581101561262b5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46125d86000888487612055565b6125f45760405162461bcd60e51b815260040161086690612c96565b816125fe81612df0565b600a8054919450909150600061261383612df0565b9190505550808061262390612df0565b91505061258b565b5050505050505050565b82805461264190612db5565b90600052602060002090601f01602090048101928261266357600085556126a9565b82601f1061267c5782800160ff198235161785556126a9565b828001600101855582156126a9579182015b828111156126a957823582559160200191906001019061268e565b50610d3d9291506126f0565b8280548282559060005260206000209081019282156126a9579160200282015b828111156126a95782518255916020019190600101906126d5565b5b80821115610d3d57600081556001016126f1565b80356001600160a01b0381168114610cb957600080fd5b803560ff81168114610cb957600080fd5b60006020828403121561273f57600080fd5b6112e382612705565b6000806040838503121561275b57600080fd5b61276483612705565b915061277260208401612705565b90509250929050565b60008060006060848603121561279057600080fd5b61279984612705565b92506127a760208501612705565b9150604084013590509250925092565b600080600080608085870312156127cd57600080fd5b6127d685612705565b93506127e460208601612705565b925060408501359150606085013567ffffffffffffffff8082111561280857600080fd5b818701915087601f83011261281c57600080fd5b81358181111561282e5761282e612e61565b604051601f8201601f19908116603f0116810190838211818310171561285657612856612e61565b816040528281528a602084870101111561286f57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156128a657600080fd5b6128af83612705565b9150602083013580151581146128c457600080fd5b809150509250929050565b600080604083850312156128e257600080fd5b6128eb83612705565b946020939093013593505050565b60008060006060848603121561290e57600080fd5b61291784612705565b92506020840135915061292c6040850161271c565b90509250925092565b60008060006040848603121561294a57600080fd5b833567ffffffffffffffff8082111561296257600080fd5b818601915086601f83011261297657600080fd5b81358181111561298557600080fd5b8760208260051b850101111561299a57600080fd5b60209283019550935061292c918601905061271c565b6000602082840312156129c257600080fd5b81356112e381612e77565b6000602082840312156129df57600080fd5b81516112e381612e77565b600080602083850312156129fd57600080fd5b823567ffffffffffffffff80821115612a1557600080fd5b818501915085601f830112612a2957600080fd5b813581811115612a3857600080fd5b866020828501011115612a4a57600080fd5b60209290920196919550909350505050565b600060208284031215612a6e57600080fd5b5035919050565b600060208284031215612a8757600080fd5b6112e38261271c565b60008151808452612aa8816020860160208601612d89565b601f01601f19169290920160200192915050565b6000608083018251845260208084015160808287015282815180855260a0880191508383019450600092505b80831015612b085784518252938301936001929092019190830190612ae8565b5060ff60408701511660408801526060860151151560608801528094505050505092915050565b60008351612b41818460208801612d89565b835190830190612b55818360208801612d89565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b9190830184612a90565b9695505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015612bf057603f19888603018452612bde858351612abc565b94509285019290850190600101612bc2565b5092979650505050505050565b6060808252810184905260006001600160fb1b03851115612c1d57600080fd5b8460051b80876080850137600090830160800190815260208301949094525060ff9190911660409091015292915050565b6020815260006112e36020830184612a90565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6020815260006112e36020830184612abc565b60006001600160801b03808316818516808303821115612b5557612b55612e1f565b60008219821115612d3157612d31612e1f565b500190565b600082612d4557612d45612e35565b500490565b60006001600160801b0383811690831681811015612d6a57612d6a612e1f565b039392505050565b600082821015612d8457612d84612e1f565b500390565b60005b83811015612da4578181015183820152602001612d8c565b838111156112765750506000910152565b600181811c90821680612dc957607f821691505b60208210811415612dea57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612e0457612e04612e1f565b5060010190565b600082612e1a57612e1a612e35565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461181f57600080fdfea26469706673582212205d680cd5111c550dde45c2230322fbc669a4b0429ac1f90a4dde8057ee882b1264736f6c63430008070033
Deployed Bytecode Sourcemap
48879:2684:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32500:370;;;;;;:::i;:::-;;:::i;:::-;;;9649:14:1;;9642:22;9624:41;;9612:2;9597:18;32500:370:0;;;;;;;;49119:54;;;;;;:::i;:::-;;:::i;:::-;;;22139:25:1;;;22127:2;22112:18;49119:54:0;21993:177:1;34637:94:0;;;:::i;:::-;;;;;;;:::i;36052:204::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7077:32:1;;;7059:51;;7047:2;7032:18;36052:204:0;6913:203:1;35615:379:0;;;;;;:::i;:::-;;:::i;:::-;;11082:207;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;;9838:33:1;;;9820:52;;9808:2;9793:18;11082:207:0;9676:202:1;30864:96:0;;;:::i;51082:146::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;36902:142::-;;;;;;:::i;:::-;;:::i;29106:27::-;;;;;;31692:744;;;;;;:::i;:::-;;:::i;29932:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;22628:25:1;;;22684:2;22669:18;;22662:34;;;;22601:18;29932:47:0;22454:248:1;46504:33:0;;;;;;;;;;;;22879:4:1;22867:17;;;22849:36;;22837:2;22822:18;46504:33:0;22707:184:1;49059:53:0;;;;;;:::i;:::-;;:::i;29796:54::-;;;;;;:::i;:::-;;;;;;;;;;;;;;38253:318;;;;;;:::i;:::-;;:::i;37107:157::-;;;;;;:::i;:::-;;:::i;29062:39::-;;;;;31224:177;;;;;;:::i;:::-;;:::i;48099:173::-;;;;;;:::i;:::-;;:::i;48513:106::-;;;;;;:::i;:::-;;:::i;34460:118::-;;;;;;:::i;:::-;;:::i;32926:211::-;;;;;;:::i;:::-;;:::i;27334:103::-;;;:::i;26685:87::-;26731:7;26758:6;-1:-1:-1;;;;;26758:6:0;26685:87;;46639:31;;;;;;;;;48627:134;;;;;;:::i;:::-;;:::i;:::-;;;;21858:13:1;;-1:-1:-1;;;;;21854:39:1;21836:58;;21954:4;21942:17;;;21936:24;21962:18;21932:49;21910:20;;;21903:79;;;;21809:18;48627:134:0;21628:360:1;34792:98:0;;;:::i;51416:144::-;;;;;;:::i;:::-;-1:-1:-1;;;;;51518:18:0;51480:13;51518:18;;;:5;:18;;;;;:34;;51416:144;51236:172;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;46971:416::-;;;;;;:::i;:::-;;:::i;36320:274::-;;;;;;:::i;:::-;;:::i;49689:35::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;37327:311;;;;;;:::i;:::-;;:::i;49180:41::-;;;;;;:::i;:::-;;:::i;34953:288::-;;;;;;:::i;:::-;;:::i;46544:86::-;;;:::i;49733:780::-;;;;;;:::i;:::-;;:::i;48407:98::-;;;:::i;42337:43::-;;;;;;49230:37;;;;;;:::i;:::-;;;;;;;;;;;;;;;;49274:81;;;;;-1:-1:-1;;;;;49274:81:0;;;36657:186;;;;;;:::i;:::-;-1:-1:-1;;;;;36802:25:0;;;36779:4;36802:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;36657:186;27590:201;;;;;;:::i;:::-;;:::i;50521:553::-;;;;;;:::i;:::-;;:::i;32500:370::-;32627:4;-1:-1:-1;;;;;;32657:40:0;;-1:-1:-1;;;32657:40:0;;:99;;-1:-1:-1;;;;;;;32708:48:0;;-1:-1:-1;;;32708:48:0;32657:99;:160;;;-1:-1:-1;;;;;;;32767:50:0;;-1:-1:-1;;;32767:50:0;32657:160;:207;;;-1:-1:-1;;;;;;;;;;13179:40:0;;;32828:36;32643:221;32500:370;-1:-1:-1;;32500:370:0:o;49119:54::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49119:54:0;:::o;34637:94::-;34691:13;34720:5;34713:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34637:94;:::o;36052:204::-;36120:7;36144:16;36152:7;36144;:16::i;:::-;36136:74;;;;-1:-1:-1;;;36136:74:0;;20750:2:1;36136:74:0;;;20732:21:1;20789:2;20769:18;;;20762:30;20828:34;20808:18;;;20801:62;-1:-1:-1;;;20879:18:1;;;20872:43;20932:19;;36136:74:0;;;;;;;;;-1:-1:-1;36226:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;36226:24:0;;36052:204::o;35615:379::-;35684:13;35700:24;35716:7;35700:15;:24::i;:::-;35684:40;;35745:5;-1:-1:-1;;;;;35739:11:0;:2;-1:-1:-1;;;;;35739:11:0;;;35731:58;;;;-1:-1:-1;;;35731:58:0;;17648:2:1;35731:58:0;;;17630:21:1;17687:2;17667:18;;;17660:30;17726:34;17706:18;;;17699:62;-1:-1:-1;;;17777:18:1;;;17770:32;17819:19;;35731:58:0;17446:398:1;35731:58:0;25491:10;-1:-1:-1;;;;;35814:21:0;;;;:62;;-1:-1:-1;35839:37:0;35856:5;25491:10;36657:186;:::i;35839:37::-;35798:153;;;;-1:-1:-1;;;35798:153:0;;14241:2:1;35798:153:0;;;14223:21:1;14280:2;14260:18;;;14253:30;14319:34;14299:18;;;14292:62;14390:27;14370:18;;;14363:55;14435:19;;35798:153:0;14039:421:1;35798:153:0;35960:28;35969:2;35973:7;35982:5;35960:8;:28::i;:::-;35677:317;35615:379;;:::o;11082:207::-;-1:-1:-1;;;11082:207:0;;;;;;;:::o;30864:96::-;30917:7;30940:14;31130:12;;;31041:114;30940:14;30933:21;;30864:96;:::o;51082:146::-;-1:-1:-1;;;;;51193:18:0;;;;;;:5;:18;;;;;;;;51186:34;;;;;;;;;;;;;;;;;51143:25;;51186:34;;51193:18;;51186:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51186:34:0;;;-1:-1:-1;;51186:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51082:146;;;:::o;36902:142::-;37010:28;37020:4;37026:2;37030:7;37010:9;:28::i;31692:744::-;31801:7;31836:16;31846:5;31836:9;:16::i;:::-;31828:5;:24;31820:71;;;;-1:-1:-1;;;31820:71:0;;10532:2:1;31820:71:0;;;10514:21:1;10571:2;10551:18;;;10544:30;10610:34;10590:18;;;10583:62;-1:-1:-1;;;10661:18:1;;;10654:32;10703:19;;31820:71:0;10330:398:1;31820:71:0;31898:22;31923:13;:11;:13::i;:::-;31898:38;;31943:19;31973:25;32023:9;32018:350;32042:14;32038:1;:18;32018:350;;;32072:31;32106:14;;;:11;:14;;;;;;;;;32072:48;;;;;;;;;-1:-1:-1;;;;;32072:48:0;;;;;-1:-1:-1;;;32072:48:0;;;;;;;;;;;;32133:28;32129:89;;32194:14;;;-1:-1:-1;32129:89:0;32251:5;-1:-1:-1;;;;;32230:26:0;:17;-1:-1:-1;;;;;32230:26:0;;32226:135;;;32288:5;32273:11;:20;32269:59;;;-1:-1:-1;32315:1:0;-1:-1:-1;32308:8:0;;-1:-1:-1;;;32308:8:0;32269:59;32338:13;;;;:::i;:::-;;;;32226:135;-1:-1:-1;32058:3:0;;;;:::i;:::-;;;;32018:350;;;-1:-1:-1;32374:56:0;;-1:-1:-1;;;32374:56:0;;19574:2:1;32374:56:0;;;19556:21:1;19613:2;19593:18;;;19586:30;19652:34;19632:18;;;19625:62;-1:-1:-1;;;19703:18:1;;;19696:44;19757:19;;32374:56:0;19372:410:1;49059:53:0;;;;;;;;;;;;38253:318;38307:11;38344:1;38335:7;:10;;:27;;;;;38358:4;38349:7;:13;;38335:27;38332:234;;;-1:-1:-1;38391:1:0;;38253:318;-1:-1:-1;38253:318:0:o;38332:234::-;38427:4;38418:7;:13;;:30;;;;;38444:4;38435:7;:13;;38418:30;38415:151;;;-1:-1:-1;38477:1:0;;38253:318;-1:-1:-1;38253:318:0:o;38415:151::-;38505:4;38496:7;:13;;:30;;;;;38522:4;38513:7;:13;;38496:30;38493:73;;;-1:-1:-1;38555:1:0;;38253:318;-1:-1:-1;38253:318:0:o;38493:73::-;38253:318;;;:::o;37107:157::-;37219:39;37236:4;37242:2;37246:7;37219:39;;;;;;;;;;;;:16;:39::i;31224:177::-;31291:7;31323:13;:11;:13::i;:::-;31315:5;:21;31307:69;;;;-1:-1:-1;;;31307:69:0;;13075:2:1;31307:69:0;;;13057:21:1;13114:2;13094:18;;;13087:30;13153:34;13133:18;;;13126:62;-1:-1:-1;;;13204:18:1;;;13197:33;13247:19;;31307:69:0;12873:399:1;31307:69:0;-1:-1:-1;31390:5:0;31224:177::o;48099:173::-;26731:7;26758:6;-1:-1:-1;;;;;26758:6:0;25491:10;26905:23;26897:68;;;;-1:-1:-1;;;26897:68:0;;;;;;;:::i;:::-;48192:1:::1;48177:11;:16;;48169:56;;;::::0;-1:-1:-1;;;48169:56:0;;10935:2:1;48169:56:0::1;::::0;::::1;10917:21:1::0;10974:2;10954:18;;;10947:30;11013:29;10993:18;;;10986:57;11060:18;;48169:56:0::1;10733:351:1::0;48169:56:0::1;48237:12;:26:::0;48099:173::o;48513:106::-;26731:7;26758:6;-1:-1:-1;;;;;26758:6:0;25491:10;26905:23;26897:68;;;;-1:-1:-1;;;26897:68:0;;;;;;;:::i;:::-;48588:23:::1;:13;48604:7:::0;;48588:23:::1;:::i;34460:118::-:0;34524:7;34547:20;34559:7;34547:11;:20::i;:::-;:25;;34460:118;-1:-1:-1;;34460:118:0:o;32926:211::-;32990:7;-1:-1:-1;;;;;33014:19:0;;33006:75;;;;-1:-1:-1;;;33006:75:0;;15007:2:1;33006:75:0;;;14989:21:1;15046:2;15026:18;;;15019:30;15085:34;15065:18;;;15058:62;-1:-1:-1;;;15136:18:1;;;15129:41;15187:19;;33006:75:0;14805:407:1;33006:75:0;-1:-1:-1;;;;;;33103:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;33103:27:0;;32926:211::o;27334:103::-;26731:7;26758:6;-1:-1:-1;;;;;26758:6:0;25491:10;26905:23;26897:68;;;;-1:-1:-1;;;26897:68:0;;;;;;;:::i;:::-;27399:30:::1;27426:1;27399:18;:30::i;:::-;27334:103::o:0;48627:134::-;-1:-1:-1;;;;;;;;;;;;;;;;;48733:20:0;48745:7;48733:11;:20::i;34792:98::-;34848:13;34877:7;34870:14;;;;;:::i;51236:172::-;51318:23;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51318:23:0;-1:-1:-1;;;;;51366:18:0;;;;;;:5;:18;;;;;:34;;51394:5;;51366:34;;;;;;:::i;:::-;;;;;;;;;;;51359:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51359:41:0;;;-1:-1:-1;;51359:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;51236:172;-1:-1:-1;;;51236:172:0:o;46971:416::-;26731:7;26758:6;-1:-1:-1;;;;;26758:6:0;25491:10;26905:23;26897:68;;;;-1:-1:-1;;;26897:68:0;;;;;;;:::i;:::-;47076:1:::1;47069:4;:8;47061:48;;;::::0;-1:-1:-1;;;47061:48:0;;13479:2:1;47061:48:0::1;::::0;::::1;13461:21:1::0;13518:2;13498:18;;;13491:30;13557:29;13537:18;;;13530:57;13604:18;;47061:48:0::1;13277:351:1::0;47061:48:0::1;47135:1;47129:5;:7;;;47121:35;;;::::0;-1:-1:-1;;;47121:35:0;;11291:2:1;47121:35:0::1;::::0;::::1;11273:21:1::0;11330:2;11310:18;;;11303:30;-1:-1:-1;;;11349:18:1;;;11342:46;11405:18;;47121:35:0::1;11089:340:1::0;47121:35:0::1;47220:22;::::0;::::1;;::::0;;;:15:::1;:22;::::0;;;;:26:::1;::::0;;::::1;::::0;;47209:6:::1;::::0;:4;:6:::1;:::i;:::-;47175:30;::::0;::::1;;::::0;;;:23:::1;:30;::::0;;;;;:41:::1;::::0;;::::1;:::i;:::-;:71;;47167:93;;;::::0;-1:-1:-1;;;47167:93:0;;11636:2:1;47167:93:0::1;::::0;::::1;11618:21:1::0;11675:2;11655:18;;;11648:30;-1:-1:-1;;;11694:18:1;;;11687:40;11744:18;;47167:93:0::1;11434:334:1::0;47167:93:0::1;47282:30;::::0;::::1;;::::0;;;:23:::1;:30;::::0;;;;;47272:57:::1;::::0;47313:3;47318:4;47324::::1;47272:9;:57::i;:::-;47341:30;::::0;::::1;;::::0;;;:23:::1;:30;::::0;;;;:37;;47374:4;;47341:30;:37:::1;::::0;47374:4;;47341:37:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;46971:416:0:o;36320:274::-;-1:-1:-1;;;;;36411:24:0;;25491:10;36411:24;;36403:63;;;;-1:-1:-1;;;36403:63:0;;16532:2:1;36403:63:0;;;16514:21:1;16571:2;16551:18;;;16544:30;16610:28;16590:18;;;16583:56;16656:18;;36403:63:0;16330:350:1;36403:63:0;25491:10;36475:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;36475:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;36475:53:0;;;;;;;;;;36540:48;;9624:41:1;;;36475:42:0;;25491:10;36540:48;;9597:18:1;36540:48:0;;;;;;;36320:274;;:::o;37327:311::-;37464:28;37474:4;37480:2;37484:7;37464:9;:28::i;:::-;37515:48;37538:4;37544:2;37548:7;37557:5;37515:22;:48::i;:::-;37499:133;;;;-1:-1:-1;;;37499:133:0;;;;;;;:::i;:::-;37327:311;;;;:::o;49180:41::-;;;;;;;;;;;;34953:288;35051:13;35076:21;35100:10;:8;:10::i;:::-;35076:34;;35155:1;35137:7;35131:21;:25;:104;;;;;;;;;;;;;;;;;35192:7;35201:18;:7;:16;:18::i;:::-;35175:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35131:104;35117:118;34953:288;-1:-1:-1;;;34953:288:0:o;46544:86::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49733:780::-;49836:11;49848:5;49836:18;;;;;;;;;;:::i;:::-;;;;;;;;;;;49821:33;;49813:59;;;;-1:-1:-1;;;49813:59:0;;19231:2:1;49813:59:0;;;19213:21:1;19270:2;19250:18;;;19243:30;-1:-1:-1;;;19289:18:1;;;19282:44;19343:18;;49813:59:0;19029:338:1;49813:59:0;49913:19;49933:5;49913:26;;;;;;;;;;:::i;:::-;;;;;;;;;49891:14;49906:5;49891:21;;;;;;;;;;:::i;:::-;;;;;;;;;:48;49883:76;;;;-1:-1:-1;;;49883:76:0;;15419:2:1;49883:76:0;;;15401:21:1;15458:2;15438:18;;;15431:30;-1:-1:-1;;;15477:18:1;;;15470:46;15533:18;;49883:76:0;15217:340:1;49883:76:0;49984:1;49978:5;:7;;;49970:42;;;;-1:-1:-1;;;49970:42:0;;12723:2:1;49970:42:0;;;12705:21:1;12762:2;12742:18;;;12735:30;12801:25;12781:18;;;12774:53;12844:18;;49970:42:0;12521:347:1;49970:42:0;50027:6;50023:241;50037:17;;;50023:241;;;50086:7;:18;50094:6;;50101:1;50094:9;;;;;;;:::i;:::-;;;;;;;;;;50086:18;;-1:-1:-1;50086:18:0;;;;;;;;-1:-1:-1;50086:18:0;;;;50085:19;:34;;;;;50118:1;50108:6;;50115:1;50108:9;;;;;;;:::i;:::-;;;;;;;:11;50085:34;50077:57;;;;-1:-1:-1;;;50077:57:0;;14667:2:1;50077:57:0;;;14649:21:1;14706:2;14686:18;;;14679:30;-1:-1:-1;;;14725:18:1;;;14718:41;14776:18;;50077:57:0;14465:335:1;50077:57:0;50149:12;;-1:-1:-1;;;;;50149:12:0;:29;50179:10;50198:4;50204:6;;50211:1;50204:9;;;;;;;:::i;:::-;50149:65;;-1:-1:-1;;;;;;50149:65:0;;;;;;;-1:-1:-1;;;;;7379:15:1;;;50149:65:0;;;7361:34:1;7431:15;;;;7411:18;;;7404:43;-1:-1:-1;50204:9:0;;;;;;7463:18:1;;;7456:34;7296:18;;50149:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50248:4;50229:7;:18;50237:6;;50244:1;50237:9;;;;;;;:::i;:::-;;;;;;;50229:18;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;50056:3;;;;;:::i;:::-;;;;50023:241;;;-1:-1:-1;50280:10:0;50274:17;;;;:5;:17;;;;;;;;;50306:113;;;;;;;50329:15;50306:113;;;;;;;;;;;;;;;;;;50274:17;;50306:113;;;;;;;50360:6;;;;;;50306:113;;;50360:6;;50306:113;50360:6;50306:113;;;;;;;;-1:-1:-1;50306:113:0;;;-1:-1:-1;;;50306:113:0;;;;;;;;;;;;;;;;;;50274:146;;50306:113;50274:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;50274:146:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50274:146:0;;;;;;;;;;;;;;;50431:14;:21;;:14;;:21;;;;;;;;;:::i;:::-;;;;;;;;;:23;;;;;;:::i;:::-;;;;;;50470:35;50476:6;;50483:15;50499:5;50470:35;;;;;;;;;:::i;:::-;;;;;;;;49733:780;;;:::o;48407:98::-;48451:13;48484;48477:20;;;;;:::i;27590:201::-;26731:7;26758:6;-1:-1:-1;;;;;26758:6:0;25491:10;26905:23;26897:68;;;;-1:-1:-1;;;26897:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27679:22:0;::::1;27671:73;;;::::0;-1:-1:-1;;;27671:73:0;;11975:2:1;27671:73:0::1;::::0;::::1;11957:21:1::0;12014:2;11994:18;;;11987:30;12053:34;12033:18;;;12026:62;-1:-1:-1;;;12104:18:1;;;12097:36;12150:19;;27671:73:0::1;11773:402:1::0;27671:73:0::1;27755:28;27774:8;27755:18;:28::i;:::-;27590:201:::0;:::o;50521:553::-;50607:10;50579:19;50601:17;;;:5;:17;;;;;:33;;50628:5;;50601:33;;;;;;:::i;:::-;;;;;;;;;;;50579:55;;50654:3;:13;;;;;;;;;;;;50653:14;50645:42;;;;-1:-1:-1;;;50645:42:0;;20405:2:1;50645:42:0;;;20387:21:1;20444:2;20424:18;;;20417:30;-1:-1:-1;;;20463:18:1;;;20456:46;20519:18;;50645:42:0;20203:340:1;50645:42:0;50747:11;;;;50735;:24;;:11;;50747;;;50735:24;;;;;;:::i;:::-;;;;;;;;;50724:3;:9;;;:36;;;;:::i;:::-;50706:15;:55;;50698:80;;;;-1:-1:-1;;;50698:80:0;;17306:2:1;50698:80:0;;;17288:21:1;17345:2;17325:18;;;17318:30;-1:-1:-1;;;17364:18:1;;;17357:43;17417:18;;50698:80:0;17104:337:1;50698:80:0;50824:11;;;;;;50800:36;;;;:23;:36;;;;;;;;;;50794:54;;22349:25:1;;;50837:10:0;22390:18:1;;;22383:60;;;;50794:54:0;;22322:18:1;50794:54:0;;;;;;;50877:11;;;;50859:30;;50866:10;;50877:11;;50859:6;:30::i;:::-;50904:6;50900:136;50918:10;;;:17;50914:21;;50900:136;;;50955:12;;;51010:10;;:13;;-1:-1:-1;;;;;50955:12:0;;;;:29;;50993:4;;50999:10;;51010;51021:1;;51010:13;;;;;;:::i;:::-;;;;;;;;;;;50955:69;;-1:-1:-1;;;;;;50955:69:0;;;;;;;-1:-1:-1;;;;;7379:15:1;;;50955:69:0;;;7361:34:1;7431:15;;;;7411:18;;;7404:43;7463:18;;;7456:34;7296:18;;50955:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50937:3;;;;;:::i;:::-;;;;50900:136;;;-1:-1:-1;51046:13:0;;:20;;-1:-1:-1;;51046:20:0;;;;;-1:-1:-1;50521:553:0:o;37873:205::-;37930:4;37945:11;37959:16;37967:7;37959;:16::i;:::-;37989:22;;;;;;;:15;:22;;;;;:28;37945:30;;-1:-1:-1;37989:39:0;-1:-1:-1;37989:39:0;;;:83;;-1:-1:-1;38042:30:0;;;;;;:23;:30;;;;;;38032:40;;;;37982:90;-1:-1:-1;37873:205:0:o;42159:172::-;42256:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;42256:29:0;-1:-1:-1;;;;;42256:29:0;;;;;;;;;42297:28;;42256:24;;42297:28;;;;;;;42159:172;;;:::o;40528:1529::-;40625:35;40663:20;40675:7;40663:11;:20::i;:::-;40734:18;;40625:58;;-1:-1:-1;40692:22:0;;-1:-1:-1;;;;;40718:34:0;25491:10;-1:-1:-1;;;;;40718:34:0;;:81;;;-1:-1:-1;25491:10:0;40763:20;40775:7;40763:11;:20::i;:::-;-1:-1:-1;;;;;40763:36:0;;40718:81;:142;;;-1:-1:-1;40827:18:0;;40810:50;;25491:10;36657:186;:::i;40810:50::-;40692:169;;40886:17;40870:101;;;;-1:-1:-1;;;40870:101:0;;16887:2:1;40870:101:0;;;16869:21:1;16926:2;16906:18;;;16899:30;16965:34;16945:18;;;16938:62;-1:-1:-1;;;17016:18:1;;;17009:48;17074:19;;40870:101:0;16685:414:1;40870:101:0;41018:4;-1:-1:-1;;;;;40996:26:0;:13;:18;;;-1:-1:-1;;;;;40996:26:0;;40980:98;;;;-1:-1:-1;;;40980:98:0;;15764:2:1;40980:98:0;;;15746:21:1;15803:2;15783:18;;;15776:30;15842:34;15822:18;;;15815:62;-1:-1:-1;;;15893:18:1;;;15886:36;15939:19;;40980:98:0;15562:402:1;40980:98:0;-1:-1:-1;;;;;41093:16:0;;41085:66;;;;-1:-1:-1;;;41085:66:0;;13835:2:1;41085:66:0;;;13817:21:1;13874:2;13854:18;;;13847:30;13913:34;13893:18;;;13886:62;-1:-1:-1;;;13964:18:1;;;13957:35;14009:19;;41085:66:0;13633:401:1;41085:66:0;41260:49;41277:1;41281:7;41290:13;:18;;;41260:8;:49::i;:::-;-1:-1:-1;;;;;41318:18:0;;;;;;:12;:18;;;;;:31;;41348:1;;41318:18;:31;;41348:1;;-1:-1:-1;;;;;41318:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;41318:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;41356:16:0;;-1:-1:-1;41356:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;41356:16:0;;:29;;-1:-1:-1;;41356:29:0;;:::i;:::-;;;-1:-1:-1;;;;;41356:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41415:43:0;;;;;;;;-1:-1:-1;;;;;41415:43:0;;;;;;41441:15;41415:43;;;;;;;;;-1:-1:-1;41392:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;41392:66:0;-1:-1:-1;;;;;;41392:66:0;;;;;;;;;;;41708:11;41404:7;-1:-1:-1;41708:11:0;:::i;:::-;41771:1;41730:24;;;:11;:24;;;;;:29;41686:33;;-1:-1:-1;;;;;;41730:29:0;41726:236;;41788:20;41796:11;41788:7;:20::i;:::-;41784:171;;;41848:97;;;;;;;;41875:18;;-1:-1:-1;;;;;41848:97:0;;;;;;41906:28;;;;41848:97;;;;;;;;;;-1:-1:-1;41821:24:0;;;:11;:24;;;;;;;:124;;;;;;;;;-1:-1:-1;;;41821:124:0;-1:-1:-1;;;;;;41821:124:0;;;;;;;;;;;;41784:171;41994:7;41990:2;-1:-1:-1;;;;;41975:27:0;41984:4;-1:-1:-1;;;;;41975:27:0;;;;;;;;;;;40618:1439;;;40528:1529;;;:::o;33389:1017::-;-1:-1:-1;;;;;;;;;;;;;;;;;33513:7:0;33498:12;33564:16;33513:7;33564;:16::i;:::-;33595:22;;;;;;;:15;:22;;;;;:28;33550:30;;-1:-1:-1;33595:36:0;-1:-1:-1;33595:36:0;;;:77;;-1:-1:-1;33642:30:0;;;;;;;:23;:30;;;;;;33635:37;;33595:77;33591:737;;;33689:31;33723:17;;;:11;:17;;;;;;;;;33689:51;;;;;;;;;-1:-1:-1;;;;;33689:51:0;;;;;-1:-1:-1;;;33689:51:0;;;;;;;;;;;;33759:28;33755:85;;33815:9;33389:1017;-1:-1:-1;;;;33389:1017:0:o;33755:85::-;-1:-1:-1;;;34136:6:0;;;;34173:17;;;;:11;:17;;;;;;;;;34161:29;;;;;;;;;-1:-1:-1;;;;;34161:29:0;;;;;-1:-1:-1;;;34161:29:0;;;;;;;;;;;;34136:6;;;34213:28;34209:93;;34273:9;33389:1017;-1:-1:-1;;;;33389:1017:0:o;34209:93::-;34104:213;;33591:737;-1:-1:-1;34343:57:0;;-1:-1:-1;;;34343:57:0;;19989:2:1;34343:57:0;;;19971:21:1;20028:2;20008:18;;;20001:30;20067:34;20047:18;;;20040:62;-1:-1:-1;;;20118:18:1;;;20111:45;20173:19;;34343:57:0;19787:411:1;27949:191:0;28023:16;28042:6;;-1:-1:-1;;;;;28059:17:0;;;-1:-1:-1;;;;;;28059:17:0;;;;;;28092:40;;28042:6;;;;;;;28092:40;;28023:16;28092:40;28012:128;27949:191;:::o;38084:163::-;38188:53;38198:12;38211:2;38215:8;38225:11;38188:53;;;;;;;;;;;;:9;:53::i;44020:690::-;44157:4;-1:-1:-1;;;;;44174:13:0;;2633:19;:23;44170:535;;44213:72;;-1:-1:-1;;;44213:72:0;;-1:-1:-1;;;;;44213:36:0;;;;;:72;;25491:10;;44264:4;;44270:7;;44279:5;;44213:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44213:72:0;;;;;;;;-1:-1:-1;;44213:72:0;;;;;;;;;;;;:::i;:::-;;;44200:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44444:13:0;;44440:215;;44477:61;;-1:-1:-1;;;44477:61:0;;;;;;;:::i;44440:215::-;44623:6;44617:13;44608:6;44604:2;44600:15;44593:38;44200:464;-1:-1:-1;;;;;;44335:55:0;-1:-1:-1;;;44335:55:0;;-1:-1:-1;44328:62:0;;44170:535;-1:-1:-1;44693:4:0;44686:11;;20242:723;20298:13;20519:10;20515:53;;-1:-1:-1;;20546:10:0;;;;;;;;;;;;-1:-1:-1;;;20546:10:0;;;;;20242:723::o;20515:53::-;20593:5;20578:12;20634:78;20641:9;;20634:78;;20667:8;;;;:::i;:::-;;-1:-1:-1;20690:10:0;;-1:-1:-1;20698:2:0;20690:10;;:::i;:::-;;;20634:78;;;20722:19;20754:6;20744:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20744:17:0;;20722:39;;20772:154;20779:10;;20772:154;;20806:11;20816:1;20806:11;;:::i;:::-;;-1:-1:-1;20875:10:0;20883:2;20875:5;:10;:::i;:::-;20862:24;;:2;:24;:::i;:::-;20849:39;;20832:6;20839;20832:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;20832:56:0;;;;;;;;-1:-1:-1;20903:11:0;20912:2;20903:11;;:::i;:::-;;;20772:154;;47606:327;47675:22;;;47704:1;47675:22;;;:15;:22;;;;;:28;47667:54;;;;-1:-1:-1;;;47667:54:0;;12382:2:1;47667:54:0;;;12364:21:1;12421:2;12401:18;;;12394:30;-1:-1:-1;;;12440:18:1;;;12433:42;12492:18;;47667:54:0;12180:336:1;47667:54:0;47774:22;;;;;;;:15;:22;;;;;;;;:26;;;47740:23;:30;;;;;;;:60;;47732:82;;;;-1:-1:-1;;;47732:82:0;;11636:2:1;47732:82:0;;;11618:21:1;11675:2;11655:18;;;11648:30;-1:-1:-1;;;11694:18:1;;;11687:40;11744:18;;47732:82:0;11434:334:1;47732:82:0;47835:30;;;;;;;:23;:30;;;;;;47825:55;;47866:3;;47871:1;;47825:9;:55::i;:::-;47891:30;;;;;;;:23;:30;;;;;:34;;47924:1;;47891:30;:34;;47924:1;;47891:34;:::i;:::-;;;;-1:-1:-1;;;;47606:327:0:o;38900:1408::-;-1:-1:-1;;;;;39063:16:0;;39055:62;;;;-1:-1:-1;;;39055:62:0;;18829:2:1;39055:62:0;;;18811:21:1;18868:2;18848:18;;;18841:30;18907:34;18887:18;;;18880:62;-1:-1:-1;;;18958:18:1;;;18951:31;18999:19;;39055:62:0;18627:397:1;39055:62:0;39254:21;39262:12;39254:7;:21::i;:::-;39253:22;39245:64;;;;-1:-1:-1;;;39245:64:0;;18471:2:1;39245:64:0;;;18453:21:1;18510:2;18490:18;;;18483:30;18549:31;18529:18;;;18522:59;18598:18;;39245:64:0;18269:353:1;39245:64:0;39395:20;39391:116;;39448:12;;39436:8;:24;;39428:71;;;;-1:-1:-1;;;39428:71:0;;21164:2:1;39428:71:0;;;21146:21:1;21203:2;21183:18;;;21176:30;21242:34;21222:18;;;21215:62;-1:-1:-1;;;21293:18:1;;;21286:32;21335:19;;39428:71:0;20962:398:1;39428:71:0;-1:-1:-1;;;;;39618:16:0;;39585:30;39618:16;;;:12;:16;;;;;;;;;39585:49;;;;;;;;;-1:-1:-1;;;;;39585:49:0;;;;;-1:-1:-1;;;39585:49:0;;;;;;;;;;;39660:139;;;;;;;;39680:19;;39585:49;;39660:139;;;39680:39;;39710:8;;39680:39;:::i;:::-;-1:-1:-1;;;;;39660:139:0;;;;;39756:11;:35;;39782:8;39756:35;;;39770:1;39756:35;39728:11;:24;;;:64;;;;:::i;:::-;-1:-1:-1;;;;;39660:139:0;;;;;;-1:-1:-1;;;;;39641:16:0;;;;;;;:12;:16;;;;;;;;:158;;;;;;;;-1:-1:-1;;;39641:158:0;;;;;;;;;;;;39834:43;;;;;;;;;;;39860:15;39834:43;;;;;;;;39806:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;39806:71:0;-1:-1:-1;;;;;;39806:71:0;;;;;;;;;;;;;;;;;;39818:12;;39930:304;39954:8;39950:1;:12;39930:304;;;39983:38;;40008:12;;-1:-1:-1;;;;;39983:38:0;;;40000:1;;39983:38;;40000:1;;39983:38;40048:59;40079:1;40083:2;40087:12;40101:5;40048:22;:59::i;:::-;40030:150;;;;-1:-1:-1;;;40030:150:0;;;;;;;:::i;:::-;40189:14;;;;:::i;:::-;40212:12;:14;;40189;;-1:-1:-1;40212:14:0;;-1:-1:-1;40212:12:0;:14;;;:::i;:::-;;;;;;39964:3;;;;;:::i;:::-;;;;39930:304;;;;39048:1260;;38900:1408;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;192:156;258:20;;318:4;307:16;;297:27;;287:55;;338:1;335;328:12;353:186;412:6;465:2;453:9;444:7;440:23;436:32;433:52;;;481:1;478;471:12;433:52;504:29;523:9;504:29;:::i;544:260::-;612:6;620;673:2;661:9;652:7;648:23;644:32;641:52;;;689:1;686;679:12;641:52;712:29;731:9;712:29;:::i;:::-;702:39;;760:38;794:2;783:9;779:18;760:38;:::i;:::-;750:48;;544:260;;;;;:::o;809:328::-;886:6;894;902;955:2;943:9;934:7;930:23;926:32;923:52;;;971:1;968;961:12;923:52;994:29;1013:9;994:29;:::i;:::-;984:39;;1042:38;1076:2;1065:9;1061:18;1042:38;:::i;:::-;1032:48;;1127:2;1116:9;1112:18;1099:32;1089:42;;809:328;;;;;:::o;1142:1138::-;1237:6;1245;1253;1261;1314:3;1302:9;1293:7;1289:23;1285:33;1282:53;;;1331:1;1328;1321:12;1282:53;1354:29;1373:9;1354:29;:::i;:::-;1344:39;;1402:38;1436:2;1425:9;1421:18;1402:38;:::i;:::-;1392:48;;1487:2;1476:9;1472:18;1459:32;1449:42;;1542:2;1531:9;1527:18;1514:32;1565:18;1606:2;1598:6;1595:14;1592:34;;;1622:1;1619;1612:12;1592:34;1660:6;1649:9;1645:22;1635:32;;1705:7;1698:4;1694:2;1690:13;1686:27;1676:55;;1727:1;1724;1717:12;1676:55;1763:2;1750:16;1785:2;1781;1778:10;1775:36;;;1791:18;;:::i;:::-;1866:2;1860:9;1834:2;1920:13;;-1:-1:-1;;1916:22:1;;;1940:2;1912:31;1908:40;1896:53;;;1964:18;;;1984:22;;;1961:46;1958:72;;;2010:18;;:::i;:::-;2050:10;2046:2;2039:22;2085:2;2077:6;2070:18;2125:7;2120:2;2115;2111;2107:11;2103:20;2100:33;2097:53;;;2146:1;2143;2136:12;2097:53;2202:2;2197;2193;2189:11;2184:2;2176:6;2172:15;2159:46;2247:1;2242:2;2237;2229:6;2225:15;2221:24;2214:35;2268:6;2258:16;;;;;;;1142:1138;;;;;;;:::o;2285:347::-;2350:6;2358;2411:2;2399:9;2390:7;2386:23;2382:32;2379:52;;;2427:1;2424;2417:12;2379:52;2450:29;2469:9;2450:29;:::i;:::-;2440:39;;2529:2;2518:9;2514:18;2501:32;2576:5;2569:13;2562:21;2555:5;2552:32;2542:60;;2598:1;2595;2588:12;2542:60;2621:5;2611:15;;;2285:347;;;;;:::o;2637:254::-;2705:6;2713;2766:2;2754:9;2745:7;2741:23;2737:32;2734:52;;;2782:1;2779;2772:12;2734:52;2805:29;2824:9;2805:29;:::i;:::-;2795:39;2881:2;2866:18;;;;2853:32;;-1:-1:-1;;;2637:254:1:o;2896:324::-;2971:6;2979;2987;3040:2;3028:9;3019:7;3015:23;3011:32;3008:52;;;3056:1;3053;3046:12;3008:52;3079:29;3098:9;3079:29;:::i;:::-;3069:39;;3155:2;3144:9;3140:18;3127:32;3117:42;;3178:36;3210:2;3199:9;3195:18;3178:36;:::i;:::-;3168:46;;2896:324;;;;;:::o;3225:691::-;3318:6;3326;3334;3387:2;3375:9;3366:7;3362:23;3358:32;3355:52;;;3403:1;3400;3393:12;3355:52;3443:9;3430:23;3472:18;3513:2;3505:6;3502:14;3499:34;;;3529:1;3526;3519:12;3499:34;3567:6;3556:9;3552:22;3542:32;;3612:7;3605:4;3601:2;3597:13;3593:27;3583:55;;3634:1;3631;3624:12;3583:55;3674:2;3661:16;3700:2;3692:6;3689:14;3686:34;;;3716:1;3713;3706:12;3686:34;3771:7;3764:4;3754:6;3751:1;3747:14;3743:2;3739:23;3735:34;3732:47;3729:67;;;3792:1;3789;3782:12;3729:67;3823:4;3815:13;;;;-1:-1:-1;3847:6:1;-1:-1:-1;3872:38:1;;3889:20;;;-1:-1:-1;3872:38:1;:::i;3921:245::-;3979:6;4032:2;4020:9;4011:7;4007:23;4003:32;4000:52;;;4048:1;4045;4038:12;4000:52;4087:9;4074:23;4106:30;4130:5;4106:30;:::i;4171:249::-;4240:6;4293:2;4281:9;4272:7;4268:23;4264:32;4261:52;;;4309:1;4306;4299:12;4261:52;4341:9;4335:16;4360:30;4384:5;4360:30;:::i;4425:592::-;4496:6;4504;4557:2;4545:9;4536:7;4532:23;4528:32;4525:52;;;4573:1;4570;4563:12;4525:52;4613:9;4600:23;4642:18;4683:2;4675:6;4672:14;4669:34;;;4699:1;4696;4689:12;4669:34;4737:6;4726:9;4722:22;4712:32;;4782:7;4775:4;4771:2;4767:13;4763:27;4753:55;;4804:1;4801;4794:12;4753:55;4844:2;4831:16;4870:2;4862:6;4859:14;4856:34;;;4886:1;4883;4876:12;4856:34;4931:7;4926:2;4917:6;4913:2;4909:15;4905:24;4902:37;4899:57;;;4952:1;4949;4942:12;4899:57;4983:2;4975:11;;;;;5005:6;;-1:-1:-1;4425:592:1;;-1:-1:-1;;;;4425:592:1:o;5022:180::-;5081:6;5134:2;5122:9;5113:7;5109:23;5105:32;5102:52;;;5150:1;5147;5140:12;5102:52;-1:-1:-1;5173:23:1;;5022:180;-1:-1:-1;5022:180:1:o;5207:182::-;5264:6;5317:2;5305:9;5296:7;5292:23;5288:32;5285:52;;;5333:1;5330;5323:12;5285:52;5356:27;5373:9;5356:27;:::i;5394:257::-;5435:3;5473:5;5467:12;5500:6;5495:3;5488:19;5516:63;5572:6;5565:4;5560:3;5556:14;5549:4;5542:5;5538:16;5516:63;:::i;:::-;5633:2;5612:15;-1:-1:-1;;5608:29:1;5599:39;;;;5640:4;5595:50;;5394:257;-1:-1:-1;;5394:257:1:o;5656:777::-;5706:3;5745:4;5740:3;5736:14;5777:5;5771:12;5766:3;5759:25;5803:4;5853:2;5846:5;5842:14;5836:21;5887:4;5882:2;5877:3;5873:12;5866:26;5914:4;5947:12;5941:19;5982:6;5976:4;5969:20;6016:3;6011;6007:13;5998:22;;6061:2;6047:12;6043:21;6029:35;;6082:1;6073:10;;6092:175;6106:6;6103:1;6100:13;6092:175;;;6169:13;;6155:28;;6242:15;;;;6128:1;6121:9;;;;;6205:14;;;;6092:175;;;6096:3;6328:4;6320;6313:5;6309:16;6303:23;6299:34;6292:4;6287:3;6283:14;6276:58;6397:4;6390:5;6386:16;6380:23;6373:31;6366:39;6359:4;6354:3;6350:14;6343:63;6422:5;6415:12;;;;;;5656:777;;;;:::o;6438:470::-;6617:3;6655:6;6649:13;6671:53;6717:6;6712:3;6705:4;6697:6;6693:17;6671:53;:::i;:::-;6787:13;;6746:16;;;;6809:57;6787:13;6746:16;6843:4;6831:17;;6809:57;:::i;:::-;6882:20;;6438:470;-1:-1:-1;;;;6438:470:1:o;7501:488::-;-1:-1:-1;;;;;7770:15:1;;;7752:34;;7822:15;;7817:2;7802:18;;7795:43;7869:2;7854:18;;7847:34;;;7917:3;7912:2;7897:18;;7890:31;;;7695:4;;7938:45;;7963:19;;7955:6;7938:45;:::i;:::-;7930:53;7501:488;-1:-1:-1;;;;;;7501:488:1:o;7994:841::-;8186:4;8215:2;8255;8244:9;8240:18;8285:2;8274:9;8267:21;8308:6;8343;8337:13;8374:6;8366;8359:22;8412:2;8401:9;8397:18;8390:25;;8474:2;8464:6;8461:1;8457:14;8446:9;8442:30;8438:39;8424:53;;8512:2;8504:6;8500:15;8533:1;8543:263;8557:6;8554:1;8551:13;8543:263;;;8650:2;8646:7;8634:9;8626:6;8622:22;8618:36;8613:3;8606:49;8678:48;8719:6;8710;8704:13;8678:48;:::i;:::-;8668:58;-1:-1:-1;8784:12:1;;;;8749:15;;;;8579:1;8572:9;8543:263;;;-1:-1:-1;8823:6:1;;7994:841;-1:-1:-1;;;;;;;7994:841:1:o;8840:639::-;9081:2;9063:21;;;9100:18;;9093:34;;;-1:-1:-1;;;;;;9139:31:1;;9136:51;;;9183:1;9180;9173:12;9136:51;9217:6;9214:1;9210:14;9275:6;9267;9261:3;9250:9;9246:19;9233:49;9353:1;9305:22;;;9329:3;9301:32;9342:13;;;9405:4;9390:20;;9383:36;;;;-1:-1:-1;9467:4:1;9455:17;;;;9450:2;9435:18;;;9428:45;9301:32;8840:639;-1:-1:-1;;8840:639:1:o;10106:219::-;10255:2;10244:9;10237:21;10218:4;10275:44;10315:2;10304:9;10300:18;10292:6;10275:44;:::i;15969:356::-;16171:2;16153:21;;;16190:18;;;16183:30;16249:34;16244:2;16229:18;;16222:62;16316:2;16301:18;;15969:356::o;17849:415::-;18051:2;18033:21;;;18090:2;18070:18;;;18063:30;18129:34;18124:2;18109:18;;18102:62;-1:-1:-1;;;18195:2:1;18180:18;;18173:49;18254:3;18239:19;;17849:415::o;21365:258::-;21544:2;21533:9;21526:21;21507:4;21564:53;21613:2;21602:9;21598:18;21590:6;21564:53;:::i;22896:253::-;22936:3;-1:-1:-1;;;;;23025:2:1;23022:1;23018:10;23055:2;23052:1;23048:10;23086:3;23082:2;23078:12;23073:3;23070:21;23067:47;;;23094:18;;:::i;23154:128::-;23194:3;23225:1;23221:6;23218:1;23215:13;23212:39;;;23231:18;;:::i;:::-;-1:-1:-1;23267:9:1;;23154:128::o;23287:120::-;23327:1;23353;23343:35;;23358:18;;:::i;:::-;-1:-1:-1;23392:9:1;;23287:120::o;23412:246::-;23452:4;-1:-1:-1;;;;;23565:10:1;;;;23535;;23587:12;;;23584:38;;;23602:18;;:::i;:::-;23639:13;;23412:246;-1:-1:-1;;;23412:246:1:o;23663:125::-;23703:4;23731:1;23728;23725:8;23722:34;;;23736:18;;:::i;:::-;-1:-1:-1;23773:9:1;;23663:125::o;23793:258::-;23865:1;23875:113;23889:6;23886:1;23883:13;23875:113;;;23965:11;;;23959:18;23946:11;;;23939:39;23911:2;23904:10;23875:113;;;24006:6;24003:1;24000:13;23997:48;;;-1:-1:-1;;24041:1:1;24023:16;;24016:27;23793:258::o;24056:380::-;24135:1;24131:12;;;;24178;;;24199:61;;24253:4;24245:6;24241:17;24231:27;;24199:61;24306:2;24298:6;24295:14;24275:18;24272:38;24269:161;;;24352:10;24347:3;24343:20;24340:1;24333:31;24387:4;24384:1;24377:15;24415:4;24412:1;24405:15;24269:161;;24056:380;;;:::o;24441:135::-;24480:3;-1:-1:-1;;24501:17:1;;24498:43;;;24521:18;;:::i;:::-;-1:-1:-1;24568:1:1;24557:13;;24441:135::o;24581:112::-;24613:1;24639;24629:35;;24644:18;;:::i;:::-;-1:-1:-1;24678:9:1;;24581:112::o;24698:127::-;24759:10;24754:3;24750:20;24747:1;24740:31;24790:4;24787:1;24780:15;24814:4;24811:1;24804:15;24830:127;24891:10;24886:3;24882:20;24879:1;24872:31;24922:4;24919:1;24912:15;24946:4;24943:1;24936:15;24962:127;25023:10;25018:3;25014:20;25011:1;25004:31;25054:4;25051:1;25044:15;25078:4;25075:1;25068:15;25094:127;25155:10;25150:3;25146:20;25143:1;25136:31;25186:4;25183:1;25176:15;25210:4;25207:1;25200:15;25226:131;-1:-1:-1;;;;;;25300:32:1;;25290:43;;25280:71;;25347:1;25344;25337:12
Swarm Source
ipfs://5d680cd5111c550dde45c2230322fbc669a4b0429ac1f90a4dde8057ee882b12
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.