ERC-721
Overview
Max Total Supply
38 PPUNKS
Holders
5
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
0 PPUNKSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
PlasticPunks
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-08 */ pragma solidity ^0.8.0; // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // SPDX-License-Identifier: MIT /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, 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; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol pragma solidity ^0.8.0; /** * @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); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @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; } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 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); } } } } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @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); } // File: @openzeppelin/contracts/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); } // File: @openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @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 overriden 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 { require(operator != _msgSender(), "ERC721: approve to caller"); _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 { //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); } /** * @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); } /** * @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 of token that is not own"); 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); } /** * @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 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 {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol pragma solidity ^0.8.0; /** * @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(); } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } pragma solidity >=0.7.0 <0.9.0; contract PlasticPunks is ERC721Enumerable, Ownable { using Strings for uint256; string baseURI; string public baseExtension = ".json"; uint256 public cost = 0.001 ether; uint256 public maxSupply = 10000; uint256 public maxMintAmount = 200; bool public paused = false; bool public revealed = true; string public notRevealedUri; constructor( string memory _name, string memory _symbol, string memory _initBaseURI, string memory _initNotRevealedUri ) ERC721(_name, _symbol) { setBaseURI(_initBaseURI); setNotRevealedURI(_initNotRevealedUri); } // internal function _baseURI() internal view virtual override returns (string memory) { return baseURI; } // public function mint(uint256 _mintAmount) public payable { uint256 supply = totalSupply(); require(!paused); require(_mintAmount > 0); require(_mintAmount <= maxMintAmount); require(supply + _mintAmount <= maxSupply); if (msg.sender != owner()) { require(msg.value >= cost * _mintAmount); } for (uint256 i = 1; i <= _mintAmount; i++) { _safeMint(msg.sender, supply + i); } } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](ownerTokenCount); for (uint256 i; i < ownerTokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); if(revealed == false) { return notRevealedUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension)) : ""; } //only owner function reveal() public onlyOwner { revealed = true; } function setCost(uint256 _newCost) public onlyOwner { cost = _newCost; } function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner { maxMintAmount = _newmaxMintAmount; } function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner { notRevealedUri = _notRevealedURI; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function pause(bool _state) public onlyOwner { paused = _state; } function withdraw() public payable onlyOwner { (bool success, ) = payable(msg.sender).call{value: address(this).balance}(""); require(success); // ============================================================================= } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","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":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c90816200004a9190620005f8565b5066038d7ea4c68000600d55612710600e5560c8600f556000601060006101000a81548160ff0219169083151502179055506001601060016101000a81548160ff021916908315150217905550348015620000a457600080fd5b5060405162004f4a38038062004f4a8339818101604052810190620000ca91906200084d565b83838160009081620000dd9190620005f8565b508060019081620000ef9190620005f8565b50505062000112620001066200013e60201b60201c565b6200014660201b60201c565b62000123826200020c60201b60201c565b6200013481620002b060201b60201c565b50505050620009be565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200021c6200013e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002426200035460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200029b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000292906200099c565b60405180910390fd5b80600b9081620002ac9190620005f8565b5050565b620002c06200013e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002e66200035460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200033f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000336906200099c565b60405180910390fd5b8060119081620003509190620005f8565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200040057607f821691505b602082108103620004165762000415620003b8565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000441565b6200048c868362000441565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004d9620004d3620004cd84620004a4565b620004ae565b620004a4565b9050919050565b6000819050919050565b620004f583620004b8565b6200050d6200050482620004e0565b8484546200044e565b825550505050565b600090565b6200052462000515565b62000531818484620004ea565b505050565b5b8181101562000559576200054d6000826200051a565b60018101905062000537565b5050565b601f821115620005a85762000572816200041c565b6200057d8462000431565b810160208510156200058d578190505b620005a56200059c8562000431565b83018262000536565b50505b505050565b600082821c905092915050565b6000620005cd60001984600802620005ad565b1980831691505092915050565b6000620005e88383620005ba565b9150826002028217905092915050565b62000603826200037e565b67ffffffffffffffff8111156200061f576200061e62000389565b5b6200062b8254620003e7565b620006388282856200055d565b600060209050601f8311600181146200067057600084156200065b578287015190505b620006678582620005da565b865550620006d7565b601f19841662000680866200041c565b60005b82811015620006aa5784890151825560018201915060208501945060208101905062000683565b86831015620006ca5784890151620006c6601f891682620005ba565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6200071982620006fd565b810181811067ffffffffffffffff821117156200073b576200073a62000389565b5b80604052505050565b600062000750620006df565b90506200075e82826200070e565b919050565b600067ffffffffffffffff82111562000781576200078062000389565b5b6200078c82620006fd565b9050602081019050919050565b60005b83811015620007b95780820151818401526020810190506200079c565b83811115620007c9576000848401525b50505050565b6000620007e6620007e08462000763565b62000744565b905082815260208101848484011115620008055762000804620006f8565b5b6200081284828562000799565b509392505050565b600082601f830112620008325762000831620006f3565b5b815162000844848260208601620007cf565b91505092915050565b600080600080608085870312156200086a5762000869620006e9565b5b600085015167ffffffffffffffff8111156200088b576200088a620006ee565b5b62000899878288016200081a565b945050602085015167ffffffffffffffff811115620008bd57620008bc620006ee565b5b620008cb878288016200081a565b935050604085015167ffffffffffffffff811115620008ef57620008ee620006ee565b5b620008fd878288016200081a565b925050606085015167ffffffffffffffff811115620009215762000920620006ee565b5b6200092f878288016200081a565b91505092959194509250565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620009846020836200093b565b915062000991826200094c565b602082019050919050565b60006020820190508181036000830152620009b78162000975565b9050919050565b61457c80620009ce6000396000f3fe60806040526004361061020f5760003560e01c80635c975abb11610118578063a475b5dd116100a0578063d5abeb011161006f578063d5abeb011461076f578063da3ef23f1461079a578063e985e9c5146107c3578063f2c4ce1e14610800578063f2fde38b146108295761020f565b8063a475b5dd146106c7578063b88d4fde146106de578063c668286214610707578063c87b56dd146107325761020f565b80637f00c7a6116100e75780637f00c7a6146106035780638da5cb5b1461062c57806395d89b4114610657578063a0712d6814610682578063a22cb4651461069e5761020f565b80635c975abb146105475780636352211e1461057257806370a08231146105af578063715018a6146105ec5761020f565b806323b872dd1161019b578063438b63001161016a578063438b63001461045057806344a0d68a1461048d5780634f6ccce7146104b657806351830227146104f357806355f804b31461051e5761020f565b806323b872dd146103b75780632f745c59146103e05780633ccfd60b1461041d57806342842e0e146104275761020f565b8063081c8c44116101e2578063081c8c44146102e2578063095ea7b31461030d57806313faede61461033657806318160ddd14610361578063239c70ae1461038c5761020f565b806301ffc9a71461021457806302329a291461025157806306fdde031461027a578063081812fc146102a5575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612d0b565b610852565b6040516102489190612d53565b60405180910390f35b34801561025d57600080fd5b5061027860048036038101906102739190612d9a565b6108cc565b005b34801561028657600080fd5b5061028f610965565b60405161029c9190612e60565b60405180910390f35b3480156102b157600080fd5b506102cc60048036038101906102c79190612eb8565b6109f7565b6040516102d99190612f26565b60405180910390f35b3480156102ee57600080fd5b506102f7610a7c565b6040516103049190612e60565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f9190612f6d565b610b0a565b005b34801561034257600080fd5b5061034b610c21565b6040516103589190612fbc565b60405180910390f35b34801561036d57600080fd5b50610376610c27565b6040516103839190612fbc565b60405180910390f35b34801561039857600080fd5b506103a1610c34565b6040516103ae9190612fbc565b60405180910390f35b3480156103c357600080fd5b506103de60048036038101906103d99190612fd7565b610c3a565b005b3480156103ec57600080fd5b5061040760048036038101906104029190612f6d565b610c9a565b6040516104149190612fbc565b60405180910390f35b610425610d3f565b005b34801561043357600080fd5b5061044e60048036038101906104499190612fd7565b610e34565b005b34801561045c57600080fd5b506104776004803603810190610472919061302a565b610e54565b6040516104849190613115565b60405180910390f35b34801561049957600080fd5b506104b460048036038101906104af9190612eb8565b610f02565b005b3480156104c257600080fd5b506104dd60048036038101906104d89190612eb8565b610f88565b6040516104ea9190612fbc565b60405180910390f35b3480156104ff57600080fd5b50610508610ff9565b6040516105159190612d53565b60405180910390f35b34801561052a57600080fd5b506105456004803603810190610540919061326c565b61100c565b005b34801561055357600080fd5b5061055c61109b565b6040516105699190612d53565b60405180910390f35b34801561057e57600080fd5b5061059960048036038101906105949190612eb8565b6110ae565b6040516105a69190612f26565b60405180910390f35b3480156105bb57600080fd5b506105d660048036038101906105d1919061302a565b61115f565b6040516105e39190612fbc565b60405180910390f35b3480156105f857600080fd5b50610601611216565b005b34801561060f57600080fd5b5061062a60048036038101906106259190612eb8565b61129e565b005b34801561063857600080fd5b50610641611324565b60405161064e9190612f26565b60405180910390f35b34801561066357600080fd5b5061066c61134e565b6040516106799190612e60565b60405180910390f35b61069c60048036038101906106979190612eb8565b6113e0565b005b3480156106aa57600080fd5b506106c560048036038101906106c091906132b5565b6114cc565b005b3480156106d357600080fd5b506106dc61164c565b005b3480156106ea57600080fd5b5061070560048036038101906107009190613396565b6116e5565b005b34801561071357600080fd5b5061071c611747565b6040516107299190612e60565b60405180910390f35b34801561073e57600080fd5b5061075960048036038101906107549190612eb8565b6117d5565b6040516107669190612e60565b60405180910390f35b34801561077b57600080fd5b5061078461192d565b6040516107919190612fbc565b60405180910390f35b3480156107a657600080fd5b506107c160048036038101906107bc919061326c565b611933565b005b3480156107cf57600080fd5b506107ea60048036038101906107e59190613419565b6119c2565b6040516107f79190612d53565b60405180910390f35b34801561080c57600080fd5b506108276004803603810190610822919061326c565b611a56565b005b34801561083557600080fd5b50610850600480360381019061084b919061302a565b611ae5565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108c557506108c482611bdc565b5b9050919050565b6108d4611cbe565b73ffffffffffffffffffffffffffffffffffffffff166108f2611324565b73ffffffffffffffffffffffffffffffffffffffff1614610948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093f906134a5565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b606060008054610974906134f4565b80601f01602080910402602001604051908101604052809291908181526020018280546109a0906134f4565b80156109ed5780601f106109c2576101008083540402835291602001916109ed565b820191906000526020600020905b8154815290600101906020018083116109d057829003601f168201915b5050505050905090565b6000610a0282611cc6565b610a41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3890613597565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60118054610a89906134f4565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab5906134f4565b8015610b025780601f10610ad757610100808354040283529160200191610b02565b820191906000526020600020905b815481529060010190602001808311610ae557829003601f168201915b505050505081565b6000610b15826110ae565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7c90613629565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ba4611cbe565b73ffffffffffffffffffffffffffffffffffffffff161480610bd35750610bd281610bcd611cbe565b6119c2565b5b610c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c09906136bb565b60405180910390fd5b610c1c8383611d32565b505050565b600d5481565b6000600880549050905090565b600f5481565b610c4b610c45611cbe565b82611deb565b610c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c819061374d565b60405180910390fd5b610c95838383611ec9565b505050565b6000610ca58361115f565b8210610ce6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdd906137df565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d47611cbe565b73ffffffffffffffffffffffffffffffffffffffff16610d65611324565b73ffffffffffffffffffffffffffffffffffffffff1614610dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db2906134a5565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610de190613830565b60006040518083038185875af1925050503d8060008114610e1e576040519150601f19603f3d011682016040523d82523d6000602084013e610e23565b606091505b5050905080610e3157600080fd5b50565b610e4f838383604051806020016040528060008152506116e5565b505050565b60606000610e618361115f565b905060008167ffffffffffffffff811115610e7f57610e7e613141565b5b604051908082528060200260200182016040528015610ead5781602001602082028036833780820191505090505b50905060005b82811015610ef757610ec58582610c9a565b828281518110610ed857610ed7613845565b5b6020026020010181815250508080610eef906138a3565b915050610eb3565b508092505050919050565b610f0a611cbe565b73ffffffffffffffffffffffffffffffffffffffff16610f28611324565b73ffffffffffffffffffffffffffffffffffffffff1614610f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f75906134a5565b60405180910390fd5b80600d8190555050565b6000610f92610c27565b8210610fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fca9061395d565b60405180910390fd5b60088281548110610fe757610fe6613845565b5b90600052602060002001549050919050565b601060019054906101000a900460ff1681565b611014611cbe565b73ffffffffffffffffffffffffffffffffffffffff16611032611324565b73ffffffffffffffffffffffffffffffffffffffff1614611088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107f906134a5565b60405180910390fd5b80600b90816110979190613b29565b5050565b601060009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114d90613c6d565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c690613cff565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61121e611cbe565b73ffffffffffffffffffffffffffffffffffffffff1661123c611324565b73ffffffffffffffffffffffffffffffffffffffff1614611292576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611289906134a5565b60405180910390fd5b61129c6000612124565b565b6112a6611cbe565b73ffffffffffffffffffffffffffffffffffffffff166112c4611324565b73ffffffffffffffffffffffffffffffffffffffff161461131a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611311906134a5565b60405180910390fd5b80600f8190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461135d906134f4565b80601f0160208091040260200160405190810160405280929190818152602001828054611389906134f4565b80156113d65780601f106113ab576101008083540402835291602001916113d6565b820191906000526020600020905b8154815290600101906020018083116113b957829003601f168201915b5050505050905090565b60006113ea610c27565b9050601060009054906101000a900460ff161561140657600080fd5b6000821161141357600080fd5b600f5482111561142257600080fd5b600e5482826114319190613d1f565b111561143c57600080fd5b611444611324565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114915781600d546114849190613d75565b34101561149057600080fd5b5b6000600190505b8281116114c7576114b43382846114af9190613d1f565b6121ea565b80806114bf906138a3565b915050611498565b505050565b6114d4611cbe565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153890613e1b565b60405180910390fd5b806005600061154e611cbe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115fb611cbe565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116409190612d53565b60405180910390a35050565b611654611cbe565b73ffffffffffffffffffffffffffffffffffffffff16611672611324565b73ffffffffffffffffffffffffffffffffffffffff16146116c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bf906134a5565b60405180910390fd5b6001601060016101000a81548160ff021916908315150217905550565b6116f66116f0611cbe565b83611deb565b611735576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172c9061374d565b60405180910390fd5b61174184848484612208565b50505050565b600c8054611754906134f4565b80601f0160208091040260200160405190810160405280929190818152602001828054611780906134f4565b80156117cd5780601f106117a2576101008083540402835291602001916117cd565b820191906000526020600020905b8154815290600101906020018083116117b057829003601f168201915b505050505081565b60606117e082611cc6565b61181f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181690613ead565b60405180910390fd5b60001515601060019054906101000a900460ff161515036118cc5760118054611847906134f4565b80601f0160208091040260200160405190810160405280929190818152602001828054611873906134f4565b80156118c05780601f10611895576101008083540402835291602001916118c0565b820191906000526020600020905b8154815290600101906020018083116118a357829003601f168201915b50505050509050611928565b60006118d6612264565b905060008151116118f65760405180602001604052806000815250611924565b80611900846122f6565b600c60405160200161191493929190613f8c565b6040516020818303038152906040525b9150505b919050565b600e5481565b61193b611cbe565b73ffffffffffffffffffffffffffffffffffffffff16611959611324565b73ffffffffffffffffffffffffffffffffffffffff16146119af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a6906134a5565b60405180910390fd5b80600c90816119be9190613b29565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a5e611cbe565b73ffffffffffffffffffffffffffffffffffffffff16611a7c611324565b73ffffffffffffffffffffffffffffffffffffffff1614611ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac9906134a5565b60405180910390fd5b8060119081611ae19190613b29565b5050565b611aed611cbe565b73ffffffffffffffffffffffffffffffffffffffff16611b0b611324565b73ffffffffffffffffffffffffffffffffffffffff1614611b61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b58906134a5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc79061402f565b60405180910390fd5b611bd981612124565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ca757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611cb75750611cb682612456565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611da5836110ae565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611df682611cc6565b611e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2c906140c1565b60405180910390fd5b6000611e40836110ae565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611eaf57508373ffffffffffffffffffffffffffffffffffffffff16611e97846109f7565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ec05750611ebf81856119c2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ee9826110ae565b73ffffffffffffffffffffffffffffffffffffffff1614611f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3690614153565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa5906141e5565b60405180910390fd5b611fb98383836124c0565b611fc4600082611d32565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120149190614205565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461206b9190613d1f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6122048282604051806020016040528060008152506125d2565b5050565b612213848484611ec9565b61221f8484848461262d565b61225e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612255906142ab565b60405180910390fd5b50505050565b6060600b8054612273906134f4565b80601f016020809104026020016040519081016040528092919081815260200182805461229f906134f4565b80156122ec5780601f106122c1576101008083540402835291602001916122ec565b820191906000526020600020905b8154815290600101906020018083116122cf57829003601f168201915b5050505050905090565b60606000820361233d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612451565b600082905060005b6000821461236f578080612358906138a3565b915050600a8261236891906142fa565b9150612345565b60008167ffffffffffffffff81111561238b5761238a613141565b5b6040519080825280601f01601f1916602001820160405280156123bd5781602001600182028036833780820191505090505b5090505b6000851461244a576001826123d69190614205565b9150600a856123e5919061432b565b60306123f19190613d1f565b60f81b81838151811061240757612406613845565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561244391906142fa565b94506123c1565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6124cb8383836127b4565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361250d57612508816127b9565b61254c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461254b5761254a8382612802565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361258e576125898161296f565b6125cd565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146125cc576125cb8282612a40565b5b5b505050565b6125dc8383612abf565b6125e9600084848461262d565b612628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261f906142ab565b60405180910390fd5b505050565b600061264e8473ffffffffffffffffffffffffffffffffffffffff16612c8c565b156127a7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612677611cbe565b8786866040518563ffffffff1660e01b815260040161269994939291906143b1565b6020604051808303816000875af19250505080156126d557506040513d601f19601f820116820180604052508101906126d29190614412565b60015b612757573d8060008114612705576040519150601f19603f3d011682016040523d82523d6000602084013e61270a565b606091505b50600081510361274f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612746906142ab565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127ac565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161280f8461115f565b6128199190614205565b90506000600760008481526020019081526020016000205490508181146128fe576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506129839190614205565b90506000600960008481526020019081526020016000205490506000600883815481106129b3576129b2613845565b5b9060005260206000200154905080600883815481106129d5576129d4613845565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612a2457612a2361443f565b5b6001900381819060005260206000200160009055905550505050565b6000612a4b8361115f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612b2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b25906144ba565b60405180910390fd5b612b3781611cc6565b15612b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6e90614526565b60405180910390fd5b612b83600083836124c0565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bd39190613d1f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ce881612cb3565b8114612cf357600080fd5b50565b600081359050612d0581612cdf565b92915050565b600060208284031215612d2157612d20612ca9565b5b6000612d2f84828501612cf6565b91505092915050565b60008115159050919050565b612d4d81612d38565b82525050565b6000602082019050612d686000830184612d44565b92915050565b612d7781612d38565b8114612d8257600080fd5b50565b600081359050612d9481612d6e565b92915050565b600060208284031215612db057612daf612ca9565b5b6000612dbe84828501612d85565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e01578082015181840152602081019050612de6565b83811115612e10576000848401525b50505050565b6000601f19601f8301169050919050565b6000612e3282612dc7565b612e3c8185612dd2565b9350612e4c818560208601612de3565b612e5581612e16565b840191505092915050565b60006020820190508181036000830152612e7a8184612e27565b905092915050565b6000819050919050565b612e9581612e82565b8114612ea057600080fd5b50565b600081359050612eb281612e8c565b92915050565b600060208284031215612ece57612ecd612ca9565b5b6000612edc84828501612ea3565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612f1082612ee5565b9050919050565b612f2081612f05565b82525050565b6000602082019050612f3b6000830184612f17565b92915050565b612f4a81612f05565b8114612f5557600080fd5b50565b600081359050612f6781612f41565b92915050565b60008060408385031215612f8457612f83612ca9565b5b6000612f9285828601612f58565b9250506020612fa385828601612ea3565b9150509250929050565b612fb681612e82565b82525050565b6000602082019050612fd16000830184612fad565b92915050565b600080600060608486031215612ff057612fef612ca9565b5b6000612ffe86828701612f58565b935050602061300f86828701612f58565b925050604061302086828701612ea3565b9150509250925092565b6000602082840312156130405761303f612ca9565b5b600061304e84828501612f58565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61308c81612e82565b82525050565b600061309e8383613083565b60208301905092915050565b6000602082019050919050565b60006130c282613057565b6130cc8185613062565b93506130d783613073565b8060005b838110156131085781516130ef8882613092565b97506130fa836130aa565b9250506001810190506130db565b5085935050505092915050565b6000602082019050818103600083015261312f81846130b7565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61317982612e16565b810181811067ffffffffffffffff8211171561319857613197613141565b5b80604052505050565b60006131ab612c9f565b90506131b78282613170565b919050565b600067ffffffffffffffff8211156131d7576131d6613141565b5b6131e082612e16565b9050602081019050919050565b82818337600083830152505050565b600061320f61320a846131bc565b6131a1565b90508281526020810184848401111561322b5761322a61313c565b5b6132368482856131ed565b509392505050565b600082601f83011261325357613252613137565b5b81356132638482602086016131fc565b91505092915050565b60006020828403121561328257613281612ca9565b5b600082013567ffffffffffffffff8111156132a05761329f612cae565b5b6132ac8482850161323e565b91505092915050565b600080604083850312156132cc576132cb612ca9565b5b60006132da85828601612f58565b92505060206132eb85828601612d85565b9150509250929050565b600067ffffffffffffffff8211156133105761330f613141565b5b61331982612e16565b9050602081019050919050565b6000613339613334846132f5565b6131a1565b9050828152602081018484840111156133555761335461313c565b5b6133608482856131ed565b509392505050565b600082601f83011261337d5761337c613137565b5b813561338d848260208601613326565b91505092915050565b600080600080608085870312156133b0576133af612ca9565b5b60006133be87828801612f58565b94505060206133cf87828801612f58565b93505060406133e087828801612ea3565b925050606085013567ffffffffffffffff81111561340157613400612cae565b5b61340d87828801613368565b91505092959194509250565b600080604083850312156134305761342f612ca9565b5b600061343e85828601612f58565b925050602061344f85828601612f58565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061348f602083612dd2565b915061349a82613459565b602082019050919050565b600060208201905081810360008301526134be81613482565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061350c57607f821691505b60208210810361351f5761351e6134c5565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613581602c83612dd2565b915061358c82613525565b604082019050919050565b600060208201905081810360008301526135b081613574565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613613602183612dd2565b915061361e826135b7565b604082019050919050565b6000602082019050818103600083015261364281613606565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006136a5603883612dd2565b91506136b082613649565b604082019050919050565b600060208201905081810360008301526136d481613698565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613737603183612dd2565b9150613742826136db565b604082019050919050565b600060208201905081810360008301526137668161372a565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006137c9602b83612dd2565b91506137d48261376d565b604082019050919050565b600060208201905081810360008301526137f8816137bc565b9050919050565b600081905092915050565b50565b600061381a6000836137ff565b91506138258261380a565b600082019050919050565b600061383b8261380d565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006138ae82612e82565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036138e0576138df613874565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613947602c83612dd2565b9150613952826138eb565b604082019050919050565b600060208201905081810360008301526139768161393a565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026139df7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826139a2565b6139e986836139a2565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613a26613a21613a1c84612e82565b613a01565b612e82565b9050919050565b6000819050919050565b613a4083613a0b565b613a54613a4c82613a2d565b8484546139af565b825550505050565b600090565b613a69613a5c565b613a74818484613a37565b505050565b5b81811015613a9857613a8d600082613a61565b600181019050613a7a565b5050565b601f821115613add57613aae8161397d565b613ab784613992565b81016020851015613ac6578190505b613ada613ad285613992565b830182613a79565b50505b505050565b600082821c905092915050565b6000613b0060001984600802613ae2565b1980831691505092915050565b6000613b198383613aef565b9150826002028217905092915050565b613b3282612dc7565b67ffffffffffffffff811115613b4b57613b4a613141565b5b613b5582546134f4565b613b60828285613a9c565b600060209050601f831160018114613b935760008415613b81578287015190505b613b8b8582613b0d565b865550613bf3565b601f198416613ba18661397d565b60005b82811015613bc957848901518255600182019150602085019450602081019050613ba4565b86831015613be65784890151613be2601f891682613aef565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613c57602983612dd2565b9150613c6282613bfb565b604082019050919050565b60006020820190508181036000830152613c8681613c4a565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613ce9602a83612dd2565b9150613cf482613c8d565b604082019050919050565b60006020820190508181036000830152613d1881613cdc565b9050919050565b6000613d2a82612e82565b9150613d3583612e82565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d6a57613d69613874565b5b828201905092915050565b6000613d8082612e82565b9150613d8b83612e82565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613dc457613dc3613874565b5b828202905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613e05601983612dd2565b9150613e1082613dcf565b602082019050919050565b60006020820190508181036000830152613e3481613df8565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613e97602f83612dd2565b9150613ea282613e3b565b604082019050919050565b60006020820190508181036000830152613ec681613e8a565b9050919050565b600081905092915050565b6000613ee382612dc7565b613eed8185613ecd565b9350613efd818560208601612de3565b80840191505092915050565b60008154613f16816134f4565b613f208186613ecd565b94506001821660008114613f3b5760018114613f5057613f83565b60ff1983168652811515820286019350613f83565b613f598561397d565b60005b83811015613f7b57815481890152600182019150602081019050613f5c565b838801955050505b50505092915050565b6000613f988286613ed8565b9150613fa48285613ed8565b9150613fb08284613f09565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614019602683612dd2565b915061402482613fbd565b604082019050919050565b600060208201905081810360008301526140488161400c565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006140ab602c83612dd2565b91506140b68261404f565b604082019050919050565b600060208201905081810360008301526140da8161409e565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061413d602983612dd2565b9150614148826140e1565b604082019050919050565b6000602082019050818103600083015261416c81614130565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006141cf602483612dd2565b91506141da82614173565b604082019050919050565b600060208201905081810360008301526141fe816141c2565b9050919050565b600061421082612e82565b915061421b83612e82565b92508282101561422e5761422d613874565b5b828203905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614295603283612dd2565b91506142a082614239565b604082019050919050565b600060208201905081810360008301526142c481614288565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061430582612e82565b915061431083612e82565b9250826143205761431f6142cb565b5b828204905092915050565b600061433682612e82565b915061434183612e82565b925082614351576143506142cb565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006143838261435c565b61438d8185614367565b935061439d818560208601612de3565b6143a681612e16565b840191505092915050565b60006080820190506143c66000830187612f17565b6143d36020830186612f17565b6143e06040830185612fad565b81810360608301526143f28184614378565b905095945050505050565b60008151905061440c81612cdf565b92915050565b60006020828403121561442857614427612ca9565b5b6000614436848285016143fd565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006144a4602083612dd2565b91506144af8261446e565b602082019050919050565b600060208201905081810360008301526144d381614497565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614510601c83612dd2565b915061451b826144da565b602082019050919050565b6000602082019050818103600083015261453f81614503565b905091905056fea2646970667358221220d20f90a61ae2cebe729b4322352ef9561fa1e5cf79e6b24ba8ccd69a64a69cf864736f6c634300080f0033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000d504c41535449432050554e4b530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065050554e4b5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d626f6e45786e444e6e6745546155644e43477538674a413731324379386a35364634766f63707064755068732f0000000000000000000000000000000000000000000000000000000000000000000000000000000000012e00000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061020f5760003560e01c80635c975abb11610118578063a475b5dd116100a0578063d5abeb011161006f578063d5abeb011461076f578063da3ef23f1461079a578063e985e9c5146107c3578063f2c4ce1e14610800578063f2fde38b146108295761020f565b8063a475b5dd146106c7578063b88d4fde146106de578063c668286214610707578063c87b56dd146107325761020f565b80637f00c7a6116100e75780637f00c7a6146106035780638da5cb5b1461062c57806395d89b4114610657578063a0712d6814610682578063a22cb4651461069e5761020f565b80635c975abb146105475780636352211e1461057257806370a08231146105af578063715018a6146105ec5761020f565b806323b872dd1161019b578063438b63001161016a578063438b63001461045057806344a0d68a1461048d5780634f6ccce7146104b657806351830227146104f357806355f804b31461051e5761020f565b806323b872dd146103b75780632f745c59146103e05780633ccfd60b1461041d57806342842e0e146104275761020f565b8063081c8c44116101e2578063081c8c44146102e2578063095ea7b31461030d57806313faede61461033657806318160ddd14610361578063239c70ae1461038c5761020f565b806301ffc9a71461021457806302329a291461025157806306fdde031461027a578063081812fc146102a5575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612d0b565b610852565b6040516102489190612d53565b60405180910390f35b34801561025d57600080fd5b5061027860048036038101906102739190612d9a565b6108cc565b005b34801561028657600080fd5b5061028f610965565b60405161029c9190612e60565b60405180910390f35b3480156102b157600080fd5b506102cc60048036038101906102c79190612eb8565b6109f7565b6040516102d99190612f26565b60405180910390f35b3480156102ee57600080fd5b506102f7610a7c565b6040516103049190612e60565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f9190612f6d565b610b0a565b005b34801561034257600080fd5b5061034b610c21565b6040516103589190612fbc565b60405180910390f35b34801561036d57600080fd5b50610376610c27565b6040516103839190612fbc565b60405180910390f35b34801561039857600080fd5b506103a1610c34565b6040516103ae9190612fbc565b60405180910390f35b3480156103c357600080fd5b506103de60048036038101906103d99190612fd7565b610c3a565b005b3480156103ec57600080fd5b5061040760048036038101906104029190612f6d565b610c9a565b6040516104149190612fbc565b60405180910390f35b610425610d3f565b005b34801561043357600080fd5b5061044e60048036038101906104499190612fd7565b610e34565b005b34801561045c57600080fd5b506104776004803603810190610472919061302a565b610e54565b6040516104849190613115565b60405180910390f35b34801561049957600080fd5b506104b460048036038101906104af9190612eb8565b610f02565b005b3480156104c257600080fd5b506104dd60048036038101906104d89190612eb8565b610f88565b6040516104ea9190612fbc565b60405180910390f35b3480156104ff57600080fd5b50610508610ff9565b6040516105159190612d53565b60405180910390f35b34801561052a57600080fd5b506105456004803603810190610540919061326c565b61100c565b005b34801561055357600080fd5b5061055c61109b565b6040516105699190612d53565b60405180910390f35b34801561057e57600080fd5b5061059960048036038101906105949190612eb8565b6110ae565b6040516105a69190612f26565b60405180910390f35b3480156105bb57600080fd5b506105d660048036038101906105d1919061302a565b61115f565b6040516105e39190612fbc565b60405180910390f35b3480156105f857600080fd5b50610601611216565b005b34801561060f57600080fd5b5061062a60048036038101906106259190612eb8565b61129e565b005b34801561063857600080fd5b50610641611324565b60405161064e9190612f26565b60405180910390f35b34801561066357600080fd5b5061066c61134e565b6040516106799190612e60565b60405180910390f35b61069c60048036038101906106979190612eb8565b6113e0565b005b3480156106aa57600080fd5b506106c560048036038101906106c091906132b5565b6114cc565b005b3480156106d357600080fd5b506106dc61164c565b005b3480156106ea57600080fd5b5061070560048036038101906107009190613396565b6116e5565b005b34801561071357600080fd5b5061071c611747565b6040516107299190612e60565b60405180910390f35b34801561073e57600080fd5b5061075960048036038101906107549190612eb8565b6117d5565b6040516107669190612e60565b60405180910390f35b34801561077b57600080fd5b5061078461192d565b6040516107919190612fbc565b60405180910390f35b3480156107a657600080fd5b506107c160048036038101906107bc919061326c565b611933565b005b3480156107cf57600080fd5b506107ea60048036038101906107e59190613419565b6119c2565b6040516107f79190612d53565b60405180910390f35b34801561080c57600080fd5b506108276004803603810190610822919061326c565b611a56565b005b34801561083557600080fd5b50610850600480360381019061084b919061302a565b611ae5565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108c557506108c482611bdc565b5b9050919050565b6108d4611cbe565b73ffffffffffffffffffffffffffffffffffffffff166108f2611324565b73ffffffffffffffffffffffffffffffffffffffff1614610948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093f906134a5565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b606060008054610974906134f4565b80601f01602080910402602001604051908101604052809291908181526020018280546109a0906134f4565b80156109ed5780601f106109c2576101008083540402835291602001916109ed565b820191906000526020600020905b8154815290600101906020018083116109d057829003601f168201915b5050505050905090565b6000610a0282611cc6565b610a41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3890613597565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60118054610a89906134f4565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab5906134f4565b8015610b025780601f10610ad757610100808354040283529160200191610b02565b820191906000526020600020905b815481529060010190602001808311610ae557829003601f168201915b505050505081565b6000610b15826110ae565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7c90613629565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ba4611cbe565b73ffffffffffffffffffffffffffffffffffffffff161480610bd35750610bd281610bcd611cbe565b6119c2565b5b610c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c09906136bb565b60405180910390fd5b610c1c8383611d32565b505050565b600d5481565b6000600880549050905090565b600f5481565b610c4b610c45611cbe565b82611deb565b610c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c819061374d565b60405180910390fd5b610c95838383611ec9565b505050565b6000610ca58361115f565b8210610ce6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdd906137df565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d47611cbe565b73ffffffffffffffffffffffffffffffffffffffff16610d65611324565b73ffffffffffffffffffffffffffffffffffffffff1614610dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db2906134a5565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610de190613830565b60006040518083038185875af1925050503d8060008114610e1e576040519150601f19603f3d011682016040523d82523d6000602084013e610e23565b606091505b5050905080610e3157600080fd5b50565b610e4f838383604051806020016040528060008152506116e5565b505050565b60606000610e618361115f565b905060008167ffffffffffffffff811115610e7f57610e7e613141565b5b604051908082528060200260200182016040528015610ead5781602001602082028036833780820191505090505b50905060005b82811015610ef757610ec58582610c9a565b828281518110610ed857610ed7613845565b5b6020026020010181815250508080610eef906138a3565b915050610eb3565b508092505050919050565b610f0a611cbe565b73ffffffffffffffffffffffffffffffffffffffff16610f28611324565b73ffffffffffffffffffffffffffffffffffffffff1614610f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f75906134a5565b60405180910390fd5b80600d8190555050565b6000610f92610c27565b8210610fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fca9061395d565b60405180910390fd5b60088281548110610fe757610fe6613845565b5b90600052602060002001549050919050565b601060019054906101000a900460ff1681565b611014611cbe565b73ffffffffffffffffffffffffffffffffffffffff16611032611324565b73ffffffffffffffffffffffffffffffffffffffff1614611088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107f906134a5565b60405180910390fd5b80600b90816110979190613b29565b5050565b601060009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114d90613c6d565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c690613cff565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61121e611cbe565b73ffffffffffffffffffffffffffffffffffffffff1661123c611324565b73ffffffffffffffffffffffffffffffffffffffff1614611292576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611289906134a5565b60405180910390fd5b61129c6000612124565b565b6112a6611cbe565b73ffffffffffffffffffffffffffffffffffffffff166112c4611324565b73ffffffffffffffffffffffffffffffffffffffff161461131a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611311906134a5565b60405180910390fd5b80600f8190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461135d906134f4565b80601f0160208091040260200160405190810160405280929190818152602001828054611389906134f4565b80156113d65780601f106113ab576101008083540402835291602001916113d6565b820191906000526020600020905b8154815290600101906020018083116113b957829003601f168201915b5050505050905090565b60006113ea610c27565b9050601060009054906101000a900460ff161561140657600080fd5b6000821161141357600080fd5b600f5482111561142257600080fd5b600e5482826114319190613d1f565b111561143c57600080fd5b611444611324565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114915781600d546114849190613d75565b34101561149057600080fd5b5b6000600190505b8281116114c7576114b43382846114af9190613d1f565b6121ea565b80806114bf906138a3565b915050611498565b505050565b6114d4611cbe565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153890613e1b565b60405180910390fd5b806005600061154e611cbe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115fb611cbe565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116409190612d53565b60405180910390a35050565b611654611cbe565b73ffffffffffffffffffffffffffffffffffffffff16611672611324565b73ffffffffffffffffffffffffffffffffffffffff16146116c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bf906134a5565b60405180910390fd5b6001601060016101000a81548160ff021916908315150217905550565b6116f66116f0611cbe565b83611deb565b611735576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172c9061374d565b60405180910390fd5b61174184848484612208565b50505050565b600c8054611754906134f4565b80601f0160208091040260200160405190810160405280929190818152602001828054611780906134f4565b80156117cd5780601f106117a2576101008083540402835291602001916117cd565b820191906000526020600020905b8154815290600101906020018083116117b057829003601f168201915b505050505081565b60606117e082611cc6565b61181f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181690613ead565b60405180910390fd5b60001515601060019054906101000a900460ff161515036118cc5760118054611847906134f4565b80601f0160208091040260200160405190810160405280929190818152602001828054611873906134f4565b80156118c05780601f10611895576101008083540402835291602001916118c0565b820191906000526020600020905b8154815290600101906020018083116118a357829003601f168201915b50505050509050611928565b60006118d6612264565b905060008151116118f65760405180602001604052806000815250611924565b80611900846122f6565b600c60405160200161191493929190613f8c565b6040516020818303038152906040525b9150505b919050565b600e5481565b61193b611cbe565b73ffffffffffffffffffffffffffffffffffffffff16611959611324565b73ffffffffffffffffffffffffffffffffffffffff16146119af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a6906134a5565b60405180910390fd5b80600c90816119be9190613b29565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a5e611cbe565b73ffffffffffffffffffffffffffffffffffffffff16611a7c611324565b73ffffffffffffffffffffffffffffffffffffffff1614611ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac9906134a5565b60405180910390fd5b8060119081611ae19190613b29565b5050565b611aed611cbe565b73ffffffffffffffffffffffffffffffffffffffff16611b0b611324565b73ffffffffffffffffffffffffffffffffffffffff1614611b61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b58906134a5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc79061402f565b60405180910390fd5b611bd981612124565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ca757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611cb75750611cb682612456565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611da5836110ae565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611df682611cc6565b611e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2c906140c1565b60405180910390fd5b6000611e40836110ae565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611eaf57508373ffffffffffffffffffffffffffffffffffffffff16611e97846109f7565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ec05750611ebf81856119c2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ee9826110ae565b73ffffffffffffffffffffffffffffffffffffffff1614611f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3690614153565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa5906141e5565b60405180910390fd5b611fb98383836124c0565b611fc4600082611d32565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120149190614205565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461206b9190613d1f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6122048282604051806020016040528060008152506125d2565b5050565b612213848484611ec9565b61221f8484848461262d565b61225e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612255906142ab565b60405180910390fd5b50505050565b6060600b8054612273906134f4565b80601f016020809104026020016040519081016040528092919081815260200182805461229f906134f4565b80156122ec5780601f106122c1576101008083540402835291602001916122ec565b820191906000526020600020905b8154815290600101906020018083116122cf57829003601f168201915b5050505050905090565b60606000820361233d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612451565b600082905060005b6000821461236f578080612358906138a3565b915050600a8261236891906142fa565b9150612345565b60008167ffffffffffffffff81111561238b5761238a613141565b5b6040519080825280601f01601f1916602001820160405280156123bd5781602001600182028036833780820191505090505b5090505b6000851461244a576001826123d69190614205565b9150600a856123e5919061432b565b60306123f19190613d1f565b60f81b81838151811061240757612406613845565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561244391906142fa565b94506123c1565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6124cb8383836127b4565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361250d57612508816127b9565b61254c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461254b5761254a8382612802565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361258e576125898161296f565b6125cd565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146125cc576125cb8282612a40565b5b5b505050565b6125dc8383612abf565b6125e9600084848461262d565b612628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261f906142ab565b60405180910390fd5b505050565b600061264e8473ffffffffffffffffffffffffffffffffffffffff16612c8c565b156127a7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612677611cbe565b8786866040518563ffffffff1660e01b815260040161269994939291906143b1565b6020604051808303816000875af19250505080156126d557506040513d601f19601f820116820180604052508101906126d29190614412565b60015b612757573d8060008114612705576040519150601f19603f3d011682016040523d82523d6000602084013e61270a565b606091505b50600081510361274f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612746906142ab565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127ac565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161280f8461115f565b6128199190614205565b90506000600760008481526020019081526020016000205490508181146128fe576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506129839190614205565b90506000600960008481526020019081526020016000205490506000600883815481106129b3576129b2613845565b5b9060005260206000200154905080600883815481106129d5576129d4613845565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612a2457612a2361443f565b5b6001900381819060005260206000200160009055905550505050565b6000612a4b8361115f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612b2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b25906144ba565b60405180910390fd5b612b3781611cc6565b15612b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6e90614526565b60405180910390fd5b612b83600083836124c0565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bd39190613d1f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ce881612cb3565b8114612cf357600080fd5b50565b600081359050612d0581612cdf565b92915050565b600060208284031215612d2157612d20612ca9565b5b6000612d2f84828501612cf6565b91505092915050565b60008115159050919050565b612d4d81612d38565b82525050565b6000602082019050612d686000830184612d44565b92915050565b612d7781612d38565b8114612d8257600080fd5b50565b600081359050612d9481612d6e565b92915050565b600060208284031215612db057612daf612ca9565b5b6000612dbe84828501612d85565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e01578082015181840152602081019050612de6565b83811115612e10576000848401525b50505050565b6000601f19601f8301169050919050565b6000612e3282612dc7565b612e3c8185612dd2565b9350612e4c818560208601612de3565b612e5581612e16565b840191505092915050565b60006020820190508181036000830152612e7a8184612e27565b905092915050565b6000819050919050565b612e9581612e82565b8114612ea057600080fd5b50565b600081359050612eb281612e8c565b92915050565b600060208284031215612ece57612ecd612ca9565b5b6000612edc84828501612ea3565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612f1082612ee5565b9050919050565b612f2081612f05565b82525050565b6000602082019050612f3b6000830184612f17565b92915050565b612f4a81612f05565b8114612f5557600080fd5b50565b600081359050612f6781612f41565b92915050565b60008060408385031215612f8457612f83612ca9565b5b6000612f9285828601612f58565b9250506020612fa385828601612ea3565b9150509250929050565b612fb681612e82565b82525050565b6000602082019050612fd16000830184612fad565b92915050565b600080600060608486031215612ff057612fef612ca9565b5b6000612ffe86828701612f58565b935050602061300f86828701612f58565b925050604061302086828701612ea3565b9150509250925092565b6000602082840312156130405761303f612ca9565b5b600061304e84828501612f58565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61308c81612e82565b82525050565b600061309e8383613083565b60208301905092915050565b6000602082019050919050565b60006130c282613057565b6130cc8185613062565b93506130d783613073565b8060005b838110156131085781516130ef8882613092565b97506130fa836130aa565b9250506001810190506130db565b5085935050505092915050565b6000602082019050818103600083015261312f81846130b7565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61317982612e16565b810181811067ffffffffffffffff8211171561319857613197613141565b5b80604052505050565b60006131ab612c9f565b90506131b78282613170565b919050565b600067ffffffffffffffff8211156131d7576131d6613141565b5b6131e082612e16565b9050602081019050919050565b82818337600083830152505050565b600061320f61320a846131bc565b6131a1565b90508281526020810184848401111561322b5761322a61313c565b5b6132368482856131ed565b509392505050565b600082601f83011261325357613252613137565b5b81356132638482602086016131fc565b91505092915050565b60006020828403121561328257613281612ca9565b5b600082013567ffffffffffffffff8111156132a05761329f612cae565b5b6132ac8482850161323e565b91505092915050565b600080604083850312156132cc576132cb612ca9565b5b60006132da85828601612f58565b92505060206132eb85828601612d85565b9150509250929050565b600067ffffffffffffffff8211156133105761330f613141565b5b61331982612e16565b9050602081019050919050565b6000613339613334846132f5565b6131a1565b9050828152602081018484840111156133555761335461313c565b5b6133608482856131ed565b509392505050565b600082601f83011261337d5761337c613137565b5b813561338d848260208601613326565b91505092915050565b600080600080608085870312156133b0576133af612ca9565b5b60006133be87828801612f58565b94505060206133cf87828801612f58565b93505060406133e087828801612ea3565b925050606085013567ffffffffffffffff81111561340157613400612cae565b5b61340d87828801613368565b91505092959194509250565b600080604083850312156134305761342f612ca9565b5b600061343e85828601612f58565b925050602061344f85828601612f58565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061348f602083612dd2565b915061349a82613459565b602082019050919050565b600060208201905081810360008301526134be81613482565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061350c57607f821691505b60208210810361351f5761351e6134c5565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613581602c83612dd2565b915061358c82613525565b604082019050919050565b600060208201905081810360008301526135b081613574565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613613602183612dd2565b915061361e826135b7565b604082019050919050565b6000602082019050818103600083015261364281613606565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006136a5603883612dd2565b91506136b082613649565b604082019050919050565b600060208201905081810360008301526136d481613698565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613737603183612dd2565b9150613742826136db565b604082019050919050565b600060208201905081810360008301526137668161372a565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006137c9602b83612dd2565b91506137d48261376d565b604082019050919050565b600060208201905081810360008301526137f8816137bc565b9050919050565b600081905092915050565b50565b600061381a6000836137ff565b91506138258261380a565b600082019050919050565b600061383b8261380d565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006138ae82612e82565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036138e0576138df613874565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613947602c83612dd2565b9150613952826138eb565b604082019050919050565b600060208201905081810360008301526139768161393a565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026139df7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826139a2565b6139e986836139a2565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613a26613a21613a1c84612e82565b613a01565b612e82565b9050919050565b6000819050919050565b613a4083613a0b565b613a54613a4c82613a2d565b8484546139af565b825550505050565b600090565b613a69613a5c565b613a74818484613a37565b505050565b5b81811015613a9857613a8d600082613a61565b600181019050613a7a565b5050565b601f821115613add57613aae8161397d565b613ab784613992565b81016020851015613ac6578190505b613ada613ad285613992565b830182613a79565b50505b505050565b600082821c905092915050565b6000613b0060001984600802613ae2565b1980831691505092915050565b6000613b198383613aef565b9150826002028217905092915050565b613b3282612dc7565b67ffffffffffffffff811115613b4b57613b4a613141565b5b613b5582546134f4565b613b60828285613a9c565b600060209050601f831160018114613b935760008415613b81578287015190505b613b8b8582613b0d565b865550613bf3565b601f198416613ba18661397d565b60005b82811015613bc957848901518255600182019150602085019450602081019050613ba4565b86831015613be65784890151613be2601f891682613aef565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613c57602983612dd2565b9150613c6282613bfb565b604082019050919050565b60006020820190508181036000830152613c8681613c4a565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613ce9602a83612dd2565b9150613cf482613c8d565b604082019050919050565b60006020820190508181036000830152613d1881613cdc565b9050919050565b6000613d2a82612e82565b9150613d3583612e82565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d6a57613d69613874565b5b828201905092915050565b6000613d8082612e82565b9150613d8b83612e82565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613dc457613dc3613874565b5b828202905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613e05601983612dd2565b9150613e1082613dcf565b602082019050919050565b60006020820190508181036000830152613e3481613df8565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613e97602f83612dd2565b9150613ea282613e3b565b604082019050919050565b60006020820190508181036000830152613ec681613e8a565b9050919050565b600081905092915050565b6000613ee382612dc7565b613eed8185613ecd565b9350613efd818560208601612de3565b80840191505092915050565b60008154613f16816134f4565b613f208186613ecd565b94506001821660008114613f3b5760018114613f5057613f83565b60ff1983168652811515820286019350613f83565b613f598561397d565b60005b83811015613f7b57815481890152600182019150602081019050613f5c565b838801955050505b50505092915050565b6000613f988286613ed8565b9150613fa48285613ed8565b9150613fb08284613f09565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614019602683612dd2565b915061402482613fbd565b604082019050919050565b600060208201905081810360008301526140488161400c565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006140ab602c83612dd2565b91506140b68261404f565b604082019050919050565b600060208201905081810360008301526140da8161409e565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061413d602983612dd2565b9150614148826140e1565b604082019050919050565b6000602082019050818103600083015261416c81614130565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006141cf602483612dd2565b91506141da82614173565b604082019050919050565b600060208201905081810360008301526141fe816141c2565b9050919050565b600061421082612e82565b915061421b83612e82565b92508282101561422e5761422d613874565b5b828203905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614295603283612dd2565b91506142a082614239565b604082019050919050565b600060208201905081810360008301526142c481614288565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061430582612e82565b915061431083612e82565b9250826143205761431f6142cb565b5b828204905092915050565b600061433682612e82565b915061434183612e82565b925082614351576143506142cb565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006143838261435c565b61438d8185614367565b935061439d818560208601612de3565b6143a681612e16565b840191505092915050565b60006080820190506143c66000830187612f17565b6143d36020830186612f17565b6143e06040830185612fad565b81810360608301526143f28184614378565b905095945050505050565b60008151905061440c81612cdf565b92915050565b60006020828403121561442857614427612ca9565b5b6000614436848285016143fd565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006144a4602083612dd2565b91506144af8261446e565b602082019050919050565b600060208201905081810360008301526144d381614497565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614510601c83612dd2565b915061451b826144da565b602082019050919050565b6000602082019050818103600083015261453f81614503565b905091905056fea2646970667358221220d20f90a61ae2cebe729b4322352ef9561fa1e5cf79e6b24ba8ccd69a64a69cf864736f6c634300080f0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000d504c41535449432050554e4b530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065050554e4b5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d626f6e45786e444e6e6745546155644e43477538674a413731324379386a35364634766f63707064755068732f0000000000000000000000000000000000000000000000000000000000000000000000000000000000012e00000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): PLASTIC PUNKS
Arg [1] : _symbol (string): PPUNKS
Arg [2] : _initBaseURI (string): ipfs://QmbonExnDNngETaUdNCGu8gJA712Cy8j56F4vocppduPhs/
Arg [3] : _initNotRevealedUri (string): .
-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [5] : 504c41535449432050554e4b5300000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [7] : 5050554e4b530000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [9] : 697066733a2f2f516d626f6e45786e444e6e6745546155644e43477538674a41
Arg [10] : 3731324379386a35364634766f63707064755068732f00000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [12] : 2e00000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
43118:3032:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34665:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45823:73;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22557:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24116:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43444:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23639:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43267:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35305:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43342:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25006:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34973:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45903:244;;;:::i;:::-;;25416:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44309:348;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45255:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35495:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43412:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45591:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43381:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22251:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21981:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42454:94;;;;;;;;;;;;;:::i;:::-;;45341:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41803:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22726:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43870:433;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24409:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45182:65;;;;;;;;;;;;;:::i;:::-;;25672:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43225:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44663:497;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43305:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45695:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24775:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45465:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42703:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34665:224;34767:4;34806:35;34791:50;;;:11;:50;;;;:90;;;;34845:36;34869:11;34845:23;:36::i;:::-;34791:90;34784:97;;34665:224;;;:::o;45823:73::-;42034:12;:10;:12::i;:::-;42023:23;;:7;:5;:7::i;:::-;:23;;;42015:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45884:6:::1;45875;;:15;;;;;;;;;;;;;;;;;;45823:73:::0;:::o;22557:100::-;22611:13;22644:5;22637:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22557:100;:::o;24116:221::-;24192:7;24220:16;24228:7;24220;:16::i;:::-;24212:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24305:15;:24;24321:7;24305:24;;;;;;;;;;;;;;;;;;;;;24298:31;;24116:221;;;:::o;43444:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23639:411::-;23720:13;23736:23;23751:7;23736:14;:23::i;:::-;23720:39;;23784:5;23778:11;;:2;:11;;;23770:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23878:5;23862:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23887:37;23904:5;23911:12;:10;:12::i;:::-;23887:16;:37::i;:::-;23862:62;23840:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24021:21;24030:2;24034:7;24021:8;:21::i;:::-;23709:341;23639:411;;:::o;43267:33::-;;;;:::o;35305:113::-;35366:7;35393:10;:17;;;;35386:24;;35305:113;:::o;43342:34::-;;;;:::o;25006:339::-;25201:41;25220:12;:10;:12::i;:::-;25234:7;25201:18;:41::i;:::-;25193:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25309:28;25319:4;25325:2;25329:7;25309:9;:28::i;:::-;25006:339;;;:::o;34973:256::-;35070:7;35106:23;35123:5;35106:16;:23::i;:::-;35098:5;:31;35090:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35195:12;:19;35208:5;35195:19;;;;;;;;;;;;;;;:26;35215:5;35195:26;;;;;;;;;;;;35188:33;;34973:256;;;;:::o;45903:244::-;42034:12;:10;:12::i;:::-;42023:23;;:7;:5;:7::i;:::-;:23;;;42015:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45956:12:::1;45982:10;45974:24;;46006:21;45974:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45955:77;;;46047:7;46039:16;;;::::0;::::1;;45948:199;45903:244::o:0;25416:185::-;25554:39;25571:4;25577:2;25581:7;25554:39;;;;;;;;;;;;:16;:39::i;:::-;25416:185;;;:::o;44309:348::-;44384:16;44412:23;44438:17;44448:6;44438:9;:17::i;:::-;44412:43;;44462:25;44504:15;44490:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44462:58;;44532:9;44527:103;44547:15;44543:1;:19;44527:103;;;44592:30;44612:6;44620:1;44592:19;:30::i;:::-;44578:8;44587:1;44578:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;44564:3;;;;;:::i;:::-;;;;44527:103;;;;44643:8;44636:15;;;;44309:348;;;:::o;45255:80::-;42034:12;:10;:12::i;:::-;42023:23;;:7;:5;:7::i;:::-;:23;;;42015:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45321:8:::1;45314:4;:15;;;;45255:80:::0;:::o;35495:233::-;35570:7;35606:30;:28;:30::i;:::-;35598:5;:38;35590:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35703:10;35714:5;35703:17;;;;;;;;:::i;:::-;;;;;;;;;;35696:24;;35495:233;;;:::o;43412:27::-;;;;;;;;;;;;;:::o;45591:98::-;42034:12;:10;:12::i;:::-;42023:23;;:7;:5;:7::i;:::-;:23;;;42015:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45672:11:::1;45662:7;:21;;;;;;:::i;:::-;;45591:98:::0;:::o;43381:26::-;;;;;;;;;;;;;:::o;22251:239::-;22323:7;22343:13;22359:7;:16;22367:7;22359:16;;;;;;;;;;;;;;;;;;;;;22343:32;;22411:1;22394:19;;:5;:19;;;22386:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22477:5;22470:12;;;22251:239;;;:::o;21981:208::-;22053:7;22098:1;22081:19;;:5;:19;;;22073:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22165:9;:16;22175:5;22165:16;;;;;;;;;;;;;;;;22158:23;;21981:208;;;:::o;42454:94::-;42034:12;:10;:12::i;:::-;42023:23;;:7;:5;:7::i;:::-;:23;;;42015:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42519:21:::1;42537:1;42519:9;:21::i;:::-;42454:94::o:0;45341:116::-;42034:12;:10;:12::i;:::-;42023:23;;:7;:5;:7::i;:::-;:23;;;42015:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45434:17:::1;45418:13;:33;;;;45341:116:::0;:::o;41803:87::-;41849:7;41876:6;;;;;;;;;;;41869:13;;41803:87;:::o;22726:104::-;22782:13;22815:7;22808:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22726:104;:::o;43870:433::-;43927:14;43944:13;:11;:13::i;:::-;43927:30;;43973:6;;;;;;;;;;;43972:7;43964:16;;;;;;44009:1;43995:11;:15;43987:24;;;;;;44041:13;;44026:11;:28;;44018:37;;;;;;44094:9;;44079:11;44070:6;:20;;;;:::i;:::-;:33;;44062:42;;;;;;44131:7;:5;:7::i;:::-;44117:21;;:10;:21;;;44113:84;;44177:11;44170:4;;:18;;;;:::i;:::-;44157:9;:31;;44149:40;;;;;;44113:84;44210:9;44222:1;44210:13;;44205:93;44230:11;44225:1;:16;44205:93;;44257:33;44267:10;44288:1;44279:6;:10;;;;:::i;:::-;44257:9;:33::i;:::-;44243:3;;;;;:::i;:::-;;;;44205:93;;;;43920:383;43870:433;:::o;24409:295::-;24524:12;:10;:12::i;:::-;24512:24;;:8;:24;;;24504:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;24624:8;24579:18;:32;24598:12;:10;:12::i;:::-;24579:32;;;;;;;;;;;;;;;:42;24612:8;24579:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;24677:8;24648:48;;24663:12;:10;:12::i;:::-;24648:48;;;24687:8;24648:48;;;;;;:::i;:::-;;;;;;;;24409:295;;:::o;45182:65::-;42034:12;:10;:12::i;:::-;42023:23;;:7;:5;:7::i;:::-;:23;;;42015:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45237:4:::1;45226:8;;:15;;;;;;;;;;;;;;;;;;45182:65::o:0;25672:328::-;25847:41;25866:12;:10;:12::i;:::-;25880:7;25847:18;:41::i;:::-;25839:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25953:39;25967:4;25973:2;25977:7;25986:5;25953:13;:39::i;:::-;25672:328;;;;:::o;43225:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44663:497::-;44761:13;44802:16;44810:7;44802;:16::i;:::-;44786:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;44911:5;44899:17;;:8;;;;;;;;;;;:17;;;44896:62;;44936:14;44929:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44896:62;44966:28;44997:10;:8;:10::i;:::-;44966:41;;45052:1;45027:14;45021:28;:32;:133;;;;;;;;;;;;;;;;;45089:14;45105:18;:7;:16;:18::i;:::-;45125:13;45072:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45021:133;45014:140;;;44663:497;;;;:::o;43305:32::-;;;;:::o;45695:122::-;42034:12;:10;:12::i;:::-;42023:23;;:7;:5;:7::i;:::-;:23;;;42015:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45794:17:::1;45778:13;:33;;;;;;:::i;:::-;;45695:122:::0;:::o;24775:164::-;24872:4;24896:18;:25;24915:5;24896:25;;;;;;;;;;;;;;;:35;24922:8;24896:35;;;;;;;;;;;;;;;;;;;;;;;;;24889:42;;24775:164;;;;:::o;45465:120::-;42034:12;:10;:12::i;:::-;42023:23;;:7;:5;:7::i;:::-;:23;;;42015:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45564:15:::1;45547:14;:32;;;;;;:::i;:::-;;45465:120:::0;:::o;42703:192::-;42034:12;:10;:12::i;:::-;42023:23;;:7;:5;:7::i;:::-;:23;;;42015:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42812:1:::1;42792:22;;:8;:22;;::::0;42784:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;42868:19;42878:8;42868:9;:19::i;:::-;42703:192:::0;:::o;21612:305::-;21714:4;21766:25;21751:40;;;:11;:40;;;;:105;;;;21823:33;21808:48;;;:11;:48;;;;21751:105;:158;;;;21873:36;21897:11;21873:23;:36::i;:::-;21751:158;21731:178;;21612:305;;;:::o;20086:98::-;20139:7;20166:10;20159:17;;20086:98;:::o;27510:127::-;27575:4;27627:1;27599:30;;:7;:16;27607:7;27599:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27592:37;;27510:127;;;:::o;31492:174::-;31594:2;31567:15;:24;31583:7;31567:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31650:7;31646:2;31612:46;;31621:23;31636:7;31621:14;:23::i;:::-;31612:46;;;;;;;;;;;;31492:174;;:::o;27804:348::-;27897:4;27922:16;27930:7;27922;:16::i;:::-;27914:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27998:13;28014:23;28029:7;28014:14;:23::i;:::-;27998:39;;28067:5;28056:16;;:7;:16;;;:51;;;;28100:7;28076:31;;:20;28088:7;28076:11;:20::i;:::-;:31;;;28056:51;:87;;;;28111:32;28128:5;28135:7;28111:16;:32::i;:::-;28056:87;28048:96;;;27804:348;;;;:::o;30796:578::-;30955:4;30928:31;;:23;30943:7;30928:14;:23::i;:::-;:31;;;30920:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;31038:1;31024:16;;:2;:16;;;31016:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31094:39;31115:4;31121:2;31125:7;31094:20;:39::i;:::-;31198:29;31215:1;31219:7;31198:8;:29::i;:::-;31259:1;31240:9;:15;31250:4;31240:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31288:1;31271:9;:13;31281:2;31271:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31319:2;31300:7;:16;31308:7;31300:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31358:7;31354:2;31339:27;;31348:4;31339:27;;;;;;;;;;;;30796:578;;;:::o;42903:173::-;42959:16;42978:6;;;;;;;;;;;42959:25;;43004:8;42995:6;;:17;;;;;;;;;;;;;;;;;;43059:8;43028:40;;43049:8;43028:40;;;;;;;;;;;;42948:128;42903:173;:::o;28494:110::-;28570:26;28580:2;28584:7;28570:26;;;;;;;;;;;;:9;:26::i;:::-;28494:110;;:::o;26882:315::-;27039:28;27049:4;27055:2;27059:7;27039:9;:28::i;:::-;27086:48;27109:4;27115:2;27119:7;27128:5;27086:22;:48::i;:::-;27078:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26882:315;;;;:::o;43749:102::-;43809:13;43838:7;43831:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43749:102;:::o;7918:723::-;7974:13;8204:1;8195:5;:10;8191:53;;8222:10;;;;;;;;;;;;;;;;;;;;;8191:53;8254:12;8269:5;8254:20;;8285:14;8310:78;8325:1;8317:4;:9;8310:78;;8343:8;;;;;:::i;:::-;;;;8374:2;8366:10;;;;;:::i;:::-;;;8310:78;;;8398:19;8430:6;8420:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8398:39;;8448:154;8464:1;8455:5;:10;8448:154;;8492:1;8482:11;;;;;:::i;:::-;;;8559:2;8551:5;:10;;;;:::i;:::-;8538:2;:24;;;;:::i;:::-;8525:39;;8508:6;8515;8508:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8588:2;8579:11;;;;;:::i;:::-;;;8448:154;;;8626:6;8612:21;;;;;7918:723;;;;:::o;7443:157::-;7528:4;7567:25;7552:40;;;:11;:40;;;;7545:47;;7443:157;;;:::o;36341:589::-;36485:45;36512:4;36518:2;36522:7;36485:26;:45::i;:::-;36563:1;36547:18;;:4;:18;;;36543:187;;36582:40;36614:7;36582:31;:40::i;:::-;36543:187;;;36652:2;36644:10;;:4;:10;;;36640:90;;36671:47;36704:4;36710:7;36671:32;:47::i;:::-;36640:90;36543:187;36758:1;36744:16;;:2;:16;;;36740:183;;36777:45;36814:7;36777:36;:45::i;:::-;36740:183;;;36850:4;36844:10;;:2;:10;;;36840:83;;36871:40;36899:2;36903:7;36871:27;:40::i;:::-;36840:83;36740:183;36341:589;;;:::o;28831:321::-;28961:18;28967:2;28971:7;28961:5;:18::i;:::-;29012:54;29043:1;29047:2;29051:7;29060:5;29012:22;:54::i;:::-;28990:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28831:321;;;:::o;32231:799::-;32386:4;32407:15;:2;:13;;;:15::i;:::-;32403:620;;;32459:2;32443:36;;;32480:12;:10;:12::i;:::-;32494:4;32500:7;32509:5;32443:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32439:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32702:1;32685:6;:13;:18;32681:272;;32728:60;;;;;;;;;;:::i;:::-;;;;;;;;32681:272;32903:6;32897:13;32888:6;32884:2;32880:15;32873:38;32439:529;32576:41;;;32566:51;;;:6;:51;;;;32559:58;;;;;32403:620;33007:4;33000:11;;32231:799;;;;;;;:::o;33602:126::-;;;;:::o;37653:164::-;37757:10;:17;;;;37730:15;:24;37746:7;37730:24;;;;;;;;;;;:44;;;;37785:10;37801:7;37785:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37653:164;:::o;38444:988::-;38710:22;38760:1;38735:22;38752:4;38735:16;:22::i;:::-;:26;;;;:::i;:::-;38710:51;;38772:18;38793:17;:26;38811:7;38793:26;;;;;;;;;;;;38772:47;;38940:14;38926:10;:28;38922:328;;38971:19;38993:12;:18;39006:4;38993:18;;;;;;;;;;;;;;;:34;39012:14;38993:34;;;;;;;;;;;;38971:56;;39077:11;39044:12;:18;39057:4;39044:18;;;;;;;;;;;;;;;:30;39063:10;39044:30;;;;;;;;;;;:44;;;;39194:10;39161:17;:30;39179:11;39161:30;;;;;;;;;;;:43;;;;38956:294;38922:328;39346:17;:26;39364:7;39346:26;;;;;;;;;;;39339:33;;;39390:12;:18;39403:4;39390:18;;;;;;;;;;;;;;;:34;39409:14;39390:34;;;;;;;;;;;39383:41;;;38525:907;;38444:988;;:::o;39727:1079::-;39980:22;40025:1;40005:10;:17;;;;:21;;;;:::i;:::-;39980:46;;40037:18;40058:15;:24;40074:7;40058:24;;;;;;;;;;;;40037:45;;40409:19;40431:10;40442:14;40431:26;;;;;;;;:::i;:::-;;;;;;;;;;40409:48;;40495:11;40470:10;40481;40470:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;40606:10;40575:15;:28;40591:11;40575:28;;;;;;;;;;;:41;;;;40747:15;:24;40763:7;40747:24;;;;;;;;;;;40740:31;;;40782:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39798:1008;;;39727:1079;:::o;37231:221::-;37316:14;37333:20;37350:2;37333:16;:20::i;:::-;37316:37;;37391:7;37364:12;:16;37377:2;37364:16;;;;;;;;;;;;;;;:24;37381:6;37364:24;;;;;;;;;;;:34;;;;37438:6;37409:17;:26;37427:7;37409:26;;;;;;;;;;;:35;;;;37305:147;37231:221;;:::o;29488:382::-;29582:1;29568:16;;:2;:16;;;29560:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29641:16;29649:7;29641;:16::i;:::-;29640:17;29632:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29703:45;29732:1;29736:2;29740:7;29703:20;:45::i;:::-;29778:1;29761:9;:13;29771:2;29761:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29809:2;29790:7;:16;29798:7;29790:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29854:7;29850:2;29829:33;;29846:1;29829:33;;;;;;;;;;;;29488:382;;:::o;10443:387::-;10503:4;10711:12;10778:7;10766:20;10758:28;;10821:1;10814:4;:8;10807:15;;;10443:387;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:116::-;1588:21;1603:5;1588:21;:::i;:::-;1581:5;1578:32;1568:60;;1624:1;1621;1614:12;1568:60;1518:116;:::o;1640:133::-;1683:5;1721:6;1708:20;1699:29;;1737:30;1761:5;1737:30;:::i;:::-;1640:133;;;;:::o;1779:323::-;1835:6;1884:2;1872:9;1863:7;1859:23;1855:32;1852:119;;;1890:79;;:::i;:::-;1852:119;2010:1;2035:50;2077:7;2068:6;2057:9;2053:22;2035:50;:::i;:::-;2025:60;;1981:114;1779:323;;;;:::o;2108:99::-;2160:6;2194:5;2188:12;2178:22;;2108:99;;;:::o;2213:169::-;2297:11;2331:6;2326:3;2319:19;2371:4;2366:3;2362:14;2347:29;;2213:169;;;;:::o;2388:307::-;2456:1;2466:113;2480:6;2477:1;2474:13;2466:113;;;2565:1;2560:3;2556:11;2550:18;2546:1;2541:3;2537:11;2530:39;2502:2;2499:1;2495:10;2490:15;;2466:113;;;2597:6;2594:1;2591:13;2588:101;;;2677:1;2668:6;2663:3;2659:16;2652:27;2588:101;2437:258;2388:307;;;:::o;2701:102::-;2742:6;2793:2;2789:7;2784:2;2777:5;2773:14;2769:28;2759:38;;2701:102;;;:::o;2809:364::-;2897:3;2925:39;2958:5;2925:39;:::i;:::-;2980:71;3044:6;3039:3;2980:71;:::i;:::-;2973:78;;3060:52;3105:6;3100:3;3093:4;3086:5;3082:16;3060:52;:::i;:::-;3137:29;3159:6;3137:29;:::i;:::-;3132:3;3128:39;3121:46;;2901:272;2809:364;;;;:::o;3179:313::-;3292:4;3330:2;3319:9;3315:18;3307:26;;3379:9;3373:4;3369:20;3365:1;3354:9;3350:17;3343:47;3407:78;3480:4;3471:6;3407:78;:::i;:::-;3399:86;;3179:313;;;;:::o;3498:77::-;3535:7;3564:5;3553:16;;3498:77;;;:::o;3581:122::-;3654:24;3672:5;3654:24;:::i;:::-;3647:5;3644:35;3634:63;;3693:1;3690;3683:12;3634:63;3581:122;:::o;3709:139::-;3755:5;3793:6;3780:20;3771:29;;3809:33;3836:5;3809:33;:::i;:::-;3709:139;;;;:::o;3854:329::-;3913:6;3962:2;3950:9;3941:7;3937:23;3933:32;3930:119;;;3968:79;;:::i;:::-;3930:119;4088:1;4113:53;4158:7;4149:6;4138:9;4134:22;4113:53;:::i;:::-;4103:63;;4059:117;3854:329;;;;:::o;4189:126::-;4226:7;4266:42;4259:5;4255:54;4244:65;;4189:126;;;:::o;4321:96::-;4358:7;4387:24;4405:5;4387:24;:::i;:::-;4376:35;;4321:96;;;:::o;4423:118::-;4510:24;4528:5;4510:24;:::i;:::-;4505:3;4498:37;4423:118;;:::o;4547:222::-;4640:4;4678:2;4667:9;4663:18;4655:26;;4691:71;4759:1;4748:9;4744:17;4735:6;4691:71;:::i;:::-;4547:222;;;;:::o;4775:122::-;4848:24;4866:5;4848:24;:::i;:::-;4841:5;4838:35;4828:63;;4887:1;4884;4877:12;4828:63;4775:122;:::o;4903:139::-;4949:5;4987:6;4974:20;4965:29;;5003:33;5030:5;5003:33;:::i;:::-;4903:139;;;;:::o;5048:474::-;5116:6;5124;5173:2;5161:9;5152:7;5148:23;5144:32;5141:119;;;5179:79;;:::i;:::-;5141:119;5299:1;5324:53;5369:7;5360:6;5349:9;5345:22;5324:53;:::i;:::-;5314:63;;5270:117;5426:2;5452:53;5497:7;5488:6;5477:9;5473:22;5452:53;:::i;:::-;5442:63;;5397:118;5048:474;;;;;:::o;5528:118::-;5615:24;5633:5;5615:24;:::i;:::-;5610:3;5603:37;5528:118;;:::o;5652:222::-;5745:4;5783:2;5772:9;5768:18;5760:26;;5796:71;5864:1;5853:9;5849:17;5840:6;5796:71;:::i;:::-;5652:222;;;;:::o;5880:619::-;5957:6;5965;5973;6022:2;6010:9;6001:7;5997:23;5993:32;5990:119;;;6028:79;;:::i;:::-;5990:119;6148:1;6173:53;6218:7;6209:6;6198:9;6194:22;6173:53;:::i;:::-;6163:63;;6119:117;6275:2;6301:53;6346:7;6337:6;6326:9;6322:22;6301:53;:::i;:::-;6291:63;;6246:118;6403:2;6429:53;6474:7;6465:6;6454:9;6450:22;6429:53;:::i;:::-;6419:63;;6374:118;5880:619;;;;;:::o;6505:329::-;6564:6;6613:2;6601:9;6592:7;6588:23;6584:32;6581:119;;;6619:79;;:::i;:::-;6581:119;6739:1;6764:53;6809:7;6800:6;6789:9;6785:22;6764:53;:::i;:::-;6754:63;;6710:117;6505:329;;;;:::o;6840:114::-;6907:6;6941:5;6935:12;6925:22;;6840:114;;;:::o;6960:184::-;7059:11;7093:6;7088:3;7081:19;7133:4;7128:3;7124:14;7109:29;;6960:184;;;;:::o;7150:132::-;7217:4;7240:3;7232:11;;7270:4;7265:3;7261:14;7253:22;;7150:132;;;:::o;7288:108::-;7365:24;7383:5;7365:24;:::i;:::-;7360:3;7353:37;7288:108;;:::o;7402:179::-;7471:10;7492:46;7534:3;7526:6;7492:46;:::i;:::-;7570:4;7565:3;7561:14;7547:28;;7402:179;;;;:::o;7587:113::-;7657:4;7689;7684:3;7680:14;7672:22;;7587:113;;;:::o;7736:732::-;7855:3;7884:54;7932:5;7884:54;:::i;:::-;7954:86;8033:6;8028:3;7954:86;:::i;:::-;7947:93;;8064:56;8114:5;8064:56;:::i;:::-;8143:7;8174:1;8159:284;8184:6;8181:1;8178:13;8159:284;;;8260:6;8254:13;8287:63;8346:3;8331:13;8287:63;:::i;:::-;8280:70;;8373:60;8426:6;8373:60;:::i;:::-;8363:70;;8219:224;8206:1;8203;8199:9;8194:14;;8159:284;;;8163:14;8459:3;8452:10;;7860:608;;;7736:732;;;;:::o;8474:373::-;8617:4;8655:2;8644:9;8640:18;8632:26;;8704:9;8698:4;8694:20;8690:1;8679:9;8675:17;8668:47;8732:108;8835:4;8826:6;8732:108;:::i;:::-;8724:116;;8474:373;;;;:::o;8853:117::-;8962:1;8959;8952:12;8976:117;9085:1;9082;9075:12;9099:180;9147:77;9144:1;9137:88;9244:4;9241:1;9234:15;9268:4;9265:1;9258:15;9285:281;9368:27;9390:4;9368:27;:::i;:::-;9360:6;9356:40;9498:6;9486:10;9483:22;9462:18;9450:10;9447:34;9444:62;9441:88;;;9509:18;;:::i;:::-;9441:88;9549:10;9545:2;9538:22;9328:238;9285:281;;:::o;9572:129::-;9606:6;9633:20;;:::i;:::-;9623:30;;9662:33;9690:4;9682:6;9662:33;:::i;:::-;9572:129;;;:::o;9707:308::-;9769:4;9859:18;9851:6;9848:30;9845:56;;;9881:18;;:::i;:::-;9845:56;9919:29;9941:6;9919:29;:::i;:::-;9911:37;;10003:4;9997;9993:15;9985:23;;9707:308;;;:::o;10021:154::-;10105:6;10100:3;10095;10082:30;10167:1;10158:6;10153:3;10149:16;10142:27;10021:154;;;:::o;10181:412::-;10259:5;10284:66;10300:49;10342:6;10300:49;:::i;:::-;10284:66;:::i;:::-;10275:75;;10373:6;10366:5;10359:21;10411:4;10404:5;10400:16;10449:3;10440:6;10435:3;10431:16;10428:25;10425:112;;;10456:79;;:::i;:::-;10425:112;10546:41;10580:6;10575:3;10570;10546:41;:::i;:::-;10265:328;10181:412;;;;;:::o;10613:340::-;10669:5;10718:3;10711:4;10703:6;10699:17;10695:27;10685:122;;10726:79;;:::i;:::-;10685:122;10843:6;10830:20;10868:79;10943:3;10935:6;10928:4;10920:6;10916:17;10868:79;:::i;:::-;10859:88;;10675:278;10613:340;;;;:::o;10959:509::-;11028:6;11077:2;11065:9;11056:7;11052:23;11048:32;11045:119;;;11083:79;;:::i;:::-;11045:119;11231:1;11220:9;11216:17;11203:31;11261:18;11253:6;11250:30;11247:117;;;11283:79;;:::i;:::-;11247:117;11388:63;11443:7;11434:6;11423:9;11419:22;11388:63;:::i;:::-;11378:73;;11174:287;10959:509;;;;:::o;11474:468::-;11539:6;11547;11596:2;11584:9;11575:7;11571:23;11567:32;11564:119;;;11602:79;;:::i;:::-;11564:119;11722:1;11747:53;11792:7;11783:6;11772:9;11768:22;11747:53;:::i;:::-;11737:63;;11693:117;11849:2;11875:50;11917:7;11908:6;11897:9;11893:22;11875:50;:::i;:::-;11865:60;;11820:115;11474:468;;;;;:::o;11948:307::-;12009:4;12099:18;12091:6;12088:30;12085:56;;;12121:18;;:::i;:::-;12085:56;12159:29;12181:6;12159:29;:::i;:::-;12151:37;;12243:4;12237;12233:15;12225:23;;11948:307;;;:::o;12261:410::-;12338:5;12363:65;12379:48;12420:6;12379:48;:::i;:::-;12363:65;:::i;:::-;12354:74;;12451:6;12444:5;12437:21;12489:4;12482:5;12478:16;12527:3;12518:6;12513:3;12509:16;12506:25;12503:112;;;12534:79;;:::i;:::-;12503:112;12624:41;12658:6;12653:3;12648;12624:41;:::i;:::-;12344:327;12261:410;;;;;:::o;12690:338::-;12745:5;12794:3;12787:4;12779:6;12775:17;12771:27;12761:122;;12802:79;;:::i;:::-;12761:122;12919:6;12906:20;12944:78;13018:3;13010:6;13003:4;12995:6;12991:17;12944:78;:::i;:::-;12935:87;;12751:277;12690:338;;;;:::o;13034:943::-;13129:6;13137;13145;13153;13202:3;13190:9;13181:7;13177:23;13173:33;13170:120;;;13209:79;;:::i;:::-;13170:120;13329:1;13354:53;13399:7;13390:6;13379:9;13375:22;13354:53;:::i;:::-;13344:63;;13300:117;13456:2;13482:53;13527:7;13518:6;13507:9;13503:22;13482:53;:::i;:::-;13472:63;;13427:118;13584:2;13610:53;13655:7;13646:6;13635:9;13631:22;13610:53;:::i;:::-;13600:63;;13555:118;13740:2;13729:9;13725:18;13712:32;13771:18;13763:6;13760:30;13757:117;;;13793:79;;:::i;:::-;13757:117;13898:62;13952:7;13943:6;13932:9;13928:22;13898:62;:::i;:::-;13888:72;;13683:287;13034:943;;;;;;;:::o;13983:474::-;14051:6;14059;14108:2;14096:9;14087:7;14083:23;14079:32;14076:119;;;14114:79;;:::i;:::-;14076:119;14234:1;14259:53;14304:7;14295:6;14284:9;14280:22;14259:53;:::i;:::-;14249:63;;14205:117;14361:2;14387:53;14432:7;14423:6;14412:9;14408:22;14387:53;:::i;:::-;14377:63;;14332:118;13983:474;;;;;:::o;14463:182::-;14603:34;14599:1;14591:6;14587:14;14580:58;14463:182;:::o;14651:366::-;14793:3;14814:67;14878:2;14873:3;14814:67;:::i;:::-;14807:74;;14890:93;14979:3;14890:93;:::i;:::-;15008:2;15003:3;14999:12;14992:19;;14651:366;;;:::o;15023:419::-;15189:4;15227:2;15216:9;15212:18;15204:26;;15276:9;15270:4;15266:20;15262:1;15251:9;15247:17;15240:47;15304:131;15430:4;15304:131;:::i;:::-;15296:139;;15023:419;;;:::o;15448:180::-;15496:77;15493:1;15486:88;15593:4;15590:1;15583:15;15617:4;15614:1;15607:15;15634:320;15678:6;15715:1;15709:4;15705:12;15695:22;;15762:1;15756:4;15752:12;15783:18;15773:81;;15839:4;15831:6;15827:17;15817:27;;15773:81;15901:2;15893:6;15890:14;15870:18;15867:38;15864:84;;15920:18;;:::i;:::-;15864:84;15685:269;15634:320;;;:::o;15960:231::-;16100:34;16096:1;16088:6;16084:14;16077:58;16169:14;16164:2;16156:6;16152:15;16145:39;15960:231;:::o;16197:366::-;16339:3;16360:67;16424:2;16419:3;16360:67;:::i;:::-;16353:74;;16436:93;16525:3;16436:93;:::i;:::-;16554:2;16549:3;16545:12;16538:19;;16197:366;;;:::o;16569:419::-;16735:4;16773:2;16762:9;16758:18;16750:26;;16822:9;16816:4;16812:20;16808:1;16797:9;16793:17;16786:47;16850:131;16976:4;16850:131;:::i;:::-;16842:139;;16569:419;;;:::o;16994:220::-;17134:34;17130:1;17122:6;17118:14;17111:58;17203:3;17198:2;17190:6;17186:15;17179:28;16994:220;:::o;17220:366::-;17362:3;17383:67;17447:2;17442:3;17383:67;:::i;:::-;17376:74;;17459:93;17548:3;17459:93;:::i;:::-;17577:2;17572:3;17568:12;17561:19;;17220:366;;;:::o;17592:419::-;17758:4;17796:2;17785:9;17781:18;17773:26;;17845:9;17839:4;17835:20;17831:1;17820:9;17816:17;17809:47;17873:131;17999:4;17873:131;:::i;:::-;17865:139;;17592:419;;;:::o;18017:243::-;18157:34;18153:1;18145:6;18141:14;18134:58;18226:26;18221:2;18213:6;18209:15;18202:51;18017:243;:::o;18266:366::-;18408:3;18429:67;18493:2;18488:3;18429:67;:::i;:::-;18422:74;;18505:93;18594:3;18505:93;:::i;:::-;18623:2;18618:3;18614:12;18607:19;;18266:366;;;:::o;18638:419::-;18804:4;18842:2;18831:9;18827:18;18819:26;;18891:9;18885:4;18881:20;18877:1;18866:9;18862:17;18855:47;18919:131;19045:4;18919:131;:::i;:::-;18911:139;;18638:419;;;:::o;19063:236::-;19203:34;19199:1;19191:6;19187:14;19180:58;19272:19;19267:2;19259:6;19255:15;19248:44;19063:236;:::o;19305:366::-;19447:3;19468:67;19532:2;19527:3;19468:67;:::i;:::-;19461:74;;19544:93;19633:3;19544:93;:::i;:::-;19662:2;19657:3;19653:12;19646:19;;19305:366;;;:::o;19677:419::-;19843:4;19881:2;19870:9;19866:18;19858:26;;19930:9;19924:4;19920:20;19916:1;19905:9;19901:17;19894:47;19958:131;20084:4;19958:131;:::i;:::-;19950:139;;19677:419;;;:::o;20102:230::-;20242:34;20238:1;20230:6;20226:14;20219:58;20311:13;20306:2;20298:6;20294:15;20287:38;20102:230;:::o;20338:366::-;20480:3;20501:67;20565:2;20560:3;20501:67;:::i;:::-;20494:74;;20577:93;20666:3;20577:93;:::i;:::-;20695:2;20690:3;20686:12;20679:19;;20338:366;;;:::o;20710:419::-;20876:4;20914:2;20903:9;20899:18;20891:26;;20963:9;20957:4;20953:20;20949:1;20938:9;20934:17;20927:47;20991:131;21117:4;20991:131;:::i;:::-;20983:139;;20710:419;;;:::o;21135:147::-;21236:11;21273:3;21258:18;;21135:147;;;;:::o;21288:114::-;;:::o;21408:398::-;21567:3;21588:83;21669:1;21664:3;21588:83;:::i;:::-;21581:90;;21680:93;21769:3;21680:93;:::i;:::-;21798:1;21793:3;21789:11;21782:18;;21408:398;;;:::o;21812:379::-;21996:3;22018:147;22161:3;22018:147;:::i;:::-;22011:154;;22182:3;22175:10;;21812:379;;;:::o;22197:180::-;22245:77;22242:1;22235:88;22342:4;22339:1;22332:15;22366:4;22363:1;22356:15;22383:180;22431:77;22428:1;22421:88;22528:4;22525:1;22518:15;22552:4;22549:1;22542:15;22569:233;22608:3;22631:24;22649:5;22631:24;:::i;:::-;22622:33;;22677:66;22670:5;22667:77;22664:103;;22747:18;;:::i;:::-;22664:103;22794:1;22787:5;22783:13;22776:20;;22569:233;;;:::o;22808:231::-;22948:34;22944:1;22936:6;22932:14;22925:58;23017:14;23012:2;23004:6;23000:15;22993:39;22808:231;:::o;23045:366::-;23187:3;23208:67;23272:2;23267:3;23208:67;:::i;:::-;23201:74;;23284:93;23373:3;23284:93;:::i;:::-;23402:2;23397:3;23393:12;23386:19;;23045:366;;;:::o;23417:419::-;23583:4;23621:2;23610:9;23606:18;23598:26;;23670:9;23664:4;23660:20;23656:1;23645:9;23641:17;23634:47;23698:131;23824:4;23698:131;:::i;:::-;23690:139;;23417:419;;;:::o;23842:141::-;23891:4;23914:3;23906:11;;23937:3;23934:1;23927:14;23971:4;23968:1;23958:18;23950:26;;23842:141;;;:::o;23989:93::-;24026:6;24073:2;24068;24061:5;24057:14;24053:23;24043:33;;23989:93;;;:::o;24088:107::-;24132:8;24182:5;24176:4;24172:16;24151:37;;24088:107;;;;:::o;24201:393::-;24270:6;24320:1;24308:10;24304:18;24343:97;24373:66;24362:9;24343:97;:::i;:::-;24461:39;24491:8;24480:9;24461:39;:::i;:::-;24449:51;;24533:4;24529:9;24522:5;24518:21;24509:30;;24582:4;24572:8;24568:19;24561:5;24558:30;24548:40;;24277:317;;24201:393;;;;;:::o;24600:60::-;24628:3;24649:5;24642:12;;24600:60;;;:::o;24666:142::-;24716:9;24749:53;24767:34;24776:24;24794:5;24776:24;:::i;:::-;24767:34;:::i;:::-;24749:53;:::i;:::-;24736:66;;24666:142;;;:::o;24814:75::-;24857:3;24878:5;24871:12;;24814:75;;;:::o;24895:269::-;25005:39;25036:7;25005:39;:::i;:::-;25066:91;25115:41;25139:16;25115:41;:::i;:::-;25107:6;25100:4;25094:11;25066:91;:::i;:::-;25060:4;25053:105;24971:193;24895:269;;;:::o;25170:73::-;25215:3;25170:73;:::o;25249:189::-;25326:32;;:::i;:::-;25367:65;25425:6;25417;25411:4;25367:65;:::i;:::-;25302:136;25249:189;;:::o;25444:186::-;25504:120;25521:3;25514:5;25511:14;25504:120;;;25575:39;25612:1;25605:5;25575:39;:::i;:::-;25548:1;25541:5;25537:13;25528:22;;25504:120;;;25444:186;;:::o;25636:543::-;25737:2;25732:3;25729:11;25726:446;;;25771:38;25803:5;25771:38;:::i;:::-;25855:29;25873:10;25855:29;:::i;:::-;25845:8;25841:44;26038:2;26026:10;26023:18;26020:49;;;26059:8;26044:23;;26020:49;26082:80;26138:22;26156:3;26138:22;:::i;:::-;26128:8;26124:37;26111:11;26082:80;:::i;:::-;25741:431;;25726:446;25636:543;;;:::o;26185:117::-;26239:8;26289:5;26283:4;26279:16;26258:37;;26185:117;;;;:::o;26308:169::-;26352:6;26385:51;26433:1;26429:6;26421:5;26418:1;26414:13;26385:51;:::i;:::-;26381:56;26466:4;26460;26456:15;26446:25;;26359:118;26308:169;;;;:::o;26482:295::-;26558:4;26704:29;26729:3;26723:4;26704:29;:::i;:::-;26696:37;;26766:3;26763:1;26759:11;26753:4;26750:21;26742:29;;26482:295;;;;:::o;26782:1395::-;26899:37;26932:3;26899:37;:::i;:::-;27001:18;26993:6;26990:30;26987:56;;;27023:18;;:::i;:::-;26987:56;27067:38;27099:4;27093:11;27067:38;:::i;:::-;27152:67;27212:6;27204;27198:4;27152:67;:::i;:::-;27246:1;27270:4;27257:17;;27302:2;27294:6;27291:14;27319:1;27314:618;;;;27976:1;27993:6;27990:77;;;28042:9;28037:3;28033:19;28027:26;28018:35;;27990:77;28093:67;28153:6;28146:5;28093:67;:::i;:::-;28087:4;28080:81;27949:222;27284:887;;27314:618;27366:4;27362:9;27354:6;27350:22;27400:37;27432:4;27400:37;:::i;:::-;27459:1;27473:208;27487:7;27484:1;27481:14;27473:208;;;27566:9;27561:3;27557:19;27551:26;27543:6;27536:42;27617:1;27609:6;27605:14;27595:24;;27664:2;27653:9;27649:18;27636:31;;27510:4;27507:1;27503:12;27498:17;;27473:208;;;27709:6;27700:7;27697:19;27694:179;;;27767:9;27762:3;27758:19;27752:26;27810:48;27852:4;27844:6;27840:17;27829:9;27810:48;:::i;:::-;27802:6;27795:64;27717:156;27694:179;27919:1;27915;27907:6;27903:14;27899:22;27893:4;27886:36;27321:611;;;27284:887;;26874:1303;;;26782:1395;;:::o;28183:228::-;28323:34;28319:1;28311:6;28307:14;28300:58;28392:11;28387:2;28379:6;28375:15;28368:36;28183:228;:::o;28417:366::-;28559:3;28580:67;28644:2;28639:3;28580:67;:::i;:::-;28573:74;;28656:93;28745:3;28656:93;:::i;:::-;28774:2;28769:3;28765:12;28758:19;;28417:366;;;:::o;28789:419::-;28955:4;28993:2;28982:9;28978:18;28970:26;;29042:9;29036:4;29032:20;29028:1;29017:9;29013:17;29006:47;29070:131;29196:4;29070:131;:::i;:::-;29062:139;;28789:419;;;:::o;29214:229::-;29354:34;29350:1;29342:6;29338:14;29331:58;29423:12;29418:2;29410:6;29406:15;29399:37;29214:229;:::o;29449:366::-;29591:3;29612:67;29676:2;29671:3;29612:67;:::i;:::-;29605:74;;29688:93;29777:3;29688:93;:::i;:::-;29806:2;29801:3;29797:12;29790:19;;29449:366;;;:::o;29821:419::-;29987:4;30025:2;30014:9;30010:18;30002:26;;30074:9;30068:4;30064:20;30060:1;30049:9;30045:17;30038:47;30102:131;30228:4;30102:131;:::i;:::-;30094:139;;29821:419;;;:::o;30246:305::-;30286:3;30305:20;30323:1;30305:20;:::i;:::-;30300:25;;30339:20;30357:1;30339:20;:::i;:::-;30334:25;;30493:1;30425:66;30421:74;30418:1;30415:81;30412:107;;;30499:18;;:::i;:::-;30412:107;30543:1;30540;30536:9;30529:16;;30246:305;;;;:::o;30557:348::-;30597:7;30620:20;30638:1;30620:20;:::i;:::-;30615:25;;30654:20;30672:1;30654:20;:::i;:::-;30649:25;;30842:1;30774:66;30770:74;30767:1;30764:81;30759:1;30752:9;30745:17;30741:105;30738:131;;;30849:18;;:::i;:::-;30738:131;30897:1;30894;30890:9;30879:20;;30557:348;;;;:::o;30911:175::-;31051:27;31047:1;31039:6;31035:14;31028:51;30911:175;:::o;31092:366::-;31234:3;31255:67;31319:2;31314:3;31255:67;:::i;:::-;31248:74;;31331:93;31420:3;31331:93;:::i;:::-;31449:2;31444:3;31440:12;31433:19;;31092:366;;;:::o;31464:419::-;31630:4;31668:2;31657:9;31653:18;31645:26;;31717:9;31711:4;31707:20;31703:1;31692:9;31688:17;31681:47;31745:131;31871:4;31745:131;:::i;:::-;31737:139;;31464:419;;;:::o;31889:234::-;32029:34;32025:1;32017:6;32013:14;32006:58;32098:17;32093:2;32085:6;32081:15;32074:42;31889:234;:::o;32129:366::-;32271:3;32292:67;32356:2;32351:3;32292:67;:::i;:::-;32285:74;;32368:93;32457:3;32368:93;:::i;:::-;32486:2;32481:3;32477:12;32470:19;;32129:366;;;:::o;32501:419::-;32667:4;32705:2;32694:9;32690:18;32682:26;;32754:9;32748:4;32744:20;32740:1;32729:9;32725:17;32718:47;32782:131;32908:4;32782:131;:::i;:::-;32774:139;;32501:419;;;:::o;32926:148::-;33028:11;33065:3;33050:18;;32926:148;;;;:::o;33080:377::-;33186:3;33214:39;33247:5;33214:39;:::i;:::-;33269:89;33351:6;33346:3;33269:89;:::i;:::-;33262:96;;33367:52;33412:6;33407:3;33400:4;33393:5;33389:16;33367:52;:::i;:::-;33444:6;33439:3;33435:16;33428:23;;33190:267;33080:377;;;;:::o;33487:874::-;33590:3;33627:5;33621:12;33656:36;33682:9;33656:36;:::i;:::-;33708:89;33790:6;33785:3;33708:89;:::i;:::-;33701:96;;33828:1;33817:9;33813:17;33844:1;33839:166;;;;34019:1;34014:341;;;;33806:549;;33839:166;33923:4;33919:9;33908;33904:25;33899:3;33892:38;33985:6;33978:14;33971:22;33963:6;33959:35;33954:3;33950:45;33943:52;;33839:166;;34014:341;34081:38;34113:5;34081:38;:::i;:::-;34141:1;34155:154;34169:6;34166:1;34163:13;34155:154;;;34243:7;34237:14;34233:1;34228:3;34224:11;34217:35;34293:1;34284:7;34280:15;34269:26;;34191:4;34188:1;34184:12;34179:17;;34155:154;;;34338:6;34333:3;34329:16;34322:23;;34021:334;;33806:549;;33594:767;;33487:874;;;;:::o;34367:589::-;34592:3;34614:95;34705:3;34696:6;34614:95;:::i;:::-;34607:102;;34726:95;34817:3;34808:6;34726:95;:::i;:::-;34719:102;;34838:92;34926:3;34917:6;34838:92;:::i;:::-;34831:99;;34947:3;34940:10;;34367:589;;;;;;:::o;34962:225::-;35102:34;35098:1;35090:6;35086:14;35079:58;35171:8;35166:2;35158:6;35154:15;35147:33;34962:225;:::o;35193:366::-;35335:3;35356:67;35420:2;35415:3;35356:67;:::i;:::-;35349:74;;35432:93;35521:3;35432:93;:::i;:::-;35550:2;35545:3;35541:12;35534:19;;35193:366;;;:::o;35565:419::-;35731:4;35769:2;35758:9;35754:18;35746:26;;35818:9;35812:4;35808:20;35804:1;35793:9;35789:17;35782:47;35846:131;35972:4;35846:131;:::i;:::-;35838:139;;35565:419;;;:::o;35990:231::-;36130:34;36126:1;36118:6;36114:14;36107:58;36199:14;36194:2;36186:6;36182:15;36175:39;35990:231;:::o;36227:366::-;36369:3;36390:67;36454:2;36449:3;36390:67;:::i;:::-;36383:74;;36466:93;36555:3;36466:93;:::i;:::-;36584:2;36579:3;36575:12;36568:19;;36227:366;;;:::o;36599:419::-;36765:4;36803:2;36792:9;36788:18;36780:26;;36852:9;36846:4;36842:20;36838:1;36827:9;36823:17;36816:47;36880:131;37006:4;36880:131;:::i;:::-;36872:139;;36599:419;;;:::o;37024:228::-;37164:34;37160:1;37152:6;37148:14;37141:58;37233:11;37228:2;37220:6;37216:15;37209:36;37024:228;:::o;37258:366::-;37400:3;37421:67;37485:2;37480:3;37421:67;:::i;:::-;37414:74;;37497:93;37586:3;37497:93;:::i;:::-;37615:2;37610:3;37606:12;37599:19;;37258:366;;;:::o;37630:419::-;37796:4;37834:2;37823:9;37819:18;37811:26;;37883:9;37877:4;37873:20;37869:1;37858:9;37854:17;37847:47;37911:131;38037:4;37911:131;:::i;:::-;37903:139;;37630:419;;;:::o;38055:223::-;38195:34;38191:1;38183:6;38179:14;38172:58;38264:6;38259:2;38251:6;38247:15;38240:31;38055:223;:::o;38284:366::-;38426:3;38447:67;38511:2;38506:3;38447:67;:::i;:::-;38440:74;;38523:93;38612:3;38523:93;:::i;:::-;38641:2;38636:3;38632:12;38625:19;;38284:366;;;:::o;38656:419::-;38822:4;38860:2;38849:9;38845:18;38837:26;;38909:9;38903:4;38899:20;38895:1;38884:9;38880:17;38873:47;38937:131;39063:4;38937:131;:::i;:::-;38929:139;;38656:419;;;:::o;39081:191::-;39121:4;39141:20;39159:1;39141:20;:::i;:::-;39136:25;;39175:20;39193:1;39175:20;:::i;:::-;39170:25;;39214:1;39211;39208:8;39205:34;;;39219:18;;:::i;:::-;39205:34;39264:1;39261;39257:9;39249:17;;39081:191;;;;:::o;39278:237::-;39418:34;39414:1;39406:6;39402:14;39395:58;39487:20;39482:2;39474:6;39470:15;39463:45;39278:237;:::o;39521:366::-;39663:3;39684:67;39748:2;39743:3;39684:67;:::i;:::-;39677:74;;39760:93;39849:3;39760:93;:::i;:::-;39878:2;39873:3;39869:12;39862:19;;39521:366;;;:::o;39893:419::-;40059:4;40097:2;40086:9;40082:18;40074:26;;40146:9;40140:4;40136:20;40132:1;40121:9;40117:17;40110:47;40174:131;40300:4;40174:131;:::i;:::-;40166:139;;39893:419;;;:::o;40318:180::-;40366:77;40363:1;40356:88;40463:4;40460:1;40453:15;40487:4;40484:1;40477:15;40504:185;40544:1;40561:20;40579:1;40561:20;:::i;:::-;40556:25;;40595:20;40613:1;40595:20;:::i;:::-;40590:25;;40634:1;40624:35;;40639:18;;:::i;:::-;40624:35;40681:1;40678;40674:9;40669:14;;40504:185;;;;:::o;40695:176::-;40727:1;40744:20;40762:1;40744:20;:::i;:::-;40739:25;;40778:20;40796:1;40778:20;:::i;:::-;40773:25;;40817:1;40807:35;;40822:18;;:::i;:::-;40807:35;40863:1;40860;40856:9;40851:14;;40695:176;;;;:::o;40877:98::-;40928:6;40962:5;40956:12;40946:22;;40877:98;;;:::o;40981:168::-;41064:11;41098:6;41093:3;41086:19;41138:4;41133:3;41129:14;41114:29;;40981:168;;;;:::o;41155:360::-;41241:3;41269:38;41301:5;41269:38;:::i;:::-;41323:70;41386:6;41381:3;41323:70;:::i;:::-;41316:77;;41402:52;41447:6;41442:3;41435:4;41428:5;41424:16;41402:52;:::i;:::-;41479:29;41501:6;41479:29;:::i;:::-;41474:3;41470:39;41463:46;;41245:270;41155:360;;;;:::o;41521:640::-;41716:4;41754:3;41743:9;41739:19;41731:27;;41768:71;41836:1;41825:9;41821:17;41812:6;41768:71;:::i;:::-;41849:72;41917:2;41906:9;41902:18;41893:6;41849:72;:::i;:::-;41931;41999:2;41988:9;41984:18;41975:6;41931:72;:::i;:::-;42050:9;42044:4;42040:20;42035:2;42024:9;42020:18;42013:48;42078:76;42149:4;42140:6;42078:76;:::i;:::-;42070:84;;41521:640;;;;;;;:::o;42167:141::-;42223:5;42254:6;42248:13;42239:22;;42270:32;42296:5;42270:32;:::i;:::-;42167:141;;;;:::o;42314:349::-;42383:6;42432:2;42420:9;42411:7;42407:23;42403:32;42400:119;;;42438:79;;:::i;:::-;42400:119;42558:1;42583:63;42638:7;42629:6;42618:9;42614:22;42583:63;:::i;:::-;42573:73;;42529:127;42314:349;;;;:::o;42669:180::-;42717:77;42714:1;42707:88;42814:4;42811:1;42804:15;42838:4;42835:1;42828:15;42855:182;42995:34;42991:1;42983:6;42979:14;42972:58;42855:182;:::o;43043:366::-;43185:3;43206:67;43270:2;43265:3;43206:67;:::i;:::-;43199:74;;43282:93;43371:3;43282:93;:::i;:::-;43400:2;43395:3;43391:12;43384:19;;43043:366;;;:::o;43415:419::-;43581:4;43619:2;43608:9;43604:18;43596:26;;43668:9;43662:4;43658:20;43654:1;43643:9;43639:17;43632:47;43696:131;43822:4;43696:131;:::i;:::-;43688:139;;43415:419;;;:::o;43840:178::-;43980:30;43976:1;43968:6;43964:14;43957:54;43840:178;:::o;44024:366::-;44166:3;44187:67;44251:2;44246:3;44187:67;:::i;:::-;44180:74;;44263:93;44352:3;44263:93;:::i;:::-;44381:2;44376:3;44372:12;44365:19;;44024:366;;;:::o;44396:419::-;44562:4;44600:2;44589:9;44585:18;44577:26;;44649:9;44643:4;44639:20;44635:1;44624:9;44620:17;44613:47;44677:131;44803:4;44677:131;:::i;:::-;44669:139;;44396:419;;;:::o
Swarm Source
ipfs://d20f90a61ae2cebe729b4322352ef9561fa1e5cf79e6b24ba8ccd69a64a69cf8
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.