Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
24 FRGZ
Holders
16
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 FRGZLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
TheFroggiez
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-01-05 */ // SPDX-License-Identifier: MIT // 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/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @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 (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @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, bytes calldata data ) external; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @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); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Reference type for token approval. struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @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) public virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @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) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @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. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @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 memory _data ) public virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 0x80 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80. str := add(mload(0x40), 0x80) // Update the free memory pointer to allocate. mstore(0x40, str) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File: contracts/trial.sol pragma solidity ^0.8.17; contract TheFroggiez is ERC721A, Ownable, ReentrancyGuard { //base uri string private initBaseURI = "ipfs://bafybeigxgxsyxkbzef3gop4fbpjbdczyqnvpehxqeba6ilzvwhwocjbw5m/"; //max supply uint256 public maxSupply = 2000; //cost for each after one free mint uint256 public cost = 0.003 ether; //max 10 per wallet uint256 public maxPerWallet = 10; //max 10 per txn uint256 public maxPertxn = 10; //public mint status bool public paused = false; //constructor constructor() ERC721A("The Froggiez", "FRGZ") { setBaseURI(initBaseURI); } function _startTokenId() internal view virtual override returns (uint256) { return 1; } //mint for address function mintforaddress(uint256 quantity, address reciever) public payable onlyOwner { _mint(reciever, quantity); } //mint function mint(uint256 _mintAmount) public payable nonReentrant { require(!paused, "contract is paused"); require(totalSupply() + _mintAmount <= maxSupply, "max supply would be exceeded"); uint minted = _numberMinted(msg.sender); require(minted + _mintAmount <= maxPerWallet, "max mint per wallet would be exceeded"); uint chargeableCount; if (minted == 0) { chargeableCount = _mintAmount - 1; require(_mintAmount > 0, "amount must be greater than 0"); require(msg.value >= cost * chargeableCount, "value not met"); } else { chargeableCount = _mintAmount; require(_mintAmount > 0, "amount must be greater than 0"); require(msg.sender == tx.origin, "no smart contracts"); require(msg.value >= cost * chargeableCount, "value not met"); } _safeMint(msg.sender, _mintAmount); } /* view function */ function tokenURI(uint256 _tokenId) public view override returns (string memory) { return string(abi.encodePacked(initBaseURI, Strings.toString(_tokenId), ".json")); } /* owner function */ function setBaseURI(string memory _initBaseURI) public onlyOwner { initBaseURI = _initBaseURI; } function setPaused(bool _state) public onlyOwner { paused = _state; } function setMaxPerWallet(uint256 _walletLimit) public onlyOwner{ maxPerWallet = _walletLimit; } function setCost(uint _cost) public onlyOwner { cost = _cost; } /* withdraw function*/ function withdraw() external onlyOwner nonReentrant { (bool succ, ) = payable(msg.sender).call{ value: address(this).balance }(""); require(succ, "Owner transfer failed"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPertxn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"reciever","type":"address"}],"name":"mintforaddress","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"_initBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_walletLimit","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","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":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260405180608001604052806043815260200162003a0160439139600a90816200002e91906200061d565b506107d0600b55660aa87bee538000600c55600a600d55600a600e556000600f60006101000a81548160ff0219169083151502179055503480156200007257600080fd5b506040518060400160405280600c81526020017f5468652046726f676769657a00000000000000000000000000000000000000008152506040518060400160405280600481526020017f4652475a000000000000000000000000000000000000000000000000000000008152508160029081620000f091906200061d565b5080600390816200010291906200061d565b5062000113620001ec60201b60201c565b60008190555050506200013b6200012f620001f560201b60201c565b620001fd60201b60201c565b6001600981905550620001e6600a805462000156906200040c565b80601f016020809104026020016040519081016040528092919081815260200182805462000184906200040c565b8015620001d55780601f10620001a957610100808354040283529160200191620001d5565b820191906000526020600020905b815481529060010190602001808311620001b757829003601f168201915b5050505050620002c360201b60201c565b62000787565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002d3620002e860201b60201c565b80600a9081620002e491906200061d565b5050565b620002f8620001f560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200031e6200037960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000377576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200036e9062000765565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200042557607f821691505b6020821081036200043b576200043a620003dd565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004a57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000466565b620004b1868362000466565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004fe620004f8620004f284620004c9565b620004d3565b620004c9565b9050919050565b6000819050919050565b6200051a83620004dd565b62000532620005298262000505565b84845462000473565b825550505050565b600090565b620005496200053a565b620005568184846200050f565b505050565b5b818110156200057e57620005726000826200053f565b6001810190506200055c565b5050565b601f821115620005cd57620005978162000441565b620005a28462000456565b81016020851015620005b2578190505b620005ca620005c18562000456565b8301826200055b565b50505b505050565b600082821c905092915050565b6000620005f260001984600802620005d2565b1980831691505092915050565b60006200060d8383620005df565b9150826002028217905092915050565b6200062882620003a3565b67ffffffffffffffff811115620006445762000643620003ae565b5b6200065082546200040c565b6200065d82828562000582565b600060209050601f83116001811462000695576000841562000680578287015190505b6200068c8582620005ff565b865550620006fc565b601f198416620006a58662000441565b60005b82811015620006cf57848901518255600182019150602085019450602081019050620006a8565b86831015620006ef5784890151620006eb601f891682620005df565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200074d60208362000704565b91506200075a8262000715565b602082019050919050565b6000602082019050818103600083015262000780816200073e565b9050919050565b61326a80620007976000396000f3fe6080604052600436106101c25760003560e01c80636352211e116100f7578063abd2a77511610095578063d5abeb0111610064578063d5abeb01146105fe578063e268e4d314610629578063e985e9c514610652578063f2fde38b1461068f576101c2565b8063abd2a77514610551578063b7250eaa1461056d578063b88d4fde14610598578063c87b56dd146105c1576101c2565b80638da5cb5b116100d15780638da5cb5b146104b657806395d89b41146104e1578063a0712d681461050c578063a22cb46514610528576101c2565b80636352211e1461042557806370a0823114610462578063715018a61461049f576101c2565b806323b872dd1161016457806344a0d68a1161013e57806344a0d68a1461037d578063453c2310146103a657806355f804b3146103d15780635c975abb146103fa576101c2565b806323b872dd146103145780633ccfd60b1461033d57806342842e0e14610354576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806313faede61461029557806316c38b3c146102c057806318160ddd146102e9576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190611fe9565b6106b8565b6040516101fb9190612031565b60405180910390f35b34801561021057600080fd5b5061021961074a565b60405161022691906120dc565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612134565b6107dc565b60405161026391906121a2565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e91906121e9565b61085b565b005b3480156102a157600080fd5b506102aa61099f565b6040516102b79190612238565b60405180910390f35b3480156102cc57600080fd5b506102e760048036038101906102e2919061227f565b6109a5565b005b3480156102f557600080fd5b506102fe6109ca565b60405161030b9190612238565b60405180910390f35b34801561032057600080fd5b5061033b600480360381019061033691906122ac565b6109e1565b005b34801561034957600080fd5b50610352610d03565b005b34801561036057600080fd5b5061037b600480360381019061037691906122ac565b610e0f565b005b34801561038957600080fd5b506103a4600480360381019061039f9190612134565b610e2f565b005b3480156103b257600080fd5b506103bb610e41565b6040516103c89190612238565b60405180910390f35b3480156103dd57600080fd5b506103f860048036038101906103f39190612434565b610e47565b005b34801561040657600080fd5b5061040f610e62565b60405161041c9190612031565b60405180910390f35b34801561043157600080fd5b5061044c60048036038101906104479190612134565b610e75565b60405161045991906121a2565b60405180910390f35b34801561046e57600080fd5b506104896004803603810190610484919061247d565b610e87565b6040516104969190612238565b60405180910390f35b3480156104ab57600080fd5b506104b4610f3f565b005b3480156104c257600080fd5b506104cb610f53565b6040516104d891906121a2565b60405180910390f35b3480156104ed57600080fd5b506104f6610f7d565b60405161050391906120dc565b60405180910390f35b61052660048036038101906105219190612134565b61100f565b005b34801561053457600080fd5b5061054f600480360381019061054a91906124aa565b61132c565b005b61056b600480360381019061056691906124ea565b6114a3565b005b34801561057957600080fd5b506105826114b9565b60405161058f9190612238565b60405180910390f35b3480156105a457600080fd5b506105bf60048036038101906105ba91906125cb565b6114bf565b005b3480156105cd57600080fd5b506105e860048036038101906105e39190612134565b611532565b6040516105f591906120dc565b60405180910390f35b34801561060a57600080fd5b50610613611566565b6040516106209190612238565b60405180910390f35b34801561063557600080fd5b50610650600480360381019061064b9190612134565b61156c565b005b34801561065e57600080fd5b506106796004803603810190610674919061264e565b61157e565b6040516106869190612031565b60405180910390f35b34801561069b57600080fd5b506106b660048036038101906106b1919061247d565b611612565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061071357506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107435750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610759906126bd565b80601f0160208091040260200160405190810160405280929190818152602001828054610785906126bd565b80156107d25780601f106107a7576101008083540402835291602001916107d2565b820191906000526020600020905b8154815290600101906020018083116107b557829003601f168201915b5050505050905090565b60006107e782611695565b61081d576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061086682610e75565b90508073ffffffffffffffffffffffffffffffffffffffff166108876116f4565b73ffffffffffffffffffffffffffffffffffffffff16146108ea576108b3816108ae6116f4565b61157e565b6108e9576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600c5481565b6109ad6116fc565b80600f60006101000a81548160ff02191690831515021790555050565b60006109d461177a565b6001546000540303905090565b60006109ec82611783565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a53576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610a5f8461184f565b91509150610a758187610a706116f4565b611876565b610ac157610a8a86610a856116f4565b61157e565b610ac0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610b27576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b3486868660016118ba565b8015610b3f57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610c0d85610be98888876118c0565b7c0200000000000000000000000000000000000000000000000000000000176118e8565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610c935760006001850190506000600460008381526020019081526020016000205403610c91576000548114610c90578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610cfb8686866001611913565b505050505050565b610d0b6116fc565b600260095403610d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d479061273a565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610d7e9061278b565b60006040518083038185875af1925050503d8060008114610dbb576040519150601f19603f3d011682016040523d82523d6000602084013e610dc0565b606091505b5050905080610e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfb906127ec565b60405180910390fd5b506001600981905550565b610e2a838383604051806020016040528060008152506114bf565b505050565b610e376116fc565b80600c8190555050565b600d5481565b610e4f6116fc565b80600a9081610e5e91906129b8565b5050565b600f60009054906101000a900460ff1681565b6000610e8082611783565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610eee576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610f476116fc565b610f516000611919565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610f8c906126bd565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb8906126bd565b80156110055780601f10610fda57610100808354040283529160200191611005565b820191906000526020600020905b815481529060010190602001808311610fe857829003601f168201915b5050505050905090565b600260095403611054576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104b9061273a565b60405180910390fd5b6002600981905550600f60009054906101000a900460ff16156110ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a390612ad6565b60405180910390fd5b600b54816110b86109ca565b6110c29190612b25565b1115611103576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fa90612ba5565b60405180910390fd5b600061110e336119df565b9050600d54828261111f9190612b25565b1115611160576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115790612c37565b60405180910390fd5b6000808203611210576001836111769190612c57565b9050600083116111bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b290612cd7565b60405180910390fd5b80600c546111c99190612cf7565b34101561120b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120290612d85565b60405180910390fd5b611315565b82905060008311611256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124d90612cd7565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bb90612df1565b60405180910390fd5b80600c546112d29190612cf7565b341015611314576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130b90612d85565b60405180910390fd5b5b61131f3384611a36565b5050600160098190555050565b6113346116f4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611398576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006113a56116f4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114526116f4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114979190612031565b60405180910390a35050565b6114ab6116fc565b6114b58183611a54565b5050565b600e5481565b6114ca8484846109e1565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461152c576114f584848484611c0f565b61152b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600a61153f83611d5f565b604051602001611550929190612f1c565b6040516020818303038152906040529050919050565b600b5481565b6115746116fc565b80600d8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61161a6116fc565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611689576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168090612fbd565b60405180910390fd5b61169281611919565b50565b6000816116a061177a565b111580156116af575060005482105b80156116ed575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b611704611ebf565b73ffffffffffffffffffffffffffffffffffffffff16611722610f53565b73ffffffffffffffffffffffffffffffffffffffff1614611778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176f90613029565b60405180910390fd5b565b60006001905090565b6000808290508061179261177a565b11611818576000548110156118175760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611815575b6000810361180b5760046000836001900393508381526020019081526020016000205490506117e1565b809250505061184a565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86118d7868684611ec7565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b611a50828260405180602001604052806000815250611ed0565b5050565b60008054905060008203611a94576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611aa160008483856118ba565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611b1883611b0960008660006118c0565b611b1285611f6d565b176118e8565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611bb957808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611b7e565b5060008203611bf4576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611c0a6000848385611913565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611c356116f4565b8786866040518563ffffffff1660e01b8152600401611c57949392919061309e565b6020604051808303816000875af1925050508015611c9357506040513d601f19601f82011682018060405250810190611c9091906130ff565b60015b611d0c573d8060008114611cc3576040519150601f19603f3d011682016040523d82523d6000602084013e611cc8565b606091505b506000815103611d04576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008203611da6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611eba565b600082905060005b60008214611dd8578080611dc19061312c565b915050600a82611dd191906131a3565b9150611dae565b60008167ffffffffffffffff811115611df457611df3612309565b5b6040519080825280601f01601f191660200182016040528015611e265781602001600182028036833780820191505090505b5090505b60008514611eb357600182611e3f9190612c57565b9150600a85611e4e91906131d4565b6030611e5a9190612b25565b60f81b818381518110611e7057611e6f613205565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611eac91906131a3565b9450611e2a565b8093505050505b919050565b600033905090565b60009392505050565b611eda8383611a54565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611f6857600080549050600083820390505b611f1a6000868380600101945086611c0f565b611f50576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611f07578160005414611f6557600080fd5b50505b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611fc681611f91565b8114611fd157600080fd5b50565b600081359050611fe381611fbd565b92915050565b600060208284031215611fff57611ffe611f87565b5b600061200d84828501611fd4565b91505092915050565b60008115159050919050565b61202b81612016565b82525050565b60006020820190506120466000830184612022565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561208657808201518184015260208101905061206b565b60008484015250505050565b6000601f19601f8301169050919050565b60006120ae8261204c565b6120b88185612057565b93506120c8818560208601612068565b6120d181612092565b840191505092915050565b600060208201905081810360008301526120f681846120a3565b905092915050565b6000819050919050565b612111816120fe565b811461211c57600080fd5b50565b60008135905061212e81612108565b92915050565b60006020828403121561214a57612149611f87565b5b60006121588482850161211f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061218c82612161565b9050919050565b61219c81612181565b82525050565b60006020820190506121b76000830184612193565b92915050565b6121c681612181565b81146121d157600080fd5b50565b6000813590506121e3816121bd565b92915050565b60008060408385031215612200576121ff611f87565b5b600061220e858286016121d4565b925050602061221f8582860161211f565b9150509250929050565b612232816120fe565b82525050565b600060208201905061224d6000830184612229565b92915050565b61225c81612016565b811461226757600080fd5b50565b60008135905061227981612253565b92915050565b60006020828403121561229557612294611f87565b5b60006122a38482850161226a565b91505092915050565b6000806000606084860312156122c5576122c4611f87565b5b60006122d3868287016121d4565b93505060206122e4868287016121d4565b92505060406122f58682870161211f565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61234182612092565b810181811067ffffffffffffffff821117156123605761235f612309565b5b80604052505050565b6000612373611f7d565b905061237f8282612338565b919050565b600067ffffffffffffffff82111561239f5761239e612309565b5b6123a882612092565b9050602081019050919050565b82818337600083830152505050565b60006123d76123d284612384565b612369565b9050828152602081018484840111156123f3576123f2612304565b5b6123fe8482856123b5565b509392505050565b600082601f83011261241b5761241a6122ff565b5b813561242b8482602086016123c4565b91505092915050565b60006020828403121561244a57612449611f87565b5b600082013567ffffffffffffffff81111561246857612467611f8c565b5b61247484828501612406565b91505092915050565b60006020828403121561249357612492611f87565b5b60006124a1848285016121d4565b91505092915050565b600080604083850312156124c1576124c0611f87565b5b60006124cf858286016121d4565b92505060206124e08582860161226a565b9150509250929050565b6000806040838503121561250157612500611f87565b5b600061250f8582860161211f565b9250506020612520858286016121d4565b9150509250929050565b600067ffffffffffffffff82111561254557612544612309565b5b61254e82612092565b9050602081019050919050565b600061256e6125698461252a565b612369565b90508281526020810184848401111561258a57612589612304565b5b6125958482856123b5565b509392505050565b600082601f8301126125b2576125b16122ff565b5b81356125c284826020860161255b565b91505092915050565b600080600080608085870312156125e5576125e4611f87565b5b60006125f3878288016121d4565b9450506020612604878288016121d4565b93505060406126158782880161211f565b925050606085013567ffffffffffffffff81111561263657612635611f8c565b5b6126428782880161259d565b91505092959194509250565b6000806040838503121561266557612664611f87565b5b6000612673858286016121d4565b9250506020612684858286016121d4565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806126d557607f821691505b6020821081036126e8576126e761268e565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612724601f83612057565b915061272f826126ee565b602082019050919050565b6000602082019050818103600083015261275381612717565b9050919050565b600081905092915050565b50565b600061277560008361275a565b915061278082612765565b600082019050919050565b600061279682612768565b9150819050919050565b7f4f776e6572207472616e73666572206661696c65640000000000000000000000600082015250565b60006127d6601583612057565b91506127e1826127a0565b602082019050919050565b60006020820190508181036000830152612805816127c9565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261286e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612831565b6128788683612831565b95508019841693508086168417925050509392505050565b6000819050919050565b60006128b56128b06128ab846120fe565b612890565b6120fe565b9050919050565b6000819050919050565b6128cf8361289a565b6128e36128db826128bc565b84845461283e565b825550505050565b600090565b6128f86128eb565b6129038184846128c6565b505050565b5b818110156129275761291c6000826128f0565b600181019050612909565b5050565b601f82111561296c5761293d8161280c565b61294684612821565b81016020851015612955578190505b61296961296185612821565b830182612908565b50505b505050565b600082821c905092915050565b600061298f60001984600802612971565b1980831691505092915050565b60006129a8838361297e565b9150826002028217905092915050565b6129c18261204c565b67ffffffffffffffff8111156129da576129d9612309565b5b6129e482546126bd565b6129ef82828561292b565b600060209050601f831160018114612a225760008415612a10578287015190505b612a1a858261299c565b865550612a82565b601f198416612a308661280c565b60005b82811015612a5857848901518255600182019150602085019450602081019050612a33565b86831015612a755784890151612a71601f89168261297e565b8355505b6001600288020188555050505b505050505050565b7f636f6e7472616374206973207061757365640000000000000000000000000000600082015250565b6000612ac0601283612057565b9150612acb82612a8a565b602082019050919050565b60006020820190508181036000830152612aef81612ab3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612b30826120fe565b9150612b3b836120fe565b9250828201905080821115612b5357612b52612af6565b5b92915050565b7f6d617820737570706c7920776f756c6420626520657863656564656400000000600082015250565b6000612b8f601c83612057565b9150612b9a82612b59565b602082019050919050565b60006020820190508181036000830152612bbe81612b82565b9050919050565b7f6d6178206d696e74207065722077616c6c657420776f756c642062652065786360008201527f6565646564000000000000000000000000000000000000000000000000000000602082015250565b6000612c21602583612057565b9150612c2c82612bc5565b604082019050919050565b60006020820190508181036000830152612c5081612c14565b9050919050565b6000612c62826120fe565b9150612c6d836120fe565b9250828203905081811115612c8557612c84612af6565b5b92915050565b7f616d6f756e74206d7573742062652067726561746572207468616e2030000000600082015250565b6000612cc1601d83612057565b9150612ccc82612c8b565b602082019050919050565b60006020820190508181036000830152612cf081612cb4565b9050919050565b6000612d02826120fe565b9150612d0d836120fe565b9250828202612d1b816120fe565b91508282048414831517612d3257612d31612af6565b5b5092915050565b7f76616c7565206e6f74206d657400000000000000000000000000000000000000600082015250565b6000612d6f600d83612057565b9150612d7a82612d39565b602082019050919050565b60006020820190508181036000830152612d9e81612d62565b9050919050565b7f6e6f20736d61727420636f6e7472616374730000000000000000000000000000600082015250565b6000612ddb601283612057565b9150612de682612da5565b602082019050919050565b60006020820190508181036000830152612e0a81612dce565b9050919050565b600081905092915050565b60008154612e29816126bd565b612e338186612e11565b94506001821660008114612e4e5760018114612e6357612e96565b60ff1983168652811515820286019350612e96565b612e6c8561280c565b60005b83811015612e8e57815481890152600182019150602081019050612e6f565b838801955050505b50505092915050565b6000612eaa8261204c565b612eb48185612e11565b9350612ec4818560208601612068565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000612f06600583612e11565b9150612f1182612ed0565b600582019050919050565b6000612f288285612e1c565b9150612f348284612e9f565b9150612f3f82612ef9565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612fa7602683612057565b9150612fb282612f4b565b604082019050919050565b60006020820190508181036000830152612fd681612f9a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613013602083612057565b915061301e82612fdd565b602082019050919050565b6000602082019050818103600083015261304281613006565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061307082613049565b61307a8185613054565b935061308a818560208601612068565b61309381612092565b840191505092915050565b60006080820190506130b36000830187612193565b6130c06020830186612193565b6130cd6040830185612229565b81810360608301526130df8184613065565b905095945050505050565b6000815190506130f981611fbd565b92915050565b60006020828403121561311557613114611f87565b5b6000613123848285016130ea565b91505092915050565b6000613137826120fe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361316957613168612af6565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006131ae826120fe565b91506131b9836120fe565b9250826131c9576131c8613174565b5b828204905092915050565b60006131df826120fe565b91506131ea836120fe565b9250826131fa576131f9613174565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212209c809997b6a775e3db112770537a63f1eef3738d40927bcc9479b5e6b82d3b4964736f6c63430008110033697066733a2f2f62616679626569677867787379786b627a656633676f70346662706a6264637a79716e76706568787165626136696c7a767768776f636a6277356d2f
Deployed Bytecode
0x6080604052600436106101c25760003560e01c80636352211e116100f7578063abd2a77511610095578063d5abeb0111610064578063d5abeb01146105fe578063e268e4d314610629578063e985e9c514610652578063f2fde38b1461068f576101c2565b8063abd2a77514610551578063b7250eaa1461056d578063b88d4fde14610598578063c87b56dd146105c1576101c2565b80638da5cb5b116100d15780638da5cb5b146104b657806395d89b41146104e1578063a0712d681461050c578063a22cb46514610528576101c2565b80636352211e1461042557806370a0823114610462578063715018a61461049f576101c2565b806323b872dd1161016457806344a0d68a1161013e57806344a0d68a1461037d578063453c2310146103a657806355f804b3146103d15780635c975abb146103fa576101c2565b806323b872dd146103145780633ccfd60b1461033d57806342842e0e14610354576101c2565b8063095ea7b3116101a0578063095ea7b31461026c57806313faede61461029557806316c38b3c146102c057806318160ddd146102e9576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190611fe9565b6106b8565b6040516101fb9190612031565b60405180910390f35b34801561021057600080fd5b5061021961074a565b60405161022691906120dc565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612134565b6107dc565b60405161026391906121a2565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e91906121e9565b61085b565b005b3480156102a157600080fd5b506102aa61099f565b6040516102b79190612238565b60405180910390f35b3480156102cc57600080fd5b506102e760048036038101906102e2919061227f565b6109a5565b005b3480156102f557600080fd5b506102fe6109ca565b60405161030b9190612238565b60405180910390f35b34801561032057600080fd5b5061033b600480360381019061033691906122ac565b6109e1565b005b34801561034957600080fd5b50610352610d03565b005b34801561036057600080fd5b5061037b600480360381019061037691906122ac565b610e0f565b005b34801561038957600080fd5b506103a4600480360381019061039f9190612134565b610e2f565b005b3480156103b257600080fd5b506103bb610e41565b6040516103c89190612238565b60405180910390f35b3480156103dd57600080fd5b506103f860048036038101906103f39190612434565b610e47565b005b34801561040657600080fd5b5061040f610e62565b60405161041c9190612031565b60405180910390f35b34801561043157600080fd5b5061044c60048036038101906104479190612134565b610e75565b60405161045991906121a2565b60405180910390f35b34801561046e57600080fd5b506104896004803603810190610484919061247d565b610e87565b6040516104969190612238565b60405180910390f35b3480156104ab57600080fd5b506104b4610f3f565b005b3480156104c257600080fd5b506104cb610f53565b6040516104d891906121a2565b60405180910390f35b3480156104ed57600080fd5b506104f6610f7d565b60405161050391906120dc565b60405180910390f35b61052660048036038101906105219190612134565b61100f565b005b34801561053457600080fd5b5061054f600480360381019061054a91906124aa565b61132c565b005b61056b600480360381019061056691906124ea565b6114a3565b005b34801561057957600080fd5b506105826114b9565b60405161058f9190612238565b60405180910390f35b3480156105a457600080fd5b506105bf60048036038101906105ba91906125cb565b6114bf565b005b3480156105cd57600080fd5b506105e860048036038101906105e39190612134565b611532565b6040516105f591906120dc565b60405180910390f35b34801561060a57600080fd5b50610613611566565b6040516106209190612238565b60405180910390f35b34801561063557600080fd5b50610650600480360381019061064b9190612134565b61156c565b005b34801561065e57600080fd5b506106796004803603810190610674919061264e565b61157e565b6040516106869190612031565b60405180910390f35b34801561069b57600080fd5b506106b660048036038101906106b1919061247d565b611612565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061071357506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107435750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610759906126bd565b80601f0160208091040260200160405190810160405280929190818152602001828054610785906126bd565b80156107d25780601f106107a7576101008083540402835291602001916107d2565b820191906000526020600020905b8154815290600101906020018083116107b557829003601f168201915b5050505050905090565b60006107e782611695565b61081d576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061086682610e75565b90508073ffffffffffffffffffffffffffffffffffffffff166108876116f4565b73ffffffffffffffffffffffffffffffffffffffff16146108ea576108b3816108ae6116f4565b61157e565b6108e9576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600c5481565b6109ad6116fc565b80600f60006101000a81548160ff02191690831515021790555050565b60006109d461177a565b6001546000540303905090565b60006109ec82611783565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a53576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610a5f8461184f565b91509150610a758187610a706116f4565b611876565b610ac157610a8a86610a856116f4565b61157e565b610ac0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610b27576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b3486868660016118ba565b8015610b3f57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610c0d85610be98888876118c0565b7c0200000000000000000000000000000000000000000000000000000000176118e8565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610c935760006001850190506000600460008381526020019081526020016000205403610c91576000548114610c90578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610cfb8686866001611913565b505050505050565b610d0b6116fc565b600260095403610d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d479061273a565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610d7e9061278b565b60006040518083038185875af1925050503d8060008114610dbb576040519150601f19603f3d011682016040523d82523d6000602084013e610dc0565b606091505b5050905080610e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfb906127ec565b60405180910390fd5b506001600981905550565b610e2a838383604051806020016040528060008152506114bf565b505050565b610e376116fc565b80600c8190555050565b600d5481565b610e4f6116fc565b80600a9081610e5e91906129b8565b5050565b600f60009054906101000a900460ff1681565b6000610e8082611783565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610eee576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610f476116fc565b610f516000611919565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610f8c906126bd565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb8906126bd565b80156110055780601f10610fda57610100808354040283529160200191611005565b820191906000526020600020905b815481529060010190602001808311610fe857829003601f168201915b5050505050905090565b600260095403611054576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104b9061273a565b60405180910390fd5b6002600981905550600f60009054906101000a900460ff16156110ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a390612ad6565b60405180910390fd5b600b54816110b86109ca565b6110c29190612b25565b1115611103576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fa90612ba5565b60405180910390fd5b600061110e336119df565b9050600d54828261111f9190612b25565b1115611160576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115790612c37565b60405180910390fd5b6000808203611210576001836111769190612c57565b9050600083116111bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b290612cd7565b60405180910390fd5b80600c546111c99190612cf7565b34101561120b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120290612d85565b60405180910390fd5b611315565b82905060008311611256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124d90612cd7565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bb90612df1565b60405180910390fd5b80600c546112d29190612cf7565b341015611314576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130b90612d85565b60405180910390fd5b5b61131f3384611a36565b5050600160098190555050565b6113346116f4565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611398576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006113a56116f4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114526116f4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114979190612031565b60405180910390a35050565b6114ab6116fc565b6114b58183611a54565b5050565b600e5481565b6114ca8484846109e1565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461152c576114f584848484611c0f565b61152b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600a61153f83611d5f565b604051602001611550929190612f1c565b6040516020818303038152906040529050919050565b600b5481565b6115746116fc565b80600d8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61161a6116fc565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611689576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168090612fbd565b60405180910390fd5b61169281611919565b50565b6000816116a061177a565b111580156116af575060005482105b80156116ed575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b611704611ebf565b73ffffffffffffffffffffffffffffffffffffffff16611722610f53565b73ffffffffffffffffffffffffffffffffffffffff1614611778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176f90613029565b60405180910390fd5b565b60006001905090565b6000808290508061179261177a565b11611818576000548110156118175760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611815575b6000810361180b5760046000836001900393508381526020019081526020016000205490506117e1565b809250505061184a565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86118d7868684611ec7565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b611a50828260405180602001604052806000815250611ed0565b5050565b60008054905060008203611a94576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611aa160008483856118ba565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611b1883611b0960008660006118c0565b611b1285611f6d565b176118e8565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611bb957808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611b7e565b5060008203611bf4576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611c0a6000848385611913565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611c356116f4565b8786866040518563ffffffff1660e01b8152600401611c57949392919061309e565b6020604051808303816000875af1925050508015611c9357506040513d601f19601f82011682018060405250810190611c9091906130ff565b60015b611d0c573d8060008114611cc3576040519150601f19603f3d011682016040523d82523d6000602084013e611cc8565b606091505b506000815103611d04576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008203611da6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611eba565b600082905060005b60008214611dd8578080611dc19061312c565b915050600a82611dd191906131a3565b9150611dae565b60008167ffffffffffffffff811115611df457611df3612309565b5b6040519080825280601f01601f191660200182016040528015611e265781602001600182028036833780820191505090505b5090505b60008514611eb357600182611e3f9190612c57565b9150600a85611e4e91906131d4565b6030611e5a9190612b25565b60f81b818381518110611e7057611e6f613205565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611eac91906131a3565b9450611e2a565b8093505050505b919050565b600033905090565b60009392505050565b611eda8383611a54565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611f6857600080549050600083820390505b611f1a6000868380600101945086611c0f565b611f50576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611f07578160005414611f6557600080fd5b50505b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611fc681611f91565b8114611fd157600080fd5b50565b600081359050611fe381611fbd565b92915050565b600060208284031215611fff57611ffe611f87565b5b600061200d84828501611fd4565b91505092915050565b60008115159050919050565b61202b81612016565b82525050565b60006020820190506120466000830184612022565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561208657808201518184015260208101905061206b565b60008484015250505050565b6000601f19601f8301169050919050565b60006120ae8261204c565b6120b88185612057565b93506120c8818560208601612068565b6120d181612092565b840191505092915050565b600060208201905081810360008301526120f681846120a3565b905092915050565b6000819050919050565b612111816120fe565b811461211c57600080fd5b50565b60008135905061212e81612108565b92915050565b60006020828403121561214a57612149611f87565b5b60006121588482850161211f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061218c82612161565b9050919050565b61219c81612181565b82525050565b60006020820190506121b76000830184612193565b92915050565b6121c681612181565b81146121d157600080fd5b50565b6000813590506121e3816121bd565b92915050565b60008060408385031215612200576121ff611f87565b5b600061220e858286016121d4565b925050602061221f8582860161211f565b9150509250929050565b612232816120fe565b82525050565b600060208201905061224d6000830184612229565b92915050565b61225c81612016565b811461226757600080fd5b50565b60008135905061227981612253565b92915050565b60006020828403121561229557612294611f87565b5b60006122a38482850161226a565b91505092915050565b6000806000606084860312156122c5576122c4611f87565b5b60006122d3868287016121d4565b93505060206122e4868287016121d4565b92505060406122f58682870161211f565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61234182612092565b810181811067ffffffffffffffff821117156123605761235f612309565b5b80604052505050565b6000612373611f7d565b905061237f8282612338565b919050565b600067ffffffffffffffff82111561239f5761239e612309565b5b6123a882612092565b9050602081019050919050565b82818337600083830152505050565b60006123d76123d284612384565b612369565b9050828152602081018484840111156123f3576123f2612304565b5b6123fe8482856123b5565b509392505050565b600082601f83011261241b5761241a6122ff565b5b813561242b8482602086016123c4565b91505092915050565b60006020828403121561244a57612449611f87565b5b600082013567ffffffffffffffff81111561246857612467611f8c565b5b61247484828501612406565b91505092915050565b60006020828403121561249357612492611f87565b5b60006124a1848285016121d4565b91505092915050565b600080604083850312156124c1576124c0611f87565b5b60006124cf858286016121d4565b92505060206124e08582860161226a565b9150509250929050565b6000806040838503121561250157612500611f87565b5b600061250f8582860161211f565b9250506020612520858286016121d4565b9150509250929050565b600067ffffffffffffffff82111561254557612544612309565b5b61254e82612092565b9050602081019050919050565b600061256e6125698461252a565b612369565b90508281526020810184848401111561258a57612589612304565b5b6125958482856123b5565b509392505050565b600082601f8301126125b2576125b16122ff565b5b81356125c284826020860161255b565b91505092915050565b600080600080608085870312156125e5576125e4611f87565b5b60006125f3878288016121d4565b9450506020612604878288016121d4565b93505060406126158782880161211f565b925050606085013567ffffffffffffffff81111561263657612635611f8c565b5b6126428782880161259d565b91505092959194509250565b6000806040838503121561266557612664611f87565b5b6000612673858286016121d4565b9250506020612684858286016121d4565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806126d557607f821691505b6020821081036126e8576126e761268e565b5b50919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612724601f83612057565b915061272f826126ee565b602082019050919050565b6000602082019050818103600083015261275381612717565b9050919050565b600081905092915050565b50565b600061277560008361275a565b915061278082612765565b600082019050919050565b600061279682612768565b9150819050919050565b7f4f776e6572207472616e73666572206661696c65640000000000000000000000600082015250565b60006127d6601583612057565b91506127e1826127a0565b602082019050919050565b60006020820190508181036000830152612805816127c9565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261286e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612831565b6128788683612831565b95508019841693508086168417925050509392505050565b6000819050919050565b60006128b56128b06128ab846120fe565b612890565b6120fe565b9050919050565b6000819050919050565b6128cf8361289a565b6128e36128db826128bc565b84845461283e565b825550505050565b600090565b6128f86128eb565b6129038184846128c6565b505050565b5b818110156129275761291c6000826128f0565b600181019050612909565b5050565b601f82111561296c5761293d8161280c565b61294684612821565b81016020851015612955578190505b61296961296185612821565b830182612908565b50505b505050565b600082821c905092915050565b600061298f60001984600802612971565b1980831691505092915050565b60006129a8838361297e565b9150826002028217905092915050565b6129c18261204c565b67ffffffffffffffff8111156129da576129d9612309565b5b6129e482546126bd565b6129ef82828561292b565b600060209050601f831160018114612a225760008415612a10578287015190505b612a1a858261299c565b865550612a82565b601f198416612a308661280c565b60005b82811015612a5857848901518255600182019150602085019450602081019050612a33565b86831015612a755784890151612a71601f89168261297e565b8355505b6001600288020188555050505b505050505050565b7f636f6e7472616374206973207061757365640000000000000000000000000000600082015250565b6000612ac0601283612057565b9150612acb82612a8a565b602082019050919050565b60006020820190508181036000830152612aef81612ab3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612b30826120fe565b9150612b3b836120fe565b9250828201905080821115612b5357612b52612af6565b5b92915050565b7f6d617820737570706c7920776f756c6420626520657863656564656400000000600082015250565b6000612b8f601c83612057565b9150612b9a82612b59565b602082019050919050565b60006020820190508181036000830152612bbe81612b82565b9050919050565b7f6d6178206d696e74207065722077616c6c657420776f756c642062652065786360008201527f6565646564000000000000000000000000000000000000000000000000000000602082015250565b6000612c21602583612057565b9150612c2c82612bc5565b604082019050919050565b60006020820190508181036000830152612c5081612c14565b9050919050565b6000612c62826120fe565b9150612c6d836120fe565b9250828203905081811115612c8557612c84612af6565b5b92915050565b7f616d6f756e74206d7573742062652067726561746572207468616e2030000000600082015250565b6000612cc1601d83612057565b9150612ccc82612c8b565b602082019050919050565b60006020820190508181036000830152612cf081612cb4565b9050919050565b6000612d02826120fe565b9150612d0d836120fe565b9250828202612d1b816120fe565b91508282048414831517612d3257612d31612af6565b5b5092915050565b7f76616c7565206e6f74206d657400000000000000000000000000000000000000600082015250565b6000612d6f600d83612057565b9150612d7a82612d39565b602082019050919050565b60006020820190508181036000830152612d9e81612d62565b9050919050565b7f6e6f20736d61727420636f6e7472616374730000000000000000000000000000600082015250565b6000612ddb601283612057565b9150612de682612da5565b602082019050919050565b60006020820190508181036000830152612e0a81612dce565b9050919050565b600081905092915050565b60008154612e29816126bd565b612e338186612e11565b94506001821660008114612e4e5760018114612e6357612e96565b60ff1983168652811515820286019350612e96565b612e6c8561280c565b60005b83811015612e8e57815481890152600182019150602081019050612e6f565b838801955050505b50505092915050565b6000612eaa8261204c565b612eb48185612e11565b9350612ec4818560208601612068565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000612f06600583612e11565b9150612f1182612ed0565b600582019050919050565b6000612f288285612e1c565b9150612f348284612e9f565b9150612f3f82612ef9565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612fa7602683612057565b9150612fb282612f4b565b604082019050919050565b60006020820190508181036000830152612fd681612f9a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613013602083612057565b915061301e82612fdd565b602082019050919050565b6000602082019050818103600083015261304281613006565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061307082613049565b61307a8185613054565b935061308a818560208601612068565b61309381612092565b840191505092915050565b60006080820190506130b36000830187612193565b6130c06020830186612193565b6130cd6040830185612229565b81810360608301526130df8184613065565b905095945050505050565b6000815190506130f981611fbd565b92915050565b60006020828403121561311557613114611f87565b5b6000613123848285016130ea565b91505092915050565b6000613137826120fe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361316957613168612af6565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006131ae826120fe565b91506131b9836120fe565b9250826131c9576131c8613174565b5b828204905092915050565b60006131df826120fe565b91506131ea836120fe565b9250826131fa576131f9613174565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212209c809997b6a775e3db112770537a63f1eef3738d40927bcc9479b5e6b82d3b4964736f6c63430008110033
Deployed Bytecode Sourcemap
59777:2764:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27319:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28221:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34704:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34145:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60055:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62003:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23972:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38411:2817;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62320:218;;;;;;;;;;;;;:::i;:::-;;41324:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62211:73;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60118:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61885:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60237:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29614:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25156:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8067:103;;;;;;;;;;;;;:::i;:::-;;7419:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28397:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60662:953;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35262:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60513:130;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60177:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42107:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61658:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59978:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62094:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35727:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8325:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27319:639;27404:4;27743:10;27728:25;;:11;:25;;;;:102;;;;27820:10;27805:25;;:11;:25;;;;27728:102;:179;;;;27897:10;27882:25;;:11;:25;;;;27728:179;27708:199;;27319:639;;;:::o;28221:100::-;28275:13;28308:5;28301:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28221:100;:::o;34704:218::-;34780:7;34805:16;34813:7;34805;:16::i;:::-;34800:64;;34830:34;;;;;;;;;;;;;;34800:64;34884:15;:24;34900:7;34884:24;;;;;;;;;;;:30;;;;;;;;;;;;34877:37;;34704:218;;;:::o;34145:400::-;34226:13;34242:16;34250:7;34242;:16::i;:::-;34226:32;;34298:5;34275:28;;:19;:17;:19::i;:::-;:28;;;34271:175;;34323:44;34340:5;34347:19;:17;:19::i;:::-;34323:16;:44::i;:::-;34318:128;;34395:35;;;;;;;;;;;;;;34318:128;34271:175;34491:2;34458:15;:24;34474:7;34458:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;34529:7;34525:2;34509:28;;34518:5;34509:28;;;;;;;;;;;;34215:330;34145:400;;:::o;60055:33::-;;;;:::o;62003:83::-;7305:13;:11;:13::i;:::-;62072:6:::1;62063;;:15;;;;;;;;;;;;;;;;;;62003:83:::0;:::o;23972:323::-;24033:7;24261:15;:13;:15::i;:::-;24246:12;;24230:13;;:28;:46;24223:53;;23972:323;:::o;38411:2817::-;38545:27;38575;38594:7;38575:18;:27::i;:::-;38545:57;;38660:4;38619:45;;38635:19;38619:45;;;38615:86;;38673:28;;;;;;;;;;;;;;38615:86;38715:27;38744:23;38771:35;38798:7;38771:26;:35::i;:::-;38714:92;;;;38906:68;38931:15;38948:4;38954:19;:17;:19::i;:::-;38906:24;:68::i;:::-;38901:180;;38994:43;39011:4;39017:19;:17;:19::i;:::-;38994:16;:43::i;:::-;38989:92;;39046:35;;;;;;;;;;;;;;38989:92;38901:180;39112:1;39098:16;;:2;:16;;;39094:52;;39123:23;;;;;;;;;;;;;;39094:52;39159:43;39181:4;39187:2;39191:7;39200:1;39159:21;:43::i;:::-;39295:15;39292:160;;;39435:1;39414:19;39407:30;39292:160;39832:18;:24;39851:4;39832:24;;;;;;;;;;;;;;;;39830:26;;;;;;;;;;;;39901:18;:22;39920:2;39901:22;;;;;;;;;;;;;;;;39899:24;;;;;;;;;;;40223:146;40260:2;40309:45;40324:4;40330:2;40334:19;40309:14;:45::i;:::-;20371:8;40281:73;40223:18;:146::i;:::-;40194:17;:26;40212:7;40194:26;;;;;;;;;;;:175;;;;40540:1;20371:8;40489:19;:47;:52;40485:627;;40562:19;40594:1;40584:7;:11;40562:33;;40751:1;40717:17;:30;40735:11;40717:30;;;;;;;;;;;;:35;40713:384;;40855:13;;40840:11;:28;40836:242;;41035:19;41002:17;:30;41020:11;41002:30;;;;;;;;;;;:52;;;;40836:242;40713:384;40543:569;40485:627;41159:7;41155:2;41140:27;;41149:4;41140:27;;;;;;;;;;;;41178:42;41199:4;41205:2;41209:7;41218:1;41178:20;:42::i;:::-;38534:2694;;;38411:2817;;;:::o;62320:218::-;7305:13;:11;:13::i;:::-;1847:1:::1;2445:7;;:19:::0;2437:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;1847:1;2578:7;:18;;;;62384:9:::2;62407:10;62399:24;;62445:21;62399:82;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62383:98;;;62500:4;62492:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;62372:166;1803:1:::1;2757:7;:22;;;;62320:218::o:0;41324:185::-;41462:39;41479:4;41485:2;41489:7;41462:39;;;;;;;;;;;;:16;:39::i;:::-;41324:185;;;:::o;62211:73::-;7305:13;:11;:13::i;:::-;62271:5:::1;62264:4;:12;;;;62211:73:::0;:::o;60118:32::-;;;;:::o;61885:110::-;7305:13;:11;:13::i;:::-;61975:12:::1;61961:11;:26;;;;;;:::i;:::-;;61885:110:::0;:::o;60237:26::-;;;;;;;;;;;;;:::o;29614:152::-;29686:7;29729:27;29748:7;29729:18;:27::i;:::-;29706:52;;29614:152;;;:::o;25156:233::-;25228:7;25269:1;25252:19;;:5;:19;;;25248:60;;25280:28;;;;;;;;;;;;;;25248:60;19315:13;25326:18;:25;25345:5;25326:25;;;;;;;;;;;;;;;;:55;25319:62;;25156:233;;;:::o;8067:103::-;7305:13;:11;:13::i;:::-;8132:30:::1;8159:1;8132:18;:30::i;:::-;8067:103::o:0;7419:87::-;7465:7;7492:6;;;;;;;;;;;7485:13;;7419:87;:::o;28397:104::-;28453:13;28486:7;28479:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28397:104;:::o;60662:953::-;1847:1;2445:7;;:19;2437:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1847:1;2578:7;:18;;;;60741:6:::1;;;;;;;;;;;60740:7;60732:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;60822:9;;60807:11;60791:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;60783:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;60875:11;60889:25;60903:10;60889:13;:25::i;:::-;60875:39;;60959:12;;60944:11;60935:6;:20;;;;:::i;:::-;:36;;60927:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;61026:20;61073:1:::0;61063:6:::1;:11:::0;61059:504:::1;;61123:1;61109:11;:15;;;;:::i;:::-;61091:33;;61161:1;61147:11;:15;61139:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;61239:15;61232:4;;:22;;;;:::i;:::-;61219:9;:35;;61211:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;61059:504;;;61323:11;61305:29;;61371:1;61357:11;:15;61349:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;61443:9;61429:23;;:10;:23;;;61421:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;61518:15;61511:4;;:22;;;;:::i;:::-;61498:9;:35;;61490:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;61059:504;61573:34;61583:10;61595:11;61573:9;:34::i;:::-;60725:890;;1803:1:::0;2757:7;:22;;;;60662:953;:::o;35262:308::-;35373:19;:17;:19::i;:::-;35361:31;;:8;:31;;;35357:61;;35401:17;;;;;;;;;;;;;;35357:61;35483:8;35431:18;:39;35450:19;:17;:19::i;:::-;35431:39;;;;;;;;;;;;;;;:49;35471:8;35431:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;35543:8;35507:55;;35522:19;:17;:19::i;:::-;35507:55;;;35553:8;35507:55;;;;;;:::i;:::-;;;;;;;;35262:308;;:::o;60513:130::-;7305:13;:11;:13::i;:::-;60610:25:::1;60616:8;60626;60610:5;:25::i;:::-;60513:130:::0;;:::o;60177:29::-;;;;:::o;42107:399::-;42274:31;42287:4;42293:2;42297:7;42274:12;:31::i;:::-;42338:1;42320:2;:14;;;:19;42316:183;;42359:56;42390:4;42396:2;42400:7;42409:5;42359:30;:56::i;:::-;42354:145;;42443:40;;;;;;;;;;;;;;42354:145;42316:183;42107:399;;;;:::o;61658:191::-;61724:13;61781:11;61794:26;61811:8;61794:16;:26::i;:::-;61764:66;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61750:81;;61658:191;;;:::o;59978:31::-;;;;:::o;62094:109::-;7305:13;:11;:13::i;:::-;62183:12:::1;62168;:27;;;;62094:109:::0;:::o;35727:164::-;35824:4;35848:18;:25;35867:5;35848:25;;;;;;;;;;;;;;;:35;35874:8;35848:35;;;;;;;;;;;;;;;;;;;;;;;;;35841:42;;35727:164;;;;:::o;8325:201::-;7305:13;:11;:13::i;:::-;8434:1:::1;8414:22;;:8;:22;;::::0;8406:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;8490:28;8509:8;8490:18;:28::i;:::-;8325:201:::0;:::o;36149:282::-;36214:4;36270:7;36251:15;:13;:15::i;:::-;:26;;:66;;;;;36304:13;;36294:7;:23;36251:66;:153;;;;;36403:1;20091:8;36355:17;:26;36373:7;36355:26;;;;;;;;;;;;:44;:49;36251:153;36231:173;;36149:282;;;:::o;57915:105::-;57975:7;58002:10;57995:17;;57915:105;:::o;7584:132::-;7659:12;:10;:12::i;:::-;7648:23;;:7;:5;:7::i;:::-;:23;;;7640:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7584:132::o;60381:101::-;60446:7;60473:1;60466:8;;60381:101;:::o;30769:1275::-;30836:7;30856:12;30871:7;30856:22;;30939:4;30920:15;:13;:15::i;:::-;:23;30916:1061;;30973:13;;30966:4;:20;30962:1015;;;31011:14;31028:17;:23;31046:4;31028:23;;;;;;;;;;;;31011:40;;31145:1;20091:8;31117:6;:24;:29;31113:845;;31782:113;31799:1;31789:6;:11;31782:113;;31842:17;:25;31860:6;;;;;;;31842:25;;;;;;;;;;;;31833:34;;31782:113;;;31928:6;31921:13;;;;;;31113:845;30988:989;30962:1015;30916:1061;32005:31;;;;;;;;;;;;;;30769:1275;;;;:::o;37312:479::-;37414:27;37443:23;37484:38;37525:15;:24;37541:7;37525:24;;;;;;;;;;;37484:65;;37696:18;37673:41;;37753:19;37747:26;37728:45;;37658:126;37312:479;;;:::o;36540:659::-;36689:11;36854:16;36847:5;36843:28;36834:37;;37014:16;37003:9;36999:32;36986:45;;37164:15;37153:9;37150:30;37142:5;37131:9;37128:20;37125:56;37115:66;;36540:659;;;;;:::o;43168:159::-;;;;;:::o;57224:311::-;57359:7;57379:16;20495:3;57405:19;:41;;57379:68;;20495:3;57473:31;57484:4;57490:2;57494:9;57473:10;:31::i;:::-;57465:40;;:62;;57458:69;;;57224:311;;;;;:::o;32592:450::-;32672:14;32840:16;32833:5;32829:28;32820:37;;33017:5;33003:11;32978:23;32974:41;32971:52;32964:5;32961:63;32951:73;;32592:450;;;;:::o;43992:158::-;;;;;:::o;8686:191::-;8760:16;8779:6;;;;;;;;;;;8760:25;;8805:8;8796:6;;:17;;;;;;;;;;;;;;;;;;8860:8;8829:40;;8850:8;8829:40;;;;;;;;;;;;8749:128;8686:191;:::o;25471:178::-;25532:7;19315:13;19453:2;25560:18;:25;25579:5;25560:25;;;;;;;;;;;;;;;;:50;;25559:82;25552:89;;25471:178;;;:::o;51747:112::-;51824:27;51834:2;51838:8;51824:27;;;;;;;;;;;;:9;:27::i;:::-;51747:112;;:::o;45768:2454::-;45841:20;45864:13;;45841:36;;45904:1;45892:8;:13;45888:44;;45914:18;;;;;;;;;;;;;;45888:44;45945:61;45975:1;45979:2;45983:12;45997:8;45945:21;:61::i;:::-;46489:1;19453:2;46459:1;:26;;46458:32;46446:8;:45;46420:18;:22;46439:2;46420:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;46768:139;46805:2;46859:33;46882:1;46886:2;46890:1;46859:14;:33::i;:::-;46826:30;46847:8;46826:20;:30::i;:::-;:66;46768:18;:139::i;:::-;46734:17;:31;46752:12;46734:31;;;;;;;;;;;:173;;;;46924:16;46955:11;46984:8;46969:12;:23;46955:37;;47239:16;47235:2;47231:25;47219:37;;47611:12;47571:8;47530:1;47468:25;47409:1;47348;47321:335;47736:1;47722:12;47718:20;47676:346;47777:3;47768:7;47765:16;47676:346;;47995:7;47985:8;47982:1;47955:25;47952:1;47949;47944:59;47830:1;47821:7;47817:15;47806:26;;47676:346;;;47680:77;48067:1;48055:8;:13;48051:45;;48077:19;;;;;;;;;;;;;;48051:45;48129:3;48113:13;:19;;;;46194:1950;;48154:60;48183:1;48187:2;48191:12;48205:8;48154:20;:60::i;:::-;45830:2392;45768:2454;;:::o;44590:716::-;44753:4;44799:2;44774:45;;;44820:19;:17;:19::i;:::-;44841:4;44847:7;44856:5;44774:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44770:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45074:1;45057:6;:13;:18;45053:235;;45103:40;;;;;;;;;;;;;;45053:235;45246:6;45240:13;45231:6;45227:2;45223:15;45216:38;44770:529;44943:54;;;44933:64;;;:6;:64;;;;44926:71;;;44590:716;;;;;;:::o;3224:723::-;3280:13;3510:1;3501:5;:10;3497:53;;3528:10;;;;;;;;;;;;;;;;;;;;;3497:53;3560:12;3575:5;3560:20;;3591:14;3616:78;3631:1;3623:4;:9;3616:78;;3649:8;;;;;:::i;:::-;;;;3680:2;3672:10;;;;;:::i;:::-;;;3616:78;;;3704:19;3736:6;3726:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3704:39;;3754:154;3770:1;3761:5;:10;3754:154;;3798:1;3788:11;;;;;:::i;:::-;;;3865:2;3857:5;:10;;;;:::i;:::-;3844:2;:24;;;;:::i;:::-;3831:39;;3814:6;3821;3814:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3894:2;3885:11;;;;;:::i;:::-;;;3754:154;;;3932:6;3918:21;;;;;3224:723;;;;:::o;5970:98::-;6023:7;6050:10;6043:17;;5970:98;:::o;56925:147::-;57062:6;56925:147;;;;;:::o;50974:689::-;51105:19;51111:2;51115:8;51105:5;:19::i;:::-;51184:1;51166:2;:14;;;:19;51162:483;;51206:11;51220:13;;51206:27;;51252:13;51274:8;51268:3;:14;51252:30;;51301:233;51332:62;51371:1;51375:2;51379:7;;;;;;51388:5;51332:30;:62::i;:::-;51327:167;;51430:40;;;;;;;;;;;;;;51327:167;51529:3;51521:5;:11;51301:233;;51616:3;51599:13;;:20;51595:34;;51621:8;;;51595:34;51187:458;;51162:483;50974:689;;;:::o;33144:324::-;33214:14;33447:1;33437:8;33434:15;33408:24;33404:46;33394:56;;33144:324;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:116::-;5312:21;5327:5;5312:21;:::i;:::-;5305:5;5302:32;5292:60;;5348:1;5345;5338:12;5292:60;5242:116;:::o;5364:133::-;5407:5;5445:6;5432:20;5423:29;;5461:30;5485:5;5461:30;:::i;:::-;5364:133;;;;:::o;5503:323::-;5559:6;5608:2;5596:9;5587:7;5583:23;5579:32;5576:119;;;5614:79;;:::i;:::-;5576:119;5734:1;5759:50;5801:7;5792:6;5781:9;5777:22;5759:50;:::i;:::-;5749:60;;5705:114;5503:323;;;;:::o;5832:619::-;5909:6;5917;5925;5974:2;5962:9;5953:7;5949:23;5945:32;5942:119;;;5980:79;;:::i;:::-;5942:119;6100:1;6125:53;6170:7;6161:6;6150:9;6146:22;6125:53;:::i;:::-;6115:63;;6071:117;6227:2;6253:53;6298:7;6289:6;6278:9;6274:22;6253:53;:::i;:::-;6243:63;;6198:118;6355:2;6381:53;6426:7;6417:6;6406:9;6402:22;6381:53;:::i;:::-;6371:63;;6326:118;5832:619;;;;;:::o;6457:117::-;6566:1;6563;6556:12;6580:117;6689:1;6686;6679:12;6703:180;6751:77;6748:1;6741:88;6848:4;6845:1;6838:15;6872:4;6869:1;6862:15;6889:281;6972:27;6994:4;6972:27;:::i;:::-;6964:6;6960:40;7102:6;7090:10;7087:22;7066:18;7054:10;7051:34;7048:62;7045:88;;;7113:18;;:::i;:::-;7045:88;7153:10;7149:2;7142:22;6932:238;6889:281;;:::o;7176:129::-;7210:6;7237:20;;:::i;:::-;7227:30;;7266:33;7294:4;7286:6;7266:33;:::i;:::-;7176:129;;;:::o;7311:308::-;7373:4;7463:18;7455:6;7452:30;7449:56;;;7485:18;;:::i;:::-;7449:56;7523:29;7545:6;7523:29;:::i;:::-;7515:37;;7607:4;7601;7597:15;7589:23;;7311:308;;;:::o;7625:146::-;7722:6;7717:3;7712;7699:30;7763:1;7754:6;7749:3;7745:16;7738:27;7625:146;;;:::o;7777:425::-;7855:5;7880:66;7896:49;7938:6;7896:49;:::i;:::-;7880:66;:::i;:::-;7871:75;;7969:6;7962:5;7955:21;8007:4;8000:5;7996:16;8045:3;8036:6;8031:3;8027:16;8024:25;8021:112;;;8052:79;;:::i;:::-;8021:112;8142:54;8189:6;8184:3;8179;8142:54;:::i;:::-;7861:341;7777:425;;;;;:::o;8222:340::-;8278:5;8327:3;8320:4;8312:6;8308:17;8304:27;8294:122;;8335:79;;:::i;:::-;8294:122;8452:6;8439:20;8477:79;8552:3;8544:6;8537:4;8529:6;8525:17;8477:79;:::i;:::-;8468:88;;8284:278;8222:340;;;;:::o;8568:509::-;8637:6;8686:2;8674:9;8665:7;8661:23;8657:32;8654:119;;;8692:79;;:::i;:::-;8654:119;8840:1;8829:9;8825:17;8812:31;8870:18;8862:6;8859:30;8856:117;;;8892:79;;:::i;:::-;8856:117;8997:63;9052:7;9043:6;9032:9;9028:22;8997:63;:::i;:::-;8987:73;;8783:287;8568:509;;;;:::o;9083:329::-;9142:6;9191:2;9179:9;9170:7;9166:23;9162:32;9159:119;;;9197:79;;:::i;:::-;9159:119;9317:1;9342:53;9387:7;9378:6;9367:9;9363:22;9342:53;:::i;:::-;9332:63;;9288:117;9083:329;;;;:::o;9418:468::-;9483:6;9491;9540:2;9528:9;9519:7;9515:23;9511:32;9508:119;;;9546:79;;:::i;:::-;9508:119;9666:1;9691:53;9736:7;9727:6;9716:9;9712:22;9691:53;:::i;:::-;9681:63;;9637:117;9793:2;9819:50;9861:7;9852:6;9841:9;9837:22;9819:50;:::i;:::-;9809:60;;9764:115;9418:468;;;;;:::o;9892:474::-;9960:6;9968;10017:2;10005:9;9996:7;9992:23;9988:32;9985:119;;;10023:79;;:::i;:::-;9985:119;10143:1;10168:53;10213:7;10204:6;10193:9;10189:22;10168:53;:::i;:::-;10158:63;;10114:117;10270:2;10296:53;10341:7;10332:6;10321:9;10317:22;10296:53;:::i;:::-;10286:63;;10241:118;9892:474;;;;;:::o;10372:307::-;10433:4;10523:18;10515:6;10512:30;10509:56;;;10545:18;;:::i;:::-;10509:56;10583:29;10605:6;10583:29;:::i;:::-;10575:37;;10667:4;10661;10657:15;10649:23;;10372:307;;;:::o;10685:423::-;10762:5;10787:65;10803:48;10844:6;10803:48;:::i;:::-;10787:65;:::i;:::-;10778:74;;10875:6;10868:5;10861:21;10913:4;10906:5;10902:16;10951:3;10942:6;10937:3;10933:16;10930:25;10927:112;;;10958:79;;:::i;:::-;10927:112;11048:54;11095:6;11090:3;11085;11048:54;:::i;:::-;10768:340;10685:423;;;;;:::o;11127:338::-;11182:5;11231:3;11224:4;11216:6;11212:17;11208:27;11198:122;;11239:79;;:::i;:::-;11198:122;11356:6;11343:20;11381:78;11455:3;11447:6;11440:4;11432:6;11428:17;11381:78;:::i;:::-;11372:87;;11188:277;11127:338;;;;:::o;11471:943::-;11566:6;11574;11582;11590;11639:3;11627:9;11618:7;11614:23;11610:33;11607:120;;;11646:79;;:::i;:::-;11607:120;11766:1;11791:53;11836:7;11827:6;11816:9;11812:22;11791:53;:::i;:::-;11781:63;;11737:117;11893:2;11919:53;11964:7;11955:6;11944:9;11940:22;11919:53;:::i;:::-;11909:63;;11864:118;12021:2;12047:53;12092:7;12083:6;12072:9;12068:22;12047:53;:::i;:::-;12037:63;;11992:118;12177:2;12166:9;12162:18;12149:32;12208:18;12200:6;12197:30;12194:117;;;12230:79;;:::i;:::-;12194:117;12335:62;12389:7;12380:6;12369:9;12365:22;12335:62;:::i;:::-;12325:72;;12120:287;11471:943;;;;;;;:::o;12420:474::-;12488:6;12496;12545:2;12533:9;12524:7;12520:23;12516:32;12513:119;;;12551:79;;:::i;:::-;12513:119;12671:1;12696:53;12741:7;12732:6;12721:9;12717:22;12696:53;:::i;:::-;12686:63;;12642:117;12798:2;12824:53;12869:7;12860:6;12849:9;12845:22;12824:53;:::i;:::-;12814:63;;12769:118;12420:474;;;;;:::o;12900:180::-;12948:77;12945:1;12938:88;13045:4;13042:1;13035:15;13069:4;13066:1;13059:15;13086:320;13130:6;13167:1;13161:4;13157:12;13147:22;;13214:1;13208:4;13204:12;13235:18;13225:81;;13291:4;13283:6;13279:17;13269:27;;13225:81;13353:2;13345:6;13342:14;13322:18;13319:38;13316:84;;13372:18;;:::i;:::-;13316:84;13137:269;13086:320;;;:::o;13412:181::-;13552:33;13548:1;13540:6;13536:14;13529:57;13412:181;:::o;13599:366::-;13741:3;13762:67;13826:2;13821:3;13762:67;:::i;:::-;13755:74;;13838:93;13927:3;13838:93;:::i;:::-;13956:2;13951:3;13947:12;13940:19;;13599:366;;;:::o;13971:419::-;14137:4;14175:2;14164:9;14160:18;14152:26;;14224:9;14218:4;14214:20;14210:1;14199:9;14195:17;14188:47;14252:131;14378:4;14252:131;:::i;:::-;14244:139;;13971:419;;;:::o;14396:147::-;14497:11;14534:3;14519:18;;14396:147;;;;:::o;14549:114::-;;:::o;14669:398::-;14828:3;14849:83;14930:1;14925:3;14849:83;:::i;:::-;14842:90;;14941:93;15030:3;14941:93;:::i;:::-;15059:1;15054:3;15050:11;15043:18;;14669:398;;;:::o;15073:379::-;15257:3;15279:147;15422:3;15279:147;:::i;:::-;15272:154;;15443:3;15436:10;;15073:379;;;:::o;15458:171::-;15598:23;15594:1;15586:6;15582:14;15575:47;15458:171;:::o;15635:366::-;15777:3;15798:67;15862:2;15857:3;15798:67;:::i;:::-;15791:74;;15874:93;15963:3;15874:93;:::i;:::-;15992:2;15987:3;15983:12;15976:19;;15635:366;;;:::o;16007:419::-;16173:4;16211:2;16200:9;16196:18;16188:26;;16260:9;16254:4;16250:20;16246:1;16235:9;16231:17;16224:47;16288:131;16414:4;16288:131;:::i;:::-;16280:139;;16007:419;;;:::o;16432:141::-;16481:4;16504:3;16496:11;;16527:3;16524:1;16517:14;16561:4;16558:1;16548:18;16540:26;;16432:141;;;:::o;16579:93::-;16616:6;16663:2;16658;16651:5;16647:14;16643:23;16633:33;;16579:93;;;:::o;16678:107::-;16722:8;16772:5;16766:4;16762:16;16741:37;;16678:107;;;;:::o;16791:393::-;16860:6;16910:1;16898:10;16894:18;16933:97;16963:66;16952:9;16933:97;:::i;:::-;17051:39;17081:8;17070:9;17051:39;:::i;:::-;17039:51;;17123:4;17119:9;17112:5;17108:21;17099:30;;17172:4;17162:8;17158:19;17151:5;17148:30;17138:40;;16867:317;;16791:393;;;;;:::o;17190:60::-;17218:3;17239:5;17232:12;;17190:60;;;:::o;17256:142::-;17306:9;17339:53;17357:34;17366:24;17384:5;17366:24;:::i;:::-;17357:34;:::i;:::-;17339:53;:::i;:::-;17326:66;;17256:142;;;:::o;17404:75::-;17447:3;17468:5;17461:12;;17404:75;;;:::o;17485:269::-;17595:39;17626:7;17595:39;:::i;:::-;17656:91;17705:41;17729:16;17705:41;:::i;:::-;17697:6;17690:4;17684:11;17656:91;:::i;:::-;17650:4;17643:105;17561:193;17485:269;;;:::o;17760:73::-;17805:3;17760:73;:::o;17839:189::-;17916:32;;:::i;:::-;17957:65;18015:6;18007;18001:4;17957:65;:::i;:::-;17892:136;17839:189;;:::o;18034:186::-;18094:120;18111:3;18104:5;18101:14;18094:120;;;18165:39;18202:1;18195:5;18165:39;:::i;:::-;18138:1;18131:5;18127:13;18118:22;;18094:120;;;18034:186;;:::o;18226:543::-;18327:2;18322:3;18319:11;18316:446;;;18361:38;18393:5;18361:38;:::i;:::-;18445:29;18463:10;18445:29;:::i;:::-;18435:8;18431:44;18628:2;18616:10;18613:18;18610:49;;;18649:8;18634:23;;18610:49;18672:80;18728:22;18746:3;18728:22;:::i;:::-;18718:8;18714:37;18701:11;18672:80;:::i;:::-;18331:431;;18316:446;18226:543;;;:::o;18775:117::-;18829:8;18879:5;18873:4;18869:16;18848:37;;18775:117;;;;:::o;18898:169::-;18942:6;18975:51;19023:1;19019:6;19011:5;19008:1;19004:13;18975:51;:::i;:::-;18971:56;19056:4;19050;19046:15;19036:25;;18949:118;18898:169;;;;:::o;19072:295::-;19148:4;19294:29;19319:3;19313:4;19294:29;:::i;:::-;19286:37;;19356:3;19353:1;19349:11;19343:4;19340:21;19332:29;;19072:295;;;;:::o;19372:1395::-;19489:37;19522:3;19489:37;:::i;:::-;19591:18;19583:6;19580:30;19577:56;;;19613:18;;:::i;:::-;19577:56;19657:38;19689:4;19683:11;19657:38;:::i;:::-;19742:67;19802:6;19794;19788:4;19742:67;:::i;:::-;19836:1;19860:4;19847:17;;19892:2;19884:6;19881:14;19909:1;19904:618;;;;20566:1;20583:6;20580:77;;;20632:9;20627:3;20623:19;20617:26;20608:35;;20580:77;20683:67;20743:6;20736:5;20683:67;:::i;:::-;20677:4;20670:81;20539:222;19874:887;;19904:618;19956:4;19952:9;19944:6;19940:22;19990:37;20022:4;19990:37;:::i;:::-;20049:1;20063:208;20077:7;20074:1;20071:14;20063:208;;;20156:9;20151:3;20147:19;20141:26;20133:6;20126:42;20207:1;20199:6;20195:14;20185:24;;20254:2;20243:9;20239:18;20226:31;;20100:4;20097:1;20093:12;20088:17;;20063:208;;;20299:6;20290:7;20287:19;20284:179;;;20357:9;20352:3;20348:19;20342:26;20400:48;20442:4;20434:6;20430:17;20419:9;20400:48;:::i;:::-;20392:6;20385:64;20307:156;20284:179;20509:1;20505;20497:6;20493:14;20489:22;20483:4;20476:36;19911:611;;;19874:887;;19464:1303;;;19372:1395;;:::o;20773:168::-;20913:20;20909:1;20901:6;20897:14;20890:44;20773:168;:::o;20947:366::-;21089:3;21110:67;21174:2;21169:3;21110:67;:::i;:::-;21103:74;;21186:93;21275:3;21186:93;:::i;:::-;21304:2;21299:3;21295:12;21288:19;;20947:366;;;:::o;21319:419::-;21485:4;21523:2;21512:9;21508:18;21500:26;;21572:9;21566:4;21562:20;21558:1;21547:9;21543:17;21536:47;21600:131;21726:4;21600:131;:::i;:::-;21592:139;;21319:419;;;:::o;21744:180::-;21792:77;21789:1;21782:88;21889:4;21886:1;21879:15;21913:4;21910:1;21903:15;21930:191;21970:3;21989:20;22007:1;21989:20;:::i;:::-;21984:25;;22023:20;22041:1;22023:20;:::i;:::-;22018:25;;22066:1;22063;22059:9;22052:16;;22087:3;22084:1;22081:10;22078:36;;;22094:18;;:::i;:::-;22078:36;21930:191;;;;:::o;22127:178::-;22267:30;22263:1;22255:6;22251:14;22244:54;22127:178;:::o;22311:366::-;22453:3;22474:67;22538:2;22533:3;22474:67;:::i;:::-;22467:74;;22550:93;22639:3;22550:93;:::i;:::-;22668:2;22663:3;22659:12;22652:19;;22311:366;;;:::o;22683:419::-;22849:4;22887:2;22876:9;22872:18;22864:26;;22936:9;22930:4;22926:20;22922:1;22911:9;22907:17;22900:47;22964:131;23090:4;22964:131;:::i;:::-;22956:139;;22683:419;;;:::o;23108:224::-;23248:34;23244:1;23236:6;23232:14;23225:58;23317:7;23312:2;23304:6;23300:15;23293:32;23108:224;:::o;23338:366::-;23480:3;23501:67;23565:2;23560:3;23501:67;:::i;:::-;23494:74;;23577:93;23666:3;23577:93;:::i;:::-;23695:2;23690:3;23686:12;23679:19;;23338:366;;;:::o;23710:419::-;23876:4;23914:2;23903:9;23899:18;23891:26;;23963:9;23957:4;23953:20;23949:1;23938:9;23934:17;23927:47;23991:131;24117:4;23991:131;:::i;:::-;23983:139;;23710:419;;;:::o;24135:194::-;24175:4;24195:20;24213:1;24195:20;:::i;:::-;24190:25;;24229:20;24247:1;24229:20;:::i;:::-;24224:25;;24273:1;24270;24266:9;24258:17;;24297:1;24291:4;24288:11;24285:37;;;24302:18;;:::i;:::-;24285:37;24135:194;;;;:::o;24335:179::-;24475:31;24471:1;24463:6;24459:14;24452:55;24335:179;:::o;24520:366::-;24662:3;24683:67;24747:2;24742:3;24683:67;:::i;:::-;24676:74;;24759:93;24848:3;24759:93;:::i;:::-;24877:2;24872:3;24868:12;24861:19;;24520:366;;;:::o;24892:419::-;25058:4;25096:2;25085:9;25081:18;25073:26;;25145:9;25139:4;25135:20;25131:1;25120:9;25116:17;25109:47;25173:131;25299:4;25173:131;:::i;:::-;25165:139;;24892:419;;;:::o;25317:410::-;25357:7;25380:20;25398:1;25380:20;:::i;:::-;25375:25;;25414:20;25432:1;25414:20;:::i;:::-;25409:25;;25469:1;25466;25462:9;25491:30;25509:11;25491:30;:::i;:::-;25480:41;;25670:1;25661:7;25657:15;25654:1;25651:22;25631:1;25624:9;25604:83;25581:139;;25700:18;;:::i;:::-;25581:139;25365:362;25317:410;;;;:::o;25733:163::-;25873:15;25869:1;25861:6;25857:14;25850:39;25733:163;:::o;25902:366::-;26044:3;26065:67;26129:2;26124:3;26065:67;:::i;:::-;26058:74;;26141:93;26230:3;26141:93;:::i;:::-;26259:2;26254:3;26250:12;26243:19;;25902:366;;;:::o;26274:419::-;26440:4;26478:2;26467:9;26463:18;26455:26;;26527:9;26521:4;26517:20;26513:1;26502:9;26498:17;26491:47;26555:131;26681:4;26555:131;:::i;:::-;26547:139;;26274:419;;;:::o;26699:168::-;26839:20;26835:1;26827:6;26823:14;26816:44;26699:168;:::o;26873:366::-;27015:3;27036:67;27100:2;27095:3;27036:67;:::i;:::-;27029:74;;27112:93;27201:3;27112:93;:::i;:::-;27230:2;27225:3;27221:12;27214:19;;26873:366;;;:::o;27245:419::-;27411:4;27449:2;27438:9;27434:18;27426:26;;27498:9;27492:4;27488:20;27484:1;27473:9;27469:17;27462:47;27526:131;27652:4;27526:131;:::i;:::-;27518:139;;27245:419;;;:::o;27670:148::-;27772:11;27809:3;27794:18;;27670:148;;;;:::o;27848:874::-;27951:3;27988:5;27982:12;28017:36;28043:9;28017:36;:::i;:::-;28069:89;28151:6;28146:3;28069:89;:::i;:::-;28062:96;;28189:1;28178:9;28174:17;28205:1;28200:166;;;;28380:1;28375:341;;;;28167:549;;28200:166;28284:4;28280:9;28269;28265:25;28260:3;28253:38;28346:6;28339:14;28332:22;28324:6;28320:35;28315:3;28311:45;28304:52;;28200:166;;28375:341;28442:38;28474:5;28442:38;:::i;:::-;28502:1;28516:154;28530:6;28527:1;28524:13;28516:154;;;28604:7;28598:14;28594:1;28589:3;28585:11;28578:35;28654:1;28645:7;28641:15;28630:26;;28552:4;28549:1;28545:12;28540:17;;28516:154;;;28699:6;28694:3;28690:16;28683:23;;28382:334;;28167:549;;27955:767;;27848:874;;;;:::o;28728:390::-;28834:3;28862:39;28895:5;28862:39;:::i;:::-;28917:89;28999:6;28994:3;28917:89;:::i;:::-;28910:96;;29015:65;29073:6;29068:3;29061:4;29054:5;29050:16;29015:65;:::i;:::-;29105:6;29100:3;29096:16;29089:23;;28838:280;28728:390;;;;:::o;29124:155::-;29264:7;29260:1;29252:6;29248:14;29241:31;29124:155;:::o;29285:400::-;29445:3;29466:84;29548:1;29543:3;29466:84;:::i;:::-;29459:91;;29559:93;29648:3;29559:93;:::i;:::-;29677:1;29672:3;29668:11;29661:18;;29285:400;;;:::o;29691:695::-;29969:3;29991:92;30079:3;30070:6;29991:92;:::i;:::-;29984:99;;30100:95;30191:3;30182:6;30100:95;:::i;:::-;30093:102;;30212:148;30356:3;30212:148;:::i;:::-;30205:155;;30377:3;30370:10;;29691:695;;;;;:::o;30392:225::-;30532:34;30528:1;30520:6;30516:14;30509:58;30601:8;30596:2;30588:6;30584:15;30577:33;30392:225;:::o;30623:366::-;30765:3;30786:67;30850:2;30845:3;30786:67;:::i;:::-;30779:74;;30862:93;30951:3;30862:93;:::i;:::-;30980:2;30975:3;30971:12;30964:19;;30623:366;;;:::o;30995:419::-;31161:4;31199:2;31188:9;31184:18;31176:26;;31248:9;31242:4;31238:20;31234:1;31223:9;31219:17;31212:47;31276:131;31402:4;31276:131;:::i;:::-;31268:139;;30995:419;;;:::o;31420:182::-;31560:34;31556:1;31548:6;31544:14;31537:58;31420:182;:::o;31608:366::-;31750:3;31771:67;31835:2;31830:3;31771:67;:::i;:::-;31764:74;;31847:93;31936:3;31847:93;:::i;:::-;31965:2;31960:3;31956:12;31949:19;;31608:366;;;:::o;31980:419::-;32146:4;32184:2;32173:9;32169:18;32161:26;;32233:9;32227:4;32223:20;32219:1;32208:9;32204:17;32197:47;32261:131;32387:4;32261:131;:::i;:::-;32253:139;;31980:419;;;:::o;32405:98::-;32456:6;32490:5;32484:12;32474:22;;32405:98;;;:::o;32509:168::-;32592:11;32626:6;32621:3;32614:19;32666:4;32661:3;32657:14;32642:29;;32509:168;;;;:::o;32683:373::-;32769:3;32797:38;32829:5;32797:38;:::i;:::-;32851:70;32914:6;32909:3;32851:70;:::i;:::-;32844:77;;32930:65;32988:6;32983:3;32976:4;32969:5;32965:16;32930:65;:::i;:::-;33020:29;33042:6;33020:29;:::i;:::-;33015:3;33011:39;33004:46;;32773:283;32683:373;;;;:::o;33062:640::-;33257:4;33295:3;33284:9;33280:19;33272:27;;33309:71;33377:1;33366:9;33362:17;33353:6;33309:71;:::i;:::-;33390:72;33458:2;33447:9;33443:18;33434:6;33390:72;:::i;:::-;33472;33540:2;33529:9;33525:18;33516:6;33472:72;:::i;:::-;33591:9;33585:4;33581:20;33576:2;33565:9;33561:18;33554:48;33619:76;33690:4;33681:6;33619:76;:::i;:::-;33611:84;;33062:640;;;;;;;:::o;33708:141::-;33764:5;33795:6;33789:13;33780:22;;33811:32;33837:5;33811:32;:::i;:::-;33708:141;;;;:::o;33855:349::-;33924:6;33973:2;33961:9;33952:7;33948:23;33944:32;33941:119;;;33979:79;;:::i;:::-;33941:119;34099:1;34124:63;34179:7;34170:6;34159:9;34155:22;34124:63;:::i;:::-;34114:73;;34070:127;33855:349;;;;:::o;34210:233::-;34249:3;34272:24;34290:5;34272:24;:::i;:::-;34263:33;;34318:66;34311:5;34308:77;34305:103;;34388:18;;:::i;:::-;34305:103;34435:1;34428:5;34424:13;34417:20;;34210:233;;;:::o;34449:180::-;34497:77;34494:1;34487:88;34594:4;34591:1;34584:15;34618:4;34615:1;34608:15;34635:185;34675:1;34692:20;34710:1;34692:20;:::i;:::-;34687:25;;34726:20;34744:1;34726:20;:::i;:::-;34721:25;;34765:1;34755:35;;34770:18;;:::i;:::-;34755:35;34812:1;34809;34805:9;34800:14;;34635:185;;;;:::o;34826:176::-;34858:1;34875:20;34893:1;34875:20;:::i;:::-;34870:25;;34909:20;34927:1;34909:20;:::i;:::-;34904:25;;34948:1;34938:35;;34953:18;;:::i;:::-;34938:35;34994:1;34991;34987:9;34982:14;;34826:176;;;;:::o;35008:180::-;35056:77;35053:1;35046:88;35153:4;35150:1;35143:15;35177:4;35174:1;35167:15
Swarm Source
ipfs://9c809997b6a775e3db112770537a63f1eef3738d40927bcc9479b5e6b82d3b49
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.