ERC-721
Overview
Max Total Supply
168 r0cket
Holders
73
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 r0cketLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
r0cketflippers
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-22 */ // 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: erc721a/contracts/extensions/IERC721AQueryable.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721AQueryable compliant contract. */ interface IERC721AQueryable is IERC721A { /** * Invalid query range (`start` >= `stop`). */ error InvalidQueryRange(); /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * - `addr` = `address(0)` * - `startTimestamp` = `0` * - `burned` = `false` * * If the `tokenId` is burned: * - `addr` = `<Address of owner before token was burned>` * - `startTimestamp` = `<Timestamp when token was burned>` * - `burned = `true` * * Otherwise: * - `addr` = `<Address of owner>` * - `startTimestamp` = `<Timestamp of start of ownership>` * - `burned = `false` */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start` < `stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(totalSupply) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K pfp collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); } // File: erc721a/contracts/extensions/ERC721AQueryable.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @title ERC721A Queryable * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * - `addr` = `address(0)` * - `startTimestamp` = `0` * - `burned` = `false` * - `extraData` = `0` * * If the `tokenId` is burned: * - `addr` = `<Address of owner before token was burned>` * - `startTimestamp` = `<Timestamp when token was burned>` * - `burned = `true` * - `extraData` = `<Extra data when token was burned>` * * Otherwise: * - `addr` = `<Address of owner>` * - `startTimestamp` = `<Timestamp of start of ownership>` * - `burned = `false` * - `extraData` = `<Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) public view override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) { return ownership; } ownership = _ownershipAt(tokenId); if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view override returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start` < `stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _nextTokenId(); // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, stopLimit)`. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`. // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(totalSupply) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K pfp collections should be fine). */ function tokensOfOwner(address owner) external view override returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must 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); } // File: @openzeppelin/contracts/interfaces/IERC721.sol // OpenZeppelin Contracts v4.4.1 (interfaces/IERC721.sol) pragma solidity ^0.8.0; // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a / b + (a % b == 0 ? 0 : 1); } } // File: @openzeppelin/contracts/utils/Arrays.sol // OpenZeppelin Contracts v4.4.1 (utils/Arrays.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to array types. */ library Arrays { /** * @dev Searches a sorted `array` and returns the first index that contains * a value greater or equal to `element`. If no such index exists (i.e. all * values in the array are strictly less than `element`), the array length is * returned. Time complexity O(log n). * * `array` is expected to be sorted in ascending order, and to contain no * repeated elements. */ function findUpperBound(uint256[] storage array, uint256 element) internal view returns (uint256) { if (array.length == 0) { return 0; } uint256 low = 0; uint256 high = array.length; while (low < high) { uint256 mid = Math.average(low, high); // Note that mid will always be strictly less than high (i.e. it will be a valid array index) // because Math.average rounds down (it does integer division with truncation). if (array[mid] > element) { high = mid; } else { low = mid + 1; } } // At this point `low` is the exclusive upper bound. We will return the inclusive upper bound. if (low > 0 && array[low - 1] == element) { return low - 1; } else { return low; } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: contracts/r0cketflippers.sol /* _______ __ __ _____.__ .__ _______ \ _ \ ____ | | __ _____/ |_ _/ ____\ | |__|_____ ______ ___________ ______ \_ __ \/ /_\ \_/ ___\| |/ // __ \ __\ \ __\| | | \____ \\____ \_/ __ \_ __ \/ ___/ | | \/\ \_/ \ \___| <\ ___/| | | | | |_| | |_> > |_> > ___/| | \/\___ \ |__| \_____ /\___ >__|_ \\___ >__| |__| |____/__| __/| __/ \___ >__| /____ > \/ \/ \/ \/ |__| |__| \/ \/ */ // Developer - ReservedSnow // File: contracts/interfaces/ILayerZeroUserApplicationConfig.sol pragma solidity >=0.5.0; interface ILayerZeroUserApplicationConfig { // @notice set the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _configType - type of configuration. every messaging library has its own convention. // @param _config - configuration in the bytes. can encode arbitrary content. function setConfig( uint16 _version, uint16 _chainId, uint256 _configType, bytes calldata _config ) external; // @notice set the send() LayerZero messaging library version to _version // @param _version - new messaging library version function setSendVersion(uint16 _version) external; // @notice set the lzReceive() LayerZero messaging library version to _version // @param _version - new messaging library version function setReceiveVersion(uint16 _version) external; // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload // @param _srcChainId - the chainId of the source chain // @param _srcAddress - the contract address of the source contract at the source chain function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external; } // File: contracts/interfaces/ILayerZeroEndpoint.sol pragma solidity >=0.5.0; interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig { // @notice send a LayerZero message to the specified address at a LayerZero endpoint. // @param _dstChainId - the destination chain identifier // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains // @param _payload - a custom bytes payload to send to the destination contract // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination function send( uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams ) external payable; // @notice used by the messaging library to publish verified payload // @param _srcChainId - the source chain identifier // @param _srcAddress - the source contract (as bytes) at the source chain // @param _dstAddress - the address on destination chain // @param _nonce - the unbound message ordering nonce // @param _gasLimit - the gas limit for external contract execution // @param _payload - verified payload to send to the destination contract function receivePayload( uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint256 _gasLimit, bytes calldata _payload ) external; // @notice get the inboundNonce of a receiver from a source chain which could be EVM or non-EVM chain // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64); // @notice get the outboundNonce from this source chain which, consequently, is always an EVM // @param _srcAddress - the source chain contract address function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64); // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery // @param _dstChainId - the destination chain identifier // @param _userApplication - the user app address on this EVM chain // @param _payload - the custom message to send over LayerZero // @param _payInZRO - if false, user app pays the protocol fee in native token // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain function estimateFees( uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam ) external view returns (uint256 nativeFee, uint256 zroFee); // @notice get this Endpoint's immutable source identifier function getChainId() external view returns (uint16); // @notice the interface to retry failed message on this Endpoint destination // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address // @param _payload - the payload to be retried function retryPayload( uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload ) external; // @notice query if any STORED payload (message blocking) at the endpoint. // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool); // @notice query if the _libraryAddress is valid for sending msgs. // @param _userApplication - the user app address on this EVM chain function getSendLibraryAddress(address _userApplication) external view returns (address); // @notice query if the _libraryAddress is valid for receiving msgs. // @param _userApplication - the user app address on this EVM chain function getReceiveLibraryAddress(address _userApplication) external view returns (address); // @notice query if the non-reentrancy guard for send() is on // @return true if the guard is on. false otherwise function isSendingPayload() external view returns (bool); // @notice query if the non-reentrancy guard for receive() is on // @return true if the guard is on. false otherwise function isReceivingPayload() external view returns (bool); // @notice get the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _userApplication - the contract address of the user application // @param _configType - type of configuration. every messaging library has its own convention. function getConfig( uint16 _version, uint16 _chainId, address _userApplication, uint256 _configType ) external view returns (bytes memory); // @notice get the send() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getSendVersion(address _userApplication) external view returns (uint16); // @notice get the lzReceive() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getReceiveVersion(address _userApplication) external view returns (uint16); } // File: contracts/interfaces/ILayerZeroReceiver.sol pragma solidity >=0.5.0; interface ILayerZeroReceiver { // @notice LayerZero endpoint will invoke this function to deliver the message on the destination // @param _srcChainId - the source endpoint identifier // @param _srcAddress - the source sending contract address from the source chain // @param _nonce - the ordered message nonce // @param _payload - the signed payload is the UA bytes has encoded to be sent function lzReceive( uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload ) external; } // File: contracts/NonblockingReceiver.sol pragma solidity ^0.8.6; abstract contract NonblockingReceiver is Ownable, ILayerZeroReceiver { ILayerZeroEndpoint internal endpoint; struct FailedMessages { uint256 payloadLength; bytes32 payloadHash; } mapping(uint16 => mapping(bytes => mapping(uint256 => FailedMessages))) public failedMessages; mapping(uint16 => bytes) public trustedRemoteLookup; event MessageFailed( uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload ); function lzReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) external override { require(msg.sender == address(endpoint)); // boilerplate! lzReceive must be called by the endpoint for security require( _srcAddress.length == trustedRemoteLookup[_srcChainId].length && keccak256(_srcAddress) == keccak256(trustedRemoteLookup[_srcChainId]), "NonblockingReceiver: invalid source sending contract" ); // try-catch all errors/exceptions // having failed messages does not block messages passing try this.onLzReceive(_srcChainId, _srcAddress, _nonce, _payload) { // do nothing } catch { // error / exception failedMessages[_srcChainId][_srcAddress][_nonce] = FailedMessages( _payload.length, keccak256(_payload) ); emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload); } } function onLzReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) public { // only internal transaction require( msg.sender == address(this), "NonblockingReceiver: caller must be Bridge." ); // handle incoming message _LzReceive(_srcChainId, _srcAddress, _nonce, _payload); } // abstract function function _LzReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) internal virtual; function _lzSend( uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _txParam ) internal { endpoint.send{value: msg.value}( _dstChainId, trustedRemoteLookup[_dstChainId], _payload, _refundAddress, _zroPaymentAddress, _txParam ); } function retryMessage( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes calldata _payload ) external payable { // assert there is message to retry FailedMessages storage failedMsg = failedMessages[_srcChainId][ _srcAddress ][_nonce]; require( failedMsg.payloadHash != bytes32(0), "NonblockingReceiver: no stored message" ); require( _payload.length == failedMsg.payloadLength && keccak256(_payload) == failedMsg.payloadHash, "LayerZero: invalid payload" ); // clear the stored message failedMsg.payloadLength = 0; failedMsg.payloadHash = bytes32(0); // execute the message. revert if it fails again this.onLzReceive(_srcChainId, _srcAddress, _nonce, _payload); } function setTrustedRemote(uint16 _chainId, bytes calldata _trustedRemote) external onlyOwner { trustedRemoteLookup[_chainId] = _trustedRemote; } } pragma solidity >=0.8.13 <0.9.0; contract r0cketflippers is ERC721A, Ownable, ReentrancyGuard, NonblockingReceiver { using Strings for uint256; // ================== Variables Start ======================= // reveal uri - p.s set it in contructor (if sniper proof, else put some dummy text and set the actual revealed uri just before reveal) string public uri; string public uriSuffix = ".json"; // hidden uri - replace it with yours string public hiddenMetadataUri = "ipfs://CID/filename.json"; // prices - replace it with yours uint256 public price = 0.02022 ether; uint256 public freeprice = 0 ether; // supply - replace it with yours uint256 public tokenIDStart = 1016; // starting token id uint256 public supplyLimit = 1006; // limit // max per tx - replace it with yours uint256 public maxMintAmountPerTx = 1; // max per wallet - replace it with yours uint256 public maxLimitPerWallet = 50; // enabled bool public kickflipSale = false; bool public publicSale = false; // bridge enable/ disable bool public bridgeable = false; // claim mapping mapping(address => bool) public kickflipClaimed; // reveal bool public revealed = true; // gasForDestinationLzReceive uint256 gasForDestinationLzReceive = 350000; // collection address address public FreeMintCollection = 0x0D87D35Dc73056484E4E41300A810Dc58aD1D668; // ================== Variables End ======================= // ================== Constructor Start ======================= // Token NAME and SYMBOL - Replace it with yours constructor( string memory _uri, address _layerZeroEndpoint ) ERC721A("r0cket flippers", "r0cket") { seturi(_uri); endpoint = ILayerZeroEndpoint(_layerZeroEndpoint); } // ================== Constructor End ======================= // ================== Mint Functions Start ======================= function Kickflip(uint256 _mintAmount) public payable { // Verify collection requirements IERC721 collection = IERC721(FreeMintCollection); uint256 holderbalance; if(collection.balanceOf(msg.sender) == 0) { holderbalance = 0; } else { holderbalance = collection.balanceOf(msg.sender); } // Normal requirements require(kickflipSale, 'The kickflipSale is paused!'); require(holderbalance != 0, 'You dont own any tokens'); require(_mintAmount > 0 && _mintAmount <= holderbalance, 'Free Mint Exceeded'); require(totalSupply() + _mintAmount <= supplyLimit, 'Max supply exceeded!'); require(msg.value >= freeprice * _mintAmount, 'Insufficient funds!'); require(!kickflipClaimed[_msgSender()], 'Address already claimed!'); kickflipClaimed[_msgSender()] = true; // Mint _safeMint(_msgSender(), _mintAmount); } function PublicMint(uint256 _mintAmount) public payable { // Normal requirements require(publicSale, 'The PublicSale is paused!'); require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, 'Invalid mint amount!'); require(totalSupply() + _mintAmount <= supplyLimit, 'Max supply exceeded!'); require(balanceOf(msg.sender) + _mintAmount <= maxLimitPerWallet, 'Max mint per wallet exceeded!'); require(msg.value >= price * _mintAmount, 'Insufficient funds!'); // Mint _safeMint(_msgSender(), _mintAmount); } function Airdrop(uint256 _mintAmount, address _receiver) public onlyOwner { require(totalSupply() + _mintAmount <= supplyLimit, 'Max supply exceeded!'); _safeMint(_receiver, _mintAmount); } // ================== Mint Functions End ======================= // ================== Set Functions Start ======================= // reveal function setRevealed(bool _state) public onlyOwner { revealed = _state; } // uri function seturi(string memory _uri) public onlyOwner { uri = _uri; } function setUriSuffix(string memory _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix; } function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner { hiddenMetadataUri = _hiddenMetadataUri; } // sales toggle function setpublicSale(bool _publicSale) public onlyOwner { publicSale = _publicSale; } function setkickflipSale(bool _state) public onlyOwner { kickflipSale = _state; } // bridge toggle function setBridgeStatus(bool _state) public onlyOwner { bridgeable = _state; } // max per tx function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner { maxMintAmountPerTx = _maxMintAmountPerTx; } // pax per wallet function setmaxLimitPerWallet(uint256 _maxLimitPerWallet) public onlyOwner { maxLimitPerWallet = _maxLimitPerWallet; } // price function setPrice(uint256 _price) public onlyOwner { price = _price; } function setfreeprice(uint256 _price) public onlyOwner { freeprice = _price; } // supply limit function setsupplyLimit(uint256 _supplyLimit) public onlyOwner { supplyLimit = _supplyLimit; } // collection address function setFreeMintCollectionAddress(address _contractaddress) public onlyOwner { FreeMintCollection = _contractaddress; } // ================== Set Functions End ======================= // ================== Withdraw Function Start ======================= function withdraw() public onlyOwner nonReentrant { //owner withdraw (bool os, ) = payable(owner()).call{value: address(this).balance}(''); require(os); } function donate() external payable { // thank you } // ================== Withdraw Function End======================= // ================== Read Functions Start ======================= function tokensOfOwner(address owner) external view returns (uint256[] memory) { unchecked { uint256[] memory a = new uint256[](balanceOf(owner)); uint256 end = _nextTokenId(); uint256 tokenIdsIdx; address currOwnershipAddr; for (uint256 i; i < end; i++) { TokenOwnership memory ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { a[tokenIdsIdx++] = i; } } return a; } } function _startTokenId() internal view virtual override returns (uint256) { return tokenIDStart; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token'); if (revealed == false) { return hiddenMetadataUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) : ''; } function _baseURI() internal view virtual override returns (string memory) { return uri; } // ================== Read Functions End ======================= // ================== Layer Zero Stuff Start ======================= // This function transfers the nft from your address on the // source chain to the same address on the destination chain function traverseChains(uint16 _chainId, uint256 tokenId) public payable { require( msg.sender == ownerOf(tokenId), "You must own the token to traverse" ); require( trustedRemoteLookup[_chainId].length > 0, "This chain is currently unavailable for travel" ); // burn NFT, eliminating it from circulation on src chain _burn(tokenId); // abi.encode() the payload with the values to send bytes memory payload = abi.encode(msg.sender, tokenId); // encode adapterParams to specify more gas for the destination uint16 version = 1; bytes memory adapterParams = abi.encodePacked( version, gasForDestinationLzReceive ); // get the fees we need to pay to LayerZero + Relayer to cover message delivery // you will be refunded for extra gas paid (uint256 messageFee, ) = endpoint.estimateFees( _chainId, address(this), payload, false, adapterParams ); require( msg.value >= messageFee, "r0cket flippers: msg.value not enough to cover messageFee. Send gas for message fees" ); require(bridgeable, 'The bridge is paused!'); endpoint.send{value: msg.value}( _chainId, // destination chainId trustedRemoteLookup[_chainId], // destination address of nft contract payload, // abi.encoded()'ed bytes payable(msg.sender), // refund address address(0x0), // 'zroPaymentAddress' unused for this adapterParams // txParameters ); } function _LzReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) internal override { // decode (address toAddr, uint256 tokenId) = abi.decode( _payload, (address, uint256) ); // mint the tokens back into existence on destination chain _safeMint(toAddr, tokenId); } // just in case this fixed variable limits us from future integrations function setGasForDestinationLzReceive(uint256 newVal) external onlyOwner { gasForDestinationLzReceive = newVal; } // ================== Layer Zero Stuff End ======================= }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_uri","type":"string"},{"internalType":"address","name":"_layerZeroEndpoint","type":"address"}],"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":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"MessageFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"Airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"FreeMintCollection","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"Kickflip","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"PublicMint","outputs":[],"stateMutability":"payable","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":"bridgeable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"donate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"failedMessages","outputs":[{"internalType":"uint256","name":"payloadLength","type":"uint256"},{"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeprice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"kickflipClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kickflipSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxLimitPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","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":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"onLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setBridgeStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractaddress","type":"address"}],"name":"setFreeMintCollectionAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newVal","type":"uint256"}],"name":"setGasForDestinationLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"bytes","name":"_trustedRemote","type":"bytes"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setfreeprice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setkickflipSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxLimitPerWallet","type":"uint256"}],"name":"setmaxLimitPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_publicSale","type":"bool"}],"name":"setpublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supplyLimit","type":"uint256"}],"name":"setsupplyLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"seturi","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supplyLimit","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":[],"name":"tokenIDStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"traverseChains","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040526005608081905264173539b7b760d91b60a09081526200002891600e91906200028e565b506040805180820190915260188082527f697066733a2f2f4349442f66696c656e616d652e6a736f6e000000000000000060209092019182526200006f91600f916200028e565b506647d5fb9d5bc00060105560006011556103f86012556103ee6013556001601481905560326015556016805462ffffff191690556018805460ff1916909117905562055730601955601a80546001600160a01b031916730d87d35dc73056484e4e41300a810dc58ad1d668179055348015620000eb57600080fd5b50604051620040a4380380620040a48339810160408190526200010e9162000367565b604080518082018252600f81526e7230636b657420666c69707065727360881b6020808301918252835180850190945260068452651c8c18dad95d60d21b90840152815191929162000163916002916200028e565b508051620001799060039060208401906200028e565b5050601254600055506200018d33620001c4565b60016009556200019d8262000216565b600a80546001600160a01b0319166001600160a01b03929092169190911790555062000494565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6008546001600160a01b03163314620002755760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b80516200028a90600d9060208401906200028e565b5050565b8280546200029c9062000458565b90600052602060002090601f016020900481019282620002c057600085556200030b565b82601f10620002db57805160ff19168380011785556200030b565b828001600101855582156200030b579182015b828111156200030b578251825591602001919060010190620002ee565b50620003199291506200031d565b5090565b5b808211156200031957600081556001016200031e565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b03811681146200036257600080fd5b919050565b600080604083850312156200037b57600080fd5b82516001600160401b03808211156200039357600080fd5b818501915085601f830112620003a857600080fd5b815181811115620003bd57620003bd62000334565b604051601f8201601f19908116603f01168101908382118183101715620003e857620003e862000334565b816040528281526020935088848487010111156200040557600080fd5b600091505b828210156200042957848201840151818301850152908301906200040a565b828211156200043b5760008484830101525b95506200044d9150508582016200034a565b925050509250929050565b600181811c908216806200046d57607f821691505b6020821081036200048e57634e487b7160e01b600052602260045260246000fd5b50919050565b613c0080620004a46000396000f3fe60806040526004361061038a5760003560e01c80637512ecfd116101dc578063b071401b11610102578063e0a80853116100a0578063ed88c68e1161006f578063ed88c68e146103af578063f2fde38b14610a63578063f4fb584614610a83578063f648498014610ab357600080fd5b8063e0a80853146109c5578063e985e9c5146109e5578063eac989f814610a2e578063eb8d72b714610a4357600080fd5b8063cf89fa03116100dc578063cf89fa031461095f578063d1deba1f14610972578063d58a848314610985578063d9f0a671146109a557600080fd5b8063b071401b146108ff578063b88d4fde1461091f578063c87b56dd1461093f57600080fd5b806391b7f5ed1161017a5780639fb17e34116101495780639fb17e34146108a1578063a035b1fe146108b4578063a22cb465146108ca578063a45ba8e7146108ea57600080fd5b806391b7f5ed1461083657806394354fd014610856578063943fb8721461086c57806395d89b411461088c57600080fd5b8063801903a4116101b6578063801903a4146107665780638462151c146107805780638da5cb5b146107ad5780638ee74912146107cb57600080fd5b80637512ecfd146107105780637533d788146107265780637871e1541461074657600080fd5b80633fbc67c5116102c15780635503a0e81161025f5780636352211e1161022e5780636352211e146106a857806370a08231146106c8578063715018a6146106e85780637454430b146106fd57600080fd5b80635503a0e81461063d578063596cf96e146106525780635a0b8b23146106725780635c22abd21461068857600080fd5b80634deb86751161029b5780634deb8675146105cd5780634fdd43cb146105e35780635183022714610603578063530da8ef1461061d57600080fd5b80633fbc67c51461056d57806340e1c23c1461058d57806342842e0e146105ad57600080fd5b806318160ddd1161032e57806323b872dd1161030857806323b872dd146104f957806331d97bc31461051957806333bc1c5c146105395780633ccfd60b1461055857600080fd5b806318160ddd146104a057806319d1997a146104c35780631c37a822146104d957600080fd5b806306fdde031161036a57806306fdde0314610406578063081812fc14610428578063095ea7b31461046057806316ba10e01461048057600080fd5b80621d35671461038f57806275770a146103b157806301ffc9a7146103d1575b600080fd5b34801561039b57600080fd5b506103af6103aa3660046131e8565b610ad3565b005b3480156103bd57600080fd5b506103af6103cc36600461326d565b610cd7565b3480156103dd57600080fd5b506103f16103ec36600461329c565b610d24565b60405190151581526020015b60405180910390f35b34801561041257600080fd5b5061041b610dc1565b6040516103fd9190613311565b34801561043457600080fd5b5061044861044336600461326d565b610e53565b6040516001600160a01b0390911681526020016103fd565b34801561046c57600080fd5b506103af61047b366004613339565b610eb0565b34801561048c57600080fd5b506103af61049b366004613365565b610f76565b3480156104ac57600080fd5b506104b5610fd5565b6040519081526020016103fd565b3480156104cf57600080fd5b506104b560135481565b3480156104e557600080fd5b506103af6104f43660046131e8565b610fed565b34801561050557600080fd5b506103af6105143660046133ae565b61106e565b34801561052557600080fd5b50601a54610448906001600160a01b031681565b34801561054557600080fd5b506016546103f190610100900460ff1681565b34801561056457600080fd5b506103af611244565b34801561057957600080fd5b506103af6105883660046133ef565b61135c565b34801561059957600080fd5b506103af6105a836600461341c565b6113d3565b3480156105b957600080fd5b506103af6105c83660046133ae565b61142e565b3480156105d957600080fd5b506104b560125481565b3480156105ef57600080fd5b506103af6105fe366004613365565b61144e565b34801561060f57600080fd5b506018546103f19060ff1681565b34801561062957600080fd5b506016546103f19062010000900460ff1681565b34801561064957600080fd5b5061041b6114a9565b34801561065e57600080fd5b506103af61066d36600461326d565b611537565b34801561067e57600080fd5b506104b560155481565b34801561069457600080fd5b506103af6106a336600461341c565b611584565b3480156106b457600080fd5b506104486106c336600461326d565b6115e6565b3480156106d457600080fd5b506104b56106e33660046133ef565b6115f1565b3480156106f457600080fd5b506103af611659565b6103af61070b36600461326d565b6116ad565b34801561071c57600080fd5b506104b560115481565b34801561073257600080fd5b5061041b610741366004613437565b6119db565b34801561075257600080fd5b506103af610761366004613452565b6119f4565b34801561077257600080fd5b506016546103f19060ff1681565b34801561078c57600080fd5b506107a061079b3660046133ef565b611aaa565b6040516103fd9190613482565b3480156107b957600080fd5b506008546001600160a01b0316610448565b3480156107d757600080fd5b506108216107e63660046134c6565b600b60209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015482565b604080519283526020830191909152016103fd565b34801561084257600080fd5b506103af61085136600461326d565b611b9c565b34801561086257600080fd5b506104b560145481565b34801561087857600080fd5b506103af61088736600461326d565b611be9565b34801561089857600080fd5b5061041b611c36565b6103af6108af36600461326d565b611c45565b3480156108c057600080fd5b506104b560105481565b3480156108d657600080fd5b506103af6108e536600461351d565b611e2d565b3480156108f657600080fd5b5061041b611edb565b34801561090b57600080fd5b506103af61091a36600461326d565b611ee8565b34801561092b57600080fd5b506103af61093a366004613552565b611f35565b34801561094b57600080fd5b5061041b61095a36600461326d565b611f79565b6103af61096d3660046135b2565b6120f6565b6103af610980366004613617565b6124ae565b34801561099157600080fd5b506103af6109a036600461341c565b612653565b3480156109b157600080fd5b506103af6109c036600461326d565b6126b7565b3480156109d157600080fd5b506103af6109e036600461341c565b612704565b3480156109f157600080fd5b506103f1610a003660046136a3565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610a3a57600080fd5b5061041b61275f565b348015610a4f57600080fd5b506103af610a5e3660046136d1565b61276c565b348015610a6f57600080fd5b506103af610a7e3660046133ef565b6127d2565b348015610a8f57600080fd5b506103f1610a9e3660046133ef565b60176020526000908152604090205460ff1681565b348015610abf57600080fd5b506103af610ace366004613365565b61289f565b600a546001600160a01b03163314610aea57600080fd5b61ffff84166000908152600c602052604090208054610b0890613724565b90508351148015610b47575061ffff84166000908152600c6020526040908190209051610b3591906137cd565b60405180910390208380519060200120145b610bbe5760405162461bcd60e51b815260206004820152603460248201527f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f7560448201527f7263652073656e64696e6720636f6e747261637400000000000000000000000060648201526084015b60405180910390fd5b604051630e1bd41160e11b81523090631c37a82290610be79087908790879087906004016137d9565b600060405180830381600087803b158015610c0157600080fd5b505af1925050508015610c12575060015b610cd1576040518060400160405280825181526020018280519060200120815250600b60008661ffff1661ffff16815260200190815260200160002084604051610c5c9190613823565b90815260408051918290036020908101832067ffffffffffffffff8716600090815290825291909120835181559201516001909201919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d90610cc89086908690869086906137d9565b60405180910390a15b50505050565b6008546001600160a01b03163314610d1f5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601355565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b031983161480610d8757507f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610dbb57507f5b5e139f000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b606060028054610dd090613724565b80601f0160208091040260200160405190810160405280929190818152602001828054610dfc90613724565b8015610e495780601f10610e1e57610100808354040283529160200191610e49565b820191906000526020600020905b815481529060010190602001808311610e2c57829003601f168201915b5050505050905090565b6000610e5e826128fa565b610e94576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610ebb826115e6565b9050336001600160a01b03821614610f0d57610ed78133610a00565b610f0d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260066020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b03163314610fbe5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b8051610fd190600e906020840190613000565b5050565b6000610fe060125490565b6001546000540303905090565b3330146110625760405162461bcd60e51b815260206004820152602b60248201527f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460448201527f206265204272696467652e0000000000000000000000000000000000000000006064820152608401610bb5565b610cd184848484612936565b60006110798261295b565b9050836001600160a01b0316816001600160a01b0316146110c6576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260066020526040902080546110f28187335b6001600160a01b039081169116811491141790565b61111d576111008633610a00565b61111d57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661115d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b801561116857600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b841690036111fa576001840160008181526004602052604081205490036111f85760005481146111f85760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6008546001600160a01b0316331461128c5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b6002600954036112de5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bb5565b600260095560006112f76008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114611341576040519150601f19603f3d011682016040523d82523d6000602084013e611346565b606091505b505090508061135457600080fd5b506001600955565b6008546001600160a01b031633146113a45760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601a805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6008546001600160a01b0316331461141b5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b6016805460ff1916911515919091179055565b61144983838360405180602001604052806000815250611f35565b505050565b6008546001600160a01b031633146114965760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b8051610fd190600f906020840190613000565b600e80546114b690613724565b80601f01602080910402602001604051908101604052809291908181526020018280546114e290613724565b801561152f5780601f106115045761010080835404028352916020019161152f565b820191906000526020600020905b81548152906001019060200180831161151257829003601f168201915b505050505081565b6008546001600160a01b0316331461157f5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601155565b6008546001600160a01b031633146115cc5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601680549115156101000261ff0019909216919091179055565b6000610dbb8261295b565b60006001600160a01b038216611633576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b031633146116a15760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b6116ab60006129ea565b565b601a546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa1580156116fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171e919061383f565b60000361172d57506000611798565b6040516370a0823160e01b81523360048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015611771573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611795919061383f565b90505b60165460ff166117ea5760405162461bcd60e51b815260206004820152601b60248201527f546865206b69636b666c697053616c65206973207061757365642100000000006044820152606401610bb5565b8060000361183a5760405162461bcd60e51b815260206004820152601760248201527f596f7520646f6e74206f776e20616e7920746f6b656e730000000000000000006044820152606401610bb5565b60008311801561184a5750808311155b6118965760405162461bcd60e51b815260206004820152601260248201527f46726565204d696e7420457863656564656400000000000000000000000000006044820152606401610bb5565b601354836118a2610fd5565b6118ac919061386e565b11156118fa5760405162461bcd60e51b815260206004820152601460248201527f4d617820737570706c79206578636565646564210000000000000000000000006044820152606401610bb5565b826011546119089190613886565b3410156119575760405162461bcd60e51b815260206004820152601360248201527f496e73756666696369656e742066756e647321000000000000000000000000006044820152606401610bb5565b3360009081526017602052604090205460ff16156119b75760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c726561647920636c61696d65642100000000000000006044820152606401610bb5565b336000818152601760205260409020805460ff191660011790556114499084612a49565b600c60205260009081526040902080546114b690613724565b6008546001600160a01b03163314611a3c5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b60135482611a48610fd5565b611a52919061386e565b1115611aa05760405162461bcd60e51b815260206004820152601460248201527f4d617820737570706c79206578636565646564210000000000000000000000006044820152606401610bb5565b610fd18183612a49565b60606000611ab7836115f1565b67ffffffffffffffff811115611acf57611acf613124565b604051908082528060200260200182016040528015611af8578160200160208202803683370190505b5090506000611b0660005490565b905060008060005b83811015611b91576000611b2182612a63565b9050806040015115611b335750611b89565b80516001600160a01b031615611b4857805192505b876001600160a01b0316836001600160a01b031603611b875781868580600101965081518110611b7a57611b7a6138a5565b6020026020010181815250505b505b600101611b0e565b509295945050505050565b6008546001600160a01b03163314611be45760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601055565b6008546001600160a01b03163314611c315760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601955565b606060038054610dd090613724565b601654610100900460ff16611c9c5760405162461bcd60e51b815260206004820152601960248201527f546865205075626c696353616c652069732070617573656421000000000000006044820152606401610bb5565b600081118015611cae57506014548111155b611cfa5760405162461bcd60e51b815260206004820152601460248201527f496e76616c6964206d696e7420616d6f756e74210000000000000000000000006044820152606401610bb5565b60135481611d06610fd5565b611d10919061386e565b1115611d5e5760405162461bcd60e51b815260206004820152601460248201527f4d617820737570706c79206578636565646564210000000000000000000000006044820152606401610bb5565b60155481611d6b336115f1565b611d75919061386e565b1115611dc35760405162461bcd60e51b815260206004820152601d60248201527f4d6178206d696e74207065722077616c6c6574206578636565646564210000006044820152606401610bb5565b80601054611dd19190613886565b341015611e205760405162461bcd60e51b815260206004820152601360248201527f496e73756666696369656e742066756e647321000000000000000000000000006044820152606401610bb5565b611e2a3382612a49565b50565b336001600160a01b03831603611e6f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600f80546114b690613724565b6008546001600160a01b03163314611f305760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601455565b611f4084848461106e565b6001600160a01b0383163b15610cd157611f5c84848484612ae2565b610cd1576040516368d2bf6b60e11b815260040160405180910390fd5b6060611f84826128fa565b611ff65760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610bb5565b60185460ff16151560000361209757600f805461201290613724565b80601f016020809104026020016040519081016040528092919081815260200182805461203e90613724565b801561208b5780601f106120605761010080835404028352916020019161208b565b820191906000526020600020905b81548152906001019060200180831161206e57829003601f168201915b50505050509050919050565b60006120a1612bce565b905060008151116120c157604051806020016040528060008152506120ef565b806120cb84612bdd565b600e6040516020016120df939291906138bb565b6040516020818303038152906040525b9392505050565b6120ff816115e6565b6001600160a01b0316336001600160a01b0316146121855760405162461bcd60e51b815260206004820152602260248201527f596f75206d757374206f776e2074686520746f6b656e20746f2074726176657260448201527f73650000000000000000000000000000000000000000000000000000000000006064820152608401610bb5565b61ffff82166000908152600c6020526040812080546121a390613724565b9050116122185760405162461bcd60e51b815260206004820152602e60248201527f5468697320636861696e2069732063757272656e746c7920756e617661696c6160448201527f626c6520666f722074726176656c0000000000000000000000000000000000006064820152608401610bb5565b61222181612d12565b604080513360208201528082018390528151808203830181526060820183526019547e0100000000000000000000000000000000000000000000000000000000000060808401526082808401919091528351808403909101815260a2830193849052600a547f40a7bb100000000000000000000000000000000000000000000000000000000090945290926001926000916001600160a01b0316906340a7bb10906122d8908990309089908790899060a6016138ed565b6040805180830381865afa1580156122f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612318919061393f565b509050803410156123b75760405162461bcd60e51b815260206004820152605460248201527f7230636b657420666c6970706572733a206d73672e76616c7565206e6f74206560448201527f6e6f75676820746f20636f766572206d6573736167654665652e2053656e642060648201527f67617320666f72206d6573736167652066656573000000000000000000000000608482015260a401610bb5565b60165462010000900460ff1661240f5760405162461bcd60e51b815260206004820152601560248201527f54686520627269646765206973207061757365642100000000000000000000006044820152606401610bb5565b600a5461ffff87166000908152600c602052604080822090517fc58031000000000000000000000000000000000000000000000000000000000081526001600160a01b039093169263c5803100923492612474928c928b913391908b90600401613963565b6000604051808303818588803b15801561248d57600080fd5b505af11580156124a1573d6000803e3d6000fd5b5050505050505050505050565b61ffff85166000908152600b602052604080822090516124cf908790613823565b908152604080516020928190038301902067ffffffffffffffff8716600090815292529020600181015490915061256e5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60448201527f65737361676500000000000000000000000000000000000000000000000000006064820152608401610bb5565b80548214801561259857508060010154838360405161258e929190613a43565b6040518091039020145b6125e45760405162461bcd60e51b815260206004820152601a60248201527f4c617965725a65726f3a20696e76616c6964207061796c6f61640000000000006044820152606401610bb5565b60008082556001820155604051630e1bd41160e11b81523090631c37a822906126199089908990899089908990600401613a53565b600060405180830381600087803b15801561263357600080fd5b505af1158015612647573d6000803e3d6000fd5b50505050505050505050565b6008546001600160a01b0316331461269b5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b60168054911515620100000262ff000019909216919091179055565b6008546001600160a01b031633146126ff5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601555565b6008546001600160a01b0316331461274c5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b6018805460ff1916911515919091179055565b600d80546114b690613724565b6008546001600160a01b031633146127b45760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b61ffff83166000908152600c60205260409020610cd1908383613084565b6008546001600160a01b0316331461281a5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b6001600160a01b0381166128965760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610bb5565b611e2a816129ea565b6008546001600160a01b031633146128e75760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b8051610fd190600d906020840190613000565b60008161290660125490565b11158015612915575060005482105b8015610dbb575050600090815260046020526040902054600160e01b161590565b6000808280602001905181019061294d9190613ab5565b9150915061123c8282612a49565b6000818061296860125490565b116129b8576000548110156129b85760008181526004602052604081205490600160e01b821690036129b6575b806000036120ef575060001901600081815260046020526040902054612995565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610fd1828260405180602001604052806000815250612d1d565b604080516080810182526000808252602082018190529181018290526060810191909152600082815260046020526040902054610dbb90604080516080810182526001600160a01b038316815260a083901c67ffffffffffffffff166020820152600160e01b831615159181019190915260e89190911c606082015290565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612b17903390899088908890600401613ae3565b6020604051808303816000875af1925050508015612b52575060408051601f3d908101601f19168201909252612b4f91810190613b1f565b60015b612bb0573d808015612b80576040519150601f19603f3d011682016040523d82523d6000602084013e612b85565b606091505b508051600003612ba8576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600d8054610dd090613724565b606081600003612c2057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612c4a5780612c3481613b3c565b9150612c439050600a83613b6b565b9150612c24565b60008167ffffffffffffffff811115612c6557612c65613124565b6040519080825280601f01601f191660200182016040528015612c8f576020820181803683370190505b5090505b8415612bc657612ca4600183613b7f565b9150612cb1600a86613b96565b612cbc90603061386e565b60f81b818381518110612cd157612cd16138a5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612d0b600a86613b6b565b9450612c93565b611e2a816000612d8a565b612d278383612eed565b6001600160a01b0383163b15611449576000548281035b612d516000868380600101945086612ae2565b612d6e576040516368d2bf6b60e11b815260040160405180910390fd5b818110612d3e578160005414612d8357600080fd5b5050505050565b6000612d958361295b565b905080600080612db386600090815260066020526040902080549091565b915091508415612df357612dc88184336110dd565b612df357612dd68333610a00565b612df357604051632ce44b5f60e11b815260040160405180910390fd5b8015612dfe57600082555b6001600160a01b038316600081815260056020526040902080546fffffffffffffffffffffffffffffffff0190554260a01b177c030000000000000000000000000000000000000000000000000000000017600087815260046020526040812091909155600160e11b85169003612ea557600186016000818152600460205260408120549003612ea3576000548114612ea35760008181526004602052604090208590555b505b60405186906000906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050600180548101905550505050565b6000546001600160a01b038316612f30576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600003612f6a576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038316600081815260056020526040902080546801000000000000000185020190554260a01b6001841460e11b1717600082815260046020526040902055808281015b6040516001830192906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210612fb45760005550505050565b82805461300c90613724565b90600052602060002090601f01602090048101928261302e5760008555613074565b82601f1061304757805160ff1916838001178555613074565b82800160010185558215613074579182015b82811115613074578251825591602001919060010190613059565b506130809291506130f8565b5090565b82805461309090613724565b90600052602060002090601f0160209004810192826130b25760008555613074565b82601f106130cb5782800160ff19823516178555613074565b82800160010185558215613074579182015b828111156130745782358255916020019190600101906130dd565b5b8082111561308057600081556001016130f9565b803561ffff8116811461311f57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561315557613155613124565b604051601f8501601f19908116603f0116810190828211818310171561317d5761317d613124565b8160405280935085815286868601111561319657600080fd5b858560208301376000602087830101525050509392505050565b600082601f8301126131c157600080fd5b6120ef8383356020850161313a565b803567ffffffffffffffff8116811461311f57600080fd5b600080600080608085870312156131fe57600080fd5b6132078561310d565b9350602085013567ffffffffffffffff8082111561322457600080fd5b613230888389016131b0565b945061323e604088016131d0565b9350606087013591508082111561325457600080fd5b50613261878288016131b0565b91505092959194509250565b60006020828403121561327f57600080fd5b5035919050565b6001600160e01b031981168114611e2a57600080fd5b6000602082840312156132ae57600080fd5b81356120ef81613286565b60005b838110156132d45781810151838201526020016132bc565b83811115610cd15750506000910152565b600081518084526132fd8160208601602086016132b9565b601f01601f19169290920160200192915050565b6020815260006120ef60208301846132e5565b6001600160a01b0381168114611e2a57600080fd5b6000806040838503121561334c57600080fd5b823561335781613324565b946020939093013593505050565b60006020828403121561337757600080fd5b813567ffffffffffffffff81111561338e57600080fd5b8201601f8101841361339f57600080fd5b612bc68482356020840161313a565b6000806000606084860312156133c357600080fd5b83356133ce81613324565b925060208401356133de81613324565b929592945050506040919091013590565b60006020828403121561340157600080fd5b81356120ef81613324565b8035801515811461311f57600080fd5b60006020828403121561342e57600080fd5b6120ef8261340c565b60006020828403121561344957600080fd5b6120ef8261310d565b6000806040838503121561346557600080fd5b82359150602083013561347781613324565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b818110156134ba5783518352928401929184019160010161349e565b50909695505050505050565b6000806000606084860312156134db57600080fd5b6134e48461310d565b9250602084013567ffffffffffffffff81111561350057600080fd5b61350c868287016131b0565b925050604084013590509250925092565b6000806040838503121561353057600080fd5b823561353b81613324565b91506135496020840161340c565b90509250929050565b6000806000806080858703121561356857600080fd5b843561357381613324565b9350602085013561358381613324565b925060408501359150606085013567ffffffffffffffff8111156135a657600080fd5b613261878288016131b0565b600080604083850312156135c557600080fd5b6133578361310d565b60008083601f8401126135e057600080fd5b50813567ffffffffffffffff8111156135f857600080fd5b60208301915083602082850101111561361057600080fd5b9250929050565b60008060008060006080868803121561362f57600080fd5b6136388661310d565b9450602086013567ffffffffffffffff8082111561365557600080fd5b61366189838a016131b0565b955061366f604089016131d0565b9450606088013591508082111561368557600080fd5b50613692888289016135ce565b969995985093965092949392505050565b600080604083850312156136b657600080fd5b82356136c181613324565b9150602083013561347781613324565b6000806000604084860312156136e657600080fd5b6136ef8461310d565b9250602084013567ffffffffffffffff81111561370b57600080fd5b613717868287016135ce565b9497909650939450505050565b600181811c9082168061373857607f821691505b60208210810361375857634e487b7160e01b600052602260045260246000fd5b50919050565b6000815461376b81613724565b600182811680156137835760018114613794576137c3565b60ff198416875282870194506137c3565b8560005260208060002060005b858110156137ba5781548a8201529084019082016137a1565b50505082870194505b5050505092915050565b60006120ef828461375e565b61ffff851681526080602082015260006137f660808301866132e5565b67ffffffffffffffff85166040840152828103606084015261381881856132e5565b979650505050505050565b600082516138358184602087016132b9565b9190910192915050565b60006020828403121561385157600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561388157613881613858565b500190565b60008160001904831182151516156138a0576138a0613858565b500290565b634e487b7160e01b600052603260045260246000fd5b600084516138cd8184602089016132b9565b8451908301906138e18183602089016132b9565b6138188183018661375e565b61ffff861681526001600160a01b038516602082015260a06040820152600061391960a08301866132e5565b8415156060840152828103608084015261393381856132e5565b98975050505050505050565b6000806040838503121561395257600080fd5b505080516020909101519092909150565b61ffff871681526000602060c0818401526000885461398181613724565b8060c087015260e06001808416600081146139a357600181146139b8576139e6565b60ff19851689840152610100890195506139e6565b8d6000528660002060005b858110156139de5781548b82018601529083019088016139c3565b8a0184019650505b505050505083810360408501526139fd81896132e5565b915050613a1560608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a0840152613a3681856132e5565b9998505050505050505050565b8183823760009101908152919050565b61ffff86168152608060208201526000613a7060808301876132e5565b67ffffffffffffffff861660408401528281036060840152838152838560208301376000602085830101526020601f19601f8601168201019150509695505050505050565b60008060408385031215613ac857600080fd5b8251613ad381613324565b6020939093015192949293505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613b1560808301846132e5565b9695505050505050565b600060208284031215613b3157600080fd5b81516120ef81613286565b600060018201613b4e57613b4e613858565b5060010190565b634e487b7160e01b600052601260045260246000fd5b600082613b7a57613b7a613b55565b500490565b600082821015613b9157613b91613858565b500390565b600082613ba557613ba5613b55565b50069056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122053953fab0fb484c4824d187b273727cbc7ac8abf42ba7c4aa7c7e2da07a28ff164736f6c634300080e0033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d577a793165544172757a41794b615863324e69467273434a7a426e414147555636777435526d314b554b6a382f000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061038a5760003560e01c80637512ecfd116101dc578063b071401b11610102578063e0a80853116100a0578063ed88c68e1161006f578063ed88c68e146103af578063f2fde38b14610a63578063f4fb584614610a83578063f648498014610ab357600080fd5b8063e0a80853146109c5578063e985e9c5146109e5578063eac989f814610a2e578063eb8d72b714610a4357600080fd5b8063cf89fa03116100dc578063cf89fa031461095f578063d1deba1f14610972578063d58a848314610985578063d9f0a671146109a557600080fd5b8063b071401b146108ff578063b88d4fde1461091f578063c87b56dd1461093f57600080fd5b806391b7f5ed1161017a5780639fb17e34116101495780639fb17e34146108a1578063a035b1fe146108b4578063a22cb465146108ca578063a45ba8e7146108ea57600080fd5b806391b7f5ed1461083657806394354fd014610856578063943fb8721461086c57806395d89b411461088c57600080fd5b8063801903a4116101b6578063801903a4146107665780638462151c146107805780638da5cb5b146107ad5780638ee74912146107cb57600080fd5b80637512ecfd146107105780637533d788146107265780637871e1541461074657600080fd5b80633fbc67c5116102c15780635503a0e81161025f5780636352211e1161022e5780636352211e146106a857806370a08231146106c8578063715018a6146106e85780637454430b146106fd57600080fd5b80635503a0e81461063d578063596cf96e146106525780635a0b8b23146106725780635c22abd21461068857600080fd5b80634deb86751161029b5780634deb8675146105cd5780634fdd43cb146105e35780635183022714610603578063530da8ef1461061d57600080fd5b80633fbc67c51461056d57806340e1c23c1461058d57806342842e0e146105ad57600080fd5b806318160ddd1161032e57806323b872dd1161030857806323b872dd146104f957806331d97bc31461051957806333bc1c5c146105395780633ccfd60b1461055857600080fd5b806318160ddd146104a057806319d1997a146104c35780631c37a822146104d957600080fd5b806306fdde031161036a57806306fdde0314610406578063081812fc14610428578063095ea7b31461046057806316ba10e01461048057600080fd5b80621d35671461038f57806275770a146103b157806301ffc9a7146103d1575b600080fd5b34801561039b57600080fd5b506103af6103aa3660046131e8565b610ad3565b005b3480156103bd57600080fd5b506103af6103cc36600461326d565b610cd7565b3480156103dd57600080fd5b506103f16103ec36600461329c565b610d24565b60405190151581526020015b60405180910390f35b34801561041257600080fd5b5061041b610dc1565b6040516103fd9190613311565b34801561043457600080fd5b5061044861044336600461326d565b610e53565b6040516001600160a01b0390911681526020016103fd565b34801561046c57600080fd5b506103af61047b366004613339565b610eb0565b34801561048c57600080fd5b506103af61049b366004613365565b610f76565b3480156104ac57600080fd5b506104b5610fd5565b6040519081526020016103fd565b3480156104cf57600080fd5b506104b560135481565b3480156104e557600080fd5b506103af6104f43660046131e8565b610fed565b34801561050557600080fd5b506103af6105143660046133ae565b61106e565b34801561052557600080fd5b50601a54610448906001600160a01b031681565b34801561054557600080fd5b506016546103f190610100900460ff1681565b34801561056457600080fd5b506103af611244565b34801561057957600080fd5b506103af6105883660046133ef565b61135c565b34801561059957600080fd5b506103af6105a836600461341c565b6113d3565b3480156105b957600080fd5b506103af6105c83660046133ae565b61142e565b3480156105d957600080fd5b506104b560125481565b3480156105ef57600080fd5b506103af6105fe366004613365565b61144e565b34801561060f57600080fd5b506018546103f19060ff1681565b34801561062957600080fd5b506016546103f19062010000900460ff1681565b34801561064957600080fd5b5061041b6114a9565b34801561065e57600080fd5b506103af61066d36600461326d565b611537565b34801561067e57600080fd5b506104b560155481565b34801561069457600080fd5b506103af6106a336600461341c565b611584565b3480156106b457600080fd5b506104486106c336600461326d565b6115e6565b3480156106d457600080fd5b506104b56106e33660046133ef565b6115f1565b3480156106f457600080fd5b506103af611659565b6103af61070b36600461326d565b6116ad565b34801561071c57600080fd5b506104b560115481565b34801561073257600080fd5b5061041b610741366004613437565b6119db565b34801561075257600080fd5b506103af610761366004613452565b6119f4565b34801561077257600080fd5b506016546103f19060ff1681565b34801561078c57600080fd5b506107a061079b3660046133ef565b611aaa565b6040516103fd9190613482565b3480156107b957600080fd5b506008546001600160a01b0316610448565b3480156107d757600080fd5b506108216107e63660046134c6565b600b60209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015482565b604080519283526020830191909152016103fd565b34801561084257600080fd5b506103af61085136600461326d565b611b9c565b34801561086257600080fd5b506104b560145481565b34801561087857600080fd5b506103af61088736600461326d565b611be9565b34801561089857600080fd5b5061041b611c36565b6103af6108af36600461326d565b611c45565b3480156108c057600080fd5b506104b560105481565b3480156108d657600080fd5b506103af6108e536600461351d565b611e2d565b3480156108f657600080fd5b5061041b611edb565b34801561090b57600080fd5b506103af61091a36600461326d565b611ee8565b34801561092b57600080fd5b506103af61093a366004613552565b611f35565b34801561094b57600080fd5b5061041b61095a36600461326d565b611f79565b6103af61096d3660046135b2565b6120f6565b6103af610980366004613617565b6124ae565b34801561099157600080fd5b506103af6109a036600461341c565b612653565b3480156109b157600080fd5b506103af6109c036600461326d565b6126b7565b3480156109d157600080fd5b506103af6109e036600461341c565b612704565b3480156109f157600080fd5b506103f1610a003660046136a3565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610a3a57600080fd5b5061041b61275f565b348015610a4f57600080fd5b506103af610a5e3660046136d1565b61276c565b348015610a6f57600080fd5b506103af610a7e3660046133ef565b6127d2565b348015610a8f57600080fd5b506103f1610a9e3660046133ef565b60176020526000908152604090205460ff1681565b348015610abf57600080fd5b506103af610ace366004613365565b61289f565b600a546001600160a01b03163314610aea57600080fd5b61ffff84166000908152600c602052604090208054610b0890613724565b90508351148015610b47575061ffff84166000908152600c6020526040908190209051610b3591906137cd565b60405180910390208380519060200120145b610bbe5760405162461bcd60e51b815260206004820152603460248201527f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f7560448201527f7263652073656e64696e6720636f6e747261637400000000000000000000000060648201526084015b60405180910390fd5b604051630e1bd41160e11b81523090631c37a82290610be79087908790879087906004016137d9565b600060405180830381600087803b158015610c0157600080fd5b505af1925050508015610c12575060015b610cd1576040518060400160405280825181526020018280519060200120815250600b60008661ffff1661ffff16815260200190815260200160002084604051610c5c9190613823565b90815260408051918290036020908101832067ffffffffffffffff8716600090815290825291909120835181559201516001909201919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d90610cc89086908690869086906137d9565b60405180910390a15b50505050565b6008546001600160a01b03163314610d1f5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601355565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b031983161480610d8757507f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610dbb57507f5b5e139f000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b606060028054610dd090613724565b80601f0160208091040260200160405190810160405280929190818152602001828054610dfc90613724565b8015610e495780601f10610e1e57610100808354040283529160200191610e49565b820191906000526020600020905b815481529060010190602001808311610e2c57829003601f168201915b5050505050905090565b6000610e5e826128fa565b610e94576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610ebb826115e6565b9050336001600160a01b03821614610f0d57610ed78133610a00565b610f0d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260066020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b03163314610fbe5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b8051610fd190600e906020840190613000565b5050565b6000610fe060125490565b6001546000540303905090565b3330146110625760405162461bcd60e51b815260206004820152602b60248201527f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460448201527f206265204272696467652e0000000000000000000000000000000000000000006064820152608401610bb5565b610cd184848484612936565b60006110798261295b565b9050836001600160a01b0316816001600160a01b0316146110c6576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260066020526040902080546110f28187335b6001600160a01b039081169116811491141790565b61111d576111008633610a00565b61111d57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661115d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b801561116857600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b841690036111fa576001840160008181526004602052604081205490036111f85760005481146111f85760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6008546001600160a01b0316331461128c5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b6002600954036112de5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bb5565b600260095560006112f76008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114611341576040519150601f19603f3d011682016040523d82523d6000602084013e611346565b606091505b505090508061135457600080fd5b506001600955565b6008546001600160a01b031633146113a45760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601a805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6008546001600160a01b0316331461141b5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b6016805460ff1916911515919091179055565b61144983838360405180602001604052806000815250611f35565b505050565b6008546001600160a01b031633146114965760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b8051610fd190600f906020840190613000565b600e80546114b690613724565b80601f01602080910402602001604051908101604052809291908181526020018280546114e290613724565b801561152f5780601f106115045761010080835404028352916020019161152f565b820191906000526020600020905b81548152906001019060200180831161151257829003601f168201915b505050505081565b6008546001600160a01b0316331461157f5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601155565b6008546001600160a01b031633146115cc5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601680549115156101000261ff0019909216919091179055565b6000610dbb8261295b565b60006001600160a01b038216611633576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b031633146116a15760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b6116ab60006129ea565b565b601a546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa1580156116fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171e919061383f565b60000361172d57506000611798565b6040516370a0823160e01b81523360048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015611771573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611795919061383f565b90505b60165460ff166117ea5760405162461bcd60e51b815260206004820152601b60248201527f546865206b69636b666c697053616c65206973207061757365642100000000006044820152606401610bb5565b8060000361183a5760405162461bcd60e51b815260206004820152601760248201527f596f7520646f6e74206f776e20616e7920746f6b656e730000000000000000006044820152606401610bb5565b60008311801561184a5750808311155b6118965760405162461bcd60e51b815260206004820152601260248201527f46726565204d696e7420457863656564656400000000000000000000000000006044820152606401610bb5565b601354836118a2610fd5565b6118ac919061386e565b11156118fa5760405162461bcd60e51b815260206004820152601460248201527f4d617820737570706c79206578636565646564210000000000000000000000006044820152606401610bb5565b826011546119089190613886565b3410156119575760405162461bcd60e51b815260206004820152601360248201527f496e73756666696369656e742066756e647321000000000000000000000000006044820152606401610bb5565b3360009081526017602052604090205460ff16156119b75760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c726561647920636c61696d65642100000000000000006044820152606401610bb5565b336000818152601760205260409020805460ff191660011790556114499084612a49565b600c60205260009081526040902080546114b690613724565b6008546001600160a01b03163314611a3c5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b60135482611a48610fd5565b611a52919061386e565b1115611aa05760405162461bcd60e51b815260206004820152601460248201527f4d617820737570706c79206578636565646564210000000000000000000000006044820152606401610bb5565b610fd18183612a49565b60606000611ab7836115f1565b67ffffffffffffffff811115611acf57611acf613124565b604051908082528060200260200182016040528015611af8578160200160208202803683370190505b5090506000611b0660005490565b905060008060005b83811015611b91576000611b2182612a63565b9050806040015115611b335750611b89565b80516001600160a01b031615611b4857805192505b876001600160a01b0316836001600160a01b031603611b875781868580600101965081518110611b7a57611b7a6138a5565b6020026020010181815250505b505b600101611b0e565b509295945050505050565b6008546001600160a01b03163314611be45760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601055565b6008546001600160a01b03163314611c315760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601955565b606060038054610dd090613724565b601654610100900460ff16611c9c5760405162461bcd60e51b815260206004820152601960248201527f546865205075626c696353616c652069732070617573656421000000000000006044820152606401610bb5565b600081118015611cae57506014548111155b611cfa5760405162461bcd60e51b815260206004820152601460248201527f496e76616c6964206d696e7420616d6f756e74210000000000000000000000006044820152606401610bb5565b60135481611d06610fd5565b611d10919061386e565b1115611d5e5760405162461bcd60e51b815260206004820152601460248201527f4d617820737570706c79206578636565646564210000000000000000000000006044820152606401610bb5565b60155481611d6b336115f1565b611d75919061386e565b1115611dc35760405162461bcd60e51b815260206004820152601d60248201527f4d6178206d696e74207065722077616c6c6574206578636565646564210000006044820152606401610bb5565b80601054611dd19190613886565b341015611e205760405162461bcd60e51b815260206004820152601360248201527f496e73756666696369656e742066756e647321000000000000000000000000006044820152606401610bb5565b611e2a3382612a49565b50565b336001600160a01b03831603611e6f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600f80546114b690613724565b6008546001600160a01b03163314611f305760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601455565b611f4084848461106e565b6001600160a01b0383163b15610cd157611f5c84848484612ae2565b610cd1576040516368d2bf6b60e11b815260040160405180910390fd5b6060611f84826128fa565b611ff65760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610bb5565b60185460ff16151560000361209757600f805461201290613724565b80601f016020809104026020016040519081016040528092919081815260200182805461203e90613724565b801561208b5780601f106120605761010080835404028352916020019161208b565b820191906000526020600020905b81548152906001019060200180831161206e57829003601f168201915b50505050509050919050565b60006120a1612bce565b905060008151116120c157604051806020016040528060008152506120ef565b806120cb84612bdd565b600e6040516020016120df939291906138bb565b6040516020818303038152906040525b9392505050565b6120ff816115e6565b6001600160a01b0316336001600160a01b0316146121855760405162461bcd60e51b815260206004820152602260248201527f596f75206d757374206f776e2074686520746f6b656e20746f2074726176657260448201527f73650000000000000000000000000000000000000000000000000000000000006064820152608401610bb5565b61ffff82166000908152600c6020526040812080546121a390613724565b9050116122185760405162461bcd60e51b815260206004820152602e60248201527f5468697320636861696e2069732063757272656e746c7920756e617661696c6160448201527f626c6520666f722074726176656c0000000000000000000000000000000000006064820152608401610bb5565b61222181612d12565b604080513360208201528082018390528151808203830181526060820183526019547e0100000000000000000000000000000000000000000000000000000000000060808401526082808401919091528351808403909101815260a2830193849052600a547f40a7bb100000000000000000000000000000000000000000000000000000000090945290926001926000916001600160a01b0316906340a7bb10906122d8908990309089908790899060a6016138ed565b6040805180830381865afa1580156122f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612318919061393f565b509050803410156123b75760405162461bcd60e51b815260206004820152605460248201527f7230636b657420666c6970706572733a206d73672e76616c7565206e6f74206560448201527f6e6f75676820746f20636f766572206d6573736167654665652e2053656e642060648201527f67617320666f72206d6573736167652066656573000000000000000000000000608482015260a401610bb5565b60165462010000900460ff1661240f5760405162461bcd60e51b815260206004820152601560248201527f54686520627269646765206973207061757365642100000000000000000000006044820152606401610bb5565b600a5461ffff87166000908152600c602052604080822090517fc58031000000000000000000000000000000000000000000000000000000000081526001600160a01b039093169263c5803100923492612474928c928b913391908b90600401613963565b6000604051808303818588803b15801561248d57600080fd5b505af11580156124a1573d6000803e3d6000fd5b5050505050505050505050565b61ffff85166000908152600b602052604080822090516124cf908790613823565b908152604080516020928190038301902067ffffffffffffffff8716600090815292529020600181015490915061256e5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60448201527f65737361676500000000000000000000000000000000000000000000000000006064820152608401610bb5565b80548214801561259857508060010154838360405161258e929190613a43565b6040518091039020145b6125e45760405162461bcd60e51b815260206004820152601a60248201527f4c617965725a65726f3a20696e76616c6964207061796c6f61640000000000006044820152606401610bb5565b60008082556001820155604051630e1bd41160e11b81523090631c37a822906126199089908990899089908990600401613a53565b600060405180830381600087803b15801561263357600080fd5b505af1158015612647573d6000803e3d6000fd5b50505050505050505050565b6008546001600160a01b0316331461269b5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b60168054911515620100000262ff000019909216919091179055565b6008546001600160a01b031633146126ff5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b601555565b6008546001600160a01b0316331461274c5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b6018805460ff1916911515919091179055565b600d80546114b690613724565b6008546001600160a01b031633146127b45760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b61ffff83166000908152600c60205260409020610cd1908383613084565b6008546001600160a01b0316331461281a5760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b6001600160a01b0381166128965760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610bb5565b611e2a816129ea565b6008546001600160a01b031633146128e75760405162461bcd60e51b81526020600482018190526024820152600080516020613bab8339815191526044820152606401610bb5565b8051610fd190600d906020840190613000565b60008161290660125490565b11158015612915575060005482105b8015610dbb575050600090815260046020526040902054600160e01b161590565b6000808280602001905181019061294d9190613ab5565b9150915061123c8282612a49565b6000818061296860125490565b116129b8576000548110156129b85760008181526004602052604081205490600160e01b821690036129b6575b806000036120ef575060001901600081815260046020526040902054612995565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610fd1828260405180602001604052806000815250612d1d565b604080516080810182526000808252602082018190529181018290526060810191909152600082815260046020526040902054610dbb90604080516080810182526001600160a01b038316815260a083901c67ffffffffffffffff166020820152600160e01b831615159181019190915260e89190911c606082015290565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612b17903390899088908890600401613ae3565b6020604051808303816000875af1925050508015612b52575060408051601f3d908101601f19168201909252612b4f91810190613b1f565b60015b612bb0573d808015612b80576040519150601f19603f3d011682016040523d82523d6000602084013e612b85565b606091505b508051600003612ba8576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600d8054610dd090613724565b606081600003612c2057505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612c4a5780612c3481613b3c565b9150612c439050600a83613b6b565b9150612c24565b60008167ffffffffffffffff811115612c6557612c65613124565b6040519080825280601f01601f191660200182016040528015612c8f576020820181803683370190505b5090505b8415612bc657612ca4600183613b7f565b9150612cb1600a86613b96565b612cbc90603061386e565b60f81b818381518110612cd157612cd16138a5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612d0b600a86613b6b565b9450612c93565b611e2a816000612d8a565b612d278383612eed565b6001600160a01b0383163b15611449576000548281035b612d516000868380600101945086612ae2565b612d6e576040516368d2bf6b60e11b815260040160405180910390fd5b818110612d3e578160005414612d8357600080fd5b5050505050565b6000612d958361295b565b905080600080612db386600090815260066020526040902080549091565b915091508415612df357612dc88184336110dd565b612df357612dd68333610a00565b612df357604051632ce44b5f60e11b815260040160405180910390fd5b8015612dfe57600082555b6001600160a01b038316600081815260056020526040902080546fffffffffffffffffffffffffffffffff0190554260a01b177c030000000000000000000000000000000000000000000000000000000017600087815260046020526040812091909155600160e11b85169003612ea557600186016000818152600460205260408120549003612ea3576000548114612ea35760008181526004602052604090208590555b505b60405186906000906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050600180548101905550505050565b6000546001600160a01b038316612f30576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600003612f6a576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038316600081815260056020526040902080546801000000000000000185020190554260a01b6001841460e11b1717600082815260046020526040902055808281015b6040516001830192906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210612fb45760005550505050565b82805461300c90613724565b90600052602060002090601f01602090048101928261302e5760008555613074565b82601f1061304757805160ff1916838001178555613074565b82800160010185558215613074579182015b82811115613074578251825591602001919060010190613059565b506130809291506130f8565b5090565b82805461309090613724565b90600052602060002090601f0160209004810192826130b25760008555613074565b82601f106130cb5782800160ff19823516178555613074565b82800160010185558215613074579182015b828111156130745782358255916020019190600101906130dd565b5b8082111561308057600081556001016130f9565b803561ffff8116811461311f57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561315557613155613124565b604051601f8501601f19908116603f0116810190828211818310171561317d5761317d613124565b8160405280935085815286868601111561319657600080fd5b858560208301376000602087830101525050509392505050565b600082601f8301126131c157600080fd5b6120ef8383356020850161313a565b803567ffffffffffffffff8116811461311f57600080fd5b600080600080608085870312156131fe57600080fd5b6132078561310d565b9350602085013567ffffffffffffffff8082111561322457600080fd5b613230888389016131b0565b945061323e604088016131d0565b9350606087013591508082111561325457600080fd5b50613261878288016131b0565b91505092959194509250565b60006020828403121561327f57600080fd5b5035919050565b6001600160e01b031981168114611e2a57600080fd5b6000602082840312156132ae57600080fd5b81356120ef81613286565b60005b838110156132d45781810151838201526020016132bc565b83811115610cd15750506000910152565b600081518084526132fd8160208601602086016132b9565b601f01601f19169290920160200192915050565b6020815260006120ef60208301846132e5565b6001600160a01b0381168114611e2a57600080fd5b6000806040838503121561334c57600080fd5b823561335781613324565b946020939093013593505050565b60006020828403121561337757600080fd5b813567ffffffffffffffff81111561338e57600080fd5b8201601f8101841361339f57600080fd5b612bc68482356020840161313a565b6000806000606084860312156133c357600080fd5b83356133ce81613324565b925060208401356133de81613324565b929592945050506040919091013590565b60006020828403121561340157600080fd5b81356120ef81613324565b8035801515811461311f57600080fd5b60006020828403121561342e57600080fd5b6120ef8261340c565b60006020828403121561344957600080fd5b6120ef8261310d565b6000806040838503121561346557600080fd5b82359150602083013561347781613324565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b818110156134ba5783518352928401929184019160010161349e565b50909695505050505050565b6000806000606084860312156134db57600080fd5b6134e48461310d565b9250602084013567ffffffffffffffff81111561350057600080fd5b61350c868287016131b0565b925050604084013590509250925092565b6000806040838503121561353057600080fd5b823561353b81613324565b91506135496020840161340c565b90509250929050565b6000806000806080858703121561356857600080fd5b843561357381613324565b9350602085013561358381613324565b925060408501359150606085013567ffffffffffffffff8111156135a657600080fd5b613261878288016131b0565b600080604083850312156135c557600080fd5b6133578361310d565b60008083601f8401126135e057600080fd5b50813567ffffffffffffffff8111156135f857600080fd5b60208301915083602082850101111561361057600080fd5b9250929050565b60008060008060006080868803121561362f57600080fd5b6136388661310d565b9450602086013567ffffffffffffffff8082111561365557600080fd5b61366189838a016131b0565b955061366f604089016131d0565b9450606088013591508082111561368557600080fd5b50613692888289016135ce565b969995985093965092949392505050565b600080604083850312156136b657600080fd5b82356136c181613324565b9150602083013561347781613324565b6000806000604084860312156136e657600080fd5b6136ef8461310d565b9250602084013567ffffffffffffffff81111561370b57600080fd5b613717868287016135ce565b9497909650939450505050565b600181811c9082168061373857607f821691505b60208210810361375857634e487b7160e01b600052602260045260246000fd5b50919050565b6000815461376b81613724565b600182811680156137835760018114613794576137c3565b60ff198416875282870194506137c3565b8560005260208060002060005b858110156137ba5781548a8201529084019082016137a1565b50505082870194505b5050505092915050565b60006120ef828461375e565b61ffff851681526080602082015260006137f660808301866132e5565b67ffffffffffffffff85166040840152828103606084015261381881856132e5565b979650505050505050565b600082516138358184602087016132b9565b9190910192915050565b60006020828403121561385157600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561388157613881613858565b500190565b60008160001904831182151516156138a0576138a0613858565b500290565b634e487b7160e01b600052603260045260246000fd5b600084516138cd8184602089016132b9565b8451908301906138e18183602089016132b9565b6138188183018661375e565b61ffff861681526001600160a01b038516602082015260a06040820152600061391960a08301866132e5565b8415156060840152828103608084015261393381856132e5565b98975050505050505050565b6000806040838503121561395257600080fd5b505080516020909101519092909150565b61ffff871681526000602060c0818401526000885461398181613724565b8060c087015260e06001808416600081146139a357600181146139b8576139e6565b60ff19851689840152610100890195506139e6565b8d6000528660002060005b858110156139de5781548b82018601529083019088016139c3565b8a0184019650505b505050505083810360408501526139fd81896132e5565b915050613a1560608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a0840152613a3681856132e5565b9998505050505050505050565b8183823760009101908152919050565b61ffff86168152608060208201526000613a7060808301876132e5565b67ffffffffffffffff861660408401528281036060840152838152838560208301376000602085830101526020601f19601f8601168201019150509695505050505050565b60008060408385031215613ac857600080fd5b8251613ad381613324565b6020939093015192949293505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613b1560808301846132e5565b9695505050505050565b600060208284031215613b3157600080fd5b81516120ef81613286565b600060018201613b4e57613b4e613858565b5060010190565b634e487b7160e01b600052601260045260246000fd5b600082613b7a57613b7a613b55565b500490565b600082821015613b9157613b91613858565b500390565b600082613ba557613ba5613b55565b50069056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122053953fab0fb484c4824d187b273727cbc7ac8abf42ba7c4aa7c7e2da07a28ff164736f6c634300080e0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000004000000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d577a793165544172757a41794b615863324e69467273434a7a426e414147555636777435526d314b554b6a382f000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _uri (string): https://gateway.pinata.cloud/ipfs/QmWzy1eTAruzAyKaXc2NiFrsCJzBnAAGUV6wt5Rm1KUKj8/
Arg [1] : _layerZeroEndpoint (address): 0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000051
Arg [3] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [4] : 732f516d577a793165544172757a41794b615863324e69467273434a7a426e41
Arg [5] : 4147555636777435526d314b554b6a382f000000000000000000000000000000
Deployed Bytecode Sourcemap
83627:9985:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80278:1098;;;;;;;;;;-1:-1:-1;80278:1098:0;;;;;:::i;:::-;;:::i;:::-;;88668:102;;;;;;;;;;-1:-1:-1;88668:102:0;;;;;:::i;:::-;;:::i;14592:615::-;;;;;;;;;;-1:-1:-1;14592:615:0;;;;;:::i;:::-;;:::i;:::-;;;2875:14:1;;2868:22;2850:41;;2838:2;2823:18;14592:615:0;;;;;;;;20239:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;22185:204::-;;;;;;;;;;-1:-1:-1;22185:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3949:55:1;;;3931:74;;3919:2;3904:18;22185:204:0;3785:226:1;21733:386:0;;;;;;;;;;-1:-1:-1;21733:386:0;;;;;:::i;:::-;;:::i;87589:100::-;;;;;;;;;;-1:-1:-1;87589:100:0;;;;;:::i;:::-;;:::i;13646:315::-;;;;;;;;;;;;;:::i;:::-;;;5096:25:1;;;5084:2;5069:18;13646:315:0;4950:177:1;84340:33:0;;;;;;;;;;;;;;;;81384:435;;;;;;;;;;-1:-1:-1;81384:435:0;;;;;:::i;:::-;;:::i;31450:2800::-;;;;;;;;;;-1:-1:-1;31450:2800:0;;;;;:::i;:::-;;:::i;84948:78::-;;;;;;;;;;-1:-1:-1;84948:78:0;;;;-1:-1:-1;;;;;84948:78:0;;;84614:30;;;;;;;;;;-1:-1:-1;84614:30:0;;;;;;;;;;;89080:172;;;;;;;;;;;;;:::i;88799:131::-;;;;;;;;;;-1:-1:-1;88799:131:0;;;;;:::i;:::-;;:::i;87951:89::-;;;;;;;;;;-1:-1:-1;87951:89:0;;;;;:::i;:::-;;:::i;23075:185::-;;;;;;;;;;-1:-1:-1;23075:185:0;;;;;:::i;:::-;;:::i;84280:34::-;;;;;;;;;;;;;;;;87695:132;;;;;;;;;;-1:-1:-1;87695:132:0;;;;;:::i;:::-;;:::i;84806:27::-;;;;;;;;;;-1:-1:-1;84806:27:0;;;;;;;;84682:30;;;;;;;;;;-1:-1:-1;84682:30:0;;;;;;;;;;;83976:33;;;;;;;;;;;;;:::i;88555:86::-;;;;;;;;;;-1:-1:-1;88555:86:0;;;;;:::i;:::-;;:::i;84519:37::-;;;;;;;;;;;;;;;;87850:95;;;;;;;;;;-1:-1:-1;87850:95:0;;;;;:::i;:::-;;:::i;20028:144::-;;;;;;;;;;-1:-1:-1;20028:144:0;;;;;:::i;:::-;;:::i;15271:224::-;;;;;;;;;;-1:-1:-1;15271:224:0;;;;;:::i;:::-;;:::i;67075:103::-;;;;;;;;;;;;;:::i;85554:920::-;;;;;;:::i;:::-;;:::i;84202:34::-;;;;;;;;;;;;;;;;80077:51;;;;;;;;;;-1:-1:-1;80077:51:0;;;;;:::i;:::-;;:::i;87054:202::-;;;;;;;;;;-1:-1:-1;87054:202:0;;;;;:::i;:::-;;:::i;84577:32::-;;;;;;;;;;-1:-1:-1;84577:32:0;;;;;;;;89465:712;;;;;;;;;;-1:-1:-1;89465:712:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;66424:87::-;;;;;;;;;;-1:-1:-1;66497:6:0;;-1:-1:-1;;;;;66497:6:0;66424:87;;79968:102;;;;;;;;;;-1:-1:-1;79968:102:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8203:25:1;;;8259:2;8244:18;;8237:34;;;;8176:18;79968:102:0;8029:248:1;88471:78:0;;;;;;;;;;-1:-1:-1;88471:78:0;;;;;:::i;:::-;;:::i;84430:37::-;;;;;;;;;;;;;;;;93405:128;;;;;;;;;;-1:-1:-1;93405:128:0;;;;;:::i;:::-;;:::i;20408:104::-;;;;;;;;;;;;;:::i;86480:566::-;;;;;;:::i;:::-;;:::i;84161:36::-;;;;;;;;;;;;;;;;22461:308;;;;;;;;;;-1:-1:-1;22461:308:0;;;;;:::i;:::-;;:::i;84057:60::-;;;;;;;;;;;;;:::i;88172:130::-;;;;;;;;;;-1:-1:-1;88172:130:0;;;;;:::i;:::-;;:::i;23331:399::-;;;;;;;;;;-1:-1:-1;23331:399:0;;;;;:::i;:::-;;:::i;90295:445::-;;;;;;;;;;-1:-1:-1;90295:445:0;;;;;:::i;:::-;;:::i;91123:1762::-;;;;;;:::i;:::-;;:::i;82479:916::-;;;;;;:::i;:::-;;:::i;88064:87::-;;;;;;;;;;-1:-1:-1;88064:87:0;;;;;:::i;:::-;;:::i;88329:126::-;;;;;;;;;;-1:-1:-1;88329:126:0;;;;;:::i;:::-;;:::i;87412:81::-;;;;;;;;;;-1:-1:-1;87412:81:0;;;;;:::i;:::-;;:::i;22840:164::-;;;;;;;;;;-1:-1:-1;22840:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;22961:25:0;;;22937:4;22961:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;22840:164;83954:17;;;;;;;;;;;;;:::i;83403:181::-;;;;;;;;;;-1:-1:-1;83403:181:0;;;;;:::i;:::-;;:::i;67333:201::-;;;;;;;;;;-1:-1:-1;67333:201:0;;;;;:::i;:::-;;:::i;84739:47::-;;;;;;;;;;-1:-1:-1;84739:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;87507:76;;;;;;;;;;-1:-1:-1;87507:76:0;;;;;:::i;:::-;;:::i;80278:1098::-;80483:8;;-1:-1:-1;;;;;80483:8:0;80461:10;:31;80453:40;;;;;;80618:32;;;;;;;:19;:32;;;;;:39;;;;;:::i;:::-;;;80596:11;:18;:61;:168;;;;-1:-1:-1;80731:32:0;;;;;;;:19;:32;;;;;;;80721:43;;;;80731:32;80721:43;:::i;:::-;;;;;;;;80688:11;80678:22;;;;;;:86;80596:168;80574:270;;;;-1:-1:-1;;;80574:270:0;;13078:2:1;80574:270:0;;;13060:21:1;13117:2;13097:18;;;13090:30;13156:34;13136:18;;;13129:62;13227:22;13207:18;;;13200:50;13267:19;;80574:270:0;;;;;;;;;80972:60;;-1:-1:-1;;;80972:60:0;;:4;;:16;;:60;;80989:11;;81002;;81015:6;;81023:8;;80972:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80968:401;;81179:101;;;;;;;;81212:8;:15;81179:101;;;;81256:8;81246:19;;;;;;81179:101;;;81128:14;:27;81143:11;81128:27;;;;;;;;;;;;;;;81156:11;81128:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;:152;;;;;;;;;;;;;;;81300:57;;;;81314:11;;81327;;81169:6;;81348:8;;81300:57;:::i;:::-;;;;;;;;80968:401;80278:1098;;;;:::o;88668:102::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;88738:11:::1;:26:::0;88668:102::o;14592:615::-;14677:4;14977:25;-1:-1:-1;;;;;;14977:25:0;;;;:102;;-1:-1:-1;15054:25:0;-1:-1:-1;;;;;;15054:25:0;;;14977:102;:179;;;-1:-1:-1;15131:25:0;-1:-1:-1;;;;;;15131:25:0;;;14977:179;14957:199;14592:615;-1:-1:-1;;14592:615:0:o;20239:100::-;20293:13;20326:5;20319:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20239:100;:::o;22185:204::-;22253:7;22278:16;22286:7;22278;:16::i;:::-;22273:64;;22303:34;;;;;;;;;;;;;;22273:64;-1:-1:-1;22357:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;22357:24:0;;22185:204::o;21733:386::-;21806:13;21822:16;21830:7;21822;:16::i;:::-;21806:32;-1:-1:-1;65228:10:0;-1:-1:-1;;;;;21855:28:0;;;21851:175;;21903:44;21920:5;65228:10;22840:164;:::i;21903:44::-;21898:128;;21975:35;;;;;;;;;;;;;;21898:128;22038:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;22038:29:0;-1:-1:-1;;;;;22038:29:0;;;;;;;;;22083:28;;22038:24;;22083:28;;;;;;;21795:324;21733:386;;:::o;87589:100::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;87661:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;87589:100:::0;:::o;13646:315::-;13699:7;13927:15;90271:12;;;90183:106;13927:15;13912:12;;13896:13;;:28;:46;13889:53;;13646:315;:::o;81384:435::-;81610:10;81632:4;81610:27;81588:120;;;;-1:-1:-1;;;81588:120:0;;14701:2:1;81588:120:0;;;14683:21:1;14740:2;14720:18;;;14713:30;14779:34;14759:18;;;14752:62;14850:13;14830:18;;;14823:41;14881:19;;81588:120:0;14499:407:1;81588:120:0;81757:54;81768:11;81781;81794:6;81802:8;81757:10;:54::i;31450:2800::-;31584:27;31614;31633:7;31614:18;:27::i;:::-;31584:57;;31699:4;-1:-1:-1;;;;;31658:45:0;31674:19;-1:-1:-1;;;;;31658:45:0;;31654:86;;31712:28;;;;;;;;;;;;;;31654:86;31754:27;30180:21;;;30007:15;30222:4;30215:36;30304:4;30288:21;;30394:26;;31938:62;30394:26;31974:4;65228:10;31980:19;-1:-1:-1;;;;;30999:31:0;;;30845:26;;31126:19;;31147:30;;31123:55;;30551:645;31938:62;31933:174;;32020:43;32037:4;65228:10;22840:164;:::i;32020:43::-;32015:92;;32072:35;;-1:-1:-1;;;32072:35:0;;;;;;;;;;;32015:92;-1:-1:-1;;;;;32124:16:0;;32120:52;;32149:23;;;;;;;;;;;;;;32120:52;32321:15;32318:160;;;32461:1;32440:19;32433:30;32318:160;-1:-1:-1;;;;;32856:24:0;;;;;;;:18;:24;;;;;;32854:26;;-1:-1:-1;;32854:26:0;;;32925:22;;;;;;;;;32923:24;;-1:-1:-1;32923:24:0;;;19927:11;19903:22;19899:40;19886:62;-1:-1:-1;;;19886:62:0;33218:26;;;;:17;:26;;;;;:174;;;;-1:-1:-1;;;33512:46:0;;:51;;33508:626;;33616:1;33606:11;;33584:19;33739:30;;;:17;:30;;;;;;:35;;33735:384;;33877:13;;33862:11;:28;33858:242;;34024:30;;;;:17;:30;;;;;:52;;;33858:242;33565:569;33508:626;34181:7;34177:2;-1:-1:-1;;;;;34162:27:0;34171:4;-1:-1:-1;;;;;34162:27:0;;;;;;;;;;;34200:42;31573:2677;;;31450:2800;;;:::o;89080:172::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;69704:1:::1;70302:7;;:19:::0;70294:63:::1;;;::::0;-1:-1:-1;;;70294:63:0;;15113:2:1;70294:63:0::1;::::0;::::1;15095:21:1::0;15152:2;15132:18;;;15125:30;15191:33;15171:18;;;15164:61;15242:18;;70294:63:0::1;14911:355:1::0;70294:63:0::1;69704:1;70435:7;:18:::0;89160:7:::2;89181;66497:6:::0;;-1:-1:-1;;;;;66497:6:0;;66424:87;89181:7:::2;-1:-1:-1::0;;;;;89173:21:0::2;89202;89173:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89159:69;;;89243:2;89235:11;;;::::0;::::2;;-1:-1:-1::0;69660:1:0::1;70614:7;:22:::0;89080:172::o;88799:131::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;88887:18:::1;:37:::0;;-1:-1:-1;;88887:37:0::1;-1:-1:-1::0;;;;;88887:37:0;;;::::1;::::0;;;::::1;::::0;;88799:131::o;87951:89::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;88013:12:::1;:21:::0;;-1:-1:-1;;88013:21:0::1;::::0;::::1;;::::0;;;::::1;::::0;;87951:89::o;23075:185::-;23213:39;23230:4;23236:2;23240:7;23213:39;;;;;;;;;;;;:16;:39::i;:::-;23075:185;;;:::o;87695:132::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;87783:38;;::::1;::::0;:17:::1;::::0;:38:::1;::::0;::::1;::::0;::::1;:::i;83976:33::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;88555:86::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;88617:9:::1;:18:::0;88555:86::o;87850:95::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;87915:10:::1;:24:::0;;;::::1;;;;-1:-1:-1::0;;87915:24:0;;::::1;::::0;;;::::1;::::0;;87850:95::o;20028:144::-;20092:7;20135:27;20154:7;20135:18;:27::i;15271:224::-;15335:7;-1:-1:-1;;;;;15359:19:0;;15355:60;;15387:28;;;;;;;;;;;;;;15355:60;-1:-1:-1;;;;;;15433:25:0;;;;;:18;:25;;;;;;9826:13;15433:54;;15271:224::o;67075:103::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;67140:30:::1;67167:1;67140:18;:30::i;:::-;67075:103::o:0;85554:920::-;85685:18;;85742:32;;-1:-1:-1;;;85742:32:0;;85763:10;85742:32;;;3931:74:1;-1:-1:-1;;;;;85685:18:0;;;;85656;;85685;;85742:20;;3904:18:1;;85742:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;85778:1;85742:37;85739:152;;-1:-1:-1;85806:1:0;85739:152;;;85851:32;;-1:-1:-1;;;85851:32:0;;85872:10;85851:32;;;3931:74:1;-1:-1:-1;;;;;85851:20:0;;;;;3904:18:1;;85851:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;85835:48;;85739:152;85938:12;;;;85930:52;;;;-1:-1:-1;;;85930:52:0;;15872:2:1;85930:52:0;;;15854:21:1;15911:2;15891:18;;;15884:30;15950:29;15930:18;;;15923:57;15997:18;;85930:52:0;15670:351:1;85930:52:0;85997:13;86014:1;85997:18;85989:54;;;;-1:-1:-1;;;85989:54:0;;16228:2:1;85989:54:0;;;16210:21:1;16267:2;16247:18;;;16240:30;16306:25;16286:18;;;16279:53;16349:18;;85989:54:0;16026:347:1;85989:54:0;86072:1;86058:11;:15;:47;;;;;86092:13;86077:11;:28;;86058:47;86050:78;;;;-1:-1:-1;;;86050:78:0;;16580:2:1;86050:78:0;;;16562:21:1;16619:2;16599:18;;;16592:30;16658:20;16638:18;;;16631:48;16696:18;;86050:78:0;16378:342:1;86050:78:0;86174:11;;86159;86143:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:42;;86135:75;;;;-1:-1:-1;;;86135:75:0;;17249:2:1;86135:75:0;;;17231:21:1;17288:2;17268:18;;;17261:30;17327:22;17307:18;;;17300:50;17367:18;;86135:75:0;17047:344:1;86135:75:0;86250:11;86238:9;;:23;;;;:::i;:::-;86225:9;:36;;86217:68;;;;-1:-1:-1;;;86217:68:0;;17771:2:1;86217:68:0;;;17753:21:1;17810:2;17790:18;;;17783:30;17849:21;17829:18;;;17822:49;17888:18;;86217:68:0;17569:343:1;86217:68:0;65228:10;86301:29;;;;:15;:29;;;;;;;;86300:30;86292:67;;;;-1:-1:-1;;;86292:67:0;;18119:2:1;86292:67:0;;;18101:21:1;18158:2;18138:18;;;18131:30;18197:26;18177:18;;;18170:54;18241:18;;86292:67:0;17917:348:1;86292:67:0;65228:10;86368:29;;;;:15;:29;;;;;:36;;-1:-1:-1;;86368:36:0;86400:4;86368:36;;;86432;;86456:11;86432:9;:36::i;80077:51::-;;;;;;;;;;;;;;;;:::i;87054:202::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;87174:11:::1;;87159;87143:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:42;;87135:75;;;::::0;-1:-1:-1;;;87135:75:0;;17249:2:1;87135:75:0::1;::::0;::::1;17231:21:1::0;17288:2;17268:18;;;17261:30;17327:22;17307:18;;;17300:50;17367:18;;87135:75:0::1;17047:344:1::0;87135:75:0::1;87217:33;87227:9;87238:11;87217:9;:33::i;89465:712::-:0;89526:16;89572:18;89607:16;89617:5;89607:9;:16::i;:::-;89593:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;89593:31:0;;89572:52;;89636:11;89650:14;13388:7;13415:13;;13341:95;89650:14;89636:28;;89675:19;89705:25;89746:9;89741:403;89761:3;89757:1;:7;89741:403;;;89786:31;89820:15;89833:1;89820:12;:15::i;:::-;89786:49;;89854:9;:16;;;89850:65;;;89891:8;;;89850:65;89933:14;;-1:-1:-1;;;;;89933:28:0;;89929:103;;90002:14;;;-1:-1:-1;89929:103:0;90071:5;-1:-1:-1;;;;;90050:26:0;:17;-1:-1:-1;;;;;90050:26:0;;90046:87;;90116:1;90097;90099:13;;;;;;90097:16;;;;;;;;:::i;:::-;;;;;;:20;;;;;90046:87;89771:373;89741:403;89766:3;;89741:403;;;-1:-1:-1;90161:1:0;;89465:712;-1:-1:-1;;;;;89465:712:0:o;88471:78::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;88529:5:::1;:14:::0;88471:78::o;93405:128::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;93490:26:::1;:35:::0;93405:128::o;20408:104::-;20464:13;20497:7;20490:14;;;;;:::i;86480:566::-;86586:10;;;;;;;86578:48;;;;-1:-1:-1;;;86578:48:0;;18661:2:1;86578:48:0;;;18643:21:1;18700:2;18680:18;;;18673:30;18739:27;18719:18;;;18712:55;18784:18;;86578:48:0;18459:349:1;86578:48:0;86655:1;86641:11;:15;:52;;;;;86675:18;;86660:11;:33;;86641:52;86633:85;;;;-1:-1:-1;;;86633:85:0;;19015:2:1;86633:85:0;;;18997:21:1;19054:2;19034:18;;;19027:30;19093:22;19073:18;;;19066:50;19133:18;;86633:85:0;18813:344:1;86633:85:0;86764:11;;86749;86733:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:42;;86725:75;;;;-1:-1:-1;;;86725:75:0;;17249:2:1;86725:75:0;;;17231:21:1;17288:2;17268:18;;;17261:30;17327:22;17307:18;;;17300:50;17367:18;;86725:75:0;17047:344:1;86725:75:0;86854:17;;86839:11;86815:21;86825:10;86815:9;:21::i;:::-;:35;;;;:::i;:::-;:56;;86807:98;;;;-1:-1:-1;;;86807:98:0;;19364:2:1;86807:98:0;;;19346:21:1;19403:2;19383:18;;;19376:30;19442:31;19422:18;;;19415:59;19491:18;;86807:98:0;19162:353:1;86807:98:0;86941:11;86933:5;;:19;;;;:::i;:::-;86920:9;:32;;86912:64;;;;-1:-1:-1;;;86912:64:0;;17771:2:1;86912:64:0;;;17753:21:1;17810:2;17790:18;;;17783:30;17849:21;17829:18;;;17822:49;17888:18;;86912:64:0;17569:343:1;86912:64:0;87004:36;65228:10;87028:11;87004:9;:36::i;:::-;86480:566;:::o;22461:308::-;65228:10;-1:-1:-1;;;;;22560:31:0;;;22556:61;;22600:17;;;;;;;;;;;;;;22556:61;65228:10;22630:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;22630:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;22630:60:0;;;;;;;;;;22706:55;;2850:41:1;;;22630:49:0;;65228:10;22706:55;;2823:18:1;22706:55:0;;;;;;;22461:308;;:::o;84057:60::-;;;;;;;:::i;88172:130::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;88256:18:::1;:40:::0;88172:130::o;23331:399::-;23498:31;23511:4;23517:2;23521:7;23498:12;:31::i;:::-;-1:-1:-1;;;;;23544:14:0;;;:19;23540:183;;23583:56;23614:4;23620:2;23624:7;23633:5;23583:30;:56::i;:::-;23578:145;;23667:40;;-1:-1:-1;;;23667:40:0;;;;;;;;;;;90295:445;90369:13;90399:17;90407:8;90399:7;:17::i;:::-;90391:77;;;;-1:-1:-1;;;90391:77:0;;19722:2:1;90391:77:0;;;19704:21:1;19761:2;19741:18;;;19734:30;19800:34;19780:18;;;19773:62;19871:17;19851:18;;;19844:45;19906:19;;90391:77:0;19520:411:1;90391:77:0;90481:8;;;;:17;;:8;:17;90477:64;;90516:17;90509:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;90295:445;;;:::o;90477:64::-;90549:28;90580:10;:8;:10::i;:::-;90549:41;;90635:1;90610:14;90604:28;:32;:130;;;;;;;;;;;;;;;;;90672:14;90688:19;:8;:17;:19::i;:::-;90709:9;90655:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;90604:130;90597:137;90295:445;-1:-1:-1;;;90295:445:0:o;91123:1762::-;91243:16;91251:7;91243;:16::i;:::-;-1:-1:-1;;;;;91229:30:0;:10;-1:-1:-1;;;;;91229:30:0;;91207:114;;;;-1:-1:-1;;;91207:114:0;;20692:2:1;91207:114:0;;;20674:21:1;20731:2;20711:18;;;20704:30;20770:34;20750:18;;;20743:62;20841:4;20821:18;;;20814:32;20863:19;;91207:114:0;20490:398:1;91207:114:0;91354:29;;;91393:1;91354:29;;;:19;:29;;;;;:36;;;;;:::i;:::-;;;:40;91332:136;;;;-1:-1:-1;;;91332:136:0;;21095:2:1;91332:136:0;;;21077:21:1;21134:2;21114:18;;;21107:30;21173:34;21153:18;;;21146:62;21244:16;21224:18;;;21217:44;21278:19;;91332:136:0;20893:410:1;91332:136:0;91548:14;91554:7;91548:5;:14::i;:::-;91659:31;;;91670:10;91659:31;;;21482:74:1;21572:18;;;21565:34;;;91659:31:0;;;;;;;;;21455:18:1;;;91659:31:0;;91887:26;;21781:16:1;91834:90:0;;;21765:102:1;21883:11;;;;21876:27;;;;91834:90:0;;;;;;;;;;21919:12:1;;;91834:90:0;;;;92103:8;;:153;;;;91659:31;;91793:1;;-1:-1:-1;;;;;;;92103:8:0;;:21;;:153;;92139:8;;92170:4;;91659:31;;-1:-1:-1;;91834:90:0;;92103:153;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;92078:178;;;92304:10;92291:9;:23;;92269:157;;;;-1:-1:-1;;;92269:157:0;;23064:2:1;92269:157:0;;;23046:21:1;23103:2;23083:18;;;23076:30;23142:34;23122:18;;;23115:62;23213:34;23193:18;;;23186:62;23285:22;23264:19;;;23257:51;23325:19;;92269:157:0;22862:488:1;92269:157:0;92447:10;;;;;;;92439:44;;;;-1:-1:-1;;;92439:44:0;;23557:2:1;92439:44:0;;;23539:21:1;23596:2;23576:18;;;23569:30;23635:23;23615:18;;;23608:51;23676:18;;92439:44:0;23355:345:1;92439:44:0;92496:8;;92588:29;;;92496:8;92588:29;;;:19;:29;;;;;;92496:381;;;;;-1:-1:-1;;;;;92496:8:0;;;;:13;;92517:9;;92496:381;;92542:8;;92671:7;;92727:10;;92496:8;92837:13;;92496:381;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;91196:1689;;;;91123:1762;;:::o;82479:916::-;82738:27;;;82703:32;82738:27;;;:14;:27;;;;;;:64;;;;82780:11;;82738:64;:::i;:::-;;;;;;;;;;;;;;;;:72;;;;;;;;;;;82843:21;;;;82738:72;;-1:-1:-1;82821:123:0;;;;-1:-1:-1;;;82821:123:0;;25396:2:1;82821:123:0;;;25378:21:1;25435:2;25415:18;;;25408:30;25474:34;25454:18;;;25447:62;25545:8;25525:18;;;25518:36;25571:19;;82821:123:0;25194:402:1;82821:123:0;82996:23;;82977:42;;:107;;;;;83063:9;:21;;;83050:8;;83040:19;;;;;;;:::i;:::-;;;;;;;;:44;82977:107;82955:183;;;;-1:-1:-1;;;82955:183:0;;26079:2:1;82955:183:0;;;26061:21:1;26118:2;26098:18;;;26091:30;26157:28;26137:18;;;26130:56;26203:18;;82955:183:0;25877:350:1;82955:183:0;83212:1;83186:27;;;83224:21;;;:34;83327:60;;-1:-1:-1;;;83327:60:0;;:4;;:16;;:60;;83344:11;;83357;;83370:6;;83378:8;;;;83327:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82647:748;82479:916;;;;;:::o;88064:87::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;88126:10:::1;:19:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;88126:19:0;;::::1;::::0;;;::::1;::::0;;88064:87::o;88329:126::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;88411:17:::1;:38:::0;88329:126::o;87412:81::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;87470:8:::1;:17:::0;;-1:-1:-1;;87470:17:0::1;::::0;::::1;;::::0;;;::::1;::::0;;87412:81::o;83954:17::-;;;;;;;:::i;83403:181::-;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;83530:29:::1;::::0;::::1;;::::0;;;:19:::1;:29;::::0;;;;:46:::1;::::0;83562:14;;83530:46:::1;:::i;67333:201::-:0;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;-1:-1:-1;;;;;67422:22:0;::::1;67414:73;;;::::0;-1:-1:-1;;;67414:73:0;;27157:2:1;67414:73:0::1;::::0;::::1;27139:21:1::0;27196:2;27176:18;;;27169:30;27235:34;27215:18;;;27208:62;27306:8;27286:18;;;27279:36;27332:19;;67414:73:0::1;26955:402:1::0;67414:73:0::1;67498:28;67517:8;67498:18;:28::i;87507:76::-:0;66497:6;;-1:-1:-1;;;;;66497:6:0;65228:10;66644:23;66636:68;;;;-1:-1:-1;;;66636:68:0;;14340:2:1;66636:68:0;;;14322:21:1;;;14359:18;;;14352:30;-1:-1:-1;;;;;;;;;;;14398:18:1;;;14391:62;14470:18;;66636:68:0;14138:356:1;66636:68:0;87567:10;;::::1;::::0;:3:::1;::::0;:10:::1;::::0;::::1;::::0;::::1;:::i;23985:273::-:0;24042:4;24098:7;24079:15;90271:12;;;90183:106;24079:15;:26;;:66;;;;;24132:13;;24122:7;:23;24079:66;:152;;;;-1:-1:-1;;24183:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;24183:43:0;:48;;23985:273::o;92897:424::-;93093:14;93109:15;93153:8;93128:77;;;;;;;;;;;;:::i;:::-;93092:113;;;;93287:26;93297:6;93305:7;93287:9;:26::i;16945:1129::-;17012:7;17047;;17096:15;90271:12;;;90183:106;17096:15;:23;17092:915;;17149:13;;17142:4;:20;17138:869;;;17187:14;17204:23;;;:17;:23;;;;;;;-1:-1:-1;;;17293:23:0;;:28;;17289:699;;17812:113;17819:6;17829:1;17819:11;17812:113;;-1:-1:-1;;;17890:6:0;17872:25;;;;:17;:25;;;;;;17812:113;;17289:699;17164:843;17138:869;18035:31;;;;;;;;;;;;;;67694:191;67787:6;;;-1:-1:-1;;;;;67804:17:0;;;-1:-1:-1;;67804:17:0;;;;;;;67837:40;;67787:6;;;67804:17;67787:6;;67837:40;;67768:16;;67837:40;67757:128;67694:191;:::o;24342:104::-;24411:27;24421:2;24425:8;24411:27;;;;;;;;;;;;:9;:27::i;18622:153::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18742:24:0;;;;:17;:24;;;;;;18723:44;;-1:-1:-1;;;;;;;;;;;;;18278:41:0;;;;10480:3;18364:32;;;18330:67;;-1:-1:-1;;;18330:67:0;-1:-1:-1;;;18427:23:0;;:28;;-1:-1:-1;;;18408:47:0;;;;10997:3;18495:27;;;;-1:-1:-1;;;18466:57:0;-1:-1:-1;18168:363:0;38201:716;38385:88;;-1:-1:-1;;;38385:88:0;;38364:4;;-1:-1:-1;;;;;38385:45:0;;;;;:88;;65228:10;;38452:4;;38458:7;;38467:5;;38385:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38385:88:0;;;;;;;;-1:-1:-1;;38385:88:0;;;;;;;;;;;;:::i;:::-;;;38381:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38668:6;:13;38685:1;38668:18;38664:235;;38714:40;;-1:-1:-1;;;38714:40:0;;;;;;;;;;;38664:235;38857:6;38851:13;38842:6;38838:2;38834:15;38827:38;38381:529;-1:-1:-1;;;;;;38544:64:0;-1:-1:-1;;;38544:64:0;;-1:-1:-1;38381:529:0;38201:716;;;;;;:::o;90746:98::-;90806:13;90835:3;90828:10;;;;;:::i;59839:723::-;59895:13;60116:5;60125:1;60116:10;60112:53;;-1:-1:-1;;60143:10:0;;;;;;;;;;;;;;;;;;59839:723::o;60112:53::-;60190:5;60175:12;60231:78;60238:9;;60231:78;;60264:8;;;;:::i;:::-;;-1:-1:-1;60287:10:0;;-1:-1:-1;60295:2:0;60287:10;;:::i;:::-;;;60231:78;;;60319:19;60351:6;60341:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60341:17:0;;60319:39;;60369:154;60376:10;;60369:154;;60403:11;60413:1;60403:11;;:::i;:::-;;-1:-1:-1;60472:10:0;60480:2;60472:5;:10;:::i;:::-;60459:24;;:2;:24;:::i;:::-;60446:39;;60429:6;60436;60429:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;60500:11:0;60509:2;60500:11;;:::i;:::-;;;60369:154;;34328:89;34388:21;34394:7;34403:5;34388;:21::i;24862:681::-;24985:19;24991:2;24995:8;24985:5;:19::i;:::-;-1:-1:-1;;;;;25046:14:0;;;:19;25042:483;;25086:11;25100:13;25148:14;;;25181:233;25212:62;25251:1;25255:2;25259:7;;;;;;25268:5;25212:30;:62::i;:::-;25207:167;;25310:40;;-1:-1:-1;;;25310:40:0;;;;;;;;;;;25207:167;25409:3;25401:5;:11;25181:233;;25496:3;25479:13;;:20;25475:34;;25501:8;;;25475:34;25067:458;;24862:681;;;:::o;34646:3063::-;34726:27;34756;34775:7;34756:18;:27::i;:::-;34726:57;-1:-1:-1;34726:57:0;34796:12;;34918:28;34938:7;29881:27;30180:21;;;30007:15;30222:4;30215:36;30304:4;30288:21;;30394:26;;30288:21;;29786:652;34918:28;34861:85;;;;34963:13;34959:310;;;35084:62;35103:15;35120:4;65228:10;35126:19;65148:98;35084:62;35079:178;;35170:43;35187:4;65228:10;22840:164;:::i;35170:43::-;35165:92;;35222:35;;-1:-1:-1;;;35222:35:0;;;;;;;;;;;35165:92;35425:15;35422:160;;;35565:1;35544:19;35537:30;35422:160;-1:-1:-1;;;;;36183:24:0;;;;;;:18;:24;;;;;:59;;36211:31;36183:59;;;19927:11;19903:22;19899:40;19886:62;36570:41;19886:62;36480:26;;;;:17;:26;;;;;:203;;;;-1:-1:-1;;;36803:46:0;;:51;;36799:626;;36907:1;36897:11;;36875:19;37030:30;;;:17;:30;;;;;;:35;;37026:384;;37168:13;;37153:11;:28;37149:242;;37315:30;;;;:17;:30;;;;;:52;;;37149:242;36856:569;36799:626;37453:35;;37480:7;;37476:1;;-1:-1:-1;;;;;37453:35:0;;;;;37476:1;;37453:35;-1:-1:-1;;37676:12:0;:14;;;;;;-1:-1:-1;;;;34646:3063:0:o;25816:1529::-;25881:20;25904:13;-1:-1:-1;;;;;25932:16:0;;25928:48;;25957:19;;;;;;;;;;;;;;25928:48;25991:8;26003:1;25991:13;25987:44;;26013:18;;;;;;;;;;;;;;25987:44;-1:-1:-1;;;;;26519:22:0;;;;;;:18;:22;;9963:2;26519:22;;:70;;26557:31;26545:44;;26519:70;;;19927:11;19903:22;19899:40;-1:-1:-1;21637:15:0;;21612:23;21608:45;19896:51;19886:62;26832:31;;;;:17;:31;;;;;:173;26850:12;27081:23;;;27119:101;27146:35;;27171:9;;;;;-1:-1:-1;;;;;27146:35:0;;;27163:1;;27146:35;;27163:1;;27146:35;27215:3;27205:7;:13;27119:101;;27236:13;:19;-1:-1:-1;23075:185:0;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:159:1;81:20;;141:6;130:18;;120:29;;110:57;;163:1;160;153:12;110:57;14:159;;;:::o;178:184::-;-1:-1:-1;;;227:1:1;220:88;327:4;324:1;317:15;351:4;348:1;341:15;367:631;431:5;461:18;502:2;494:6;491:14;488:40;;;508:18;;:::i;:::-;583:2;577:9;551:2;637:15;;-1:-1:-1;;633:24:1;;;659:2;629:33;625:42;613:55;;;683:18;;;703:22;;;680:46;677:72;;;729:18;;:::i;:::-;769:10;765:2;758:22;798:6;789:15;;828:6;820;813:22;868:3;859:6;854:3;850:16;847:25;844:45;;;885:1;882;875:12;844:45;935:6;930:3;923:4;915:6;911:17;898:44;990:1;983:4;974:6;966;962:19;958:30;951:41;;;;367:631;;;;;:::o;1003:220::-;1045:5;1098:3;1091:4;1083:6;1079:17;1075:27;1065:55;;1116:1;1113;1106:12;1065:55;1138:79;1213:3;1204:6;1191:20;1184:4;1176:6;1172:17;1138:79;:::i;1228:171::-;1295:20;;1355:18;1344:30;;1334:41;;1324:69;;1389:1;1386;1379:12;1404:684;1506:6;1514;1522;1530;1583:3;1571:9;1562:7;1558:23;1554:33;1551:53;;;1600:1;1597;1590:12;1551:53;1623:28;1641:9;1623:28;:::i;:::-;1613:38;;1702:2;1691:9;1687:18;1674:32;1725:18;1766:2;1758:6;1755:14;1752:34;;;1782:1;1779;1772:12;1752:34;1805:49;1846:7;1837:6;1826:9;1822:22;1805:49;:::i;:::-;1795:59;;1873:37;1906:2;1895:9;1891:18;1873:37;:::i;:::-;1863:47;;1963:2;1952:9;1948:18;1935:32;1919:48;;1992:2;1982:8;1979:16;1976:36;;;2008:1;2005;1998:12;1976:36;;2031:51;2074:7;2063:8;2052:9;2048:24;2031:51;:::i;:::-;2021:61;;;1404:684;;;;;;;:::o;2093:180::-;2152:6;2205:2;2193:9;2184:7;2180:23;2176:32;2173:52;;;2221:1;2218;2211:12;2173:52;-1:-1:-1;2244:23:1;;2093:180;-1:-1:-1;2093:180:1:o;2278:177::-;-1:-1:-1;;;;;;2356:5:1;2352:78;2345:5;2342:89;2332:117;;2445:1;2442;2435:12;2460:245;2518:6;2571:2;2559:9;2550:7;2546:23;2542:32;2539:52;;;2587:1;2584;2577:12;2539:52;2626:9;2613:23;2645:30;2669:5;2645:30;:::i;2902:258::-;2974:1;2984:113;2998:6;2995:1;2992:13;2984:113;;;3074:11;;;3068:18;3055:11;;;3048:39;3020:2;3013:10;2984:113;;;3115:6;3112:1;3109:13;3106:48;;;-1:-1:-1;;3150:1:1;3132:16;;3125:27;2902:258::o;3165:::-;3207:3;3245:5;3239:12;3272:6;3267:3;3260:19;3288:63;3344:6;3337:4;3332:3;3328:14;3321:4;3314:5;3310:16;3288:63;:::i;:::-;3405:2;3384:15;-1:-1:-1;;3380:29:1;3371:39;;;;3412:4;3367:50;;3165:258;-1:-1:-1;;3165:258:1:o;3428:220::-;3577:2;3566:9;3559:21;3540:4;3597:45;3638:2;3627:9;3623:18;3615:6;3597:45;:::i;4016:154::-;-1:-1:-1;;;;;4095:5:1;4091:54;4084:5;4081:65;4071:93;;4160:1;4157;4150:12;4175:315;4243:6;4251;4304:2;4292:9;4283:7;4279:23;4275:32;4272:52;;;4320:1;4317;4310:12;4272:52;4359:9;4346:23;4378:31;4403:5;4378:31;:::i;:::-;4428:5;4480:2;4465:18;;;;4452:32;;-1:-1:-1;;;4175:315:1:o;4495:450::-;4564:6;4617:2;4605:9;4596:7;4592:23;4588:32;4585:52;;;4633:1;4630;4623:12;4585:52;4673:9;4660:23;4706:18;4698:6;4695:30;4692:50;;;4738:1;4735;4728:12;4692:50;4761:22;;4814:4;4806:13;;4802:27;-1:-1:-1;4792:55:1;;4843:1;4840;4833:12;4792:55;4866:73;4931:7;4926:2;4913:16;4908:2;4904;4900:11;4866:73;:::i;5132:456::-;5209:6;5217;5225;5278:2;5266:9;5257:7;5253:23;5249:32;5246:52;;;5294:1;5291;5284:12;5246:52;5333:9;5320:23;5352:31;5377:5;5352:31;:::i;:::-;5402:5;-1:-1:-1;5459:2:1;5444:18;;5431:32;5472:33;5431:32;5472:33;:::i;:::-;5132:456;;5524:7;;-1:-1:-1;;;5578:2:1;5563:18;;;;5550:32;;5132:456::o;5593:247::-;5652:6;5705:2;5693:9;5684:7;5680:23;5676:32;5673:52;;;5721:1;5718;5711:12;5673:52;5760:9;5747:23;5779:31;5804:5;5779:31;:::i;5845:160::-;5910:20;;5966:13;;5959:21;5949:32;;5939:60;;5995:1;5992;5985:12;6010:180;6066:6;6119:2;6107:9;6098:7;6094:23;6090:32;6087:52;;;6135:1;6132;6125:12;6087:52;6158:26;6174:9;6158:26;:::i;6195:184::-;6253:6;6306:2;6294:9;6285:7;6281:23;6277:32;6274:52;;;6322:1;6319;6312:12;6274:52;6345:28;6363:9;6345:28;:::i;6607:315::-;6675:6;6683;6736:2;6724:9;6715:7;6711:23;6707:32;6704:52;;;6752:1;6749;6742:12;6704:52;6788:9;6775:23;6765:33;;6848:2;6837:9;6833:18;6820:32;6861:31;6886:5;6861:31;:::i;:::-;6911:5;6901:15;;;6607:315;;;;;:::o;6927:632::-;7098:2;7150:21;;;7220:13;;7123:18;;;7242:22;;;7069:4;;7098:2;7321:15;;;;7295:2;7280:18;;;7069:4;7364:169;7378:6;7375:1;7372:13;7364:169;;;7439:13;;7427:26;;7508:15;;;;7473:12;;;;7400:1;7393:9;7364:169;;;-1:-1:-1;7550:3:1;;6927:632;-1:-1:-1;;;;;;6927:632:1:o;7564:460::-;7649:6;7657;7665;7718:2;7706:9;7697:7;7693:23;7689:32;7686:52;;;7734:1;7731;7724:12;7686:52;7757:28;7775:9;7757:28;:::i;:::-;7747:38;;7836:2;7825:9;7821:18;7808:32;7863:18;7855:6;7852:30;7849:50;;;7895:1;7892;7885:12;7849:50;7918:49;7959:7;7950:6;7939:9;7935:22;7918:49;:::i;:::-;7908:59;;;8014:2;8003:9;7999:18;7986:32;7976:42;;7564:460;;;;;:::o;8282:315::-;8347:6;8355;8408:2;8396:9;8387:7;8383:23;8379:32;8376:52;;;8424:1;8421;8414:12;8376:52;8463:9;8450:23;8482:31;8507:5;8482:31;:::i;:::-;8532:5;-1:-1:-1;8556:35:1;8587:2;8572:18;;8556:35;:::i;:::-;8546:45;;8282:315;;;;;:::o;8602:665::-;8697:6;8705;8713;8721;8774:3;8762:9;8753:7;8749:23;8745:33;8742:53;;;8791:1;8788;8781:12;8742:53;8830:9;8817:23;8849:31;8874:5;8849:31;:::i;:::-;8899:5;-1:-1:-1;8956:2:1;8941:18;;8928:32;8969:33;8928:32;8969:33;:::i;:::-;9021:7;-1:-1:-1;9075:2:1;9060:18;;9047:32;;-1:-1:-1;9130:2:1;9115:18;;9102:32;9157:18;9146:30;;9143:50;;;9189:1;9186;9179:12;9143:50;9212:49;9253:7;9244:6;9233:9;9229:22;9212:49;:::i;9272:252::-;9339:6;9347;9400:2;9388:9;9379:7;9375:23;9371:32;9368:52;;;9416:1;9413;9406:12;9368:52;9439:28;9457:9;9439:28;:::i;9529:347::-;9580:8;9590:6;9644:3;9637:4;9629:6;9625:17;9621:27;9611:55;;9662:1;9659;9652:12;9611:55;-1:-1:-1;9685:20:1;;9728:18;9717:30;;9714:50;;;9760:1;9757;9750:12;9714:50;9797:4;9789:6;9785:17;9773:29;;9849:3;9842:4;9833:6;9825;9821:19;9817:30;9814:39;9811:59;;;9866:1;9863;9856:12;9811:59;9529:347;;;;;:::o;9881:773::-;9985:6;9993;10001;10009;10017;10070:3;10058:9;10049:7;10045:23;10041:33;10038:53;;;10087:1;10084;10077:12;10038:53;10110:28;10128:9;10110:28;:::i;:::-;10100:38;;10189:2;10178:9;10174:18;10161:32;10212:18;10253:2;10245:6;10242:14;10239:34;;;10269:1;10266;10259:12;10239:34;10292:49;10333:7;10324:6;10313:9;10309:22;10292:49;:::i;:::-;10282:59;;10360:37;10393:2;10382:9;10378:18;10360:37;:::i;:::-;10350:47;;10450:2;10439:9;10435:18;10422:32;10406:48;;10479:2;10469:8;10466:16;10463:36;;;10495:1;10492;10485:12;10463:36;;10534:60;10586:7;10575:8;10564:9;10560:24;10534:60;:::i;:::-;9881:773;;;;-1:-1:-1;9881:773:1;;-1:-1:-1;10613:8:1;;10508:86;9881:773;-1:-1:-1;;;9881:773:1:o;10659:388::-;10727:6;10735;10788:2;10776:9;10767:7;10763:23;10759:32;10756:52;;;10804:1;10801;10794:12;10756:52;10843:9;10830:23;10862:31;10887:5;10862:31;:::i;:::-;10912:5;-1:-1:-1;10969:2:1;10954:18;;10941:32;10982:33;10941:32;10982:33;:::i;11052:481::-;11130:6;11138;11146;11199:2;11187:9;11178:7;11174:23;11170:32;11167:52;;;11215:1;11212;11205:12;11167:52;11238:28;11256:9;11238:28;:::i;:::-;11228:38;;11317:2;11306:9;11302:18;11289:32;11344:18;11336:6;11333:30;11330:50;;;11376:1;11373;11366:12;11330:50;11415:58;11465:7;11456:6;11445:9;11441:22;11415:58;:::i;:::-;11052:481;;11492:8;;-1:-1:-1;11389:84:1;;-1:-1:-1;;;;11052:481:1:o;11538:437::-;11617:1;11613:12;;;;11660;;;11681:61;;11735:4;11727:6;11723:17;11713:27;;11681:61;11788:2;11780:6;11777:14;11757:18;11754:38;11751:218;;-1:-1:-1;;;11822:1:1;11815:88;11926:4;11923:1;11916:15;11954:4;11951:1;11944:15;11751:218;;11538:437;;;:::o;11980:692::-;12029:3;12070:5;12064:12;12099:36;12125:9;12099:36;:::i;:::-;12154:1;12171:18;;;12198:104;;;;12316:1;12311:355;;;;12164:502;;12198:104;-1:-1:-1;;12231:24:1;;12219:37;;12276:16;;;;-1:-1:-1;12198:104:1;;12311:355;12342:5;12339:1;12332:16;12371:4;12416:2;12413:1;12403:16;12441:1;12455:165;12469:6;12466:1;12463:13;12455:165;;;12547:14;;12534:11;;;12527:35;12590:16;;;;12484:10;;12455:165;;;12459:3;;;12649:6;12644:3;12640:16;12633:23;;12164:502;;;;;11980:692;;;;:::o;12677:194::-;12803:3;12828:37;12861:3;12853:6;12828:37;:::i;13297:557::-;13554:6;13546;13542:19;13531:9;13524:38;13598:3;13593:2;13582:9;13578:18;13571:31;13505:4;13625:46;13666:3;13655:9;13651:19;13643:6;13625:46;:::i;:::-;13719:18;13711:6;13707:31;13702:2;13691:9;13687:18;13680:59;13787:9;13779:6;13775:22;13770:2;13759:9;13755:18;13748:50;13815:33;13841:6;13833;13815:33;:::i;:::-;13807:41;13297:557;-1:-1:-1;;;;;;;13297:557:1:o;13859:274::-;13988:3;14026:6;14020:13;14042:53;14088:6;14083:3;14076:4;14068:6;14064:17;14042:53;:::i;:::-;14111:16;;;;;13859:274;-1:-1:-1;;13859:274:1:o;15481:184::-;15551:6;15604:2;15592:9;15583:7;15579:23;15575:32;15572:52;;;15620:1;15617;15610:12;15572:52;-1:-1:-1;15643:16:1;;15481:184;-1:-1:-1;15481:184:1:o;16725:::-;-1:-1:-1;;;16774:1:1;16767:88;16874:4;16871:1;16864:15;16898:4;16895:1;16888:15;16914:128;16954:3;16985:1;16981:6;16978:1;16975:13;16972:39;;;16991:18;;:::i;:::-;-1:-1:-1;17027:9:1;;16914:128::o;17396:168::-;17436:7;17502:1;17498;17494:6;17490:14;17487:1;17484:21;17479:1;17472:9;17465:17;17461:45;17458:71;;;17509:18;;:::i;:::-;-1:-1:-1;17549:9:1;;17396:168::o;18270:184::-;-1:-1:-1;;;18319:1:1;18312:88;18419:4;18416:1;18409:15;18443:4;18440:1;18433:15;19936:549;20160:3;20198:6;20192:13;20214:53;20260:6;20255:3;20248:4;20240:6;20236:17;20214:53;:::i;:::-;20330:13;;20289:16;;;;20352:57;20330:13;20289:16;20386:4;20374:17;;20352:57;:::i;:::-;20425:54;20469:8;20462:5;20458:20;20450:6;20425:54;:::i;21942:665::-;22223:6;22215;22211:19;22200:9;22193:38;-1:-1:-1;;;;;22271:6:1;22267:55;22262:2;22251:9;22247:18;22240:83;22359:3;22354:2;22343:9;22339:18;22332:31;22174:4;22386:46;22427:3;22416:9;22412:19;22404:6;22386:46;:::i;:::-;22482:6;22475:14;22468:22;22463:2;22452:9;22448:18;22441:50;22540:9;22532:6;22528:22;22522:3;22511:9;22507:19;22500:51;22568:33;22594:6;22586;22568:33;:::i;:::-;22560:41;21942:665;-1:-1:-1;;;;;;;;21942:665:1:o;22612:245::-;22691:6;22699;22752:2;22740:9;22731:7;22727:23;22723:32;22720:52;;;22768:1;22765;22758:12;22720:52;-1:-1:-1;;22791:16:1;;22847:2;22832:18;;;22826:25;22791:16;;22826:25;;-1:-1:-1;22612:245:1:o;23705:1484::-;24051:6;24043;24039:19;24028:9;24021:38;24002:4;24078:2;24116:3;24111:2;24100:9;24096:18;24089:31;24140:1;24173:6;24167:13;24203:36;24229:9;24203:36;:::i;:::-;24276:6;24270:3;24259:9;24255:19;24248:35;24302:3;24324:1;24356:2;24345:9;24341:18;24373:1;24368:122;;;;24504:1;24499:354;;;;24334:519;;24368:122;-1:-1:-1;;24416:24:1;;24396:18;;;24389:52;24476:3;24461:19;;;-1:-1:-1;24368:122:1;;24499:354;24530:6;24527:1;24520:17;24578:2;24575:1;24565:16;24603:1;24617:180;24631:6;24628:1;24625:13;24617:180;;;24724:14;;24700:17;;;24696:26;;24689:50;24767:16;;;;24646:10;;24617:180;;;24821:17;;24817:26;;;-1:-1:-1;;24334:519:1;;;;;;24898:9;24893:3;24889:19;24884:2;24873:9;24869:18;24862:47;24932:30;24958:3;24950:6;24932:30;:::i;:::-;24918:44;;;24971:46;25013:2;25002:9;24998:18;24990:6;-1:-1:-1;;;;;3719:54:1;3707:67;;3653:127;24971:46;-1:-1:-1;;;;;3719:54:1;;25068:3;25053:19;;3707:67;25122:9;25114:6;25110:22;25104:3;25093:9;25089:19;25082:51;25150:33;25176:6;25168;25150:33;:::i;:::-;25142:41;23705:1484;-1:-1:-1;;;;;;;;;23705:1484:1:o;25601:271::-;25784:6;25776;25771:3;25758:33;25740:3;25810:16;;25835:13;;;25810:16;25601:271;-1:-1:-1;25601:271:1:o;26232:718::-;26499:6;26491;26487:19;26476:9;26469:38;26543:3;26538:2;26527:9;26523:18;26516:31;26450:4;26570:46;26611:3;26600:9;26596:19;26588:6;26570:46;:::i;:::-;26664:18;26656:6;26652:31;26647:2;26636:9;26632:18;26625:59;26732:9;26724:6;26720:22;26715:2;26704:9;26700:18;26693:50;26767:6;26759;26752:22;26821:6;26813;26808:2;26800:6;26796:15;26783:45;26874:1;26869:2;26860:6;26852;26848:19;26844:28;26837:39;26941:2;26934;26930:7;26925:2;26917:6;26913:15;26909:29;26901:6;26897:42;26893:51;26885:59;;;26232:718;;;;;;;;:::o;27362:320::-;27449:6;27457;27510:2;27498:9;27489:7;27485:23;27481:32;27478:52;;;27526:1;27523;27516:12;27478:52;27558:9;27552:16;27577:31;27602:5;27577:31;:::i;:::-;27672:2;27657:18;;;;27651:25;27627:5;;27651:25;;-1:-1:-1;;;27362:320:1:o;27687:512::-;27881:4;-1:-1:-1;;;;;27991:2:1;27983:6;27979:15;27968:9;27961:34;28043:2;28035:6;28031:15;28026:2;28015:9;28011:18;28004:43;;28083:6;28078:2;28067:9;28063:18;28056:34;28126:3;28121:2;28110:9;28106:18;28099:31;28147:46;28188:3;28177:9;28173:19;28165:6;28147:46;:::i;:::-;28139:54;27687:512;-1:-1:-1;;;;;;27687:512:1:o;28204:249::-;28273:6;28326:2;28314:9;28305:7;28301:23;28297:32;28294:52;;;28342:1;28339;28332:12;28294:52;28374:9;28368:16;28393:30;28417:5;28393:30;:::i;28458:135::-;28497:3;28518:17;;;28515:43;;28538:18;;:::i;:::-;-1:-1:-1;28585:1:1;28574:13;;28458:135::o;28598:184::-;-1:-1:-1;;;28647:1:1;28640:88;28747:4;28744:1;28737:15;28771:4;28768:1;28761:15;28787:120;28827:1;28853;28843:35;;28858:18;;:::i;:::-;-1:-1:-1;28892:9:1;;28787:120::o;28912:125::-;28952:4;28980:1;28977;28974:8;28971:34;;;28985:18;;:::i;:::-;-1:-1:-1;29022:9:1;;28912:125::o;29042:112::-;29074:1;29100;29090:35;;29105:18;;:::i;:::-;-1:-1:-1;29139:9:1;;29042:112::o
Swarm Source
ipfs://53953fab0fb484c4824d187b273727cbc7ac8abf42ba7c4aa7c7e2da07a28ff1
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.