ERC-721
Overview
Max Total Supply
1,000 TPC
Holders
424
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 TPCLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Prompter
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-10 */ // SPDX-License-Identifier: MIT // Created by You and @0xmonas // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (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/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (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); /** * @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/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (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: https://github.com/0xmonas/onechain/blob/main/master/contracts/Base64.sol pragma solidity ^0.8.0; /// @title Base64 /// @author Brecht Devos - <[email protected]> /// @notice Provides a function for encoding some bytes in base64 library Base64 { string internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; function encode(bytes memory data) internal pure returns (bytes memory) { if (data.length == 0) return ""; // load the table into memory string memory table = TABLE; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((data.length + 2) / 3); // add some extra buffer at the end required for the writing bytes memory result = new bytes(encodedLen + 32); assembly { // set the actual output length mstore(result, encodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 3 bytes at a time for { } lt(dataPtr, endPtr) { } { dataPtr := add(dataPtr, 3) // read 3 bytes let input := mload(dataPtr) // write 4 characters mstore( resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F)))) ) resultPtr := add(resultPtr, 1) mstore( resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F)))) ) resultPtr := add(resultPtr, 1) mstore( resultPtr, shl(248, mload(add(tablePtr, and(shr(6, input), 0x3F)))) ) resultPtr := add(resultPtr, 1) mstore( resultPtr, shl(248, mload(add(tablePtr, and(input, 0x3F)))) ) resultPtr := add(resultPtr, 1) } // padding with '=' switch mod(mload(data), 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } } return result; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @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); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (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: address zero is not a valid owner"); 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: invalid token ID"); 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) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token 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: caller is not token 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) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @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 { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (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 // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: prompt.sol // Author: @0xmonas pragma solidity >=0.8.0 <0.9.0; contract Prompter is ERC721Enumerable, Ownable { error MaxNfts(); using Strings for uint256; mapping(uint256 => string) private wordsToTokenId; uint private fee = 0.01 ether; uint256 minted = 0; mapping (string => bool) public newString; string text; constructor() ERC721("Prompter", "TPC") {} function mint(string memory _Prompt) public payable { require(bytes(_Prompt).length <= 421, "MAX LENGTH 421 // Only base64 characters"); if( newString[_Prompt] == true) { revert(); } uint256 supply = totalSupply(); if(supply + 1 > 1000) { revert MaxNfts(); } newString[_Prompt] = true; if (msg.sender != owner()) { require(msg.value >= fee, string(abi.encodePacked("Missing fee of ", fee.toString(), " wei"))); } wordsToTokenId[supply + 1] = _Prompt; _safeMint(msg.sender, supply + 1); minted += 1; } function buildImage(string memory _Prompt) private pure returns (bytes memory) { return Base64.encode( abi.encodePacked( '<svg width="500" height="500" xmlns="http://www.w3.org/2000/svg"', " xmlns:xlink='http://www.w3.org/1999/xlink'>", '<rect height="100%" width="100%" y="0" x="0" fill="#0c0c0c"/>', '<defs>', '<path id="path1" d="M7.55,33.94H484M7.55,67.38H484M7.3,100.83H483.74M7.44,134.24H483.88M7.44,167.67H483.88M7.44,201.11H483.88M7.18,234.54H483.62M7.74,267.97H484.19M7.74,301.41H484.19M7.49,334.86H483.92M7.63,368.27H484.07M7.63,401.7H484.07M7.63,435.14H484.07M7.37,468.57H483.8"></path>', '</defs>', '<use xlink:href="#path1" />', '<text font-size="26.47px" fill="whitesmoke" font-family="Courier New">', '<textPath xlink:href="#path1">', _Prompt,'</textPath>',"</text>" "</svg>" ) ); } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require( _exists(_tokenId), "ERC721Metadata: URI query for nonexistent token" ); bytes memory title = abi.encodePacked("Prompt #", _tokenId.toString()); string memory tokenWord = wordsToTokenId[_tokenId]; return string( bytes.concat( "data:application/json;base64,", Base64.encode( abi.encodePacked( "{" '"name":"', title, '",' '"description":"\'', bytes(tokenWord), '\' Prompter is a collection by You and Monas. ",' '"image":"data:image/svg+xml;base64,', buildImage(tokenWord), '"' "}" ) ) ) ); } function getFee() public view returns (uint) { return fee; } function setFee(uint _newFee) public onlyOwner { fee = _newFee; } function withdraw() public payable onlyOwner { (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"MaxNfts","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_Prompt","type":"string"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"newString","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
6080604052662386f26fc10000600c556000600d553480156200002157600080fd5b506040518060400160405280600881526020017f50726f6d707465720000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f54504300000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000a6929190620001b6565b508060019080519060200190620000bf929190620001b6565b505050620000e2620000d6620000e860201b60201c565b620000f060201b60201c565b620002cb565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001c49062000266565b90600052602060002090601f016020900481019282620001e8576000855562000234565b82601f106200020357805160ff191683800117855562000234565b8280016001018555821562000234579182015b828111156200023357825182559160200191906001019062000216565b5b50905062000243919062000247565b5090565b5b808211156200026257600081600090555060010162000248565b5090565b600060028204905060018216806200027f57607f821691505b602082108114156200029657620002956200029c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61443380620002db6000396000f3fe60806040526004361061014b5760003560e01c806370a08231116100b6578063b88d4fde1161006f578063b88d4fde14610495578063c87b56dd146104be578063ced72f87146104fb578063d85d3d2714610526578063e985e9c514610542578063f2fde38b1461057f5761014b565b806370a0823114610385578063715018a6146103c25780638da5cb5b146103d957806395d89b4114610404578063a22cb4651461042f578063a316057e146104585761014b565b80632f745c59116101085780632f745c59146102725780633ccfd60b146102af57806342842e0e146102b95780634f6ccce7146102e25780636352211e1461031f57806369fe0e2d1461035c5761014b565b806301ffc9a71461015057806306fdde031461018d578063081812fc146101b8578063095ea7b3146101f557806318160ddd1461021e57806323b872dd14610249575b600080fd5b34801561015c57600080fd5b50610177600480360381019061017291906129b2565b6105a8565b604051610184919061328c565b60405180910390f35b34801561019957600080fd5b506101a2610622565b6040516101af91906132a7565b60405180910390f35b3480156101c457600080fd5b506101df60048036038101906101da9190612a55565b6106b4565b6040516101ec9190613225565b60405180910390f35b34801561020157600080fd5b5061021c60048036038101906102179190612972565b6106fa565b005b34801561022a57600080fd5b50610233610812565b60405161024091906134e9565b60405180910390f35b34801561025557600080fd5b50610270600480360381019061026b919061285c565b61081f565b005b34801561027e57600080fd5b5061029960048036038101906102949190612972565b61087f565b6040516102a691906134e9565b60405180910390f35b6102b7610924565b005b3480156102c557600080fd5b506102e060048036038101906102db919061285c565b6109ac565b005b3480156102ee57600080fd5b5061030960048036038101906103049190612a55565b6109cc565b60405161031691906134e9565b60405180910390f35b34801561032b57600080fd5b5061034660048036038101906103419190612a55565b610a3d565b6040516103539190613225565b60405180910390f35b34801561036857600080fd5b50610383600480360381019061037e9190612a55565b610aef565b005b34801561039157600080fd5b506103ac60048036038101906103a791906127ef565b610b01565b6040516103b991906134e9565b60405180910390f35b3480156103ce57600080fd5b506103d7610bb9565b005b3480156103e557600080fd5b506103ee610bcd565b6040516103fb9190613225565b60405180910390f35b34801561041057600080fd5b50610419610bf7565b60405161042691906132a7565b60405180910390f35b34801561043b57600080fd5b5061045660048036038101906104519190612932565b610c89565b005b34801561046457600080fd5b5061047f600480360381019061047a9190612a0c565b610c9f565b60405161048c919061328c565b60405180910390f35b3480156104a157600080fd5b506104bc60048036038101906104b791906128af565b610cd5565b005b3480156104ca57600080fd5b506104e560048036038101906104e09190612a55565b610d37565b6040516104f291906132a7565b60405180910390f35b34801561050757600080fd5b50610510610ea9565b60405161051d91906134e9565b60405180910390f35b610540600480360381019061053b9190612a0c565b610eb3565b005b34801561054e57600080fd5b506105696004803603810190610564919061281c565b6110d6565b604051610576919061328c565b60405180910390f35b34801561058b57600080fd5b506105a660048036038101906105a191906127ef565b61116a565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061061b575061061a826111ee565b5b9050919050565b606060008054610631906137a4565b80601f016020809104026020016040519081016040528092919081815260200182805461065d906137a4565b80156106aa5780601f1061067f576101008083540402835291602001916106aa565b820191906000526020600020905b81548152906001019060200180831161068d57829003601f168201915b5050505050905090565b60006106bf826112d0565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061070582610a3d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076d90613489565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661079561131b565b73ffffffffffffffffffffffffffffffffffffffff1614806107c457506107c3816107be61131b565b6110d6565b5b610803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fa906133e9565b60405180910390fd5b61080d8383611323565b505050565b6000600880549050905090565b61083061082a61131b565b826113dc565b61086f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610866906134c9565b60405180910390fd5b61087a838383611471565b505050565b600061088a83610b01565b82106108cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c2906132c9565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61092c6116d8565b6000610936610bcd565b73ffffffffffffffffffffffffffffffffffffffff1647604051610959906131ee565b60006040518083038185875af1925050503d8060008114610996576040519150601f19603f3d011682016040523d82523d6000602084013e61099b565b606091505b50509050806109a957600080fd5b50565b6109c783838360405180602001604052806000815250610cd5565b505050565b60006109d6610812565b8210610a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0e906134a9565b60405180910390fd5b60088281548110610a2b57610a2a61393d565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610add90613469565b60405180910390fd5b80915050919050565b610af76116d8565b80600c8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b69906133c9565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610bc16116d8565b610bcb6000611756565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610c06906137a4565b80601f0160208091040260200160405190810160405280929190818152602001828054610c32906137a4565b8015610c7f5780601f10610c5457610100808354040283529160200191610c7f565b820191906000526020600020905b815481529060010190602001808311610c6257829003601f168201915b5050505050905090565b610c9b610c9461131b565b838361181c565b5050565b600e818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b610ce6610ce061131b565b836113dc565b610d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1c906134c9565b60405180910390fd5b610d3184848484611989565b50505050565b6060610d42826119e5565b610d81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7890613449565b60405180910390fd5b6000610d8c83611a51565b604051602001610d9c9190613203565b60405160208183030381529060405290506000600b60008581526020019081526020016000208054610dcd906137a4565b80601f0160208091040260200160405190810160405280929190818152602001828054610df9906137a4565b8015610e465780601f10610e1b57610100808354040283529160200191610e46565b820191906000526020600020905b815481529060010190602001808311610e2957829003601f168201915b50505050509050610e818282610e5b84611bb2565b604051602001610e6d939291906130ae565b604051602081830303815290604052611be3565b604051602001610e9191906131c8565b60405160208183030381529060405292505050919050565b6000600c54905090565b6101a581511115610ef9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef0906132e9565b60405180910390fd5b60011515600e82604051610f0d9190613097565b908152602001604051809103902060009054906101000a900460ff1615151415610f3657600080fd5b6000610f40610812565b90506103e8600182610f5291906135d9565b1115610f8a576040517f1e7e0e9600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600e83604051610f9c9190613097565b908152602001604051809103902060006101000a81548160ff021916908315150217905550610fc9610bcd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461106e57600c5434101561100c600c54611a51565b60405160200161101c919061310b565b6040516020818303038152906040529061106c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106391906132a7565b60405180910390fd5b505b81600b600060018461108091906135d9565b815260200190815260200160002090805190602001906110a1929190612603565b506110b8336001836110b391906135d9565b611d68565b6001600d60008282546110cb91906135d9565b925050819055505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111726116d8565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d990613329565b60405180910390fd5b6111eb81611756565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806112b957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806112c957506112c882611d86565b5b9050919050565b6112d9816119e5565b611318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130f90613469565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661139683610a3d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806113e883610a3d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061142a575061142981856110d6565b5b8061146857508373ffffffffffffffffffffffffffffffffffffffff16611450846106b4565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661149182610a3d565b73ffffffffffffffffffffffffffffffffffffffff16146114e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114de90613349565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154e90613389565b60405180910390fd5b611562838383611df0565b61156d600082611323565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115bd91906136ba565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461161491906135d9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46116d3838383611f04565b505050565b6116e061131b565b73ffffffffffffffffffffffffffffffffffffffff166116fe610bcd565b73ffffffffffffffffffffffffffffffffffffffff1614611754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174b90613429565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561188b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611882906133a9565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161197c919061328c565b60405180910390a3505050565b611994848484611471565b6119a084848484611f09565b6119df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d690613309565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60606000821415611a99576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611bad565b600082905060005b60008214611acb578080611ab490613807565b915050600a82611ac4919061362f565b9150611aa1565b60008167ffffffffffffffff811115611ae757611ae661396c565b5b6040519080825280601f01601f191660200182016040528015611b195781602001600182028036833780820191505090505b5090505b60008514611ba657600182611b3291906136ba565b9150600a85611b419190613850565b6030611b4d91906135d9565b60f81b818381518110611b6357611b6261393d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611b9f919061362f565b9450611b1d565b8093505050505b919050565b6060611bdc82604051602001611bc89190613138565b604051602081830303815290604052611be3565b9050919050565b6060600082511415611c0657604051806020016040528060008152509050611d63565b60006040518060600160405280604081526020016143be6040913990506000600360028551611c3591906135d9565b611c3f919061362f565b6004611c4b9190613660565b90506000602082611c5c91906135d9565b67ffffffffffffffff811115611c7557611c7461396c565b5b6040519080825280601f01601f191660200182016040528015611ca75781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015611d22576003830192508251603f8160121c1685015160f81b8252600182019150603f81600c1c1685015160f81b8252600182019150603f8160061c1685015160f81b8252600182019150603f811685015160f81b825260018201915050611cbb565b600389510660018114611d3c5760028114611d4c57611d57565b613d3d60f01b6002830352611d57565b603d60f81b60018303525b50505050508093505050505b919050565b611d828282604051806020016040528060008152506120a0565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611dfb8383836120fb565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e3e57611e3981612100565b611e7d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611e7c57611e7b8382612149565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ec057611ebb816122b6565b611eff565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611efe57611efd8282612387565b5b5b505050565b505050565b6000611f2a8473ffffffffffffffffffffffffffffffffffffffff16612406565b15612093578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f5361131b565b8786866040518563ffffffff1660e01b8152600401611f759493929190613240565b602060405180830381600087803b158015611f8f57600080fd5b505af1925050508015611fc057506040513d601f19601f82011682018060405250810190611fbd91906129df565b60015b612043573d8060008114611ff0576040519150601f19603f3d011682016040523d82523d6000602084013e611ff5565b606091505b5060008151141561203b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203290613309565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612098565b600190505b949350505050565b6120aa8383612429565b6120b76000848484611f09565b6120f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ed90613309565b60405180910390fd5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161215684610b01565b61216091906136ba565b9050600060076000848152602001908152602001600020549050818114612245576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506122ca91906136ba565b90506000600960008481526020019081526020016000205490506000600883815481106122fa576122f961393d565b5b90600052602060002001549050806008838154811061231c5761231b61393d565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061236b5761236a61390e565b5b6001900381819060005260206000200160009055905550505050565b600061239283610b01565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612499576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249090613409565b60405180910390fd5b6124a2816119e5565b156124e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d990613369565b60405180910390fd5b6124ee60008383611df0565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461253e91906135d9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125ff60008383611f04565b5050565b82805461260f906137a4565b90600052602060002090601f0160209004810192826126315760008555612678565b82601f1061264a57805160ff1916838001178555612678565b82800160010185558215612678579182015b8281111561267757825182559160200191906001019061265c565b5b5090506126859190612689565b5090565b5b808211156126a257600081600090555060010161268a565b5090565b60006126b96126b484613529565b613504565b9050828152602081018484840111156126d5576126d46139a0565b5b6126e0848285613762565b509392505050565b60006126fb6126f68461355a565b613504565b905082815260208101848484011115612717576127166139a0565b5b612722848285613762565b509392505050565b60008135905061273981614361565b92915050565b60008135905061274e81614378565b92915050565b6000813590506127638161438f565b92915050565b6000815190506127788161438f565b92915050565b600082601f8301126127935761279261399b565b5b81356127a38482602086016126a6565b91505092915050565b600082601f8301126127c1576127c061399b565b5b81356127d18482602086016126e8565b91505092915050565b6000813590506127e9816143a6565b92915050565b600060208284031215612805576128046139aa565b5b60006128138482850161272a565b91505092915050565b60008060408385031215612833576128326139aa565b5b60006128418582860161272a565b92505060206128528582860161272a565b9150509250929050565b600080600060608486031215612875576128746139aa565b5b60006128838682870161272a565b93505060206128948682870161272a565b92505060406128a5868287016127da565b9150509250925092565b600080600080608085870312156128c9576128c86139aa565b5b60006128d78782880161272a565b94505060206128e88782880161272a565b93505060406128f9878288016127da565b925050606085013567ffffffffffffffff81111561291a576129196139a5565b5b6129268782880161277e565b91505092959194509250565b60008060408385031215612949576129486139aa565b5b60006129578582860161272a565b92505060206129688582860161273f565b9150509250929050565b60008060408385031215612989576129886139aa565b5b60006129978582860161272a565b92505060206129a8858286016127da565b9150509250929050565b6000602082840312156129c8576129c76139aa565b5b60006129d684828501612754565b91505092915050565b6000602082840312156129f5576129f46139aa565b5b6000612a0384828501612769565b91505092915050565b600060208284031215612a2257612a216139aa565b5b600082013567ffffffffffffffff811115612a4057612a3f6139a5565b5b612a4c848285016127ac565b91505092915050565b600060208284031215612a6b57612a6a6139aa565b5b6000612a79848285016127da565b91505092915050565b612a8b816136ee565b82525050565b612a9a81613700565b82525050565b6000612aab8261358b565b612ab581856135a1565b9350612ac5818560208601613771565b612ace816139af565b840191505092915050565b6000612ae48261358b565b612aee81856135b2565b9350612afe818560208601613771565b80840191505092915050565b6000612b1582613596565b612b1f81856135bd565b9350612b2f818560208601613771565b612b38816139af565b840191505092915050565b6000612b4e82613596565b612b5881856135ce565b9350612b68818560208601613771565b80840191505092915050565b6000612b8261011c836135ce565b9150612b8d826139c0565b61011c82019050919050565b6000612ba66009836135ce565b9150612bb182613b1a565b600982019050919050565b6000612bc9600f836135ce565b9150612bd482613b43565b600f82019050919050565b6000612bec602b836135bd565b9150612bf782613b6c565b604082019050919050565b6000612c0f6028836135bd565b9150612c1a82613bbb565b604082019050919050565b6000612c326032836135bd565b9150612c3d82613c0a565b604082019050919050565b6000612c556026836135bd565b9150612c6082613c59565b604082019050919050565b6000612c786025836135bd565b9150612c8382613ca8565b604082019050919050565b6000612c9b601c836135bd565b9150612ca682613cf7565b602082019050919050565b6000612cbe601e836135ce565b9150612cc982613d20565b601e82019050919050565b6000612ce1603d836135ce565b9150612cec82613d49565b603d82019050919050565b6000612d046040836135ce565b9150612d0f82613d98565b604082019050919050565b6000612d276046836135ce565b9150612d3282613de7565b604682019050919050565b6000612d4a6024836135bd565b9150612d5582613e5c565b604082019050919050565b6000612d6d6019836135bd565b9150612d7882613eab565b602082019050919050565b6000612d90601b836135ce565b9150612d9b82613ed4565b601b82019050919050565b6000612db3600d836135ce565b9150612dbe82613efd565b600d82019050919050565b6000612dd66004836135ce565b9150612de182613f26565b600482019050919050565b6000612df96029836135bd565b9150612e0482613f4f565b604082019050919050565b6000612e1c6012836135ce565b9150612e2782613f9e565b601282019050919050565b6000612e3f6002836135ce565b9150612e4a82613fc7565b600282019050919050565b6000612e62602c836135ce565b9150612e6d82613ff0565b602c82019050919050565b6000612e85603e836135bd565b9150612e908261403f565b604082019050919050565b6000612ea86020836135bd565b9150612eb38261408e565b602082019050919050565b6000612ecb6020836135bd565b9150612ed6826140b7565b602082019050919050565b6000612eee602f836135bd565b9150612ef9826140e0565b604082019050919050565b6000612f116018836135bd565b9150612f1c8261412f565b602082019050919050565b6000612f34600b836135ce565b9150612f3f82614158565b600b82019050919050565b6000612f576053836135ce565b9150612f6282614181565b605382019050919050565b6000612f7a6021836135bd565b9150612f85826141f6565b604082019050919050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815250565b6000612fc36007836135ce565b9150612fce82614245565b600782019050919050565b6000612fe66000836135b2565b9150612ff18261426e565b600082019050919050565b60006130096006836135ce565b915061301482614271565b600682019050919050565b600061302c602c836135bd565b91506130378261429a565b604082019050919050565b600061304f6008836135ce565b915061305a826142e9565b600882019050919050565b6000613072602e836135bd565b915061307d82614312565b604082019050919050565b61309181613758565b82525050565b60006130a38284612b43565b915081905092915050565b60006130b982612b99565b91506130c58286612ad9565b91506130d082612e0f565b91506130dc8285612ad9565b91506130e782612f4a565b91506130f38284612ad9565b91506130fe82612e32565b9150819050949350505050565b600061311682612bbc565b91506131228284612b43565b915061312d82612dc9565b915081905092915050565b600061314382612cf7565b915061314e82612e55565b915061315982612cd4565b915061316482612ffc565b915061316f82612b74565b915061317a82612fb6565b915061318582612d83565b915061319082612d1a565b915061319b82612cb1565b91506131a78284612b43565b91506131b282612f27565b91506131bd82612da6565b915081905092915050565b60006131d382612f90565b601d820191506131e38284612ad9565b915081905092915050565b60006131f982612fd9565b9150819050919050565b600061320e82613042565b915061321a8284612b43565b915081905092915050565b600060208201905061323a6000830184612a82565b92915050565b60006080820190506132556000830187612a82565b6132626020830186612a82565b61326f6040830185613088565b81810360608301526132818184612aa0565b905095945050505050565b60006020820190506132a16000830184612a91565b92915050565b600060208201905081810360008301526132c18184612b0a565b905092915050565b600060208201905081810360008301526132e281612bdf565b9050919050565b6000602082019050818103600083015261330281612c02565b9050919050565b6000602082019050818103600083015261332281612c25565b9050919050565b6000602082019050818103600083015261334281612c48565b9050919050565b6000602082019050818103600083015261336281612c6b565b9050919050565b6000602082019050818103600083015261338281612c8e565b9050919050565b600060208201905081810360008301526133a281612d3d565b9050919050565b600060208201905081810360008301526133c281612d60565b9050919050565b600060208201905081810360008301526133e281612dec565b9050919050565b6000602082019050818103600083015261340281612e78565b9050919050565b6000602082019050818103600083015261342281612e9b565b9050919050565b6000602082019050818103600083015261344281612ebe565b9050919050565b6000602082019050818103600083015261346281612ee1565b9050919050565b6000602082019050818103600083015261348281612f04565b9050919050565b600060208201905081810360008301526134a281612f6d565b9050919050565b600060208201905081810360008301526134c28161301f565b9050919050565b600060208201905081810360008301526134e281613065565b9050919050565b60006020820190506134fe6000830184613088565b92915050565b600061350e61351f565b905061351a82826137d6565b919050565b6000604051905090565b600067ffffffffffffffff8211156135445761354361396c565b5b61354d826139af565b9050602081019050919050565b600067ffffffffffffffff8211156135755761357461396c565b5b61357e826139af565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006135e482613758565b91506135ef83613758565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561362457613623613881565b5b828201905092915050565b600061363a82613758565b915061364583613758565b925082613655576136546138b0565b5b828204905092915050565b600061366b82613758565b915061367683613758565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156136af576136ae613881565b5b828202905092915050565b60006136c582613758565b91506136d083613758565b9250828210156136e3576136e2613881565b5b828203905092915050565b60006136f982613738565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561378f578082015181840152602081019050613774565b8381111561379e576000848401525b50505050565b600060028204905060018216806137bc57607f821691505b602082108114156137d0576137cf6138df565b5b50919050565b6137df826139af565b810181811067ffffffffffffffff821117156137fe576137fd61396c565b5b80604052505050565b600061381282613758565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561384557613844613881565b5b600182019050919050565b600061385b82613758565b915061386683613758565b925082613876576138756138b0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f3c706174682069643d2270617468312220643d224d372e35352c33332e39344860008201527f3438344d372e35352c36372e3338483438344d372e332c3130302e383348343860208201527f332e37344d372e34342c3133342e3234483438332e38384d372e34342c31363760408201527f2e3637483438332e38384d372e34342c3230312e3131483438332e38384d372e60608201527f31382c3233342e3534483438332e36324d372e37342c3236372e39374834383460808201527f2e31394d372e37342c3330312e3431483438342e31394d372e34392c3333342e60a08201527f3836483438332e39324d372e36332c3336382e3237483438342e30374d372e3660c08201527f332c3430312e37483438342e30374d372e36332c3433352e3134483438342e3060e08201527f374d372e33372c3436382e3537483438332e38223e3c2f706174683e0000000061010082015250565b7f7b226e616d65223a220000000000000000000000000000000000000000000000600082015250565b7f4d697373696e6720666565206f66200000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4d4158204c454e47544820343231202f2f204f6e6c792062617365363420636860008201527f6172616374657273000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f3c746578745061746820786c696e6b3a687265663d22237061746831223e0000600082015250565b7f3c72656374206865696768743d2231303025222077696474683d22313030252260008201527f20793d22302220783d2230222066696c6c3d2223306330633063222f3e000000602082015250565b7f3c7376672077696474683d2235303022206865696768743d223530302220786d60008201527f6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722602082015250565b7f3c7465787420666f6e742d73697a653d2232362e34377078222066696c6c3d2260008201527f7768697465736d6f6b652220666f6e742d66616d696c793d22436f757269657260208201527f204e6577223e0000000000000000000000000000000000000000000000000000604082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f3c75736520786c696e6b3a687265663d2223706174683122202f3e0000000000600082015250565b7f3c2f746578743e3c2f7376673e00000000000000000000000000000000000000600082015250565b7f2077656900000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f222c226465736372697074696f6e223a22270000000000000000000000000000600082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f20786d6c6e733a786c696e6b3d27687474703a2f2f7777772e77332e6f72672f60008201527f313939392f786c696e6b273e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f3c2f74657874506174683e000000000000000000000000000000000000000000600082015250565b7f272050726f6d70746572206973206120636f6c6c656374696f6e20627920596f60008201527f7520616e64204d6f6e61732e2020222c22696d616765223a22646174613a696d60208201527f6167652f7376672b786d6c3b6261736536342c00000000000000000000000000604082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f3c2f646566733e00000000000000000000000000000000000000000000000000600082015250565b50565b7f3c646566733e0000000000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f50726f6d70742023000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b61436a816136ee565b811461437557600080fd5b50565b61438181613700565b811461438c57600080fd5b50565b6143988161370c565b81146143a357600080fd5b50565b6143af81613758565b81146143ba57600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212208ee8d8f35c1247a3365d7b75e5908951a3a327280a51d943117f89313469e6a764736f6c63430008070033
Deployed Bytecode
0x60806040526004361061014b5760003560e01c806370a08231116100b6578063b88d4fde1161006f578063b88d4fde14610495578063c87b56dd146104be578063ced72f87146104fb578063d85d3d2714610526578063e985e9c514610542578063f2fde38b1461057f5761014b565b806370a0823114610385578063715018a6146103c25780638da5cb5b146103d957806395d89b4114610404578063a22cb4651461042f578063a316057e146104585761014b565b80632f745c59116101085780632f745c59146102725780633ccfd60b146102af57806342842e0e146102b95780634f6ccce7146102e25780636352211e1461031f57806369fe0e2d1461035c5761014b565b806301ffc9a71461015057806306fdde031461018d578063081812fc146101b8578063095ea7b3146101f557806318160ddd1461021e57806323b872dd14610249575b600080fd5b34801561015c57600080fd5b50610177600480360381019061017291906129b2565b6105a8565b604051610184919061328c565b60405180910390f35b34801561019957600080fd5b506101a2610622565b6040516101af91906132a7565b60405180910390f35b3480156101c457600080fd5b506101df60048036038101906101da9190612a55565b6106b4565b6040516101ec9190613225565b60405180910390f35b34801561020157600080fd5b5061021c60048036038101906102179190612972565b6106fa565b005b34801561022a57600080fd5b50610233610812565b60405161024091906134e9565b60405180910390f35b34801561025557600080fd5b50610270600480360381019061026b919061285c565b61081f565b005b34801561027e57600080fd5b5061029960048036038101906102949190612972565b61087f565b6040516102a691906134e9565b60405180910390f35b6102b7610924565b005b3480156102c557600080fd5b506102e060048036038101906102db919061285c565b6109ac565b005b3480156102ee57600080fd5b5061030960048036038101906103049190612a55565b6109cc565b60405161031691906134e9565b60405180910390f35b34801561032b57600080fd5b5061034660048036038101906103419190612a55565b610a3d565b6040516103539190613225565b60405180910390f35b34801561036857600080fd5b50610383600480360381019061037e9190612a55565b610aef565b005b34801561039157600080fd5b506103ac60048036038101906103a791906127ef565b610b01565b6040516103b991906134e9565b60405180910390f35b3480156103ce57600080fd5b506103d7610bb9565b005b3480156103e557600080fd5b506103ee610bcd565b6040516103fb9190613225565b60405180910390f35b34801561041057600080fd5b50610419610bf7565b60405161042691906132a7565b60405180910390f35b34801561043b57600080fd5b5061045660048036038101906104519190612932565b610c89565b005b34801561046457600080fd5b5061047f600480360381019061047a9190612a0c565b610c9f565b60405161048c919061328c565b60405180910390f35b3480156104a157600080fd5b506104bc60048036038101906104b791906128af565b610cd5565b005b3480156104ca57600080fd5b506104e560048036038101906104e09190612a55565b610d37565b6040516104f291906132a7565b60405180910390f35b34801561050757600080fd5b50610510610ea9565b60405161051d91906134e9565b60405180910390f35b610540600480360381019061053b9190612a0c565b610eb3565b005b34801561054e57600080fd5b506105696004803603810190610564919061281c565b6110d6565b604051610576919061328c565b60405180910390f35b34801561058b57600080fd5b506105a660048036038101906105a191906127ef565b61116a565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061061b575061061a826111ee565b5b9050919050565b606060008054610631906137a4565b80601f016020809104026020016040519081016040528092919081815260200182805461065d906137a4565b80156106aa5780601f1061067f576101008083540402835291602001916106aa565b820191906000526020600020905b81548152906001019060200180831161068d57829003601f168201915b5050505050905090565b60006106bf826112d0565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061070582610a3d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076d90613489565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661079561131b565b73ffffffffffffffffffffffffffffffffffffffff1614806107c457506107c3816107be61131b565b6110d6565b5b610803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fa906133e9565b60405180910390fd5b61080d8383611323565b505050565b6000600880549050905090565b61083061082a61131b565b826113dc565b61086f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610866906134c9565b60405180910390fd5b61087a838383611471565b505050565b600061088a83610b01565b82106108cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c2906132c9565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61092c6116d8565b6000610936610bcd565b73ffffffffffffffffffffffffffffffffffffffff1647604051610959906131ee565b60006040518083038185875af1925050503d8060008114610996576040519150601f19603f3d011682016040523d82523d6000602084013e61099b565b606091505b50509050806109a957600080fd5b50565b6109c783838360405180602001604052806000815250610cd5565b505050565b60006109d6610812565b8210610a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0e906134a9565b60405180910390fd5b60088281548110610a2b57610a2a61393d565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610add90613469565b60405180910390fd5b80915050919050565b610af76116d8565b80600c8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b69906133c9565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610bc16116d8565b610bcb6000611756565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610c06906137a4565b80601f0160208091040260200160405190810160405280929190818152602001828054610c32906137a4565b8015610c7f5780601f10610c5457610100808354040283529160200191610c7f565b820191906000526020600020905b815481529060010190602001808311610c6257829003601f168201915b5050505050905090565b610c9b610c9461131b565b838361181c565b5050565b600e818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b610ce6610ce061131b565b836113dc565b610d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1c906134c9565b60405180910390fd5b610d3184848484611989565b50505050565b6060610d42826119e5565b610d81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7890613449565b60405180910390fd5b6000610d8c83611a51565b604051602001610d9c9190613203565b60405160208183030381529060405290506000600b60008581526020019081526020016000208054610dcd906137a4565b80601f0160208091040260200160405190810160405280929190818152602001828054610df9906137a4565b8015610e465780601f10610e1b57610100808354040283529160200191610e46565b820191906000526020600020905b815481529060010190602001808311610e2957829003601f168201915b50505050509050610e818282610e5b84611bb2565b604051602001610e6d939291906130ae565b604051602081830303815290604052611be3565b604051602001610e9191906131c8565b60405160208183030381529060405292505050919050565b6000600c54905090565b6101a581511115610ef9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef0906132e9565b60405180910390fd5b60011515600e82604051610f0d9190613097565b908152602001604051809103902060009054906101000a900460ff1615151415610f3657600080fd5b6000610f40610812565b90506103e8600182610f5291906135d9565b1115610f8a576040517f1e7e0e9600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600e83604051610f9c9190613097565b908152602001604051809103902060006101000a81548160ff021916908315150217905550610fc9610bcd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461106e57600c5434101561100c600c54611a51565b60405160200161101c919061310b565b6040516020818303038152906040529061106c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106391906132a7565b60405180910390fd5b505b81600b600060018461108091906135d9565b815260200190815260200160002090805190602001906110a1929190612603565b506110b8336001836110b391906135d9565b611d68565b6001600d60008282546110cb91906135d9565b925050819055505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111726116d8565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d990613329565b60405180910390fd5b6111eb81611756565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806112b957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806112c957506112c882611d86565b5b9050919050565b6112d9816119e5565b611318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130f90613469565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661139683610a3d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806113e883610a3d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061142a575061142981856110d6565b5b8061146857508373ffffffffffffffffffffffffffffffffffffffff16611450846106b4565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661149182610a3d565b73ffffffffffffffffffffffffffffffffffffffff16146114e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114de90613349565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154e90613389565b60405180910390fd5b611562838383611df0565b61156d600082611323565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115bd91906136ba565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461161491906135d9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46116d3838383611f04565b505050565b6116e061131b565b73ffffffffffffffffffffffffffffffffffffffff166116fe610bcd565b73ffffffffffffffffffffffffffffffffffffffff1614611754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174b90613429565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561188b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611882906133a9565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161197c919061328c565b60405180910390a3505050565b611994848484611471565b6119a084848484611f09565b6119df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d690613309565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60606000821415611a99576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611bad565b600082905060005b60008214611acb578080611ab490613807565b915050600a82611ac4919061362f565b9150611aa1565b60008167ffffffffffffffff811115611ae757611ae661396c565b5b6040519080825280601f01601f191660200182016040528015611b195781602001600182028036833780820191505090505b5090505b60008514611ba657600182611b3291906136ba565b9150600a85611b419190613850565b6030611b4d91906135d9565b60f81b818381518110611b6357611b6261393d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611b9f919061362f565b9450611b1d565b8093505050505b919050565b6060611bdc82604051602001611bc89190613138565b604051602081830303815290604052611be3565b9050919050565b6060600082511415611c0657604051806020016040528060008152509050611d63565b60006040518060600160405280604081526020016143be6040913990506000600360028551611c3591906135d9565b611c3f919061362f565b6004611c4b9190613660565b90506000602082611c5c91906135d9565b67ffffffffffffffff811115611c7557611c7461396c565b5b6040519080825280601f01601f191660200182016040528015611ca75781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015611d22576003830192508251603f8160121c1685015160f81b8252600182019150603f81600c1c1685015160f81b8252600182019150603f8160061c1685015160f81b8252600182019150603f811685015160f81b825260018201915050611cbb565b600389510660018114611d3c5760028114611d4c57611d57565b613d3d60f01b6002830352611d57565b603d60f81b60018303525b50505050508093505050505b919050565b611d828282604051806020016040528060008152506120a0565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611dfb8383836120fb565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e3e57611e3981612100565b611e7d565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611e7c57611e7b8382612149565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ec057611ebb816122b6565b611eff565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611efe57611efd8282612387565b5b5b505050565b505050565b6000611f2a8473ffffffffffffffffffffffffffffffffffffffff16612406565b15612093578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f5361131b565b8786866040518563ffffffff1660e01b8152600401611f759493929190613240565b602060405180830381600087803b158015611f8f57600080fd5b505af1925050508015611fc057506040513d601f19601f82011682018060405250810190611fbd91906129df565b60015b612043573d8060008114611ff0576040519150601f19603f3d011682016040523d82523d6000602084013e611ff5565b606091505b5060008151141561203b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203290613309565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612098565b600190505b949350505050565b6120aa8383612429565b6120b76000848484611f09565b6120f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ed90613309565b60405180910390fd5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161215684610b01565b61216091906136ba565b9050600060076000848152602001908152602001600020549050818114612245576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506122ca91906136ba565b90506000600960008481526020019081526020016000205490506000600883815481106122fa576122f961393d565b5b90600052602060002001549050806008838154811061231c5761231b61393d565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061236b5761236a61390e565b5b6001900381819060005260206000200160009055905550505050565b600061239283610b01565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612499576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249090613409565b60405180910390fd5b6124a2816119e5565b156124e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d990613369565b60405180910390fd5b6124ee60008383611df0565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461253e91906135d9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125ff60008383611f04565b5050565b82805461260f906137a4565b90600052602060002090601f0160209004810192826126315760008555612678565b82601f1061264a57805160ff1916838001178555612678565b82800160010185558215612678579182015b8281111561267757825182559160200191906001019061265c565b5b5090506126859190612689565b5090565b5b808211156126a257600081600090555060010161268a565b5090565b60006126b96126b484613529565b613504565b9050828152602081018484840111156126d5576126d46139a0565b5b6126e0848285613762565b509392505050565b60006126fb6126f68461355a565b613504565b905082815260208101848484011115612717576127166139a0565b5b612722848285613762565b509392505050565b60008135905061273981614361565b92915050565b60008135905061274e81614378565b92915050565b6000813590506127638161438f565b92915050565b6000815190506127788161438f565b92915050565b600082601f8301126127935761279261399b565b5b81356127a38482602086016126a6565b91505092915050565b600082601f8301126127c1576127c061399b565b5b81356127d18482602086016126e8565b91505092915050565b6000813590506127e9816143a6565b92915050565b600060208284031215612805576128046139aa565b5b60006128138482850161272a565b91505092915050565b60008060408385031215612833576128326139aa565b5b60006128418582860161272a565b92505060206128528582860161272a565b9150509250929050565b600080600060608486031215612875576128746139aa565b5b60006128838682870161272a565b93505060206128948682870161272a565b92505060406128a5868287016127da565b9150509250925092565b600080600080608085870312156128c9576128c86139aa565b5b60006128d78782880161272a565b94505060206128e88782880161272a565b93505060406128f9878288016127da565b925050606085013567ffffffffffffffff81111561291a576129196139a5565b5b6129268782880161277e565b91505092959194509250565b60008060408385031215612949576129486139aa565b5b60006129578582860161272a565b92505060206129688582860161273f565b9150509250929050565b60008060408385031215612989576129886139aa565b5b60006129978582860161272a565b92505060206129a8858286016127da565b9150509250929050565b6000602082840312156129c8576129c76139aa565b5b60006129d684828501612754565b91505092915050565b6000602082840312156129f5576129f46139aa565b5b6000612a0384828501612769565b91505092915050565b600060208284031215612a2257612a216139aa565b5b600082013567ffffffffffffffff811115612a4057612a3f6139a5565b5b612a4c848285016127ac565b91505092915050565b600060208284031215612a6b57612a6a6139aa565b5b6000612a79848285016127da565b91505092915050565b612a8b816136ee565b82525050565b612a9a81613700565b82525050565b6000612aab8261358b565b612ab581856135a1565b9350612ac5818560208601613771565b612ace816139af565b840191505092915050565b6000612ae48261358b565b612aee81856135b2565b9350612afe818560208601613771565b80840191505092915050565b6000612b1582613596565b612b1f81856135bd565b9350612b2f818560208601613771565b612b38816139af565b840191505092915050565b6000612b4e82613596565b612b5881856135ce565b9350612b68818560208601613771565b80840191505092915050565b6000612b8261011c836135ce565b9150612b8d826139c0565b61011c82019050919050565b6000612ba66009836135ce565b9150612bb182613b1a565b600982019050919050565b6000612bc9600f836135ce565b9150612bd482613b43565b600f82019050919050565b6000612bec602b836135bd565b9150612bf782613b6c565b604082019050919050565b6000612c0f6028836135bd565b9150612c1a82613bbb565b604082019050919050565b6000612c326032836135bd565b9150612c3d82613c0a565b604082019050919050565b6000612c556026836135bd565b9150612c6082613c59565b604082019050919050565b6000612c786025836135bd565b9150612c8382613ca8565b604082019050919050565b6000612c9b601c836135bd565b9150612ca682613cf7565b602082019050919050565b6000612cbe601e836135ce565b9150612cc982613d20565b601e82019050919050565b6000612ce1603d836135ce565b9150612cec82613d49565b603d82019050919050565b6000612d046040836135ce565b9150612d0f82613d98565b604082019050919050565b6000612d276046836135ce565b9150612d3282613de7565b604682019050919050565b6000612d4a6024836135bd565b9150612d5582613e5c565b604082019050919050565b6000612d6d6019836135bd565b9150612d7882613eab565b602082019050919050565b6000612d90601b836135ce565b9150612d9b82613ed4565b601b82019050919050565b6000612db3600d836135ce565b9150612dbe82613efd565b600d82019050919050565b6000612dd66004836135ce565b9150612de182613f26565b600482019050919050565b6000612df96029836135bd565b9150612e0482613f4f565b604082019050919050565b6000612e1c6012836135ce565b9150612e2782613f9e565b601282019050919050565b6000612e3f6002836135ce565b9150612e4a82613fc7565b600282019050919050565b6000612e62602c836135ce565b9150612e6d82613ff0565b602c82019050919050565b6000612e85603e836135bd565b9150612e908261403f565b604082019050919050565b6000612ea86020836135bd565b9150612eb38261408e565b602082019050919050565b6000612ecb6020836135bd565b9150612ed6826140b7565b602082019050919050565b6000612eee602f836135bd565b9150612ef9826140e0565b604082019050919050565b6000612f116018836135bd565b9150612f1c8261412f565b602082019050919050565b6000612f34600b836135ce565b9150612f3f82614158565b600b82019050919050565b6000612f576053836135ce565b9150612f6282614181565b605382019050919050565b6000612f7a6021836135bd565b9150612f85826141f6565b604082019050919050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815250565b6000612fc36007836135ce565b9150612fce82614245565b600782019050919050565b6000612fe66000836135b2565b9150612ff18261426e565b600082019050919050565b60006130096006836135ce565b915061301482614271565b600682019050919050565b600061302c602c836135bd565b91506130378261429a565b604082019050919050565b600061304f6008836135ce565b915061305a826142e9565b600882019050919050565b6000613072602e836135bd565b915061307d82614312565b604082019050919050565b61309181613758565b82525050565b60006130a38284612b43565b915081905092915050565b60006130b982612b99565b91506130c58286612ad9565b91506130d082612e0f565b91506130dc8285612ad9565b91506130e782612f4a565b91506130f38284612ad9565b91506130fe82612e32565b9150819050949350505050565b600061311682612bbc565b91506131228284612b43565b915061312d82612dc9565b915081905092915050565b600061314382612cf7565b915061314e82612e55565b915061315982612cd4565b915061316482612ffc565b915061316f82612b74565b915061317a82612fb6565b915061318582612d83565b915061319082612d1a565b915061319b82612cb1565b91506131a78284612b43565b91506131b282612f27565b91506131bd82612da6565b915081905092915050565b60006131d382612f90565b601d820191506131e38284612ad9565b915081905092915050565b60006131f982612fd9565b9150819050919050565b600061320e82613042565b915061321a8284612b43565b915081905092915050565b600060208201905061323a6000830184612a82565b92915050565b60006080820190506132556000830187612a82565b6132626020830186612a82565b61326f6040830185613088565b81810360608301526132818184612aa0565b905095945050505050565b60006020820190506132a16000830184612a91565b92915050565b600060208201905081810360008301526132c18184612b0a565b905092915050565b600060208201905081810360008301526132e281612bdf565b9050919050565b6000602082019050818103600083015261330281612c02565b9050919050565b6000602082019050818103600083015261332281612c25565b9050919050565b6000602082019050818103600083015261334281612c48565b9050919050565b6000602082019050818103600083015261336281612c6b565b9050919050565b6000602082019050818103600083015261338281612c8e565b9050919050565b600060208201905081810360008301526133a281612d3d565b9050919050565b600060208201905081810360008301526133c281612d60565b9050919050565b600060208201905081810360008301526133e281612dec565b9050919050565b6000602082019050818103600083015261340281612e78565b9050919050565b6000602082019050818103600083015261342281612e9b565b9050919050565b6000602082019050818103600083015261344281612ebe565b9050919050565b6000602082019050818103600083015261346281612ee1565b9050919050565b6000602082019050818103600083015261348281612f04565b9050919050565b600060208201905081810360008301526134a281612f6d565b9050919050565b600060208201905081810360008301526134c28161301f565b9050919050565b600060208201905081810360008301526134e281613065565b9050919050565b60006020820190506134fe6000830184613088565b92915050565b600061350e61351f565b905061351a82826137d6565b919050565b6000604051905090565b600067ffffffffffffffff8211156135445761354361396c565b5b61354d826139af565b9050602081019050919050565b600067ffffffffffffffff8211156135755761357461396c565b5b61357e826139af565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006135e482613758565b91506135ef83613758565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561362457613623613881565b5b828201905092915050565b600061363a82613758565b915061364583613758565b925082613655576136546138b0565b5b828204905092915050565b600061366b82613758565b915061367683613758565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156136af576136ae613881565b5b828202905092915050565b60006136c582613758565b91506136d083613758565b9250828210156136e3576136e2613881565b5b828203905092915050565b60006136f982613738565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561378f578082015181840152602081019050613774565b8381111561379e576000848401525b50505050565b600060028204905060018216806137bc57607f821691505b602082108114156137d0576137cf6138df565b5b50919050565b6137df826139af565b810181811067ffffffffffffffff821117156137fe576137fd61396c565b5b80604052505050565b600061381282613758565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561384557613844613881565b5b600182019050919050565b600061385b82613758565b915061386683613758565b925082613876576138756138b0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f3c706174682069643d2270617468312220643d224d372e35352c33332e39344860008201527f3438344d372e35352c36372e3338483438344d372e332c3130302e383348343860208201527f332e37344d372e34342c3133342e3234483438332e38384d372e34342c31363760408201527f2e3637483438332e38384d372e34342c3230312e3131483438332e38384d372e60608201527f31382c3233342e3534483438332e36324d372e37342c3236372e39374834383460808201527f2e31394d372e37342c3330312e3431483438342e31394d372e34392c3333342e60a08201527f3836483438332e39324d372e36332c3336382e3237483438342e30374d372e3660c08201527f332c3430312e37483438342e30374d372e36332c3433352e3134483438342e3060e08201527f374d372e33372c3436382e3537483438332e38223e3c2f706174683e0000000061010082015250565b7f7b226e616d65223a220000000000000000000000000000000000000000000000600082015250565b7f4d697373696e6720666565206f66200000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4d4158204c454e47544820343231202f2f204f6e6c792062617365363420636860008201527f6172616374657273000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f3c746578745061746820786c696e6b3a687265663d22237061746831223e0000600082015250565b7f3c72656374206865696768743d2231303025222077696474683d22313030252260008201527f20793d22302220783d2230222066696c6c3d2223306330633063222f3e000000602082015250565b7f3c7376672077696474683d2235303022206865696768743d223530302220786d60008201527f6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722602082015250565b7f3c7465787420666f6e742d73697a653d2232362e34377078222066696c6c3d2260008201527f7768697465736d6f6b652220666f6e742d66616d696c793d22436f757269657260208201527f204e6577223e0000000000000000000000000000000000000000000000000000604082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f3c75736520786c696e6b3a687265663d2223706174683122202f3e0000000000600082015250565b7f3c2f746578743e3c2f7376673e00000000000000000000000000000000000000600082015250565b7f2077656900000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f222c226465736372697074696f6e223a22270000000000000000000000000000600082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f20786d6c6e733a786c696e6b3d27687474703a2f2f7777772e77332e6f72672f60008201527f313939392f786c696e6b273e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f3c2f74657874506174683e000000000000000000000000000000000000000000600082015250565b7f272050726f6d70746572206973206120636f6c6c656374696f6e20627920596f60008201527f7520616e64204d6f6e61732e2020222c22696d616765223a22646174613a696d60208201527f6167652f7376672b786d6c3b6261736536342c00000000000000000000000000604082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f3c2f646566733e00000000000000000000000000000000000000000000000000600082015250565b50565b7f3c646566733e0000000000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f50726f6d70742023000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b61436a816136ee565b811461437557600080fd5b50565b61438181613700565b811461438c57600080fd5b50565b6143988161370c565b81146143a357600080fd5b50565b6143af81613758565b81146143ba57600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212208ee8d8f35c1247a3365d7b75e5908951a3a327280a51d943117f89313469e6a764736f6c63430008070033
Deployed Bytecode Sourcemap
50437:3491:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40027:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26761:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28274:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27791:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40667:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28974:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40335:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53780:145;;;:::i;:::-;;29381:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40857:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26472:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53693:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26203:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48058:103;;;;;;;;;;;;;:::i;:::-;;47410:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26930:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28517:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50666:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29637:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52545:1058;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53611:74;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50803:660;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28743:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48316:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40027:224;40129:4;40168:35;40153:50;;;:11;:50;;;;:90;;;;40207:36;40231:11;40207:23;:36::i;:::-;40153:90;40146:97;;40027:224;;;:::o;26761:100::-;26815:13;26848:5;26841:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26761:100;:::o;28274:171::-;28350:7;28370:23;28385:7;28370:14;:23::i;:::-;28413:15;:24;28429:7;28413:24;;;;;;;;;;;;;;;;;;;;;28406:31;;28274:171;;;:::o;27791:417::-;27872:13;27888:23;27903:7;27888:14;:23::i;:::-;27872:39;;27936:5;27930:11;;:2;:11;;;;27922:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28030:5;28014:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28039:37;28056:5;28063:12;:10;:12::i;:::-;28039:16;:37::i;:::-;28014:62;27992:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;28179:21;28188:2;28192:7;28179:8;:21::i;:::-;27861:347;27791:417;;:::o;40667:113::-;40728:7;40755:10;:17;;;;40748:24;;40667:113;:::o;28974:336::-;29169:41;29188:12;:10;:12::i;:::-;29202:7;29169:18;:41::i;:::-;29161:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;29274:28;29284:4;29290:2;29294:7;29274:9;:28::i;:::-;28974:336;;;:::o;40335:256::-;40432:7;40468:23;40485:5;40468:16;:23::i;:::-;40460:5;:31;40452:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;40557:12;:19;40570:5;40557:19;;;;;;;;;;;;;;;:26;40577:5;40557:26;;;;;;;;;;;;40550:33;;40335:256;;;;:::o;53780:145::-;47296:13;:11;:13::i;:::-;53833:7:::1;53854;:5;:7::i;:::-;53846:21;;53875;53846:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53832:69;;;53916:2;53908:11;;;::::0;::::1;;53825:100;53780:145::o:0;29381:185::-;29519:39;29536:4;29542:2;29546:7;29519:39;;;;;;;;;;;;:16;:39::i;:::-;29381:185;;;:::o;40857:233::-;40932:7;40968:30;:28;:30::i;:::-;40960:5;:38;40952:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;41065:10;41076:5;41065:17;;;;;;;;:::i;:::-;;;;;;;;;;41058:24;;40857:233;;;:::o;26472:222::-;26544:7;26564:13;26580:7;:16;26588:7;26580:16;;;;;;;;;;;;;;;;;;;;;26564:32;;26632:1;26615:19;;:5;:19;;;;26607:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;26681:5;26674:12;;;26472:222;;;:::o;53693:79::-;47296:13;:11;:13::i;:::-;53757:7:::1;53751:3;:13;;;;53693:79:::0;:::o;26203:207::-;26275:7;26320:1;26303:19;;:5;:19;;;;26295:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26386:9;:16;26396:5;26386:16;;;;;;;;;;;;;;;;26379:23;;26203:207;;;:::o;48058:103::-;47296:13;:11;:13::i;:::-;48123:30:::1;48150:1;48123:18;:30::i;:::-;48058:103::o:0;47410:87::-;47456:7;47483:6;;;;;;;;;;;47476:13;;47410:87;:::o;26930:104::-;26986:13;27019:7;27012:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26930:104;:::o;28517:155::-;28612:52;28631:12;:10;:12::i;:::-;28645:8;28655;28612:18;:52::i;:::-;28517:155;;:::o;50666:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29637:323::-;29811:41;29830:12;:10;:12::i;:::-;29844:7;29811:18;:41::i;:::-;29803:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;29914:38;29928:4;29934:2;29938:7;29947:4;29914:13;:38::i;:::-;29637:323;;;;:::o;52545:1058::-;52664:13;52717:17;52725:8;52717:7;:17::i;:::-;52695:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;52822:18;52872:19;:8;:17;:19::i;:::-;52843:49;;;;;;;;:::i;:::-;;;;;;;;;;;;;52822:70;;52913:23;52939:14;:24;52954:8;52939:24;;;;;;;;;;;52913:50;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53108:453;53244:5;53316:9;53452:21;53463:9;53452:10;:21::i;:::-;53148:390;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53108:13;:453::i;:::-;53019:561;;;;;;;;:::i;:::-;;;;;;;;;;;;;52974:621;;;;52545:1058;;;:::o;53611:74::-;53650:4;53674:3;;53667:10;;53611:74;:::o;50803:660::-;50899:3;50880:7;50874:21;:28;;50866:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;50984:4;50962:26;;:9;50972:7;50962:18;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:26;;;50958:64;;;51001:8;;;50958:64;51032:14;51049:13;:11;:13::i;:::-;51032:30;;51089:4;51085:1;51076:6;:10;;;;:::i;:::-;:17;51073:59;;;51113:9;;;;;;;;;;;;;;51073:59;51162:4;51141:9;51151:7;51141:18;;;;;;:::i;:::-;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;51201:7;:5;:7::i;:::-;51187:21;;:10;:21;;;51183:148;;51246:3;;51233:9;:16;;51294:14;:3;;:12;:14::i;:::-;51258:59;;;;;;;;:::i;:::-;;;;;;;;;;;;;51225:94;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;51183:148;51372:7;51343:14;:26;51367:1;51358:6;:10;;;;:::i;:::-;51343:26;;;;;;;;;;;:36;;;;;;;;;;;;:::i;:::-;;51390:33;51400:10;51421:1;51412:6;:10;;;;:::i;:::-;51390:9;:33::i;:::-;51444:1;51434:6;;:11;;;;;;;:::i;:::-;;;;;;;;50855:608;50803:660;:::o;28743:164::-;28840:4;28864:18;:25;28883:5;28864:25;;;;;;;;;;;;;;;:35;28890:8;28864:35;;;;;;;;;;;;;;;;;;;;;;;;;28857:42;;28743:164;;;;:::o;48316:201::-;47296:13;:11;:13::i;:::-;48425:1:::1;48405:22;;:8;:22;;;;48397:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;48481:28;48500:8;48481:18;:28::i;:::-;48316:201:::0;:::o;25834:305::-;25936:4;25988:25;25973:40;;;:11;:40;;;;:105;;;;26045:33;26030:48;;;:11;:48;;;;25973:105;:158;;;;26095:36;26119:11;26095:23;:36::i;:::-;25973:158;25953:178;;25834:305;;;:::o;36249:135::-;36331:16;36339:7;36331;:16::i;:::-;36323:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;36249:135;:::o;24213:98::-;24266:7;24293:10;24286:17;;24213:98;:::o;35528:174::-;35630:2;35603:15;:24;35619:7;35603:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35686:7;35682:2;35648:46;;35657:23;35672:7;35657:14;:23::i;:::-;35648:46;;;;;;;;;;;;35528:174;;:::o;31761:264::-;31854:4;31871:13;31887:23;31902:7;31887:14;:23::i;:::-;31871:39;;31940:5;31929:16;;:7;:16;;;:52;;;;31949:32;31966:5;31973:7;31949:16;:32::i;:::-;31929:52;:87;;;;32009:7;31985:31;;:20;31997:7;31985:11;:20::i;:::-;:31;;;31929:87;31921:96;;;31761:264;;;;:::o;34784:625::-;34943:4;34916:31;;:23;34931:7;34916:14;:23::i;:::-;:31;;;34908:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;35022:1;35008:16;;:2;:16;;;;35000:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35078:39;35099:4;35105:2;35109:7;35078:20;:39::i;:::-;35182:29;35199:1;35203:7;35182:8;:29::i;:::-;35243:1;35224:9;:15;35234:4;35224:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35272:1;35255:9;:13;35265:2;35255:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35303:2;35284:7;:16;35292:7;35284:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35342:7;35338:2;35323:27;;35332:4;35323:27;;;;;;;;;;;;35363:38;35383:4;35389:2;35393:7;35363:19;:38::i;:::-;34784:625;;;:::o;47575:132::-;47650:12;:10;:12::i;:::-;47639:23;;:7;:5;:7::i;:::-;:23;;;47631:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47575:132::o;48677:191::-;48751:16;48770:6;;;;;;;;;;;48751:25;;48796:8;48787:6;;:17;;;;;;;;;;;;;;;;;;48851:8;48820:40;;48841:8;48820:40;;;;;;;;;;;;48740:128;48677:191;:::o;35845:315::-;36000:8;35991:17;;:5;:17;;;;35983:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;36087:8;36049:18;:25;36068:5;36049:25;;;;;;;;;;;;;;;:35;36075:8;36049:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;36133:8;36111:41;;36126:5;36111:41;;;36143:8;36111:41;;;;;;:::i;:::-;;;;;;;;35845:315;;;:::o;30841:313::-;30997:28;31007:4;31013:2;31017:7;30997:9;:28::i;:::-;31044:47;31067:4;31073:2;31077:7;31086:4;31044:22;:47::i;:::-;31036:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;30841:313;;;;:::o;31467:127::-;31532:4;31584:1;31556:30;;:7;:16;31564:7;31556:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31549:37;;31467:127;;;:::o;21467:723::-;21523:13;21753:1;21744:5;:10;21740:53;;;21771:10;;;;;;;;;;;;;;;;;;;;;21740:53;21803:12;21818:5;21803:20;;21834:14;21859:78;21874:1;21866:4;:9;21859:78;;21892:8;;;;;:::i;:::-;;;;21923:2;21915:10;;;;;:::i;:::-;;;21859:78;;;21947:19;21979:6;21969:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21947:39;;21997:154;22013:1;22004:5;:10;21997:154;;22041:1;22031:11;;;;;:::i;:::-;;;22108:2;22100:5;:10;;;;:::i;:::-;22087:2;:24;;;;:::i;:::-;22074:39;;22057:6;22064;22057:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;22137:2;22128:11;;;;;:::i;:::-;;;21997:154;;;22175:6;22161:21;;;;;21467:723;;;;:::o;51473:1064::-;51538:12;51583:946;52433:7;51615:899;;;;;;;;:::i;:::-;;;;;;;;;;;;;51583:13;:946::i;:::-;51563:966;;51473:1064;;;:::o;18777:2253::-;18835:12;18879:1;18864:4;:11;:16;18860:31;;;18882:9;;;;;;;;;;;;;;;;18860:31;18943:19;18965:5;;;;;;;;;;;;;;;;;18943:27;;19022:18;19068:1;19063;19049:4;:11;:15;;;;:::i;:::-;19048:21;;;;:::i;:::-;19043:1;:27;;;;:::i;:::-;19022:48;;19153:19;19198:2;19185:10;:15;;;;:::i;:::-;19175:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19153:48;;19298:10;19290:6;19283:26;19393:1;19386:5;19382:13;19452:4;19503;19497:11;19488:7;19484:25;19599:2;19591:6;19587:15;19672:1045;19707:6;19698:7;19695:19;19672:1045;;;19777:1;19768:7;19764:15;19753:26;;19851:7;19845:14;20028:4;20020:5;20016:2;20012:14;20008:25;19998:8;19994:40;19988:47;19983:3;19979:57;19947:9;19918:137;20101:1;20090:9;20086:17;20073:30;;20231:4;20223:5;20219:2;20215:14;20211:25;20201:8;20197:40;20191:47;20186:3;20182:57;20150:9;20121:137;20304:1;20293:9;20289:17;20276:30;;20433:4;20425:5;20422:1;20418:13;20414:24;20404:8;20400:39;20394:46;20389:3;20385:56;20353:9;20324:136;20506:1;20495:9;20491:17;20478:30;;20627:4;20620:5;20616:16;20606:8;20602:31;20596:38;20591:3;20587:48;20555:9;20526:128;20700:1;20689:9;20685:17;20672:30;;19734:983;19672:1045;;;20790:1;20783:4;20777:11;20773:19;20811:1;20806:84;;;;20909:1;20904:82;;;;20766:220;;20806:84;20867:6;20862:3;20858:16;20854:1;20843:9;20839:17;20832:43;20806:84;;20904:82;20965:4;20960:3;20956:14;20952:1;20941:9;20937:17;20930:41;20766:220;;19223:1774;;;;21016:6;21009:13;;;;;18777:2253;;;;:::o;32367:110::-;32443:26;32453:2;32457:7;32443:26;;;;;;;;;;;;:9;:26::i;:::-;32367:110;;:::o;11456:157::-;11541:4;11580:25;11565:40;;;:11;:40;;;;11558:47;;11456:157;;;:::o;41703:589::-;41847:45;41874:4;41880:2;41884:7;41847:26;:45::i;:::-;41925:1;41909:18;;:4;:18;;;41905:187;;;41944:40;41976:7;41944:31;:40::i;:::-;41905:187;;;42014:2;42006:10;;:4;:10;;;42002:90;;42033:47;42066:4;42072:7;42033:32;:47::i;:::-;42002:90;41905:187;42120:1;42106:16;;:2;:16;;;42102:183;;;42139:45;42176:7;42139:36;:45::i;:::-;42102:183;;;42212:4;42206:10;;:2;:10;;;42202:83;;42233:40;42261:2;42265:7;42233:27;:40::i;:::-;42202:83;42102:183;41703:589;;;:::o;38884:125::-;;;;:::o;36948:853::-;37102:4;37123:15;:2;:13;;;:15::i;:::-;37119:675;;;37175:2;37159:36;;;37196:12;:10;:12::i;:::-;37210:4;37216:7;37225:4;37159:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37155:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37417:1;37400:6;:13;:18;37396:328;;;37443:60;;;;;;;;;;:::i;:::-;;;;;;;;37396:328;37674:6;37668:13;37659:6;37655:2;37651:15;37644:38;37155:584;37291:41;;;37281:51;;;:6;:51;;;;37274:58;;;;;37119:675;37778:4;37771:11;;36948:853;;;;;;;:::o;32704:319::-;32833:18;32839:2;32843:7;32833:5;:18::i;:::-;32884:53;32915:1;32919:2;32923:7;32932:4;32884:22;:53::i;:::-;32862:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;32704:319;;;:::o;38373:126::-;;;;:::o;43015:164::-;43119:10;:17;;;;43092:15;:24;43108:7;43092:24;;;;;;;;;;;:44;;;;43147:10;43163:7;43147:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43015:164;:::o;43806:988::-;44072:22;44122:1;44097:22;44114:4;44097:16;:22::i;:::-;:26;;;;:::i;:::-;44072:51;;44134:18;44155:17;:26;44173:7;44155:26;;;;;;;;;;;;44134:47;;44302:14;44288:10;:28;44284:328;;44333:19;44355:12;:18;44368:4;44355:18;;;;;;;;;;;;;;;:34;44374:14;44355:34;;;;;;;;;;;;44333:56;;44439:11;44406:12;:18;44419:4;44406:18;;;;;;;;;;;;;;;:30;44425:10;44406:30;;;;;;;;;;;:44;;;;44556:10;44523:17;:30;44541:11;44523:30;;;;;;;;;;;:43;;;;44318:294;44284:328;44708:17;:26;44726:7;44708:26;;;;;;;;;;;44701:33;;;44752:12;:18;44765:4;44752:18;;;;;;;;;;;;;;;:34;44771:14;44752:34;;;;;;;;;;;44745:41;;;43887:907;;43806:988;;:::o;45089:1079::-;45342:22;45387:1;45367:10;:17;;;;:21;;;;:::i;:::-;45342:46;;45399:18;45420:15;:24;45436:7;45420:24;;;;;;;;;;;;45399:45;;45771:19;45793:10;45804:14;45793:26;;;;;;;;:::i;:::-;;;;;;;;;;45771:48;;45857:11;45832:10;45843;45832:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;45968:10;45937:15;:28;45953:11;45937:28;;;;;;;;;;;:41;;;;46109:15;:24;46125:7;46109:24;;;;;;;;;;;46102:31;;;46144:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45160:1008;;;45089:1079;:::o;42593:221::-;42678:14;42695:20;42712:2;42695:16;:20::i;:::-;42678:37;;42753:7;42726:12;:16;42739:2;42726:16;;;;;;;;;;;;;;;:24;42743:6;42726:24;;;;;;;;;;;:34;;;;42800:6;42771:17;:26;42789:7;42771:26;;;;;;;;;;;:35;;;;42667:147;42593:221;;:::o;1300:326::-;1360:4;1617:1;1595:7;:19;;;:23;1588:30;;1300:326;;;:::o;33359:439::-;33453:1;33439:16;;:2;:16;;;;33431:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33512:16;33520:7;33512;:16::i;:::-;33511:17;33503:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33574:45;33603:1;33607:2;33611:7;33574:20;:45::i;:::-;33649:1;33632:9;:13;33642:2;33632:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33680:2;33661:7;:16;33669:7;33661:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33725:7;33721:2;33700:33;;33717:1;33700:33;;;;;;;;;;;;33746:44;33774:1;33778:2;33782:7;33746:19;:44::i;:::-;33359:439;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:118::-;7245:24;7263:5;7245:24;:::i;:::-;7240:3;7233:37;7158:118;;:::o;7282:109::-;7363:21;7378:5;7363:21;:::i;:::-;7358:3;7351:34;7282:109;;:::o;7397:360::-;7483:3;7511:38;7543:5;7511:38;:::i;:::-;7565:70;7628:6;7623:3;7565:70;:::i;:::-;7558:77;;7644:52;7689:6;7684:3;7677:4;7670:5;7666:16;7644:52;:::i;:::-;7721:29;7743:6;7721:29;:::i;:::-;7716:3;7712:39;7705:46;;7487:270;7397:360;;;;:::o;7763:373::-;7867:3;7895:38;7927:5;7895:38;:::i;:::-;7949:88;8030:6;8025:3;7949:88;:::i;:::-;7942:95;;8046:52;8091:6;8086:3;8079:4;8072:5;8068:16;8046:52;:::i;:::-;8123:6;8118:3;8114:16;8107:23;;7871:265;7763:373;;;;:::o;8142:364::-;8230:3;8258:39;8291:5;8258:39;:::i;:::-;8313:71;8377:6;8372:3;8313:71;:::i;:::-;8306:78;;8393:52;8438:6;8433:3;8426:4;8419:5;8415:16;8393:52;:::i;:::-;8470:29;8492:6;8470:29;:::i;:::-;8465:3;8461:39;8454:46;;8234:272;8142:364;;;;:::o;8512:377::-;8618:3;8646:39;8679:5;8646:39;:::i;:::-;8701:89;8783:6;8778:3;8701:89;:::i;:::-;8694:96;;8799:52;8844:6;8839:3;8832:4;8825:5;8821:16;8799:52;:::i;:::-;8876:6;8871:3;8867:16;8860:23;;8622:267;8512:377;;;;:::o;8895:404::-;9055:3;9076:86;9158:3;9153;9076:86;:::i;:::-;9069:93;;9171;9260:3;9171:93;:::i;:::-;9289:3;9284;9280:13;9273:20;;8895:404;;;:::o;9305:400::-;9465:3;9486:84;9568:1;9563:3;9486:84;:::i;:::-;9479:91;;9579:93;9668:3;9579:93;:::i;:::-;9697:1;9692:3;9688:11;9681:18;;9305:400;;;:::o;9711:402::-;9871:3;9892:85;9974:2;9969:3;9892:85;:::i;:::-;9885:92;;9986:93;10075:3;9986:93;:::i;:::-;10104:2;10099:3;10095:12;10088:19;;9711:402;;;:::o;10119:366::-;10261:3;10282:67;10346:2;10341:3;10282:67;:::i;:::-;10275:74;;10358:93;10447:3;10358:93;:::i;:::-;10476:2;10471:3;10467:12;10460:19;;10119:366;;;:::o;10491:::-;10633:3;10654:67;10718:2;10713:3;10654:67;:::i;:::-;10647:74;;10730:93;10819:3;10730:93;:::i;:::-;10848:2;10843:3;10839:12;10832:19;;10491:366;;;:::o;10863:::-;11005:3;11026:67;11090:2;11085:3;11026:67;:::i;:::-;11019:74;;11102:93;11191:3;11102:93;:::i;:::-;11220:2;11215:3;11211:12;11204:19;;10863:366;;;:::o;11235:::-;11377:3;11398:67;11462:2;11457:3;11398:67;:::i;:::-;11391:74;;11474:93;11563:3;11474:93;:::i;:::-;11592:2;11587:3;11583:12;11576:19;;11235:366;;;:::o;11607:::-;11749:3;11770:67;11834:2;11829:3;11770:67;:::i;:::-;11763:74;;11846:93;11935:3;11846:93;:::i;:::-;11964:2;11959:3;11955:12;11948:19;;11607:366;;;:::o;11979:::-;12121:3;12142:67;12206:2;12201:3;12142:67;:::i;:::-;12135:74;;12218:93;12307:3;12218:93;:::i;:::-;12336:2;12331:3;12327:12;12320:19;;11979:366;;;:::o;12351:402::-;12511:3;12532:85;12614:2;12609:3;12532:85;:::i;:::-;12525:92;;12626:93;12715:3;12626:93;:::i;:::-;12744:2;12739:3;12735:12;12728:19;;12351:402;;;:::o;12759:::-;12919:3;12940:85;13022:2;13017:3;12940:85;:::i;:::-;12933:92;;13034:93;13123:3;13034:93;:::i;:::-;13152:2;13147:3;13143:12;13136:19;;12759:402;;;:::o;13167:::-;13327:3;13348:85;13430:2;13425:3;13348:85;:::i;:::-;13341:92;;13442:93;13531:3;13442:93;:::i;:::-;13560:2;13555:3;13551:12;13544:19;;13167:402;;;:::o;13575:::-;13735:3;13756:85;13838:2;13833:3;13756:85;:::i;:::-;13749:92;;13850:93;13939:3;13850:93;:::i;:::-;13968:2;13963:3;13959:12;13952:19;;13575:402;;;:::o;13983:366::-;14125:3;14146:67;14210:2;14205:3;14146:67;:::i;:::-;14139:74;;14222:93;14311:3;14222:93;:::i;:::-;14340:2;14335:3;14331:12;14324:19;;13983:366;;;:::o;14355:::-;14497:3;14518:67;14582:2;14577:3;14518:67;:::i;:::-;14511:74;;14594:93;14683:3;14594:93;:::i;:::-;14712:2;14707:3;14703:12;14696:19;;14355:366;;;:::o;14727:402::-;14887:3;14908:85;14990:2;14985:3;14908:85;:::i;:::-;14901:92;;15002:93;15091:3;15002:93;:::i;:::-;15120:2;15115:3;15111:12;15104:19;;14727:402;;;:::o;15135:::-;15295:3;15316:85;15398:2;15393:3;15316:85;:::i;:::-;15309:92;;15410:93;15499:3;15410:93;:::i;:::-;15528:2;15523:3;15519:12;15512:19;;15135:402;;;:::o;15543:400::-;15703:3;15724:84;15806:1;15801:3;15724:84;:::i;:::-;15717:91;;15817:93;15906:3;15817:93;:::i;:::-;15935:1;15930:3;15926:11;15919:18;;15543:400;;;:::o;15949:366::-;16091:3;16112:67;16176:2;16171:3;16112:67;:::i;:::-;16105:74;;16188:93;16277:3;16188:93;:::i;:::-;16306:2;16301:3;16297:12;16290:19;;15949:366;;;:::o;16321:402::-;16481:3;16502:85;16584:2;16579:3;16502:85;:::i;:::-;16495:92;;16596:93;16685:3;16596:93;:::i;:::-;16714:2;16709:3;16705:12;16698:19;;16321:402;;;:::o;16729:400::-;16889:3;16910:84;16992:1;16987:3;16910:84;:::i;:::-;16903:91;;17003:93;17092:3;17003:93;:::i;:::-;17121:1;17116:3;17112:11;17105:18;;16729:400;;;:::o;17135:402::-;17295:3;17316:85;17398:2;17393:3;17316:85;:::i;:::-;17309:92;;17410:93;17499:3;17410:93;:::i;:::-;17528:2;17523:3;17519:12;17512:19;;17135:402;;;:::o;17543:366::-;17685:3;17706:67;17770:2;17765:3;17706:67;:::i;:::-;17699:74;;17782:93;17871:3;17782:93;:::i;:::-;17900:2;17895:3;17891:12;17884:19;;17543:366;;;:::o;17915:::-;18057:3;18078:67;18142:2;18137:3;18078:67;:::i;:::-;18071:74;;18154:93;18243:3;18154:93;:::i;:::-;18272:2;18267:3;18263:12;18256:19;;17915:366;;;:::o;18287:::-;18429:3;18450:67;18514:2;18509:3;18450:67;:::i;:::-;18443:74;;18526:93;18615:3;18526:93;:::i;:::-;18644:2;18639:3;18635:12;18628:19;;18287:366;;;:::o;18659:::-;18801:3;18822:67;18886:2;18881:3;18822:67;:::i;:::-;18815:74;;18898:93;18987:3;18898:93;:::i;:::-;19016:2;19011:3;19007:12;19000:19;;18659:366;;;:::o;19031:::-;19173:3;19194:67;19258:2;19253:3;19194:67;:::i;:::-;19187:74;;19270:93;19359:3;19270:93;:::i;:::-;19388:2;19383:3;19379:12;19372:19;;19031:366;;;:::o;19403:402::-;19563:3;19584:85;19666:2;19661:3;19584:85;:::i;:::-;19577:92;;19678:93;19767:3;19678:93;:::i;:::-;19796:2;19791:3;19787:12;19780:19;;19403:402;;;:::o;19811:::-;19971:3;19992:85;20074:2;20069:3;19992:85;:::i;:::-;19985:92;;20086:93;20175:3;20086:93;:::i;:::-;20204:2;20199:3;20195:12;20188:19;;19811:402;;;:::o;20219:366::-;20361:3;20382:67;20446:2;20441:3;20382:67;:::i;:::-;20375:74;;20458:93;20547:3;20458:93;:::i;:::-;20576:2;20571:3;20567:12;20560:19;;20219:366;;;:::o;20591:207::-;20760:31;20755:3;20748:44;20591:207;:::o;20804:400::-;20964:3;20985:84;21067:1;21062:3;20985:84;:::i;:::-;20978:91;;21078:93;21167:3;21078:93;:::i;:::-;21196:1;21191:3;21187:11;21180:18;;20804:400;;;:::o;21210:398::-;21369:3;21390:83;21471:1;21466:3;21390:83;:::i;:::-;21383:90;;21482:93;21571:3;21482:93;:::i;:::-;21600:1;21595:3;21591:11;21584:18;;21210:398;;;:::o;21614:400::-;21774:3;21795:84;21877:1;21872:3;21795:84;:::i;:::-;21788:91;;21888:93;21977:3;21888:93;:::i;:::-;22006:1;22001:3;21997:11;21990:18;;21614:400;;;:::o;22020:366::-;22162:3;22183:67;22247:2;22242:3;22183:67;:::i;:::-;22176:74;;22259:93;22348:3;22259:93;:::i;:::-;22377:2;22372:3;22368:12;22361:19;;22020:366;;;:::o;22392:400::-;22552:3;22573:84;22655:1;22650:3;22573:84;:::i;:::-;22566:91;;22666:93;22755:3;22666:93;:::i;:::-;22784:1;22779:3;22775:11;22768:18;;22392:400;;;:::o;22798:366::-;22940:3;22961:67;23025:2;23020:3;22961:67;:::i;:::-;22954:74;;23037:93;23126:3;23037:93;:::i;:::-;23155:2;23150:3;23146:12;23139:19;;22798:366;;;:::o;23170:118::-;23257:24;23275:5;23257:24;:::i;:::-;23252:3;23245:37;23170:118;;:::o;23294:275::-;23426:3;23448:95;23539:3;23530:6;23448:95;:::i;:::-;23441:102;;23560:3;23553:10;;23294:275;;;;:::o;23575:1647::-;24201:3;24223:148;24367:3;24223:148;:::i;:::-;24216:155;;24388:93;24477:3;24468:6;24388:93;:::i;:::-;24381:100;;24498:148;24642:3;24498:148;:::i;:::-;24491:155;;24663:93;24752:3;24743:6;24663:93;:::i;:::-;24656:100;;24773:148;24917:3;24773:148;:::i;:::-;24766:155;;24938:93;25027:3;25018:6;24938:93;:::i;:::-;24931:100;;25048:148;25192:3;25048:148;:::i;:::-;25041:155;;25213:3;25206:10;;23575:1647;;;;;;:::o;25228:807::-;25562:3;25584:148;25728:3;25584:148;:::i;:::-;25577:155;;25749:95;25840:3;25831:6;25749:95;:::i;:::-;25742:102;;25861:148;26005:3;25861:148;:::i;:::-;25854:155;;26026:3;26019:10;;25228:807;;;;:::o;26041:3201::-;27284:3;27306:148;27450:3;27306:148;:::i;:::-;27299:155;;27471:148;27615:3;27471:148;:::i;:::-;27464:155;;27636:148;27780:3;27636:148;:::i;:::-;27629:155;;27801:148;27945:3;27801:148;:::i;:::-;27794:155;;27966:148;28110:3;27966:148;:::i;:::-;27959:155;;28131:148;28275:3;28131:148;:::i;:::-;28124:155;;28296:148;28440:3;28296:148;:::i;:::-;28289:155;;28461:148;28605:3;28461:148;:::i;:::-;28454:155;;28626:148;28770:3;28626:148;:::i;:::-;28619:155;;28791:95;28882:3;28873:6;28791:95;:::i;:::-;28784:102;;28903:148;29047:3;28903:148;:::i;:::-;28896:155;;29068:148;29212:3;29068:148;:::i;:::-;29061:155;;29233:3;29226:10;;26041:3201;;;;:::o;29248:538::-;29469:3;29484:138;29618:3;29484:138;:::i;:::-;29647:2;29642:3;29638:12;29631:19;;29667:93;29756:3;29747:6;29667:93;:::i;:::-;29660:100;;29777:3;29770:10;;29248:538;;;;:::o;29792:379::-;29976:3;29998:147;30141:3;29998:147;:::i;:::-;29991:154;;30162:3;30155:10;;29792:379;;;:::o;30177:541::-;30410:3;30432:148;30576:3;30432:148;:::i;:::-;30425:155;;30597:95;30688:3;30679:6;30597:95;:::i;:::-;30590:102;;30709:3;30702:10;;30177:541;;;;:::o;30724:222::-;30817:4;30855:2;30844:9;30840:18;30832:26;;30868:71;30936:1;30925:9;30921:17;30912:6;30868:71;:::i;:::-;30724:222;;;;:::o;30952:640::-;31147:4;31185:3;31174:9;31170:19;31162:27;;31199:71;31267:1;31256:9;31252:17;31243:6;31199:71;:::i;:::-;31280:72;31348:2;31337:9;31333:18;31324:6;31280:72;:::i;:::-;31362;31430:2;31419:9;31415:18;31406:6;31362:72;:::i;:::-;31481:9;31475:4;31471:20;31466:2;31455:9;31451:18;31444:48;31509:76;31580:4;31571:6;31509:76;:::i;:::-;31501:84;;30952:640;;;;;;;:::o;31598:210::-;31685:4;31723:2;31712:9;31708:18;31700:26;;31736:65;31798:1;31787:9;31783:17;31774:6;31736:65;:::i;:::-;31598:210;;;;:::o;31814:313::-;31927:4;31965:2;31954:9;31950:18;31942:26;;32014:9;32008:4;32004:20;32000:1;31989:9;31985:17;31978:47;32042:78;32115:4;32106:6;32042:78;:::i;:::-;32034:86;;31814:313;;;;:::o;32133:419::-;32299:4;32337:2;32326:9;32322:18;32314:26;;32386:9;32380:4;32376:20;32372:1;32361:9;32357:17;32350:47;32414:131;32540:4;32414:131;:::i;:::-;32406:139;;32133:419;;;:::o;32558:::-;32724:4;32762:2;32751:9;32747:18;32739:26;;32811:9;32805:4;32801:20;32797:1;32786:9;32782:17;32775:47;32839:131;32965:4;32839:131;:::i;:::-;32831:139;;32558:419;;;:::o;32983:::-;33149:4;33187:2;33176:9;33172:18;33164:26;;33236:9;33230:4;33226:20;33222:1;33211:9;33207:17;33200:47;33264:131;33390:4;33264:131;:::i;:::-;33256:139;;32983:419;;;:::o;33408:::-;33574:4;33612:2;33601:9;33597:18;33589:26;;33661:9;33655:4;33651:20;33647:1;33636:9;33632:17;33625:47;33689:131;33815:4;33689:131;:::i;:::-;33681:139;;33408:419;;;:::o;33833:::-;33999:4;34037:2;34026:9;34022:18;34014:26;;34086:9;34080:4;34076:20;34072:1;34061:9;34057:17;34050:47;34114:131;34240:4;34114:131;:::i;:::-;34106:139;;33833:419;;;:::o;34258:::-;34424:4;34462:2;34451:9;34447:18;34439:26;;34511:9;34505:4;34501:20;34497:1;34486:9;34482:17;34475:47;34539:131;34665:4;34539:131;:::i;:::-;34531:139;;34258:419;;;:::o;34683:::-;34849:4;34887:2;34876:9;34872:18;34864:26;;34936:9;34930:4;34926:20;34922:1;34911:9;34907:17;34900:47;34964:131;35090:4;34964:131;:::i;:::-;34956:139;;34683:419;;;:::o;35108:::-;35274:4;35312:2;35301:9;35297:18;35289:26;;35361:9;35355:4;35351:20;35347:1;35336:9;35332:17;35325:47;35389:131;35515:4;35389:131;:::i;:::-;35381:139;;35108:419;;;:::o;35533:::-;35699:4;35737:2;35726:9;35722:18;35714:26;;35786:9;35780:4;35776:20;35772:1;35761:9;35757:17;35750:47;35814:131;35940:4;35814:131;:::i;:::-;35806:139;;35533:419;;;:::o;35958:::-;36124:4;36162:2;36151:9;36147:18;36139:26;;36211:9;36205:4;36201:20;36197:1;36186:9;36182:17;36175:47;36239:131;36365:4;36239:131;:::i;:::-;36231:139;;35958:419;;;:::o;36383:::-;36549:4;36587:2;36576:9;36572:18;36564:26;;36636:9;36630:4;36626:20;36622:1;36611:9;36607:17;36600:47;36664:131;36790:4;36664:131;:::i;:::-;36656:139;;36383:419;;;:::o;36808:::-;36974:4;37012:2;37001:9;36997:18;36989:26;;37061:9;37055:4;37051:20;37047:1;37036:9;37032:17;37025:47;37089:131;37215:4;37089:131;:::i;:::-;37081:139;;36808:419;;;:::o;37233:::-;37399:4;37437:2;37426:9;37422:18;37414:26;;37486:9;37480:4;37476:20;37472:1;37461:9;37457:17;37450:47;37514:131;37640:4;37514:131;:::i;:::-;37506:139;;37233:419;;;:::o;37658:::-;37824:4;37862:2;37851:9;37847:18;37839:26;;37911:9;37905:4;37901:20;37897:1;37886:9;37882:17;37875:47;37939:131;38065:4;37939:131;:::i;:::-;37931:139;;37658:419;;;:::o;38083:::-;38249:4;38287:2;38276:9;38272:18;38264:26;;38336:9;38330:4;38326:20;38322:1;38311:9;38307:17;38300:47;38364:131;38490:4;38364:131;:::i;:::-;38356:139;;38083:419;;;:::o;38508:::-;38674:4;38712:2;38701:9;38697:18;38689:26;;38761:9;38755:4;38751:20;38747:1;38736:9;38732:17;38725:47;38789:131;38915:4;38789:131;:::i;:::-;38781:139;;38508:419;;;:::o;38933:::-;39099:4;39137:2;39126:9;39122:18;39114:26;;39186:9;39180:4;39176:20;39172:1;39161:9;39157:17;39150:47;39214:131;39340:4;39214:131;:::i;:::-;39206:139;;38933:419;;;:::o;39358:222::-;39451:4;39489:2;39478:9;39474:18;39466:26;;39502:71;39570:1;39559:9;39555:17;39546:6;39502:71;:::i;:::-;39358:222;;;;:::o;39586:129::-;39620:6;39647:20;;:::i;:::-;39637:30;;39676:33;39704:4;39696:6;39676:33;:::i;:::-;39586:129;;;:::o;39721:75::-;39754:6;39787:2;39781:9;39771:19;;39721:75;:::o;39802:307::-;39863:4;39953:18;39945:6;39942:30;39939:56;;;39975:18;;:::i;:::-;39939:56;40013:29;40035:6;40013:29;:::i;:::-;40005:37;;40097:4;40091;40087:15;40079:23;;39802:307;;;:::o;40115:308::-;40177:4;40267:18;40259:6;40256:30;40253:56;;;40289:18;;:::i;:::-;40253:56;40327:29;40349:6;40327:29;:::i;:::-;40319:37;;40411:4;40405;40401:15;40393:23;;40115:308;;;:::o;40429:98::-;40480:6;40514:5;40508:12;40498:22;;40429:98;;;:::o;40533:99::-;40585:6;40619:5;40613:12;40603:22;;40533:99;;;:::o;40638:168::-;40721:11;40755:6;40750:3;40743:19;40795:4;40790:3;40786:14;40771:29;;40638:168;;;;:::o;40812:147::-;40913:11;40950:3;40935:18;;40812:147;;;;:::o;40965:169::-;41049:11;41083:6;41078:3;41071:19;41123:4;41118:3;41114:14;41099:29;;40965:169;;;;:::o;41140:148::-;41242:11;41279:3;41264:18;;41140:148;;;;:::o;41294:305::-;41334:3;41353:20;41371:1;41353:20;:::i;:::-;41348:25;;41387:20;41405:1;41387:20;:::i;:::-;41382:25;;41541:1;41473:66;41469:74;41466:1;41463:81;41460:107;;;41547:18;;:::i;:::-;41460:107;41591:1;41588;41584:9;41577:16;;41294:305;;;;:::o;41605:185::-;41645:1;41662:20;41680:1;41662:20;:::i;:::-;41657:25;;41696:20;41714:1;41696:20;:::i;:::-;41691:25;;41735:1;41725:35;;41740:18;;:::i;:::-;41725:35;41782:1;41779;41775:9;41770:14;;41605:185;;;;:::o;41796:348::-;41836:7;41859:20;41877:1;41859:20;:::i;:::-;41854:25;;41893:20;41911:1;41893:20;:::i;:::-;41888:25;;42081:1;42013:66;42009:74;42006:1;42003:81;41998:1;41991:9;41984:17;41980:105;41977:131;;;42088:18;;:::i;:::-;41977:131;42136:1;42133;42129:9;42118:20;;41796:348;;;;:::o;42150:191::-;42190:4;42210:20;42228:1;42210:20;:::i;:::-;42205:25;;42244:20;42262:1;42244:20;:::i;:::-;42239:25;;42283:1;42280;42277:8;42274:34;;;42288:18;;:::i;:::-;42274:34;42333:1;42330;42326:9;42318:17;;42150:191;;;;:::o;42347:96::-;42384:7;42413:24;42431:5;42413:24;:::i;:::-;42402:35;;42347:96;;;:::o;42449:90::-;42483:7;42526:5;42519:13;42512:21;42501:32;;42449:90;;;:::o;42545:149::-;42581:7;42621:66;42614:5;42610:78;42599:89;;42545:149;;;:::o;42700:126::-;42737:7;42777:42;42770:5;42766:54;42755:65;;42700:126;;;:::o;42832:77::-;42869:7;42898:5;42887:16;;42832:77;;;:::o;42915:154::-;42999:6;42994:3;42989;42976:30;43061:1;43052:6;43047:3;43043:16;43036:27;42915:154;;;:::o;43075:307::-;43143:1;43153:113;43167:6;43164:1;43161:13;43153:113;;;43252:1;43247:3;43243:11;43237:18;43233:1;43228:3;43224:11;43217:39;43189:2;43186:1;43182:10;43177:15;;43153:113;;;43284:6;43281:1;43278:13;43275:101;;;43364:1;43355:6;43350:3;43346:16;43339:27;43275:101;43124:258;43075:307;;;:::o;43388:320::-;43432:6;43469:1;43463:4;43459:12;43449:22;;43516:1;43510:4;43506:12;43537:18;43527:81;;43593:4;43585:6;43581:17;43571:27;;43527:81;43655:2;43647:6;43644:14;43624:18;43621:38;43618:84;;;43674:18;;:::i;:::-;43618:84;43439:269;43388:320;;;:::o;43714:281::-;43797:27;43819:4;43797:27;:::i;:::-;43789:6;43785:40;43927:6;43915:10;43912:22;43891:18;43879:10;43876:34;43873:62;43870:88;;;43938:18;;:::i;:::-;43870:88;43978:10;43974:2;43967:22;43757:238;43714:281;;:::o;44001:233::-;44040:3;44063:24;44081:5;44063:24;:::i;:::-;44054:33;;44109:66;44102:5;44099:77;44096:103;;;44179:18;;:::i;:::-;44096:103;44226:1;44219:5;44215:13;44208:20;;44001:233;;;:::o;44240:176::-;44272:1;44289:20;44307:1;44289:20;:::i;:::-;44284:25;;44323:20;44341:1;44323:20;:::i;:::-;44318:25;;44362:1;44352:35;;44367:18;;:::i;:::-;44352:35;44408:1;44405;44401:9;44396:14;;44240:176;;;;:::o;44422:180::-;44470:77;44467:1;44460:88;44567:4;44564:1;44557:15;44591:4;44588:1;44581:15;44608:180;44656:77;44653:1;44646:88;44753:4;44750:1;44743:15;44777:4;44774:1;44767:15;44794:180;44842:77;44839:1;44832:88;44939:4;44936:1;44929:15;44963:4;44960:1;44953:15;44980:180;45028:77;45025:1;45018:88;45125:4;45122:1;45115:15;45149:4;45146:1;45139:15;45166:180;45214:77;45211:1;45204:88;45311:4;45308:1;45301:15;45335:4;45332:1;45325:15;45352:180;45400:77;45397:1;45390:88;45497:4;45494:1;45487:15;45521:4;45518:1;45511:15;45538:117;45647:1;45644;45637:12;45661:117;45770:1;45767;45760:12;45784:117;45893:1;45890;45883:12;45907:117;46016:1;46013;46006:12;46030:102;46071:6;46122:2;46118:7;46113:2;46106:5;46102:14;46098:28;46088:38;;46030:102;;;:::o;46138:803::-;46278:66;46274:1;46266:6;46262:14;46255:90;46379:34;46374:2;46366:6;46362:15;46355:59;46448:34;46443:2;46435:6;46431:15;46424:59;46517:34;46512:2;46504:6;46500:15;46493:59;46587:34;46581:3;46573:6;46569:16;46562:60;46657:34;46651:3;46643:6;46639:16;46632:60;46727:34;46721:3;46713:6;46709:16;46702:60;46797:34;46791:3;46783:6;46779:16;46772:60;46867:66;46861:3;46853:6;46849:16;46842:92;46138:803;:::o;46947:214::-;47087:66;47083:1;47075:6;47071:14;47064:90;46947:214;:::o;47167:165::-;47307:17;47303:1;47295:6;47291:14;47284:41;47167:165;:::o;47338:230::-;47478:34;47474:1;47466:6;47462:14;47455:58;47547:13;47542:2;47534:6;47530:15;47523:38;47338:230;:::o;47574:235::-;47714:34;47710:1;47702:6;47698:14;47691:58;47787:10;47782:2;47774:6;47770:15;47763:35;47574:235;:::o;47819:249::-;47963:34;47959:1;47951:6;47947:14;47940:58;48036:20;48031:2;48023:6;48019:15;48012:45;47819:249;:::o;48078:237::-;48222:34;48218:1;48210:6;48206:14;48199:58;48295:8;48290:2;48282:6;48278:15;48271:33;48078:237;:::o;48325:236::-;48469:34;48465:1;48457:6;48453:14;48446:58;48542:7;48537:2;48529:6;48525:15;48518:32;48325:236;:::o;48571:186::-;48715:30;48711:1;48703:6;48699:14;48692:54;48571:186;:::o;48767:222::-;48911:66;48907:1;48899:6;48895:14;48888:90;48767:222;:::o;48999:327::-;49143:66;49139:1;49131:6;49127:14;49120:90;49248:66;49243:2;49235:6;49231:15;49224:91;48999:327;:::o;49336:::-;49480:66;49476:1;49468:6;49464:14;49457:90;49585:66;49580:2;49572:6;49568:15;49561:91;49336:327;:::o;49673:432::-;49817:66;49813:1;49805:6;49801:14;49794:90;49922:66;49917:2;49909:6;49905:15;49898:91;50027:66;50022:2;50014:6;50010:15;50003:91;49673:432;:::o;50115:235::-;50259:34;50255:1;50247:6;50243:14;50236:58;50332:6;50327:2;50319:6;50315:15;50308:31;50115:235;:::o;50360:183::-;50504:27;50500:1;50492:6;50488:14;50481:51;50360:183;:::o;50553:222::-;50697:66;50693:1;50685:6;50681:14;50674:90;50553:222;:::o;50785:171::-;50929:15;50925:1;50917:6;50913:14;50906:39;50785:171;:::o;50966:162::-;51110:6;51106:1;51098:6;51094:14;51087:30;50966:162;:::o;51138:240::-;51282:34;51278:1;51270:6;51266:14;51259:58;51355:11;51350:2;51342:6;51338:15;51331:36;51138:240;:::o;51388:222::-;51532:66;51528:1;51520:6;51516:14;51509:90;51388:222;:::o;51620:::-;51764:66;51760:1;51752:6;51748:14;51741:90;51620:222;:::o;51852:251::-;51996:34;51992:1;51984:6;51980:14;51973:58;52073:14;52068:2;52060:6;52056:15;52049:39;51852:251;:::o;52117:273::-;52265:34;52261:1;52253:6;52249:14;52242:58;52342:32;52337:2;52329:6;52325:15;52318:57;52117:273;:::o;52404:198::-;52552:34;52548:1;52540:6;52536:14;52529:58;52404:198;:::o;52616:::-;52764:34;52760:1;52752:6;52748:14;52741:58;52616:198;:::o;52828:258::-;52976:34;52972:1;52964:6;52960:14;52953:58;53053:17;53048:2;53040:6;53036:15;53029:42;52828:258;:::o;53100:190::-;53248:26;53244:1;53236:6;53232:14;53225:50;53100:190;:::o;53304:177::-;53452:13;53448:1;53440:6;53436:14;53429:37;53304:177;:::o;53495:371::-;53643:34;53639:1;53631:6;53627:14;53620:58;53720:66;53715:2;53707:6;53703:15;53696:91;53829:21;53824:2;53816:6;53812:15;53805:46;53495:371;:::o;53880:244::-;54028:34;54024:1;54016:6;54012:14;54005:58;54105:3;54100:2;54092:6;54088:15;54081:28;53880:244;:::o;54138:173::-;54286:9;54282:1;54274:6;54270:14;54263:33;54138:173;:::o;54325:122::-;;:::o;54461:172::-;54609:8;54605:1;54597:6;54593:14;54586:32;54461:172;:::o;54647:255::-;54795:34;54791:1;54783:6;54779:14;54772:58;54872:14;54867:2;54859:6;54855:15;54848:39;54647:255;:::o;54916:174::-;55064:10;55060:1;55052:6;55048:14;55041:34;54916:174;:::o;55104:257::-;55252:34;55248:1;55240:6;55236:14;55229:58;55329:16;55324:2;55316:6;55312:15;55305:41;55104:257;:::o;55375:138::-;55456:24;55474:5;55456:24;:::i;:::-;55449:5;55446:35;55436:63;;55495:1;55492;55485:12;55436:63;55375:138;:::o;55527:132::-;55605:21;55620:5;55605:21;:::i;:::-;55598:5;55595:32;55585:60;;55641:1;55638;55631:12;55585:60;55527:132;:::o;55673:136::-;55753:23;55770:5;55753:23;:::i;:::-;55746:5;55743:34;55733:62;;55791:1;55788;55781:12;55733:62;55673:136;:::o;55823:138::-;55904:24;55922:5;55904:24;:::i;:::-;55897:5;55894:35;55884:63;;55943:1;55940;55933:12;55884:63;55823:138;:::o
Swarm Source
ipfs://8ee8d8f35c1247a3365d7b75e5908951a3a327280a51d943117f89313469e6a7
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.