Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
1,500 KGB
Holders
613
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 KGBLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
KevinGoblin
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Multiple files format)
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@##@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@* %@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@ @@@@ *@@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@ .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@# %@@@@@@@@@ @@ /@@@@@@@@@@ @@@@@@@@@@@@ @@@@@@@@@@@@@ /@ /@@ @@@@@ @@@@@ @@@@@@@@ @@@@@@@@@@@@@@@@@@@@./@* .@@@@@@@@@@@@@@ //@@@@@@@@@@* @@@@@@@@@@@@ @@ @@@@@@@@@@@@ (@% &@@@@@@ @@@,@@@@@@@ #@@@@% @@@@@@ #@@@@ @@ @@@@@@@@@@@@@@@@. @/ @@@@@@@@@@@@ @@@@@@@@@@@@ //@@@@@@@@@@ /@@@@@@@@@@@@@ @ @@@ # @@@@@@@@@. @@ (@@@ @@@@@ @@@@@@@ @@@@@@ @@ &@@@@@@@@@ @ @@@@@@@ @@@@@@@/ @ @@@@@@@@@@@@@ @@@@@@@@@@@ //@@@@@@@@@@ @@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@ @/ @@@& @@@/ @@@@@@@@ @@@@@@@ .@@@@@@@@@@@@ & @@@@@@ (@@@@@@ @ &@@@@@@@@@@@@@( @@@@@@@@@@ //@@@@@@@@@@@ .@@@@@. ,@@@ @@@@@@@@@@@@ @@@@@@@@@ @@ .@@@ @@@ @@@@@@@@ @@@@@@@@ # @@@@@@@@@@@@@ @@@@@ @@@@@ @@@ @@@@@@@@@@@@@@ @@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@% @@@@@@@@@@@@@ % ,@@ @@@ @@@@ @@@@ &@@@@@ (@@@@@@@@/ @@@@@@@@@@@* @ @@@* @ @@@@. @@@@# @@@@@@@@@@@@@@@ @@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@ @ ,@@@@@@@@@@@@ *@@@@@ @@@@@@@@@@@@@@@@@@@@@@ @ %@@@@@@@ @@@@, @@ @@ @@ @@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@ //@@@@@@@@@@ %@@@@@@@@@@@@@@ *@ @@@@@@@ &@@( @@@@@@@@@@@@ %@@@@@@@@@@@@@@@@@@@@@@@@@@@@* @@@@ @@@@@@@@@@@@@@@@# @ @@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@ //@@@@@@@@@@@@ .@@@@@@ @@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@* %@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC721A.sol"; import "./Ownable.sol"; contract KevinGoblin is ERC721A, Ownable { using Strings for uint256; string public baseURI; uint256 public price = 0.008 ether; uint256 public maxPerTx = 2; uint256 public maxSupply = 1500; uint256 public maxPerWallet = 50; uint256 public maxFreePerWallet = 2; uint256 public nextOwnerToExplicitlySet; bool public mintEnabled; mapping(address => uint256) private _mintedFreeAmount; constructor() ERC721A("Kevin Goblins", "KGB") { _safeMint(msg.sender, 20); } function mint(uint256 amt) external payable { uint256 cost = price; bool isFree = _mintedFreeAmount[msg.sender] + amt <= maxFreePerWallet; if (isFree) { cost = 0; } require(msg.sender == tx.origin, "..."); require(msg.value >= amt * cost, "Please send the exact amount."); require(totalSupply() + amt < maxSupply + 1, "No more Kevin Goblins"); require(mintEnabled, "Minting is not live yet, hold on Kevin Goblins."); require(amt < maxPerTx + 1, "Max per TX reached."); require( _numberMinted(msg.sender) + amt <= maxPerWallet, "Too many per wallet!" ); if (isFree) { _mintedFreeAmount[msg.sender] += amt; } _safeMint(msg.sender, amt); } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); return string(abi.encodePacked(baseURI, tokenId.toString(), ".json")); } function setBaseURI(string memory uri) public onlyOwner { baseURI = uri; } function setPrice(uint256 _newPrice) external onlyOwner { price = _newPrice; } function flipSale() external onlyOwner { mintEnabled = !mintEnabled; } function withdraw() external onlyOwner { (bool success, ) = payable(msg.sender).call{ value: address(this).balance }(""); require(success, "Transfer failed."); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @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 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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// 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 (last updated v4.5.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // 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; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @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 virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @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) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); 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 overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_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 { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _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 { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @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. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @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`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @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 { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * 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 ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a 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 _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * 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, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./IERC721Enumerable.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintedQueryForZeroAddress(); error BurnedQueryForZeroAddress(); 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 and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 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, IERC721Enumerable { 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; } // 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_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex times unchecked { return _currentIndex - _burnCounter; } } /** * @dev See {IERC721Enumerable-tokenByIndex}. * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenByIndex(uint256 index) public view override returns (uint256) { uint256 numMintedSoFar = _currentIndex; uint256 tokenIdsIdx; // Counter overflow is impossible as the loop breaks when // uint256 i is equal to another uint256 numMintedSoFar. unchecked { for (uint256 i; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (!ownership.burned) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } } revert TokenIndexOutOfBounds(); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds(); uint256 numMintedSoFar = _currentIndex; uint256 tokenIdsIdx; address currOwnershipAddr; // Counter overflow is impossible as the loop breaks when // uint256 i is equal to another uint256 numMintedSoFar. unchecked { for (uint256 i; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } } // Execution should never reach this point. revert(); } /** * @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 || interfaceId == type(IERC721Enumerable).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); } function _numberMinted(address owner) internal view returns (uint256) { if (owner == address(0)) revert MintedQueryForZeroAddress(); return uint256(_addressData[owner].numberMinted); } function _numberBurned(address owner) internal view returns (uint256) { if (owner == address(0)) revert BurnedQueryForZeroAddress(); return uint256(_addressData[owner].numberBurned); } /** * 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 (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 (!_checkOnERC721Received(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 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; for (uint256 i; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); if ( safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data) ) { revert TransferToNonERC721ReceiverImplementer(); } updatedIndex++; } _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 address. * The call is not executed if the target address is not a 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 _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { 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)) } } } } else { return true; } } /** * @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 pragma solidity ^0.8.0; import "./ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * 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, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT 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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./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 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 tokenId); /** * @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 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 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 pragma solidity ^0.8.0; import "./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 () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// 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); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"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":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreePerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052661c6bf526340000600a556002600b556105dc600c556032600d556002600e553480156200003157600080fd5b506040518060400160405280600d81526020017f4b6576696e20476f626c696e73000000000000000000000000000000000000008152506040518060400160405280600381526020017f4b474200000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000b692919062000717565b508060039080519060200190620000cf92919062000717565b5050506000620000e46200019c60201b60201c565b905080600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35062000196336014620001a460201b60201c565b62000a18565b600033905090565b620001c6828260405180602001604052806000815250620001ca60201b60201c565b5050565b620001df8383836001620001e460201b60201c565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141562000252576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156200028e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620002a360008683876200053960201b60201c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156200051457818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015620004c65750620004c460008884886200053f60201b60201c565b155b15620004fe576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8180600101925050808060010191505062000441565b508060008190555050620005326000868387620006ee60201b60201c565b5050505050565b50505050565b60006200056d8473ffffffffffffffffffffffffffffffffffffffff16620006f460201b62001c3d1760201c565b15620006e1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026200059f6200019c60201b60201c565b8786866040518563ffffffff1660e01b8152600401620005c3949392919062000873565b602060405180830381600087803b158015620005de57600080fd5b505af19250505080156200061257506040513d601f19601f820116820180604052508101906200060f9190620007de565b60015b62000690573d806000811462000645576040519150601f19603f3d011682016040523d82523d6000602084013e6200064a565b606091505b5060008151141562000688576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050620006e6565b600190505b949350505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054620007259062000983565b90600052602060002090601f01602090048101928262000749576000855562000795565b82601f106200076457805160ff191683800117855562000795565b8280016001018555821562000795579182015b828111156200079457825182559160200191906001019062000777565b5b509050620007a49190620007a8565b5090565b5b80821115620007c3576000816000905550600101620007a9565b5090565b600081519050620007d881620009fe565b92915050565b600060208284031215620007f757620007f6620009e8565b5b60006200080784828501620007c7565b91505092915050565b6200081b81620008e3565b82525050565b60006200082e82620008c7565b6200083a8185620008d2565b93506200084c8185602086016200094d565b6200085781620009ed565b840191505092915050565b6200086d8162000943565b82525050565b60006080820190506200088a600083018762000810565b62000899602083018662000810565b620008a8604083018562000862565b8181036060830152620008bc818462000821565b905095945050505050565b600081519050919050565b600082825260208201905092915050565b6000620008f08262000923565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200096d57808201518184015260208101905062000950565b838111156200097d576000848401525b50505050565b600060028204905060018216806200099c57607f821691505b60208210811415620009b357620009b2620009b9565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b62000a0981620008f7565b811462000a1557600080fd5b50565b613dc18062000a286000396000f3fe6080604052600436106101e35760003560e01c80637ba5e62111610102578063b88d4fde11610095578063d7224ba011610064578063d7224ba0146106c1578063e985e9c5146106ec578063f2fde38b14610729578063f968adbe14610752576101e3565b8063b88d4fde14610605578063c87b56dd1461062e578063d12397301461066b578063d5abeb0114610696576101e3565b8063a035b1fe116100d1578063a035b1fe1461056a578063a0712d6814610595578063a22cb465146105b1578063a7027357146105da576101e3565b80637ba5e621146104d45780638da5cb5b146104eb57806391b7f5ed1461051657806395d89b411461053f576101e3565b806342842e0e1161017a5780636352211e116101495780636352211e146104185780636c0360eb1461045557806370a0823114610480578063715018a6146104bd576101e3565b806342842e0e1461035e578063453c2310146103875780634f6ccce7146103b257806355f804b3146103ef576101e3565b806318160ddd116101b657806318160ddd146102b657806323b872dd146102e15780632f745c591461030a5780633ccfd60b14610347576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a919061304f565b61077d565b60405161021c91906134bd565b60405180910390f35b34801561023157600080fd5b5061023a6108c7565b60405161024791906134d8565b60405180910390f35b34801561025c57600080fd5b50610277600480360381019061027291906130f2565b610959565b6040516102849190613456565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af919061300f565b6109d5565b005b3480156102c257600080fd5b506102cb610ae0565b6040516102d8919061363a565b60405180910390f35b3480156102ed57600080fd5b5061030860048036038101906103039190612ef9565b610aee565b005b34801561031657600080fd5b50610331600480360381019061032c919061300f565b610afe565b60405161033e919061363a565b60405180910390f35b34801561035357600080fd5b5061035c610cd7565b005b34801561036a57600080fd5b5061038560048036038101906103809190612ef9565b610e02565b005b34801561039357600080fd5b5061039c610e22565b6040516103a9919061363a565b60405180910390f35b3480156103be57600080fd5b506103d960048036038101906103d491906130f2565b610e28565b6040516103e6919061363a565b60405180910390f35b3480156103fb57600080fd5b50610416600480360381019061041191906130a9565b610f6d565b005b34801561042457600080fd5b5061043f600480360381019061043a91906130f2565b611003565b60405161044c9190613456565b60405180910390f35b34801561046157600080fd5b5061046a611019565b60405161047791906134d8565b60405180910390f35b34801561048c57600080fd5b506104a760048036038101906104a29190612e8c565b6110a7565b6040516104b4919061363a565b60405180910390f35b3480156104c957600080fd5b506104d2611177565b005b3480156104e057600080fd5b506104e96112b4565b005b3480156104f757600080fd5b5061050061135c565b60405161050d9190613456565b60405180910390f35b34801561052257600080fd5b5061053d600480360381019061053891906130f2565b611386565b005b34801561054b57600080fd5b5061055461140c565b60405161056191906134d8565b60405180910390f35b34801561057657600080fd5b5061057f61149e565b60405161058c919061363a565b60405180910390f35b6105af60048036038101906105aa91906130f2565b6114a4565b005b3480156105bd57600080fd5b506105d860048036038101906105d39190612fcf565b61178b565b005b3480156105e657600080fd5b506105ef611903565b6040516105fc919061363a565b60405180910390f35b34801561061157600080fd5b5061062c60048036038101906106279190612f4c565b611909565b005b34801561063a57600080fd5b50610655600480360381019061065091906130f2565b61195c565b60405161066291906134d8565b60405180910390f35b34801561067757600080fd5b506106806119d8565b60405161068d91906134bd565b60405180910390f35b3480156106a257600080fd5b506106ab6119eb565b6040516106b8919061363a565b60405180910390f35b3480156106cd57600080fd5b506106d66119f1565b6040516106e3919061363a565b60405180910390f35b3480156106f857600080fd5b50610713600480360381019061070e9190612eb9565b6119f7565b60405161072091906134bd565b60405180910390f35b34801561073557600080fd5b50610750600480360381019061074b9190612e8c565b611a8b565b005b34801561075e57600080fd5b50610767611c37565b604051610774919061363a565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061084857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108b057507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108c057506108bf82611c60565b5b9050919050565b6060600280546108d69061390a565b80601f01602080910402602001604051908101604052809291908181526020018280546109029061390a565b801561094f5780601f106109245761010080835404028352916020019161094f565b820191906000526020600020905b81548152906001019060200180831161093257829003601f168201915b5050505050905090565b600061096482611cca565b61099a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109e082611003565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a48576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a67611d04565b73ffffffffffffffffffffffffffffffffffffffff1614158015610a995750610a9781610a92611d04565b6119f7565b155b15610ad0576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610adb838383611d0c565b505050565b600060015460005403905090565b610af9838383611dbe565b505050565b6000610b09836110a7565b8210610b41576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054905060008060005b83811015610ccb576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115610c2a5750610cbe565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610c6a57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cbc5786841415610cb3578195505050505050610cd1565b83806001019450505b505b8080600101915050610b4d565b50600080fd5b92915050565b610cdf611d04565b73ffffffffffffffffffffffffffffffffffffffff16610cfd61135c565b73ffffffffffffffffffffffffffffffffffffffff1614610d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4a9061357a565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610d7990613441565b60006040518083038185875af1925050503d8060008114610db6576040519150601f19603f3d011682016040523d82523d6000602084013e610dbb565b606091505b5050905080610dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df6906135fa565b60405180910390fd5b50565b610e1d83838360405180602001604052806000815250611909565b505050565b600d5481565b60008060005490506000805b82811015610f35576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151610f275785831415610f1e5781945050505050610f68565b82806001019350505b508080600101915050610e34565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b610f75611d04565b73ffffffffffffffffffffffffffffffffffffffff16610f9361135c565b73ffffffffffffffffffffffffffffffffffffffff1614610fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe09061357a565b60405180910390fd5b8060099080519060200190610fff929190612c5d565b5050565b600061100e826122af565b600001519050919050565b600980546110269061390a565b80601f01602080910402602001604051908101604052809291908181526020018280546110529061390a565b801561109f5780601f106110745761010080835404028352916020019161109f565b820191906000526020600020905b81548152906001019060200180831161108257829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561110f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61117f611d04565b73ffffffffffffffffffffffffffffffffffffffff1661119d61135c565b73ffffffffffffffffffffffffffffffffffffffff16146111f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ea9061357a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6112bc611d04565b73ffffffffffffffffffffffffffffffffffffffff166112da61135c565b73ffffffffffffffffffffffffffffffffffffffff1614611330576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113279061357a565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61138e611d04565b73ffffffffffffffffffffffffffffffffffffffff166113ac61135c565b73ffffffffffffffffffffffffffffffffffffffff1614611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f99061357a565b60405180910390fd5b80600a8190555050565b60606003805461141b9061390a565b80601f01602080910402602001604051908101604052809291908181526020018280546114479061390a565b80156114945780601f1061146957610100808354040283529160200191611494565b820191906000526020600020905b81548152906001019060200180831161147757829003601f168201915b5050505050905090565b600a5481565b6000600a5490506000600e5483601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114fb919061373f565b11159050801561150a57600091505b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156f906135ba565b60405180910390fd5b818361158491906137c6565b3410156115c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bd906135da565b60405180910390fd5b6001600c546115d5919061373f565b836115de610ae0565b6115e8919061373f565b10611628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161f9061355a565b60405180910390fd5b601060009054906101000a900460ff16611677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166e906134fa565b60405180910390fd5b6001600b54611686919061373f565b83106116c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116be9061361a565b60405180910390fd5b600d54836116d43361252b565b6116de919061373f565b111561171f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117169061353a565b60405180910390fd5b801561177c5782601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611774919061373f565b925050819055505b61178633846125fb565b505050565b611793611d04565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117f8576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611805611d04565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118b2611d04565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118f791906134bd565b60405180910390a35050565b600e5481565b611914848484611dbe565b61192084848484612619565b611956576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061196782611cca565b6119a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199d9061359a565b60405180910390fd5b60096119b1836127a7565b6040516020016119c2929190613412565b6040516020818303038152906040529050919050565b601060009054906101000a900460ff1681565b600c5481565b600f5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a93611d04565b73ffffffffffffffffffffffffffffffffffffffff16611ab161135c565b73ffffffffffffffffffffffffffffffffffffffff1614611b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afe9061357a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6e9061351a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b5481565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482108015611cfd575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611dc9826122af565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611df0611d04565b73ffffffffffffffffffffffffffffffffffffffff161480611e235750611e228260000151611e1d611d04565b6119f7565b5b80611e685750611e31611d04565b73ffffffffffffffffffffffffffffffffffffffff16611e5084610959565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611ea1576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611f0a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611f71576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f7e8585856001612908565b611f8e6000848460000151611d0c565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561223f5760005481101561223e5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122a8858585600161290e565b5050505050565b6122b7612ce3565b60008290506000548110156124f4576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516124f257600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146123d6578092505050612526565b5b6001156124f157818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146124ec578092505050612526565b6123d7565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612593576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b612615828260405180602001604052806000815250612914565b5050565b600061263a8473ffffffffffffffffffffffffffffffffffffffff16611c3d565b1561279a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612663611d04565b8786866040518563ffffffff1660e01b81526004016126859493929190613471565b602060405180830381600087803b15801561269f57600080fd5b505af19250505080156126d057506040513d601f19601f820116820180604052508101906126cd919061307c565b60015b61274a573d8060008114612700576040519150601f19603f3d011682016040523d82523d6000602084013e612705565b606091505b50600081511415612742576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061279f565b600190505b949350505050565b606060008214156127ef576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612903565b600082905060005b6000821461282157808061280a9061396d565b915050600a8261281a9190613795565b91506127f7565b60008167ffffffffffffffff81111561283d5761283c613aa3565b5b6040519080825280601f01601f19166020018201604052801561286f5781602001600182028036833780820191505090505b5090505b600085146128fc576001826128889190613820565b9150600a8561289791906139b6565b60306128a3919061373f565b60f81b8183815181106128b9576128b8613a74565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128f59190613795565b9450612873565b8093505050505b919050565b50505050565b50505050565b6129218383836001612926565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612993576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156129ce576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129db6000868387612908565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612c4057818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015612bf45750612bf26000888488612619565b155b15612c2b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050612b79565b508060008190555050612c56600086838761290e565b5050505050565b828054612c699061390a565b90600052602060002090601f016020900481019282612c8b5760008555612cd2565b82601f10612ca457805160ff1916838001178555612cd2565b82800160010185558215612cd2579182015b82811115612cd1578251825591602001919060010190612cb6565b5b509050612cdf9190612d26565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612d3f576000816000905550600101612d27565b5090565b6000612d56612d518461367a565b613655565b905082815260208101848484011115612d7257612d71613ad7565b5b612d7d8482856138c8565b509392505050565b6000612d98612d93846136ab565b613655565b905082815260208101848484011115612db457612db3613ad7565b5b612dbf8482856138c8565b509392505050565b600081359050612dd681613d2f565b92915050565b600081359050612deb81613d46565b92915050565b600081359050612e0081613d5d565b92915050565b600081519050612e1581613d5d565b92915050565b600082601f830112612e3057612e2f613ad2565b5b8135612e40848260208601612d43565b91505092915050565b600082601f830112612e5e57612e5d613ad2565b5b8135612e6e848260208601612d85565b91505092915050565b600081359050612e8681613d74565b92915050565b600060208284031215612ea257612ea1613ae1565b5b6000612eb084828501612dc7565b91505092915050565b60008060408385031215612ed057612ecf613ae1565b5b6000612ede85828601612dc7565b9250506020612eef85828601612dc7565b9150509250929050565b600080600060608486031215612f1257612f11613ae1565b5b6000612f2086828701612dc7565b9350506020612f3186828701612dc7565b9250506040612f4286828701612e77565b9150509250925092565b60008060008060808587031215612f6657612f65613ae1565b5b6000612f7487828801612dc7565b9450506020612f8587828801612dc7565b9350506040612f9687828801612e77565b925050606085013567ffffffffffffffff811115612fb757612fb6613adc565b5b612fc387828801612e1b565b91505092959194509250565b60008060408385031215612fe657612fe5613ae1565b5b6000612ff485828601612dc7565b925050602061300585828601612ddc565b9150509250929050565b6000806040838503121561302657613025613ae1565b5b600061303485828601612dc7565b925050602061304585828601612e77565b9150509250929050565b60006020828403121561306557613064613ae1565b5b600061307384828501612df1565b91505092915050565b60006020828403121561309257613091613ae1565b5b60006130a084828501612e06565b91505092915050565b6000602082840312156130bf576130be613ae1565b5b600082013567ffffffffffffffff8111156130dd576130dc613adc565b5b6130e984828501612e49565b91505092915050565b60006020828403121561310857613107613ae1565b5b600061311684828501612e77565b91505092915050565b61312881613854565b82525050565b61313781613866565b82525050565b6000613148826136f1565b6131528185613707565b93506131628185602086016138d7565b61316b81613ae6565b840191505092915050565b6000613181826136fc565b61318b8185613723565b935061319b8185602086016138d7565b6131a481613ae6565b840191505092915050565b60006131ba826136fc565b6131c48185613734565b93506131d48185602086016138d7565b80840191505092915050565b600081546131ed8161390a565b6131f78186613734565b94506001821660008114613212576001811461322357613256565b60ff19831686528186019350613256565b61322c856136dc565b60005b8381101561324e5781548189015260018201915060208101905061322f565b838801955050505b50505092915050565b600061326c602f83613723565b915061327782613af7565b604082019050919050565b600061328f602683613723565b915061329a82613b46565b604082019050919050565b60006132b2601483613723565b91506132bd82613b95565b602082019050919050565b60006132d5601583613723565b91506132e082613bbe565b602082019050919050565b60006132f8600583613734565b915061330382613be7565b600582019050919050565b600061331b602083613723565b915061332682613c10565b602082019050919050565b600061333e602f83613723565b915061334982613c39565b604082019050919050565b6000613361600383613723565b915061336c82613c88565b602082019050919050565b6000613384601d83613723565b915061338f82613cb1565b602082019050919050565b60006133a7600083613718565b91506133b282613cda565b600082019050919050565b60006133ca601083613723565b91506133d582613cdd565b602082019050919050565b60006133ed601383613723565b91506133f882613d06565b602082019050919050565b61340c816138be565b82525050565b600061341e82856131e0565b915061342a82846131af565b9150613435826132eb565b91508190509392505050565b600061344c8261339a565b9150819050919050565b600060208201905061346b600083018461311f565b92915050565b6000608082019050613486600083018761311f565b613493602083018661311f565b6134a06040830185613403565b81810360608301526134b2818461313d565b905095945050505050565b60006020820190506134d2600083018461312e565b92915050565b600060208201905081810360008301526134f28184613176565b905092915050565b600060208201905081810360008301526135138161325f565b9050919050565b6000602082019050818103600083015261353381613282565b9050919050565b60006020820190508181036000830152613553816132a5565b9050919050565b60006020820190508181036000830152613573816132c8565b9050919050565b600060208201905081810360008301526135938161330e565b9050919050565b600060208201905081810360008301526135b381613331565b9050919050565b600060208201905081810360008301526135d381613354565b9050919050565b600060208201905081810360008301526135f381613377565b9050919050565b60006020820190508181036000830152613613816133bd565b9050919050565b60006020820190508181036000830152613633816133e0565b9050919050565b600060208201905061364f6000830184613403565b92915050565b600061365f613670565b905061366b828261393c565b919050565b6000604051905090565b600067ffffffffffffffff82111561369557613694613aa3565b5b61369e82613ae6565b9050602081019050919050565b600067ffffffffffffffff8211156136c6576136c5613aa3565b5b6136cf82613ae6565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061374a826138be565b9150613755836138be565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561378a576137896139e7565b5b828201905092915050565b60006137a0826138be565b91506137ab836138be565b9250826137bb576137ba613a16565b5b828204905092915050565b60006137d1826138be565b91506137dc836138be565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613815576138146139e7565b5b828202905092915050565b600061382b826138be565b9150613836836138be565b925082821015613849576138486139e7565b5b828203905092915050565b600061385f8261389e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156138f55780820151818401526020810190506138da565b83811115613904576000848401525b50505050565b6000600282049050600182168061392257607f821691505b6020821081141561393657613935613a45565b5b50919050565b61394582613ae6565b810181811067ffffffffffffffff8211171561396457613963613aa3565b5b80604052505050565b6000613978826138be565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156139ab576139aa6139e7565b5b600182019050919050565b60006139c1826138be565b91506139cc836138be565b9250826139dc576139db613a16565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d696e74696e67206973206e6f74206c697665207965742c20686f6c64206f6e60008201527f204b6576696e20476f626c696e732e0000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f546f6f206d616e79207065722077616c6c657421000000000000000000000000600082015250565b7f4e6f206d6f7265204b6576696e20476f626c696e730000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f2e2e2e0000000000000000000000000000000000000000000000000000000000600082015250565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4d61782070657220545820726561636865642e00000000000000000000000000600082015250565b613d3881613854565b8114613d4357600080fd5b50565b613d4f81613866565b8114613d5a57600080fd5b50565b613d6681613872565b8114613d7157600080fd5b50565b613d7d816138be565b8114613d8857600080fd5b5056fea26469706673582212203957cb4c89443e711f2ab4c7eb3eac38af1b7bd1b3991e12bd30febc3520bfb064736f6c63430008070033
Deployed Bytecode
0x6080604052600436106101e35760003560e01c80637ba5e62111610102578063b88d4fde11610095578063d7224ba011610064578063d7224ba0146106c1578063e985e9c5146106ec578063f2fde38b14610729578063f968adbe14610752576101e3565b8063b88d4fde14610605578063c87b56dd1461062e578063d12397301461066b578063d5abeb0114610696576101e3565b8063a035b1fe116100d1578063a035b1fe1461056a578063a0712d6814610595578063a22cb465146105b1578063a7027357146105da576101e3565b80637ba5e621146104d45780638da5cb5b146104eb57806391b7f5ed1461051657806395d89b411461053f576101e3565b806342842e0e1161017a5780636352211e116101495780636352211e146104185780636c0360eb1461045557806370a0823114610480578063715018a6146104bd576101e3565b806342842e0e1461035e578063453c2310146103875780634f6ccce7146103b257806355f804b3146103ef576101e3565b806318160ddd116101b657806318160ddd146102b657806323b872dd146102e15780632f745c591461030a5780633ccfd60b14610347576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a919061304f565b61077d565b60405161021c91906134bd565b60405180910390f35b34801561023157600080fd5b5061023a6108c7565b60405161024791906134d8565b60405180910390f35b34801561025c57600080fd5b50610277600480360381019061027291906130f2565b610959565b6040516102849190613456565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af919061300f565b6109d5565b005b3480156102c257600080fd5b506102cb610ae0565b6040516102d8919061363a565b60405180910390f35b3480156102ed57600080fd5b5061030860048036038101906103039190612ef9565b610aee565b005b34801561031657600080fd5b50610331600480360381019061032c919061300f565b610afe565b60405161033e919061363a565b60405180910390f35b34801561035357600080fd5b5061035c610cd7565b005b34801561036a57600080fd5b5061038560048036038101906103809190612ef9565b610e02565b005b34801561039357600080fd5b5061039c610e22565b6040516103a9919061363a565b60405180910390f35b3480156103be57600080fd5b506103d960048036038101906103d491906130f2565b610e28565b6040516103e6919061363a565b60405180910390f35b3480156103fb57600080fd5b50610416600480360381019061041191906130a9565b610f6d565b005b34801561042457600080fd5b5061043f600480360381019061043a91906130f2565b611003565b60405161044c9190613456565b60405180910390f35b34801561046157600080fd5b5061046a611019565b60405161047791906134d8565b60405180910390f35b34801561048c57600080fd5b506104a760048036038101906104a29190612e8c565b6110a7565b6040516104b4919061363a565b60405180910390f35b3480156104c957600080fd5b506104d2611177565b005b3480156104e057600080fd5b506104e96112b4565b005b3480156104f757600080fd5b5061050061135c565b60405161050d9190613456565b60405180910390f35b34801561052257600080fd5b5061053d600480360381019061053891906130f2565b611386565b005b34801561054b57600080fd5b5061055461140c565b60405161056191906134d8565b60405180910390f35b34801561057657600080fd5b5061057f61149e565b60405161058c919061363a565b60405180910390f35b6105af60048036038101906105aa91906130f2565b6114a4565b005b3480156105bd57600080fd5b506105d860048036038101906105d39190612fcf565b61178b565b005b3480156105e657600080fd5b506105ef611903565b6040516105fc919061363a565b60405180910390f35b34801561061157600080fd5b5061062c60048036038101906106279190612f4c565b611909565b005b34801561063a57600080fd5b50610655600480360381019061065091906130f2565b61195c565b60405161066291906134d8565b60405180910390f35b34801561067757600080fd5b506106806119d8565b60405161068d91906134bd565b60405180910390f35b3480156106a257600080fd5b506106ab6119eb565b6040516106b8919061363a565b60405180910390f35b3480156106cd57600080fd5b506106d66119f1565b6040516106e3919061363a565b60405180910390f35b3480156106f857600080fd5b50610713600480360381019061070e9190612eb9565b6119f7565b60405161072091906134bd565b60405180910390f35b34801561073557600080fd5b50610750600480360381019061074b9190612e8c565b611a8b565b005b34801561075e57600080fd5b50610767611c37565b604051610774919061363a565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061084857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108b057507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108c057506108bf82611c60565b5b9050919050565b6060600280546108d69061390a565b80601f01602080910402602001604051908101604052809291908181526020018280546109029061390a565b801561094f5780601f106109245761010080835404028352916020019161094f565b820191906000526020600020905b81548152906001019060200180831161093257829003601f168201915b5050505050905090565b600061096482611cca565b61099a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109e082611003565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a48576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a67611d04565b73ffffffffffffffffffffffffffffffffffffffff1614158015610a995750610a9781610a92611d04565b6119f7565b155b15610ad0576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610adb838383611d0c565b505050565b600060015460005403905090565b610af9838383611dbe565b505050565b6000610b09836110a7565b8210610b41576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054905060008060005b83811015610ccb576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115610c2a5750610cbe565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610c6a57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cbc5786841415610cb3578195505050505050610cd1565b83806001019450505b505b8080600101915050610b4d565b50600080fd5b92915050565b610cdf611d04565b73ffffffffffffffffffffffffffffffffffffffff16610cfd61135c565b73ffffffffffffffffffffffffffffffffffffffff1614610d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4a9061357a565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610d7990613441565b60006040518083038185875af1925050503d8060008114610db6576040519150601f19603f3d011682016040523d82523d6000602084013e610dbb565b606091505b5050905080610dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df6906135fa565b60405180910390fd5b50565b610e1d83838360405180602001604052806000815250611909565b505050565b600d5481565b60008060005490506000805b82811015610f35576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151610f275785831415610f1e5781945050505050610f68565b82806001019350505b508080600101915050610e34565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b610f75611d04565b73ffffffffffffffffffffffffffffffffffffffff16610f9361135c565b73ffffffffffffffffffffffffffffffffffffffff1614610fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe09061357a565b60405180910390fd5b8060099080519060200190610fff929190612c5d565b5050565b600061100e826122af565b600001519050919050565b600980546110269061390a565b80601f01602080910402602001604051908101604052809291908181526020018280546110529061390a565b801561109f5780601f106110745761010080835404028352916020019161109f565b820191906000526020600020905b81548152906001019060200180831161108257829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561110f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61117f611d04565b73ffffffffffffffffffffffffffffffffffffffff1661119d61135c565b73ffffffffffffffffffffffffffffffffffffffff16146111f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ea9061357a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6112bc611d04565b73ffffffffffffffffffffffffffffffffffffffff166112da61135c565b73ffffffffffffffffffffffffffffffffffffffff1614611330576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113279061357a565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61138e611d04565b73ffffffffffffffffffffffffffffffffffffffff166113ac61135c565b73ffffffffffffffffffffffffffffffffffffffff1614611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f99061357a565b60405180910390fd5b80600a8190555050565b60606003805461141b9061390a565b80601f01602080910402602001604051908101604052809291908181526020018280546114479061390a565b80156114945780601f1061146957610100808354040283529160200191611494565b820191906000526020600020905b81548152906001019060200180831161147757829003601f168201915b5050505050905090565b600a5481565b6000600a5490506000600e5483601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114fb919061373f565b11159050801561150a57600091505b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156f906135ba565b60405180910390fd5b818361158491906137c6565b3410156115c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bd906135da565b60405180910390fd5b6001600c546115d5919061373f565b836115de610ae0565b6115e8919061373f565b10611628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161f9061355a565b60405180910390fd5b601060009054906101000a900460ff16611677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166e906134fa565b60405180910390fd5b6001600b54611686919061373f565b83106116c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116be9061361a565b60405180910390fd5b600d54836116d43361252b565b6116de919061373f565b111561171f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117169061353a565b60405180910390fd5b801561177c5782601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611774919061373f565b925050819055505b61178633846125fb565b505050565b611793611d04565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117f8576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611805611d04565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118b2611d04565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118f791906134bd565b60405180910390a35050565b600e5481565b611914848484611dbe565b61192084848484612619565b611956576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061196782611cca565b6119a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199d9061359a565b60405180910390fd5b60096119b1836127a7565b6040516020016119c2929190613412565b6040516020818303038152906040529050919050565b601060009054906101000a900460ff1681565b600c5481565b600f5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a93611d04565b73ffffffffffffffffffffffffffffffffffffffff16611ab161135c565b73ffffffffffffffffffffffffffffffffffffffff1614611b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afe9061357a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6e9061351a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b5481565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482108015611cfd575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611dc9826122af565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611df0611d04565b73ffffffffffffffffffffffffffffffffffffffff161480611e235750611e228260000151611e1d611d04565b6119f7565b5b80611e685750611e31611d04565b73ffffffffffffffffffffffffffffffffffffffff16611e5084610959565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611ea1576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611f0a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611f71576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f7e8585856001612908565b611f8e6000848460000151611d0c565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561223f5760005481101561223e5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122a8858585600161290e565b5050505050565b6122b7612ce3565b60008290506000548110156124f4576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516124f257600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146123d6578092505050612526565b5b6001156124f157818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146124ec578092505050612526565b6123d7565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612593576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b612615828260405180602001604052806000815250612914565b5050565b600061263a8473ffffffffffffffffffffffffffffffffffffffff16611c3d565b1561279a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612663611d04565b8786866040518563ffffffff1660e01b81526004016126859493929190613471565b602060405180830381600087803b15801561269f57600080fd5b505af19250505080156126d057506040513d601f19601f820116820180604052508101906126cd919061307c565b60015b61274a573d8060008114612700576040519150601f19603f3d011682016040523d82523d6000602084013e612705565b606091505b50600081511415612742576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061279f565b600190505b949350505050565b606060008214156127ef576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612903565b600082905060005b6000821461282157808061280a9061396d565b915050600a8261281a9190613795565b91506127f7565b60008167ffffffffffffffff81111561283d5761283c613aa3565b5b6040519080825280601f01601f19166020018201604052801561286f5781602001600182028036833780820191505090505b5090505b600085146128fc576001826128889190613820565b9150600a8561289791906139b6565b60306128a3919061373f565b60f81b8183815181106128b9576128b8613a74565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128f59190613795565b9450612873565b8093505050505b919050565b50505050565b50505050565b6129218383836001612926565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612993576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156129ce576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129db6000868387612908565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612c4057818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015612bf45750612bf26000888488612619565b155b15612c2b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050612b79565b508060008190555050612c56600086838761290e565b5050505050565b828054612c699061390a565b90600052602060002090601f016020900481019282612c8b5760008555612cd2565b82601f10612ca457805160ff1916838001178555612cd2565b82800160010185558215612cd2579182015b82811115612cd1578251825591602001919060010190612cb6565b5b509050612cdf9190612d26565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612d3f576000816000905550600101612d27565b5090565b6000612d56612d518461367a565b613655565b905082815260208101848484011115612d7257612d71613ad7565b5b612d7d8482856138c8565b509392505050565b6000612d98612d93846136ab565b613655565b905082815260208101848484011115612db457612db3613ad7565b5b612dbf8482856138c8565b509392505050565b600081359050612dd681613d2f565b92915050565b600081359050612deb81613d46565b92915050565b600081359050612e0081613d5d565b92915050565b600081519050612e1581613d5d565b92915050565b600082601f830112612e3057612e2f613ad2565b5b8135612e40848260208601612d43565b91505092915050565b600082601f830112612e5e57612e5d613ad2565b5b8135612e6e848260208601612d85565b91505092915050565b600081359050612e8681613d74565b92915050565b600060208284031215612ea257612ea1613ae1565b5b6000612eb084828501612dc7565b91505092915050565b60008060408385031215612ed057612ecf613ae1565b5b6000612ede85828601612dc7565b9250506020612eef85828601612dc7565b9150509250929050565b600080600060608486031215612f1257612f11613ae1565b5b6000612f2086828701612dc7565b9350506020612f3186828701612dc7565b9250506040612f4286828701612e77565b9150509250925092565b60008060008060808587031215612f6657612f65613ae1565b5b6000612f7487828801612dc7565b9450506020612f8587828801612dc7565b9350506040612f9687828801612e77565b925050606085013567ffffffffffffffff811115612fb757612fb6613adc565b5b612fc387828801612e1b565b91505092959194509250565b60008060408385031215612fe657612fe5613ae1565b5b6000612ff485828601612dc7565b925050602061300585828601612ddc565b9150509250929050565b6000806040838503121561302657613025613ae1565b5b600061303485828601612dc7565b925050602061304585828601612e77565b9150509250929050565b60006020828403121561306557613064613ae1565b5b600061307384828501612df1565b91505092915050565b60006020828403121561309257613091613ae1565b5b60006130a084828501612e06565b91505092915050565b6000602082840312156130bf576130be613ae1565b5b600082013567ffffffffffffffff8111156130dd576130dc613adc565b5b6130e984828501612e49565b91505092915050565b60006020828403121561310857613107613ae1565b5b600061311684828501612e77565b91505092915050565b61312881613854565b82525050565b61313781613866565b82525050565b6000613148826136f1565b6131528185613707565b93506131628185602086016138d7565b61316b81613ae6565b840191505092915050565b6000613181826136fc565b61318b8185613723565b935061319b8185602086016138d7565b6131a481613ae6565b840191505092915050565b60006131ba826136fc565b6131c48185613734565b93506131d48185602086016138d7565b80840191505092915050565b600081546131ed8161390a565b6131f78186613734565b94506001821660008114613212576001811461322357613256565b60ff19831686528186019350613256565b61322c856136dc565b60005b8381101561324e5781548189015260018201915060208101905061322f565b838801955050505b50505092915050565b600061326c602f83613723565b915061327782613af7565b604082019050919050565b600061328f602683613723565b915061329a82613b46565b604082019050919050565b60006132b2601483613723565b91506132bd82613b95565b602082019050919050565b60006132d5601583613723565b91506132e082613bbe565b602082019050919050565b60006132f8600583613734565b915061330382613be7565b600582019050919050565b600061331b602083613723565b915061332682613c10565b602082019050919050565b600061333e602f83613723565b915061334982613c39565b604082019050919050565b6000613361600383613723565b915061336c82613c88565b602082019050919050565b6000613384601d83613723565b915061338f82613cb1565b602082019050919050565b60006133a7600083613718565b91506133b282613cda565b600082019050919050565b60006133ca601083613723565b91506133d582613cdd565b602082019050919050565b60006133ed601383613723565b91506133f882613d06565b602082019050919050565b61340c816138be565b82525050565b600061341e82856131e0565b915061342a82846131af565b9150613435826132eb565b91508190509392505050565b600061344c8261339a565b9150819050919050565b600060208201905061346b600083018461311f565b92915050565b6000608082019050613486600083018761311f565b613493602083018661311f565b6134a06040830185613403565b81810360608301526134b2818461313d565b905095945050505050565b60006020820190506134d2600083018461312e565b92915050565b600060208201905081810360008301526134f28184613176565b905092915050565b600060208201905081810360008301526135138161325f565b9050919050565b6000602082019050818103600083015261353381613282565b9050919050565b60006020820190508181036000830152613553816132a5565b9050919050565b60006020820190508181036000830152613573816132c8565b9050919050565b600060208201905081810360008301526135938161330e565b9050919050565b600060208201905081810360008301526135b381613331565b9050919050565b600060208201905081810360008301526135d381613354565b9050919050565b600060208201905081810360008301526135f381613377565b9050919050565b60006020820190508181036000830152613613816133bd565b9050919050565b60006020820190508181036000830152613633816133e0565b9050919050565b600060208201905061364f6000830184613403565b92915050565b600061365f613670565b905061366b828261393c565b919050565b6000604051905090565b600067ffffffffffffffff82111561369557613694613aa3565b5b61369e82613ae6565b9050602081019050919050565b600067ffffffffffffffff8211156136c6576136c5613aa3565b5b6136cf82613ae6565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061374a826138be565b9150613755836138be565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561378a576137896139e7565b5b828201905092915050565b60006137a0826138be565b91506137ab836138be565b9250826137bb576137ba613a16565b5b828204905092915050565b60006137d1826138be565b91506137dc836138be565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613815576138146139e7565b5b828202905092915050565b600061382b826138be565b9150613836836138be565b925082821015613849576138486139e7565b5b828203905092915050565b600061385f8261389e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156138f55780820151818401526020810190506138da565b83811115613904576000848401525b50505050565b6000600282049050600182168061392257607f821691505b6020821081141561393657613935613a45565b5b50919050565b61394582613ae6565b810181811067ffffffffffffffff8211171561396457613963613aa3565b5b80604052505050565b6000613978826138be565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156139ab576139aa6139e7565b5b600182019050919050565b60006139c1826138be565b91506139cc836138be565b9250826139dc576139db613a16565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d696e74696e67206973206e6f74206c697665207965742c20686f6c64206f6e60008201527f204b6576696e20476f626c696e732e0000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f546f6f206d616e79207065722077616c6c657421000000000000000000000000600082015250565b7f4e6f206d6f7265204b6576696e20476f626c696e730000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f2e2e2e0000000000000000000000000000000000000000000000000000000000600082015250565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4d61782070657220545820726561636865642e00000000000000000000000000600082015250565b613d3881613854565b8114613d4357600080fd5b50565b613d4f81613866565b8114613d5a57600080fd5b50565b613d6681613872565b8114613d7157600080fd5b50565b613d7d816138be565b8114613d8857600080fd5b5056fea26469706673582212203957cb4c89443e711f2ab4c7eb3eac38af1b7bd1b3991e12bd30febc3520bfb064736f6c63430008070033
Deployed Bytecode Sourcemap
2402:2266:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6016:410:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8629:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10173:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9750:362;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3248:278;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11104:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4836:1113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4465:201:13;;;;;;;;;;;;;:::i;:::-;;11334:179:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2618:32:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3812:731:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4189:86:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8445:122:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2481:21:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6485:203:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1693:145:11;;;;;;;;;;;;;:::i;:::-;;4377:82:13;;;;;;;;;;;;;:::i;:::-;;1061:85:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4281:90:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8791:102:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2508:34:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2925:802;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10476:294:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2656:35:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11579:332:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3845:338:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2742:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2581:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2697:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10836:206:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1987:240:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2548:27:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6016:410:4;6158:4;6212:25;6197:40;;;:11;:40;;;;:104;;;;6268:33;6253:48;;;:11;:48;;;;6197:104;:170;;;;6332:35;6317:50;;;:11;:50;;;;6197:170;:222;;;;6383:36;6407:11;6383:23;:36::i;:::-;6197:222;6178:241;;6016:410;;;:::o;8629:98::-;8683:13;8715:5;8708:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8629:98;:::o;10173:236::-;10273:7;10301:16;10309:7;10301;:16::i;:::-;10296:64;;10326:34;;;;;;;;;;;;;;10296:64;10378:15;:24;10394:7;10378:24;;;;;;;;;;;;;;;;;;;;;10371:31;;10173:236;;;:::o;9750:362::-;9822:13;9838:24;9854:7;9838:15;:24::i;:::-;9822:40;;9882:5;9876:11;;:2;:11;;;9872:48;;;9896:24;;;;;;;;;;;;;;9872:48;9951:5;9935:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;9961:37;9978:5;9985:12;:10;:12::i;:::-;9961:16;:37::i;:::-;9960:38;9935:63;9931:136;;;10021:35;;;;;;;;;;;;;;9931:136;10077:28;10086:2;10090:7;10099:5;10077:8;:28::i;:::-;9812:300;9750:362;;:::o;3248:278::-;3309:7;3497:12;;3481:13;;:28;3474:35;;3248:278;:::o;11104:164::-;11233:28;11243:4;11249:2;11253:7;11233:9;:28::i;:::-;11104:164;;;:::o;4836:1113::-;4957:7;4993:16;5003:5;4993:9;:16::i;:::-;4984:5;:25;4980:61;;5018:23;;;;;;;;;;;;;;4980:61;5051:22;5076:13;;5051:38;;5099:19;5128:25;5324:9;5319:543;5339:14;5335:1;:18;5319:543;;;5378:31;5412:11;:14;5424:1;5412:14;;;;;;;;;;;5378:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5448:9;:16;;;5444:71;;;5488:8;;;5444:71;5562:1;5536:28;;:9;:14;;;:28;;;5532:109;;5608:9;:14;;;5588:34;;5532:109;5683:5;5662:26;;:17;:26;;;5658:190;;;5731:5;5716:11;:20;5712:83;;;5771:1;5764:8;;;;;;;;;5712:83;5816:13;;;;;;;5658:190;5360:502;5319:543;5355:3;;;;;;;5319:543;;;;5934:8;;;4836:1113;;;;;:::o;4465:201:13:-;1284:12:11;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4515:12:13::1;4541:10;4533:24;;4578:21;4533:80;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4514:99;;;4631:7;4623:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;4504:162;4465:201::o:0;11334:179:4:-;11467:39;11484:4;11490:2;11494:7;11467:39;;;;;;;;;;;;:16;:39::i;:::-;11334:179;;;:::o;2618:32:13:-;;;;:::o;3812:731:4:-;3911:7;3934:22;3959:13;;3934:38;;3982:19;4172:9;4167:320;4187:14;4183:1;:18;4167:320;;;4226:31;4260:11;:14;4272:1;4260:14;;;;;;;;;;;4226:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4297:9;:16;;;4292:181;;4356:5;4341:11;:20;4337:83;;;4396:1;4389:8;;;;;;;;4337:83;4441:13;;;;;;;4292:181;4208:279;4203:3;;;;;;;4167:320;;;;4513:23;;;;;;;;;;;;;;3812:731;;;;:::o;4189:86:13:-;1284:12:11;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4265:3:13::1;4255:7;:13;;;;;;;;;;;;:::i;:::-;;4189:86:::0;:::o;8445:122:4:-;8509:7;8535:20;8547:7;8535:11;:20::i;:::-;:25;;;8528:32;;8445:122;;;:::o;2481:21:13:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6485:203:4:-;6549:7;6589:1;6572:19;;:5;:19;;;6568:60;;;6600:28;;;;;;;;;;;;;;6568:60;6653:12;:19;6666:5;6653:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;6645:36;;6638:43;;6485:203;;;:::o;1693:145:11:-;1284:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1799:1:::1;1762:40;;1783:6;;;;;;;;;;;1762:40;;;;;;;;;;;;1829:1;1812:6;;:19;;;;;;;;;;;;;;;;;;1693:145::o:0;4377:82:13:-;1284:12:11;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4441:11:13::1;;;;;;;;;;;4440:12;4426:11;;:26;;;;;;;;;;;;;;;;;;4377:82::o:0;1061:85:11:-;1107:7;1133:6;;;;;;;;;;;1126:13;;1061:85;:::o;4281:90:13:-;1284:12:11;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4355:9:13::1;4347:5;:17;;;;4281:90:::0;:::o;8791:102:4:-;8847:13;8879:7;8872:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8791:102;:::o;2508:34:13:-;;;;:::o;2925:802::-;2979:12;2994:5;;2979:20;;3009:11;3062:16;;3055:3;3023:17;:29;3041:10;3023:29;;;;;;;;;;;;;;;;:35;;;;:::i;:::-;:55;;3009:69;;3092:6;3088:45;;;3121:1;3114:8;;3088:45;3164:9;3150:23;;:10;:23;;;3142:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;3218:4;3212:3;:10;;;;:::i;:::-;3199:9;:23;;3191:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;3308:1;3296:9;;:13;;;;:::i;:::-;3290:3;3274:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:35;3266:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;3353:11;;;;;;;;;;;3345:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;3451:1;3440:8;;:12;;;;:::i;:::-;3434:3;:18;3426:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;3542:12;;3535:3;3507:25;3521:10;3507:13;:25::i;:::-;:31;;;;:::i;:::-;:47;;3486:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;3615:6;3611:73;;;3670:3;3637:17;:29;3655:10;3637:29;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;3611:73;3694:26;3704:10;3716:3;3694:9;:26::i;:::-;2969:758;;2925:802;:::o;10476:294:4:-;10598:12;:10;:12::i;:::-;10586:24;;:8;:24;;;10582:54;;;10619:17;;;;;;;;;;;;;;10582:54;10692:8;10647:18;:32;10666:12;:10;:12::i;:::-;10647:32;;;;;;;;;;;;;;;:42;10680:8;10647:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;10744:8;10715:48;;10730:12;:10;:12::i;:::-;10715:48;;;10754:8;10715:48;;;;;;:::i;:::-;;;;;;;;10476:294;;:::o;2656:35:13:-;;;;:::o;11579:332:4:-;11740:28;11750:4;11756:2;11760:7;11740:9;:28::i;:::-;11783:48;11806:4;11812:2;11816:7;11825:5;11783:22;:48::i;:::-;11778:127;;11854:40;;;;;;;;;;;;;;11778:127;11579:332;;;;:::o;3845:338:13:-;3958:13;4008:16;4016:7;4008;:16::i;:::-;3987:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;4138:7;4147:18;:7;:16;:18::i;:::-;4121:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4107:69;;3845:338;;;:::o;2742:23::-;;;;;;;;;;;;;:::o;2581:31::-;;;;:::o;2697:39::-;;;;:::o;10836:206:4:-;10973:4;11000:18;:25;11019:5;11000:25;;;;;;;;;;;;;;;:35;11026:8;11000:35;;;;;;;;;;;;;;;;;;;;;;;;;10993:42;;10836:206;;;;:::o;1987:240:11:-;1284:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2095:1:::1;2075:22;;:8;:22;;;;2067:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2184:8;2155:38;;2176:6;;;;;;;;;;;2155:38;;;;;;;;;;;;2212:8;2203:6;;:17;;;;;;;;;;;;;;;;;;1987:240:::0;:::o;2548:27:13:-;;;;:::o;1160:320:0:-;1220:4;1472:1;1450:7;:19;;;:23;1443:30;;1160:320;;;:::o;829:155:2:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;12157:142:4:-;12214:4;12247:13;;12237:7;:23;:55;;;;;12265:11;:20;12277:7;12265:20;;;;;;;;;;;:27;;;;;;;;;;;;12264:28;12237:55;12230:62;;12157:142;;;:::o;586:96:1:-;639:7;665:10;658:17;;586:96;:::o;19283:189:4:-;19420:2;19393:15;:24;19409:7;19393:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;19457:7;19453:2;19437:28;;19446:5;19437:28;;;;;;;;;;;;19283:189;;;:::o;14839:2092::-;14949:35;14987:20;14999:7;14987:11;:20::i;:::-;14949:58;;15018:22;15060:13;:18;;;15044:34;;:12;:10;:12::i;:::-;:34;;;:100;;;;15094:50;15111:13;:18;;;15131:12;:10;:12::i;:::-;15094:16;:50::i;:::-;15044:100;:152;;;;15184:12;:10;:12::i;:::-;15160:36;;:20;15172:7;15160:11;:20::i;:::-;:36;;;15044:152;15018:179;;15213:17;15208:66;;15239:35;;;;;;;;;;;;;;15208:66;15310:4;15288:26;;:13;:18;;;:26;;;15284:67;;15323:28;;;;;;;;;;;;;;15284:67;15379:1;15365:16;;:2;:16;;;15361:52;;;15390:23;;;;;;;;;;;;;;15361:52;15424:43;15446:4;15452:2;15456:7;15465:1;15424:21;:43::i;:::-;15529:49;15546:1;15550:7;15559:13;:18;;;15529:8;:49::i;:::-;15898:1;15868:12;:18;15881:4;15868:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15941:1;15913:12;:16;15926:2;15913:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15985:2;15957:11;:20;15969:7;15957:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;16046:15;16001:11;:20;16013:7;16001:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;16310:19;16342:1;16332:7;:11;16310:33;;16402:1;16361:43;;:11;:24;16373:11;16361:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;16357:463;;;16583:13;;16569:11;:27;16565:241;;;16652:13;:18;;;16620:11;:24;16632:11;16620:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;16734:13;:53;;;16692:11;:24;16704:11;16692:24;;;;;;;;;;;:39;;;:95;;;;;;;;;;;;;;;;;;16565:241;16357:463;15844:986;16864:7;16860:2;16845:27;;16854:4;16845:27;;;;;;;;;;;;16882:42;16903:4;16909:2;16913:7;16922:1;16882:20;:42::i;:::-;14939:1992;;14839:2092;;;:::o;7304:1084::-;7389:21;;:::i;:::-;7426:12;7441:7;7426:22;;7494:13;;7487:4;:20;7483:841;;;7527:31;7561:11;:17;7573:4;7561:17;;;;;;;;;;;7527:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7601:9;:16;;;7596:714;;7671:1;7645:28;;:9;:14;;;:28;;;7641:99;;7708:9;7701:16;;;;;;7641:99;8037:255;8044:4;8037:255;;;8076:6;;;;;;;;8120:11;:17;8132:4;8120:17;;;;;;;;;;;8108:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8193:1;8167:28;;:9;:14;;;:28;;;8163:107;;8234:9;8227:16;;;;;;8163:107;8037:255;;;7596:714;7509:815;7483:841;8350:31;;;;;;;;;;;;;;7304:1084;;;;:::o;6694:204::-;6755:7;6795:1;6778:19;;:5;:19;;;6774:59;;;6806:27;;;;;;;;;;;;;;6774:59;6858:12;:19;6871:5;6858:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;6850:41;;6843:48;;6694:204;;;:::o;12305:102::-;12373:27;12383:2;12387:8;12373:27;;;;;;;;;;;;:9;:27::i;:::-;12305:102;;:::o;20025:895::-;20175:4;20195:15;:2;:13;;;:15::i;:::-;20191:723;;;20262:2;20246:36;;;20304:12;:10;:12::i;:::-;20338:4;20364:7;20393:5;20246:170;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;20226:636;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20616:1;20599:6;:13;:18;20595:253;;;20648:40;;;;;;;;;;;;;;20595:253;20800:6;20794:13;20785:6;20781:2;20777:15;20770:38;20226:636;20488:45;;;20478:55;;;:6;:55;;;;20471:62;;;;;20191:723;20899:4;20892:11;;20025:895;;;;;;;:::o;328:703:12:-;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;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;21551:154:4:-;;;;;:::o;22346:153::-;;;;;:::o;12758:157::-;12876:32;12882:2;12886:8;12896:5;12903:4;12876:5;:32::i;:::-;12758:157;;;:::o;13162:1435::-;13295:20;13318:13;;13295:36;;13359:1;13345:16;;:2;:16;;;13341:48;;;13370:19;;;;;;;;;;;;;;13341:48;13415:1;13403:8;:13;13399:44;;;13425:18;;;;;;;;;;;;;;13399:44;13454:61;13484:1;13488:2;13492:12;13506:8;13454:21;:61::i;:::-;13821:8;13786:12;:16;13799:2;13786:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13884:8;13844:12;:16;13857:2;13844:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13941:2;13908:11;:25;13920:12;13908:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;14007:15;13957:11;:25;13969:12;13957:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;14038:20;14061:12;14038:35;;14093:9;14088:380;14108:8;14104:1;:12;14088:380;;;14171:12;14167:2;14146:38;;14163:1;14146:38;;;;;;;;;;;;14227:4;:88;;;;;14256:59;14287:1;14291:2;14295:12;14309:5;14256:22;:59::i;:::-;14255:60;14227:88;14202:220;;;14363:40;;;;;;;;;;;;;;14202:220;14439:14;;;;;;;14118:3;;;;;;;14088:380;;;;14498:12;14482:13;:28;;;;13762:759;14530:60;14559:1;14563:2;14567:12;14581:8;14530:20;:60::i;:::-;13285:1312;13162:1435;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:14:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:118::-;7245:24;7263:5;7245:24;:::i;:::-;7240:3;7233:37;7158:118;;:::o;7282:109::-;7363:21;7378:5;7363:21;:::i;:::-;7358:3;7351:34;7282:109;;:::o;7397:360::-;7483:3;7511:38;7543:5;7511:38;:::i;:::-;7565:70;7628:6;7623:3;7565:70;:::i;:::-;7558:77;;7644:52;7689:6;7684:3;7677:4;7670:5;7666:16;7644:52;:::i;:::-;7721:29;7743:6;7721:29;:::i;:::-;7716:3;7712:39;7705:46;;7487:270;7397:360;;;;:::o;7763:364::-;7851:3;7879:39;7912:5;7879:39;:::i;:::-;7934:71;7998:6;7993:3;7934:71;:::i;:::-;7927:78;;8014:52;8059:6;8054:3;8047:4;8040:5;8036:16;8014:52;:::i;:::-;8091:29;8113:6;8091:29;:::i;:::-;8086:3;8082:39;8075:46;;7855:272;7763:364;;;;:::o;8133:377::-;8239:3;8267:39;8300:5;8267:39;:::i;:::-;8322:89;8404:6;8399:3;8322:89;:::i;:::-;8315:96;;8420:52;8465:6;8460:3;8453:4;8446:5;8442:16;8420:52;:::i;:::-;8497:6;8492:3;8488:16;8481:23;;8243:267;8133:377;;;;:::o;8540:845::-;8643:3;8680:5;8674:12;8709:36;8735:9;8709:36;:::i;:::-;8761:89;8843:6;8838:3;8761:89;:::i;:::-;8754:96;;8881:1;8870:9;8866:17;8897:1;8892:137;;;;9043:1;9038:341;;;;8859:520;;8892:137;8976:4;8972:9;8961;8957:25;8952:3;8945:38;9012:6;9007:3;9003:16;8996:23;;8892:137;;9038:341;9105:38;9137:5;9105:38;:::i;:::-;9165:1;9179:154;9193:6;9190:1;9187:13;9179:154;;;9267:7;9261:14;9257:1;9252:3;9248:11;9241:35;9317:1;9308:7;9304:15;9293:26;;9215:4;9212:1;9208:12;9203:17;;9179:154;;;9362:6;9357:3;9353:16;9346:23;;9045:334;;8859:520;;8647:738;;8540:845;;;;:::o;9391:366::-;9533:3;9554:67;9618:2;9613:3;9554:67;:::i;:::-;9547:74;;9630:93;9719:3;9630:93;:::i;:::-;9748:2;9743:3;9739:12;9732:19;;9391:366;;;:::o;9763:::-;9905:3;9926:67;9990:2;9985:3;9926:67;:::i;:::-;9919:74;;10002:93;10091:3;10002:93;:::i;:::-;10120:2;10115:3;10111:12;10104:19;;9763:366;;;:::o;10135:::-;10277:3;10298:67;10362:2;10357:3;10298:67;:::i;:::-;10291:74;;10374:93;10463:3;10374:93;:::i;:::-;10492:2;10487:3;10483:12;10476:19;;10135:366;;;:::o;10507:::-;10649:3;10670:67;10734:2;10729:3;10670:67;:::i;:::-;10663:74;;10746:93;10835:3;10746:93;:::i;:::-;10864:2;10859:3;10855:12;10848:19;;10507:366;;;:::o;10879:400::-;11039:3;11060:84;11142:1;11137:3;11060:84;:::i;:::-;11053:91;;11153:93;11242:3;11153:93;:::i;:::-;11271:1;11266:3;11262:11;11255:18;;10879:400;;;:::o;11285:366::-;11427:3;11448:67;11512:2;11507:3;11448:67;:::i;:::-;11441:74;;11524:93;11613:3;11524:93;:::i;:::-;11642:2;11637:3;11633:12;11626:19;;11285:366;;;:::o;11657:::-;11799:3;11820:67;11884:2;11879:3;11820:67;:::i;:::-;11813:74;;11896:93;11985:3;11896:93;:::i;:::-;12014:2;12009:3;12005:12;11998:19;;11657:366;;;:::o;12029:365::-;12171:3;12192:66;12256:1;12251:3;12192:66;:::i;:::-;12185:73;;12267:93;12356:3;12267:93;:::i;:::-;12385:2;12380:3;12376:12;12369:19;;12029:365;;;:::o;12400:366::-;12542:3;12563:67;12627:2;12622:3;12563:67;:::i;:::-;12556:74;;12639:93;12728:3;12639:93;:::i;:::-;12757:2;12752:3;12748:12;12741:19;;12400:366;;;:::o;12772:398::-;12931:3;12952:83;13033:1;13028:3;12952:83;:::i;:::-;12945:90;;13044:93;13133:3;13044:93;:::i;:::-;13162:1;13157:3;13153:11;13146:18;;12772:398;;;:::o;13176:366::-;13318:3;13339:67;13403:2;13398:3;13339:67;:::i;:::-;13332:74;;13415:93;13504:3;13415:93;:::i;:::-;13533:2;13528:3;13524:12;13517:19;;13176:366;;;:::o;13548:::-;13690:3;13711:67;13775:2;13770:3;13711:67;:::i;:::-;13704:74;;13787:93;13876:3;13787:93;:::i;:::-;13905:2;13900:3;13896:12;13889:19;;13548:366;;;:::o;13920:118::-;14007:24;14025:5;14007:24;:::i;:::-;14002:3;13995:37;13920:118;;:::o;14044:695::-;14322:3;14344:92;14432:3;14423:6;14344:92;:::i;:::-;14337:99;;14453:95;14544:3;14535:6;14453:95;:::i;:::-;14446:102;;14565:148;14709:3;14565:148;:::i;:::-;14558:155;;14730:3;14723:10;;14044:695;;;;;:::o;14745:379::-;14929:3;14951:147;15094:3;14951:147;:::i;:::-;14944:154;;15115:3;15108:10;;14745:379;;;:::o;15130:222::-;15223:4;15261:2;15250:9;15246:18;15238:26;;15274:71;15342:1;15331:9;15327:17;15318:6;15274:71;:::i;:::-;15130:222;;;;:::o;15358:640::-;15553:4;15591:3;15580:9;15576:19;15568:27;;15605:71;15673:1;15662:9;15658:17;15649:6;15605:71;:::i;:::-;15686:72;15754:2;15743:9;15739:18;15730:6;15686:72;:::i;:::-;15768;15836:2;15825:9;15821:18;15812:6;15768:72;:::i;:::-;15887:9;15881:4;15877:20;15872:2;15861:9;15857:18;15850:48;15915:76;15986:4;15977:6;15915:76;:::i;:::-;15907:84;;15358:640;;;;;;;:::o;16004:210::-;16091:4;16129:2;16118:9;16114:18;16106:26;;16142:65;16204:1;16193:9;16189:17;16180:6;16142:65;:::i;:::-;16004:210;;;;:::o;16220:313::-;16333:4;16371:2;16360:9;16356:18;16348:26;;16420:9;16414:4;16410:20;16406:1;16395:9;16391:17;16384:47;16448:78;16521:4;16512:6;16448:78;:::i;:::-;16440:86;;16220:313;;;;:::o;16539:419::-;16705:4;16743:2;16732:9;16728:18;16720:26;;16792:9;16786:4;16782:20;16778:1;16767:9;16763:17;16756:47;16820:131;16946:4;16820:131;:::i;:::-;16812:139;;16539:419;;;:::o;16964:::-;17130:4;17168:2;17157:9;17153:18;17145:26;;17217:9;17211:4;17207:20;17203:1;17192:9;17188:17;17181:47;17245:131;17371:4;17245:131;:::i;:::-;17237:139;;16964:419;;;:::o;17389:::-;17555:4;17593:2;17582:9;17578:18;17570:26;;17642:9;17636:4;17632:20;17628:1;17617:9;17613:17;17606:47;17670:131;17796:4;17670:131;:::i;:::-;17662:139;;17389:419;;;:::o;17814:::-;17980:4;18018:2;18007:9;18003:18;17995:26;;18067:9;18061:4;18057:20;18053:1;18042:9;18038:17;18031:47;18095:131;18221:4;18095:131;:::i;:::-;18087:139;;17814:419;;;:::o;18239:::-;18405:4;18443:2;18432:9;18428:18;18420:26;;18492:9;18486:4;18482:20;18478:1;18467:9;18463:17;18456:47;18520:131;18646:4;18520:131;:::i;:::-;18512:139;;18239:419;;;:::o;18664:::-;18830:4;18868:2;18857:9;18853:18;18845:26;;18917:9;18911:4;18907:20;18903:1;18892:9;18888:17;18881:47;18945:131;19071:4;18945:131;:::i;:::-;18937:139;;18664:419;;;:::o;19089:::-;19255:4;19293:2;19282:9;19278:18;19270:26;;19342:9;19336:4;19332:20;19328:1;19317:9;19313:17;19306:47;19370:131;19496:4;19370:131;:::i;:::-;19362:139;;19089:419;;;:::o;19514:::-;19680:4;19718:2;19707:9;19703:18;19695:26;;19767:9;19761:4;19757:20;19753:1;19742:9;19738:17;19731:47;19795:131;19921:4;19795:131;:::i;:::-;19787:139;;19514:419;;;:::o;19939:::-;20105:4;20143:2;20132:9;20128:18;20120:26;;20192:9;20186:4;20182:20;20178:1;20167:9;20163:17;20156:47;20220:131;20346:4;20220:131;:::i;:::-;20212:139;;19939:419;;;:::o;20364:::-;20530:4;20568:2;20557:9;20553:18;20545:26;;20617:9;20611:4;20607:20;20603:1;20592:9;20588:17;20581:47;20645:131;20771:4;20645:131;:::i;:::-;20637:139;;20364:419;;;:::o;20789:222::-;20882:4;20920:2;20909:9;20905:18;20897:26;;20933:71;21001:1;20990:9;20986:17;20977:6;20933:71;:::i;:::-;20789:222;;;;:::o;21017:129::-;21051:6;21078:20;;:::i;:::-;21068:30;;21107:33;21135:4;21127:6;21107:33;:::i;:::-;21017:129;;;:::o;21152:75::-;21185:6;21218:2;21212:9;21202:19;;21152:75;:::o;21233:307::-;21294:4;21384:18;21376:6;21373:30;21370:56;;;21406:18;;:::i;:::-;21370:56;21444:29;21466:6;21444:29;:::i;:::-;21436:37;;21528:4;21522;21518:15;21510:23;;21233:307;;;:::o;21546:308::-;21608:4;21698:18;21690:6;21687:30;21684:56;;;21720:18;;:::i;:::-;21684:56;21758:29;21780:6;21758:29;:::i;:::-;21750:37;;21842:4;21836;21832:15;21824:23;;21546:308;;;:::o;21860:141::-;21909:4;21932:3;21924:11;;21955:3;21952:1;21945:14;21989:4;21986:1;21976:18;21968:26;;21860:141;;;:::o;22007:98::-;22058:6;22092:5;22086:12;22076:22;;22007:98;;;:::o;22111:99::-;22163:6;22197:5;22191:12;22181:22;;22111:99;;;:::o;22216:168::-;22299:11;22333:6;22328:3;22321:19;22373:4;22368:3;22364:14;22349:29;;22216:168;;;;:::o;22390:147::-;22491:11;22528:3;22513:18;;22390:147;;;;:::o;22543:169::-;22627:11;22661:6;22656:3;22649:19;22701:4;22696:3;22692:14;22677:29;;22543:169;;;;:::o;22718:148::-;22820:11;22857:3;22842:18;;22718:148;;;;:::o;22872:305::-;22912:3;22931:20;22949:1;22931:20;:::i;:::-;22926:25;;22965:20;22983:1;22965:20;:::i;:::-;22960:25;;23119:1;23051:66;23047:74;23044:1;23041:81;23038:107;;;23125:18;;:::i;:::-;23038:107;23169:1;23166;23162:9;23155:16;;22872:305;;;;:::o;23183:185::-;23223:1;23240:20;23258:1;23240:20;:::i;:::-;23235:25;;23274:20;23292:1;23274:20;:::i;:::-;23269:25;;23313:1;23303:35;;23318:18;;:::i;:::-;23303:35;23360:1;23357;23353:9;23348:14;;23183:185;;;;:::o;23374:348::-;23414:7;23437:20;23455:1;23437:20;:::i;:::-;23432:25;;23471:20;23489:1;23471:20;:::i;:::-;23466:25;;23659:1;23591:66;23587:74;23584:1;23581:81;23576:1;23569:9;23562:17;23558:105;23555:131;;;23666:18;;:::i;:::-;23555:131;23714:1;23711;23707:9;23696:20;;23374:348;;;;:::o;23728:191::-;23768:4;23788:20;23806:1;23788:20;:::i;:::-;23783:25;;23822:20;23840:1;23822:20;:::i;:::-;23817:25;;23861:1;23858;23855:8;23852:34;;;23866:18;;:::i;:::-;23852:34;23911:1;23908;23904:9;23896:17;;23728:191;;;;:::o;23925:96::-;23962:7;23991:24;24009:5;23991:24;:::i;:::-;23980:35;;23925:96;;;:::o;24027:90::-;24061:7;24104:5;24097:13;24090:21;24079:32;;24027:90;;;:::o;24123:149::-;24159:7;24199:66;24192:5;24188:78;24177:89;;24123:149;;;:::o;24278:126::-;24315:7;24355:42;24348:5;24344:54;24333:65;;24278:126;;;:::o;24410:77::-;24447:7;24476:5;24465:16;;24410:77;;;:::o;24493:154::-;24577:6;24572:3;24567;24554:30;24639:1;24630:6;24625:3;24621:16;24614:27;24493:154;;;:::o;24653:307::-;24721:1;24731:113;24745:6;24742:1;24739:13;24731:113;;;24830:1;24825:3;24821:11;24815:18;24811:1;24806:3;24802:11;24795:39;24767:2;24764:1;24760:10;24755:15;;24731:113;;;24862:6;24859:1;24856:13;24853:101;;;24942:1;24933:6;24928:3;24924:16;24917:27;24853:101;24702:258;24653:307;;;:::o;24966:320::-;25010:6;25047:1;25041:4;25037:12;25027:22;;25094:1;25088:4;25084:12;25115:18;25105:81;;25171:4;25163:6;25159:17;25149:27;;25105:81;25233:2;25225:6;25222:14;25202:18;25199:38;25196:84;;;25252:18;;:::i;:::-;25196:84;25017:269;24966:320;;;:::o;25292:281::-;25375:27;25397:4;25375:27;:::i;:::-;25367:6;25363:40;25505:6;25493:10;25490:22;25469:18;25457:10;25454:34;25451:62;25448:88;;;25516:18;;:::i;:::-;25448:88;25556:10;25552:2;25545:22;25335:238;25292:281;;:::o;25579:233::-;25618:3;25641:24;25659:5;25641:24;:::i;:::-;25632:33;;25687:66;25680:5;25677:77;25674:103;;;25757:18;;:::i;:::-;25674:103;25804:1;25797:5;25793:13;25786:20;;25579:233;;;:::o;25818:176::-;25850:1;25867:20;25885:1;25867:20;:::i;:::-;25862:25;;25901:20;25919:1;25901:20;:::i;:::-;25896:25;;25940:1;25930:35;;25945:18;;:::i;:::-;25930:35;25986:1;25983;25979:9;25974:14;;25818:176;;;;:::o;26000:180::-;26048:77;26045:1;26038:88;26145:4;26142:1;26135:15;26169:4;26166:1;26159:15;26186:180;26234:77;26231:1;26224:88;26331:4;26328:1;26321:15;26355:4;26352:1;26345:15;26372:180;26420:77;26417:1;26410:88;26517:4;26514:1;26507:15;26541:4;26538:1;26531:15;26558:180;26606:77;26603:1;26596:88;26703:4;26700:1;26693:15;26727:4;26724:1;26717:15;26744:180;26792:77;26789:1;26782:88;26889:4;26886:1;26879:15;26913:4;26910:1;26903:15;26930:117;27039:1;27036;27029:12;27053:117;27162:1;27159;27152:12;27176:117;27285:1;27282;27275:12;27299:117;27408:1;27405;27398:12;27422:102;27463:6;27514:2;27510:7;27505:2;27498:5;27494:14;27490:28;27480:38;;27422:102;;;:::o;27530:234::-;27670:34;27666:1;27658:6;27654:14;27647:58;27739:17;27734:2;27726:6;27722:15;27715:42;27530:234;:::o;27770:225::-;27910:34;27906:1;27898:6;27894:14;27887:58;27979:8;27974:2;27966:6;27962:15;27955:33;27770:225;:::o;28001:170::-;28141:22;28137:1;28129:6;28125:14;28118:46;28001:170;:::o;28177:171::-;28317:23;28313:1;28305:6;28301:14;28294:47;28177:171;:::o;28354:155::-;28494:7;28490:1;28482:6;28478:14;28471:31;28354:155;:::o;28515:182::-;28655:34;28651:1;28643:6;28639:14;28632:58;28515:182;:::o;28703:234::-;28843:34;28839:1;28831:6;28827:14;28820:58;28912:17;28907:2;28899:6;28895:15;28888:42;28703:234;:::o;28943:153::-;29083:5;29079:1;29071:6;29067:14;29060:29;28943:153;:::o;29102:179::-;29242:31;29238:1;29230:6;29226:14;29219:55;29102:179;:::o;29287:114::-;;:::o;29407:166::-;29547:18;29543:1;29535:6;29531:14;29524:42;29407:166;:::o;29579:169::-;29719:21;29715:1;29707:6;29703:14;29696:45;29579:169;:::o;29754:122::-;29827:24;29845:5;29827:24;:::i;:::-;29820:5;29817:35;29807:63;;29866:1;29863;29856:12;29807:63;29754:122;:::o;29882:116::-;29952:21;29967:5;29952:21;:::i;:::-;29945:5;29942:32;29932:60;;29988:1;29985;29978:12;29932:60;29882:116;:::o;30004:120::-;30076:23;30093:5;30076:23;:::i;:::-;30069:5;30066:34;30056:62;;30114:1;30111;30104:12;30056:62;30004:120;:::o;30130:122::-;30203:24;30221:5;30203:24;:::i;:::-;30196:5;30193:35;30183:63;;30242:1;30239;30232:12;30183:63;30130:122;:::o
Swarm Source
ipfs://3957cb4c89443e711f2ab4c7eb3eac38af1b7bd1b3991e12bd30febc3520bfb0
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.