ERC-721
Overview
Max Total Supply
244 PP
Holders
93
Total Transfers
-
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
PetPerson
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-08 */ // 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.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ 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(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`. uint24 extraData; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // IERC165 // ============================== /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================== // 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`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev 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 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.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, * including the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at `_startTokenId()` * (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // 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 tokenId of the next token 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 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @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 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 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 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 returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ 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: 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. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view 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 { 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; } /** * 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 ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * 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); } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @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 See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _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 ''; } /** * @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)) } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _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 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 { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` 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 tokenId = startTokenId; uint256 end = startTokenId + quantity; do { emit Transfer(address(0), to, tokenId++); } while (tokenId < end); _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 { 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 Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { // Compute the slot. mstore(0x00, tokenId) mstore(0x20, tokenApprovalsPtr.slot) approvedAddressSlot := keccak256(0x00, 0x40) // Load the slot's value from storage. approvedAddress := sload(approvedAddressSlot) } } /** * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`. */ function _isOwnerOrApproved( address approvedAddress, address from, address msgSender ) private pure returns (bool result) { assembly { // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean. from := and(from, BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, BITMASK_ADDRESS) // `msgSender == from || msgSender == approvedAddress`. result := or(eq(msgSender, from), eq(msgSender, approvedAddress)) } } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function 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) = _getApprovedAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(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 `_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) = _getApprovedAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(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++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try 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)) } } } } /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal { 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 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; } /** * @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 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 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 returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 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: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File: contracts/SampleERC721.sol pragma solidity ^0.8.7; contract PetPerson is ERC721A, Ownable { uint public constant maxFree = 1; uint256 public constant maxFreeMintNum = 2000; uint public constant maxTrx = 5; uint public supply = 7777; uint public price = 0.005 ether; uint public alrFreeTotal = 0; string public baseURI = "https://bafybeiajawr3w3dmnb5arayjbhh5ogttjt6qnzhky5hndmjgsgdtr5oi64.ipfs.nftstorage.link/"; string public constant baseExtension = ".json"; bool public paused = false; bool public _live = false; constructor() ERC721A("PetPerson", "PP") {} function goMint(uint256 _amount) external payable { address _caller = _msgSender(); require(!paused, "Paused"); require(_live, "Not live!"); require(supply >= totalSupply() + _amount, "Exceeds max supply"); require(_amount > 0, "No 0 mints"); require(tx.origin == _caller, "No contracts"); require(maxTrx >= _amount , "Excess max per paid tx"); if(_numberMinted(msg.sender) >= maxFree) { require(msg.value >= _amount * price, "Invalid funds provided"); } else{ uint count = _numberMinted(msg.sender) + _amount; if(count > maxFree){ require(msg.value >= (count - maxFree) * price , "Insufficient funds"); } } if(_numberMinted(msg.sender) == 0) { if(alrFreeTotal < maxFreeMintNum){ alrFreeTotal++; }else{ if(msg.value < _amount * price){ require( msg.value >= _amount * price, "Mint would exceed max supply of free mints" ); } } } _safeMint(_caller, _amount); } function withdraw() external onlyOwner { uint256 balance = address(this).balance; (bool success, ) = _msgSender().call{value: balance}(""); require(success, "Failed to send"); } function _startTokenId() internal view virtual override returns (uint256) { return 1; } function initialize() external onlyOwner { _safeMint(_msgSender(), 10); } function reduceSupply(uint newSupply) external onlyOwner { supply = newSupply; } function pause(bool _state) external onlyOwner { paused = _state; } function setBaseURI(string memory baseURI_) external onlyOwner { baseURI = baseURI_; } function live(bool _state) external onlyOwner { _live = _state; } function setCost(uint256 newPrice) external onlyOwner { price = newPrice; } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function tokenURI(uint256 _tokenId) public view override returns (string memory) { require(_exists(_tokenId), "Token does not exist."); return bytes(baseURI).length > 0 ? string( abi.encodePacked( baseURI, Strings.toString(_tokenId), // _tokenId.toString(), baseExtension ) ) : ""; } }
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":[],"name":"_live","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"alrFreeTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"goMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"live","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeMintNum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTrx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSupply","type":"uint256"}],"name":"reduceSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052611e616009556611c37937e08000600a556000600b55604051806080016040528060598152602001620038ad60599139600c90805190602001906200004b92919062000243565b506000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff0219169083151502179055503480156200008f57600080fd5b506040518060400160405280600981526020017f506574506572736f6e00000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f505000000000000000000000000000000000000000000000000000000000000081525081600290805190602001906200011492919062000243565b5080600390805190602001906200012d92919062000243565b506200013e6200016c60201b60201c565b6000819055505050620001666200015a6200017560201b60201c565b6200017d60201b60201c565b62000358565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200025190620002f3565b90600052602060002090601f016020900481019282620002755760008555620002c1565b82601f106200029057805160ff1916838001178555620002c1565b82800160010185558215620002c1579182015b82811115620002c0578251825591602001919060010190620002a3565b5b509050620002d09190620002d4565b5090565b5b80821115620002ef576000816000905550600101620002d5565b5090565b600060028204905060018216806200030c57607f821691505b6020821081141562000323576200032262000329565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61354580620003686000396000f3fe60806040526004361061020f5760003560e01c80636b13c07511610118578063a035b1fe116100a0578063c87b56dd1161006f578063c87b56dd14610741578063dc33e6811461077e578063e985e9c5146107bb578063f1ee997b146107f8578063f2fde38b146108145761020f565b8063a035b1fe14610699578063a22cb465146106c4578063b88d4fde146106ed578063c6682862146107165761020f565b80637b460aac116100e75780637b460aac146105d857806380623444146106035780638129fc1c1461062c5780638da5cb5b1461064357806395d89b411461066e5761020f565b80636b13c0751461052e5780636c0360eb1461055957806370a0823114610584578063715018a6146105c15761020f565b806342842e0e1161019b57806356e0ec721161016a57806356e0ec72146104475780635c6e7f60146104725780635c975abb1461049b5780636352211e146104c657806369e5d620146105035761020f565b806342842e0e146103a157806344a0d68a146103ca578063485a68a3146103f357806355f804b31461041e5761020f565b8063081812fc116101e2578063081812fc146102d0578063095ea7b31461030d57806318160ddd1461033657806323b872dd146103615780633ccfd60b1461038a5761020f565b806301ffc9a71461021457806302329a2914610251578063047fc9aa1461027a57806306fdde03146102a5575b600080fd5b34801561022057600080fd5b5061023b600480360381019061023691906126ff565b61083d565b6040516102489190612bb5565b60405180910390f35b34801561025d57600080fd5b50610278600480360381019061027391906126d2565b6108cf565b005b34801561028657600080fd5b5061028f6108f4565b60405161029c9190612d92565b60405180910390f35b3480156102b157600080fd5b506102ba6108fa565b6040516102c79190612bd0565b60405180910390f35b3480156102dc57600080fd5b506102f760048036038101906102f291906127a2565b61098c565b6040516103049190612b4e565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f9190612692565b610a08565b005b34801561034257600080fd5b5061034b610b49565b6040516103589190612d92565b60405180910390f35b34801561036d57600080fd5b506103886004803603810190610383919061257c565b610b60565b005b34801561039657600080fd5b5061039f610e85565b005b3480156103ad57600080fd5b506103c860048036038101906103c3919061257c565b610f49565b005b3480156103d657600080fd5b506103f160048036038101906103ec91906127a2565b610f69565b005b3480156103ff57600080fd5b50610408610f7b565b6040516104159190612d92565b60405180910390f35b34801561042a57600080fd5b5061044560048036038101906104409190612759565b610f80565b005b34801561045357600080fd5b5061045c610fa2565b6040516104699190612bb5565b60405180910390f35b34801561047e57600080fd5b50610499600480360381019061049491906126d2565b610fb5565b005b3480156104a757600080fd5b506104b0610fda565b6040516104bd9190612bb5565b60405180910390f35b3480156104d257600080fd5b506104ed60048036038101906104e891906127a2565b610fed565b6040516104fa9190612b4e565b60405180910390f35b34801561050f57600080fd5b50610518610fff565b6040516105259190612d92565b60405180910390f35b34801561053a57600080fd5b50610543611005565b6040516105509190612d92565b60405180910390f35b34801561056557600080fd5b5061056e61100a565b60405161057b9190612bd0565b60405180910390f35b34801561059057600080fd5b506105ab60048036038101906105a6919061250f565b611098565b6040516105b89190612d92565b60405180910390f35b3480156105cd57600080fd5b506105d6611151565b005b3480156105e457600080fd5b506105ed611165565b6040516105fa9190612d92565b60405180910390f35b34801561060f57600080fd5b5061062a600480360381019061062591906127a2565b61116b565b005b34801561063857600080fd5b5061064161117d565b005b34801561064f57600080fd5b50610658611199565b6040516106659190612b4e565b60405180910390f35b34801561067a57600080fd5b506106836111c3565b6040516106909190612bd0565b60405180910390f35b3480156106a557600080fd5b506106ae611255565b6040516106bb9190612d92565b60405180910390f35b3480156106d057600080fd5b506106eb60048036038101906106e69190612652565b61125b565b005b3480156106f957600080fd5b50610714600480360381019061070f91906125cf565b6113d3565b005b34801561072257600080fd5b5061072b611446565b6040516107389190612bd0565b60405180910390f35b34801561074d57600080fd5b50610768600480360381019061076391906127a2565b61147f565b6040516107759190612bd0565b60405180910390f35b34801561078a57600080fd5b506107a560048036038101906107a0919061250f565b61155e565b6040516107b29190612d92565b60405180910390f35b3480156107c757600080fd5b506107e260048036038101906107dd919061253c565b611570565b6040516107ef9190612bb5565b60405180910390f35b610812600480360381019061080d91906127a2565b611604565b005b34801561082057600080fd5b5061083b6004803603810190610836919061250f565b611990565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061089857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108c85750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6108d7611a14565b80600d60006101000a81548160ff02191690831515021790555050565b60095481565b60606002805461090990613062565b80601f016020809104026020016040519081016040528092919081815260200182805461093590613062565b80156109825780601f1061095757610100808354040283529160200191610982565b820191906000526020600020905b81548152906001019060200180831161096557829003601f168201915b5050505050905090565b600061099782611a92565b6109cd576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a1382610fed565b90508073ffffffffffffffffffffffffffffffffffffffff16610a34611af1565b73ffffffffffffffffffffffffffffffffffffffff1614610a9757610a6081610a5b611af1565b611570565b610a96576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610b53611af9565b6001546000540303905090565b6000610b6b82611b02565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610bd2576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610bde84611bd0565b91509150610bf48187610bef611af1565b611bf2565b610c4057610c0986610c04611af1565b611570565b610c3f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610ca7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cb48686866001611c36565b8015610cbf57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610d8d85610d69888887611c3c565b7c020000000000000000000000000000000000000000000000000000000017611c64565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610e15576000600185019050600060046000838152602001908152602001600020541415610e13576000548114610e12578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610e7d8686866001611c8f565b505050505050565b610e8d611a14565b60004790506000610e9c611c95565b73ffffffffffffffffffffffffffffffffffffffff1682604051610ebf90612b39565b60006040518083038185875af1925050503d8060008114610efc576040519150601f19603f3d011682016040523d82523d6000602084013e610f01565b606091505b5050905080610f45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3c90612d32565b60405180910390fd5b5050565b610f64838383604051806020016040528060008152506113d3565b505050565b610f71611a14565b80600a8190555050565b600181565b610f88611a14565b80600c9080519060200190610f9e929190612323565b5050565b600d60019054906101000a900460ff1681565b610fbd611a14565b80600d60016101000a81548160ff02191690831515021790555050565b600d60009054906101000a900460ff1681565b6000610ff882611b02565b9050919050565b600b5481565b600581565b600c805461101790613062565b80601f016020809104026020016040519081016040528092919081815260200182805461104390613062565b80156110905780601f1061106557610100808354040283529160200191611090565b820191906000526020600020905b81548152906001019060200180831161107357829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611100576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611159611a14565b6111636000611c9d565b565b6107d081565b611173611a14565b8060098190555050565b611185611a14565b611197611190611c95565b600a611d63565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546111d290613062565b80601f01602080910402602001604051908101604052809291908181526020018280546111fe90613062565b801561124b5780601f106112205761010080835404028352916020019161124b565b820191906000526020600020905b81548152906001019060200180831161122e57829003601f168201915b5050505050905090565b600a5481565b611263611af1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112c8576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006112d5611af1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611382611af1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113c79190612bb5565b60405180910390a35050565b6113de848484610b60565b60008373ffffffffffffffffffffffffffffffffffffffff163b146114405761140984848484611d81565b61143f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525081565b606061148a82611a92565b6114c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c090612cd2565b60405180910390fd5b6000600c80546114d890613062565b9050116114f45760405180602001604052806000815250611557565b600c6114ff83611ee1565b6040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060405160200161154793929190612b08565b6040516020818303038152906040525b9050919050565b600061156982612042565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600061160e611c95565b9050600d60009054906101000a900460ff1615611660576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165790612bf2565b60405180910390fd5b600d60019054906101000a900460ff166116af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a690612d72565b60405180910390fd5b816116b8610b49565b6116c29190612e97565b6009541015611706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fd90612cb2565b60405180910390fd5b60008211611749576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174090612c52565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146117b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ae90612d52565b60405180910390fd5b81600510156117fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f290612c72565b60405180910390fd5b600161180633612042565b1061186057600a54826118199190612f1e565b34101561185b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185290612d12565b60405180910390fd5b6118e0565b60008261186c33612042565b6118769190612e97565b905060018111156118de57600a546001826118919190612f78565b61189b9190612f1e565b3410156118dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d490612c92565b60405180910390fd5b5b505b60006118eb33612042565b1415611982576107d0600b54101561191a57600b6000815480929190611910906130c5565b9190505550611981565b600a54826119289190612f1e565b34101561198057600a548261193d9190612f1e565b34101561197f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197690612c12565b60405180910390fd5b5b5b5b61198c8183611d63565b5050565b611998611a14565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ff90612c32565b60405180910390fd5b611a1181611c9d565b50565b611a1c611c95565b73ffffffffffffffffffffffffffffffffffffffff16611a3a611199565b73ffffffffffffffffffffffffffffffffffffffff1614611a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8790612cf2565b60405180910390fd5b565b600081611a9d611af9565b11158015611aac575060005482105b8015611aea575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080611b11611af9565b11611b9957600054811015611b985760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611b96575b6000811415611b8c576004600083600190039350838152602001908152602001600020549050611b61565b8092505050611bcb565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611c53868684612099565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611d7d8282604051806020016040528060008152506120a2565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611da7611af1565b8786866040518563ffffffff1660e01b8152600401611dc99493929190612b69565b602060405180830381600087803b158015611de357600080fd5b505af1925050508015611e1457506040513d601f19601f82011682018060405250810190611e11919061272c565b60015b611e8e573d8060008114611e44576040519150601f19603f3d011682016040523d82523d6000602084013e611e49565b606091505b50600081511415611e86576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415611f29576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061203d565b600082905060005b60008214611f5b578080611f44906130c5565b915050600a82611f549190612eed565b9150611f31565b60008167ffffffffffffffff811115611f7757611f766131fb565b5b6040519080825280601f01601f191660200182016040528015611fa95781602001600182028036833780820191505090505b5090505b6000851461203657600182611fc29190612f78565b9150600a85611fd1919061310e565b6030611fdd9190612e97565b60f81b818381518110611ff357611ff26131cc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561202f9190612eed565b9450611fad565b8093505050505b919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60009392505050565b6120ac838361213f565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461213a57600080549050600083820390505b6120ec6000868380600101945086611d81565b612122576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106120d957816000541461213757600080fd5b50505b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121ac576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008214156121e7576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121f46000848385611c36565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061226b8361225c6000866000611c3c565b61226585612313565b17611c64565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061228f5780600081905550505061230e6000848385611c8f565b505050565b60006001821460e11b9050919050565b82805461232f90613062565b90600052602060002090601f0160209004810192826123515760008555612398565b82601f1061236a57805160ff1916838001178555612398565b82800160010185558215612398579182015b8281111561239757825182559160200191906001019061237c565b5b5090506123a591906123a9565b5090565b5b808211156123c25760008160009055506001016123aa565b5090565b60006123d96123d484612dd2565b612dad565b9050828152602081018484840111156123f5576123f461322f565b5b612400848285613020565b509392505050565b600061241b61241684612e03565b612dad565b9050828152602081018484840111156124375761243661322f565b5b612442848285613020565b509392505050565b600081359050612459816134b3565b92915050565b60008135905061246e816134ca565b92915050565b600081359050612483816134e1565b92915050565b600081519050612498816134e1565b92915050565b600082601f8301126124b3576124b261322a565b5b81356124c38482602086016123c6565b91505092915050565b600082601f8301126124e1576124e061322a565b5b81356124f1848260208601612408565b91505092915050565b600081359050612509816134f8565b92915050565b60006020828403121561252557612524613239565b5b60006125338482850161244a565b91505092915050565b6000806040838503121561255357612552613239565b5b60006125618582860161244a565b92505060206125728582860161244a565b9150509250929050565b60008060006060848603121561259557612594613239565b5b60006125a38682870161244a565b93505060206125b48682870161244a565b92505060406125c5868287016124fa565b9150509250925092565b600080600080608085870312156125e9576125e8613239565b5b60006125f78782880161244a565b94505060206126088782880161244a565b9350506040612619878288016124fa565b925050606085013567ffffffffffffffff81111561263a57612639613234565b5b6126468782880161249e565b91505092959194509250565b6000806040838503121561266957612668613239565b5b60006126778582860161244a565b92505060206126888582860161245f565b9150509250929050565b600080604083850312156126a9576126a8613239565b5b60006126b78582860161244a565b92505060206126c8858286016124fa565b9150509250929050565b6000602082840312156126e8576126e7613239565b5b60006126f68482850161245f565b91505092915050565b60006020828403121561271557612714613239565b5b600061272384828501612474565b91505092915050565b60006020828403121561274257612741613239565b5b600061275084828501612489565b91505092915050565b60006020828403121561276f5761276e613239565b5b600082013567ffffffffffffffff81111561278d5761278c613234565b5b612799848285016124cc565b91505092915050565b6000602082840312156127b8576127b7613239565b5b60006127c6848285016124fa565b91505092915050565b6127d881612fac565b82525050565b6127e781612fbe565b82525050565b60006127f882612e49565b6128028185612e5f565b935061281281856020860161302f565b61281b8161323e565b840191505092915050565b600061283182612e54565b61283b8185612e7b565b935061284b81856020860161302f565b6128548161323e565b840191505092915050565b600061286a82612e54565b6128748185612e8c565b935061288481856020860161302f565b80840191505092915050565b6000815461289d81613062565b6128a78186612e8c565b945060018216600081146128c257600181146128d357612906565b60ff19831686528186019350612906565b6128dc85612e34565b60005b838110156128fe578154818901526001820191506020810190506128df565b838801955050505b50505092915050565b600061291c600683612e7b565b91506129278261324f565b602082019050919050565b600061293f602a83612e7b565b915061294a82613278565b604082019050919050565b6000612962602683612e7b565b915061296d826132c7565b604082019050919050565b6000612985600a83612e7b565b915061299082613316565b602082019050919050565b60006129a8601683612e7b565b91506129b38261333f565b602082019050919050565b60006129cb601283612e7b565b91506129d682613368565b602082019050919050565b60006129ee601283612e7b565b91506129f982613391565b602082019050919050565b6000612a11601583612e7b565b9150612a1c826133ba565b602082019050919050565b6000612a34602083612e7b565b9150612a3f826133e3565b602082019050919050565b6000612a57601683612e7b565b9150612a628261340c565b602082019050919050565b6000612a7a600083612e70565b9150612a8582613435565b600082019050919050565b6000612a9d600e83612e7b565b9150612aa882613438565b602082019050919050565b6000612ac0600c83612e7b565b9150612acb82613461565b602082019050919050565b6000612ae3600983612e7b565b9150612aee8261348a565b602082019050919050565b612b0281613016565b82525050565b6000612b148286612890565b9150612b20828561285f565b9150612b2c828461285f565b9150819050949350505050565b6000612b4482612a6d565b9150819050919050565b6000602082019050612b6360008301846127cf565b92915050565b6000608082019050612b7e60008301876127cf565b612b8b60208301866127cf565b612b986040830185612af9565b8181036060830152612baa81846127ed565b905095945050505050565b6000602082019050612bca60008301846127de565b92915050565b60006020820190508181036000830152612bea8184612826565b905092915050565b60006020820190508181036000830152612c0b8161290f565b9050919050565b60006020820190508181036000830152612c2b81612932565b9050919050565b60006020820190508181036000830152612c4b81612955565b9050919050565b60006020820190508181036000830152612c6b81612978565b9050919050565b60006020820190508181036000830152612c8b8161299b565b9050919050565b60006020820190508181036000830152612cab816129be565b9050919050565b60006020820190508181036000830152612ccb816129e1565b9050919050565b60006020820190508181036000830152612ceb81612a04565b9050919050565b60006020820190508181036000830152612d0b81612a27565b9050919050565b60006020820190508181036000830152612d2b81612a4a565b9050919050565b60006020820190508181036000830152612d4b81612a90565b9050919050565b60006020820190508181036000830152612d6b81612ab3565b9050919050565b60006020820190508181036000830152612d8b81612ad6565b9050919050565b6000602082019050612da76000830184612af9565b92915050565b6000612db7612dc8565b9050612dc38282613094565b919050565b6000604051905090565b600067ffffffffffffffff821115612ded57612dec6131fb565b5b612df68261323e565b9050602081019050919050565b600067ffffffffffffffff821115612e1e57612e1d6131fb565b5b612e278261323e565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612ea282613016565b9150612ead83613016565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612ee257612ee161313f565b5b828201905092915050565b6000612ef882613016565b9150612f0383613016565b925082612f1357612f1261316e565b5b828204905092915050565b6000612f2982613016565b9150612f3483613016565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f6d57612f6c61313f565b5b828202905092915050565b6000612f8382613016565b9150612f8e83613016565b925082821015612fa157612fa061313f565b5b828203905092915050565b6000612fb782612ff6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561304d578082015181840152602081019050613032565b8381111561305c576000848401525b50505050565b6000600282049050600182168061307a57607f821691505b6020821081141561308e5761308d61319d565b5b50919050565b61309d8261323e565b810181811067ffffffffffffffff821117156130bc576130bb6131fb565b5b80604052505050565b60006130d082613016565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131035761310261313f565b5b600182019050919050565b600061311982613016565b915061312483613016565b9250826131345761313361316e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757365640000000000000000000000000000000000000000000000000000600082015250565b7f4d696e7420776f756c6420657863656564206d617820737570706c79206f662060008201527f66726565206d696e747300000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f2030206d696e747300000000000000000000000000000000000000000000600082015250565b7f457863657373206d617820706572207061696420747800000000000000000000600082015250565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e76616c69642066756e64732070726f766964656400000000000000000000600082015250565b50565b7f4661696c656420746f2073656e64000000000000000000000000000000000000600082015250565b7f4e6f20636f6e7472616374730000000000000000000000000000000000000000600082015250565b7f4e6f74206c697665210000000000000000000000000000000000000000000000600082015250565b6134bc81612fac565b81146134c757600080fd5b50565b6134d381612fbe565b81146134de57600080fd5b50565b6134ea81612fca565b81146134f557600080fd5b50565b61350181613016565b811461350c57600080fd5b5056fea2646970667358221220b39eaf0c1ec5a531c402f21399fcf89f07b57ba7b1c5fda80a760a2e06189a2c64736f6c6343000807003368747470733a2f2f62616679626569616a617772337733646d6e6235617261796a626868356f6774746a7436716e7a686b7935686e646d6a677367647472356f6936342e697066732e6e667473746f726167652e6c696e6b2f
Deployed Bytecode
0x60806040526004361061020f5760003560e01c80636b13c07511610118578063a035b1fe116100a0578063c87b56dd1161006f578063c87b56dd14610741578063dc33e6811461077e578063e985e9c5146107bb578063f1ee997b146107f8578063f2fde38b146108145761020f565b8063a035b1fe14610699578063a22cb465146106c4578063b88d4fde146106ed578063c6682862146107165761020f565b80637b460aac116100e75780637b460aac146105d857806380623444146106035780638129fc1c1461062c5780638da5cb5b1461064357806395d89b411461066e5761020f565b80636b13c0751461052e5780636c0360eb1461055957806370a0823114610584578063715018a6146105c15761020f565b806342842e0e1161019b57806356e0ec721161016a57806356e0ec72146104475780635c6e7f60146104725780635c975abb1461049b5780636352211e146104c657806369e5d620146105035761020f565b806342842e0e146103a157806344a0d68a146103ca578063485a68a3146103f357806355f804b31461041e5761020f565b8063081812fc116101e2578063081812fc146102d0578063095ea7b31461030d57806318160ddd1461033657806323b872dd146103615780633ccfd60b1461038a5761020f565b806301ffc9a71461021457806302329a2914610251578063047fc9aa1461027a57806306fdde03146102a5575b600080fd5b34801561022057600080fd5b5061023b600480360381019061023691906126ff565b61083d565b6040516102489190612bb5565b60405180910390f35b34801561025d57600080fd5b50610278600480360381019061027391906126d2565b6108cf565b005b34801561028657600080fd5b5061028f6108f4565b60405161029c9190612d92565b60405180910390f35b3480156102b157600080fd5b506102ba6108fa565b6040516102c79190612bd0565b60405180910390f35b3480156102dc57600080fd5b506102f760048036038101906102f291906127a2565b61098c565b6040516103049190612b4e565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f9190612692565b610a08565b005b34801561034257600080fd5b5061034b610b49565b6040516103589190612d92565b60405180910390f35b34801561036d57600080fd5b506103886004803603810190610383919061257c565b610b60565b005b34801561039657600080fd5b5061039f610e85565b005b3480156103ad57600080fd5b506103c860048036038101906103c3919061257c565b610f49565b005b3480156103d657600080fd5b506103f160048036038101906103ec91906127a2565b610f69565b005b3480156103ff57600080fd5b50610408610f7b565b6040516104159190612d92565b60405180910390f35b34801561042a57600080fd5b5061044560048036038101906104409190612759565b610f80565b005b34801561045357600080fd5b5061045c610fa2565b6040516104699190612bb5565b60405180910390f35b34801561047e57600080fd5b50610499600480360381019061049491906126d2565b610fb5565b005b3480156104a757600080fd5b506104b0610fda565b6040516104bd9190612bb5565b60405180910390f35b3480156104d257600080fd5b506104ed60048036038101906104e891906127a2565b610fed565b6040516104fa9190612b4e565b60405180910390f35b34801561050f57600080fd5b50610518610fff565b6040516105259190612d92565b60405180910390f35b34801561053a57600080fd5b50610543611005565b6040516105509190612d92565b60405180910390f35b34801561056557600080fd5b5061056e61100a565b60405161057b9190612bd0565b60405180910390f35b34801561059057600080fd5b506105ab60048036038101906105a6919061250f565b611098565b6040516105b89190612d92565b60405180910390f35b3480156105cd57600080fd5b506105d6611151565b005b3480156105e457600080fd5b506105ed611165565b6040516105fa9190612d92565b60405180910390f35b34801561060f57600080fd5b5061062a600480360381019061062591906127a2565b61116b565b005b34801561063857600080fd5b5061064161117d565b005b34801561064f57600080fd5b50610658611199565b6040516106659190612b4e565b60405180910390f35b34801561067a57600080fd5b506106836111c3565b6040516106909190612bd0565b60405180910390f35b3480156106a557600080fd5b506106ae611255565b6040516106bb9190612d92565b60405180910390f35b3480156106d057600080fd5b506106eb60048036038101906106e69190612652565b61125b565b005b3480156106f957600080fd5b50610714600480360381019061070f91906125cf565b6113d3565b005b34801561072257600080fd5b5061072b611446565b6040516107389190612bd0565b60405180910390f35b34801561074d57600080fd5b50610768600480360381019061076391906127a2565b61147f565b6040516107759190612bd0565b60405180910390f35b34801561078a57600080fd5b506107a560048036038101906107a0919061250f565b61155e565b6040516107b29190612d92565b60405180910390f35b3480156107c757600080fd5b506107e260048036038101906107dd919061253c565b611570565b6040516107ef9190612bb5565b60405180910390f35b610812600480360381019061080d91906127a2565b611604565b005b34801561082057600080fd5b5061083b6004803603810190610836919061250f565b611990565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061089857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108c85750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6108d7611a14565b80600d60006101000a81548160ff02191690831515021790555050565b60095481565b60606002805461090990613062565b80601f016020809104026020016040519081016040528092919081815260200182805461093590613062565b80156109825780601f1061095757610100808354040283529160200191610982565b820191906000526020600020905b81548152906001019060200180831161096557829003601f168201915b5050505050905090565b600061099782611a92565b6109cd576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a1382610fed565b90508073ffffffffffffffffffffffffffffffffffffffff16610a34611af1565b73ffffffffffffffffffffffffffffffffffffffff1614610a9757610a6081610a5b611af1565b611570565b610a96576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610b53611af9565b6001546000540303905090565b6000610b6b82611b02565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610bd2576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610bde84611bd0565b91509150610bf48187610bef611af1565b611bf2565b610c4057610c0986610c04611af1565b611570565b610c3f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610ca7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cb48686866001611c36565b8015610cbf57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610d8d85610d69888887611c3c565b7c020000000000000000000000000000000000000000000000000000000017611c64565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610e15576000600185019050600060046000838152602001908152602001600020541415610e13576000548114610e12578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610e7d8686866001611c8f565b505050505050565b610e8d611a14565b60004790506000610e9c611c95565b73ffffffffffffffffffffffffffffffffffffffff1682604051610ebf90612b39565b60006040518083038185875af1925050503d8060008114610efc576040519150601f19603f3d011682016040523d82523d6000602084013e610f01565b606091505b5050905080610f45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3c90612d32565b60405180910390fd5b5050565b610f64838383604051806020016040528060008152506113d3565b505050565b610f71611a14565b80600a8190555050565b600181565b610f88611a14565b80600c9080519060200190610f9e929190612323565b5050565b600d60019054906101000a900460ff1681565b610fbd611a14565b80600d60016101000a81548160ff02191690831515021790555050565b600d60009054906101000a900460ff1681565b6000610ff882611b02565b9050919050565b600b5481565b600581565b600c805461101790613062565b80601f016020809104026020016040519081016040528092919081815260200182805461104390613062565b80156110905780601f1061106557610100808354040283529160200191611090565b820191906000526020600020905b81548152906001019060200180831161107357829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611100576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611159611a14565b6111636000611c9d565b565b6107d081565b611173611a14565b8060098190555050565b611185611a14565b611197611190611c95565b600a611d63565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546111d290613062565b80601f01602080910402602001604051908101604052809291908181526020018280546111fe90613062565b801561124b5780601f106112205761010080835404028352916020019161124b565b820191906000526020600020905b81548152906001019060200180831161122e57829003601f168201915b5050505050905090565b600a5481565b611263611af1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112c8576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006112d5611af1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611382611af1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113c79190612bb5565b60405180910390a35050565b6113de848484610b60565b60008373ffffffffffffffffffffffffffffffffffffffff163b146114405761140984848484611d81565b61143f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525081565b606061148a82611a92565b6114c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c090612cd2565b60405180910390fd5b6000600c80546114d890613062565b9050116114f45760405180602001604052806000815250611557565b600c6114ff83611ee1565b6040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060405160200161154793929190612b08565b6040516020818303038152906040525b9050919050565b600061156982612042565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600061160e611c95565b9050600d60009054906101000a900460ff1615611660576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165790612bf2565b60405180910390fd5b600d60019054906101000a900460ff166116af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a690612d72565b60405180910390fd5b816116b8610b49565b6116c29190612e97565b6009541015611706576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fd90612cb2565b60405180910390fd5b60008211611749576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174090612c52565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146117b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ae90612d52565b60405180910390fd5b81600510156117fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f290612c72565b60405180910390fd5b600161180633612042565b1061186057600a54826118199190612f1e565b34101561185b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185290612d12565b60405180910390fd5b6118e0565b60008261186c33612042565b6118769190612e97565b905060018111156118de57600a546001826118919190612f78565b61189b9190612f1e565b3410156118dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d490612c92565b60405180910390fd5b5b505b60006118eb33612042565b1415611982576107d0600b54101561191a57600b6000815480929190611910906130c5565b9190505550611981565b600a54826119289190612f1e565b34101561198057600a548261193d9190612f1e565b34101561197f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197690612c12565b60405180910390fd5b5b5b5b61198c8183611d63565b5050565b611998611a14565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ff90612c32565b60405180910390fd5b611a1181611c9d565b50565b611a1c611c95565b73ffffffffffffffffffffffffffffffffffffffff16611a3a611199565b73ffffffffffffffffffffffffffffffffffffffff1614611a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8790612cf2565b60405180910390fd5b565b600081611a9d611af9565b11158015611aac575060005482105b8015611aea575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080611b11611af9565b11611b9957600054811015611b985760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611b96575b6000811415611b8c576004600083600190039350838152602001908152602001600020549050611b61565b8092505050611bcb565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611c53868684612099565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611d7d8282604051806020016040528060008152506120a2565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611da7611af1565b8786866040518563ffffffff1660e01b8152600401611dc99493929190612b69565b602060405180830381600087803b158015611de357600080fd5b505af1925050508015611e1457506040513d601f19601f82011682018060405250810190611e11919061272c565b60015b611e8e573d8060008114611e44576040519150601f19603f3d011682016040523d82523d6000602084013e611e49565b606091505b50600081511415611e86576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415611f29576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061203d565b600082905060005b60008214611f5b578080611f44906130c5565b915050600a82611f549190612eed565b9150611f31565b60008167ffffffffffffffff811115611f7757611f766131fb565b5b6040519080825280601f01601f191660200182016040528015611fa95781602001600182028036833780820191505090505b5090505b6000851461203657600182611fc29190612f78565b9150600a85611fd1919061310e565b6030611fdd9190612e97565b60f81b818381518110611ff357611ff26131cc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561202f9190612eed565b9450611fad565b8093505050505b919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60009392505050565b6120ac838361213f565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461213a57600080549050600083820390505b6120ec6000868380600101945086611d81565b612122576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106120d957816000541461213757600080fd5b50505b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121ac576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008214156121e7576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121f46000848385611c36565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061226b8361225c6000866000611c3c565b61226585612313565b17611c64565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061228f5780600081905550505061230e6000848385611c8f565b505050565b60006001821460e11b9050919050565b82805461232f90613062565b90600052602060002090601f0160209004810192826123515760008555612398565b82601f1061236a57805160ff1916838001178555612398565b82800160010185558215612398579182015b8281111561239757825182559160200191906001019061237c565b5b5090506123a591906123a9565b5090565b5b808211156123c25760008160009055506001016123aa565b5090565b60006123d96123d484612dd2565b612dad565b9050828152602081018484840111156123f5576123f461322f565b5b612400848285613020565b509392505050565b600061241b61241684612e03565b612dad565b9050828152602081018484840111156124375761243661322f565b5b612442848285613020565b509392505050565b600081359050612459816134b3565b92915050565b60008135905061246e816134ca565b92915050565b600081359050612483816134e1565b92915050565b600081519050612498816134e1565b92915050565b600082601f8301126124b3576124b261322a565b5b81356124c38482602086016123c6565b91505092915050565b600082601f8301126124e1576124e061322a565b5b81356124f1848260208601612408565b91505092915050565b600081359050612509816134f8565b92915050565b60006020828403121561252557612524613239565b5b60006125338482850161244a565b91505092915050565b6000806040838503121561255357612552613239565b5b60006125618582860161244a565b92505060206125728582860161244a565b9150509250929050565b60008060006060848603121561259557612594613239565b5b60006125a38682870161244a565b93505060206125b48682870161244a565b92505060406125c5868287016124fa565b9150509250925092565b600080600080608085870312156125e9576125e8613239565b5b60006125f78782880161244a565b94505060206126088782880161244a565b9350506040612619878288016124fa565b925050606085013567ffffffffffffffff81111561263a57612639613234565b5b6126468782880161249e565b91505092959194509250565b6000806040838503121561266957612668613239565b5b60006126778582860161244a565b92505060206126888582860161245f565b9150509250929050565b600080604083850312156126a9576126a8613239565b5b60006126b78582860161244a565b92505060206126c8858286016124fa565b9150509250929050565b6000602082840312156126e8576126e7613239565b5b60006126f68482850161245f565b91505092915050565b60006020828403121561271557612714613239565b5b600061272384828501612474565b91505092915050565b60006020828403121561274257612741613239565b5b600061275084828501612489565b91505092915050565b60006020828403121561276f5761276e613239565b5b600082013567ffffffffffffffff81111561278d5761278c613234565b5b612799848285016124cc565b91505092915050565b6000602082840312156127b8576127b7613239565b5b60006127c6848285016124fa565b91505092915050565b6127d881612fac565b82525050565b6127e781612fbe565b82525050565b60006127f882612e49565b6128028185612e5f565b935061281281856020860161302f565b61281b8161323e565b840191505092915050565b600061283182612e54565b61283b8185612e7b565b935061284b81856020860161302f565b6128548161323e565b840191505092915050565b600061286a82612e54565b6128748185612e8c565b935061288481856020860161302f565b80840191505092915050565b6000815461289d81613062565b6128a78186612e8c565b945060018216600081146128c257600181146128d357612906565b60ff19831686528186019350612906565b6128dc85612e34565b60005b838110156128fe578154818901526001820191506020810190506128df565b838801955050505b50505092915050565b600061291c600683612e7b565b91506129278261324f565b602082019050919050565b600061293f602a83612e7b565b915061294a82613278565b604082019050919050565b6000612962602683612e7b565b915061296d826132c7565b604082019050919050565b6000612985600a83612e7b565b915061299082613316565b602082019050919050565b60006129a8601683612e7b565b91506129b38261333f565b602082019050919050565b60006129cb601283612e7b565b91506129d682613368565b602082019050919050565b60006129ee601283612e7b565b91506129f982613391565b602082019050919050565b6000612a11601583612e7b565b9150612a1c826133ba565b602082019050919050565b6000612a34602083612e7b565b9150612a3f826133e3565b602082019050919050565b6000612a57601683612e7b565b9150612a628261340c565b602082019050919050565b6000612a7a600083612e70565b9150612a8582613435565b600082019050919050565b6000612a9d600e83612e7b565b9150612aa882613438565b602082019050919050565b6000612ac0600c83612e7b565b9150612acb82613461565b602082019050919050565b6000612ae3600983612e7b565b9150612aee8261348a565b602082019050919050565b612b0281613016565b82525050565b6000612b148286612890565b9150612b20828561285f565b9150612b2c828461285f565b9150819050949350505050565b6000612b4482612a6d565b9150819050919050565b6000602082019050612b6360008301846127cf565b92915050565b6000608082019050612b7e60008301876127cf565b612b8b60208301866127cf565b612b986040830185612af9565b8181036060830152612baa81846127ed565b905095945050505050565b6000602082019050612bca60008301846127de565b92915050565b60006020820190508181036000830152612bea8184612826565b905092915050565b60006020820190508181036000830152612c0b8161290f565b9050919050565b60006020820190508181036000830152612c2b81612932565b9050919050565b60006020820190508181036000830152612c4b81612955565b9050919050565b60006020820190508181036000830152612c6b81612978565b9050919050565b60006020820190508181036000830152612c8b8161299b565b9050919050565b60006020820190508181036000830152612cab816129be565b9050919050565b60006020820190508181036000830152612ccb816129e1565b9050919050565b60006020820190508181036000830152612ceb81612a04565b9050919050565b60006020820190508181036000830152612d0b81612a27565b9050919050565b60006020820190508181036000830152612d2b81612a4a565b9050919050565b60006020820190508181036000830152612d4b81612a90565b9050919050565b60006020820190508181036000830152612d6b81612ab3565b9050919050565b60006020820190508181036000830152612d8b81612ad6565b9050919050565b6000602082019050612da76000830184612af9565b92915050565b6000612db7612dc8565b9050612dc38282613094565b919050565b6000604051905090565b600067ffffffffffffffff821115612ded57612dec6131fb565b5b612df68261323e565b9050602081019050919050565b600067ffffffffffffffff821115612e1e57612e1d6131fb565b5b612e278261323e565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612ea282613016565b9150612ead83613016565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612ee257612ee161313f565b5b828201905092915050565b6000612ef882613016565b9150612f0383613016565b925082612f1357612f1261316e565b5b828204905092915050565b6000612f2982613016565b9150612f3483613016565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f6d57612f6c61313f565b5b828202905092915050565b6000612f8382613016565b9150612f8e83613016565b925082821015612fa157612fa061313f565b5b828203905092915050565b6000612fb782612ff6565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561304d578082015181840152602081019050613032565b8381111561305c576000848401525b50505050565b6000600282049050600182168061307a57607f821691505b6020821081141561308e5761308d61319d565b5b50919050565b61309d8261323e565b810181811067ffffffffffffffff821117156130bc576130bb6131fb565b5b80604052505050565b60006130d082613016565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156131035761310261313f565b5b600182019050919050565b600061311982613016565b915061312483613016565b9250826131345761313361316e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f5061757365640000000000000000000000000000000000000000000000000000600082015250565b7f4d696e7420776f756c6420657863656564206d617820737570706c79206f662060008201527f66726565206d696e747300000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f2030206d696e747300000000000000000000000000000000000000000000600082015250565b7f457863657373206d617820706572207061696420747800000000000000000000600082015250565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f546f6b656e20646f6573206e6f742065786973742e0000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e76616c69642066756e64732070726f766964656400000000000000000000600082015250565b50565b7f4661696c656420746f2073656e64000000000000000000000000000000000000600082015250565b7f4e6f20636f6e7472616374730000000000000000000000000000000000000000600082015250565b7f4e6f74206c697665210000000000000000000000000000000000000000000000600082015250565b6134bc81612fac565b81146134c757600080fd5b50565b6134d381612fbe565b81146134de57600080fd5b50565b6134ea81612fca565b81146134f557600080fd5b50565b61350181613016565b811461350c57600080fd5b5056fea2646970667358221220b39eaf0c1ec5a531c402f21399fcf89f07b57ba7b1c5fda80a760a2e06189a2c64736f6c63430008070033
Deployed Bytecode Sourcemap
50890:3190:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20682:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53176:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51065:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26329:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28275:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27823:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19736:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37540:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52649:209;;;;;;;;;;;;;:::i;:::-;;29165:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53460:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50936:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53265:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51380:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53373:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51347:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26118:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51135:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51027:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51170:115;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21361:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5273:103;;;;;;;;;;;;;:::i;:::-;;50975:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53070:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52975:87;;;;;;;;;;;;;:::i;:::-;;4625;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26498:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51097:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28551:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29421:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51292:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53676:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53555:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28930:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51465:1176;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5531:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20682:615;20767:4;21082:10;21067:25;;:11;:25;;;;:102;;;;21159:10;21144:25;;:11;:25;;;;21067:102;:179;;;;21236:10;21221:25;;:11;:25;;;;21067:179;21047:199;;20682:615;;;:::o;53176:81::-;4511:13;:11;:13::i;:::-;53243:6:::1;53234;;:15;;;;;;;;;;;;;;;;;;53176:81:::0;:::o;51065:25::-;;;;:::o;26329:100::-;26383:13;26416:5;26409:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26329:100;:::o;28275:204::-;28343:7;28368:16;28376:7;28368;:16::i;:::-;28363:64;;28393:34;;;;;;;;;;;;;;28363:64;28447:15;:24;28463:7;28447:24;;;;;;;;;;;;;;;;;;;;;28440:31;;28275:204;;;:::o;27823:386::-;27896:13;27912:16;27920:7;27912;:16::i;:::-;27896:32;;27968:5;27945:28;;:19;:17;:19::i;:::-;:28;;;27941:175;;27993:44;28010:5;28017:19;:17;:19::i;:::-;27993:16;:44::i;:::-;27988:128;;28065:35;;;;;;;;;;;;;;27988:128;27941:175;28155:2;28128:15;:24;28144:7;28128:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;28193:7;28189:2;28173:28;;28182:5;28173:28;;;;;;;;;;;;27885:324;27823:386;;:::o;19736:315::-;19789:7;20017:15;:13;:15::i;:::-;20002:12;;19986:13;;:28;:46;19979:53;;19736:315;:::o;37540:2800::-;37674:27;37704;37723:7;37704:18;:27::i;:::-;37674:57;;37789:4;37748:45;;37764:19;37748:45;;;37744:86;;37802:28;;;;;;;;;;;;;;37744:86;37844:27;37873:23;37900:28;37920:7;37900:19;:28::i;:::-;37843:85;;;;38028:62;38047:15;38064:4;38070:19;:17;:19::i;:::-;38028:18;:62::i;:::-;38023:174;;38110:43;38127:4;38133:19;:17;:19::i;:::-;38110:16;:43::i;:::-;38105:92;;38162:35;;;;;;;;;;;;;;38105:92;38023:174;38228:1;38214:16;;:2;:16;;;38210:52;;;38239:23;;;;;;;;;;;;;;38210:52;38275:43;38297:4;38303:2;38307:7;38316:1;38275:21;:43::i;:::-;38411:15;38408:160;;;38551:1;38530:19;38523:30;38408:160;38946:18;:24;38965:4;38946:24;;;;;;;;;;;;;;;;38944:26;;;;;;;;;;;;39015:18;:22;39034:2;39015:22;;;;;;;;;;;;;;;;39013:24;;;;;;;;;;;39337:145;39374:2;39422:45;39437:4;39443:2;39447:19;39422:14;:45::i;:::-;16964:8;39395:72;39337:18;:145::i;:::-;39308:17;:26;39326:7;39308:26;;;;;;;;;;;:174;;;;39652:1;16964:8;39602:19;:46;:51;39598:626;;;39674:19;39706:1;39696:7;:11;39674:33;;39863:1;39829:17;:30;39847:11;39829:30;;;;;;;;;;;;:35;39825:384;;;39967:13;;39952:11;:28;39948:242;;40147:19;40114:17;:30;40132:11;40114:30;;;;;;;;;;;:52;;;;39948:242;39825:384;39655:569;39598:626;40271:7;40267:2;40252:27;;40261:4;40252:27;;;;;;;;;;;;40290:42;40311:4;40317:2;40321:7;40330:1;40290:20;:42::i;:::-;37663:2677;;;37540:2800;;;:::o;52649:209::-;4511:13;:11;:13::i;:::-;52699:15:::1;52717:21;52699:39;;52750:12;52768;:10;:12::i;:::-;:17;;52793:7;52768:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52749:56;;;52824:7;52816:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;52688:170;;52649:209::o:0;29165:185::-;29303:39;29320:4;29326:2;29330:7;29303:39;;;;;;;;;;;;:16;:39::i;:::-;29165:185;;;:::o;53460:89::-;4511:13;:11;:13::i;:::-;53533:8:::1;53525:5;:16;;;;53460:89:::0;:::o;50936:32::-;50967:1;50936:32;:::o;53265:100::-;4511:13;:11;:13::i;:::-;53349:8:::1;53339:7;:18;;;;;;;;;;;;:::i;:::-;;53265:100:::0;:::o;51380:25::-;;;;;;;;;;;;;:::o;53373:79::-;4511:13;:11;:13::i;:::-;53438:6:::1;53430:5;;:14;;;;;;;;;;;;;;;;;;53373:79:::0;:::o;51347:26::-;;;;;;;;;;;;;:::o;26118:144::-;26182:7;26225:27;26244:7;26225:18;:27::i;:::-;26202:52;;26118:144;;;:::o;51135:28::-;;;;:::o;51027:31::-;51057:1;51027:31;:::o;51170:115::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21361:224::-;21425:7;21466:1;21449:19;;:5;:19;;;21445:60;;;21477:28;;;;;;;;;;;;;;21445:60;15916:13;21523:18;:25;21542:5;21523:25;;;;;;;;;;;;;;;;:54;21516:61;;21361:224;;;:::o;5273:103::-;4511:13;:11;:13::i;:::-;5338:30:::1;5365:1;5338:18;:30::i;:::-;5273:103::o:0;50975:45::-;51016:4;50975:45;:::o;53070:94::-;4511:13;:11;:13::i;:::-;53147:9:::1;53138:6;:18;;;;53070:94:::0;:::o;52975:87::-;4511:13;:11;:13::i;:::-;53027:27:::1;53037:12;:10;:12::i;:::-;53051:2;53027:9;:27::i;:::-;52975:87::o:0;4625:::-;4671:7;4698:6;;;;;;;;;;;4691:13;;4625:87;:::o;26498:104::-;26554:13;26587:7;26580:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26498:104;:::o;51097:31::-;;;;:::o;28551:308::-;28662:19;:17;:19::i;:::-;28650:31;;:8;:31;;;28646:61;;;28690:17;;;;;;;;;;;;;;28646:61;28772:8;28720:18;:39;28739:19;:17;:19::i;:::-;28720:39;;;;;;;;;;;;;;;:49;28760:8;28720:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;28832:8;28796:55;;28811:19;:17;:19::i;:::-;28796:55;;;28842:8;28796:55;;;;;;:::i;:::-;;;;;;;;28551:308;;:::o;29421:399::-;29588:31;29601:4;29607:2;29611:7;29588:12;:31::i;:::-;29652:1;29634:2;:14;;;:19;29630:183;;29673:56;29704:4;29710:2;29714:7;29723:5;29673:30;:56::i;:::-;29668:145;;29757:40;;;;;;;;;;;;;;29668:145;29630:183;29421:399;;;;:::o;51292:46::-;;;;;;;;;;;;;;;;;;;:::o;53676:401::-;53742:13;53776:17;53784:8;53776:7;:17::i;:::-;53768:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;53861:1;53843:7;53837:21;;;;;:::i;:::-;;;:25;:232;;;;;;;;;;;;;;;;;53919:7;53943:26;53960:8;53943:16;:26::i;:::-;54025:13;;;;;;;;;;;;;;;;;53886:167;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53837:232;53830:239;;53676:401;;;:::o;53555:113::-;53613:7;53640:20;53654:5;53640:13;:20::i;:::-;53633:27;;53555:113;;;:::o;28930:164::-;29027:4;29051:18;:25;29070:5;29051:25;;;;;;;;;;;;;;;:35;29077:8;29051:35;;;;;;;;;;;;;;;;;;;;;;;;;29044:42;;28930:164;;;;:::o;51465:1176::-;51526:15;51544:12;:10;:12::i;:::-;51526:30;;51576:6;;;;;;;;;;;51575:7;51567:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;51612:5;;;;;;;;;;;51604:27;;;;;;;;;;;;:::i;:::-;;;;;;;;;51676:7;51660:13;:11;:13::i;:::-;:23;;;;:::i;:::-;51650:6;;:33;;51642:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;51735:1;51725:7;:11;51717:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;51783:7;51770:20;;:9;:20;;;51762:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;51836:7;51057:1;51826:17;;51818:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;50967:1;51897:25;51911:10;51897:13;:25::i;:::-;:36;51894:349;;51981:5;;51971:7;:15;;;;:::i;:::-;51958:9;:28;;51950:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;51894:349;;;52045:10;52086:7;52058:25;52072:10;52058:13;:25::i;:::-;:35;;;;:::i;:::-;52045:48;;50967:1;52111:5;:15;52108:124;;;52187:5;;50967:1;52168:5;:15;;;;:::i;:::-;52167:25;;;;:::i;:::-;52154:9;:38;;52146:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;52108:124;52030:213;51894:349;52285:1;52256:25;52270:10;52256:13;:25::i;:::-;:30;52253:341;;;51016:4;52306:12;;:29;52303:280;;;52355:12;;:14;;;;;;;;;:::i;:::-;;;;;;52303:280;;;52434:5;;52423:7;:16;;;;:::i;:::-;52411:9;:28;52408:160;;;52495:5;;52485:7;:15;;;;:::i;:::-;52472:9;:28;;52463:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;52408:160;52303:280;52253:341;52606:27;52616:7;52625;52606:9;:27::i;:::-;51515:1126;51465:1176;:::o;5531:201::-;4511:13;:11;:13::i;:::-;5640:1:::1;5620:22;;:8;:22;;;;5612:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5696:28;5715:8;5696:18;:28::i;:::-;5531:201:::0;:::o;4790:132::-;4865:12;:10;:12::i;:::-;4854:23;;:7;:5;:7::i;:::-;:23;;;4846:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4790:132::o;30075:273::-;30132:4;30188:7;30169:15;:13;:15::i;:::-;:26;;:66;;;;;30222:13;;30212:7;:23;30169:66;:152;;;;;30320:1;16686:8;30273:17;:26;30291:7;30273:26;;;;;;;;;;;;:43;:48;30169:152;30149:172;;30075:273;;;:::o;48636:105::-;48696:7;48723:10;48716:17;;48636:105;:::o;52866:101::-;52931:7;52958:1;52951:8;;52866:101;:::o;23035:1129::-;23102:7;23122:12;23137:7;23122:22;;23205:4;23186:15;:13;:15::i;:::-;:23;23182:915;;23239:13;;23232:4;:20;23228:869;;;23277:14;23294:17;:23;23312:4;23294:23;;;;;;;;;;;;23277:40;;23410:1;16686:8;23383:6;:23;:28;23379:699;;;23902:113;23919:1;23909:6;:11;23902:113;;;23962:17;:25;23980:6;;;;;;;23962:25;;;;;;;;;;;;23953:34;;23902:113;;;24048:6;24041:13;;;;;;23379:699;23254:843;23228:869;23182:915;24125:31;;;;;;;;;;;;;;23035:1129;;;;:::o;35876:652::-;35971:27;36000:23;36041:53;36097:15;36041:71;;36283:7;36277:4;36270:21;36318:22;36312:4;36305:36;36394:4;36388;36378:21;36355:44;;36490:19;36484:26;36465:45;;36221:300;35876:652;;;:::o;36641:645::-;36783:11;36945:15;36939:4;36935:26;36927:34;;37104:15;37093:9;37089:31;37076:44;;37251:15;37240:9;37237:30;37230:4;37219:9;37216:19;37213:55;37203:65;;36641:645;;;;;:::o;47469:159::-;;;;;:::o;45781:309::-;45916:7;45936:16;17087:3;45962:19;:40;;45936:67;;17087:3;46029:31;46040:4;46046:2;46050:9;46029:10;:31::i;:::-;46021:40;;:61;;46014:68;;;45781:309;;;;;:::o;25609:447::-;25689:14;25857:15;25850:5;25846:27;25837:36;;26031:5;26017:11;25993:22;25989:40;25986:51;25979:5;25976:62;25966:72;;25609:447;;;;:::o;48287:158::-;;;;;:::o;3176:98::-;3229:7;3256:10;3249:17;;3176:98;:::o;5892:191::-;5966:16;5985:6;;;;;;;;;;;5966:25;;6011:8;6002:6;;:17;;;;;;;;;;;;;;;;;;6066:8;6035:40;;6056:8;6035:40;;;;;;;;;;;;5955:128;5892:191;:::o;30432:104::-;30501:27;30511:2;30515:8;30501:27;;;;;;;;;;;;:9;:27::i;:::-;30432:104;;:::o;44291:716::-;44454:4;44500:2;44475:45;;;44521:19;:17;:19::i;:::-;44542:4;44548:7;44557:5;44475:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44471:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44775:1;44758:6;:13;:18;44754:235;;;44804:40;;;;;;;;;;;;;;44754:235;44947:6;44941:13;44932:6;44928:2;44924:15;44917:38;44471:529;44644:54;;;44634:64;;;:6;:64;;;;44627:71;;;44291:716;;;;;;:::o;430:723::-;486:13;716:1;707:5;:10;703:53;;;734:10;;;;;;;;;;;;;;;;;;;;;703:53;766:12;781:5;766:20;;797:14;822:78;837:1;829:4;:9;822:78;;855:8;;;;;:::i;:::-;;;;886:2;878:10;;;;;:::i;:::-;;;822:78;;;910:19;942:6;932:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:39;;960:154;976:1;967:5;:10;960:154;;1004:1;994:11;;;;;:::i;:::-;;;1071:2;1063:5;:10;;;;:::i;:::-;1050:2;:24;;;;:::i;:::-;1037:39;;1020:6;1027;1020:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1100:2;1091:11;;;;;:::i;:::-;;;960:154;;;1138:6;1124:21;;;;;430:723;;;;:::o;21667:176::-;21728:7;15916:13;16053:2;21756:18;:25;21775:5;21756:25;;;;;;;;;;;;;;;;:49;;21755:80;21748:87;;21667:176;;;:::o;46666:147::-;46803:6;46666:147;;;;;:::o;30952:681::-;31075:19;31081:2;31085:8;31075:5;:19::i;:::-;31154:1;31136:2;:14;;;:19;31132:483;;31176:11;31190:13;;31176:27;;31222:13;31244:8;31238:3;:14;31222:30;;31271:233;31302:62;31341:1;31345:2;31349:7;;;;;;31358:5;31302:30;:62::i;:::-;31297:167;;31400:40;;;;;;;;;;;;;;31297:167;31499:3;31491:5;:11;31271:233;;31586:3;31569:13;;:20;31565:34;;31591:8;;;31565:34;31157:458;;31132:483;30952:681;;;:::o;31906:1529::-;31971:20;31994:13;;31971:36;;32036:1;32022:16;;:2;:16;;;32018:48;;;32047:19;;;;;;;;;;;;;;32018:48;32093:1;32081:8;:13;32077:44;;;32103:18;;;;;;;;;;;;;;32077:44;32134:61;32164:1;32168:2;32172:12;32186:8;32134:21;:61::i;:::-;32677:1;16053:2;32648:1;:25;;32647:31;32635:8;:44;32609:18;:22;32628:2;32609:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;32956:139;32993:2;33047:33;33070:1;33074:2;33078:1;33047:14;:33::i;:::-;33014:30;33035:8;33014:20;:30::i;:::-;:66;32956:18;:139::i;:::-;32922:17;:31;32940:12;32922:31;;;;;;;;;;;:173;;;;33112:15;33130:12;33112:30;;33157:11;33186:8;33171:12;:23;33157:37;;33209:101;33261:9;;;;;;33257:2;33236:35;;33253:1;33236:35;;;;;;;;;;;;33305:3;33295:7;:13;33209:101;;33342:3;33326:13;:19;;;;32383:974;;33367:60;33396:1;33400:2;33404:12;33418:8;33367:20;:60::i;:::-;31960:1475;31906:1529;;:::o;27439:322::-;27509:14;27740:1;27730:8;27727:15;27702:23;27698:45;27688:55;;27439:322;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:118::-;7574:24;7592:5;7574:24;:::i;:::-;7569:3;7562:37;7487:118;;:::o;7611:109::-;7692:21;7707:5;7692:21;:::i;:::-;7687:3;7680:34;7611:109;;:::o;7726:360::-;7812:3;7840:38;7872:5;7840:38;:::i;:::-;7894:70;7957:6;7952:3;7894:70;:::i;:::-;7887:77;;7973:52;8018:6;8013:3;8006:4;7999:5;7995:16;7973:52;:::i;:::-;8050:29;8072:6;8050:29;:::i;:::-;8045:3;8041:39;8034:46;;7816:270;7726:360;;;;:::o;8092:364::-;8180:3;8208:39;8241:5;8208:39;:::i;:::-;8263:71;8327:6;8322:3;8263:71;:::i;:::-;8256:78;;8343:52;8388:6;8383:3;8376:4;8369:5;8365:16;8343:52;:::i;:::-;8420:29;8442:6;8420:29;:::i;:::-;8415:3;8411:39;8404:46;;8184:272;8092:364;;;;:::o;8462:377::-;8568:3;8596:39;8629:5;8596:39;:::i;:::-;8651:89;8733:6;8728:3;8651:89;:::i;:::-;8644:96;;8749:52;8794:6;8789:3;8782:4;8775:5;8771:16;8749:52;:::i;:::-;8826:6;8821:3;8817:16;8810:23;;8572:267;8462:377;;;;:::o;8869:845::-;8972:3;9009:5;9003:12;9038:36;9064:9;9038:36;:::i;:::-;9090:89;9172:6;9167:3;9090:89;:::i;:::-;9083:96;;9210:1;9199:9;9195:17;9226:1;9221:137;;;;9372:1;9367:341;;;;9188:520;;9221:137;9305:4;9301:9;9290;9286:25;9281:3;9274:38;9341:6;9336:3;9332:16;9325:23;;9221:137;;9367:341;9434:38;9466:5;9434:38;:::i;:::-;9494:1;9508:154;9522:6;9519:1;9516:13;9508:154;;;9596:7;9590:14;9586:1;9581:3;9577:11;9570:35;9646:1;9637:7;9633:15;9622:26;;9544:4;9541:1;9537:12;9532:17;;9508:154;;;9691:6;9686:3;9682:16;9675:23;;9374:334;;9188:520;;8976:738;;8869:845;;;;:::o;9720:365::-;9862:3;9883:66;9947:1;9942:3;9883:66;:::i;:::-;9876:73;;9958:93;10047:3;9958:93;:::i;:::-;10076:2;10071:3;10067:12;10060:19;;9720:365;;;:::o;10091:366::-;10233:3;10254:67;10318:2;10313:3;10254:67;:::i;:::-;10247:74;;10330:93;10419:3;10330:93;:::i;:::-;10448:2;10443:3;10439:12;10432:19;;10091:366;;;:::o;10463:::-;10605:3;10626:67;10690:2;10685:3;10626:67;:::i;:::-;10619:74;;10702:93;10791:3;10702:93;:::i;:::-;10820:2;10815:3;10811:12;10804:19;;10463:366;;;:::o;10835:::-;10977:3;10998:67;11062:2;11057:3;10998:67;:::i;:::-;10991:74;;11074:93;11163:3;11074:93;:::i;:::-;11192:2;11187:3;11183:12;11176:19;;10835:366;;;:::o;11207:::-;11349:3;11370:67;11434:2;11429:3;11370:67;:::i;:::-;11363:74;;11446:93;11535:3;11446:93;:::i;:::-;11564:2;11559:3;11555:12;11548:19;;11207:366;;;:::o;11579:::-;11721:3;11742:67;11806:2;11801:3;11742:67;:::i;:::-;11735:74;;11818:93;11907:3;11818:93;:::i;:::-;11936:2;11931:3;11927:12;11920:19;;11579:366;;;:::o;11951:::-;12093:3;12114:67;12178:2;12173:3;12114:67;:::i;:::-;12107:74;;12190:93;12279:3;12190:93;:::i;:::-;12308:2;12303:3;12299:12;12292:19;;11951:366;;;:::o;12323:::-;12465:3;12486:67;12550:2;12545:3;12486:67;:::i;:::-;12479:74;;12562:93;12651:3;12562:93;:::i;:::-;12680:2;12675:3;12671:12;12664:19;;12323:366;;;:::o;12695:::-;12837:3;12858:67;12922:2;12917:3;12858:67;:::i;:::-;12851:74;;12934:93;13023:3;12934:93;:::i;:::-;13052:2;13047:3;13043:12;13036:19;;12695:366;;;:::o;13067:::-;13209:3;13230:67;13294:2;13289:3;13230:67;:::i;:::-;13223:74;;13306:93;13395:3;13306:93;:::i;:::-;13424:2;13419:3;13415:12;13408:19;;13067:366;;;:::o;13439:398::-;13598:3;13619:83;13700:1;13695:3;13619:83;:::i;:::-;13612:90;;13711:93;13800:3;13711:93;:::i;:::-;13829:1;13824:3;13820:11;13813:18;;13439:398;;;:::o;13843:366::-;13985:3;14006:67;14070:2;14065:3;14006:67;:::i;:::-;13999:74;;14082:93;14171:3;14082:93;:::i;:::-;14200:2;14195:3;14191:12;14184:19;;13843:366;;;:::o;14215:::-;14357:3;14378:67;14442:2;14437:3;14378:67;:::i;:::-;14371:74;;14454:93;14543:3;14454:93;:::i;:::-;14572:2;14567:3;14563:12;14556:19;;14215:366;;;:::o;14587:365::-;14729:3;14750:66;14814:1;14809:3;14750:66;:::i;:::-;14743:73;;14825:93;14914:3;14825:93;:::i;:::-;14943:2;14938:3;14934:12;14927:19;;14587:365;;;:::o;14958:118::-;15045:24;15063:5;15045:24;:::i;:::-;15040:3;15033:37;14958:118;;:::o;15082:589::-;15307:3;15329:92;15417:3;15408:6;15329:92;:::i;:::-;15322:99;;15438:95;15529:3;15520:6;15438:95;:::i;:::-;15431:102;;15550:95;15641:3;15632:6;15550:95;:::i;:::-;15543:102;;15662:3;15655:10;;15082:589;;;;;;:::o;15677:379::-;15861:3;15883:147;16026:3;15883:147;:::i;:::-;15876:154;;16047:3;16040:10;;15677:379;;;:::o;16062:222::-;16155:4;16193:2;16182:9;16178:18;16170:26;;16206:71;16274:1;16263:9;16259:17;16250:6;16206:71;:::i;:::-;16062:222;;;;:::o;16290:640::-;16485:4;16523:3;16512:9;16508:19;16500:27;;16537:71;16605:1;16594:9;16590:17;16581:6;16537:71;:::i;:::-;16618:72;16686:2;16675:9;16671:18;16662:6;16618:72;:::i;:::-;16700;16768:2;16757:9;16753:18;16744:6;16700:72;:::i;:::-;16819:9;16813:4;16809:20;16804:2;16793:9;16789:18;16782:48;16847:76;16918:4;16909:6;16847:76;:::i;:::-;16839:84;;16290:640;;;;;;;:::o;16936:210::-;17023:4;17061:2;17050:9;17046:18;17038:26;;17074:65;17136:1;17125:9;17121:17;17112:6;17074:65;:::i;:::-;16936:210;;;;:::o;17152:313::-;17265:4;17303:2;17292:9;17288:18;17280:26;;17352:9;17346:4;17342:20;17338:1;17327:9;17323:17;17316:47;17380:78;17453:4;17444:6;17380:78;:::i;:::-;17372:86;;17152:313;;;;:::o;17471:419::-;17637:4;17675:2;17664:9;17660:18;17652:26;;17724:9;17718:4;17714:20;17710:1;17699:9;17695:17;17688:47;17752:131;17878:4;17752:131;:::i;:::-;17744:139;;17471:419;;;:::o;17896:::-;18062:4;18100:2;18089:9;18085:18;18077:26;;18149:9;18143:4;18139:20;18135:1;18124:9;18120:17;18113:47;18177:131;18303:4;18177:131;:::i;:::-;18169:139;;17896:419;;;:::o;18321:::-;18487:4;18525:2;18514:9;18510:18;18502:26;;18574:9;18568:4;18564:20;18560:1;18549:9;18545:17;18538:47;18602:131;18728:4;18602:131;:::i;:::-;18594:139;;18321:419;;;:::o;18746:::-;18912:4;18950:2;18939:9;18935:18;18927:26;;18999:9;18993:4;18989:20;18985:1;18974:9;18970:17;18963:47;19027:131;19153:4;19027:131;:::i;:::-;19019:139;;18746:419;;;:::o;19171:::-;19337:4;19375:2;19364:9;19360:18;19352:26;;19424:9;19418:4;19414:20;19410:1;19399:9;19395:17;19388:47;19452:131;19578:4;19452:131;:::i;:::-;19444:139;;19171:419;;;:::o;19596:::-;19762:4;19800:2;19789:9;19785:18;19777:26;;19849:9;19843:4;19839:20;19835:1;19824:9;19820:17;19813:47;19877:131;20003:4;19877:131;:::i;:::-;19869:139;;19596:419;;;:::o;20021:::-;20187:4;20225:2;20214:9;20210:18;20202:26;;20274:9;20268:4;20264:20;20260:1;20249:9;20245:17;20238:47;20302:131;20428:4;20302:131;:::i;:::-;20294:139;;20021:419;;;:::o;20446:::-;20612:4;20650:2;20639:9;20635:18;20627:26;;20699:9;20693:4;20689:20;20685:1;20674:9;20670:17;20663:47;20727:131;20853:4;20727:131;:::i;:::-;20719:139;;20446:419;;;:::o;20871:::-;21037:4;21075:2;21064:9;21060:18;21052:26;;21124:9;21118:4;21114:20;21110:1;21099:9;21095:17;21088:47;21152:131;21278:4;21152:131;:::i;:::-;21144:139;;20871:419;;;:::o;21296:::-;21462:4;21500:2;21489:9;21485:18;21477:26;;21549:9;21543:4;21539:20;21535:1;21524:9;21520:17;21513:47;21577:131;21703:4;21577:131;:::i;:::-;21569:139;;21296:419;;;:::o;21721:::-;21887:4;21925:2;21914:9;21910:18;21902:26;;21974:9;21968:4;21964:20;21960:1;21949:9;21945:17;21938:47;22002:131;22128:4;22002:131;:::i;:::-;21994:139;;21721:419;;;:::o;22146:::-;22312:4;22350:2;22339:9;22335:18;22327:26;;22399:9;22393:4;22389:20;22385:1;22374:9;22370:17;22363:47;22427:131;22553:4;22427:131;:::i;:::-;22419:139;;22146:419;;;:::o;22571:::-;22737:4;22775:2;22764:9;22760:18;22752:26;;22824:9;22818:4;22814:20;22810:1;22799:9;22795:17;22788:47;22852:131;22978:4;22852:131;:::i;:::-;22844:139;;22571:419;;;:::o;22996:222::-;23089:4;23127:2;23116:9;23112:18;23104:26;;23140:71;23208:1;23197:9;23193:17;23184:6;23140:71;:::i;:::-;22996:222;;;;:::o;23224:129::-;23258:6;23285:20;;:::i;:::-;23275:30;;23314:33;23342:4;23334:6;23314:33;:::i;:::-;23224:129;;;:::o;23359:75::-;23392:6;23425:2;23419:9;23409:19;;23359:75;:::o;23440:307::-;23501:4;23591:18;23583:6;23580:30;23577:56;;;23613:18;;:::i;:::-;23577:56;23651:29;23673:6;23651:29;:::i;:::-;23643:37;;23735:4;23729;23725:15;23717:23;;23440:307;;;:::o;23753:308::-;23815:4;23905:18;23897:6;23894:30;23891:56;;;23927:18;;:::i;:::-;23891:56;23965:29;23987:6;23965:29;:::i;:::-;23957:37;;24049:4;24043;24039:15;24031:23;;23753:308;;;:::o;24067:141::-;24116:4;24139:3;24131:11;;24162:3;24159:1;24152:14;24196:4;24193:1;24183:18;24175:26;;24067:141;;;:::o;24214:98::-;24265:6;24299:5;24293:12;24283:22;;24214:98;;;:::o;24318:99::-;24370:6;24404:5;24398:12;24388:22;;24318:99;;;:::o;24423:168::-;24506:11;24540:6;24535:3;24528:19;24580:4;24575:3;24571:14;24556:29;;24423:168;;;;:::o;24597:147::-;24698:11;24735:3;24720:18;;24597:147;;;;:::o;24750:169::-;24834:11;24868:6;24863:3;24856:19;24908:4;24903:3;24899:14;24884:29;;24750:169;;;;:::o;24925:148::-;25027:11;25064:3;25049:18;;24925:148;;;;:::o;25079:305::-;25119:3;25138:20;25156:1;25138:20;:::i;:::-;25133:25;;25172:20;25190:1;25172:20;:::i;:::-;25167:25;;25326:1;25258:66;25254:74;25251:1;25248:81;25245:107;;;25332:18;;:::i;:::-;25245:107;25376:1;25373;25369:9;25362:16;;25079:305;;;;:::o;25390:185::-;25430:1;25447:20;25465:1;25447:20;:::i;:::-;25442:25;;25481:20;25499:1;25481:20;:::i;:::-;25476:25;;25520:1;25510:35;;25525:18;;:::i;:::-;25510:35;25567:1;25564;25560:9;25555:14;;25390:185;;;;:::o;25581:348::-;25621:7;25644:20;25662:1;25644:20;:::i;:::-;25639:25;;25678:20;25696:1;25678:20;:::i;:::-;25673:25;;25866:1;25798:66;25794:74;25791:1;25788:81;25783:1;25776:9;25769:17;25765:105;25762:131;;;25873:18;;:::i;:::-;25762:131;25921:1;25918;25914:9;25903:20;;25581:348;;;;:::o;25935:191::-;25975:4;25995:20;26013:1;25995:20;:::i;:::-;25990:25;;26029:20;26047:1;26029:20;:::i;:::-;26024:25;;26068:1;26065;26062:8;26059:34;;;26073:18;;:::i;:::-;26059:34;26118:1;26115;26111:9;26103:17;;25935:191;;;;:::o;26132:96::-;26169:7;26198:24;26216:5;26198:24;:::i;:::-;26187:35;;26132:96;;;:::o;26234:90::-;26268:7;26311:5;26304:13;26297:21;26286:32;;26234:90;;;:::o;26330:149::-;26366:7;26406:66;26399:5;26395:78;26384:89;;26330:149;;;:::o;26485:126::-;26522:7;26562:42;26555:5;26551:54;26540:65;;26485:126;;;:::o;26617:77::-;26654:7;26683:5;26672:16;;26617:77;;;:::o;26700:154::-;26784:6;26779:3;26774;26761:30;26846:1;26837:6;26832:3;26828:16;26821:27;26700:154;;;:::o;26860:307::-;26928:1;26938:113;26952:6;26949:1;26946:13;26938:113;;;27037:1;27032:3;27028:11;27022:18;27018:1;27013:3;27009:11;27002:39;26974:2;26971:1;26967:10;26962:15;;26938:113;;;27069:6;27066:1;27063:13;27060:101;;;27149:1;27140:6;27135:3;27131:16;27124:27;27060:101;26909:258;26860:307;;;:::o;27173:320::-;27217:6;27254:1;27248:4;27244:12;27234:22;;27301:1;27295:4;27291:12;27322:18;27312:81;;27378:4;27370:6;27366:17;27356:27;;27312:81;27440:2;27432:6;27429:14;27409:18;27406:38;27403:84;;;27459:18;;:::i;:::-;27403:84;27224:269;27173:320;;;:::o;27499:281::-;27582:27;27604:4;27582:27;:::i;:::-;27574:6;27570:40;27712:6;27700:10;27697:22;27676:18;27664:10;27661:34;27658:62;27655:88;;;27723:18;;:::i;:::-;27655:88;27763:10;27759:2;27752:22;27542:238;27499:281;;:::o;27786:233::-;27825:3;27848:24;27866:5;27848:24;:::i;:::-;27839:33;;27894:66;27887:5;27884:77;27881:103;;;27964:18;;:::i;:::-;27881:103;28011:1;28004:5;28000:13;27993:20;;27786:233;;;:::o;28025:176::-;28057:1;28074:20;28092:1;28074:20;:::i;:::-;28069:25;;28108:20;28126:1;28108:20;:::i;:::-;28103:25;;28147:1;28137:35;;28152:18;;:::i;:::-;28137:35;28193:1;28190;28186:9;28181:14;;28025:176;;;;:::o;28207:180::-;28255:77;28252:1;28245:88;28352:4;28349:1;28342:15;28376:4;28373:1;28366:15;28393:180;28441:77;28438:1;28431:88;28538:4;28535:1;28528:15;28562:4;28559:1;28552:15;28579:180;28627:77;28624:1;28617:88;28724:4;28721:1;28714:15;28748:4;28745:1;28738:15;28765:180;28813:77;28810:1;28803:88;28910:4;28907:1;28900:15;28934:4;28931:1;28924:15;28951:180;28999:77;28996:1;28989:88;29096:4;29093:1;29086:15;29120:4;29117:1;29110:15;29137:117;29246:1;29243;29236:12;29260:117;29369:1;29366;29359:12;29383:117;29492:1;29489;29482:12;29506:117;29615:1;29612;29605:12;29629:102;29670:6;29721:2;29717:7;29712:2;29705:5;29701:14;29697:28;29687:38;;29629:102;;;:::o;29737:156::-;29877:8;29873:1;29865:6;29861:14;29854:32;29737:156;:::o;29899:229::-;30039:34;30035:1;30027:6;30023:14;30016:58;30108:12;30103:2;30095:6;30091:15;30084:37;29899:229;:::o;30134:225::-;30274:34;30270:1;30262:6;30258:14;30251:58;30343:8;30338:2;30330:6;30326:15;30319:33;30134:225;:::o;30365:160::-;30505:12;30501:1;30493:6;30489:14;30482:36;30365:160;:::o;30531:172::-;30671:24;30667:1;30659:6;30655:14;30648:48;30531:172;:::o;30709:168::-;30849:20;30845:1;30837:6;30833:14;30826:44;30709:168;:::o;30883:::-;31023:20;31019:1;31011:6;31007:14;31000:44;30883:168;:::o;31057:171::-;31197:23;31193:1;31185:6;31181:14;31174:47;31057:171;:::o;31234:182::-;31374:34;31370:1;31362:6;31358:14;31351:58;31234:182;:::o;31422:172::-;31562:24;31558:1;31550:6;31546:14;31539:48;31422:172;:::o;31600:114::-;;:::o;31720:164::-;31860:16;31856:1;31848:6;31844:14;31837:40;31720:164;:::o;31890:162::-;32030:14;32026:1;32018:6;32014:14;32007:38;31890:162;:::o;32058:159::-;32198:11;32194:1;32186:6;32182:14;32175:35;32058:159;:::o;32223:122::-;32296:24;32314:5;32296:24;:::i;:::-;32289:5;32286:35;32276:63;;32335:1;32332;32325:12;32276:63;32223:122;:::o;32351:116::-;32421:21;32436:5;32421:21;:::i;:::-;32414:5;32411:32;32401:60;;32457:1;32454;32447:12;32401:60;32351:116;:::o;32473:120::-;32545:23;32562:5;32545:23;:::i;:::-;32538:5;32535:34;32525:62;;32583:1;32580;32573:12;32525:62;32473:120;:::o;32599:122::-;32672:24;32690:5;32672:24;:::i;:::-;32665:5;32662:35;32652:63;;32711:1;32708;32701:12;32652:63;32599:122;:::o
Swarm Source
ipfs://b39eaf0c1ec5a531c402f21399fcf89f07b57ba7b1c5fda80a760a2e06189a2c
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.