ERC-721
Overview
Max Total Supply
694 TOCABO
Holders
90
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
10 TOCABOLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
TOCABO
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.2; import "@openzeppelin/contracts/access/Ownable.sol"; import "erc721a/contracts/ERC721A.sol"; contract TOCABO is ERC721A, Ownable { enum Status { Waiting, Started, Finished } Status public status; string private baseURI; uint256 public constant MAX_MINT_PER_ADDR = 10; uint256 public constant MAX_SUPPLY = 5666; uint256 public constant PRICE = 0.005 * 10**18; uint256 public constant FREE_MINT_SUPPLY = 600; event Minted(address minter, uint256 amount); event StatusChanged(Status status); event BaseURIChanged(string newBaseURI); constructor(string memory initBaseURI) ERC721A("Tocabo", "TOCABO") { baseURI = initBaseURI; } function _baseURI() internal view override returns (string memory) { return baseURI; } function mint(uint256 quantity) external payable { require(status == Status.Started, "TOCABO: Not started yet."); require(tx.origin == msg.sender, "TOCABO: Contract call not allowed."); require( numberMinted(msg.sender) + quantity <= MAX_MINT_PER_ADDR, "TOCABO: This is more than allowed." ); require( totalSupply() + quantity <= MAX_SUPPLY, "TOCABO: Not enough quantity." ); _safeMint(msg.sender, quantity); if (totalSupply() + quantity<= FREE_MINT_SUPPLY) { refundIfOver(0); } else { refundIfOver(PRICE * quantity); } emit Minted(msg.sender, quantity); } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function refundIfOver(uint256 price) private { require(msg.value >= price, "TOCABO: Not enough ETH."); if (msg.value > price) { payable(msg.sender).transfer(msg.value - price); } } function setStatus(Status _status) external onlyOwner { status = _status; emit StatusChanged(status); } function setBaseURI(string calldata newBaseURI) external onlyOwner { baseURI = newBaseURI; emit BaseURIChanged(newBaseURI); } function withdraw(address payable recipient) external onlyOwner { uint256 balance = address(this).balance; (bool success, ) = recipient.call{value: balance}(""); require(success, "TOCABO: NFTs have been completely minted."); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // Creator: Chiru Labs pragma solidity ^0.8.4; import '@openzeppelin/contracts/token/ERC721/IERC721.sol'; import '@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol'; import '@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol'; import '@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol'; import '@openzeppelin/contracts/utils/Address.sol'; import '@openzeppelin/contracts/utils/Context.sol'; import '@openzeppelin/contracts/utils/Strings.sol'; import '@openzeppelin/contracts/utils/introspection/ERC165.sol'; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintedQueryForZeroAddress(); error BurnedQueryForZeroAddress(); error AuxQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerIndexOutOfBounds(); error OwnerQueryForNonexistentToken(); error TokenIndexOutOfBounds(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _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 ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev See {IERC721Enumerable-totalSupply}. * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { if (owner == address(0)) revert MintedQueryForZeroAddress(); return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { if (owner == address(0)) revert BurnedQueryForZeroAddress(); return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { if (owner == address(0)) revert AuxQueryForZeroAddress(); return _addressData[owner].aux; } /** * Sets the auxillary 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 { if (owner == address(0)) revert AuxQueryForZeroAddress(); _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @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. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || isApprovedForAll(prevOwnership.addr, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // 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 { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { TokenOwnership memory prevOwnership = ownershipOf(tokenId); _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // 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 { _addressData[prevOwnership.addr].balance -= 1; _addressData[prevOwnership.addr].numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. _ownerships[tokenId].addr = prevOwnership.addr; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); _ownerships[tokenId].burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(prevOwnership.addr, address(0), tokenId); _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @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 {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"initBaseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"MintedQueryForZeroAddress","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","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":false,"internalType":"string","name":"newBaseURI","type":"string"}],"name":"BaseURIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum TOCABO.Status","name":"status","type":"uint8"}],"name":"StatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"FREE_MINT_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT_PER_ADDR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum TOCABO.Status","name":"_status","type":"uint8"}],"name":"setStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"enum TOCABO.Status","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162003e5638038062003e56833981810160405281019062000037919062000322565b6040518060400160405280600681526020017f546f6361626f00000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f544f4341424f00000000000000000000000000000000000000000000000000008152508160029080519060200190620000bb92919062000200565b508060039080519060200190620000d492919062000200565b50620000e56200012d60201b60201c565b60008190555050506200010d620001016200013260201b60201c565b6200013a60201b60201c565b80600990805190602001906200012592919062000200565b5050620004d7565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200020e90620003fc565b90600052602060002090601f0160209004810192826200023257600085556200027e565b82601f106200024d57805160ff19168380011785556200027e565b828001600101855582156200027e579182015b828111156200027d57825182559160200191906001019062000260565b5b5090506200028d919062000291565b5090565b5b80821115620002ac57600081600090555060010162000292565b5090565b6000620002c7620002c18462000390565b62000367565b905082815260208101848484011115620002e057600080fd5b620002ed848285620003c6565b509392505050565b600082601f8301126200030757600080fd5b815162000319848260208601620002b0565b91505092915050565b6000602082840312156200033557600080fd5b600082015167ffffffffffffffff8111156200035057600080fd5b6200035e84828501620002f5565b91505092915050565b60006200037362000386565b905062000381828262000432565b919050565b6000604051905090565b600067ffffffffffffffff821115620003ae57620003ad62000497565b5b620003b982620004c6565b9050602081019050919050565b60005b83811015620003e6578082015181840152602081019050620003c9565b83811115620003f6576000848401525b50505050565b600060028204905060018216806200041557607f821691505b602082108114156200042c576200042b62000468565b5b50919050565b6200043d82620004c6565b810181811067ffffffffffffffff821117156200045f576200045e62000497565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61396f80620004e76000396000f3fe60806040526004361061019c5760003560e01c80636352211e116100ec578063a0712d681161008a578063c87b56dd11610064578063c87b56dd14610593578063dc33e681146105d0578063e985e9c51461060d578063f2fde38b1461064a5761019c565b8063a0712d6814610525578063a22cb46514610541578063b88d4fde1461056a5761019c565b8063715018a6116100c6578063715018a61461048d5780638d859f3e146104a45780638da5cb5b146104cf57806395d89b41146104fa5761019c565b80636352211e146103e857806363eb8bb61461042557806370a08231146104505761019c565b8063200d2ed21161015957806332cb6b0c1161013357806332cb6b0c1461034257806342842e0e1461036d57806351cff8d91461039657806355f804b3146103bf5761019c565b8063200d2ed2146102c557806323b872dd146102f05780632e49d78b146103195761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b314610246578063161548621461026f57806318160ddd1461029a575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190612cb0565b610673565b6040516101d591906130a9565b60405180910390f35b3480156101ea57600080fd5b506101f3610755565b6040516102009190613103565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b9190612d70565b6107e7565b60405161023d9190613019565b60405180910390f35b34801561025257600080fd5b5061026d60048036038101906102689190612c74565b610863565b005b34801561027b57600080fd5b5061028461096e565b6040516102919190613225565b60405180910390f35b3480156102a657600080fd5b506102af610973565b6040516102bc9190613225565b60405180910390f35b3480156102d157600080fd5b506102da61098a565b6040516102e791906130c4565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190612b6e565b61099d565b005b34801561032557600080fd5b50610340600480360381019061033b9190612d02565b6109ad565b005b34801561034e57600080fd5b50610357610ac2565b6040516103649190613225565b60405180910390f35b34801561037957600080fd5b50610394600480360381019061038f9190612b6e565b610ac8565b005b3480156103a257600080fd5b506103bd60048036038101906103b89190612b09565b610ae8565b005b3480156103cb57600080fd5b506103e660048036038101906103e19190612d2b565b610c1a565b005b3480156103f457600080fd5b5061040f600480360381019061040a9190612d70565b610ce5565b60405161041c9190613019565b60405180910390f35b34801561043157600080fd5b5061043a610cfb565b6040516104479190613225565b60405180910390f35b34801561045c57600080fd5b5061047760048036038101906104729190612ae0565b610d01565b6040516104849190613225565b60405180910390f35b34801561049957600080fd5b506104a2610dd1565b005b3480156104b057600080fd5b506104b9610e59565b6040516104c69190613225565b60405180910390f35b3480156104db57600080fd5b506104e4610e64565b6040516104f19190613019565b60405180910390f35b34801561050657600080fd5b5061050f610e8e565b60405161051c9190613103565b60405180910390f35b61053f600480360381019061053a9190612d70565b610f20565b005b34801561054d57600080fd5b5061056860048036038101906105639190612c38565b61118a565b005b34801561057657600080fd5b50610591600480360381019061058c9190612bbd565b611302565b005b34801561059f57600080fd5b506105ba60048036038101906105b59190612d70565b61137e565b6040516105c79190613103565b60405180910390f35b3480156105dc57600080fd5b506105f760048036038101906105f29190612ae0565b61141d565b6040516106049190613225565b60405180910390f35b34801561061957600080fd5b50610634600480360381019061062f9190612b32565b61142f565b60405161064191906130a9565b60405180910390f35b34801561065657600080fd5b50610671600480360381019061066c9190612ae0565b6114c3565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061073e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061074e575061074d826115bb565b5b9050919050565b606060028054610764906134e6565b80601f0160208091040260200160405190810160405280929190818152602001828054610790906134e6565b80156107dd5780601f106107b2576101008083540402835291602001916107dd565b820191906000526020600020905b8154815290600101906020018083116107c057829003601f168201915b5050505050905090565b60006107f282611625565b610828576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061086e82610ce5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108d6576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108f5611673565b73ffffffffffffffffffffffffffffffffffffffff1614158015610927575061092581610920611673565b61142f565b155b1561095e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61096983838361167b565b505050565b600a81565b600061097d61172d565b6001546000540303905090565b600860149054906101000a900460ff1681565b6109a8838383611732565b505050565b6109b5611673565b73ffffffffffffffffffffffffffffffffffffffff166109d3610e64565b73ffffffffffffffffffffffffffffffffffffffff1614610a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a20906131e5565b60405180910390fd5b80600860146101000a81548160ff02191690836002811115610a74577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055507fafa725e7f44cadb687a7043853fa1a7e7b8f0da74ce87ec546e9420f04da8c1e600860149054906101000a900460ff16604051610ab791906130c4565b60405180910390a150565b61162281565b610ae383838360405180602001604052806000815250611302565b505050565b610af0611673565b73ffffffffffffffffffffffffffffffffffffffff16610b0e610e64565b73ffffffffffffffffffffffffffffffffffffffff1614610b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5b906131e5565b60405180910390fd5b600047905060008273ffffffffffffffffffffffffffffffffffffffff1682604051610b8f90613004565b60006040518083038185875af1925050503d8060008114610bcc576040519150601f19603f3d011682016040523d82523d6000602084013e610bd1565b606091505b5050905080610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0c90613165565b60405180910390fd5b505050565b610c22611673565b73ffffffffffffffffffffffffffffffffffffffff16610c40610e64565b73ffffffffffffffffffffffffffffffffffffffff1614610c96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8d906131e5565b60405180910390fd5b818160099190610ca79291906128b5565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf68282604051610cd99291906130df565b60405180910390a15050565b6000610cf082611c23565b600001519050919050565b61025881565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d69576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610dd9611673565b73ffffffffffffffffffffffffffffffffffffffff16610df7610e64565b73ffffffffffffffffffffffffffffffffffffffff1614610e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e44906131e5565b60405180910390fd5b610e576000611eb2565b565b6611c37937e0800081565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610e9d906134e6565b80601f0160208091040260200160405190810160405280929190818152602001828054610ec9906134e6565b8015610f165780601f10610eeb57610100808354040283529160200191610f16565b820191906000526020600020905b815481529060010190602001808311610ef957829003601f168201915b5050505050905090565b60016002811115610f5a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600860149054906101000a900460ff166002811115610fa2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd9906131c5565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104790613205565b60405180910390fd5b600a8161105c3361141d565b61106691906132e4565b11156110a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109e906131a5565b60405180910390fd5b611622816110b3610973565b6110bd91906132e4565b11156110fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f590613185565b60405180910390fd5b6111083382611f78565b61025881611114610973565b61111e91906132e4565b116111325761112d6000611f96565b61114e565b61114d816611c37937e08000611148919061336b565b611f96565b5b7f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe338260405161117f929190613080565b60405180910390a150565b611192611673565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111f7576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611204611673565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112b1611673565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112f691906130a9565b60405180910390a35050565b61130d848484611732565b61132c8373ffffffffffffffffffffffffffffffffffffffff16612037565b8015611341575061133f8484848461205a565b155b15611378576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061138982611625565b6113bf576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006113c96121ba565b90506000815114156113ea5760405180602001604052806000815250611415565b806113f48461224c565b604051602001611405929190612fe0565b6040516020818303038152906040525b915050919050565b6000611428826123f9565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114cb611673565b73ffffffffffffffffffffffffffffffffffffffff166114e9610e64565b73ffffffffffffffffffffffffffffffffffffffff161461153f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611536906131e5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a690613125565b60405180910390fd5b6115b881611eb2565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161163061172d565b1115801561163f575060005482105b801561166c575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061173d82611c23565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611764611673565b73ffffffffffffffffffffffffffffffffffffffff16148061179757506117968260000151611791611673565b61142f565b5b806117dc57506117a5611673565b73ffffffffffffffffffffffffffffffffffffffff166117c4846107e7565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611815576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461187e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156118e5576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118f285858560016124c9565b611902600084846000015161167b565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611bb357600054811015611bb25782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c1c85858560016124cf565b5050505050565b611c2b61293b565b600082905080611c3961172d565b11158015611c48575060005481105b15611e7b576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611e7957600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611d5d578092505050611ead565b5b600115611e7857818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611e73578092505050611ead565b611d5e565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f928282604051806020016040528060008152506124d5565b5050565b80341015611fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd090613145565b60405180910390fd5b80341115612034573373ffffffffffffffffffffffffffffffffffffffff166108fc823461200791906133c5565b9081150290604051600060405180830381858888f19350505050158015612032573d6000803e3d6000fd5b505b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612080611673565b8786866040518563ffffffff1660e01b81526004016120a29493929190613034565b602060405180830381600087803b1580156120bc57600080fd5b505af19250505080156120ed57506040513d601f19601f820116820180604052508101906120ea9190612cd9565b60015b612167573d806000811461211d576040519150601f19603f3d011682016040523d82523d6000602084013e612122565b606091505b5060008151141561215f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600980546121c9906134e6565b80601f01602080910402602001604051908101604052809291908181526020018280546121f5906134e6565b80156122425780601f1061221757610100808354040283529160200191612242565b820191906000526020600020905b81548152906001019060200180831161222557829003601f168201915b5050505050905090565b60606000821415612294576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123f4565b600082905060005b600082146122c65780806122af90613549565b915050600a826122bf919061333a565b915061229c565b60008167ffffffffffffffff811115612308577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561233a5781602001600182028036833780820191505090505b5090505b600085146123ed5760018261235391906133c5565b9150600a856123629190613592565b603061236e91906132e4565b60f81b8183815181106123aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123e6919061333a565b945061233e565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612461576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b50505050565b50505050565b6124e283838360016124e7565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612554576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561258f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61259c60008683876124c9565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561276657506127658773ffffffffffffffffffffffffffffffffffffffff16612037565b5b1561282c575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127db600088848060010195508861205a565b612811576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561276c57826000541461282757600080fd5b612898565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141561282d575b8160008190555050506128ae60008683876124cf565b5050505050565b8280546128c1906134e6565b90600052602060002090601f0160209004810192826128e3576000855561292a565b82601f106128fc57803560ff191683800117855561292a565b8280016001018555821561292a579182015b8281111561292957823582559160200191906001019061290e565b5b509050612937919061297e565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561299757600081600090555060010161297f565b5090565b60006129ae6129a984613265565b613240565b9050828152602081018484840111156129c657600080fd5b6129d18482856134a4565b509392505050565b6000813590506129e8816138b6565b92915050565b6000813590506129fd816138cd565b92915050565b600081359050612a12816138e4565b92915050565b600081359050612a27816138fb565b92915050565b600081519050612a3c816138fb565b92915050565b600082601f830112612a5357600080fd5b8135612a6384826020860161299b565b91505092915050565b600081359050612a7b81613912565b92915050565b60008083601f840112612a9357600080fd5b8235905067ffffffffffffffff811115612aac57600080fd5b602083019150836001820283011115612ac457600080fd5b9250929050565b600081359050612ada81613922565b92915050565b600060208284031215612af257600080fd5b6000612b00848285016129d9565b91505092915050565b600060208284031215612b1b57600080fd5b6000612b29848285016129ee565b91505092915050565b60008060408385031215612b4557600080fd5b6000612b53858286016129d9565b9250506020612b64858286016129d9565b9150509250929050565b600080600060608486031215612b8357600080fd5b6000612b91868287016129d9565b9350506020612ba2868287016129d9565b9250506040612bb386828701612acb565b9150509250925092565b60008060008060808587031215612bd357600080fd5b6000612be1878288016129d9565b9450506020612bf2878288016129d9565b9350506040612c0387828801612acb565b925050606085013567ffffffffffffffff811115612c2057600080fd5b612c2c87828801612a42565b91505092959194509250565b60008060408385031215612c4b57600080fd5b6000612c59858286016129d9565b9250506020612c6a85828601612a03565b9150509250929050565b60008060408385031215612c8757600080fd5b6000612c95858286016129d9565b9250506020612ca685828601612acb565b9150509250929050565b600060208284031215612cc257600080fd5b6000612cd084828501612a18565b91505092915050565b600060208284031215612ceb57600080fd5b6000612cf984828501612a2d565b91505092915050565b600060208284031215612d1457600080fd5b6000612d2284828501612a6c565b91505092915050565b60008060208385031215612d3e57600080fd5b600083013567ffffffffffffffff811115612d5857600080fd5b612d6485828601612a81565b92509250509250929050565b600060208284031215612d8257600080fd5b6000612d9084828501612acb565b91505092915050565b612da2816133f9565b82525050565b612db18161341d565b82525050565b6000612dc282613296565b612dcc81856132ac565b9350612ddc8185602086016134b3565b612de5816136ae565b840191505092915050565b612df981613492565b82525050565b6000612e0b83856132c8565b9350612e188385846134a4565b612e21836136ae565b840190509392505050565b6000612e37826132a1565b612e4181856132c8565b9350612e518185602086016134b3565b612e5a816136ae565b840191505092915050565b6000612e70826132a1565b612e7a81856132d9565b9350612e8a8185602086016134b3565b80840191505092915050565b6000612ea36026836132c8565b9150612eae826136bf565b604082019050919050565b6000612ec66017836132c8565b9150612ed18261370e565b602082019050919050565b6000612ee96029836132c8565b9150612ef482613737565b604082019050919050565b6000612f0c601c836132c8565b9150612f1782613786565b602082019050919050565b6000612f2f6022836132c8565b9150612f3a826137af565b604082019050919050565b6000612f526018836132c8565b9150612f5d826137fe565b602082019050919050565b6000612f756020836132c8565b9150612f8082613827565b602082019050919050565b6000612f986000836132bd565b9150612fa382613850565b600082019050919050565b6000612fbb6022836132c8565b9150612fc682613853565b604082019050919050565b612fda81613488565b82525050565b6000612fec8285612e65565b9150612ff88284612e65565b91508190509392505050565b600061300f82612f8b565b9150819050919050565b600060208201905061302e6000830184612d99565b92915050565b60006080820190506130496000830187612d99565b6130566020830186612d99565b6130636040830185612fd1565b81810360608301526130758184612db7565b905095945050505050565b60006040820190506130956000830185612d99565b6130a26020830184612fd1565b9392505050565b60006020820190506130be6000830184612da8565b92915050565b60006020820190506130d96000830184612df0565b92915050565b600060208201905081810360008301526130fa818486612dff565b90509392505050565b6000602082019050818103600083015261311d8184612e2c565b905092915050565b6000602082019050818103600083015261313e81612e96565b9050919050565b6000602082019050818103600083015261315e81612eb9565b9050919050565b6000602082019050818103600083015261317e81612edc565b9050919050565b6000602082019050818103600083015261319e81612eff565b9050919050565b600060208201905081810360008301526131be81612f22565b9050919050565b600060208201905081810360008301526131de81612f45565b9050919050565b600060208201905081810360008301526131fe81612f68565b9050919050565b6000602082019050818103600083015261321e81612fae565b9050919050565b600060208201905061323a6000830184612fd1565b92915050565b600061324a61325b565b90506132568282613518565b919050565b6000604051905090565b600067ffffffffffffffff8211156132805761327f61367f565b5b613289826136ae565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006132ef82613488565b91506132fa83613488565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561332f5761332e6135c3565b5b828201905092915050565b600061334582613488565b915061335083613488565b9250826133605761335f6135f2565b5b828204905092915050565b600061337682613488565b915061338183613488565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156133ba576133b96135c3565b5b828202905092915050565b60006133d082613488565b91506133db83613488565b9250828210156133ee576133ed6135c3565b5b828203905092915050565b600061340482613468565b9050919050565b600061341682613468565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050613463826138a2565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061349d82613455565b9050919050565b82818337600083830152505050565b60005b838110156134d15780820151818401526020810190506134b6565b838111156134e0576000848401525b50505050565b600060028204905060018216806134fe57607f821691505b6020821081141561351257613511613650565b5b50919050565b613521826136ae565b810181811067ffffffffffffffff821117156135405761353f61367f565b5b80604052505050565b600061355482613488565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613587576135866135c3565b5b600182019050919050565b600061359d82613488565b91506135a883613488565b9250826135b8576135b76135f2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f544f4341424f3a204e6f7420656e6f756768204554482e000000000000000000600082015250565b7f544f4341424f3a204e4654732068617665206265656e20636f6d706c6574656c60008201527f79206d696e7465642e0000000000000000000000000000000000000000000000602082015250565b7f544f4341424f3a204e6f7420656e6f756768207175616e746974792e00000000600082015250565b7f544f4341424f3a2054686973206973206d6f7265207468616e20616c6c6f776560008201527f642e000000000000000000000000000000000000000000000000000000000000602082015250565b7f544f4341424f3a204e6f742073746172746564207965742e0000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f544f4341424f3a20436f6e74726163742063616c6c206e6f7420616c6c6f776560008201527f642e000000000000000000000000000000000000000000000000000000000000602082015250565b600381106138b3576138b2613621565b5b50565b6138bf816133f9565b81146138ca57600080fd5b50565b6138d68161340b565b81146138e157600080fd5b50565b6138ed8161341d565b81146138f857600080fd5b50565b61390481613429565b811461390f57600080fd5b50565b6003811061391f57600080fd5b50565b61392b81613488565b811461393657600080fd5b5056fea2646970667358221220ce7e68c3ae5955949698bf4ff839595f4455966fa7064837b64279cd944a6ae464736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d63365251656d4b65796576505346714b74697343577268476e5a58593571346346615474334d776e484561472f00000000000000000000
Deployed Bytecode
0x60806040526004361061019c5760003560e01c80636352211e116100ec578063a0712d681161008a578063c87b56dd11610064578063c87b56dd14610593578063dc33e681146105d0578063e985e9c51461060d578063f2fde38b1461064a5761019c565b8063a0712d6814610525578063a22cb46514610541578063b88d4fde1461056a5761019c565b8063715018a6116100c6578063715018a61461048d5780638d859f3e146104a45780638da5cb5b146104cf57806395d89b41146104fa5761019c565b80636352211e146103e857806363eb8bb61461042557806370a08231146104505761019c565b8063200d2ed21161015957806332cb6b0c1161013357806332cb6b0c1461034257806342842e0e1461036d57806351cff8d91461039657806355f804b3146103bf5761019c565b8063200d2ed2146102c557806323b872dd146102f05780632e49d78b146103195761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b314610246578063161548621461026f57806318160ddd1461029a575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190612cb0565b610673565b6040516101d591906130a9565b60405180910390f35b3480156101ea57600080fd5b506101f3610755565b6040516102009190613103565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b9190612d70565b6107e7565b60405161023d9190613019565b60405180910390f35b34801561025257600080fd5b5061026d60048036038101906102689190612c74565b610863565b005b34801561027b57600080fd5b5061028461096e565b6040516102919190613225565b60405180910390f35b3480156102a657600080fd5b506102af610973565b6040516102bc9190613225565b60405180910390f35b3480156102d157600080fd5b506102da61098a565b6040516102e791906130c4565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190612b6e565b61099d565b005b34801561032557600080fd5b50610340600480360381019061033b9190612d02565b6109ad565b005b34801561034e57600080fd5b50610357610ac2565b6040516103649190613225565b60405180910390f35b34801561037957600080fd5b50610394600480360381019061038f9190612b6e565b610ac8565b005b3480156103a257600080fd5b506103bd60048036038101906103b89190612b09565b610ae8565b005b3480156103cb57600080fd5b506103e660048036038101906103e19190612d2b565b610c1a565b005b3480156103f457600080fd5b5061040f600480360381019061040a9190612d70565b610ce5565b60405161041c9190613019565b60405180910390f35b34801561043157600080fd5b5061043a610cfb565b6040516104479190613225565b60405180910390f35b34801561045c57600080fd5b5061047760048036038101906104729190612ae0565b610d01565b6040516104849190613225565b60405180910390f35b34801561049957600080fd5b506104a2610dd1565b005b3480156104b057600080fd5b506104b9610e59565b6040516104c69190613225565b60405180910390f35b3480156104db57600080fd5b506104e4610e64565b6040516104f19190613019565b60405180910390f35b34801561050657600080fd5b5061050f610e8e565b60405161051c9190613103565b60405180910390f35b61053f600480360381019061053a9190612d70565b610f20565b005b34801561054d57600080fd5b5061056860048036038101906105639190612c38565b61118a565b005b34801561057657600080fd5b50610591600480360381019061058c9190612bbd565b611302565b005b34801561059f57600080fd5b506105ba60048036038101906105b59190612d70565b61137e565b6040516105c79190613103565b60405180910390f35b3480156105dc57600080fd5b506105f760048036038101906105f29190612ae0565b61141d565b6040516106049190613225565b60405180910390f35b34801561061957600080fd5b50610634600480360381019061062f9190612b32565b61142f565b60405161064191906130a9565b60405180910390f35b34801561065657600080fd5b50610671600480360381019061066c9190612ae0565b6114c3565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061073e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061074e575061074d826115bb565b5b9050919050565b606060028054610764906134e6565b80601f0160208091040260200160405190810160405280929190818152602001828054610790906134e6565b80156107dd5780601f106107b2576101008083540402835291602001916107dd565b820191906000526020600020905b8154815290600101906020018083116107c057829003601f168201915b5050505050905090565b60006107f282611625565b610828576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061086e82610ce5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108d6576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108f5611673565b73ffffffffffffffffffffffffffffffffffffffff1614158015610927575061092581610920611673565b61142f565b155b1561095e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61096983838361167b565b505050565b600a81565b600061097d61172d565b6001546000540303905090565b600860149054906101000a900460ff1681565b6109a8838383611732565b505050565b6109b5611673565b73ffffffffffffffffffffffffffffffffffffffff166109d3610e64565b73ffffffffffffffffffffffffffffffffffffffff1614610a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a20906131e5565b60405180910390fd5b80600860146101000a81548160ff02191690836002811115610a74577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b02179055507fafa725e7f44cadb687a7043853fa1a7e7b8f0da74ce87ec546e9420f04da8c1e600860149054906101000a900460ff16604051610ab791906130c4565b60405180910390a150565b61162281565b610ae383838360405180602001604052806000815250611302565b505050565b610af0611673565b73ffffffffffffffffffffffffffffffffffffffff16610b0e610e64565b73ffffffffffffffffffffffffffffffffffffffff1614610b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5b906131e5565b60405180910390fd5b600047905060008273ffffffffffffffffffffffffffffffffffffffff1682604051610b8f90613004565b60006040518083038185875af1925050503d8060008114610bcc576040519150601f19603f3d011682016040523d82523d6000602084013e610bd1565b606091505b5050905080610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0c90613165565b60405180910390fd5b505050565b610c22611673565b73ffffffffffffffffffffffffffffffffffffffff16610c40610e64565b73ffffffffffffffffffffffffffffffffffffffff1614610c96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8d906131e5565b60405180910390fd5b818160099190610ca79291906128b5565b507f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf68282604051610cd99291906130df565b60405180910390a15050565b6000610cf082611c23565b600001519050919050565b61025881565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d69576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610dd9611673565b73ffffffffffffffffffffffffffffffffffffffff16610df7610e64565b73ffffffffffffffffffffffffffffffffffffffff1614610e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e44906131e5565b60405180910390fd5b610e576000611eb2565b565b6611c37937e0800081565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610e9d906134e6565b80601f0160208091040260200160405190810160405280929190818152602001828054610ec9906134e6565b8015610f165780601f10610eeb57610100808354040283529160200191610f16565b820191906000526020600020905b815481529060010190602001808311610ef957829003601f168201915b5050505050905090565b60016002811115610f5a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600860149054906101000a900460ff166002811115610fa2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14610fe2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd9906131c5565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104790613205565b60405180910390fd5b600a8161105c3361141d565b61106691906132e4565b11156110a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109e906131a5565b60405180910390fd5b611622816110b3610973565b6110bd91906132e4565b11156110fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f590613185565b60405180910390fd5b6111083382611f78565b61025881611114610973565b61111e91906132e4565b116111325761112d6000611f96565b61114e565b61114d816611c37937e08000611148919061336b565b611f96565b5b7f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe338260405161117f929190613080565b60405180910390a150565b611192611673565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111f7576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611204611673565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112b1611673565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112f691906130a9565b60405180910390a35050565b61130d848484611732565b61132c8373ffffffffffffffffffffffffffffffffffffffff16612037565b8015611341575061133f8484848461205a565b155b15611378576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061138982611625565b6113bf576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006113c96121ba565b90506000815114156113ea5760405180602001604052806000815250611415565b806113f48461224c565b604051602001611405929190612fe0565b6040516020818303038152906040525b915050919050565b6000611428826123f9565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114cb611673565b73ffffffffffffffffffffffffffffffffffffffff166114e9610e64565b73ffffffffffffffffffffffffffffffffffffffff161461153f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611536906131e5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a690613125565b60405180910390fd5b6115b881611eb2565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161163061172d565b1115801561163f575060005482105b801561166c575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061173d82611c23565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611764611673565b73ffffffffffffffffffffffffffffffffffffffff16148061179757506117968260000151611791611673565b61142f565b5b806117dc57506117a5611673565b73ffffffffffffffffffffffffffffffffffffffff166117c4846107e7565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611815576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461187e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156118e5576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118f285858560016124c9565b611902600084846000015161167b565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611bb357600054811015611bb25782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c1c85858560016124cf565b5050505050565b611c2b61293b565b600082905080611c3961172d565b11158015611c48575060005481105b15611e7b576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611e7957600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611d5d578092505050611ead565b5b600115611e7857818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611e73578092505050611ead565b611d5e565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f928282604051806020016040528060008152506124d5565b5050565b80341015611fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd090613145565b60405180910390fd5b80341115612034573373ffffffffffffffffffffffffffffffffffffffff166108fc823461200791906133c5565b9081150290604051600060405180830381858888f19350505050158015612032573d6000803e3d6000fd5b505b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612080611673565b8786866040518563ffffffff1660e01b81526004016120a29493929190613034565b602060405180830381600087803b1580156120bc57600080fd5b505af19250505080156120ed57506040513d601f19601f820116820180604052508101906120ea9190612cd9565b60015b612167573d806000811461211d576040519150601f19603f3d011682016040523d82523d6000602084013e612122565b606091505b5060008151141561215f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600980546121c9906134e6565b80601f01602080910402602001604051908101604052809291908181526020018280546121f5906134e6565b80156122425780601f1061221757610100808354040283529160200191612242565b820191906000526020600020905b81548152906001019060200180831161222557829003601f168201915b5050505050905090565b60606000821415612294576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123f4565b600082905060005b600082146122c65780806122af90613549565b915050600a826122bf919061333a565b915061229c565b60008167ffffffffffffffff811115612308577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561233a5781602001600182028036833780820191505090505b5090505b600085146123ed5760018261235391906133c5565b9150600a856123629190613592565b603061236e91906132e4565b60f81b8183815181106123aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123e6919061333a565b945061233e565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612461576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b50505050565b50505050565b6124e283838360016124e7565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612554576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561258f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61259c60008683876124c9565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561276657506127658773ffffffffffffffffffffffffffffffffffffffff16612037565b5b1561282c575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127db600088848060010195508861205a565b612811576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561276c57826000541461282757600080fd5b612898565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141561282d575b8160008190555050506128ae60008683876124cf565b5050505050565b8280546128c1906134e6565b90600052602060002090601f0160209004810192826128e3576000855561292a565b82601f106128fc57803560ff191683800117855561292a565b8280016001018555821561292a579182015b8281111561292957823582559160200191906001019061290e565b5b509050612937919061297e565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561299757600081600090555060010161297f565b5090565b60006129ae6129a984613265565b613240565b9050828152602081018484840111156129c657600080fd5b6129d18482856134a4565b509392505050565b6000813590506129e8816138b6565b92915050565b6000813590506129fd816138cd565b92915050565b600081359050612a12816138e4565b92915050565b600081359050612a27816138fb565b92915050565b600081519050612a3c816138fb565b92915050565b600082601f830112612a5357600080fd5b8135612a6384826020860161299b565b91505092915050565b600081359050612a7b81613912565b92915050565b60008083601f840112612a9357600080fd5b8235905067ffffffffffffffff811115612aac57600080fd5b602083019150836001820283011115612ac457600080fd5b9250929050565b600081359050612ada81613922565b92915050565b600060208284031215612af257600080fd5b6000612b00848285016129d9565b91505092915050565b600060208284031215612b1b57600080fd5b6000612b29848285016129ee565b91505092915050565b60008060408385031215612b4557600080fd5b6000612b53858286016129d9565b9250506020612b64858286016129d9565b9150509250929050565b600080600060608486031215612b8357600080fd5b6000612b91868287016129d9565b9350506020612ba2868287016129d9565b9250506040612bb386828701612acb565b9150509250925092565b60008060008060808587031215612bd357600080fd5b6000612be1878288016129d9565b9450506020612bf2878288016129d9565b9350506040612c0387828801612acb565b925050606085013567ffffffffffffffff811115612c2057600080fd5b612c2c87828801612a42565b91505092959194509250565b60008060408385031215612c4b57600080fd5b6000612c59858286016129d9565b9250506020612c6a85828601612a03565b9150509250929050565b60008060408385031215612c8757600080fd5b6000612c95858286016129d9565b9250506020612ca685828601612acb565b9150509250929050565b600060208284031215612cc257600080fd5b6000612cd084828501612a18565b91505092915050565b600060208284031215612ceb57600080fd5b6000612cf984828501612a2d565b91505092915050565b600060208284031215612d1457600080fd5b6000612d2284828501612a6c565b91505092915050565b60008060208385031215612d3e57600080fd5b600083013567ffffffffffffffff811115612d5857600080fd5b612d6485828601612a81565b92509250509250929050565b600060208284031215612d8257600080fd5b6000612d9084828501612acb565b91505092915050565b612da2816133f9565b82525050565b612db18161341d565b82525050565b6000612dc282613296565b612dcc81856132ac565b9350612ddc8185602086016134b3565b612de5816136ae565b840191505092915050565b612df981613492565b82525050565b6000612e0b83856132c8565b9350612e188385846134a4565b612e21836136ae565b840190509392505050565b6000612e37826132a1565b612e4181856132c8565b9350612e518185602086016134b3565b612e5a816136ae565b840191505092915050565b6000612e70826132a1565b612e7a81856132d9565b9350612e8a8185602086016134b3565b80840191505092915050565b6000612ea36026836132c8565b9150612eae826136bf565b604082019050919050565b6000612ec66017836132c8565b9150612ed18261370e565b602082019050919050565b6000612ee96029836132c8565b9150612ef482613737565b604082019050919050565b6000612f0c601c836132c8565b9150612f1782613786565b602082019050919050565b6000612f2f6022836132c8565b9150612f3a826137af565b604082019050919050565b6000612f526018836132c8565b9150612f5d826137fe565b602082019050919050565b6000612f756020836132c8565b9150612f8082613827565b602082019050919050565b6000612f986000836132bd565b9150612fa382613850565b600082019050919050565b6000612fbb6022836132c8565b9150612fc682613853565b604082019050919050565b612fda81613488565b82525050565b6000612fec8285612e65565b9150612ff88284612e65565b91508190509392505050565b600061300f82612f8b565b9150819050919050565b600060208201905061302e6000830184612d99565b92915050565b60006080820190506130496000830187612d99565b6130566020830186612d99565b6130636040830185612fd1565b81810360608301526130758184612db7565b905095945050505050565b60006040820190506130956000830185612d99565b6130a26020830184612fd1565b9392505050565b60006020820190506130be6000830184612da8565b92915050565b60006020820190506130d96000830184612df0565b92915050565b600060208201905081810360008301526130fa818486612dff565b90509392505050565b6000602082019050818103600083015261311d8184612e2c565b905092915050565b6000602082019050818103600083015261313e81612e96565b9050919050565b6000602082019050818103600083015261315e81612eb9565b9050919050565b6000602082019050818103600083015261317e81612edc565b9050919050565b6000602082019050818103600083015261319e81612eff565b9050919050565b600060208201905081810360008301526131be81612f22565b9050919050565b600060208201905081810360008301526131de81612f45565b9050919050565b600060208201905081810360008301526131fe81612f68565b9050919050565b6000602082019050818103600083015261321e81612fae565b9050919050565b600060208201905061323a6000830184612fd1565b92915050565b600061324a61325b565b90506132568282613518565b919050565b6000604051905090565b600067ffffffffffffffff8211156132805761327f61367f565b5b613289826136ae565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006132ef82613488565b91506132fa83613488565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561332f5761332e6135c3565b5b828201905092915050565b600061334582613488565b915061335083613488565b9250826133605761335f6135f2565b5b828204905092915050565b600061337682613488565b915061338183613488565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156133ba576133b96135c3565b5b828202905092915050565b60006133d082613488565b91506133db83613488565b9250828210156133ee576133ed6135c3565b5b828203905092915050565b600061340482613468565b9050919050565b600061341682613468565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050613463826138a2565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061349d82613455565b9050919050565b82818337600083830152505050565b60005b838110156134d15780820151818401526020810190506134b6565b838111156134e0576000848401525b50505050565b600060028204905060018216806134fe57607f821691505b6020821081141561351257613511613650565b5b50919050565b613521826136ae565b810181811067ffffffffffffffff821117156135405761353f61367f565b5b80604052505050565b600061355482613488565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613587576135866135c3565b5b600182019050919050565b600061359d82613488565b91506135a883613488565b9250826135b8576135b76135f2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f544f4341424f3a204e6f7420656e6f756768204554482e000000000000000000600082015250565b7f544f4341424f3a204e4654732068617665206265656e20636f6d706c6574656c60008201527f79206d696e7465642e0000000000000000000000000000000000000000000000602082015250565b7f544f4341424f3a204e6f7420656e6f756768207175616e746974792e00000000600082015250565b7f544f4341424f3a2054686973206973206d6f7265207468616e20616c6c6f776560008201527f642e000000000000000000000000000000000000000000000000000000000000602082015250565b7f544f4341424f3a204e6f742073746172746564207965742e0000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f544f4341424f3a20436f6e74726163742063616c6c206e6f7420616c6c6f776560008201527f642e000000000000000000000000000000000000000000000000000000000000602082015250565b600381106138b3576138b2613621565b5b50565b6138bf816133f9565b81146138ca57600080fd5b50565b6138d68161340b565b81146138e157600080fd5b50565b6138ed8161341d565b81146138f857600080fd5b50565b61390481613429565b811461390f57600080fd5b50565b6003811061391f57600080fd5b50565b61392b81613488565b811461393657600080fd5b5056fea2646970667358221220ce7e68c3ae5955949698bf4ff839595f4455966fa7064837b64279cd944a6ae464736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d63365251656d4b65796576505346714b74697343577268476e5a58593571346346615474334d776e484561472f00000000000000000000
-----Decoded View---------------
Arg [0] : initBaseURI (string): ipfs://Qmc6RQemKeyevPSFqKtisCWrhGnZXY5q4cFaTt3MwnHEaG/
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [2] : 697066733a2f2f516d63365251656d4b65796576505346714b74697343577268
Arg [3] : 476e5a58593571346346615474334d776e484561472f00000000000000000000
Deployed Bytecode Sourcemap
151:2332:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4843:300:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8139:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9595:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9172:362;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;323:46:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4114:297:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;269:20:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10426:164:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1947:123:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;375:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10656:179:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2227:254:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2076:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7955:122:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;475:46:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5202:203:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1668:101:0;;;;;;;;;;;;;:::i;:::-;;422:46:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1036:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8301:102:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;879:719:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9862:274:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10901:359;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8469:313;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1604:111:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10202:162:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1918:198:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4843:300:11;4945:4;4995:25;4980:40;;;:11;:40;;;;:104;;;;5051:33;5036:48;;;:11;:48;;;;4980:104;:156;;;;5100:36;5124:11;5100:23;:36::i;:::-;4980:156;4961:175;;4843:300;;;:::o;8139:98::-;8193:13;8225:5;8218:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8139:98;:::o;9595:200::-;9663:7;9687:16;9695:7;9687;:16::i;:::-;9682:64;;9712:34;;;;;;;;;;;;;;9682:64;9764:15;:24;9780:7;9764:24;;;;;;;;;;;;;;;;;;;;;9757:31;;9595:200;;;:::o;9172:362::-;9244:13;9260:24;9276:7;9260:15;:24::i;:::-;9244:40;;9304:5;9298:11;;:2;:11;;;9294:48;;;9318:24;;;;;;;;;;;;;;9294:48;9373:5;9357:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;9383:37;9400:5;9407:12;:10;:12::i;:::-;9383:16;:37::i;:::-;9382:38;9357:63;9353:136;;;9443:35;;;;;;;;;;;;;;9353:136;9499:28;9508:2;9512:7;9521:5;9499:8;:28::i;:::-;9172:362;;;:::o;323:46:10:-;367:2;323:46;:::o;4114:297:11:-;4158:7;4379:15;:13;:15::i;:::-;4364:12;;4348:13;;:28;:46;4341:53;;4114:297;:::o;269:20:10:-;;;;;;;;;;;;;:::o;10426:164:11:-;10555:28;10565:4;10571:2;10575:7;10555:9;:28::i;:::-;10426:164;;;:::o;1947:123:10:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2020:7:10::1;2011:6;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2042:21;2056:6;;;;;;;;;;;2042:21;;;;;;:::i;:::-;;;;;;;;1947:123:::0;:::o;375:41::-;412:4;375:41;:::o;10656:179:11:-;10789:39;10806:4;10812:2;10816:7;10789:39;;;;;;;;;;;;:16;:39::i;:::-;10656:179;;;:::o;2227:254:10:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2301:15:10::1;2319:21;2301:39;;2351:12;2369:9;:14;;2391:7;2369:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2350:53;;;2421:7;2413:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;1318:1:0;;2227:254:10::0;:::o;2076:145::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2163:10:10::1;;2153:7;:20;;;;;;;:::i;:::-;;2188:26;2203:10;;2188:26;;;;;;;:::i;:::-;;;;;;;;2076:145:::0;;:::o;7955:122:11:-;8019:7;8045:20;8057:7;8045:11;:20::i;:::-;:25;;;8038:32;;7955:122;;;:::o;475:46:10:-;518:3;475:46;:::o;5202:203:11:-;5266:7;5306:1;5289:19;;:5;:19;;;5285:60;;;5317:28;;;;;;;;;;;;;;5285:60;5370:12;:19;5383:5;5370:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;5362:36;;5355:43;;5202:203;;;:::o;1668:101:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;422:46:10:-;454:14;422:46;:::o;1036:85:0:-;1082:7;1108:6;;;;;;;;;;;1101:13;;1036:85;:::o;8301:102:11:-;8357:13;8389:7;8382:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8301:102;:::o;879:719:10:-;956:14;946:24;;;;;;;;;;;;;;;;:6;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;938:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;1030:10;1017:23;;:9;:23;;;1009:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;367:2;1137:8;1110:24;1123:10;1110:12;:24::i;:::-;:35;;;;:::i;:::-;:56;;1089:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;412:4;1273:8;1257:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;1236:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;1360:31;1370:10;1382:8;1360:9;:31::i;:::-;518:3;1422:8;1406:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:43;1402:146;;1465:15;1478:1;1465:12;:15::i;:::-;1402:146;;;1507:30;1528:8;454:14;1520:16;;;;:::i;:::-;1507:12;:30::i;:::-;1402:146;1563:28;1570:10;1582:8;1563:28;;;;;;;:::i;:::-;;;;;;;;879:719;:::o;9862:274:11:-;9964:12;:10;:12::i;:::-;9952:24;;:8;:24;;;9948:54;;;9985:17;;;;;;;;;;;;;;9948:54;10058:8;10013:18;:32;10032:12;:10;:12::i;:::-;10013:32;;;;;;;;;;;;;;;:42;10046:8;10013:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;10110:8;10081:48;;10096:12;:10;:12::i;:::-;10081:48;;;10120:8;10081:48;;;;;;:::i;:::-;;;;;;;;9862:274;;:::o;10901:359::-;11062:28;11072:4;11078:2;11082:7;11062:9;:28::i;:::-;11104:15;:2;:13;;;:15::i;:::-;:76;;;;;11124:56;11155:4;11161:2;11165:7;11174:5;11124:30;:56::i;:::-;11123:57;11104:76;11100:154;;;11203:40;;;;;;;;;;;;;;11100:154;10901:359;;;;:::o;8469:313::-;8542:13;8572:16;8580:7;8572;:16::i;:::-;8567:59;;8597:29;;;;;;;;;;;;;;8567:59;8637:21;8661:10;:8;:10::i;:::-;8637:34;;8713:1;8694:7;8688:21;:26;;:87;;;;;;;;;;;;;;;;;8741:7;8750:18;:7;:16;:18::i;:::-;8724:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8688:87;8681:94;;;8469:313;;;:::o;1604:111:10:-;1662:7;1688:20;1702:5;1688:13;:20::i;:::-;1681:27;;1604:111;;;:::o;10202:162:11:-;10299:4;10322:18;:25;10341:5;10322:25;;;;;;;;;;;;;;;:35;10348:8;10322:35;;;;;;;;;;;;;;;;;;;;;;;;;10315:42;;10202:162;;;;:::o;1918:198:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2026:1:::1;2006:22;;:8;:22;;;;1998:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2081:28;2100:8;2081:18;:28::i;:::-;1918:198:::0;:::o;829:155:8:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;11506:184:11:-;11563:4;11605:7;11586:15;:13;:15::i;:::-;:26;;:53;;;;;11626:13;;11616:7;:23;11586:53;:97;;;;;11656:11;:20;11668:7;11656:20;;;;;;;;;;;:27;;;;;;;;;;;;11655:28;11586:97;11579:104;;11506:184;;;:::o;640:96:6:-;693:7;719:10;712:17;;640:96;:::o;18922:189:11:-;19059:2;19032:15;:24;19048:7;19032:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;19096:7;19092:2;19076:28;;19085:5;19076:28;;;;;;;;;;;;18922:189;;;:::o;3846:90::-;3902:7;3846:90;:::o;14528:2067::-;14638:35;14676:20;14688:7;14676:11;:20::i;:::-;14638:58;;14707:22;14749:13;:18;;;14733:34;;:12;:10;:12::i;:::-;:34;;;:100;;;;14783:50;14800:13;:18;;;14820:12;:10;:12::i;:::-;14783:16;:50::i;:::-;14733:100;:152;;;;14873:12;:10;:12::i;:::-;14849:36;;:20;14861:7;14849:11;:20::i;:::-;:36;;;14733:152;14707:179;;14902:17;14897:66;;14928:35;;;;;;;;;;;;;;14897:66;14999:4;14977:26;;:13;:18;;;:26;;;14973:67;;15012:28;;;;;;;;;;;;;;14973:67;15068:1;15054:16;;:2;:16;;;15050:52;;;15079:23;;;;;;;;;;;;;;15050:52;15113:43;15135:4;15141:2;15145:7;15154:1;15113:21;:43::i;:::-;15218:49;15235:1;15239:7;15248:13;:18;;;15218:8;:49::i;:::-;15587:1;15557:12;:18;15570:4;15557:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15630:1;15602:12;:16;15615:2;15602:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15674:2;15646:11;:20;15658:7;15646:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;15735:15;15690:11;:20;15702:7;15690:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;15999:19;16031:1;16021:7;:11;15999:33;;16091:1;16050:43;;:11;:24;16062:11;16050:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;16046:438;;;16272:13;;16258:11;:27;16254:216;;;16341:13;:18;;;16309:11;:24;16321:11;16309:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;16423:13;:28;;;16381:11;:24;16393:11;16381:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;16254:216;16046:438;14528:2067;16528:7;16524:2;16509:27;;16518:4;16509:27;;;;;;;;;;;;16546:42;16567:4;16573:2;16577:7;16586:1;16546:20;:42::i;:::-;14528:2067;;;;;:::o;6815:1083::-;6876:21;;:::i;:::-;6909:12;6924:7;6909:22;;6989:4;6970:15;:13;:15::i;:::-;:23;;:47;;;;;7004:13;;6997:4;:20;6970:47;6966:868;;;7037:31;7071:11;:17;7083:4;7071:17;;;;;;;;;;;7037:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7111:9;:16;;;7106:714;;7181:1;7155:28;;:9;:14;;;:28;;;7151:99;;7218:9;7211:16;;;;;;7151:99;7547:255;7554:4;7547:255;;;7586:6;;;;;;;;7630:11;:17;7642:4;7630:17;;;;;;;;;;;7618:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7703:1;7677:28;;:9;:14;;;:28;;;7673:107;;7744:9;7737:16;;;;;;7673:107;7547:255;;;7106:714;6966:868;;7860:31;;;;;;;;;;;;;;6815:1083;;;;:::o;2270:187:0:-;2343:16;2362:6;;;;;;;;;;;2343:25;;2387:8;2378:6;;:17;;;;;;;;;;;;;;;;;;2441:8;2410:40;;2431:8;2410:40;;;;;;;;;;;;2270:187;;:::o;11696:102:11:-;11764:27;11774:2;11778:8;11764:27;;;;;;;;;;;;:9;:27::i;:::-;11696:102;;:::o;1721:220:10:-;1797:5;1784:9;:18;;1776:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;1856:5;1844:9;:17;1840:95;;;1885:10;1877:28;;:47;1918:5;1906:9;:17;;;;:::i;:::-;1877:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1840:95;1721:220;:::o;1175:320:5:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;19592:650:11:-;19750:4;19786:2;19770:36;;;19807:12;:10;:12::i;:::-;19821:4;19827:7;19836:5;19770:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;19766:470;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20018:1;20001:6;:13;:18;19997:229;;;20046:40;;;;;;;;;;;;;;19997:229;20186:6;20180:13;20171:6;20167:2;20163:15;20156:38;19766:470;19898:45;;;19888:55;;;:6;:55;;;;19881:62;;;19592:650;;;;;;:::o;775:98:10:-;827:13;859:7;852:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;775:98;:::o;328:703:7:-;384:13;610:1;601:5;:10;597:51;;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;5482:204:11:-;5543:7;5583:1;5566:19;;:5;:19;;;5562:59;;;5594:27;;;;;;;;;;;;;;5562:59;5646:12;:19;5659:5;5646:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;5638:41;;5631:48;;5482:204;;;:::o;20873:154::-;;;;;:::o;21668:153::-;;;;;:::o;12149:157::-;12267:32;12273:2;12277:8;12287:5;12294:4;12267:5;:32::i;:::-;12149:157;;;:::o;12553:1733::-;12686:20;12709:13;;12686:36;;12750:1;12736:16;;:2;:16;;;12732:48;;;12761:19;;;;;;;;;;;;;;12732:48;12806:1;12794:8;:13;12790:44;;;12816:18;;;;;;;;;;;;;;12790:44;12845:61;12875:1;12879:2;12883:12;12897:8;12845:21;:61::i;:::-;13212:8;13177:12;:16;13190:2;13177:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13275:8;13235:12;:16;13248:2;13235:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13332:2;13299:11;:25;13311:12;13299:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;13398:15;13348:11;:25;13360:12;13348:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;13429:20;13452:12;13429:35;;13478:11;13507:8;13492:12;:23;13478:37;;13534:4;:23;;;;;13542:15;:2;:13;;;:15::i;:::-;13534:23;13530:628;;;13577:309;13632:12;13628:2;13607:38;;13624:1;13607:38;;;;;;;;;;;;13672:69;13711:1;13715:2;13719:14;;;;;;13735:5;13672:30;:69::i;:::-;13667:172;;13776:40;;;;;;;;;;;;;;13667:172;13881:3;13865:12;:19;;13577:309;;13965:12;13948:13;;:29;13944:43;;13979:8;;;13944:43;13530:628;;;14026:118;14081:14;;;;;;14077:2;14056:40;;14073:1;14056:40;;;;;;;;;;;;14139:3;14123:12;:19;;14026:118;;13530:628;14187:12;14171:13;:28;;;;12553:1733;;14219:60;14248:1;14252:2;14256:12;14270:8;14219:20;:60::i;:::-;12553:1733;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:12:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:139::-;402:5;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;501:155::-;555:5;593:6;580:20;571:29;;609:41;644:5;609:41;:::i;:::-;561:95;;;;:::o;662:133::-;705:5;743:6;730:20;721:29;;759:30;783:5;759:30;:::i;:::-;711:84;;;;:::o;801:137::-;846:5;884:6;871:20;862:29;;900:32;926:5;900:32;:::i;:::-;852:86;;;;:::o;944:141::-;1000:5;1031:6;1025:13;1016:22;;1047:32;1073:5;1047:32;:::i;:::-;1006:79;;;;:::o;1104:271::-;1159:5;1208:3;1201:4;1193:6;1189:17;1185:27;1175:2;;1226:1;1223;1216:12;1175:2;1266:6;1253:20;1291:78;1365:3;1357:6;1350:4;1342:6;1338:17;1291:78;:::i;:::-;1282:87;;1165:210;;;;;:::o;1381:159::-;1437:5;1475:6;1462:20;1453:29;;1491:43;1528:5;1491:43;:::i;:::-;1443:97;;;;:::o;1560:352::-;1618:8;1628:6;1678:3;1671:4;1663:6;1659:17;1655:27;1645:2;;1696:1;1693;1686:12;1645:2;1732:6;1719:20;1709:30;;1762:18;1754:6;1751:30;1748:2;;;1794:1;1791;1784:12;1748:2;1831:4;1823:6;1819:17;1807:29;;1885:3;1877:4;1869:6;1865:17;1855:8;1851:32;1848:41;1845:2;;;1902:1;1899;1892:12;1845:2;1635:277;;;;;:::o;1918:139::-;1964:5;2002:6;1989:20;1980:29;;2018:33;2045:5;2018:33;:::i;:::-;1970:87;;;;:::o;2063:262::-;2122:6;2171:2;2159:9;2150:7;2146:23;2142:32;2139:2;;;2187:1;2184;2177:12;2139:2;2230:1;2255:53;2300:7;2291:6;2280:9;2276:22;2255:53;:::i;:::-;2245:63;;2201:117;2129:196;;;;:::o;2331:278::-;2398:6;2447:2;2435:9;2426:7;2422:23;2418:32;2415:2;;;2463:1;2460;2453:12;2415:2;2506:1;2531:61;2584:7;2575:6;2564:9;2560:22;2531:61;:::i;:::-;2521:71;;2477:125;2405:204;;;;:::o;2615:407::-;2683:6;2691;2740:2;2728:9;2719:7;2715:23;2711:32;2708:2;;;2756:1;2753;2746:12;2708:2;2799:1;2824:53;2869:7;2860:6;2849:9;2845:22;2824:53;:::i;:::-;2814:63;;2770:117;2926:2;2952:53;2997:7;2988:6;2977:9;2973:22;2952:53;:::i;:::-;2942:63;;2897:118;2698:324;;;;;:::o;3028:552::-;3105:6;3113;3121;3170:2;3158:9;3149:7;3145:23;3141:32;3138:2;;;3186:1;3183;3176:12;3138:2;3229:1;3254:53;3299:7;3290:6;3279:9;3275:22;3254:53;:::i;:::-;3244:63;;3200:117;3356:2;3382:53;3427:7;3418:6;3407:9;3403:22;3382:53;:::i;:::-;3372:63;;3327:118;3484:2;3510:53;3555:7;3546:6;3535:9;3531:22;3510:53;:::i;:::-;3500:63;;3455:118;3128:452;;;;;:::o;3586:809::-;3681:6;3689;3697;3705;3754:3;3742:9;3733:7;3729:23;3725:33;3722:2;;;3771:1;3768;3761:12;3722:2;3814:1;3839:53;3884:7;3875:6;3864:9;3860:22;3839:53;:::i;:::-;3829:63;;3785:117;3941:2;3967:53;4012:7;4003:6;3992:9;3988:22;3967:53;:::i;:::-;3957:63;;3912:118;4069:2;4095:53;4140:7;4131:6;4120:9;4116:22;4095:53;:::i;:::-;4085:63;;4040:118;4225:2;4214:9;4210:18;4197:32;4256:18;4248:6;4245:30;4242:2;;;4288:1;4285;4278:12;4242:2;4316:62;4370:7;4361:6;4350:9;4346:22;4316:62;:::i;:::-;4306:72;;4168:220;3712:683;;;;;;;:::o;4401:401::-;4466:6;4474;4523:2;4511:9;4502:7;4498:23;4494:32;4491:2;;;4539:1;4536;4529:12;4491:2;4582:1;4607:53;4652:7;4643:6;4632:9;4628:22;4607:53;:::i;:::-;4597:63;;4553:117;4709:2;4735:50;4777:7;4768:6;4757:9;4753:22;4735:50;:::i;:::-;4725:60;;4680:115;4481:321;;;;;:::o;4808:407::-;4876:6;4884;4933:2;4921:9;4912:7;4908:23;4904:32;4901:2;;;4949:1;4946;4939:12;4901:2;4992:1;5017:53;5062:7;5053:6;5042:9;5038:22;5017:53;:::i;:::-;5007:63;;4963:117;5119:2;5145:53;5190:7;5181:6;5170:9;5166:22;5145:53;:::i;:::-;5135:63;;5090:118;4891:324;;;;;:::o;5221:260::-;5279:6;5328:2;5316:9;5307:7;5303:23;5299:32;5296:2;;;5344:1;5341;5334:12;5296:2;5387:1;5412:52;5456:7;5447:6;5436:9;5432:22;5412:52;:::i;:::-;5402:62;;5358:116;5286:195;;;;:::o;5487:282::-;5556:6;5605:2;5593:9;5584:7;5580:23;5576:32;5573:2;;;5621:1;5618;5611:12;5573:2;5664:1;5689:63;5744:7;5735:6;5724:9;5720:22;5689:63;:::i;:::-;5679:73;;5635:127;5563:206;;;;:::o;5775:282::-;5844:6;5893:2;5881:9;5872:7;5868:23;5864:32;5861:2;;;5909:1;5906;5899:12;5861:2;5952:1;5977:63;6032:7;6023:6;6012:9;6008:22;5977:63;:::i;:::-;5967:73;;5923:127;5851:206;;;;:::o;6063:395::-;6134:6;6142;6191:2;6179:9;6170:7;6166:23;6162:32;6159:2;;;6207:1;6204;6197:12;6159:2;6278:1;6267:9;6263:17;6250:31;6308:18;6300:6;6297:30;6294:2;;;6340:1;6337;6330:12;6294:2;6376:65;6433:7;6424:6;6413:9;6409:22;6376:65;:::i;:::-;6358:83;;;;6221:230;6149:309;;;;;:::o;6464:262::-;6523:6;6572:2;6560:9;6551:7;6547:23;6543:32;6540:2;;;6588:1;6585;6578:12;6540:2;6631:1;6656:53;6701:7;6692:6;6681:9;6677:22;6656:53;:::i;:::-;6646:63;;6602:117;6530:196;;;;:::o;6732:118::-;6819:24;6837:5;6819:24;:::i;:::-;6814:3;6807:37;6797:53;;:::o;6856:109::-;6937:21;6952:5;6937:21;:::i;:::-;6932:3;6925:34;6915:50;;:::o;6971:360::-;7057:3;7085:38;7117:5;7085:38;:::i;:::-;7139:70;7202:6;7197:3;7139:70;:::i;:::-;7132:77;;7218:52;7263:6;7258:3;7251:4;7244:5;7240:16;7218:52;:::i;:::-;7295:29;7317:6;7295:29;:::i;:::-;7290:3;7286:39;7279:46;;7061:270;;;;;:::o;7337:147::-;7432:45;7471:5;7432:45;:::i;:::-;7427:3;7420:58;7410:74;;:::o;7514:304::-;7612:3;7633:71;7697:6;7692:3;7633:71;:::i;:::-;7626:78;;7714:43;7750:6;7745:3;7738:5;7714:43;:::i;:::-;7782:29;7804:6;7782:29;:::i;:::-;7777:3;7773:39;7766:46;;7616:202;;;;;:::o;7824:364::-;7912:3;7940:39;7973:5;7940:39;:::i;:::-;7995:71;8059:6;8054:3;7995:71;:::i;:::-;7988:78;;8075:52;8120:6;8115:3;8108:4;8101:5;8097:16;8075:52;:::i;:::-;8152:29;8174:6;8152:29;:::i;:::-;8147:3;8143:39;8136:46;;7916:272;;;;;:::o;8194:377::-;8300:3;8328:39;8361:5;8328:39;:::i;:::-;8383:89;8465:6;8460:3;8383:89;:::i;:::-;8376:96;;8481:52;8526:6;8521:3;8514:4;8507:5;8503:16;8481:52;:::i;:::-;8558:6;8553:3;8549:16;8542:23;;8304:267;;;;;:::o;8577:366::-;8719:3;8740:67;8804:2;8799:3;8740:67;:::i;:::-;8733:74;;8816:93;8905:3;8816:93;:::i;:::-;8934:2;8929:3;8925:12;8918:19;;8723:220;;;:::o;8949:366::-;9091:3;9112:67;9176:2;9171:3;9112:67;:::i;:::-;9105:74;;9188:93;9277:3;9188:93;:::i;:::-;9306:2;9301:3;9297:12;9290:19;;9095:220;;;:::o;9321:366::-;9463:3;9484:67;9548:2;9543:3;9484:67;:::i;:::-;9477:74;;9560:93;9649:3;9560:93;:::i;:::-;9678:2;9673:3;9669:12;9662:19;;9467:220;;;:::o;9693:366::-;9835:3;9856:67;9920:2;9915:3;9856:67;:::i;:::-;9849:74;;9932:93;10021:3;9932:93;:::i;:::-;10050:2;10045:3;10041:12;10034:19;;9839:220;;;:::o;10065:366::-;10207:3;10228:67;10292:2;10287:3;10228:67;:::i;:::-;10221:74;;10304:93;10393:3;10304:93;:::i;:::-;10422:2;10417:3;10413:12;10406:19;;10211:220;;;:::o;10437:366::-;10579:3;10600:67;10664:2;10659:3;10600:67;:::i;:::-;10593:74;;10676:93;10765:3;10676:93;:::i;:::-;10794:2;10789:3;10785:12;10778:19;;10583:220;;;:::o;10809:366::-;10951:3;10972:67;11036:2;11031:3;10972:67;:::i;:::-;10965:74;;11048:93;11137:3;11048:93;:::i;:::-;11166:2;11161:3;11157:12;11150:19;;10955:220;;;:::o;11181:398::-;11340:3;11361:83;11442:1;11437:3;11361:83;:::i;:::-;11354:90;;11453:93;11542:3;11453:93;:::i;:::-;11571:1;11566:3;11562:11;11555:18;;11344:235;;;:::o;11585:366::-;11727:3;11748:67;11812:2;11807:3;11748:67;:::i;:::-;11741:74;;11824:93;11913:3;11824:93;:::i;:::-;11942:2;11937:3;11933:12;11926:19;;11731:220;;;:::o;11957:118::-;12044:24;12062:5;12044:24;:::i;:::-;12039:3;12032:37;12022:53;;:::o;12081:435::-;12261:3;12283:95;12374:3;12365:6;12283:95;:::i;:::-;12276:102;;12395:95;12486:3;12477:6;12395:95;:::i;:::-;12388:102;;12507:3;12500:10;;12265:251;;;;;:::o;12522:379::-;12706:3;12728:147;12871:3;12728:147;:::i;:::-;12721:154;;12892:3;12885:10;;12710:191;;;:::o;12907:222::-;13000:4;13038:2;13027:9;13023:18;13015:26;;13051:71;13119:1;13108:9;13104:17;13095:6;13051:71;:::i;:::-;13005:124;;;;:::o;13135:640::-;13330:4;13368:3;13357:9;13353:19;13345:27;;13382:71;13450:1;13439:9;13435:17;13426:6;13382:71;:::i;:::-;13463:72;13531:2;13520:9;13516:18;13507:6;13463:72;:::i;:::-;13545;13613:2;13602:9;13598:18;13589:6;13545:72;:::i;:::-;13664:9;13658:4;13654:20;13649:2;13638:9;13634:18;13627:48;13692:76;13763:4;13754:6;13692:76;:::i;:::-;13684:84;;13335:440;;;;;;;:::o;13781:332::-;13902:4;13940:2;13929:9;13925:18;13917:26;;13953:71;14021:1;14010:9;14006:17;13997:6;13953:71;:::i;:::-;14034:72;14102:2;14091:9;14087:18;14078:6;14034:72;:::i;:::-;13907:206;;;;;:::o;14119:210::-;14206:4;14244:2;14233:9;14229:18;14221:26;;14257:65;14319:1;14308:9;14304:17;14295:6;14257:65;:::i;:::-;14211:118;;;;:::o;14335:238::-;14436:4;14474:2;14463:9;14459:18;14451:26;;14487:79;14563:1;14552:9;14548:17;14539:6;14487:79;:::i;:::-;14441:132;;;;:::o;14579:333::-;14702:4;14740:2;14729:9;14725:18;14717:26;;14789:9;14783:4;14779:20;14775:1;14764:9;14760:17;14753:47;14817:88;14900:4;14891:6;14883;14817:88;:::i;:::-;14809:96;;14707:205;;;;;:::o;14918:313::-;15031:4;15069:2;15058:9;15054:18;15046:26;;15118:9;15112:4;15108:20;15104:1;15093:9;15089:17;15082:47;15146:78;15219:4;15210:6;15146:78;:::i;:::-;15138:86;;15036:195;;;;:::o;15237:419::-;15403:4;15441:2;15430:9;15426:18;15418:26;;15490:9;15484:4;15480:20;15476:1;15465:9;15461:17;15454:47;15518:131;15644:4;15518:131;:::i;:::-;15510:139;;15408:248;;;:::o;15662:419::-;15828:4;15866:2;15855:9;15851:18;15843:26;;15915:9;15909:4;15905:20;15901:1;15890:9;15886:17;15879:47;15943:131;16069:4;15943:131;:::i;:::-;15935:139;;15833:248;;;:::o;16087:419::-;16253:4;16291:2;16280:9;16276:18;16268:26;;16340:9;16334:4;16330:20;16326:1;16315:9;16311:17;16304:47;16368:131;16494:4;16368:131;:::i;:::-;16360:139;;16258:248;;;:::o;16512:419::-;16678:4;16716:2;16705:9;16701:18;16693:26;;16765:9;16759:4;16755:20;16751:1;16740:9;16736:17;16729:47;16793:131;16919:4;16793:131;:::i;:::-;16785:139;;16683:248;;;:::o;16937:419::-;17103:4;17141:2;17130:9;17126:18;17118:26;;17190:9;17184:4;17180:20;17176:1;17165:9;17161:17;17154:47;17218:131;17344:4;17218:131;:::i;:::-;17210:139;;17108:248;;;:::o;17362:419::-;17528:4;17566:2;17555:9;17551:18;17543:26;;17615:9;17609:4;17605:20;17601:1;17590:9;17586:17;17579:47;17643:131;17769:4;17643:131;:::i;:::-;17635:139;;17533:248;;;:::o;17787:419::-;17953:4;17991:2;17980:9;17976:18;17968:26;;18040:9;18034:4;18030:20;18026:1;18015:9;18011:17;18004:47;18068:131;18194:4;18068:131;:::i;:::-;18060:139;;17958:248;;;:::o;18212:419::-;18378:4;18416:2;18405:9;18401:18;18393:26;;18465:9;18459:4;18455:20;18451:1;18440:9;18436:17;18429:47;18493:131;18619:4;18493:131;:::i;:::-;18485:139;;18383:248;;;:::o;18637:222::-;18730:4;18768:2;18757:9;18753:18;18745:26;;18781:71;18849:1;18838:9;18834:17;18825:6;18781:71;:::i;:::-;18735:124;;;;:::o;18865:129::-;18899:6;18926:20;;:::i;:::-;18916:30;;18955:33;18983:4;18975:6;18955:33;:::i;:::-;18906:88;;;:::o;19000:75::-;19033:6;19066:2;19060:9;19050:19;;19040:35;:::o;19081:307::-;19142:4;19232:18;19224:6;19221:30;19218:2;;;19254:18;;:::i;:::-;19218:2;19292:29;19314:6;19292:29;:::i;:::-;19284:37;;19376:4;19370;19366:15;19358:23;;19147:241;;;:::o;19394:98::-;19445:6;19479:5;19473:12;19463:22;;19452:40;;;:::o;19498:99::-;19550:6;19584:5;19578:12;19568:22;;19557:40;;;:::o;19603:168::-;19686:11;19720:6;19715:3;19708:19;19760:4;19755:3;19751:14;19736:29;;19698:73;;;;:::o;19777:147::-;19878:11;19915:3;19900:18;;19890:34;;;;:::o;19930:169::-;20014:11;20048:6;20043:3;20036:19;20088:4;20083:3;20079:14;20064:29;;20026:73;;;;:::o;20105:148::-;20207:11;20244:3;20229:18;;20219:34;;;;:::o;20259:305::-;20299:3;20318:20;20336:1;20318:20;:::i;:::-;20313:25;;20352:20;20370:1;20352:20;:::i;:::-;20347:25;;20506:1;20438:66;20434:74;20431:1;20428:81;20425:2;;;20512:18;;:::i;:::-;20425:2;20556:1;20553;20549:9;20542:16;;20303:261;;;;:::o;20570:185::-;20610:1;20627:20;20645:1;20627:20;:::i;:::-;20622:25;;20661:20;20679:1;20661:20;:::i;:::-;20656:25;;20700:1;20690:2;;20705:18;;:::i;:::-;20690:2;20747:1;20744;20740:9;20735:14;;20612:143;;;;:::o;20761:348::-;20801:7;20824:20;20842:1;20824:20;:::i;:::-;20819:25;;20858:20;20876:1;20858:20;:::i;:::-;20853:25;;21046:1;20978:66;20974:74;20971:1;20968:81;20963:1;20956:9;20949:17;20945:105;20942:2;;;21053:18;;:::i;:::-;20942:2;21101:1;21098;21094:9;21083:20;;20809:300;;;;:::o;21115:191::-;21155:4;21175:20;21193:1;21175:20;:::i;:::-;21170:25;;21209:20;21227:1;21209:20;:::i;:::-;21204:25;;21248:1;21245;21242:8;21239:2;;;21253:18;;:::i;:::-;21239:2;21298:1;21295;21291:9;21283:17;;21160:146;;;;:::o;21312:96::-;21349:7;21378:24;21396:5;21378:24;:::i;:::-;21367:35;;21357:51;;;:::o;21414:104::-;21459:7;21488:24;21506:5;21488:24;:::i;:::-;21477:35;;21467:51;;;:::o;21524:90::-;21558:7;21601:5;21594:13;21587:21;21576:32;;21566:48;;;:::o;21620:149::-;21656:7;21696:66;21689:5;21685:78;21674:89;;21664:105;;;:::o;21775:131::-;21822:7;21851:5;21840:16;;21857:43;21894:5;21857:43;:::i;:::-;21830:76;;;:::o;21912:126::-;21949:7;21989:42;21982:5;21978:54;21967:65;;21957:81;;;:::o;22044:77::-;22081:7;22110:5;22099:16;;22089:32;;;:::o;22127:131::-;22185:9;22218:34;22246:5;22218:34;:::i;:::-;22205:47;;22195:63;;;:::o;22264:154::-;22348:6;22343:3;22338;22325:30;22410:1;22401:6;22396:3;22392:16;22385:27;22315:103;;;:::o;22424:307::-;22492:1;22502:113;22516:6;22513:1;22510:13;22502:113;;;22601:1;22596:3;22592:11;22586:18;22582:1;22577:3;22573:11;22566:39;22538:2;22535:1;22531:10;22526:15;;22502:113;;;22633:6;22630:1;22627:13;22624:2;;;22713:1;22704:6;22699:3;22695:16;22688:27;22624:2;22473:258;;;;:::o;22737:320::-;22781:6;22818:1;22812:4;22808:12;22798:22;;22865:1;22859:4;22855:12;22886:18;22876:2;;22942:4;22934:6;22930:17;22920:27;;22876:2;23004;22996:6;22993:14;22973:18;22970:38;22967:2;;;23023:18;;:::i;:::-;22967:2;22788:269;;;;:::o;23063:281::-;23146:27;23168:4;23146:27;:::i;:::-;23138:6;23134:40;23276:6;23264:10;23261:22;23240:18;23228:10;23225:34;23222:62;23219:2;;;23287:18;;:::i;:::-;23219:2;23327:10;23323:2;23316:22;23106:238;;;:::o;23350:233::-;23389:3;23412:24;23430:5;23412:24;:::i;:::-;23403:33;;23458:66;23451:5;23448:77;23445:2;;;23528:18;;:::i;:::-;23445:2;23575:1;23568:5;23564:13;23557:20;;23393:190;;;:::o;23589:176::-;23621:1;23638:20;23656:1;23638:20;:::i;:::-;23633:25;;23672:20;23690:1;23672:20;:::i;:::-;23667:25;;23711:1;23701:2;;23716:18;;:::i;:::-;23701:2;23757:1;23754;23750:9;23745:14;;23623:142;;;;:::o;23771:180::-;23819:77;23816:1;23809:88;23916:4;23913:1;23906:15;23940:4;23937:1;23930:15;23957:180;24005:77;24002:1;23995:88;24102:4;24099:1;24092:15;24126:4;24123:1;24116:15;24143:180;24191:77;24188:1;24181:88;24288:4;24285:1;24278:15;24312:4;24309:1;24302:15;24329:180;24377:77;24374:1;24367:88;24474:4;24471:1;24464:15;24498:4;24495:1;24488:15;24515:180;24563:77;24560:1;24553:88;24660:4;24657:1;24650:15;24684:4;24681:1;24674:15;24701:102;24742:6;24793:2;24789:7;24784:2;24777:5;24773:14;24769:28;24759:38;;24749:54;;;:::o;24809:225::-;24949:34;24945:1;24937:6;24933:14;24926:58;25018:8;25013:2;25005:6;25001:15;24994:33;24915:119;:::o;25040:173::-;25180:25;25176:1;25168:6;25164:14;25157:49;25146:67;:::o;25219:228::-;25359:34;25355:1;25347:6;25343:14;25336:58;25428:11;25423:2;25415:6;25411:15;25404:36;25325:122;:::o;25453:178::-;25593:30;25589:1;25581:6;25577:14;25570:54;25559:72;:::o;25637:221::-;25777:34;25773:1;25765:6;25761:14;25754:58;25846:4;25841:2;25833:6;25829:15;25822:29;25743:115;:::o;25864:174::-;26004:26;26000:1;25992:6;25988:14;25981:50;25970:68;:::o;26044:182::-;26184:34;26180:1;26172:6;26168:14;26161:58;26150:76;:::o;26232:114::-;26338:8;:::o;26352:221::-;26492:34;26488:1;26480:6;26476:14;26469:58;26561:4;26556:2;26548:6;26544:15;26537:29;26458:115;:::o;26579:::-;26662:1;26655:5;26652:12;26642:2;;26668:18;;:::i;:::-;26642:2;26632:62;:::o;26700:122::-;26773:24;26791:5;26773:24;:::i;:::-;26766:5;26763:35;26753:2;;26812:1;26809;26802:12;26753:2;26743:79;:::o;26828:138::-;26909:32;26935:5;26909:32;:::i;:::-;26902:5;26899:43;26889:2;;26956:1;26953;26946:12;26889:2;26879:87;:::o;26972:116::-;27042:21;27057:5;27042:21;:::i;:::-;27035:5;27032:32;27022:2;;27078:1;27075;27068:12;27022:2;27012:76;:::o;27094:120::-;27166:23;27183:5;27166:23;:::i;:::-;27159:5;27156:34;27146:2;;27204:1;27201;27194:12;27146:2;27136:78;:::o;27220:109::-;27303:1;27296:5;27293:12;27283:2;;27319:1;27316;27309:12;27283:2;27273:56;:::o;27335:122::-;27408:24;27426:5;27408:24;:::i;:::-;27401:5;27398:35;27388:2;;27447:1;27444;27437:12;27388:2;27378:79;:::o
Swarm Source
ipfs://ce7e68c3ae5955949698bf4ff839595f4455966fa7064837b64279cd944a6ae4
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.