Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
2,374 AstroBoyRedBoots
Holders
1,013
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 AstroBoyRedBootsLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
AstroBoyRedBoots
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import './ERC721A.sol'; import './StartTokenIdHelper.sol'; import './MerkleProof.sol'; contract AstroBoyRedBoots is StartTokenIdHelper, ERC721A { struct Config { uint256 total; uint256 limit; uint256 count; uint256 starttime; uint256 endtime; bytes32 root; mapping(address => uint256) records; } mapping(uint256 => Config) public configs; uint256 public index; address public owner; string public uri; bool public paused; modifier onlyOwner() { require(msg.sender == owner, "caller is not owner"); _; } constructor(string memory name, string memory symbol, string memory baseURI) StartTokenIdHelper(1) ERC721A(name, symbol) { owner = msg.sender; uri = baseURI; } function freeMint(bytes32[] memory proof) external { require(!paused, "paused"); require(msg.sender.code.length == 0, "not allow"); require(check(index, msg.sender, proof), "not eligible for mint"); require(block.timestamp >= configs[index].starttime, "not start"); require(block.timestamp < configs[index].endtime, "is over"); require(configs[index].count < configs[index].total, "sold out"); require(configs[index].records[msg.sender] + 1 <= configs[index].limit, "exceed the limit"); configs[index].count += 1; configs[index].records[msg.sender] += 1; _safeMint(msg.sender, 1); } function safeMint(address to, uint256 quantity) external onlyOwner { _safeMint(to, quantity); } function setConfig(uint256 idx, uint256 total, uint256 limit, uint256 starttime, uint256 endtime, bytes32 root) external onlyOwner { Config storage config = configs[idx]; config.total = total; config.limit = limit; config.starttime = starttime; config.endtime = endtime; config.root = root; index = idx; } function setIndex(uint256 idx) external onlyOwner { index = idx; } function pause() external onlyOwner { paused = true; } function unpause() external onlyOwner { paused = false; } function check(uint256 idx, address addr, bytes32[] memory proof) public view returns (bool) { bytes32 leaf = keccak256(bytes.concat(keccak256(abi.encode(addr, 0)))); return MerkleProof.verify(proof, configs[idx].root, leaf); } function queryRecords(uint256 idx, address addr) external view returns(uint256) { return configs[idx].records[addr]; } function numberMinted(address addr) public view returns (uint256) { return _numberMinted(addr); } function totalMinted() public view returns (uint256) { return _totalMinted(); } function exists(uint256 tokenId) public view returns (bool) { return _exists(tokenId); } function _baseURI() internal view virtual override returns (string memory) { return uri; } function _startTokenId() internal view virtual override returns (uint256) { return startTokenId(); } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; import './IERC721A.sol'; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) _revert(BalanceQueryForZeroAddress.selector); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) _revert(URIQueryForNonexistentToken.selector); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Returns whether the ownership slot at `index` is initialized. * An uninitialized slot does not necessarily mean that the slot has no owner. */ function _ownershipIsInitialized(uint256 index) internal view virtual returns (bool) { return _packedOwnerships[index] != 0; } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256 packed) { if (_startTokenId() <= tokenId) { packed = _packedOwnerships[tokenId]; // If the data at the starting slot does not exist, start the scan. if (packed == 0) { if (tokenId >= _currentIndex) _revert(OwnerQueryForNonexistentToken.selector); // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `tokenId` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. for (;;) { unchecked { packed = _packedOwnerships[--tokenId]; } if (packed == 0) continue; if (packed & _BITMASK_BURNED == 0) return packed; // Otherwise, the token is burned, and we must revert. // This handles the case of batch burned tokens, where only the burned bit // of the starting slot is set, and remaining slots are left uninitialized. _revert(OwnerQueryForNonexistentToken.selector); } } // Otherwise, the data exists and we can skip the scan. // This is possible because we have already achieved the target condition. // This saves 2143 gas on transfers of initialized tokens. // If the token is not burned, return `packed`. Otherwise, revert. if (packed & _BITMASK_BURNED == 0) return packed; } _revert(OwnerQueryForNonexistentToken.selector); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}. * * Requirements: * * - The caller must own the token or be an approved operator. */ function approve(address to, uint256 tokenId) public payable virtual override { _approve(to, tokenId, true); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) _revert(ApprovalQueryForNonexistentToken.selector); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool result) { if (_startTokenId() <= tokenId) { if (tokenId < _currentIndex) { uint256 packed; while ((packed = _packedOwnerships[tokenId]) == 0) --tokenId; result = packed & _BITMASK_BURNED == 0; } } } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean. from = address(uint160(uint256(uint160(from)) & _BITMASK_ADDRESS)); if (address(uint160(prevOwnershipPacked)) != from) _revert(TransferFromIncorrectOwner.selector); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) _revert(TransferCallerNotOwnerNorApproved.selector); _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; } } } } // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS; assembly { // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. from, // `from`. toMasked, // `to`. tokenId // `tokenId`. ) } if (toMasked == 0) _revert(TransferToZeroAddress.selector); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { _revert(TransferToNonERC721ReceiverImplementer.selector); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { _revert(TransferToNonERC721ReceiverImplementer.selector); } assembly { revert(add(32, reason), mload(reason)) } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) _revert(MintZeroQuantity.selector); _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: // - `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) ); // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS; if (toMasked == 0) _revert(MintToZeroAddress.selector); uint256 end = startTokenId + quantity; uint256 tokenId = startTokenId; do { assembly { // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. tokenId // `tokenId`. ) } // The `!=` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. } 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 virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) _revert(MintToZeroAddress.selector); if (quantity == 0) _revert(MintZeroQuantity.selector); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) _revert(MintERC2309QuantityExceedsLimit.selector); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { _revert(TransferToNonERC721ReceiverImplementer.selector); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) _revert(bytes4(0)); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Equivalent to `_approve(to, tokenId, false)`. */ function _approve(address to, uint256 tokenId) internal virtual { _approve(to, tokenId, false); } /** * @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: * * - `tokenId` must exist. * * Emits an {Approval} event. */ function _approve( address to, uint256 tokenId, bool approvalCheck ) internal virtual { address owner = ownerOf(tokenId); if (approvalCheck && _msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { _revert(ApprovalCallerNotOwnerNorApproved.selector); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) _revert(TransferCallerNotOwnerNorApproved.selector); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) _revert(OwnershipNotInitializedForExtraData.selector); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } /** * @dev For more efficient reverts. */ function _revert(bytes4 errorSelector) internal pure { assembly { mstore(0x00, errorSelector) revert(0x00, 0x04) } } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @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 payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.3 // Creators: Chiru Labs pragma solidity ^0.8.4; /** * This Helper is used to return a dynamic value in the overridden _startTokenId() function. * Extending this Helper before the ERC721A contract give us access to the herein set `startTokenId` * to be returned by the overridden `_startTokenId()` function of ERC721A in the ERC721AStartTokenId mocks. */ contract StartTokenIdHelper { // `bytes4(keccak256('startTokenId'))`. uint256 private constant _START_TOKEN_ID_STORAGE_SLOT = 0x28f75032; constructor(uint256 startTokenId_) { _initializeStartTokenId(startTokenId_); } function startTokenId() public view returns (uint256 result) { assembly { result := sload(_START_TOKEN_ID_STORAGE_SLOT) } } function _initializeStartTokenId(uint256 value) private { // We use assembly to directly set the `startTokenId` in storage so that // inheriting this class won't affect the layout of other storage slots. assembly { sstore(_START_TOKEN_ID_STORAGE_SLOT, value) } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"idx","type":"uint256"},{"internalType":"address","name":"addr","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"check","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"configs","outputs":[{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256","name":"starttime","type":"uint256"},{"internalType":"uint256","name":"endtime","type":"uint256"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"index","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"idx","type":"uint256"},{"internalType":"address","name":"addr","type":"address"}],"name":"queryRecords","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"idx","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"},{"internalType":"uint256","name":"starttime","type":"uint256"},{"internalType":"uint256","name":"endtime","type":"uint256"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"idx","type":"uint256"}],"name":"setIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTokenId","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","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":"payable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620037cb380380620037cb8339818101604052810190620000379190620002a6565b828260016200004c81620000e560201b60201c565b5081600290816200005e9190620005aa565b508060039081620000709190620005aa565b5062000081620000ef60201b60201c565b600081905550505033600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b9081620000db9190620005aa565b5050505062000691565b806328f750325550565b6000620001016200010660201b60201c565b905090565b60006328f7503254905090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200017c8262000131565b810181811067ffffffffffffffff821117156200019e576200019d62000142565b5b80604052505050565b6000620001b362000113565b9050620001c1828262000171565b919050565b600067ffffffffffffffff821115620001e457620001e362000142565b5b620001ef8262000131565b9050602081019050919050565b60005b838110156200021c578082015181840152602081019050620001ff565b60008484015250505050565b60006200023f6200023984620001c6565b620001a7565b9050828152602081018484840111156200025e576200025d6200012c565b5b6200026b848285620001fc565b509392505050565b600082601f8301126200028b576200028a62000127565b5b81516200029d84826020860162000228565b91505092915050565b600080600060608486031215620002c257620002c16200011d565b5b600084015167ffffffffffffffff811115620002e357620002e262000122565b5b620002f18682870162000273565b935050602084015167ffffffffffffffff81111562000315576200031462000122565b5b620003238682870162000273565b925050604084015167ffffffffffffffff81111562000347576200034662000122565b5b620003558682870162000273565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003b257607f821691505b602082108103620003c857620003c76200036a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004327fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003f3565b6200043e8683620003f3565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200048b620004856200047f8462000456565b62000460565b62000456565b9050919050565b6000819050919050565b620004a7836200046a565b620004bf620004b68262000492565b84845462000400565b825550505050565b600090565b620004d6620004c7565b620004e38184846200049c565b505050565b5b818110156200050b57620004ff600082620004cc565b600181019050620004e9565b5050565b601f8211156200055a576200052481620003ce565b6200052f84620003e3565b810160208510156200053f578190505b620005576200054e85620003e3565b830182620004e8565b50505b505050565b600082821c905092915050565b60006200057f600019846008026200055f565b1980831691505092915050565b60006200059a83836200056c565b9150826002028217905092915050565b620005b5826200035f565b67ffffffffffffffff811115620005d157620005d062000142565b5b620005dd825462000399565b620005ea8282856200050f565b600060209050601f8311600181146200062257600084156200060d578287015190505b6200061985826200058c565b86555062000689565b601f1984166200063286620003ce565b60005b828110156200065c5784890151825560018201915060208501945060208101905062000635565b868310156200067c578489015162000678601f8916826200056c565b8355505b6001600288020188555050505b505050505050565b61312a80620006a16000396000f3fe6080604052600436106101d75760003560e01c80637b4fa65011610102578063a2309ff811610095578063dc33e68111610064578063dc33e6811461069e578063e6798baa146106db578063e985e9c514610706578063eac989f814610743576101d7565b8063a2309ff8146105f1578063b02c5c111461061c578063b88d4fde14610645578063c87b56dd14610661576101d7565b80638da5cb5b116100d15780638da5cb5b1461054957806395d89b4114610574578063a14481941461059f578063a22cb465146105c8576101d7565b80637b4fa6501461048f5780638456cb59146104cc57806388d15d50146104e35780638c4582b01461050c576101d7565b80632986c0e51161017a5780634f558e79116101495780634f558e79146103ad5780635c975abb146103ea5780636352211e1461041557806370a0823114610452576101d7565b80632986c0e5146103265780633f4ba83a1461035157806340a5737f1461036857806342842e0e14610391576101d7565b8063081812fc116101b6578063081812fc14610286578063095ea7b3146102c357806318160ddd146102df57806323b872dd1461030a576101d7565b806298fa22146101dc57806301ffc9a71461021e57806306fdde031461025b575b600080fd5b3480156101e857600080fd5b5061020360048036038101906101fe91906121d4565b61076e565b60405161021596959493929190612229565b60405180910390f35b34801561022a57600080fd5b50610245600480360381019061024091906122e2565b6107aa565b604051610252919061232a565b60405180910390f35b34801561026757600080fd5b5061027061083c565b60405161027d91906123d5565b60405180910390f35b34801561029257600080fd5b506102ad60048036038101906102a891906121d4565b6108ce565b6040516102ba9190612438565b60405180910390f35b6102dd60048036038101906102d8919061247f565b61092c565b005b3480156102eb57600080fd5b506102f461093c565b60405161030191906124bf565b60405180910390f35b610324600480360381019061031f91906124da565b610953565b005b34801561033257600080fd5b5061033b610c14565b60405161034891906124bf565b60405180910390f35b34801561035d57600080fd5b50610366610c1a565b005b34801561037457600080fd5b5061038f600480360381019061038a91906121d4565b610cc7565b005b6103ab60048036038101906103a691906124da565b610d61565b005b3480156103b957600080fd5b506103d460048036038101906103cf91906121d4565b610d81565b6040516103e1919061232a565b60405180910390f35b3480156103f657600080fd5b506103ff610d93565b60405161040c919061232a565b60405180910390f35b34801561042157600080fd5b5061043c600480360381019061043791906121d4565b610da6565b6040516104499190612438565b60405180910390f35b34801561045e57600080fd5b506104796004803603810190610474919061252d565b610db8565b60405161048691906124bf565b60405180910390f35b34801561049b57600080fd5b506104b660048036038101906104b191906126ce565b610e4f565b6040516104c3919061232a565b60405180910390f35b3480156104d857600080fd5b506104e1610ecf565b005b3480156104ef57600080fd5b5061050a6004803603810190610505919061273d565b610f7c565b005b34801561051857600080fd5b50610533600480360381019061052e9190612786565b611300565b60405161054091906124bf565b60405180910390f35b34801561055557600080fd5b5061055e61135e565b60405161056b9190612438565b60405180910390f35b34801561058057600080fd5b50610589611384565b60405161059691906123d5565b60405180910390f35b3480156105ab57600080fd5b506105c660048036038101906105c1919061247f565b611416565b005b3480156105d457600080fd5b506105ef60048036038101906105ea91906127f2565b6114b4565b005b3480156105fd57600080fd5b506106066115bf565b60405161061391906124bf565b60405180910390f35b34801561062857600080fd5b50610643600480360381019061063e9190612832565b6115ce565b005b61065f600480360381019061065a9190612974565b6116b2565b005b34801561066d57600080fd5b50610688600480360381019061068391906121d4565b611704565b60405161069591906123d5565b60405180910390f35b3480156106aa57600080fd5b506106c560048036038101906106c0919061252d565b611781565b6040516106d291906124bf565b60405180910390f35b3480156106e757600080fd5b506106f0611793565b6040516106fd91906124bf565b60405180910390f35b34801561071257600080fd5b5061072d600480360381019061072891906129f7565b6117a0565b60405161073a919061232a565b60405180910390f35b34801561074f57600080fd5b50610758611834565b60405161076591906123d5565b60405180910390f35b60086020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154905086565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061080557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108355750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461084b90612a66565b80601f016020809104026020016040519081016040528092919081815260200182805461087790612a66565b80156108c45780601f10610899576101008083540402835291602001916108c4565b820191906000526020600020905b8154815290600101906020018083116108a757829003601f168201915b5050505050905090565b60006108d9826118c2565b6108ee576108ed63cf4700e460e01b61193b565b5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61093882826001611945565b5050565b6000610946611a74565b6001546000540303905090565b600061095e82611a83565b905073ffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff161693508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109d3576109d263a114810060e01b61193b565b5b6000806109df84611b6f565b915091506109f581876109f0611b96565b611b9e565b610a2057610a0a86610a05611b96565b6117a0565b610a1f57610a1e6359c896be60e01b61193b565b5b5b610a2d8686866001611be2565b8015610a3857600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610b0685610ae2888887611be8565b7c020000000000000000000000000000000000000000000000000000000017611c10565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610b8c5760006001850190506000600460008381526020019081526020016000205403610b8a576000548114610b89578360046000838152602001908152602001600020819055505b5b505b600073ffffffffffffffffffffffffffffffffffffffff8673ffffffffffffffffffffffffffffffffffffffff161690508481887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460008103610bfe57610bfd63ea553b3460e01b61193b565b5b610c0b8787876001611c3b565b50505050505050565b60095481565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca190612ae3565b60405180910390fd5b6000600c60006101000a81548160ff021916908315150217905550565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4e90612ae3565b60405180910390fd5b8060098190555050565b610d7c838383604051806020016040528060008152506116b2565b505050565b6000610d8c826118c2565b9050919050565b600c60009054906101000a900460ff1681565b6000610db182611a83565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610dfe57610dfd638f4eb60460e01b61193b565b5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b600080836000604051602001610e66929190612b55565b60405160208183030381529060405280519060200120604051602001610e8c9190612b9f565b604051602081830303815290604052805190602001209050610ec583600860008881526020019081526020016000206005015483611c41565b9150509392505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5690612ae3565b60405180910390fd5b6001600c60006101000a81548160ff021916908315150217905550565b600c60009054906101000a900460ff1615610fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc390612c06565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff163b14611026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101d90612c72565b60405180910390fd5b6110336009543383610e4f565b611072576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106990612cde565b60405180910390fd5b600860006009548152602001908152602001600020600301544210156110cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c490612d4a565b60405180910390fd5b600860006009548152602001908152602001600020600401544210611127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111e90612db6565b60405180910390fd5b600860006009548152602001908152602001600020600001546008600060095481526020019081526020016000206002015410611199576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119090612e22565b60405180910390fd5b60086000600954815260200190815260200160002060010154600160086000600954815260200190815260200160002060060160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112149190612e71565b1115611255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124c90612ef1565b60405180910390fd5b6001600860006009548152602001908152602001600020600201600082825461127e9190612e71565b92505081905550600160086000600954815260200190815260200160002060060160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112eb9190612e71565b925050819055506112fd336001611c58565b50565b60006008600084815260200190815260200160002060060160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606003805461139390612a66565b80601f01602080910402602001604051908101604052809291908181526020018280546113bf90612a66565b801561140c5780601f106113e15761010080835404028352916020019161140c565b820191906000526020600020905b8154815290600101906020018083116113ef57829003601f168201915b5050505050905090565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149d90612ae3565b60405180910390fd5b6114b08282611c58565b5050565b80600760006114c1611b96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661156e611b96565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115b3919061232a565b60405180910390a35050565b60006115c9611c76565b905090565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461165e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165590612ae3565b60405180910390fd5b60006008600088815260200190815260200160002090508581600001819055508481600101819055508381600301819055508281600401819055508181600501819055508660098190555050505050505050565b6116bd848484610953565b60008373ffffffffffffffffffffffffffffffffffffffff163b146116fe576116e884848484611c89565b6116fd576116fc63d1a57ed660e01b61193b565b5b5b50505050565b606061170f826118c2565b6117245761172363a14c4b5060e01b61193b565b5b600061172e611db8565b9050600081510361174e5760405180602001604052806000815250611779565b8061175884611e4a565b604051602001611769929190612f4d565b6040516020818303038152906040525b915050919050565b600061178c82611e9a565b9050919050565b60006328f7503254905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b805461184190612a66565b80601f016020809104026020016040519081016040528092919081815260200182805461186d90612a66565b80156118ba5780601f1061188f576101008083540402835291602001916118ba565b820191906000526020600020905b81548152906001019060200180831161189d57829003601f168201915b505050505081565b6000816118cd611a74565b11611936576000548210156119355760005b600060046000858152602001908152602001600020549150810361190e578261190790612f71565b92506118df565b60007c01000000000000000000000000000000000000000000000000000000008216149150505b5b919050565b8060005260046000fd5b600061195083610da6565b905081801561199257508073ffffffffffffffffffffffffffffffffffffffff16611979611b96565b73ffffffffffffffffffffffffffffffffffffffff1614155b156119be576119a8816119a3611b96565b6117a0565b6119bd576119bc63cfb3b94260e01b61193b565b5b5b836006600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b6000611a7e611793565b905090565b600081611a8e611a74565b11611b59576004600083815260200190815260200160002054905060008103611b30576000548210611acb57611aca63df2d9b4260e01b61193b565b5b5b60046000836001900393508381526020019081526020016000205490506000810315611b2b5760007c010000000000000000000000000000000000000000000000000000000082160315611b6a57611b2a63df2d9b4260e01b61193b565b5b611acc565b60007c010000000000000000000000000000000000000000000000000000000082160315611b6a575b611b6963df2d9b4260e01b61193b565b5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611bff868684611ef1565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600082611c4e8584611efa565b1490509392505050565b611c72828260405180602001604052806000815250611f50565b5050565b6000611c80611a74565b60005403905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611caf611b96565b8786866040518563ffffffff1660e01b8152600401611cd19493929190612fef565b6020604051808303816000875af1925050508015611d0d57506040513d601f19601f82011682018060405250810190611d0a9190613050565b60015b611d65573d8060008114611d3d576040519150601f19603f3d011682016040523d82523d6000602084013e611d42565b606091505b506000815103611d5d57611d5c63d1a57ed660e01b61193b565b5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b8054611dc790612a66565b80601f0160208091040260200160405190810160405280929190818152602001828054611df390612a66565b8015611e405780601f10611e1557610100808354040283529160200191611e40565b820191906000526020600020905b815481529060010190602001808311611e2357829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115611e8557600184039350600a81066030018453600a8104905080611e63575b50828103602084039350808452505050919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60009392505050565b60008082905060005b8451811015611f4557611f3082868381518110611f2357611f2261307d565b5b6020026020010151611fd5565b91508080611f3d906130ac565b915050611f03565b508091505092915050565b611f5a8383612000565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611fd057600080549050600083820390505b611f9a6000868380600101945086611c89565b611faf57611fae63d1a57ed660e01b61193b565b5b818110611f87578160005414611fcd57611fcc600060e01b61193b565b5b50505b505050565b6000818310611fed57611fe88284612163565b611ff8565b611ff78383612163565b5b905092915050565b6000805490506000820361201f5761201e63b562e8dd60e01b61193b565b5b61202c6000848385611be2565b61204c8361203d6000866000611be8565b6120468561217a565b17611c10565b6004600083815260200190815260200160002081905550600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600073ffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff161690506000810361210457612103632e07630060e01b61193b565b5b6000838301905060008390505b808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4818160010191508103612111578160008190555050505061215e6000848385611c3b565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6121b18161219e565b81146121bc57600080fd5b50565b6000813590506121ce816121a8565b92915050565b6000602082840312156121ea576121e9612194565b5b60006121f8848285016121bf565b91505092915050565b61220a8161219e565b82525050565b6000819050919050565b61222381612210565b82525050565b600060c08201905061223e6000830189612201565b61224b6020830188612201565b6122586040830187612201565b6122656060830186612201565b6122726080830185612201565b61227f60a083018461221a565b979650505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6122bf8161228a565b81146122ca57600080fd5b50565b6000813590506122dc816122b6565b92915050565b6000602082840312156122f8576122f7612194565b5b6000612306848285016122cd565b91505092915050565b60008115159050919050565b6123248161230f565b82525050565b600060208201905061233f600083018461231b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561237f578082015181840152602081019050612364565b60008484015250505050565b6000601f19601f8301169050919050565b60006123a782612345565b6123b18185612350565b93506123c1818560208601612361565b6123ca8161238b565b840191505092915050565b600060208201905081810360008301526123ef818461239c565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612422826123f7565b9050919050565b61243281612417565b82525050565b600060208201905061244d6000830184612429565b92915050565b61245c81612417565b811461246757600080fd5b50565b60008135905061247981612453565b92915050565b6000806040838503121561249657612495612194565b5b60006124a48582860161246a565b92505060206124b5858286016121bf565b9150509250929050565b60006020820190506124d46000830184612201565b92915050565b6000806000606084860312156124f3576124f2612194565b5b60006125018682870161246a565b93505060206125128682870161246a565b9250506040612523868287016121bf565b9150509250925092565b60006020828403121561254357612542612194565b5b60006125518482850161246a565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6125978261238b565b810181811067ffffffffffffffff821117156125b6576125b561255f565b5b80604052505050565b60006125c961218a565b90506125d5828261258e565b919050565b600067ffffffffffffffff8211156125f5576125f461255f565b5b602082029050602081019050919050565b600080fd5b61261481612210565b811461261f57600080fd5b50565b6000813590506126318161260b565b92915050565b600061264a612645846125da565b6125bf565b9050808382526020820190506020840283018581111561266d5761266c612606565b5b835b8181101561269657806126828882612622565b84526020840193505060208101905061266f565b5050509392505050565b600082601f8301126126b5576126b461255a565b5b81356126c5848260208601612637565b91505092915050565b6000806000606084860312156126e7576126e6612194565b5b60006126f5868287016121bf565b93505060206127068682870161246a565b925050604084013567ffffffffffffffff81111561272757612726612199565b5b612733868287016126a0565b9150509250925092565b60006020828403121561275357612752612194565b5b600082013567ffffffffffffffff81111561277157612770612199565b5b61277d848285016126a0565b91505092915050565b6000806040838503121561279d5761279c612194565b5b60006127ab858286016121bf565b92505060206127bc8582860161246a565b9150509250929050565b6127cf8161230f565b81146127da57600080fd5b50565b6000813590506127ec816127c6565b92915050565b6000806040838503121561280957612808612194565b5b60006128178582860161246a565b9250506020612828858286016127dd565b9150509250929050565b60008060008060008060c0878903121561284f5761284e612194565b5b600061285d89828a016121bf565b965050602061286e89828a016121bf565b955050604061287f89828a016121bf565b945050606061289089828a016121bf565b93505060806128a189828a016121bf565b92505060a06128b289828a01612622565b9150509295509295509295565b600080fd5b600067ffffffffffffffff8211156128df576128de61255f565b5b6128e88261238b565b9050602081019050919050565b82818337600083830152505050565b6000612917612912846128c4565b6125bf565b905082815260208101848484011115612933576129326128bf565b5b61293e8482856128f5565b509392505050565b600082601f83011261295b5761295a61255a565b5b813561296b848260208601612904565b91505092915050565b6000806000806080858703121561298e5761298d612194565b5b600061299c8782880161246a565b94505060206129ad8782880161246a565b93505060406129be878288016121bf565b925050606085013567ffffffffffffffff8111156129df576129de612199565b5b6129eb87828801612946565b91505092959194509250565b60008060408385031215612a0e57612a0d612194565b5b6000612a1c8582860161246a565b9250506020612a2d8582860161246a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612a7e57607f821691505b602082108103612a9157612a90612a37565b5b50919050565b7f63616c6c6572206973206e6f74206f776e657200000000000000000000000000600082015250565b6000612acd601383612350565b9150612ad882612a97565b602082019050919050565b60006020820190508181036000830152612afc81612ac0565b9050919050565b6000819050919050565b600060ff82169050919050565b6000819050919050565b6000612b3f612b3a612b3584612b03565b612b1a565b612b0d565b9050919050565b612b4f81612b24565b82525050565b6000604082019050612b6a6000830185612429565b612b776020830184612b46565b9392505050565b6000819050919050565b612b99612b9482612210565b612b7e565b82525050565b6000612bab8284612b88565b60208201915081905092915050565b7f7061757365640000000000000000000000000000000000000000000000000000600082015250565b6000612bf0600683612350565b9150612bfb82612bba565b602082019050919050565b60006020820190508181036000830152612c1f81612be3565b9050919050565b7f6e6f7420616c6c6f770000000000000000000000000000000000000000000000600082015250565b6000612c5c600983612350565b9150612c6782612c26565b602082019050919050565b60006020820190508181036000830152612c8b81612c4f565b9050919050565b7f6e6f7420656c696769626c6520666f72206d696e740000000000000000000000600082015250565b6000612cc8601583612350565b9150612cd382612c92565b602082019050919050565b60006020820190508181036000830152612cf781612cbb565b9050919050565b7f6e6f742073746172740000000000000000000000000000000000000000000000600082015250565b6000612d34600983612350565b9150612d3f82612cfe565b602082019050919050565b60006020820190508181036000830152612d6381612d27565b9050919050565b7f6973206f76657200000000000000000000000000000000000000000000000000600082015250565b6000612da0600783612350565b9150612dab82612d6a565b602082019050919050565b60006020820190508181036000830152612dcf81612d93565b9050919050565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b6000612e0c600883612350565b9150612e1782612dd6565b602082019050919050565b60006020820190508181036000830152612e3b81612dff565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e7c8261219e565b9150612e878361219e565b9250828201905080821115612e9f57612e9e612e42565b5b92915050565b7f65786365656420746865206c696d697400000000000000000000000000000000600082015250565b6000612edb601083612350565b9150612ee682612ea5565b602082019050919050565b60006020820190508181036000830152612f0a81612ece565b9050919050565b600081905092915050565b6000612f2782612345565b612f318185612f11565b9350612f41818560208601612361565b80840191505092915050565b6000612f598285612f1c565b9150612f658284612f1c565b91508190509392505050565b6000612f7c8261219e565b915060008203612f8f57612f8e612e42565b5b600182039050919050565b600081519050919050565b600082825260208201905092915050565b6000612fc182612f9a565b612fcb8185612fa5565b9350612fdb818560208601612361565b612fe48161238b565b840191505092915050565b60006080820190506130046000830187612429565b6130116020830186612429565b61301e6040830185612201565b81810360608301526130308184612fb6565b905095945050505050565b60008151905061304a816122b6565b92915050565b60006020828403121561306657613065612194565b5b60006130748482850161303b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006130b78261219e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036130e9576130e8612e42565b5b60018201905091905056fea2646970667358221220f83a4ee460121d471518fc915ae899963ffdef0d599f21b0035a4a0ed36461c664736f6c63430008120033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000028417374726f20426f792052656420426f6f7473202d2054434f4d206f662041434720576f726c64730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010417374726f426f79526564426f6f747300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b68747470733a2f2f6163672d6e66742e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f73686f65732f6a736f6e2f0000000000
Deployed Bytecode
0x6080604052600436106101d75760003560e01c80637b4fa65011610102578063a2309ff811610095578063dc33e68111610064578063dc33e6811461069e578063e6798baa146106db578063e985e9c514610706578063eac989f814610743576101d7565b8063a2309ff8146105f1578063b02c5c111461061c578063b88d4fde14610645578063c87b56dd14610661576101d7565b80638da5cb5b116100d15780638da5cb5b1461054957806395d89b4114610574578063a14481941461059f578063a22cb465146105c8576101d7565b80637b4fa6501461048f5780638456cb59146104cc57806388d15d50146104e35780638c4582b01461050c576101d7565b80632986c0e51161017a5780634f558e79116101495780634f558e79146103ad5780635c975abb146103ea5780636352211e1461041557806370a0823114610452576101d7565b80632986c0e5146103265780633f4ba83a1461035157806340a5737f1461036857806342842e0e14610391576101d7565b8063081812fc116101b6578063081812fc14610286578063095ea7b3146102c357806318160ddd146102df57806323b872dd1461030a576101d7565b806298fa22146101dc57806301ffc9a71461021e57806306fdde031461025b575b600080fd5b3480156101e857600080fd5b5061020360048036038101906101fe91906121d4565b61076e565b60405161021596959493929190612229565b60405180910390f35b34801561022a57600080fd5b50610245600480360381019061024091906122e2565b6107aa565b604051610252919061232a565b60405180910390f35b34801561026757600080fd5b5061027061083c565b60405161027d91906123d5565b60405180910390f35b34801561029257600080fd5b506102ad60048036038101906102a891906121d4565b6108ce565b6040516102ba9190612438565b60405180910390f35b6102dd60048036038101906102d8919061247f565b61092c565b005b3480156102eb57600080fd5b506102f461093c565b60405161030191906124bf565b60405180910390f35b610324600480360381019061031f91906124da565b610953565b005b34801561033257600080fd5b5061033b610c14565b60405161034891906124bf565b60405180910390f35b34801561035d57600080fd5b50610366610c1a565b005b34801561037457600080fd5b5061038f600480360381019061038a91906121d4565b610cc7565b005b6103ab60048036038101906103a691906124da565b610d61565b005b3480156103b957600080fd5b506103d460048036038101906103cf91906121d4565b610d81565b6040516103e1919061232a565b60405180910390f35b3480156103f657600080fd5b506103ff610d93565b60405161040c919061232a565b60405180910390f35b34801561042157600080fd5b5061043c600480360381019061043791906121d4565b610da6565b6040516104499190612438565b60405180910390f35b34801561045e57600080fd5b506104796004803603810190610474919061252d565b610db8565b60405161048691906124bf565b60405180910390f35b34801561049b57600080fd5b506104b660048036038101906104b191906126ce565b610e4f565b6040516104c3919061232a565b60405180910390f35b3480156104d857600080fd5b506104e1610ecf565b005b3480156104ef57600080fd5b5061050a6004803603810190610505919061273d565b610f7c565b005b34801561051857600080fd5b50610533600480360381019061052e9190612786565b611300565b60405161054091906124bf565b60405180910390f35b34801561055557600080fd5b5061055e61135e565b60405161056b9190612438565b60405180910390f35b34801561058057600080fd5b50610589611384565b60405161059691906123d5565b60405180910390f35b3480156105ab57600080fd5b506105c660048036038101906105c1919061247f565b611416565b005b3480156105d457600080fd5b506105ef60048036038101906105ea91906127f2565b6114b4565b005b3480156105fd57600080fd5b506106066115bf565b60405161061391906124bf565b60405180910390f35b34801561062857600080fd5b50610643600480360381019061063e9190612832565b6115ce565b005b61065f600480360381019061065a9190612974565b6116b2565b005b34801561066d57600080fd5b50610688600480360381019061068391906121d4565b611704565b60405161069591906123d5565b60405180910390f35b3480156106aa57600080fd5b506106c560048036038101906106c0919061252d565b611781565b6040516106d291906124bf565b60405180910390f35b3480156106e757600080fd5b506106f0611793565b6040516106fd91906124bf565b60405180910390f35b34801561071257600080fd5b5061072d600480360381019061072891906129f7565b6117a0565b60405161073a919061232a565b60405180910390f35b34801561074f57600080fd5b50610758611834565b60405161076591906123d5565b60405180910390f35b60086020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154905086565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061080557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108355750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461084b90612a66565b80601f016020809104026020016040519081016040528092919081815260200182805461087790612a66565b80156108c45780601f10610899576101008083540402835291602001916108c4565b820191906000526020600020905b8154815290600101906020018083116108a757829003601f168201915b5050505050905090565b60006108d9826118c2565b6108ee576108ed63cf4700e460e01b61193b565b5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61093882826001611945565b5050565b6000610946611a74565b6001546000540303905090565b600061095e82611a83565b905073ffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff161693508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109d3576109d263a114810060e01b61193b565b5b6000806109df84611b6f565b915091506109f581876109f0611b96565b611b9e565b610a2057610a0a86610a05611b96565b6117a0565b610a1f57610a1e6359c896be60e01b61193b565b5b5b610a2d8686866001611be2565b8015610a3857600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610b0685610ae2888887611be8565b7c020000000000000000000000000000000000000000000000000000000017611c10565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610b8c5760006001850190506000600460008381526020019081526020016000205403610b8a576000548114610b89578360046000838152602001908152602001600020819055505b5b505b600073ffffffffffffffffffffffffffffffffffffffff8673ffffffffffffffffffffffffffffffffffffffff161690508481887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460008103610bfe57610bfd63ea553b3460e01b61193b565b5b610c0b8787876001611c3b565b50505050505050565b60095481565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca190612ae3565b60405180910390fd5b6000600c60006101000a81548160ff021916908315150217905550565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4e90612ae3565b60405180910390fd5b8060098190555050565b610d7c838383604051806020016040528060008152506116b2565b505050565b6000610d8c826118c2565b9050919050565b600c60009054906101000a900460ff1681565b6000610db182611a83565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610dfe57610dfd638f4eb60460e01b61193b565b5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b600080836000604051602001610e66929190612b55565b60405160208183030381529060405280519060200120604051602001610e8c9190612b9f565b604051602081830303815290604052805190602001209050610ec583600860008881526020019081526020016000206005015483611c41565b9150509392505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5690612ae3565b60405180910390fd5b6001600c60006101000a81548160ff021916908315150217905550565b600c60009054906101000a900460ff1615610fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc390612c06565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff163b14611026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101d90612c72565b60405180910390fd5b6110336009543383610e4f565b611072576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106990612cde565b60405180910390fd5b600860006009548152602001908152602001600020600301544210156110cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c490612d4a565b60405180910390fd5b600860006009548152602001908152602001600020600401544210611127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111e90612db6565b60405180910390fd5b600860006009548152602001908152602001600020600001546008600060095481526020019081526020016000206002015410611199576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119090612e22565b60405180910390fd5b60086000600954815260200190815260200160002060010154600160086000600954815260200190815260200160002060060160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112149190612e71565b1115611255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124c90612ef1565b60405180910390fd5b6001600860006009548152602001908152602001600020600201600082825461127e9190612e71565b92505081905550600160086000600954815260200190815260200160002060060160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112eb9190612e71565b925050819055506112fd336001611c58565b50565b60006008600084815260200190815260200160002060060160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606003805461139390612a66565b80601f01602080910402602001604051908101604052809291908181526020018280546113bf90612a66565b801561140c5780601f106113e15761010080835404028352916020019161140c565b820191906000526020600020905b8154815290600101906020018083116113ef57829003601f168201915b5050505050905090565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149d90612ae3565b60405180910390fd5b6114b08282611c58565b5050565b80600760006114c1611b96565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661156e611b96565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115b3919061232a565b60405180910390a35050565b60006115c9611c76565b905090565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461165e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165590612ae3565b60405180910390fd5b60006008600088815260200190815260200160002090508581600001819055508481600101819055508381600301819055508281600401819055508181600501819055508660098190555050505050505050565b6116bd848484610953565b60008373ffffffffffffffffffffffffffffffffffffffff163b146116fe576116e884848484611c89565b6116fd576116fc63d1a57ed660e01b61193b565b5b5b50505050565b606061170f826118c2565b6117245761172363a14c4b5060e01b61193b565b5b600061172e611db8565b9050600081510361174e5760405180602001604052806000815250611779565b8061175884611e4a565b604051602001611769929190612f4d565b6040516020818303038152906040525b915050919050565b600061178c82611e9a565b9050919050565b60006328f7503254905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b805461184190612a66565b80601f016020809104026020016040519081016040528092919081815260200182805461186d90612a66565b80156118ba5780601f1061188f576101008083540402835291602001916118ba565b820191906000526020600020905b81548152906001019060200180831161189d57829003601f168201915b505050505081565b6000816118cd611a74565b11611936576000548210156119355760005b600060046000858152602001908152602001600020549150810361190e578261190790612f71565b92506118df565b60007c01000000000000000000000000000000000000000000000000000000008216149150505b5b919050565b8060005260046000fd5b600061195083610da6565b905081801561199257508073ffffffffffffffffffffffffffffffffffffffff16611979611b96565b73ffffffffffffffffffffffffffffffffffffffff1614155b156119be576119a8816119a3611b96565b6117a0565b6119bd576119bc63cfb3b94260e01b61193b565b5b5b836006600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b6000611a7e611793565b905090565b600081611a8e611a74565b11611b59576004600083815260200190815260200160002054905060008103611b30576000548210611acb57611aca63df2d9b4260e01b61193b565b5b5b60046000836001900393508381526020019081526020016000205490506000810315611b2b5760007c010000000000000000000000000000000000000000000000000000000082160315611b6a57611b2a63df2d9b4260e01b61193b565b5b611acc565b60007c010000000000000000000000000000000000000000000000000000000082160315611b6a575b611b6963df2d9b4260e01b61193b565b5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611bff868684611ef1565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600082611c4e8584611efa565b1490509392505050565b611c72828260405180602001604052806000815250611f50565b5050565b6000611c80611a74565b60005403905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611caf611b96565b8786866040518563ffffffff1660e01b8152600401611cd19493929190612fef565b6020604051808303816000875af1925050508015611d0d57506040513d601f19601f82011682018060405250810190611d0a9190613050565b60015b611d65573d8060008114611d3d576040519150601f19603f3d011682016040523d82523d6000602084013e611d42565b606091505b506000815103611d5d57611d5c63d1a57ed660e01b61193b565b5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b8054611dc790612a66565b80601f0160208091040260200160405190810160405280929190818152602001828054611df390612a66565b8015611e405780601f10611e1557610100808354040283529160200191611e40565b820191906000526020600020905b815481529060010190602001808311611e2357829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115611e8557600184039350600a81066030018453600a8104905080611e63575b50828103602084039350808452505050919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60009392505050565b60008082905060005b8451811015611f4557611f3082868381518110611f2357611f2261307d565b5b6020026020010151611fd5565b91508080611f3d906130ac565b915050611f03565b508091505092915050565b611f5a8383612000565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611fd057600080549050600083820390505b611f9a6000868380600101945086611c89565b611faf57611fae63d1a57ed660e01b61193b565b5b818110611f87578160005414611fcd57611fcc600060e01b61193b565b5b50505b505050565b6000818310611fed57611fe88284612163565b611ff8565b611ff78383612163565b5b905092915050565b6000805490506000820361201f5761201e63b562e8dd60e01b61193b565b5b61202c6000848385611be2565b61204c8361203d6000866000611be8565b6120468561217a565b17611c10565b6004600083815260200190815260200160002081905550600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600073ffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff161690506000810361210457612103632e07630060e01b61193b565b5b6000838301905060008390505b808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4818160010191508103612111578160008190555050505061215e6000848385611c3b565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6121b18161219e565b81146121bc57600080fd5b50565b6000813590506121ce816121a8565b92915050565b6000602082840312156121ea576121e9612194565b5b60006121f8848285016121bf565b91505092915050565b61220a8161219e565b82525050565b6000819050919050565b61222381612210565b82525050565b600060c08201905061223e6000830189612201565b61224b6020830188612201565b6122586040830187612201565b6122656060830186612201565b6122726080830185612201565b61227f60a083018461221a565b979650505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6122bf8161228a565b81146122ca57600080fd5b50565b6000813590506122dc816122b6565b92915050565b6000602082840312156122f8576122f7612194565b5b6000612306848285016122cd565b91505092915050565b60008115159050919050565b6123248161230f565b82525050565b600060208201905061233f600083018461231b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561237f578082015181840152602081019050612364565b60008484015250505050565b6000601f19601f8301169050919050565b60006123a782612345565b6123b18185612350565b93506123c1818560208601612361565b6123ca8161238b565b840191505092915050565b600060208201905081810360008301526123ef818461239c565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612422826123f7565b9050919050565b61243281612417565b82525050565b600060208201905061244d6000830184612429565b92915050565b61245c81612417565b811461246757600080fd5b50565b60008135905061247981612453565b92915050565b6000806040838503121561249657612495612194565b5b60006124a48582860161246a565b92505060206124b5858286016121bf565b9150509250929050565b60006020820190506124d46000830184612201565b92915050565b6000806000606084860312156124f3576124f2612194565b5b60006125018682870161246a565b93505060206125128682870161246a565b9250506040612523868287016121bf565b9150509250925092565b60006020828403121561254357612542612194565b5b60006125518482850161246a565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6125978261238b565b810181811067ffffffffffffffff821117156125b6576125b561255f565b5b80604052505050565b60006125c961218a565b90506125d5828261258e565b919050565b600067ffffffffffffffff8211156125f5576125f461255f565b5b602082029050602081019050919050565b600080fd5b61261481612210565b811461261f57600080fd5b50565b6000813590506126318161260b565b92915050565b600061264a612645846125da565b6125bf565b9050808382526020820190506020840283018581111561266d5761266c612606565b5b835b8181101561269657806126828882612622565b84526020840193505060208101905061266f565b5050509392505050565b600082601f8301126126b5576126b461255a565b5b81356126c5848260208601612637565b91505092915050565b6000806000606084860312156126e7576126e6612194565b5b60006126f5868287016121bf565b93505060206127068682870161246a565b925050604084013567ffffffffffffffff81111561272757612726612199565b5b612733868287016126a0565b9150509250925092565b60006020828403121561275357612752612194565b5b600082013567ffffffffffffffff81111561277157612770612199565b5b61277d848285016126a0565b91505092915050565b6000806040838503121561279d5761279c612194565b5b60006127ab858286016121bf565b92505060206127bc8582860161246a565b9150509250929050565b6127cf8161230f565b81146127da57600080fd5b50565b6000813590506127ec816127c6565b92915050565b6000806040838503121561280957612808612194565b5b60006128178582860161246a565b9250506020612828858286016127dd565b9150509250929050565b60008060008060008060c0878903121561284f5761284e612194565b5b600061285d89828a016121bf565b965050602061286e89828a016121bf565b955050604061287f89828a016121bf565b945050606061289089828a016121bf565b93505060806128a189828a016121bf565b92505060a06128b289828a01612622565b9150509295509295509295565b600080fd5b600067ffffffffffffffff8211156128df576128de61255f565b5b6128e88261238b565b9050602081019050919050565b82818337600083830152505050565b6000612917612912846128c4565b6125bf565b905082815260208101848484011115612933576129326128bf565b5b61293e8482856128f5565b509392505050565b600082601f83011261295b5761295a61255a565b5b813561296b848260208601612904565b91505092915050565b6000806000806080858703121561298e5761298d612194565b5b600061299c8782880161246a565b94505060206129ad8782880161246a565b93505060406129be878288016121bf565b925050606085013567ffffffffffffffff8111156129df576129de612199565b5b6129eb87828801612946565b91505092959194509250565b60008060408385031215612a0e57612a0d612194565b5b6000612a1c8582860161246a565b9250506020612a2d8582860161246a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612a7e57607f821691505b602082108103612a9157612a90612a37565b5b50919050565b7f63616c6c6572206973206e6f74206f776e657200000000000000000000000000600082015250565b6000612acd601383612350565b9150612ad882612a97565b602082019050919050565b60006020820190508181036000830152612afc81612ac0565b9050919050565b6000819050919050565b600060ff82169050919050565b6000819050919050565b6000612b3f612b3a612b3584612b03565b612b1a565b612b0d565b9050919050565b612b4f81612b24565b82525050565b6000604082019050612b6a6000830185612429565b612b776020830184612b46565b9392505050565b6000819050919050565b612b99612b9482612210565b612b7e565b82525050565b6000612bab8284612b88565b60208201915081905092915050565b7f7061757365640000000000000000000000000000000000000000000000000000600082015250565b6000612bf0600683612350565b9150612bfb82612bba565b602082019050919050565b60006020820190508181036000830152612c1f81612be3565b9050919050565b7f6e6f7420616c6c6f770000000000000000000000000000000000000000000000600082015250565b6000612c5c600983612350565b9150612c6782612c26565b602082019050919050565b60006020820190508181036000830152612c8b81612c4f565b9050919050565b7f6e6f7420656c696769626c6520666f72206d696e740000000000000000000000600082015250565b6000612cc8601583612350565b9150612cd382612c92565b602082019050919050565b60006020820190508181036000830152612cf781612cbb565b9050919050565b7f6e6f742073746172740000000000000000000000000000000000000000000000600082015250565b6000612d34600983612350565b9150612d3f82612cfe565b602082019050919050565b60006020820190508181036000830152612d6381612d27565b9050919050565b7f6973206f76657200000000000000000000000000000000000000000000000000600082015250565b6000612da0600783612350565b9150612dab82612d6a565b602082019050919050565b60006020820190508181036000830152612dcf81612d93565b9050919050565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b6000612e0c600883612350565b9150612e1782612dd6565b602082019050919050565b60006020820190508181036000830152612e3b81612dff565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e7c8261219e565b9150612e878361219e565b9250828201905080821115612e9f57612e9e612e42565b5b92915050565b7f65786365656420746865206c696d697400000000000000000000000000000000600082015250565b6000612edb601083612350565b9150612ee682612ea5565b602082019050919050565b60006020820190508181036000830152612f0a81612ece565b9050919050565b600081905092915050565b6000612f2782612345565b612f318185612f11565b9350612f41818560208601612361565b80840191505092915050565b6000612f598285612f1c565b9150612f658284612f1c565b91508190509392505050565b6000612f7c8261219e565b915060008203612f8f57612f8e612e42565b5b600182039050919050565b600081519050919050565b600082825260208201905092915050565b6000612fc182612f9a565b612fcb8185612fa5565b9350612fdb818560208601612361565b612fe48161238b565b840191505092915050565b60006080820190506130046000830187612429565b6130116020830186612429565b61301e6040830185612201565b81810360608301526130308184612fb6565b905095945050505050565b60008151905061304a816122b6565b92915050565b60006020828403121561306657613065612194565b5b60006130748482850161303b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006130b78261219e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036130e9576130e8612e42565b5b60018201905091905056fea2646970667358221220f83a4ee460121d471518fc915ae899963ffdef0d599f21b0035a4a0ed36461c664736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000028417374726f20426f792052656420426f6f7473202d2054434f4d206f662041434720576f726c64730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010417374726f426f79526564426f6f747300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b68747470733a2f2f6163672d6e66742e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f73686f65732f6a736f6e2f0000000000
-----Decoded View---------------
Arg [0] : name (string): Astro Boy Red Boots - TCOM of ACG Worlds
Arg [1] : symbol (string): AstroBoyRedBoots
Arg [2] : baseURI (string): https://acg-nft.s3.ap-northeast-1.amazonaws.com/shoes/json/
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000028
Arg [4] : 417374726f20426f792052656420426f6f7473202d2054434f4d206f66204143
Arg [5] : 4720576f726c6473000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [7] : 417374726f426f79526564426f6f747300000000000000000000000000000000
Arg [8] : 000000000000000000000000000000000000000000000000000000000000003b
Arg [9] : 68747470733a2f2f6163672d6e66742e73332e61702d6e6f727468656173742d
Arg [10] : 312e616d617a6f6e6177732e636f6d2f73686f65732f6a736f6e2f0000000000
Deployed Bytecode Sourcemap
147:3064:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;427:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;9164:630:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10048:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16911:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16639:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5894:317;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20546:3447;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;475:20:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2206:69;;;;;;;;;;;;;:::i;:::-;;2050:78;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24084:187:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2882:100:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;550:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11409:150:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7045:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2281:247:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2134:66;;;;;;;;;;;;;:::i;:::-;;873:683;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2534:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;501:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10217:102:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1562:107:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17461:231:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2785:91:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1676:367;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24852:405:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10420:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2670:109:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;667:155:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17842:162:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;527:17:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;427:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9164:630:1:-;9249:4;9582:10;9567:25;;:11;:25;;;;:101;;;;9658:10;9643:25;;:11;:25;;;;9567:101;:177;;;;9734:10;9719:25;;:11;:25;;;;9567:177;9548:196;;9164:630;;;:::o;10048:98::-;10102:13;10134:5;10127:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10048:98;:::o;16911:223::-;16987:7;17011:16;17019:7;17011;:16::i;:::-;17006:73;;17029:50;17037:41;;;17029:7;:50::i;:::-;17006:73;17097:15;:24;17113:7;17097:24;;;;;;;;;;;:30;;;;;;;;;;;;17090:37;;16911:223;;;:::o;16639:122::-;16727:27;16736:2;16740:7;16749:4;16727:8;:27::i;:::-;16639:122;;:::o;5894:317::-;5955:7;6179:15;:13;:15::i;:::-;6164:12;;6148:13;;:28;:46;6141:53;;5894:317;:::o;20546:3447::-;20683:27;20713;20732:7;20713:18;:27::i;:::-;20683:57;;2785:14;20881:4;20865:22;;:41;20842:66;;20964:4;20923:45;;20939:19;20923:45;;;20919:95;;20970:44;20978:35;;;20970:7;:44::i;:::-;20919:95;21026:27;21055:23;21082:35;21109:7;21082:26;:35::i;:::-;21025:92;;;;21214:68;21239:15;21256:4;21262:19;:17;:19::i;:::-;21214:24;:68::i;:::-;21209:188;;21301:43;21318:4;21324:19;:17;:19::i;:::-;21301:16;:43::i;:::-;21296:101;;21346:51;21354:42;;;21346:7;:51::i;:::-;21296:101;21209:188;21408:43;21430:4;21436:2;21440:7;21449:1;21408:21;:43::i;:::-;21540:15;21537:157;;;21678:1;21657:19;21650:30;21537:157;22066:18;:24;22085:4;22066:24;;;;;;;;;;;;;;;;22064:26;;;;;;;;;;;;22134:18;:22;22153:2;22134:22;;;;;;;;;;;;;;;;22132:24;;;;;;;;;;;22449:143;22485:2;22533:45;22548:4;22554:2;22558:19;22533:14;:45::i;:::-;2392:8;22505:73;22449:18;:143::i;:::-;22420:17;:26;22438:7;22420:26;;;;;;;;;;;:172;;;;22760:1;2392:8;22709:19;:47;:52;22705:617;;22781:19;22813:1;22803:7;:11;22781:33;;22968:1;22934:17;:30;22952:11;22934:30;;;;;;;;;;;;:35;22930:378;;23070:13;;23055:11;:28;23051:239;;23248:19;23215:17;:30;23233:11;23215:30;;;;;;;;;;;:52;;;;23051:239;22930:378;22763:559;22705:617;23431:16;2785:14;23466:2;23450:20;;:39;23431:58;;23821:7;23786:8;23753:4;23696:25;23642:1;23586;23564:292;23891:1;23879:8;:13;23875:58;;23894:39;23902:30;;;23894:7;:39::i;:::-;23875:58;23944:42;23965:4;23971:2;23975:7;23984:1;23944:20;:42::i;:::-;20673:3320;;;;20546:3447;;;:::o;475:20:0:-;;;;:::o;2206:69::-;629:5;;;;;;;;;;;615:19;;:10;:19;;;607:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;2263:5:::1;2254:6;;:14;;;;;;;;;;;;;;;;;;2206:69::o:0;2050:78::-;629:5;;;;;;;;;;;615:19;;:10;:19;;;607:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;2118:3:::1;2110:5;:11;;;;2050:78:::0;:::o;24084:187:1:-;24225:39;24242:4;24248:2;24252:7;24225:39;;;;;;;;;;;;:16;:39::i;:::-;24084:187;;;:::o;2882:100:0:-;2936:4;2959:16;2967:7;2959;:16::i;:::-;2952:23;;2882:100;;;:::o;550:18::-;;;;;;;;;;;;;:::o;11409:150:1:-;11481:7;11523:27;11542:7;11523:18;:27::i;:::-;11500:52;;11409:150;;;:::o;7045:239::-;7117:7;7157:1;7140:19;;:5;:19;;;7136:69;;7161:44;7169:35;;;7161:7;:44::i;:::-;7136:69;1360:13;7222:18;:25;7241:5;7222:25;;;;;;;;;;;;;;;;:55;7215:62;;7045:239;;;:::o;2281:247:0:-;2368:4;2384:12;2443:4;2449:1;2432:19;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2422:30;;;;;;2409:44;;;;;;;;:::i;:::-;;;;;;;;;;;;;2399:55;;;;;;2384:70;;2471:50;2490:5;2497:7;:12;2505:3;2497:12;;;;;;;;;;;:17;;;2516:4;2471:18;:50::i;:::-;2464:57;;;2281:247;;;;;:::o;2134:66::-;629:5;;;;;;;;;;;615:19;;:10;:19;;;607:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;2189:4:::1;2180:6;;:13;;;;;;;;;;;;;;;;;;2134:66::o:0;873:683::-;943:6;;;;;;;;;;;942:7;934:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;1005:1;979:10;:22;;;:27;971:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;1039:31;1045:5;;1052:10;1064:5;1039;:31::i;:::-;1031:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;1134:7;:14;1142:5;;1134:14;;;;;;;;;;;:24;;;1115:15;:43;;1107:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;1209:7;:14;1217:5;;1209:14;;;;;;;;;;;:22;;;1191:15;:40;1183:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;1294:7;:14;1302:5;;1294:14;;;;;;;;;;;:20;;;1271:7;:14;1279:5;;1271:14;;;;;;;;;;;:20;;;:43;1263:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;1387:7;:14;1395:5;;1387:14;;;;;;;;;;;:20;;;1382:1;1345:7;:14;1353:5;;1345:14;;;;;;;;;;;:22;;:34;1368:10;1345:34;;;;;;;;;;;;;;;;:38;;;;:::i;:::-;:62;;1337:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;1463:1;1439:7;:14;1447:5;;1439:14;;;;;;;;;;;:20;;;:25;;;;;;;:::i;:::-;;;;;;;;1512:1;1474:7;:14;1482:5;;1474:14;;;;;;;;;;;:22;;:34;1497:10;1474:34;;;;;;;;;;;;;;;;:39;;;;;;;:::i;:::-;;;;;;;;1524:24;1534:10;1546:1;1524:9;:24::i;:::-;873:683;:::o;2534:130::-;2605:7;2631;:12;2639:3;2631:12;;;;;;;;;;;:20;;:26;2652:4;2631:26;;;;;;;;;;;;;;;;2624:33;;2534:130;;;;:::o;501:20::-;;;;;;;;;;;;;:::o;10217:102:1:-;10273:13;10305:7;10298:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10217:102;:::o;1562:107:0:-;629:5;;;;;;;;;;;615:19;;:10;:19;;;607:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;1639:23:::1;1649:2;1653:8;1639:9;:23::i;:::-;1562:107:::0;;:::o;17461:231:1:-;17607:8;17555:18;:39;17574:19;:17;:19::i;:::-;17555:39;;;;;;;;;;;;;;;:49;17595:8;17555:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;17666:8;17630:55;;17645:19;:17;:19::i;:::-;17630:55;;;17676:8;17630:55;;;;;;:::i;:::-;;;;;;;;17461:231;;:::o;2785:91:0:-;2829:7;2855:14;:12;:14::i;:::-;2848:21;;2785:91;:::o;1676:367::-;629:5;;;;;;;;;;;615:19;;:10;:19;;;607:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;1818:21:::1;1842:7;:12;1850:3;1842:12;;;;;;;;;;;1818:36;;1879:5;1864:6;:12;;:20;;;;1909:5;1894:6;:12;;:20;;;;1943:9;1924:6;:16;;:28;;;;1979:7;1962:6;:14;;:24;;;;2010:4;1996:6;:11;;:18;;;;2033:3;2025:5;:11;;;;1807:236;1676:367:::0;;;;;;:::o;24852:405:1:-;25021:31;25034:4;25040:2;25044:7;25021:12;:31::i;:::-;25084:1;25066:2;:14;;;:19;25062:189;;25104:56;25135:4;25141:2;25145:7;25154:5;25104:30;:56::i;:::-;25099:152;;25180:56;25188:47;;;25180:7;:56::i;:::-;25099:152;25062:189;24852:405;;;;:::o;10420:322::-;10493:13;10523:16;10531:7;10523;:16::i;:::-;10518:68;;10541:45;10549:36;;;10541:7;:45::i;:::-;10518:68;10597:21;10621:10;:8;:10::i;:::-;10597:34;;10673:1;10654:7;10648:21;:26;:87;;;;;;;;;;;;;;;;;10701:7;10710:18;10720:7;10710:9;:18::i;:::-;10684:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10648:87;10641:94;;;10420:322;;;:::o;2670:109:0:-;2727:7;2753:19;2767:4;2753:13;:19::i;:::-;2746:26;;2670:109;;;:::o;667:155:4:-;712:14;777:28;771:35;761:45;;667:155;:::o;17842:162:1:-;17939:4;17962:18;:25;17981:5;17962:25;;;;;;;;;;;;;;;:35;17988:8;17962:35;;;;;;;;;;;;;;;;;;;;;;;;;17955:42;;17842:162;;;;:::o;527:17:0:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18253:360:1:-;18318:11;18364:7;18345:15;:13;:15::i;:::-;:26;18341:266;;18401:13;;18391:7;:23;18387:210;;;18434:14;18466:60;18514:1;18483:17;:26;18501:7;18483:26;;;;;;;;;;;;18474:35;;;18473:42;18466:60;;18517:9;;;;:::i;:::-;;;18466:60;;;18581:1;2118:8;18553:6;:24;:29;18544:38;;18416:181;18387:210;18341:266;18253:360;;;:::o;43371:160::-;43470:13;43464:4;43457:27;43510:4;43504;43497:18;35019:460;35143:13;35159:16;35167:7;35159;:16::i;:::-;35143:32;;35190:13;:45;;;;;35230:5;35207:28;;:19;:17;:19::i;:::-;:28;;;;35190:45;35186:198;;;35254:44;35271:5;35278:19;:17;:19::i;:::-;35254:16;:44::i;:::-;35249:135;;35318:51;35326:42;;;35318:7;:51::i;:::-;35249:135;35186:198;35427:2;35394:15;:24;35410:7;35394:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;35464:7;35460:2;35444:28;;35453:5;35444:28;;;;;;;;;;;;35133:346;35019:460;;;:::o;3096:112:0:-;3161:7;3187:14;:12;:14::i;:::-;3180:21;;3096:112;:::o;12850:1978:1:-;12917:14;12966:7;12947:15;:13;:15::i;:::-;:26;12943:1822;;12998:17;:26;13016:7;12998:26;;;;;;;;;;;;12989:35;;13132:1;13122:6;:11;13118:1270;;13168:13;;13157:7;:24;13153:77;;13183:47;13191:38;;;13183:7;:47::i;:::-;13153:77;13777:597;13853:17;:28;13871:9;;;;;;;13853:28;;;;;;;;;;;;13844:37;;13939:1;13929:6;:11;13925:25;13942:8;13925:25;14004:1;2118:8;13976:6;:24;:29;13972:48;14007:13;13972:48;14308:47;14316:38;;;14308:7;:47::i;:::-;13777:597;;;13118:1270;14738:1;2118:8;14710:6;:24;:29;14706:48;14741:13;14706:48;12943:1822;14774:47;14782:38;;;14774:7;:47::i;:::-;12850:1978;;;;:::o;19471:474::-;19570:27;19599:23;19638:38;19679:15;:24;19695:7;19679:24;;;;;;;;;;;19638:65;;19853:18;19830:41;;19909:19;19903:26;19884:45;;19816:123;19471:474;;;:::o;41401:103::-;41461:7;41487:10;41480:17;;41401:103;:::o;18717:646::-;18862:11;19024:16;19017:5;19013:28;19004:37;;19182:16;19171:9;19167:32;19154:45;;19330:15;19319:9;19316:30;19308:5;19297:9;19294:20;19291:56;19281:66;;18717:646;;;;;:::o;25901:154::-;;;;;:::o;40728:304::-;40859:7;40878:16;2513:3;40904:19;:41;;40878:68;;2513:3;40971:31;40982:4;40988:2;40992:9;40971:10;:31::i;:::-;40963:40;;:62;;40956:69;;;40728:304;;;;;:::o;15361:443::-;15441:14;15606:16;15599:5;15595:28;15586:37;;15781:5;15767:11;15742:23;15738:41;15735:52;15728:5;15725:63;15715:73;;15361:443;;;;:::o;26702:153::-;;;;;:::o;1156:154:3:-;1247:4;1299;1270:25;1283:5;1290:4;1270:12;:25::i;:::-;:33;1263:40;;1156:154;;;;;:::o;34129:110:1:-;34205:27;34215:2;34219:8;34205:27;;;;;;;;;;;;:9;:27::i;:::-;34129:110;;:::o;6304:290::-;6359:7;6562:15;:13;:15::i;:::-;6546:13;;:31;6539:38;;6304:290;:::o;27283:673::-;27441:4;27486:2;27461:45;;;27507:19;:17;:19::i;:::-;27528:4;27534:7;27543:5;27461:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;27457:493;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27756:1;27739:6;:13;:18;27735:113;;27777:56;27785:47;;;27777:7;:56::i;:::-;27735:113;27918:6;27912:13;27903:6;27899:2;27895:15;27888:38;27457:493;27627:54;;;27617:64;;;:6;:64;;;;27610:71;;;27283:673;;;;;;:::o;2988:102:0:-;3048:13;3080:3;3073:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2988:102;:::o;41601:1708:1:-;41666:17;42094:4;42087;42081:11;42077:22;42184:1;42178:4;42171:15;42257:4;42254:1;42250:12;42243:19;;42337:1;42332:3;42325:14;42438:3;42672:5;42654:419;42680:1;42654:419;;;42719:1;42714:3;42710:11;42703:18;;42887:2;42881:4;42877:13;42873:2;42869:22;42864:3;42856:36;42979:2;42973:4;42969:13;42961:21;;43044:4;42654:419;43034:25;42654:419;42658:21;43110:3;43105;43101:13;43223:4;43218:3;43214:14;43207:21;;43286:6;43281:3;43274:19;41704:1599;;;41601:1708;;;:::o;7361:176::-;7422:7;1360:13;1495:2;7449:18;:25;7468:5;7449:25;;;;;;;;;;;;;;;;:50;;7448:82;7441:89;;7361:176;;;:::o;40439:143::-;40572:6;40439:143;;;;;:::o;1934:290:3:-;2017:7;2036:20;2059:4;2036:27;;2078:9;2073:116;2097:5;:12;2093:1;:16;2073:116;;;2145:33;2155:12;2169:5;2175:1;2169:8;;;;;;;;:::i;:::-;;;;;;;;2145:9;:33::i;:::-;2130:48;;2111:3;;;;;:::i;:::-;;;;2073:116;;;;2205:12;2198:19;;;1934:290;;;;:::o;33362:688:1:-;33488:19;33494:2;33498:8;33488:5;:19::i;:::-;33564:1;33546:2;:14;;;:19;33542:492;;33585:11;33599:13;;33585:27;;33630:13;33652:8;33646:3;:14;33630:30;;33678:238;33708:62;33747:1;33751:2;33755:7;;;;;;33764:5;33708:30;:62::i;:::-;33703:174;;33798:56;33806:47;;;33798:7;:56::i;:::-;33703:174;33911:3;33903:5;:11;33678:238;;33996:3;33979:13;;:20;33975:44;;34001:18;34016:1;34009:9;;34001:7;:18::i;:::-;33975:44;33567:467;;33542:492;33362:688;;;:::o;8975:147:3:-;9038:7;9068:1;9064;:5;:51;;9095:20;9110:1;9113;9095:14;:20::i;:::-;9064:51;;;9072:20;9087:1;9090;9072:14;:20::i;:::-;9064:51;9057:58;;8975:147;;;;:::o;28402:2251:1:-;28474:20;28497:13;;28474:36;;28536:1;28524:8;:13;28520:53;;28539:34;28547:25;;;28539:7;:34::i;:::-;28520:53;28584:61;28614:1;28618:2;28622:12;28636:8;28584:21;:61::i;:::-;29107:136;29143:2;29196:33;29219:1;29223:2;29227:1;29196:14;:33::i;:::-;29163:30;29184:8;29163:20;:30::i;:::-;:66;29107:18;:136::i;:::-;29073:17;:31;29091:12;29073:31;;;;;;;;;;;:170;;;;29523:1;1495:2;29493:1;:26;;29492:32;29480:8;:45;29454:18;:22;29473:2;29454:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;29633:16;2785:14;29668:2;29652:20;;:39;29633:58;;29722:1;29710:8;:13;29706:54;;29725:35;29733:26;;;29725:7;:35::i;:::-;29706:54;29775:11;29804:8;29789:12;:23;29775:37;;29826:15;29844:12;29826:30;;29871:662;30281:7;30238:8;30194:1;30129:25;30067:1;30003;29973:351;30528:3;30515:9;;;;;;:16;29871:662;;30563:3;30547:13;:19;;;;28828:1749;;;30586:60;30615:1;30619:2;30623:12;30637:8;30586:20;:60::i;:::-;28464:2189;28402:2251;;:::o;9128:261:3:-;9196:13;9300:1;9294:4;9287:15;9328:1;9322:4;9315:15;9368:4;9362;9352:21;9343:30;;9128:261;;;;:::o;15901:318:1:-;15971:14;16200:1;16190:8;16187:15;16161:24;16157:46;16147:56;;15901:318;;;:::o;7:75:5:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025:118::-;1112:24;1130:5;1112:24;:::i;:::-;1107:3;1100:37;1025:118;;:::o;1149:77::-;1186:7;1215:5;1204:16;;1149:77;;;:::o;1232:118::-;1319:24;1337:5;1319:24;:::i;:::-;1314:3;1307:37;1232:118;;:::o;1356:775::-;1589:4;1627:3;1616:9;1612:19;1604:27;;1641:71;1709:1;1698:9;1694:17;1685:6;1641:71;:::i;:::-;1722:72;1790:2;1779:9;1775:18;1766:6;1722:72;:::i;:::-;1804;1872:2;1861:9;1857:18;1848:6;1804:72;:::i;:::-;1886;1954:2;1943:9;1939:18;1930:6;1886:72;:::i;:::-;1968:73;2036:3;2025:9;2021:19;2012:6;1968:73;:::i;:::-;2051;2119:3;2108:9;2104:19;2095:6;2051:73;:::i;:::-;1356:775;;;;;;;;;:::o;2137:149::-;2173:7;2213:66;2206:5;2202:78;2191:89;;2137:149;;;:::o;2292:120::-;2364:23;2381:5;2364:23;:::i;:::-;2357:5;2354:34;2344:62;;2402:1;2399;2392:12;2344:62;2292:120;:::o;2418:137::-;2463:5;2501:6;2488:20;2479:29;;2517:32;2543:5;2517:32;:::i;:::-;2418:137;;;;:::o;2561:327::-;2619:6;2668:2;2656:9;2647:7;2643:23;2639:32;2636:119;;;2674:79;;:::i;:::-;2636:119;2794:1;2819:52;2863:7;2854:6;2843:9;2839:22;2819:52;:::i;:::-;2809:62;;2765:116;2561:327;;;;:::o;2894:90::-;2928:7;2971:5;2964:13;2957:21;2946:32;;2894:90;;;:::o;2990:109::-;3071:21;3086:5;3071:21;:::i;:::-;3066:3;3059:34;2990:109;;:::o;3105:210::-;3192:4;3230:2;3219:9;3215:18;3207:26;;3243:65;3305:1;3294:9;3290:17;3281:6;3243:65;:::i;:::-;3105:210;;;;:::o;3321:99::-;3373:6;3407:5;3401:12;3391:22;;3321:99;;;:::o;3426:169::-;3510:11;3544:6;3539:3;3532:19;3584:4;3579:3;3575:14;3560:29;;3426:169;;;;:::o;3601:246::-;3682:1;3692:113;3706:6;3703:1;3700:13;3692:113;;;3791:1;3786:3;3782:11;3776:18;3772:1;3767:3;3763:11;3756:39;3728:2;3725:1;3721:10;3716:15;;3692:113;;;3839:1;3830:6;3825:3;3821:16;3814:27;3663:184;3601:246;;;:::o;3853:102::-;3894:6;3945:2;3941:7;3936:2;3929:5;3925:14;3921:28;3911:38;;3853:102;;;:::o;3961:377::-;4049:3;4077:39;4110:5;4077:39;:::i;:::-;4132:71;4196:6;4191:3;4132:71;:::i;:::-;4125:78;;4212:65;4270:6;4265:3;4258:4;4251:5;4247:16;4212:65;:::i;:::-;4302:29;4324:6;4302:29;:::i;:::-;4297:3;4293:39;4286:46;;4053:285;3961:377;;;;:::o;4344:313::-;4457:4;4495:2;4484:9;4480:18;4472:26;;4544:9;4538:4;4534:20;4530:1;4519:9;4515:17;4508:47;4572:78;4645:4;4636:6;4572:78;:::i;:::-;4564:86;;4344:313;;;;:::o;4663:126::-;4700:7;4740:42;4733:5;4729:54;4718:65;;4663:126;;;:::o;4795:96::-;4832:7;4861:24;4879:5;4861:24;:::i;:::-;4850:35;;4795:96;;;:::o;4897:118::-;4984:24;5002:5;4984:24;:::i;:::-;4979:3;4972:37;4897:118;;:::o;5021:222::-;5114:4;5152:2;5141:9;5137:18;5129:26;;5165:71;5233:1;5222:9;5218:17;5209:6;5165:71;:::i;:::-;5021:222;;;;:::o;5249:122::-;5322:24;5340:5;5322:24;:::i;:::-;5315:5;5312:35;5302:63;;5361:1;5358;5351:12;5302:63;5249:122;:::o;5377:139::-;5423:5;5461:6;5448:20;5439:29;;5477:33;5504:5;5477:33;:::i;:::-;5377:139;;;;:::o;5522:474::-;5590:6;5598;5647:2;5635:9;5626:7;5622:23;5618:32;5615:119;;;5653:79;;:::i;:::-;5615:119;5773:1;5798:53;5843:7;5834:6;5823:9;5819:22;5798:53;:::i;:::-;5788:63;;5744:117;5900:2;5926:53;5971:7;5962:6;5951:9;5947:22;5926:53;:::i;:::-;5916:63;;5871:118;5522:474;;;;;:::o;6002:222::-;6095:4;6133:2;6122:9;6118:18;6110:26;;6146:71;6214:1;6203:9;6199:17;6190:6;6146:71;:::i;:::-;6002:222;;;;:::o;6230:619::-;6307:6;6315;6323;6372:2;6360:9;6351:7;6347:23;6343:32;6340:119;;;6378:79;;:::i;:::-;6340:119;6498:1;6523:53;6568:7;6559:6;6548:9;6544:22;6523:53;:::i;:::-;6513:63;;6469:117;6625:2;6651:53;6696:7;6687:6;6676:9;6672:22;6651:53;:::i;:::-;6641:63;;6596:118;6753:2;6779:53;6824:7;6815:6;6804:9;6800:22;6779:53;:::i;:::-;6769:63;;6724:118;6230:619;;;;;:::o;6855:329::-;6914:6;6963:2;6951:9;6942:7;6938:23;6934:32;6931:119;;;6969:79;;:::i;:::-;6931:119;7089:1;7114:53;7159:7;7150:6;7139:9;7135:22;7114:53;:::i;:::-;7104:63;;7060:117;6855:329;;;;:::o;7190:117::-;7299:1;7296;7289:12;7313:180;7361:77;7358:1;7351:88;7458:4;7455:1;7448:15;7482:4;7479:1;7472:15;7499:281;7582:27;7604:4;7582:27;:::i;:::-;7574:6;7570:40;7712:6;7700:10;7697:22;7676:18;7664:10;7661:34;7658:62;7655:88;;;7723:18;;:::i;:::-;7655:88;7763:10;7759:2;7752:22;7542:238;7499:281;;:::o;7786:129::-;7820:6;7847:20;;:::i;:::-;7837:30;;7876:33;7904:4;7896:6;7876:33;:::i;:::-;7786:129;;;:::o;7921:311::-;7998:4;8088:18;8080:6;8077:30;8074:56;;;8110:18;;:::i;:::-;8074:56;8160:4;8152:6;8148:17;8140:25;;8220:4;8214;8210:15;8202:23;;7921:311;;;:::o;8238:117::-;8347:1;8344;8337:12;8361:122;8434:24;8452:5;8434:24;:::i;:::-;8427:5;8424:35;8414:63;;8473:1;8470;8463:12;8414:63;8361:122;:::o;8489:139::-;8535:5;8573:6;8560:20;8551:29;;8589:33;8616:5;8589:33;:::i;:::-;8489:139;;;;:::o;8651:710::-;8747:5;8772:81;8788:64;8845:6;8788:64;:::i;:::-;8772:81;:::i;:::-;8763:90;;8873:5;8902:6;8895:5;8888:21;8936:4;8929:5;8925:16;8918:23;;8989:4;8981:6;8977:17;8969:6;8965:30;9018:3;9010:6;9007:15;9004:122;;;9037:79;;:::i;:::-;9004:122;9152:6;9135:220;9169:6;9164:3;9161:15;9135:220;;;9244:3;9273:37;9306:3;9294:10;9273:37;:::i;:::-;9268:3;9261:50;9340:4;9335:3;9331:14;9324:21;;9211:144;9195:4;9190:3;9186:14;9179:21;;9135:220;;;9139:21;8753:608;;8651:710;;;;;:::o;9384:370::-;9455:5;9504:3;9497:4;9489:6;9485:17;9481:27;9471:122;;9512:79;;:::i;:::-;9471:122;9629:6;9616:20;9654:94;9744:3;9736:6;9729:4;9721:6;9717:17;9654:94;:::i;:::-;9645:103;;9461:293;9384:370;;;;:::o;9760:829::-;9862:6;9870;9878;9927:2;9915:9;9906:7;9902:23;9898:32;9895:119;;;9933:79;;:::i;:::-;9895:119;10053:1;10078:53;10123:7;10114:6;10103:9;10099:22;10078:53;:::i;:::-;10068:63;;10024:117;10180:2;10206:53;10251:7;10242:6;10231:9;10227:22;10206:53;:::i;:::-;10196:63;;10151:118;10336:2;10325:9;10321:18;10308:32;10367:18;10359:6;10356:30;10353:117;;;10389:79;;:::i;:::-;10353:117;10494:78;10564:7;10555:6;10544:9;10540:22;10494:78;:::i;:::-;10484:88;;10279:303;9760:829;;;;;:::o;10595:539::-;10679:6;10728:2;10716:9;10707:7;10703:23;10699:32;10696:119;;;10734:79;;:::i;:::-;10696:119;10882:1;10871:9;10867:17;10854:31;10912:18;10904:6;10901:30;10898:117;;;10934:79;;:::i;:::-;10898:117;11039:78;11109:7;11100:6;11089:9;11085:22;11039:78;:::i;:::-;11029:88;;10825:302;10595:539;;;;:::o;11140:474::-;11208:6;11216;11265:2;11253:9;11244:7;11240:23;11236:32;11233:119;;;11271:79;;:::i;:::-;11233:119;11391:1;11416:53;11461:7;11452:6;11441:9;11437:22;11416:53;:::i;:::-;11406:63;;11362:117;11518:2;11544:53;11589:7;11580:6;11569:9;11565:22;11544:53;:::i;:::-;11534:63;;11489:118;11140:474;;;;;:::o;11620:116::-;11690:21;11705:5;11690:21;:::i;:::-;11683:5;11680:32;11670:60;;11726:1;11723;11716:12;11670:60;11620:116;:::o;11742:133::-;11785:5;11823:6;11810:20;11801:29;;11839:30;11863:5;11839:30;:::i;:::-;11742:133;;;;:::o;11881:468::-;11946:6;11954;12003:2;11991:9;11982:7;11978:23;11974:32;11971:119;;;12009:79;;:::i;:::-;11971:119;12129:1;12154:53;12199:7;12190:6;12179:9;12175:22;12154:53;:::i;:::-;12144:63;;12100:117;12256:2;12282:50;12324:7;12315:6;12304:9;12300:22;12282:50;:::i;:::-;12272:60;;12227:115;11881:468;;;;;:::o;12355:1057::-;12459:6;12467;12475;12483;12491;12499;12548:3;12536:9;12527:7;12523:23;12519:33;12516:120;;;12555:79;;:::i;:::-;12516:120;12675:1;12700:53;12745:7;12736:6;12725:9;12721:22;12700:53;:::i;:::-;12690:63;;12646:117;12802:2;12828:53;12873:7;12864:6;12853:9;12849:22;12828:53;:::i;:::-;12818:63;;12773:118;12930:2;12956:53;13001:7;12992:6;12981:9;12977:22;12956:53;:::i;:::-;12946:63;;12901:118;13058:2;13084:53;13129:7;13120:6;13109:9;13105:22;13084:53;:::i;:::-;13074:63;;13029:118;13186:3;13213:53;13258:7;13249:6;13238:9;13234:22;13213:53;:::i;:::-;13203:63;;13157:119;13315:3;13342:53;13387:7;13378:6;13367:9;13363:22;13342:53;:::i;:::-;13332:63;;13286:119;12355:1057;;;;;;;;:::o;13418:117::-;13527:1;13524;13517:12;13541:307;13602:4;13692:18;13684:6;13681:30;13678:56;;;13714:18;;:::i;:::-;13678:56;13752:29;13774:6;13752:29;:::i;:::-;13744:37;;13836:4;13830;13826:15;13818:23;;13541:307;;;:::o;13854:146::-;13951:6;13946:3;13941;13928:30;13992:1;13983:6;13978:3;13974:16;13967:27;13854:146;;;:::o;14006:423::-;14083:5;14108:65;14124:48;14165:6;14124:48;:::i;:::-;14108:65;:::i;:::-;14099:74;;14196:6;14189:5;14182:21;14234:4;14227:5;14223:16;14272:3;14263:6;14258:3;14254:16;14251:25;14248:112;;;14279:79;;:::i;:::-;14248:112;14369:54;14416:6;14411:3;14406;14369:54;:::i;:::-;14089:340;14006:423;;;;;:::o;14448:338::-;14503:5;14552:3;14545:4;14537:6;14533:17;14529:27;14519:122;;14560:79;;:::i;:::-;14519:122;14677:6;14664:20;14702:78;14776:3;14768:6;14761:4;14753:6;14749:17;14702:78;:::i;:::-;14693:87;;14509:277;14448:338;;;;:::o;14792:943::-;14887:6;14895;14903;14911;14960:3;14948:9;14939:7;14935:23;14931:33;14928:120;;;14967:79;;:::i;:::-;14928:120;15087:1;15112:53;15157:7;15148:6;15137:9;15133:22;15112:53;:::i;:::-;15102:63;;15058:117;15214:2;15240:53;15285:7;15276:6;15265:9;15261:22;15240:53;:::i;:::-;15230:63;;15185:118;15342:2;15368:53;15413:7;15404:6;15393:9;15389:22;15368:53;:::i;:::-;15358:63;;15313:118;15498:2;15487:9;15483:18;15470:32;15529:18;15521:6;15518:30;15515:117;;;15551:79;;:::i;:::-;15515:117;15656:62;15710:7;15701:6;15690:9;15686:22;15656:62;:::i;:::-;15646:72;;15441:287;14792:943;;;;;;;:::o;15741:474::-;15809:6;15817;15866:2;15854:9;15845:7;15841:23;15837:32;15834:119;;;15872:79;;:::i;:::-;15834:119;15992:1;16017:53;16062:7;16053:6;16042:9;16038:22;16017:53;:::i;:::-;16007:63;;15963:117;16119:2;16145:53;16190:7;16181:6;16170:9;16166:22;16145:53;:::i;:::-;16135:63;;16090:118;15741:474;;;;;:::o;16221:180::-;16269:77;16266:1;16259:88;16366:4;16363:1;16356:15;16390:4;16387:1;16380:15;16407:320;16451:6;16488:1;16482:4;16478:12;16468:22;;16535:1;16529:4;16525:12;16556:18;16546:81;;16612:4;16604:6;16600:17;16590:27;;16546:81;16674:2;16666:6;16663:14;16643:18;16640:38;16637:84;;16693:18;;:::i;:::-;16637:84;16458:269;16407:320;;;:::o;16733:169::-;16873:21;16869:1;16861:6;16857:14;16850:45;16733:169;:::o;16908:366::-;17050:3;17071:67;17135:2;17130:3;17071:67;:::i;:::-;17064:74;;17147:93;17236:3;17147:93;:::i;:::-;17265:2;17260:3;17256:12;17249:19;;16908:366;;;:::o;17280:419::-;17446:4;17484:2;17473:9;17469:18;17461:26;;17533:9;17527:4;17523:20;17519:1;17508:9;17504:17;17497:47;17561:131;17687:4;17561:131;:::i;:::-;17553:139;;17280:419;;;:::o;17705:85::-;17750:7;17779:5;17768:16;;17705:85;;;:::o;17796:86::-;17831:7;17871:4;17864:5;17860:16;17849:27;;17796:86;;;:::o;17888:60::-;17916:3;17937:5;17930:12;;17888:60;;;:::o;17954:154::-;18010:9;18043:59;18059:42;18068:32;18094:5;18068:32;:::i;:::-;18059:42;:::i;:::-;18043:59;:::i;:::-;18030:72;;17954:154;;;:::o;18114:143::-;18207:43;18244:5;18207:43;:::i;:::-;18202:3;18195:56;18114:143;;:::o;18263:344::-;18390:4;18428:2;18417:9;18413:18;18405:26;;18441:71;18509:1;18498:9;18494:17;18485:6;18441:71;:::i;:::-;18522:78;18596:2;18585:9;18581:18;18572:6;18522:78;:::i;:::-;18263:344;;;;;:::o;18613:79::-;18652:7;18681:5;18670:16;;18613:79;;;:::o;18698:157::-;18803:45;18823:24;18841:5;18823:24;:::i;:::-;18803:45;:::i;:::-;18798:3;18791:58;18698:157;;:::o;18861:256::-;18973:3;18988:75;19059:3;19050:6;18988:75;:::i;:::-;19088:2;19083:3;19079:12;19072:19;;19108:3;19101:10;;18861:256;;;;:::o;19123:156::-;19263:8;19259:1;19251:6;19247:14;19240:32;19123:156;:::o;19285:365::-;19427:3;19448:66;19512:1;19507:3;19448:66;:::i;:::-;19441:73;;19523:93;19612:3;19523:93;:::i;:::-;19641:2;19636:3;19632:12;19625:19;;19285:365;;;:::o;19656:419::-;19822:4;19860:2;19849:9;19845:18;19837:26;;19909:9;19903:4;19899:20;19895:1;19884:9;19880:17;19873:47;19937:131;20063:4;19937:131;:::i;:::-;19929:139;;19656:419;;;:::o;20081:159::-;20221:11;20217:1;20209:6;20205:14;20198:35;20081:159;:::o;20246:365::-;20388:3;20409:66;20473:1;20468:3;20409:66;:::i;:::-;20402:73;;20484:93;20573:3;20484:93;:::i;:::-;20602:2;20597:3;20593:12;20586:19;;20246:365;;;:::o;20617:419::-;20783:4;20821:2;20810:9;20806:18;20798:26;;20870:9;20864:4;20860:20;20856:1;20845:9;20841:17;20834:47;20898:131;21024:4;20898:131;:::i;:::-;20890:139;;20617:419;;;:::o;21042:171::-;21182:23;21178:1;21170:6;21166:14;21159:47;21042:171;:::o;21219:366::-;21361:3;21382:67;21446:2;21441:3;21382:67;:::i;:::-;21375:74;;21458:93;21547:3;21458:93;:::i;:::-;21576:2;21571:3;21567:12;21560:19;;21219:366;;;:::o;21591:419::-;21757:4;21795:2;21784:9;21780:18;21772:26;;21844:9;21838:4;21834:20;21830:1;21819:9;21815:17;21808:47;21872:131;21998:4;21872:131;:::i;:::-;21864:139;;21591:419;;;:::o;22016:159::-;22156:11;22152:1;22144:6;22140:14;22133:35;22016:159;:::o;22181:365::-;22323:3;22344:66;22408:1;22403:3;22344:66;:::i;:::-;22337:73;;22419:93;22508:3;22419:93;:::i;:::-;22537:2;22532:3;22528:12;22521:19;;22181:365;;;:::o;22552:419::-;22718:4;22756:2;22745:9;22741:18;22733:26;;22805:9;22799:4;22795:20;22791:1;22780:9;22776:17;22769:47;22833:131;22959:4;22833:131;:::i;:::-;22825:139;;22552:419;;;:::o;22977:157::-;23117:9;23113:1;23105:6;23101:14;23094:33;22977:157;:::o;23140:365::-;23282:3;23303:66;23367:1;23362:3;23303:66;:::i;:::-;23296:73;;23378:93;23467:3;23378:93;:::i;:::-;23496:2;23491:3;23487:12;23480:19;;23140:365;;;:::o;23511:419::-;23677:4;23715:2;23704:9;23700:18;23692:26;;23764:9;23758:4;23754:20;23750:1;23739:9;23735:17;23728:47;23792:131;23918:4;23792:131;:::i;:::-;23784:139;;23511:419;;;:::o;23936:158::-;24076:10;24072:1;24064:6;24060:14;24053:34;23936:158;:::o;24100:365::-;24242:3;24263:66;24327:1;24322:3;24263:66;:::i;:::-;24256:73;;24338:93;24427:3;24338:93;:::i;:::-;24456:2;24451:3;24447:12;24440:19;;24100:365;;;:::o;24471:419::-;24637:4;24675:2;24664:9;24660:18;24652:26;;24724:9;24718:4;24714:20;24710:1;24699:9;24695:17;24688:47;24752:131;24878:4;24752:131;:::i;:::-;24744:139;;24471:419;;;:::o;24896:180::-;24944:77;24941:1;24934:88;25041:4;25038:1;25031:15;25065:4;25062:1;25055:15;25082:191;25122:3;25141:20;25159:1;25141:20;:::i;:::-;25136:25;;25175:20;25193:1;25175:20;:::i;:::-;25170:25;;25218:1;25215;25211:9;25204:16;;25239:3;25236:1;25233:10;25230:36;;;25246:18;;:::i;:::-;25230:36;25082:191;;;;:::o;25279:166::-;25419:18;25415:1;25407:6;25403:14;25396:42;25279:166;:::o;25451:366::-;25593:3;25614:67;25678:2;25673:3;25614:67;:::i;:::-;25607:74;;25690:93;25779:3;25690:93;:::i;:::-;25808:2;25803:3;25799:12;25792:19;;25451:366;;;:::o;25823:419::-;25989:4;26027:2;26016:9;26012:18;26004:26;;26076:9;26070:4;26066:20;26062:1;26051:9;26047:17;26040:47;26104:131;26230:4;26104:131;:::i;:::-;26096:139;;25823:419;;;:::o;26248:148::-;26350:11;26387:3;26372:18;;26248:148;;;;:::o;26402:390::-;26508:3;26536:39;26569:5;26536:39;:::i;:::-;26591:89;26673:6;26668:3;26591:89;:::i;:::-;26584:96;;26689:65;26747:6;26742:3;26735:4;26728:5;26724:16;26689:65;:::i;:::-;26779:6;26774:3;26770:16;26763:23;;26512:280;26402:390;;;;:::o;26798:435::-;26978:3;27000:95;27091:3;27082:6;27000:95;:::i;:::-;26993:102;;27112:95;27203:3;27194:6;27112:95;:::i;:::-;27105:102;;27224:3;27217:10;;26798:435;;;;;:::o;27239:171::-;27278:3;27301:24;27319:5;27301:24;:::i;:::-;27292:33;;27347:4;27340:5;27337:15;27334:41;;27355:18;;:::i;:::-;27334:41;27402:1;27395:5;27391:13;27384:20;;27239:171;;;:::o;27416:98::-;27467:6;27501:5;27495:12;27485:22;;27416:98;;;:::o;27520:168::-;27603:11;27637:6;27632:3;27625:19;27677:4;27672:3;27668:14;27653:29;;27520:168;;;;:::o;27694:373::-;27780:3;27808:38;27840:5;27808:38;:::i;:::-;27862:70;27925:6;27920:3;27862:70;:::i;:::-;27855:77;;27941:65;27999:6;27994:3;27987:4;27980:5;27976:16;27941:65;:::i;:::-;28031:29;28053:6;28031:29;:::i;:::-;28026:3;28022:39;28015:46;;27784:283;27694:373;;;;:::o;28073:640::-;28268:4;28306:3;28295:9;28291:19;28283:27;;28320:71;28388:1;28377:9;28373:17;28364:6;28320:71;:::i;:::-;28401:72;28469:2;28458:9;28454:18;28445:6;28401:72;:::i;:::-;28483;28551:2;28540:9;28536:18;28527:6;28483:72;:::i;:::-;28602:9;28596:4;28592:20;28587:2;28576:9;28572:18;28565:48;28630:76;28701:4;28692:6;28630:76;:::i;:::-;28622:84;;28073:640;;;;;;;:::o;28719:141::-;28775:5;28806:6;28800:13;28791:22;;28822:32;28848:5;28822:32;:::i;:::-;28719:141;;;;:::o;28866:349::-;28935:6;28984:2;28972:9;28963:7;28959:23;28955:32;28952:119;;;28990:79;;:::i;:::-;28952:119;29110:1;29135:63;29190:7;29181:6;29170:9;29166:22;29135:63;:::i;:::-;29125:73;;29081:127;28866:349;;;;:::o;29221:180::-;29269:77;29266:1;29259:88;29366:4;29363:1;29356:15;29390:4;29387:1;29380:15;29407:233;29446:3;29469:24;29487:5;29469:24;:::i;:::-;29460:33;;29515:66;29508:5;29505:77;29502:103;;29585:18;;:::i;:::-;29502:103;29632:1;29625:5;29621:13;29614:20;;29407:233;;;:::o
Swarm Source
ipfs://f83a4ee460121d471518fc915ae899963ffdef0d599f21b0035a4a0ed36461c6
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.