ERC-721
Overview
Max Total Supply
40 TWC
Holders
16
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 TWCLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
NFT
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-23 */ // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // 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.6.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 be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev 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: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // 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.6.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: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || 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 a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // 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 v4.4.1 (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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // 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: contract.sol //SPDX-License-Identifier: MIT pragma solidity ^0.8.10; contract NFT is ERC721Enumerable, Ownable { using SafeMath for uint256; using Counters for Counters.Counter; using Strings for uint256; Counters.Counter private _tokenIds; uint256 public constant MAX_SUPPLY = 500; // Public sale bool private publicSaleActive; uint256 public PRICE = 0.088 ether; mapping (address => uint256) public minted; uint256 public publicSaleMaxNFTsMintable = 7; // Pre-sale bool private preSaleActive; uint256 public PRE_PRICE = 0.088 ether; mapping (address => uint256) public preMinted; mapping (address => bool) public isWhitelisted; uint256 public preSaleNFTsAvailable = 250; uint256 public preSaleNFTsMinted; uint256 public preSaleMaxNFTsMintable = 5; bool public revealed; string public baseTokenURI; string public unrevealedURI; constructor(string memory baseURI, string memory _unrevealedURI) ERC721("The Winners Club", "TWC") { setBaseURI(baseURI); setUnrevealedURI(_unrevealedURI); } function _baseURI() internal view virtual override returns (string memory) { if (!revealed) { return unrevealedURI; } return baseTokenURI; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); if (!revealed) { return unrevealedURI; } else { string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } } function isPreSaleActive() view external returns(bool) { return preSaleActive; } function isPublicSaleActive() view external returns(bool) { return publicSaleActive; } function mintNFTs(uint256 _count) public payable { require(preSaleActive || publicSaleActive, "No sale active!"); uint256 totalMinted = _tokenIds.current(); require(totalMinted.add(_count) <= MAX_SUPPLY, "Not enough NFTs left!"); require(_count > 0, "Cannot mint 0 NFTs."); require(msg.value >= calculatePrice(_count),"Not enough ether to purchase NFTs."); if (preSaleActive) { require(isWhitelisted[msg.sender], "Address is not whitelisted!"); preMinted[msg.sender] += _count; require(preMinted[msg.sender] <= preSaleMaxNFTsMintable, "Address can't mint more NFTs in pre-sale."); preSaleNFTsMinted += _count; require(preSaleNFTsMinted <= preSaleNFTsAvailable, "Address can't mint more NFTs in pre-sale."); } else { minted[msg.sender] += _count; require(minted[msg.sender] <= publicSaleMaxNFTsMintable, "Address can't mint more NFTs in public-sale."); } for (uint256 i = 0; i < _count; i++) { _mintSingleNFT(); } } function calculatePrice(uint256 _count) public view returns(uint256) { if (preSaleActive) { return _count * PRE_PRICE; } return _count * PRICE; } function _mintSingleNFT() private { uint256 newTokenID = _tokenIds.current(); if (newTokenID == 0) { _tokenIds.increment(); newTokenID = _tokenIds.current(); } _safeMint(msg.sender, newTokenID); _tokenIds.increment(); } function tokensOfOwner(address _owner) external view returns (uint256[] memory) { uint256 tokenCount = balanceOf(_owner); uint256[] memory tokensId = new uint256[](tokenCount); for (uint256 i = 0; i < tokenCount; i++) { tokensId[i] = tokenOfOwnerByIndex(_owner, i); } return tokensId; } // Owner functions function withdraw() public payable onlyOwner { uint256 balance = address(this).balance; require(balance > 0, "No ether left to withdraw"); (bool success, ) = (msg.sender).call{value: balance}(""); require(success, "Transfer failed."); } function enablePreSale() external onlyOwner { publicSaleActive = false; preSaleActive = true; } function disablePreSale() external onlyOwner { preSaleActive = false; } function enablePublicSale() external onlyOwner { preSaleActive = false; publicSaleActive = true; } function disablePublicSale() external onlyOwner { publicSaleActive = false; } function setPresalePrice(uint256 _PRE_PRICE) external onlyOwner { PRE_PRICE = _PRE_PRICE; } function setPrice(uint256 _PRICE) external onlyOwner { PRICE = _PRICE; } function addToWhitelist(address[] memory _addresses) external onlyOwner { for (uint256 i = 0;i < _addresses.length;i++) { isWhitelisted[_addresses[i]] = true; } } function removeFromWhitelist (address[] memory _addresses) external onlyOwner { for (uint256 i = 0;i < _addresses.length;i++) { isWhitelisted[_addresses[i]] = false; } } function mintFreeNFTs(uint256 _count) external onlyOwner { for (uint256 i = 0; i < _count; i++) { _mintSingleNFT(); } } function setBaseURI(string memory _baseTokenURI) public onlyOwner { baseTokenURI = _baseTokenURI; } function setUnrevealedURI(string memory _unrevealedURI) public onlyOwner { unrevealedURI = _unrevealedURI; } function reveal() public onlyOwner { revealed = true; } function hide() public onlyOwner { revealed = false; } function setPreSaleMaxNFTsMintable(uint256 _newMaxMintable) external onlyOwner { preSaleMaxNFTsMintable = _newMaxMintable; } function setPublicSaleMaxNFTsMintable(uint256 _newMaxMintable) external onlyOwner { publicSaleMaxNFTsMintable = _newMaxMintable; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"},{"internalType":"string","name":"_unrevealedURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"calculatePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disablePreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disablePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enablePreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enablePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hide","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPreSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mintFreeNFTs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mintNFTs","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"preMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleMaxNFTsMintable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleNFTsAvailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleNFTsMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleMaxNFTsMintable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintable","type":"uint256"}],"name":"setPreSaleMaxNFTsMintable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_PRE_PRICE","type":"uint256"}],"name":"setPresalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_PRICE","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintable","type":"uint256"}],"name":"setPublicSaleMaxNFTsMintable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_unrevealedURI","type":"string"}],"name":"setUnrevealedURI","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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unrevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
6080604052670138a388a43c0000600d556007600f55670138a388a43c000060115560fa60145560056016553480156200003857600080fd5b5060405162005f3238038062005f3283398181016040528101906200005e9190620005e3565b6040518060400160405280601081526020017f5468652057696e6e65727320436c7562000000000000000000000000000000008152506040518060400160405280600381526020017f54574300000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000e292919062000396565b508060019080519060200190620000fb92919062000396565b5050506200011e620001126200014860201b60201c565b6200015060201b60201c565b6200012f826200021660201b60201c565b6200014081620002c160201b60201c565b505062000750565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002266200014860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200024c6200036c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200029c90620006c9565b60405180910390fd5b8060189080519060200190620002bd92919062000396565b5050565b620002d16200014860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002f76200036c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000350576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200034790620006c9565b60405180910390fd5b80601990805190602001906200036892919062000396565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003a4906200071a565b90600052602060002090601f016020900481019282620003c8576000855562000414565b82601f10620003e357805160ff191683800117855562000414565b8280016001018555821562000414579182015b8281111562000413578251825591602001919060010190620003f6565b5b50905062000423919062000427565b5090565b5b808211156200044257600081600090555060010162000428565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004af8262000464565b810181811067ffffffffffffffff82111715620004d157620004d062000475565b5b80604052505050565b6000620004e662000446565b9050620004f48282620004a4565b919050565b600067ffffffffffffffff82111562000517576200051662000475565b5b620005228262000464565b9050602081019050919050565b60005b838110156200054f57808201518184015260208101905062000532565b838111156200055f576000848401525b50505050565b60006200057c6200057684620004f9565b620004da565b9050828152602081018484840111156200059b576200059a6200045f565b5b620005a88482856200052f565b509392505050565b600082601f830112620005c857620005c76200045a565b5b8151620005da84826020860162000565565b91505092915050565b60008060408385031215620005fd57620005fc62000450565b5b600083015167ffffffffffffffff8111156200061e576200061d62000455565b5b6200062c85828601620005b0565b925050602083015167ffffffffffffffff81111562000650576200064f62000455565b5b6200065e85828601620005b0565b9150509250929050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620006b160208362000668565b9150620006be8262000679565b602082019050919050565b60006020820190508181036000830152620006e481620006a2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200073357607f821691505b602082108114156200074a5762000749620006eb565b5b50919050565b6157d280620007606000396000f3fe60806040526004361061031a5760003560e01c80637f649783116101ab578063af8465f4116100f7578063ca9c9e1511610095578063e985e9c51161006f578063e985e9c514610b70578063ec8db81714610bad578063f2fde38b14610bc4578063fe2c7fee14610bed5761031a565b8063ca9c9e1514610af1578063d1e8c13e14610b1a578063d547cfb714610b455761031a565b8063b88d4fde116100d1578063b88d4fde14610a4b578063c21018d514610a74578063c80becb614610a9d578063c87b56dd14610ab45761031a565b8063af8465f4146109e0578063b49acd6d14610a0b578063b62a762514610a345761031a565b8063963c417711610164578063a475b5dd1161013e578063a475b5dd1461094a578063aa1acb5414610961578063adf6431e1461098c578063ae104265146109a35761031a565b8063963c4177146108b95780639d044ed3146108f6578063a22cb465146109215761031a565b80637f649783146107a95780638462151c146107d25780638d859f3e1461080f5780638da5cb5b1461083a57806391b7f5ed1461086557806395d89b411461088e5761031a565b80633b4b13811161026a578063556fedd2116102235780637035bf18116101fd5780637035bf18146106ff57806370a082311461072a578063715018a6146107675780637c98a6a21461077e5761031a565b8063556fedd21461066e57806355f804b3146106995780636352211e146106c25761031a565b80633b4b13811461058e5780633ccfd60b146105aa57806342842e0e146105b45780634f6ccce7146105dd578063518302271461061a578063548db174146106455761031a565b80631e84c413116102d75780632f745c59116102b15780632f745c59146104c057806332cb6b0c146104fd5780633549345e146105285780633af32abf146105515761031a565b80631e84c413146104555780632316b4da1461048057806323b872dd146104975761031a565b806301ffc9a71461031f57806306fdde031461035c578063081812fc14610387578063095ea7b3146103c457806318160ddd146103ed5780631e7269c514610418575b600080fd5b34801561032b57600080fd5b5061034660048036038101906103419190613d4b565b610c16565b6040516103539190613d93565b60405180910390f35b34801561036857600080fd5b50610371610c90565b60405161037e9190613e47565b60405180910390f35b34801561039357600080fd5b506103ae60048036038101906103a99190613e9f565b610d22565b6040516103bb9190613f0d565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e69190613f54565b610da7565b005b3480156103f957600080fd5b50610402610ebf565b60405161040f9190613fa3565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a9190613fbe565b610ecc565b60405161044c9190613fa3565b60405180910390f35b34801561046157600080fd5b5061046a610ee4565b6040516104779190613d93565b60405180910390f35b34801561048c57600080fd5b50610495610efb565b005b3480156104a357600080fd5b506104be60048036038101906104b99190613feb565b610faf565b005b3480156104cc57600080fd5b506104e760048036038101906104e29190613f54565b61100f565b6040516104f49190613fa3565b60405180910390f35b34801561050957600080fd5b506105126110b4565b60405161051f9190613fa3565b60405180910390f35b34801561053457600080fd5b5061054f600480360381019061054a9190613e9f565b6110ba565b005b34801561055d57600080fd5b5061057860048036038101906105739190613fbe565b611140565b6040516105859190613d93565b60405180910390f35b6105a860048036038101906105a39190613e9f565b611160565b005b6105b261159f565b005b3480156105c057600080fd5b506105db60048036038101906105d69190613feb565b611713565b005b3480156105e957600080fd5b5061060460048036038101906105ff9190613e9f565b611733565b6040516106119190613fa3565b60405180910390f35b34801561062657600080fd5b5061062f6117a4565b60405161063c9190613d93565b60405180910390f35b34801561065157600080fd5b5061066c60048036038101906106679190614186565b6117b7565b005b34801561067a57600080fd5b506106836118c8565b6040516106909190613fa3565b60405180910390f35b3480156106a557600080fd5b506106c060048036038101906106bb9190614284565b6118ce565b005b3480156106ce57600080fd5b506106e960048036038101906106e49190613e9f565b611964565b6040516106f69190613f0d565b60405180910390f35b34801561070b57600080fd5b50610714611a16565b6040516107219190613e47565b60405180910390f35b34801561073657600080fd5b50610751600480360381019061074c9190613fbe565b611aa4565b60405161075e9190613fa3565b60405180910390f35b34801561077357600080fd5b5061077c611b5c565b005b34801561078a57600080fd5b50610793611be4565b6040516107a09190613fa3565b60405180910390f35b3480156107b557600080fd5b506107d060048036038101906107cb9190614186565b611bea565b005b3480156107de57600080fd5b506107f960048036038101906107f49190613fbe565b611cfb565b604051610806919061438b565b60405180910390f35b34801561081b57600080fd5b50610824611da9565b6040516108319190613fa3565b60405180910390f35b34801561084657600080fd5b5061084f611daf565b60405161085c9190613f0d565b60405180910390f35b34801561087157600080fd5b5061088c60048036038101906108879190613e9f565b611dd9565b005b34801561089a57600080fd5b506108a3611e5f565b6040516108b09190613e47565b60405180910390f35b3480156108c557600080fd5b506108e060048036038101906108db9190613fbe565b611ef1565b6040516108ed9190613fa3565b60405180910390f35b34801561090257600080fd5b5061090b611f09565b6040516109189190613d93565b60405180910390f35b34801561092d57600080fd5b50610948600480360381019061094391906143d9565b611f20565b005b34801561095657600080fd5b5061095f611f36565b005b34801561096d57600080fd5b50610976611fcf565b6040516109839190613fa3565b60405180910390f35b34801561099857600080fd5b506109a1611fd5565b005b3480156109af57600080fd5b506109ca60048036038101906109c59190613e9f565b61206e565b6040516109d79190613fa3565b60405180910390f35b3480156109ec57600080fd5b506109f56120b0565b604051610a029190613fa3565b60405180910390f35b348015610a1757600080fd5b50610a326004803603810190610a2d9190613e9f565b6120b6565b005b348015610a4057600080fd5b50610a4961213c565b005b348015610a5757600080fd5b50610a726004803603810190610a6d91906144ba565b6121d5565b005b348015610a8057600080fd5b50610a9b6004803603810190610a969190613e9f565b612237565b005b348015610aa957600080fd5b50610ab26122bd565b005b348015610ac057600080fd5b50610adb6004803603810190610ad69190613e9f565b612371565b604051610ae89190613e47565b60405180910390f35b348015610afd57600080fd5b50610b186004803603810190610b139190613e9f565b6124bf565b005b348015610b2657600080fd5b50610b2f612565565b604051610b3c9190613fa3565b60405180910390f35b348015610b5157600080fd5b50610b5a61256b565b604051610b679190613e47565b60405180910390f35b348015610b7c57600080fd5b50610b976004803603810190610b92919061453d565b6125f9565b604051610ba49190613d93565b60405180910390f35b348015610bb957600080fd5b50610bc261268d565b005b348015610bd057600080fd5b50610beb6004803603810190610be69190613fbe565b612726565b005b348015610bf957600080fd5b50610c146004803603810190610c0f9190614284565b61281e565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c895750610c88826128b4565b5b9050919050565b606060008054610c9f906145ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610ccb906145ac565b8015610d185780601f10610ced57610100808354040283529160200191610d18565b820191906000526020600020905b815481529060010190602001808311610cfb57829003601f168201915b5050505050905090565b6000610d2d82612996565b610d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6390614650565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610db282611964565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1a906146e2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e42612a02565b73ffffffffffffffffffffffffffffffffffffffff161480610e715750610e7081610e6b612a02565b6125f9565b5b610eb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea790614774565b60405180910390fd5b610eba8383612a0a565b505050565b6000600880549050905090565b600e6020528060005260406000206000915090505481565b6000600c60009054906101000a900460ff16905090565b610f03612a02565b73ffffffffffffffffffffffffffffffffffffffff16610f21611daf565b73ffffffffffffffffffffffffffffffffffffffff1614610f77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6e906147e0565b60405180910390fd5b6000601060006101000a81548160ff0219169083151502179055506001600c60006101000a81548160ff021916908315150217905550565b610fc0610fba612a02565b82612ac3565b610fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff690614872565b60405180910390fd5b61100a838383612ba1565b505050565b600061101a83611aa4565b821061105b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105290614904565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6101f481565b6110c2612a02565b73ffffffffffffffffffffffffffffffffffffffff166110e0611daf565b73ffffffffffffffffffffffffffffffffffffffff1614611136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112d906147e0565b60405180910390fd5b8060118190555050565b60136020528060005260406000206000915054906101000a900460ff1681565b601060009054906101000a900460ff16806111875750600c60009054906101000a900460ff165b6111c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bd90614970565b60405180910390fd5b60006111d2600b612e08565b90506101f46111ea8383612e1690919063ffffffff16565b111561122b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611222906149dc565b60405180910390fd5b6000821161126e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126590614a48565b60405180910390fd5b6112778261206e565b3410156112b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b090614ada565b60405180910390fd5b601060009054906101000a900460ff161561149957601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661135a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135190614b46565b60405180910390fd5b81601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113a99190614b95565b92505081905550601654601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142b90614c5d565b60405180910390fd5b81601560008282546114469190614b95565b925050819055506014546015541115611494576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148b90614c5d565b60405180910390fd5b611574565b81600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114e89190614b95565b92505081905550600f54600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611573576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156a90614cef565b60405180910390fd5b5b60005b8281101561159a57611587612e2c565b808061159290614d0f565b915050611577565b505050565b6115a7612a02565b73ffffffffffffffffffffffffffffffffffffffff166115c5611daf565b73ffffffffffffffffffffffffffffffffffffffff161461161b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611612906147e0565b60405180910390fd5b600047905060008111611663576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165a90614da4565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff168260405161168990614df5565b60006040518083038185875af1925050503d80600081146116c6576040519150601f19603f3d011682016040523d82523d6000602084013e6116cb565b606091505b505090508061170f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170690614e56565b60405180910390fd5b5050565b61172e838383604051806020016040528060008152506121d5565b505050565b600061173d610ebf565b821061177e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177590614ee8565b60405180910390fd5b6008828154811061179257611791614f08565b5b90600052602060002001549050919050565b601760009054906101000a900460ff1681565b6117bf612a02565b73ffffffffffffffffffffffffffffffffffffffff166117dd611daf565b73ffffffffffffffffffffffffffffffffffffffff1614611833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182a906147e0565b60405180910390fd5b60005b81518110156118c45760006013600084848151811061185857611857614f08565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806118bc90614d0f565b915050611836565b5050565b60115481565b6118d6612a02565b73ffffffffffffffffffffffffffffffffffffffff166118f4611daf565b73ffffffffffffffffffffffffffffffffffffffff161461194a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611941906147e0565b60405180910390fd5b8060189080519060200190611960929190613c3c565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0490614fa9565b60405180910390fd5b80915050919050565b60198054611a23906145ac565b80601f0160208091040260200160405190810160405280929190818152602001828054611a4f906145ac565b8015611a9c5780601f10611a7157610100808354040283529160200191611a9c565b820191906000526020600020905b815481529060010190602001808311611a7f57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0c9061503b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611b64612a02565b73ffffffffffffffffffffffffffffffffffffffff16611b82611daf565b73ffffffffffffffffffffffffffffffffffffffff1614611bd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcf906147e0565b60405180910390fd5b611be26000612e71565b565b60155481565b611bf2612a02565b73ffffffffffffffffffffffffffffffffffffffff16611c10611daf565b73ffffffffffffffffffffffffffffffffffffffff1614611c66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5d906147e0565b60405180910390fd5b60005b8151811015611cf757600160136000848481518110611c8b57611c8a614f08565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611cef90614d0f565b915050611c69565b5050565b60606000611d0883611aa4565b905060008167ffffffffffffffff811115611d2657611d25614043565b5b604051908082528060200260200182016040528015611d545781602001602082028036833780820191505090505b50905060005b82811015611d9e57611d6c858261100f565b828281518110611d7f57611d7e614f08565b5b6020026020010181815250508080611d9690614d0f565b915050611d5a565b508092505050919050565b600d5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611de1612a02565b73ffffffffffffffffffffffffffffffffffffffff16611dff611daf565b73ffffffffffffffffffffffffffffffffffffffff1614611e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4c906147e0565b60405180910390fd5b80600d8190555050565b606060018054611e6e906145ac565b80601f0160208091040260200160405190810160405280929190818152602001828054611e9a906145ac565b8015611ee75780601f10611ebc57610100808354040283529160200191611ee7565b820191906000526020600020905b815481529060010190602001808311611eca57829003601f168201915b5050505050905090565b60126020528060005260406000206000915090505481565b6000601060009054906101000a900460ff16905090565b611f32611f2b612a02565b8383612f37565b5050565b611f3e612a02565b73ffffffffffffffffffffffffffffffffffffffff16611f5c611daf565b73ffffffffffffffffffffffffffffffffffffffff1614611fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa9906147e0565b60405180910390fd5b6001601760006101000a81548160ff021916908315150217905550565b60165481565b611fdd612a02565b73ffffffffffffffffffffffffffffffffffffffff16611ffb611daf565b73ffffffffffffffffffffffffffffffffffffffff1614612051576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612048906147e0565b60405180910390fd5b6000601060006101000a81548160ff021916908315150217905550565b6000601060009054906101000a900460ff161561209a5760115482612093919061505b565b90506120ab565b600d54826120a8919061505b565b90505b919050565b60145481565b6120be612a02565b73ffffffffffffffffffffffffffffffffffffffff166120dc611daf565b73ffffffffffffffffffffffffffffffffffffffff1614612132576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612129906147e0565b60405180910390fd5b80600f8190555050565b612144612a02565b73ffffffffffffffffffffffffffffffffffffffff16612162611daf565b73ffffffffffffffffffffffffffffffffffffffff16146121b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121af906147e0565b60405180910390fd5b6000601760006101000a81548160ff021916908315150217905550565b6121e66121e0612a02565b83612ac3565b612225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221c90614872565b60405180910390fd5b612231848484846130a4565b50505050565b61223f612a02565b73ffffffffffffffffffffffffffffffffffffffff1661225d611daf565b73ffffffffffffffffffffffffffffffffffffffff16146122b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122aa906147e0565b60405180910390fd5b8060168190555050565b6122c5612a02565b73ffffffffffffffffffffffffffffffffffffffff166122e3611daf565b73ffffffffffffffffffffffffffffffffffffffff1614612339576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612330906147e0565b60405180910390fd5b6000600c60006101000a81548160ff0219169083151502179055506001601060006101000a81548160ff021916908315150217905550565b606061237c82612996565b6123bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b290615127565b60405180910390fd5b601760009054906101000a900460ff1661246157601980546123dc906145ac565b80601f0160208091040260200160405190810160405280929190818152602001828054612408906145ac565b80156124555780601f1061242a57610100808354040283529160200191612455565b820191906000526020600020905b81548152906001019060200180831161243857829003601f168201915b505050505090506124ba565b600061246b613100565b9050600081511161248b57604051806020016040528060008152506124b6565b8061249584613239565b6040516020016124a6929190615183565b6040516020818303038152906040525b9150505b919050565b6124c7612a02565b73ffffffffffffffffffffffffffffffffffffffff166124e5611daf565b73ffffffffffffffffffffffffffffffffffffffff161461253b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612532906147e0565b60405180910390fd5b60005b818110156125615761254e612e2c565b808061255990614d0f565b91505061253e565b5050565b600f5481565b60188054612578906145ac565b80601f01602080910402602001604051908101604052809291908181526020018280546125a4906145ac565b80156125f15780601f106125c6576101008083540402835291602001916125f1565b820191906000526020600020905b8154815290600101906020018083116125d457829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612695612a02565b73ffffffffffffffffffffffffffffffffffffffff166126b3611daf565b73ffffffffffffffffffffffffffffffffffffffff1614612709576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612700906147e0565b60405180910390fd5b6000600c60006101000a81548160ff021916908315150217905550565b61272e612a02565b73ffffffffffffffffffffffffffffffffffffffff1661274c611daf565b73ffffffffffffffffffffffffffffffffffffffff16146127a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612799906147e0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612812576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280990615219565b60405180910390fd5b61281b81612e71565b50565b612826612a02565b73ffffffffffffffffffffffffffffffffffffffff16612844611daf565b73ffffffffffffffffffffffffffffffffffffffff161461289a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612891906147e0565b60405180910390fd5b80601990805190602001906128b0929190613c3c565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061297f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061298f575061298e8261339a565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612a7d83611964565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612ace82612996565b612b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b04906152ab565b60405180910390fd5b6000612b1883611964565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b5a5750612b5981856125f9565b5b80612b9857508373ffffffffffffffffffffffffffffffffffffffff16612b8084610d22565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612bc182611964565b73ffffffffffffffffffffffffffffffffffffffff1614612c17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0e9061533d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7e906153cf565b60405180910390fd5b612c92838383613404565b612c9d600082612a0a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ced91906153ef565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d449190614b95565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e03838383613518565b505050565b600081600001549050919050565b60008183612e249190614b95565b905092915050565b6000612e38600b612e08565b90506000811415612e5a57612e4d600b61351d565b612e57600b612e08565b90505b612e643382613533565b612e6e600b61351d565b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9d9061546f565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516130979190613d93565b60405180910390a3505050565b6130af848484612ba1565b6130bb84848484613551565b6130fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f190615501565b60405180910390fd5b50505050565b6060601760009054906101000a900460ff166131a85760198054613123906145ac565b80601f016020809104026020016040519081016040528092919081815260200182805461314f906145ac565b801561319c5780601f106131715761010080835404028352916020019161319c565b820191906000526020600020905b81548152906001019060200180831161317f57829003601f168201915b50505050509050613236565b601880546131b5906145ac565b80601f01602080910402602001604051908101604052809291908181526020018280546131e1906145ac565b801561322e5780601f106132035761010080835404028352916020019161322e565b820191906000526020600020905b81548152906001019060200180831161321157829003601f168201915b505050505090505b90565b60606000821415613281576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613395565b600082905060005b600082146132b357808061329c90614d0f565b915050600a826132ac9190615550565b9150613289565b60008167ffffffffffffffff8111156132cf576132ce614043565b5b6040519080825280601f01601f1916602001820160405280156133015781602001600182028036833780820191505090505b5090505b6000851461338e5760018261331a91906153ef565b9150600a856133299190615581565b60306133359190614b95565b60f81b81838151811061334b5761334a614f08565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133879190615550565b9450613305565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61340f8383836136d9565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134525761344d816136de565b613491565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146134905761348f8382613727565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134d4576134cf81613894565b613513565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613512576135118282613965565b5b5b505050565b505050565b6001816000016000828254019250508190555050565b61354d8282604051806020016040528060008152506139e4565b5050565b60006135728473ffffffffffffffffffffffffffffffffffffffff16613a3f565b156136cc578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261359b612a02565b8786866040518563ffffffff1660e01b81526004016135bd9493929190615607565b6020604051808303816000875af19250505080156135f957506040513d601f19601f820116820180604052508101906135f69190615668565b60015b61367c573d8060008114613629576040519150601f19603f3d011682016040523d82523d6000602084013e61362e565b606091505b50600081511415613674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161366b90615501565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506136d1565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161373484611aa4565b61373e91906153ef565b9050600060076000848152602001908152602001600020549050818114613823576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506138a891906153ef565b90506000600960008481526020019081526020016000205490506000600883815481106138d8576138d7614f08565b5b9060005260206000200154905080600883815481106138fa576138f9614f08565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061394957613948615695565b5b6001900381819060005260206000200160009055905550505050565b600061397083611aa4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6139ee8383613a62565b6139fb6000848484613551565b613a3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a3190615501565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ac990615710565b60405180910390fd5b613adb81612996565b15613b1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b129061577c565b60405180910390fd5b613b2760008383613404565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613b779190614b95565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613c3860008383613518565b5050565b828054613c48906145ac565b90600052602060002090601f016020900481019282613c6a5760008555613cb1565b82601f10613c8357805160ff1916838001178555613cb1565b82800160010185558215613cb1579182015b82811115613cb0578251825591602001919060010190613c95565b5b509050613cbe9190613cc2565b5090565b5b80821115613cdb576000816000905550600101613cc3565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613d2881613cf3565b8114613d3357600080fd5b50565b600081359050613d4581613d1f565b92915050565b600060208284031215613d6157613d60613ce9565b5b6000613d6f84828501613d36565b91505092915050565b60008115159050919050565b613d8d81613d78565b82525050565b6000602082019050613da86000830184613d84565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613de8578082015181840152602081019050613dcd565b83811115613df7576000848401525b50505050565b6000601f19601f8301169050919050565b6000613e1982613dae565b613e238185613db9565b9350613e33818560208601613dca565b613e3c81613dfd565b840191505092915050565b60006020820190508181036000830152613e618184613e0e565b905092915050565b6000819050919050565b613e7c81613e69565b8114613e8757600080fd5b50565b600081359050613e9981613e73565b92915050565b600060208284031215613eb557613eb4613ce9565b5b6000613ec384828501613e8a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613ef782613ecc565b9050919050565b613f0781613eec565b82525050565b6000602082019050613f226000830184613efe565b92915050565b613f3181613eec565b8114613f3c57600080fd5b50565b600081359050613f4e81613f28565b92915050565b60008060408385031215613f6b57613f6a613ce9565b5b6000613f7985828601613f3f565b9250506020613f8a85828601613e8a565b9150509250929050565b613f9d81613e69565b82525050565b6000602082019050613fb86000830184613f94565b92915050565b600060208284031215613fd457613fd3613ce9565b5b6000613fe284828501613f3f565b91505092915050565b60008060006060848603121561400457614003613ce9565b5b600061401286828701613f3f565b935050602061402386828701613f3f565b925050604061403486828701613e8a565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61407b82613dfd565b810181811067ffffffffffffffff8211171561409a57614099614043565b5b80604052505050565b60006140ad613cdf565b90506140b98282614072565b919050565b600067ffffffffffffffff8211156140d9576140d8614043565b5b602082029050602081019050919050565b600080fd5b60006141026140fd846140be565b6140a3565b90508083825260208201905060208402830185811115614125576141246140ea565b5b835b8181101561414e578061413a8882613f3f565b845260208401935050602081019050614127565b5050509392505050565b600082601f83011261416d5761416c61403e565b5b813561417d8482602086016140ef565b91505092915050565b60006020828403121561419c5761419b613ce9565b5b600082013567ffffffffffffffff8111156141ba576141b9613cee565b5b6141c684828501614158565b91505092915050565b600080fd5b600067ffffffffffffffff8211156141ef576141ee614043565b5b6141f882613dfd565b9050602081019050919050565b82818337600083830152505050565b6000614227614222846141d4565b6140a3565b905082815260208101848484011115614243576142426141cf565b5b61424e848285614205565b509392505050565b600082601f83011261426b5761426a61403e565b5b813561427b848260208601614214565b91505092915050565b60006020828403121561429a57614299613ce9565b5b600082013567ffffffffffffffff8111156142b8576142b7613cee565b5b6142c484828501614256565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61430281613e69565b82525050565b600061431483836142f9565b60208301905092915050565b6000602082019050919050565b6000614338826142cd565b61434281856142d8565b935061434d836142e9565b8060005b8381101561437e5781516143658882614308565b975061437083614320565b925050600181019050614351565b5085935050505092915050565b600060208201905081810360008301526143a5818461432d565b905092915050565b6143b681613d78565b81146143c157600080fd5b50565b6000813590506143d3816143ad565b92915050565b600080604083850312156143f0576143ef613ce9565b5b60006143fe85828601613f3f565b925050602061440f858286016143c4565b9150509250929050565b600067ffffffffffffffff82111561443457614433614043565b5b61443d82613dfd565b9050602081019050919050565b600061445d61445884614419565b6140a3565b905082815260208101848484011115614479576144786141cf565b5b614484848285614205565b509392505050565b600082601f8301126144a1576144a061403e565b5b81356144b184826020860161444a565b91505092915050565b600080600080608085870312156144d4576144d3613ce9565b5b60006144e287828801613f3f565b94505060206144f387828801613f3f565b935050604061450487828801613e8a565b925050606085013567ffffffffffffffff81111561452557614524613cee565b5b6145318782880161448c565b91505092959194509250565b6000806040838503121561455457614553613ce9565b5b600061456285828601613f3f565b925050602061457385828601613f3f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806145c457607f821691505b602082108114156145d8576145d761457d565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061463a602c83613db9565b9150614645826145de565b604082019050919050565b600060208201905081810360008301526146698161462d565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006146cc602183613db9565b91506146d782614670565b604082019050919050565b600060208201905081810360008301526146fb816146bf565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061475e603883613db9565b915061476982614702565b604082019050919050565b6000602082019050818103600083015261478d81614751565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006147ca602083613db9565b91506147d582614794565b602082019050919050565b600060208201905081810360008301526147f9816147bd565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061485c603183613db9565b915061486782614800565b604082019050919050565b6000602082019050818103600083015261488b8161484f565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006148ee602b83613db9565b91506148f982614892565b604082019050919050565b6000602082019050818103600083015261491d816148e1565b9050919050565b7f4e6f2073616c6520616374697665210000000000000000000000000000000000600082015250565b600061495a600f83613db9565b915061496582614924565b602082019050919050565b600060208201905081810360008301526149898161494d565b9050919050565b7f4e6f7420656e6f756768204e465473206c656674210000000000000000000000600082015250565b60006149c6601583613db9565b91506149d182614990565b602082019050919050565b600060208201905081810360008301526149f5816149b9565b9050919050565b7f43616e6e6f74206d696e742030204e4654732e00000000000000000000000000600082015250565b6000614a32601383613db9565b9150614a3d826149fc565b602082019050919050565b60006020820190508181036000830152614a6181614a25565b9050919050565b7f4e6f7420656e6f75676820657468657220746f207075726368617365204e465460008201527f732e000000000000000000000000000000000000000000000000000000000000602082015250565b6000614ac4602283613db9565b9150614acf82614a68565b604082019050919050565b60006020820190508181036000830152614af381614ab7565b9050919050565b7f41646472657373206973206e6f742077686974656c6973746564210000000000600082015250565b6000614b30601b83613db9565b9150614b3b82614afa565b602082019050919050565b60006020820190508181036000830152614b5f81614b23565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614ba082613e69565b9150614bab83613e69565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614be057614bdf614b66565b5b828201905092915050565b7f416464726573732063616e2774206d696e74206d6f7265204e46547320696e2060008201527f7072652d73616c652e0000000000000000000000000000000000000000000000602082015250565b6000614c47602983613db9565b9150614c5282614beb565b604082019050919050565b60006020820190508181036000830152614c7681614c3a565b9050919050565b7f416464726573732063616e2774206d696e74206d6f7265204e46547320696e2060008201527f7075626c69632d73616c652e0000000000000000000000000000000000000000602082015250565b6000614cd9602c83613db9565b9150614ce482614c7d565b604082019050919050565b60006020820190508181036000830152614d0881614ccc565b9050919050565b6000614d1a82613e69565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d4d57614d4c614b66565b5b600182019050919050565b7f4e6f206574686572206c65667420746f20776974686472617700000000000000600082015250565b6000614d8e601983613db9565b9150614d9982614d58565b602082019050919050565b60006020820190508181036000830152614dbd81614d81565b9050919050565b600081905092915050565b50565b6000614ddf600083614dc4565b9150614dea82614dcf565b600082019050919050565b6000614e0082614dd2565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b6000614e40601083613db9565b9150614e4b82614e0a565b602082019050919050565b60006020820190508181036000830152614e6f81614e33565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614ed2602c83613db9565b9150614edd82614e76565b604082019050919050565b60006020820190508181036000830152614f0181614ec5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614f93602983613db9565b9150614f9e82614f37565b604082019050919050565b60006020820190508181036000830152614fc281614f86565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000615025602a83613db9565b915061503082614fc9565b604082019050919050565b6000602082019050818103600083015261505481615018565b9050919050565b600061506682613e69565b915061507183613e69565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156150aa576150a9614b66565b5b828202905092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615111602f83613db9565b915061511c826150b5565b604082019050919050565b6000602082019050818103600083015261514081615104565b9050919050565b600081905092915050565b600061515d82613dae565b6151678185615147565b9350615177818560208601613dca565b80840191505092915050565b600061518f8285615152565b915061519b8284615152565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615203602683613db9565b915061520e826151a7565b604082019050919050565b60006020820190508181036000830152615232816151f6565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000615295602c83613db9565b91506152a082615239565b604082019050919050565b600060208201905081810360008301526152c481615288565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000615327602583613db9565b9150615332826152cb565b604082019050919050565b600060208201905081810360008301526153568161531a565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006153b9602483613db9565b91506153c48261535d565b604082019050919050565b600060208201905081810360008301526153e8816153ac565b9050919050565b60006153fa82613e69565b915061540583613e69565b92508282101561541857615417614b66565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615459601983613db9565b915061546482615423565b602082019050919050565b600060208201905081810360008301526154888161544c565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006154eb603283613db9565b91506154f68261548f565b604082019050919050565b6000602082019050818103600083015261551a816154de565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061555b82613e69565b915061556683613e69565b92508261557657615575615521565b5b828204905092915050565b600061558c82613e69565b915061559783613e69565b9250826155a7576155a6615521565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006155d9826155b2565b6155e381856155bd565b93506155f3818560208601613dca565b6155fc81613dfd565b840191505092915050565b600060808201905061561c6000830187613efe565b6156296020830186613efe565b6156366040830185613f94565b818103606083015261564881846155ce565b905095945050505050565b60008151905061566281613d1f565b92915050565b60006020828403121561567e5761567d613ce9565b5b600061568c84828501615653565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006156fa602083613db9565b9150615705826156c4565b602082019050919050565b60006020820190508181036000830152615729816156ed565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615766601c83613db9565b915061577182615730565b602082019050919050565b6000602082019050818103600083015261579581615759565b905091905056fea26469706673582212201ed5f8af591421a24084fe70879c6253455671836152328ccea738f613884e9564736f6c634300080a0033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000006b68747470733a2f2f697066732e696f2f697066732f516d524772436b4e384d7a58484143366f4262346864755846547859524a745a576779766858347a4133437633383f66696c656e616d653d7477635f673530305f6d657461646174615f6d696e745f76312e6a736f6e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004368747470733a2f2f697066732e696f2f697066732f516d57684d53764b4d7a454c6e66543255794c417931366f545365445868376f394861764e3862574b744a7657640000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061031a5760003560e01c80637f649783116101ab578063af8465f4116100f7578063ca9c9e1511610095578063e985e9c51161006f578063e985e9c514610b70578063ec8db81714610bad578063f2fde38b14610bc4578063fe2c7fee14610bed5761031a565b8063ca9c9e1514610af1578063d1e8c13e14610b1a578063d547cfb714610b455761031a565b8063b88d4fde116100d1578063b88d4fde14610a4b578063c21018d514610a74578063c80becb614610a9d578063c87b56dd14610ab45761031a565b8063af8465f4146109e0578063b49acd6d14610a0b578063b62a762514610a345761031a565b8063963c417711610164578063a475b5dd1161013e578063a475b5dd1461094a578063aa1acb5414610961578063adf6431e1461098c578063ae104265146109a35761031a565b8063963c4177146108b95780639d044ed3146108f6578063a22cb465146109215761031a565b80637f649783146107a95780638462151c146107d25780638d859f3e1461080f5780638da5cb5b1461083a57806391b7f5ed1461086557806395d89b411461088e5761031a565b80633b4b13811161026a578063556fedd2116102235780637035bf18116101fd5780637035bf18146106ff57806370a082311461072a578063715018a6146107675780637c98a6a21461077e5761031a565b8063556fedd21461066e57806355f804b3146106995780636352211e146106c25761031a565b80633b4b13811461058e5780633ccfd60b146105aa57806342842e0e146105b45780634f6ccce7146105dd578063518302271461061a578063548db174146106455761031a565b80631e84c413116102d75780632f745c59116102b15780632f745c59146104c057806332cb6b0c146104fd5780633549345e146105285780633af32abf146105515761031a565b80631e84c413146104555780632316b4da1461048057806323b872dd146104975761031a565b806301ffc9a71461031f57806306fdde031461035c578063081812fc14610387578063095ea7b3146103c457806318160ddd146103ed5780631e7269c514610418575b600080fd5b34801561032b57600080fd5b5061034660048036038101906103419190613d4b565b610c16565b6040516103539190613d93565b60405180910390f35b34801561036857600080fd5b50610371610c90565b60405161037e9190613e47565b60405180910390f35b34801561039357600080fd5b506103ae60048036038101906103a99190613e9f565b610d22565b6040516103bb9190613f0d565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e69190613f54565b610da7565b005b3480156103f957600080fd5b50610402610ebf565b60405161040f9190613fa3565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a9190613fbe565b610ecc565b60405161044c9190613fa3565b60405180910390f35b34801561046157600080fd5b5061046a610ee4565b6040516104779190613d93565b60405180910390f35b34801561048c57600080fd5b50610495610efb565b005b3480156104a357600080fd5b506104be60048036038101906104b99190613feb565b610faf565b005b3480156104cc57600080fd5b506104e760048036038101906104e29190613f54565b61100f565b6040516104f49190613fa3565b60405180910390f35b34801561050957600080fd5b506105126110b4565b60405161051f9190613fa3565b60405180910390f35b34801561053457600080fd5b5061054f600480360381019061054a9190613e9f565b6110ba565b005b34801561055d57600080fd5b5061057860048036038101906105739190613fbe565b611140565b6040516105859190613d93565b60405180910390f35b6105a860048036038101906105a39190613e9f565b611160565b005b6105b261159f565b005b3480156105c057600080fd5b506105db60048036038101906105d69190613feb565b611713565b005b3480156105e957600080fd5b5061060460048036038101906105ff9190613e9f565b611733565b6040516106119190613fa3565b60405180910390f35b34801561062657600080fd5b5061062f6117a4565b60405161063c9190613d93565b60405180910390f35b34801561065157600080fd5b5061066c60048036038101906106679190614186565b6117b7565b005b34801561067a57600080fd5b506106836118c8565b6040516106909190613fa3565b60405180910390f35b3480156106a557600080fd5b506106c060048036038101906106bb9190614284565b6118ce565b005b3480156106ce57600080fd5b506106e960048036038101906106e49190613e9f565b611964565b6040516106f69190613f0d565b60405180910390f35b34801561070b57600080fd5b50610714611a16565b6040516107219190613e47565b60405180910390f35b34801561073657600080fd5b50610751600480360381019061074c9190613fbe565b611aa4565b60405161075e9190613fa3565b60405180910390f35b34801561077357600080fd5b5061077c611b5c565b005b34801561078a57600080fd5b50610793611be4565b6040516107a09190613fa3565b60405180910390f35b3480156107b557600080fd5b506107d060048036038101906107cb9190614186565b611bea565b005b3480156107de57600080fd5b506107f960048036038101906107f49190613fbe565b611cfb565b604051610806919061438b565b60405180910390f35b34801561081b57600080fd5b50610824611da9565b6040516108319190613fa3565b60405180910390f35b34801561084657600080fd5b5061084f611daf565b60405161085c9190613f0d565b60405180910390f35b34801561087157600080fd5b5061088c60048036038101906108879190613e9f565b611dd9565b005b34801561089a57600080fd5b506108a3611e5f565b6040516108b09190613e47565b60405180910390f35b3480156108c557600080fd5b506108e060048036038101906108db9190613fbe565b611ef1565b6040516108ed9190613fa3565b60405180910390f35b34801561090257600080fd5b5061090b611f09565b6040516109189190613d93565b60405180910390f35b34801561092d57600080fd5b50610948600480360381019061094391906143d9565b611f20565b005b34801561095657600080fd5b5061095f611f36565b005b34801561096d57600080fd5b50610976611fcf565b6040516109839190613fa3565b60405180910390f35b34801561099857600080fd5b506109a1611fd5565b005b3480156109af57600080fd5b506109ca60048036038101906109c59190613e9f565b61206e565b6040516109d79190613fa3565b60405180910390f35b3480156109ec57600080fd5b506109f56120b0565b604051610a029190613fa3565b60405180910390f35b348015610a1757600080fd5b50610a326004803603810190610a2d9190613e9f565b6120b6565b005b348015610a4057600080fd5b50610a4961213c565b005b348015610a5757600080fd5b50610a726004803603810190610a6d91906144ba565b6121d5565b005b348015610a8057600080fd5b50610a9b6004803603810190610a969190613e9f565b612237565b005b348015610aa957600080fd5b50610ab26122bd565b005b348015610ac057600080fd5b50610adb6004803603810190610ad69190613e9f565b612371565b604051610ae89190613e47565b60405180910390f35b348015610afd57600080fd5b50610b186004803603810190610b139190613e9f565b6124bf565b005b348015610b2657600080fd5b50610b2f612565565b604051610b3c9190613fa3565b60405180910390f35b348015610b5157600080fd5b50610b5a61256b565b604051610b679190613e47565b60405180910390f35b348015610b7c57600080fd5b50610b976004803603810190610b92919061453d565b6125f9565b604051610ba49190613d93565b60405180910390f35b348015610bb957600080fd5b50610bc261268d565b005b348015610bd057600080fd5b50610beb6004803603810190610be69190613fbe565b612726565b005b348015610bf957600080fd5b50610c146004803603810190610c0f9190614284565b61281e565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c895750610c88826128b4565b5b9050919050565b606060008054610c9f906145ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610ccb906145ac565b8015610d185780601f10610ced57610100808354040283529160200191610d18565b820191906000526020600020905b815481529060010190602001808311610cfb57829003601f168201915b5050505050905090565b6000610d2d82612996565b610d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6390614650565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610db282611964565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1a906146e2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e42612a02565b73ffffffffffffffffffffffffffffffffffffffff161480610e715750610e7081610e6b612a02565b6125f9565b5b610eb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea790614774565b60405180910390fd5b610eba8383612a0a565b505050565b6000600880549050905090565b600e6020528060005260406000206000915090505481565b6000600c60009054906101000a900460ff16905090565b610f03612a02565b73ffffffffffffffffffffffffffffffffffffffff16610f21611daf565b73ffffffffffffffffffffffffffffffffffffffff1614610f77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6e906147e0565b60405180910390fd5b6000601060006101000a81548160ff0219169083151502179055506001600c60006101000a81548160ff021916908315150217905550565b610fc0610fba612a02565b82612ac3565b610fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff690614872565b60405180910390fd5b61100a838383612ba1565b505050565b600061101a83611aa4565b821061105b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105290614904565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6101f481565b6110c2612a02565b73ffffffffffffffffffffffffffffffffffffffff166110e0611daf565b73ffffffffffffffffffffffffffffffffffffffff1614611136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112d906147e0565b60405180910390fd5b8060118190555050565b60136020528060005260406000206000915054906101000a900460ff1681565b601060009054906101000a900460ff16806111875750600c60009054906101000a900460ff165b6111c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bd90614970565b60405180910390fd5b60006111d2600b612e08565b90506101f46111ea8383612e1690919063ffffffff16565b111561122b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611222906149dc565b60405180910390fd5b6000821161126e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126590614a48565b60405180910390fd5b6112778261206e565b3410156112b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b090614ada565b60405180910390fd5b601060009054906101000a900460ff161561149957601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661135a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135190614b46565b60405180910390fd5b81601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113a99190614b95565b92505081905550601654601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142b90614c5d565b60405180910390fd5b81601560008282546114469190614b95565b925050819055506014546015541115611494576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148b90614c5d565b60405180910390fd5b611574565b81600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114e89190614b95565b92505081905550600f54600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611573576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156a90614cef565b60405180910390fd5b5b60005b8281101561159a57611587612e2c565b808061159290614d0f565b915050611577565b505050565b6115a7612a02565b73ffffffffffffffffffffffffffffffffffffffff166115c5611daf565b73ffffffffffffffffffffffffffffffffffffffff161461161b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611612906147e0565b60405180910390fd5b600047905060008111611663576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165a90614da4565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff168260405161168990614df5565b60006040518083038185875af1925050503d80600081146116c6576040519150601f19603f3d011682016040523d82523d6000602084013e6116cb565b606091505b505090508061170f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170690614e56565b60405180910390fd5b5050565b61172e838383604051806020016040528060008152506121d5565b505050565b600061173d610ebf565b821061177e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177590614ee8565b60405180910390fd5b6008828154811061179257611791614f08565b5b90600052602060002001549050919050565b601760009054906101000a900460ff1681565b6117bf612a02565b73ffffffffffffffffffffffffffffffffffffffff166117dd611daf565b73ffffffffffffffffffffffffffffffffffffffff1614611833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182a906147e0565b60405180910390fd5b60005b81518110156118c45760006013600084848151811061185857611857614f08565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806118bc90614d0f565b915050611836565b5050565b60115481565b6118d6612a02565b73ffffffffffffffffffffffffffffffffffffffff166118f4611daf565b73ffffffffffffffffffffffffffffffffffffffff161461194a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611941906147e0565b60405180910390fd5b8060189080519060200190611960929190613c3c565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0490614fa9565b60405180910390fd5b80915050919050565b60198054611a23906145ac565b80601f0160208091040260200160405190810160405280929190818152602001828054611a4f906145ac565b8015611a9c5780601f10611a7157610100808354040283529160200191611a9c565b820191906000526020600020905b815481529060010190602001808311611a7f57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0c9061503b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611b64612a02565b73ffffffffffffffffffffffffffffffffffffffff16611b82611daf565b73ffffffffffffffffffffffffffffffffffffffff1614611bd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcf906147e0565b60405180910390fd5b611be26000612e71565b565b60155481565b611bf2612a02565b73ffffffffffffffffffffffffffffffffffffffff16611c10611daf565b73ffffffffffffffffffffffffffffffffffffffff1614611c66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5d906147e0565b60405180910390fd5b60005b8151811015611cf757600160136000848481518110611c8b57611c8a614f08565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611cef90614d0f565b915050611c69565b5050565b60606000611d0883611aa4565b905060008167ffffffffffffffff811115611d2657611d25614043565b5b604051908082528060200260200182016040528015611d545781602001602082028036833780820191505090505b50905060005b82811015611d9e57611d6c858261100f565b828281518110611d7f57611d7e614f08565b5b6020026020010181815250508080611d9690614d0f565b915050611d5a565b508092505050919050565b600d5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611de1612a02565b73ffffffffffffffffffffffffffffffffffffffff16611dff611daf565b73ffffffffffffffffffffffffffffffffffffffff1614611e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4c906147e0565b60405180910390fd5b80600d8190555050565b606060018054611e6e906145ac565b80601f0160208091040260200160405190810160405280929190818152602001828054611e9a906145ac565b8015611ee75780601f10611ebc57610100808354040283529160200191611ee7565b820191906000526020600020905b815481529060010190602001808311611eca57829003601f168201915b5050505050905090565b60126020528060005260406000206000915090505481565b6000601060009054906101000a900460ff16905090565b611f32611f2b612a02565b8383612f37565b5050565b611f3e612a02565b73ffffffffffffffffffffffffffffffffffffffff16611f5c611daf565b73ffffffffffffffffffffffffffffffffffffffff1614611fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa9906147e0565b60405180910390fd5b6001601760006101000a81548160ff021916908315150217905550565b60165481565b611fdd612a02565b73ffffffffffffffffffffffffffffffffffffffff16611ffb611daf565b73ffffffffffffffffffffffffffffffffffffffff1614612051576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612048906147e0565b60405180910390fd5b6000601060006101000a81548160ff021916908315150217905550565b6000601060009054906101000a900460ff161561209a5760115482612093919061505b565b90506120ab565b600d54826120a8919061505b565b90505b919050565b60145481565b6120be612a02565b73ffffffffffffffffffffffffffffffffffffffff166120dc611daf565b73ffffffffffffffffffffffffffffffffffffffff1614612132576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612129906147e0565b60405180910390fd5b80600f8190555050565b612144612a02565b73ffffffffffffffffffffffffffffffffffffffff16612162611daf565b73ffffffffffffffffffffffffffffffffffffffff16146121b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121af906147e0565b60405180910390fd5b6000601760006101000a81548160ff021916908315150217905550565b6121e66121e0612a02565b83612ac3565b612225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221c90614872565b60405180910390fd5b612231848484846130a4565b50505050565b61223f612a02565b73ffffffffffffffffffffffffffffffffffffffff1661225d611daf565b73ffffffffffffffffffffffffffffffffffffffff16146122b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122aa906147e0565b60405180910390fd5b8060168190555050565b6122c5612a02565b73ffffffffffffffffffffffffffffffffffffffff166122e3611daf565b73ffffffffffffffffffffffffffffffffffffffff1614612339576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612330906147e0565b60405180910390fd5b6000600c60006101000a81548160ff0219169083151502179055506001601060006101000a81548160ff021916908315150217905550565b606061237c82612996565b6123bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b290615127565b60405180910390fd5b601760009054906101000a900460ff1661246157601980546123dc906145ac565b80601f0160208091040260200160405190810160405280929190818152602001828054612408906145ac565b80156124555780601f1061242a57610100808354040283529160200191612455565b820191906000526020600020905b81548152906001019060200180831161243857829003601f168201915b505050505090506124ba565b600061246b613100565b9050600081511161248b57604051806020016040528060008152506124b6565b8061249584613239565b6040516020016124a6929190615183565b6040516020818303038152906040525b9150505b919050565b6124c7612a02565b73ffffffffffffffffffffffffffffffffffffffff166124e5611daf565b73ffffffffffffffffffffffffffffffffffffffff161461253b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612532906147e0565b60405180910390fd5b60005b818110156125615761254e612e2c565b808061255990614d0f565b91505061253e565b5050565b600f5481565b60188054612578906145ac565b80601f01602080910402602001604051908101604052809291908181526020018280546125a4906145ac565b80156125f15780601f106125c6576101008083540402835291602001916125f1565b820191906000526020600020905b8154815290600101906020018083116125d457829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612695612a02565b73ffffffffffffffffffffffffffffffffffffffff166126b3611daf565b73ffffffffffffffffffffffffffffffffffffffff1614612709576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612700906147e0565b60405180910390fd5b6000600c60006101000a81548160ff021916908315150217905550565b61272e612a02565b73ffffffffffffffffffffffffffffffffffffffff1661274c611daf565b73ffffffffffffffffffffffffffffffffffffffff16146127a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612799906147e0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612812576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280990615219565b60405180910390fd5b61281b81612e71565b50565b612826612a02565b73ffffffffffffffffffffffffffffffffffffffff16612844611daf565b73ffffffffffffffffffffffffffffffffffffffff161461289a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612891906147e0565b60405180910390fd5b80601990805190602001906128b0929190613c3c565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061297f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061298f575061298e8261339a565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612a7d83611964565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612ace82612996565b612b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b04906152ab565b60405180910390fd5b6000612b1883611964565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b5a5750612b5981856125f9565b5b80612b9857508373ffffffffffffffffffffffffffffffffffffffff16612b8084610d22565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612bc182611964565b73ffffffffffffffffffffffffffffffffffffffff1614612c17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0e9061533d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7e906153cf565b60405180910390fd5b612c92838383613404565b612c9d600082612a0a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ced91906153ef565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d449190614b95565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e03838383613518565b505050565b600081600001549050919050565b60008183612e249190614b95565b905092915050565b6000612e38600b612e08565b90506000811415612e5a57612e4d600b61351d565b612e57600b612e08565b90505b612e643382613533565b612e6e600b61351d565b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f9d9061546f565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516130979190613d93565b60405180910390a3505050565b6130af848484612ba1565b6130bb84848484613551565b6130fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f190615501565b60405180910390fd5b50505050565b6060601760009054906101000a900460ff166131a85760198054613123906145ac565b80601f016020809104026020016040519081016040528092919081815260200182805461314f906145ac565b801561319c5780601f106131715761010080835404028352916020019161319c565b820191906000526020600020905b81548152906001019060200180831161317f57829003601f168201915b50505050509050613236565b601880546131b5906145ac565b80601f01602080910402602001604051908101604052809291908181526020018280546131e1906145ac565b801561322e5780601f106132035761010080835404028352916020019161322e565b820191906000526020600020905b81548152906001019060200180831161321157829003601f168201915b505050505090505b90565b60606000821415613281576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613395565b600082905060005b600082146132b357808061329c90614d0f565b915050600a826132ac9190615550565b9150613289565b60008167ffffffffffffffff8111156132cf576132ce614043565b5b6040519080825280601f01601f1916602001820160405280156133015781602001600182028036833780820191505090505b5090505b6000851461338e5760018261331a91906153ef565b9150600a856133299190615581565b60306133359190614b95565b60f81b81838151811061334b5761334a614f08565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133879190615550565b9450613305565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61340f8383836136d9565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134525761344d816136de565b613491565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146134905761348f8382613727565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134d4576134cf81613894565b613513565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613512576135118282613965565b5b5b505050565b505050565b6001816000016000828254019250508190555050565b61354d8282604051806020016040528060008152506139e4565b5050565b60006135728473ffffffffffffffffffffffffffffffffffffffff16613a3f565b156136cc578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261359b612a02565b8786866040518563ffffffff1660e01b81526004016135bd9493929190615607565b6020604051808303816000875af19250505080156135f957506040513d601f19601f820116820180604052508101906135f69190615668565b60015b61367c573d8060008114613629576040519150601f19603f3d011682016040523d82523d6000602084013e61362e565b606091505b50600081511415613674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161366b90615501565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506136d1565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161373484611aa4565b61373e91906153ef565b9050600060076000848152602001908152602001600020549050818114613823576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506138a891906153ef565b90506000600960008481526020019081526020016000205490506000600883815481106138d8576138d7614f08565b5b9060005260206000200154905080600883815481106138fa576138f9614f08565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061394957613948615695565b5b6001900381819060005260206000200160009055905550505050565b600061397083611aa4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6139ee8383613a62565b6139fb6000848484613551565b613a3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a3190615501565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ac990615710565b60405180910390fd5b613adb81612996565b15613b1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b129061577c565b60405180910390fd5b613b2760008383613404565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613b779190614b95565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613c3860008383613518565b5050565b828054613c48906145ac565b90600052602060002090601f016020900481019282613c6a5760008555613cb1565b82601f10613c8357805160ff1916838001178555613cb1565b82800160010185558215613cb1579182015b82811115613cb0578251825591602001919060010190613c95565b5b509050613cbe9190613cc2565b5090565b5b80821115613cdb576000816000905550600101613cc3565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613d2881613cf3565b8114613d3357600080fd5b50565b600081359050613d4581613d1f565b92915050565b600060208284031215613d6157613d60613ce9565b5b6000613d6f84828501613d36565b91505092915050565b60008115159050919050565b613d8d81613d78565b82525050565b6000602082019050613da86000830184613d84565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613de8578082015181840152602081019050613dcd565b83811115613df7576000848401525b50505050565b6000601f19601f8301169050919050565b6000613e1982613dae565b613e238185613db9565b9350613e33818560208601613dca565b613e3c81613dfd565b840191505092915050565b60006020820190508181036000830152613e618184613e0e565b905092915050565b6000819050919050565b613e7c81613e69565b8114613e8757600080fd5b50565b600081359050613e9981613e73565b92915050565b600060208284031215613eb557613eb4613ce9565b5b6000613ec384828501613e8a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613ef782613ecc565b9050919050565b613f0781613eec565b82525050565b6000602082019050613f226000830184613efe565b92915050565b613f3181613eec565b8114613f3c57600080fd5b50565b600081359050613f4e81613f28565b92915050565b60008060408385031215613f6b57613f6a613ce9565b5b6000613f7985828601613f3f565b9250506020613f8a85828601613e8a565b9150509250929050565b613f9d81613e69565b82525050565b6000602082019050613fb86000830184613f94565b92915050565b600060208284031215613fd457613fd3613ce9565b5b6000613fe284828501613f3f565b91505092915050565b60008060006060848603121561400457614003613ce9565b5b600061401286828701613f3f565b935050602061402386828701613f3f565b925050604061403486828701613e8a565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61407b82613dfd565b810181811067ffffffffffffffff8211171561409a57614099614043565b5b80604052505050565b60006140ad613cdf565b90506140b98282614072565b919050565b600067ffffffffffffffff8211156140d9576140d8614043565b5b602082029050602081019050919050565b600080fd5b60006141026140fd846140be565b6140a3565b90508083825260208201905060208402830185811115614125576141246140ea565b5b835b8181101561414e578061413a8882613f3f565b845260208401935050602081019050614127565b5050509392505050565b600082601f83011261416d5761416c61403e565b5b813561417d8482602086016140ef565b91505092915050565b60006020828403121561419c5761419b613ce9565b5b600082013567ffffffffffffffff8111156141ba576141b9613cee565b5b6141c684828501614158565b91505092915050565b600080fd5b600067ffffffffffffffff8211156141ef576141ee614043565b5b6141f882613dfd565b9050602081019050919050565b82818337600083830152505050565b6000614227614222846141d4565b6140a3565b905082815260208101848484011115614243576142426141cf565b5b61424e848285614205565b509392505050565b600082601f83011261426b5761426a61403e565b5b813561427b848260208601614214565b91505092915050565b60006020828403121561429a57614299613ce9565b5b600082013567ffffffffffffffff8111156142b8576142b7613cee565b5b6142c484828501614256565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61430281613e69565b82525050565b600061431483836142f9565b60208301905092915050565b6000602082019050919050565b6000614338826142cd565b61434281856142d8565b935061434d836142e9565b8060005b8381101561437e5781516143658882614308565b975061437083614320565b925050600181019050614351565b5085935050505092915050565b600060208201905081810360008301526143a5818461432d565b905092915050565b6143b681613d78565b81146143c157600080fd5b50565b6000813590506143d3816143ad565b92915050565b600080604083850312156143f0576143ef613ce9565b5b60006143fe85828601613f3f565b925050602061440f858286016143c4565b9150509250929050565b600067ffffffffffffffff82111561443457614433614043565b5b61443d82613dfd565b9050602081019050919050565b600061445d61445884614419565b6140a3565b905082815260208101848484011115614479576144786141cf565b5b614484848285614205565b509392505050565b600082601f8301126144a1576144a061403e565b5b81356144b184826020860161444a565b91505092915050565b600080600080608085870312156144d4576144d3613ce9565b5b60006144e287828801613f3f565b94505060206144f387828801613f3f565b935050604061450487828801613e8a565b925050606085013567ffffffffffffffff81111561452557614524613cee565b5b6145318782880161448c565b91505092959194509250565b6000806040838503121561455457614553613ce9565b5b600061456285828601613f3f565b925050602061457385828601613f3f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806145c457607f821691505b602082108114156145d8576145d761457d565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061463a602c83613db9565b9150614645826145de565b604082019050919050565b600060208201905081810360008301526146698161462d565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006146cc602183613db9565b91506146d782614670565b604082019050919050565b600060208201905081810360008301526146fb816146bf565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061475e603883613db9565b915061476982614702565b604082019050919050565b6000602082019050818103600083015261478d81614751565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006147ca602083613db9565b91506147d582614794565b602082019050919050565b600060208201905081810360008301526147f9816147bd565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061485c603183613db9565b915061486782614800565b604082019050919050565b6000602082019050818103600083015261488b8161484f565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006148ee602b83613db9565b91506148f982614892565b604082019050919050565b6000602082019050818103600083015261491d816148e1565b9050919050565b7f4e6f2073616c6520616374697665210000000000000000000000000000000000600082015250565b600061495a600f83613db9565b915061496582614924565b602082019050919050565b600060208201905081810360008301526149898161494d565b9050919050565b7f4e6f7420656e6f756768204e465473206c656674210000000000000000000000600082015250565b60006149c6601583613db9565b91506149d182614990565b602082019050919050565b600060208201905081810360008301526149f5816149b9565b9050919050565b7f43616e6e6f74206d696e742030204e4654732e00000000000000000000000000600082015250565b6000614a32601383613db9565b9150614a3d826149fc565b602082019050919050565b60006020820190508181036000830152614a6181614a25565b9050919050565b7f4e6f7420656e6f75676820657468657220746f207075726368617365204e465460008201527f732e000000000000000000000000000000000000000000000000000000000000602082015250565b6000614ac4602283613db9565b9150614acf82614a68565b604082019050919050565b60006020820190508181036000830152614af381614ab7565b9050919050565b7f41646472657373206973206e6f742077686974656c6973746564210000000000600082015250565b6000614b30601b83613db9565b9150614b3b82614afa565b602082019050919050565b60006020820190508181036000830152614b5f81614b23565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614ba082613e69565b9150614bab83613e69565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614be057614bdf614b66565b5b828201905092915050565b7f416464726573732063616e2774206d696e74206d6f7265204e46547320696e2060008201527f7072652d73616c652e0000000000000000000000000000000000000000000000602082015250565b6000614c47602983613db9565b9150614c5282614beb565b604082019050919050565b60006020820190508181036000830152614c7681614c3a565b9050919050565b7f416464726573732063616e2774206d696e74206d6f7265204e46547320696e2060008201527f7075626c69632d73616c652e0000000000000000000000000000000000000000602082015250565b6000614cd9602c83613db9565b9150614ce482614c7d565b604082019050919050565b60006020820190508181036000830152614d0881614ccc565b9050919050565b6000614d1a82613e69565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d4d57614d4c614b66565b5b600182019050919050565b7f4e6f206574686572206c65667420746f20776974686472617700000000000000600082015250565b6000614d8e601983613db9565b9150614d9982614d58565b602082019050919050565b60006020820190508181036000830152614dbd81614d81565b9050919050565b600081905092915050565b50565b6000614ddf600083614dc4565b9150614dea82614dcf565b600082019050919050565b6000614e0082614dd2565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b6000614e40601083613db9565b9150614e4b82614e0a565b602082019050919050565b60006020820190508181036000830152614e6f81614e33565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614ed2602c83613db9565b9150614edd82614e76565b604082019050919050565b60006020820190508181036000830152614f0181614ec5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614f93602983613db9565b9150614f9e82614f37565b604082019050919050565b60006020820190508181036000830152614fc281614f86565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000615025602a83613db9565b915061503082614fc9565b604082019050919050565b6000602082019050818103600083015261505481615018565b9050919050565b600061506682613e69565b915061507183613e69565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156150aa576150a9614b66565b5b828202905092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615111602f83613db9565b915061511c826150b5565b604082019050919050565b6000602082019050818103600083015261514081615104565b9050919050565b600081905092915050565b600061515d82613dae565b6151678185615147565b9350615177818560208601613dca565b80840191505092915050565b600061518f8285615152565b915061519b8284615152565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615203602683613db9565b915061520e826151a7565b604082019050919050565b60006020820190508181036000830152615232816151f6565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000615295602c83613db9565b91506152a082615239565b604082019050919050565b600060208201905081810360008301526152c481615288565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000615327602583613db9565b9150615332826152cb565b604082019050919050565b600060208201905081810360008301526153568161531a565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006153b9602483613db9565b91506153c48261535d565b604082019050919050565b600060208201905081810360008301526153e8816153ac565b9050919050565b60006153fa82613e69565b915061540583613e69565b92508282101561541857615417614b66565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615459601983613db9565b915061546482615423565b602082019050919050565b600060208201905081810360008301526154888161544c565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006154eb603283613db9565b91506154f68261548f565b604082019050919050565b6000602082019050818103600083015261551a816154de565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061555b82613e69565b915061556683613e69565b92508261557657615575615521565b5b828204905092915050565b600061558c82613e69565b915061559783613e69565b9250826155a7576155a6615521565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006155d9826155b2565b6155e381856155bd565b93506155f3818560208601613dca565b6155fc81613dfd565b840191505092915050565b600060808201905061561c6000830187613efe565b6156296020830186613efe565b6156366040830185613f94565b818103606083015261564881846155ce565b905095945050505050565b60008151905061566281613d1f565b92915050565b60006020828403121561567e5761567d613ce9565b5b600061568c84828501615653565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006156fa602083613db9565b9150615705826156c4565b602082019050919050565b60006020820190508181036000830152615729816156ed565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615766601c83613db9565b915061577182615730565b602082019050919050565b6000602082019050818103600083015261579581615759565b905091905056fea26469706673582212201ed5f8af591421a24084fe70879c6253455671836152328ccea738f613884e9564736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000006b68747470733a2f2f697066732e696f2f697066732f516d524772436b4e384d7a58484143366f4262346864755846547859524a745a576779766858347a4133437633383f66696c656e616d653d7477635f673530305f6d657461646174615f6d696e745f76312e6a736f6e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004368747470733a2f2f697066732e696f2f697066732f516d57684d53764b4d7a454c6e66543255794c417931366f545365445868376f394861764e3862574b744a7657640000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : baseURI (string): https://ipfs.io/ipfs/QmRGrCkN8MzXHAC6oBb4hduXFTxYRJtZWgyvhX4zA3Cv38?filename=twc_g500_metadata_mint_v1.json
Arg [1] : _unrevealedURI (string): https://ipfs.io/ipfs/QmWhMSvKMzELnfT2UyLAy16oTSeDXh7o9HavN8bWKtJvWd
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 000000000000000000000000000000000000000000000000000000000000006b
Arg [3] : 68747470733a2f2f697066732e696f2f697066732f516d524772436b4e384d7a
Arg [4] : 58484143366f4262346864755846547859524a745a576779766858347a413343
Arg [5] : 7633383f66696c656e616d653d7477635f673530305f6d657461646174615f6d
Arg [6] : 696e745f76312e6a736f6e000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [8] : 68747470733a2f2f697066732e696f2f697066732f516d57684d53764b4d7a45
Arg [9] : 4c6e66543255794c417931366f545365445868376f394861764e3862574b744a
Arg [10] : 7657640000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
54106:5575:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43864:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30683:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32243:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31766:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44504:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54441:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55788:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58123:107;;;;;;;;;;;;;:::i;:::-;;32993:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44172:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54301:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58329:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54680:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55888:987;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57663:255;;;:::i;:::-;;33403:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44694:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54864:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58702:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54587:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59030:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30377:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54924:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30107:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51725:103;;;;;;;;;;;;;:::i;:::-;;54777:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58520:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57306:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54402:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51074:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58434:78;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30852:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54630:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55694:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32536:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59265:61;;;;;;;;;;;;;:::i;:::-;;54814:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58038:77;;;;;;;;;;;;;:::i;:::-;;56883:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54731:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59540:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59334:60;;;;;;;;;;;;;:::i;:::-;;33659:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59402:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57926:104;;;;;;;;;;;;;:::i;:::-;;55301:385;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58891:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54488:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54893:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32762:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58238:83;;;;;;;;;;;;;:::i;:::-;;51983:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59143:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43864:224;43966:4;44005:35;43990:50;;;:11;:50;;;;:90;;;;44044:36;44068:11;44044:23;:36::i;:::-;43990:90;43983:97;;43864:224;;;:::o;30683:100::-;30737:13;30770:5;30763:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30683:100;:::o;32243:221::-;32319:7;32347:16;32355:7;32347;:16::i;:::-;32339:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32432:15;:24;32448:7;32432:24;;;;;;;;;;;;;;;;;;;;;32425:31;;32243:221;;;:::o;31766:411::-;31847:13;31863:23;31878:7;31863:14;:23::i;:::-;31847:39;;31911:5;31905:11;;:2;:11;;;;31897:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32005:5;31989:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;32014:37;32031:5;32038:12;:10;:12::i;:::-;32014:16;:37::i;:::-;31989:62;31967:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;32148:21;32157:2;32161:7;32148:8;:21::i;:::-;31836:341;31766:411;;:::o;44504:113::-;44565:7;44592:10;:17;;;;44585:24;;44504:113;:::o;54441:42::-;;;;;;;;;;;;;;;;;:::o;55788:92::-;55840:4;55858:16;;;;;;;;;;;55851:23;;55788:92;:::o;58123:107::-;51305:12;:10;:12::i;:::-;51294:23;;:7;:5;:7::i;:::-;:23;;;51286:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58191:5:::1;58175:13;;:21;;;;;;;;;;;;;;;;;;58220:4;58201:16;;:23;;;;;;;;;;;;;;;;;;58123:107::o:0;32993:339::-;33188:41;33207:12;:10;:12::i;:::-;33221:7;33188:18;:41::i;:::-;33180:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33296:28;33306:4;33312:2;33316:7;33296:9;:28::i;:::-;32993:339;;;:::o;44172:256::-;44269:7;44305:23;44322:5;44305:16;:23::i;:::-;44297:5;:31;44289:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;44394:12;:19;44407:5;44394:19;;;;;;;;;;;;;;;:26;44414:5;44394:26;;;;;;;;;;;;44387:33;;44172:256;;;;:::o;54301:40::-;54338:3;54301:40;:::o;58329:97::-;51305:12;:10;:12::i;:::-;51294:23;;:7;:5;:7::i;:::-;:23;;;51286:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58410:10:::1;58398:9;:22;;;;58329:97:::0;:::o;54680:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;55888:987::-;55950:13;;;;;;;;;;;:33;;;;55967:16;;;;;;;;;;;55950:33;55942:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;56012:19;56034;:9;:17;:19::i;:::-;56012:41;;54338:3;56070:23;56086:6;56070:11;:15;;:23;;;;:::i;:::-;:37;;56062:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;56155:1;56146:6;:10;56138:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;56206:22;56221:6;56206:14;:22::i;:::-;56193:9;:35;;56185:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;56279:13;;;;;;;;;;;56275:523;;;56307:13;:25;56321:10;56307:25;;;;;;;;;;;;;;;;;;;;;;;;;56299:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;56394:6;56369:9;:21;56379:10;56369:21;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;56438:22;;56413:9;:21;56423:10;56413:21;;;;;;;;;;;;;;;;:47;;56405:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;56532:6;56511:17;;:27;;;;;;;:::i;:::-;;;;;;;;56572:20;;56551:17;;:41;;56543:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;56275:523;;;56677:6;56655;:18;56662:10;56655:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;56718:25;;56696:6;:18;56703:10;56696:18;;;;;;;;;;;;;;;;:47;;56688:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;56275:523;56811:9;56806:64;56830:6;56826:1;:10;56806:64;;;56848:16;:14;:16::i;:::-;56838:3;;;;;:::i;:::-;;;;56806:64;;;;55937:938;55888:987;:::o;57663:255::-;51305:12;:10;:12::i;:::-;51294:23;;:7;:5;:7::i;:::-;:23;;;51286:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57713:15:::1;57731:21;57713:39;;57775:1;57765:7;:11;57757:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;57816:12;57835:10;57834:17;;57859:7;57834:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57815:56;;;57884:7;57876:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;57708:210;;57663:255::o:0;33403:185::-;33541:39;33558:4;33564:2;33568:7;33541:39;;;;;;;;;;;;:16;:39::i;:::-;33403:185;;;:::o;44694:233::-;44769:7;44805:30;:28;:30::i;:::-;44797:5;:38;44789:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;44902:10;44913:5;44902:17;;;;;;;;:::i;:::-;;;;;;;;;;44895:24;;44694:233;;;:::o;54864:20::-;;;;;;;;;;;;;:::o;58702:181::-;51305:12;:10;:12::i;:::-;51294:23;;:7;:5;:7::i;:::-;:23;;;51286:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58790:9:::1;58785:93;58808:10;:17;58804:1;:21;58785:93;;;58867:5;58836:13;:28;58850:10;58861:1;58850:13;;;;;;;;:::i;:::-;;;;;;;;58836:28;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;58826:3;;;;;:::i;:::-;;;;58785:93;;;;58702:181:::0;:::o;54587:38::-;;;;:::o;59030:105::-;51305:12;:10;:12::i;:::-;51294:23;;:7;:5;:7::i;:::-;:23;;;51286:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59116:13:::1;59101:12;:28;;;;;;;;;;;;:::i;:::-;;59030:105:::0;:::o;30377:239::-;30449:7;30469:13;30485:7;:16;30493:7;30485:16;;;;;;;;;;;;;;;;;;;;;30469:32;;30537:1;30520:19;;:5;:19;;;;30512:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30603:5;30596:12;;;30377:239;;;:::o;54924:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30107:208::-;30179:7;30224:1;30207:19;;:5;:19;;;;30199:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30291:9;:16;30301:5;30291:16;;;;;;;;;;;;;;;;30284:23;;30107:208;;;:::o;51725:103::-;51305:12;:10;:12::i;:::-;51294:23;;:7;:5;:7::i;:::-;:23;;;51286:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51790:30:::1;51817:1;51790:18;:30::i;:::-;51725:103::o:0;54777:32::-;;;;:::o;58520:174::-;51305:12;:10;:12::i;:::-;51294:23;;:7;:5;:7::i;:::-;:23;;;51286:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58602:9:::1;58597:92;58620:10;:17;58616:1;:21;58597:92;;;58679:4;58648:13;:28;58662:10;58673:1;58662:13;;;;;;;;:::i;:::-;;;;;;;;58648:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;58638:3;;;;;:::i;:::-;;;;58597:92;;;;58520:174:::0;:::o;57306:323::-;57377:16;57403:18;57424:17;57434:6;57424:9;:17::i;:::-;57403:38;;57446:25;57488:10;57474:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57446:53;;57513:9;57508:96;57532:10;57528:1;:14;57508:96;;;57568:30;57588:6;57596:1;57568:19;:30::i;:::-;57554:8;57563:1;57554:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;57544:3;;;;;:::i;:::-;;;;57508:96;;;;57615:8;57608:15;;;;57306:323;;;:::o;54402:34::-;;;;:::o;51074:87::-;51120:7;51147:6;;;;;;;;;;;51140:13;;51074:87;:::o;58434:78::-;51305:12;:10;:12::i;:::-;51294:23;;:7;:5;:7::i;:::-;:23;;;51286:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58500:6:::1;58492:5;:14;;;;58434:78:::0;:::o;30852:104::-;30908:13;30941:7;30934:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30852:104;:::o;54630:45::-;;;;;;;;;;;;;;;;;:::o;55694:86::-;55743:4;55761:13;;;;;;;;;;;55754:20;;55694:86;:::o;32536:155::-;32631:52;32650:12;:10;:12::i;:::-;32664:8;32674;32631:18;:52::i;:::-;32536:155;;:::o;59265:61::-;51305:12;:10;:12::i;:::-;51294:23;;:7;:5;:7::i;:::-;:23;;;51286:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59316:4:::1;59305:8;;:15;;;;;;;;;;;;;;;;;;59265:61::o:0;54814:41::-;;;;:::o;58038:77::-;51305:12;:10;:12::i;:::-;51294:23;;:7;:5;:7::i;:::-;:23;;;51286:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58104:5:::1;58088:13;;:21;;;;;;;;;;;;;;;;;;58038:77::o:0;56883:164::-;56943:7;56961:13;;;;;;;;;;;56957:55;;;56997:9;;56988:6;:18;;;;:::i;:::-;56981:25;;;;56957:55;57036:5;;57027:6;:14;;;;:::i;:::-;57020:21;;56883:164;;;;:::o;54731:41::-;;;;:::o;59540:136::-;51305:12;:10;:12::i;:::-;51294:23;;:7;:5;:7::i;:::-;:23;;;51286:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59655:15:::1;59627:25;:43;;;;59540:136:::0;:::o;59334:60::-;51305:12;:10;:12::i;:::-;51294:23;;:7;:5;:7::i;:::-;:23;;;51286:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59383:5:::1;59372:8;;:16;;;;;;;;;;;;;;;;;;59334:60::o:0;33659:328::-;33834:41;33853:12;:10;:12::i;:::-;33867:7;33834:18;:41::i;:::-;33826:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33940:39;33954:4;33960:2;33964:7;33973:5;33940:13;:39::i;:::-;33659:328;;;;:::o;59402:130::-;51305:12;:10;:12::i;:::-;51294:23;;:7;:5;:7::i;:::-;:23;;;51286:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59511:15:::1;59486:22;:40;;;;59402:130:::0;:::o;57926:104::-;51305:12;:10;:12::i;:::-;51294:23;;:7;:5;:7::i;:::-;:23;;;51286:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57994:5:::1;57975:16;;:24;;;;;;;;;;;;;;;;;;58020:4;58004:13;;:20;;;;;;;;;;;;;;;;;;57926:104::o:0;55301:385::-;55374:13;55402:16;55410:7;55402;:16::i;:::-;55394:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;55484:8;;;;;;;;;;;55479:202;;55506:13;55499:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55479:202;55543:21;55567:10;:8;:10::i;:::-;55543:34;;55613:1;55595:7;55589:21;:25;:86;;;;;;;;;;;;;;;;;55641:7;55650:18;:7;:16;:18::i;:::-;55624:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55589:86;55582:93;;;55301:385;;;;:::o;58891:131::-;51305:12;:10;:12::i;:::-;51294:23;;:7;:5;:7::i;:::-;:23;;;51286:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58958:9:::1;58953:64;58977:6;58973:1;:10;58953:64;;;58995:16;:14;:16::i;:::-;58985:3;;;;;:::i;:::-;;;;58953:64;;;;58891:131:::0;:::o;54488:44::-;;;;:::o;54893:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32762:164::-;32859:4;32883:18;:25;32902:5;32883:25;;;;;;;;;;;;;;;:35;32909:8;32883:35;;;;;;;;;;;;;;;;;;;;;;;;;32876:42;;32762:164;;;;:::o;58238:83::-;51305:12;:10;:12::i;:::-;51294:23;;:7;:5;:7::i;:::-;:23;;;51286:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58310:5:::1;58291:16;;:24;;;;;;;;;;;;;;;;;;58238:83::o:0;51983:201::-;51305:12;:10;:12::i;:::-;51294:23;;:7;:5;:7::i;:::-;:23;;;51286:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52092:1:::1;52072:22;;:8;:22;;;;52064:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;52148:28;52167:8;52148:18;:28::i;:::-;51983:201:::0;:::o;59143:114::-;51305:12;:10;:12::i;:::-;51294:23;;:7;:5;:7::i;:::-;:23;;;51286:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59237:14:::1;59221:13;:30;;;;;;;;;;;;:::i;:::-;;59143:114:::0;:::o;29738:305::-;29840:4;29892:25;29877:40;;;:11;:40;;;;:105;;;;29949:33;29934:48;;;:11;:48;;;;29877:105;:158;;;;29999:36;30023:11;29999:23;:36::i;:::-;29877:158;29857:178;;29738:305;;;:::o;35497:127::-;35562:4;35614:1;35586:30;;:7;:16;35594:7;35586:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35579:37;;35497:127;;;:::o;28117:98::-;28170:7;28197:10;28190:17;;28117:98;:::o;39643:174::-;39745:2;39718:15;:24;39734:7;39718:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39801:7;39797:2;39763:46;;39772:23;39787:7;39772:14;:23::i;:::-;39763:46;;;;;;;;;;;;39643:174;;:::o;35791:348::-;35884:4;35909:16;35917:7;35909;:16::i;:::-;35901:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35985:13;36001:23;36016:7;36001:14;:23::i;:::-;35985:39;;36054:5;36043:16;;:7;:16;;;:52;;;;36063:32;36080:5;36087:7;36063:16;:32::i;:::-;36043:52;:87;;;;36123:7;36099:31;;:20;36111:7;36099:11;:20::i;:::-;:31;;;36043:87;36035:96;;;35791:348;;;;:::o;38900:625::-;39059:4;39032:31;;:23;39047:7;39032:14;:23::i;:::-;:31;;;39024:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;39138:1;39124:16;;:2;:16;;;;39116:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39194:39;39215:4;39221:2;39225:7;39194:20;:39::i;:::-;39298:29;39315:1;39319:7;39298:8;:29::i;:::-;39359:1;39340:9;:15;39350:4;39340:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39388:1;39371:9;:13;39381:2;39371:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39419:2;39400:7;:16;39408:7;39400:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39458:7;39454:2;39439:27;;39448:4;39439:27;;;;;;;;;;;;39479:38;39499:4;39505:2;39509:7;39479:19;:38::i;:::-;38900:625;;;:::o;53414:114::-;53479:7;53506;:14;;;53499:21;;53414:114;;;:::o;23273:98::-;23331:7;23362:1;23358;:5;;;;:::i;:::-;23351:12;;23273:98;;;;:::o;57055:243::-;57094:18;57115:19;:9;:17;:19::i;:::-;57094:40;;57157:1;57143:10;:15;57139:90;;;57165:21;:9;:19;:21::i;:::-;57204:19;:9;:17;:19::i;:::-;57191:32;;57139:90;57233:33;57243:10;57255;57233:9;:33::i;:::-;57271:21;:9;:19;:21::i;:::-;57089:209;57055:243::o;52344:191::-;52418:16;52437:6;;;;;;;;;;;52418:25;;52463:8;52454:6;;:17;;;;;;;;;;;;;;;;;;52518:8;52487:40;;52508:8;52487:40;;;;;;;;;;;;52407:128;52344:191;:::o;39959:315::-;40114:8;40105:17;;:5;:17;;;;40097:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;40201:8;40163:18;:25;40182:5;40163:25;;;;;;;;;;;;;;;:35;40189:8;40163:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;40247:8;40225:41;;40240:5;40225:41;;;40257:8;40225:41;;;;;;:::i;:::-;;;;;;;;39959:315;;;:::o;34869:::-;35026:28;35036:4;35042:2;35046:7;35026:9;:28::i;:::-;35073:48;35096:4;35102:2;35106:7;35115:5;35073:22;:48::i;:::-;35065:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;34869:315;;;;:::o;55134:159::-;55194:13;55219:8;;;;;;;;;;;55214:46;;55241:13;55234:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55214:46;55275:12;55268:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55134:159;;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;13463:157::-;13548:4;13587:25;13572:40;;;:11;:40;;;;13565:47;;13463:157;;;:::o;45540:589::-;45684:45;45711:4;45717:2;45721:7;45684:26;:45::i;:::-;45762:1;45746:18;;:4;:18;;;45742:187;;;45781:40;45813:7;45781:31;:40::i;:::-;45742:187;;;45851:2;45843:10;;:4;:10;;;45839:90;;45870:47;45903:4;45909:7;45870:32;:47::i;:::-;45839:90;45742:187;45957:1;45943:16;;:2;:16;;;45939:183;;;45976:45;46013:7;45976:36;:45::i;:::-;45939:183;;;46049:4;46043:10;;:2;:10;;;46039:83;;46070:40;46098:2;46102:7;46070:27;:40::i;:::-;46039:83;45939:183;45540:589;;;:::o;42721:125::-;;;;:::o;53536:127::-;53643:1;53625:7;:14;;;:19;;;;;;;;;;;53536:127;:::o;36481:110::-;36557:26;36567:2;36571:7;36557:26;;;;;;;;;;;;:9;:26::i;:::-;36481:110;;:::o;40839:799::-;40994:4;41015:15;:2;:13;;;:15::i;:::-;41011:620;;;41067:2;41051:36;;;41088:12;:10;:12::i;:::-;41102:4;41108:7;41117:5;41051:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41047:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41310:1;41293:6;:13;:18;41289:272;;;41336:60;;;;;;;;;;:::i;:::-;;;;;;;;41289:272;41511:6;41505:13;41496:6;41492:2;41488:15;41481:38;41047:529;41184:41;;;41174:51;;;:6;:51;;;;41167:58;;;;;41011:620;41615:4;41608:11;;40839:799;;;;;;;:::o;42210:126::-;;;;:::o;46852:164::-;46956:10;:17;;;;46929:15;:24;46945:7;46929:24;;;;;;;;;;;:44;;;;46984:10;47000:7;46984:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46852:164;:::o;47643:988::-;47909:22;47959:1;47934:22;47951:4;47934:16;:22::i;:::-;:26;;;;:::i;:::-;47909:51;;47971:18;47992:17;:26;48010:7;47992:26;;;;;;;;;;;;47971:47;;48139:14;48125:10;:28;48121:328;;48170:19;48192:12;:18;48205:4;48192:18;;;;;;;;;;;;;;;:34;48211:14;48192:34;;;;;;;;;;;;48170:56;;48276:11;48243:12;:18;48256:4;48243:18;;;;;;;;;;;;;;;:30;48262:10;48243:30;;;;;;;;;;;:44;;;;48393:10;48360:17;:30;48378:11;48360:30;;;;;;;;;;;:43;;;;48155:294;48121:328;48545:17;:26;48563:7;48545:26;;;;;;;;;;;48538:33;;;48589:12;:18;48602:4;48589:18;;;;;;;;;;;;;;;:34;48608:14;48589:34;;;;;;;;;;;48582:41;;;47724:907;;47643:988;;:::o;48926:1079::-;49179:22;49224:1;49204:10;:17;;;;:21;;;;:::i;:::-;49179:46;;49236:18;49257:15;:24;49273:7;49257:24;;;;;;;;;;;;49236:45;;49608:19;49630:10;49641:14;49630:26;;;;;;;;:::i;:::-;;;;;;;;;;49608:48;;49694:11;49669:10;49680;49669:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;49805:10;49774:15;:28;49790:11;49774:28;;;;;;;;;;;:41;;;;49946:15;:24;49962:7;49946:24;;;;;;;;;;;49939:31;;;49981:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;48997:1008;;;48926:1079;:::o;46430:221::-;46515:14;46532:20;46549:2;46532:16;:20::i;:::-;46515:37;;46590:7;46563:12;:16;46576:2;46563:16;;;;;;;;;;;;;;;:24;46580:6;46563:24;;;;;;;;;;;:34;;;;46637:6;46608:17;:26;46626:7;46608:26;;;;;;;;;;;:35;;;;46504:147;46430:221;;:::o;36818:321::-;36948:18;36954:2;36958:7;36948:5;:18::i;:::-;36999:54;37030:1;37034:2;37038:7;37047:5;36999:22;:54::i;:::-;36977:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;36818:321;;;:::o;3357:326::-;3417:4;3674:1;3652:7;:19;;;:23;3645:30;;3357:326;;;:::o;37475:439::-;37569:1;37555:16;;:2;:16;;;;37547:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37628:16;37636:7;37628;:16::i;:::-;37627:17;37619:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37690:45;37719:1;37723:2;37727:7;37690:20;:45::i;:::-;37765:1;37748:9;:13;37758:2;37748:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37796:2;37777:7;:16;37785:7;37777:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37841:7;37837:2;37816:33;;37833:1;37816:33;;;;;;;;;;;;37862:44;37890:1;37894:2;37898:7;37862:19;:44::i;:::-;37475:439;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:329::-;5349:6;5398:2;5386:9;5377:7;5373:23;5369:32;5366:119;;;5404:79;;:::i;:::-;5366:119;5524:1;5549:53;5594:7;5585:6;5574:9;5570:22;5549:53;:::i;:::-;5539:63;;5495:117;5290:329;;;;:::o;5625:619::-;5702:6;5710;5718;5767:2;5755:9;5746:7;5742:23;5738:32;5735:119;;;5773:79;;:::i;:::-;5735:119;5893:1;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5864:117;6020:2;6046:53;6091:7;6082:6;6071:9;6067:22;6046:53;:::i;:::-;6036:63;;5991:118;6148:2;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6119:118;5625:619;;;;;:::o;6250:117::-;6359:1;6356;6349:12;6373:180;6421:77;6418:1;6411:88;6518:4;6515:1;6508:15;6542:4;6539:1;6532:15;6559:281;6642:27;6664:4;6642:27;:::i;:::-;6634:6;6630:40;6772:6;6760:10;6757:22;6736:18;6724:10;6721:34;6718:62;6715:88;;;6783:18;;:::i;:::-;6715:88;6823:10;6819:2;6812:22;6602:238;6559:281;;:::o;6846:129::-;6880:6;6907:20;;:::i;:::-;6897:30;;6936:33;6964:4;6956:6;6936:33;:::i;:::-;6846:129;;;:::o;6981:311::-;7058:4;7148:18;7140:6;7137:30;7134:56;;;7170:18;;:::i;:::-;7134:56;7220:4;7212:6;7208:17;7200:25;;7280:4;7274;7270:15;7262:23;;6981:311;;;:::o;7298:117::-;7407:1;7404;7397:12;7438:710;7534:5;7559:81;7575:64;7632:6;7575:64;:::i;:::-;7559:81;:::i;:::-;7550:90;;7660:5;7689:6;7682:5;7675:21;7723:4;7716:5;7712:16;7705:23;;7776:4;7768:6;7764:17;7756:6;7752:30;7805:3;7797:6;7794:15;7791:122;;;7824:79;;:::i;:::-;7791:122;7939:6;7922:220;7956:6;7951:3;7948:15;7922:220;;;8031:3;8060:37;8093:3;8081:10;8060:37;:::i;:::-;8055:3;8048:50;8127:4;8122:3;8118:14;8111:21;;7998:144;7982:4;7977:3;7973:14;7966:21;;7922:220;;;7926:21;7540:608;;7438:710;;;;;:::o;8171:370::-;8242:5;8291:3;8284:4;8276:6;8272:17;8268:27;8258:122;;8299:79;;:::i;:::-;8258:122;8416:6;8403:20;8441:94;8531:3;8523:6;8516:4;8508:6;8504:17;8441:94;:::i;:::-;8432:103;;8248:293;8171:370;;;;:::o;8547:539::-;8631:6;8680:2;8668:9;8659:7;8655:23;8651:32;8648:119;;;8686:79;;:::i;:::-;8648:119;8834:1;8823:9;8819:17;8806:31;8864:18;8856:6;8853:30;8850:117;;;8886:79;;:::i;:::-;8850:117;8991:78;9061:7;9052:6;9041:9;9037:22;8991:78;:::i;:::-;8981:88;;8777:302;8547:539;;;;:::o;9092:117::-;9201:1;9198;9191:12;9215:308;9277:4;9367:18;9359:6;9356:30;9353:56;;;9389:18;;:::i;:::-;9353:56;9427:29;9449:6;9427:29;:::i;:::-;9419:37;;9511:4;9505;9501:15;9493:23;;9215:308;;;:::o;9529:154::-;9613:6;9608:3;9603;9590:30;9675:1;9666:6;9661:3;9657:16;9650:27;9529:154;;;:::o;9689:412::-;9767:5;9792:66;9808:49;9850:6;9808:49;:::i;:::-;9792:66;:::i;:::-;9783:75;;9881:6;9874:5;9867:21;9919:4;9912:5;9908:16;9957:3;9948:6;9943:3;9939:16;9936:25;9933:112;;;9964:79;;:::i;:::-;9933:112;10054:41;10088:6;10083:3;10078;10054:41;:::i;:::-;9773:328;9689:412;;;;;:::o;10121:340::-;10177:5;10226:3;10219:4;10211:6;10207:17;10203:27;10193:122;;10234:79;;:::i;:::-;10193:122;10351:6;10338:20;10376:79;10451:3;10443:6;10436:4;10428:6;10424:17;10376:79;:::i;:::-;10367:88;;10183:278;10121:340;;;;:::o;10467:509::-;10536:6;10585:2;10573:9;10564:7;10560:23;10556:32;10553:119;;;10591:79;;:::i;:::-;10553:119;10739:1;10728:9;10724:17;10711:31;10769:18;10761:6;10758:30;10755:117;;;10791:79;;:::i;:::-;10755:117;10896:63;10951:7;10942:6;10931:9;10927:22;10896:63;:::i;:::-;10886:73;;10682:287;10467:509;;;;:::o;10982:114::-;11049:6;11083:5;11077:12;11067:22;;10982:114;;;:::o;11102:184::-;11201:11;11235:6;11230:3;11223:19;11275:4;11270:3;11266:14;11251:29;;11102:184;;;;:::o;11292:132::-;11359:4;11382:3;11374:11;;11412:4;11407:3;11403:14;11395:22;;11292:132;;;:::o;11430:108::-;11507:24;11525:5;11507:24;:::i;:::-;11502:3;11495:37;11430:108;;:::o;11544:179::-;11613:10;11634:46;11676:3;11668:6;11634:46;:::i;:::-;11712:4;11707:3;11703:14;11689:28;;11544:179;;;;:::o;11729:113::-;11799:4;11831;11826:3;11822:14;11814:22;;11729:113;;;:::o;11878:732::-;11997:3;12026:54;12074:5;12026:54;:::i;:::-;12096:86;12175:6;12170:3;12096:86;:::i;:::-;12089:93;;12206:56;12256:5;12206:56;:::i;:::-;12285:7;12316:1;12301:284;12326:6;12323:1;12320:13;12301:284;;;12402:6;12396:13;12429:63;12488:3;12473:13;12429:63;:::i;:::-;12422:70;;12515:60;12568:6;12515:60;:::i;:::-;12505:70;;12361:224;12348:1;12345;12341:9;12336:14;;12301:284;;;12305:14;12601:3;12594:10;;12002:608;;;11878:732;;;;:::o;12616:373::-;12759:4;12797:2;12786:9;12782:18;12774:26;;12846:9;12840:4;12836:20;12832:1;12821:9;12817:17;12810:47;12874:108;12977:4;12968:6;12874:108;:::i;:::-;12866:116;;12616:373;;;;:::o;12995:116::-;13065:21;13080:5;13065:21;:::i;:::-;13058:5;13055:32;13045:60;;13101:1;13098;13091:12;13045:60;12995:116;:::o;13117:133::-;13160:5;13198:6;13185:20;13176:29;;13214:30;13238:5;13214:30;:::i;:::-;13117:133;;;;:::o;13256:468::-;13321:6;13329;13378:2;13366:9;13357:7;13353:23;13349:32;13346:119;;;13384:79;;:::i;:::-;13346:119;13504:1;13529:53;13574:7;13565:6;13554:9;13550:22;13529:53;:::i;:::-;13519:63;;13475:117;13631:2;13657:50;13699:7;13690:6;13679:9;13675:22;13657:50;:::i;:::-;13647:60;;13602:115;13256:468;;;;;:::o;13730:307::-;13791:4;13881:18;13873:6;13870:30;13867:56;;;13903:18;;:::i;:::-;13867:56;13941:29;13963:6;13941:29;:::i;:::-;13933:37;;14025:4;14019;14015:15;14007:23;;13730:307;;;:::o;14043:410::-;14120:5;14145:65;14161:48;14202:6;14161:48;:::i;:::-;14145:65;:::i;:::-;14136:74;;14233:6;14226:5;14219:21;14271:4;14264:5;14260:16;14309:3;14300:6;14295:3;14291:16;14288:25;14285:112;;;14316:79;;:::i;:::-;14285:112;14406:41;14440:6;14435:3;14430;14406:41;:::i;:::-;14126:327;14043:410;;;;;:::o;14472:338::-;14527:5;14576:3;14569:4;14561:6;14557:17;14553:27;14543:122;;14584:79;;:::i;:::-;14543:122;14701:6;14688:20;14726:78;14800:3;14792:6;14785:4;14777:6;14773:17;14726:78;:::i;:::-;14717:87;;14533:277;14472:338;;;;:::o;14816:943::-;14911:6;14919;14927;14935;14984:3;14972:9;14963:7;14959:23;14955:33;14952:120;;;14991:79;;:::i;:::-;14952:120;15111:1;15136:53;15181:7;15172:6;15161:9;15157:22;15136:53;:::i;:::-;15126:63;;15082:117;15238:2;15264:53;15309:7;15300:6;15289:9;15285:22;15264:53;:::i;:::-;15254:63;;15209:118;15366:2;15392:53;15437:7;15428:6;15417:9;15413:22;15392:53;:::i;:::-;15382:63;;15337:118;15522:2;15511:9;15507:18;15494:32;15553:18;15545:6;15542:30;15539:117;;;15575:79;;:::i;:::-;15539:117;15680:62;15734:7;15725:6;15714:9;15710:22;15680:62;:::i;:::-;15670:72;;15465:287;14816:943;;;;;;;:::o;15765:474::-;15833:6;15841;15890:2;15878:9;15869:7;15865:23;15861:32;15858:119;;;15896:79;;:::i;:::-;15858:119;16016:1;16041:53;16086:7;16077:6;16066:9;16062:22;16041:53;:::i;:::-;16031:63;;15987:117;16143:2;16169:53;16214:7;16205:6;16194:9;16190:22;16169:53;:::i;:::-;16159:63;;16114:118;15765:474;;;;;:::o;16245:180::-;16293:77;16290:1;16283:88;16390:4;16387:1;16380:15;16414:4;16411:1;16404:15;16431:320;16475:6;16512:1;16506:4;16502:12;16492:22;;16559:1;16553:4;16549:12;16580:18;16570:81;;16636:4;16628:6;16624:17;16614:27;;16570:81;16698:2;16690:6;16687:14;16667:18;16664:38;16661:84;;;16717:18;;:::i;:::-;16661:84;16482:269;16431:320;;;:::o;16757:231::-;16897:34;16893:1;16885:6;16881:14;16874:58;16966:14;16961:2;16953:6;16949:15;16942:39;16757:231;:::o;16994:366::-;17136:3;17157:67;17221:2;17216:3;17157:67;:::i;:::-;17150:74;;17233:93;17322:3;17233:93;:::i;:::-;17351:2;17346:3;17342:12;17335:19;;16994:366;;;:::o;17366:419::-;17532:4;17570:2;17559:9;17555:18;17547:26;;17619:9;17613:4;17609:20;17605:1;17594:9;17590:17;17583:47;17647:131;17773:4;17647:131;:::i;:::-;17639:139;;17366:419;;;:::o;17791:220::-;17931:34;17927:1;17919:6;17915:14;17908:58;18000:3;17995:2;17987:6;17983:15;17976:28;17791:220;:::o;18017:366::-;18159:3;18180:67;18244:2;18239:3;18180:67;:::i;:::-;18173:74;;18256:93;18345:3;18256:93;:::i;:::-;18374:2;18369:3;18365:12;18358:19;;18017:366;;;:::o;18389:419::-;18555:4;18593:2;18582:9;18578:18;18570:26;;18642:9;18636:4;18632:20;18628:1;18617:9;18613:17;18606:47;18670:131;18796:4;18670:131;:::i;:::-;18662:139;;18389:419;;;:::o;18814:243::-;18954:34;18950:1;18942:6;18938:14;18931:58;19023:26;19018:2;19010:6;19006:15;18999:51;18814:243;:::o;19063:366::-;19205:3;19226:67;19290:2;19285:3;19226:67;:::i;:::-;19219:74;;19302:93;19391:3;19302:93;:::i;:::-;19420:2;19415:3;19411:12;19404:19;;19063:366;;;:::o;19435:419::-;19601:4;19639:2;19628:9;19624:18;19616:26;;19688:9;19682:4;19678:20;19674:1;19663:9;19659:17;19652:47;19716:131;19842:4;19716:131;:::i;:::-;19708:139;;19435:419;;;:::o;19860:182::-;20000:34;19996:1;19988:6;19984:14;19977:58;19860:182;:::o;20048:366::-;20190:3;20211:67;20275:2;20270:3;20211:67;:::i;:::-;20204:74;;20287:93;20376:3;20287:93;:::i;:::-;20405:2;20400:3;20396:12;20389:19;;20048:366;;;:::o;20420:419::-;20586:4;20624:2;20613:9;20609:18;20601:26;;20673:9;20667:4;20663:20;20659:1;20648:9;20644:17;20637:47;20701:131;20827:4;20701:131;:::i;:::-;20693:139;;20420:419;;;:::o;20845:236::-;20985:34;20981:1;20973:6;20969:14;20962:58;21054:19;21049:2;21041:6;21037:15;21030:44;20845:236;:::o;21087:366::-;21229:3;21250:67;21314:2;21309:3;21250:67;:::i;:::-;21243:74;;21326:93;21415:3;21326:93;:::i;:::-;21444:2;21439:3;21435:12;21428:19;;21087:366;;;:::o;21459:419::-;21625:4;21663:2;21652:9;21648:18;21640:26;;21712:9;21706:4;21702:20;21698:1;21687:9;21683:17;21676:47;21740:131;21866:4;21740:131;:::i;:::-;21732:139;;21459:419;;;:::o;21884:230::-;22024:34;22020:1;22012:6;22008:14;22001:58;22093:13;22088:2;22080:6;22076:15;22069:38;21884:230;:::o;22120:366::-;22262:3;22283:67;22347:2;22342:3;22283:67;:::i;:::-;22276:74;;22359:93;22448:3;22359:93;:::i;:::-;22477:2;22472:3;22468:12;22461:19;;22120:366;;;:::o;22492:419::-;22658:4;22696:2;22685:9;22681:18;22673:26;;22745:9;22739:4;22735:20;22731:1;22720:9;22716:17;22709:47;22773:131;22899:4;22773:131;:::i;:::-;22765:139;;22492:419;;;:::o;22917:165::-;23057:17;23053:1;23045:6;23041:14;23034:41;22917:165;:::o;23088:366::-;23230:3;23251:67;23315:2;23310:3;23251:67;:::i;:::-;23244:74;;23327:93;23416:3;23327:93;:::i;:::-;23445:2;23440:3;23436:12;23429:19;;23088:366;;;:::o;23460:419::-;23626:4;23664:2;23653:9;23649:18;23641:26;;23713:9;23707:4;23703:20;23699:1;23688:9;23684:17;23677:47;23741:131;23867:4;23741:131;:::i;:::-;23733:139;;23460:419;;;:::o;23885:171::-;24025:23;24021:1;24013:6;24009:14;24002:47;23885:171;:::o;24062:366::-;24204:3;24225:67;24289:2;24284:3;24225:67;:::i;:::-;24218:74;;24301:93;24390:3;24301:93;:::i;:::-;24419:2;24414:3;24410:12;24403:19;;24062:366;;;:::o;24434:419::-;24600:4;24638:2;24627:9;24623:18;24615:26;;24687:9;24681:4;24677:20;24673:1;24662:9;24658:17;24651:47;24715:131;24841:4;24715:131;:::i;:::-;24707:139;;24434:419;;;:::o;24859:169::-;24999:21;24995:1;24987:6;24983:14;24976:45;24859:169;:::o;25034:366::-;25176:3;25197:67;25261:2;25256:3;25197:67;:::i;:::-;25190:74;;25273:93;25362:3;25273:93;:::i;:::-;25391:2;25386:3;25382:12;25375:19;;25034:366;;;:::o;25406:419::-;25572:4;25610:2;25599:9;25595:18;25587:26;;25659:9;25653:4;25649:20;25645:1;25634:9;25630:17;25623:47;25687:131;25813:4;25687:131;:::i;:::-;25679:139;;25406:419;;;:::o;25831:221::-;25971:34;25967:1;25959:6;25955:14;25948:58;26040:4;26035:2;26027:6;26023:15;26016:29;25831:221;:::o;26058:366::-;26200:3;26221:67;26285:2;26280:3;26221:67;:::i;:::-;26214:74;;26297:93;26386:3;26297:93;:::i;:::-;26415:2;26410:3;26406:12;26399:19;;26058:366;;;:::o;26430:419::-;26596:4;26634:2;26623:9;26619:18;26611:26;;26683:9;26677:4;26673:20;26669:1;26658:9;26654:17;26647:47;26711:131;26837:4;26711:131;:::i;:::-;26703:139;;26430:419;;;:::o;26855:177::-;26995:29;26991:1;26983:6;26979:14;26972:53;26855:177;:::o;27038:366::-;27180:3;27201:67;27265:2;27260:3;27201:67;:::i;:::-;27194:74;;27277:93;27366:3;27277:93;:::i;:::-;27395:2;27390:3;27386:12;27379:19;;27038:366;;;:::o;27410:419::-;27576:4;27614:2;27603:9;27599:18;27591:26;;27663:9;27657:4;27653:20;27649:1;27638:9;27634:17;27627:47;27691:131;27817:4;27691:131;:::i;:::-;27683:139;;27410:419;;;:::o;27835:180::-;27883:77;27880:1;27873:88;27980:4;27977:1;27970:15;28004:4;28001:1;27994:15;28021:305;28061:3;28080:20;28098:1;28080:20;:::i;:::-;28075:25;;28114:20;28132:1;28114:20;:::i;:::-;28109:25;;28268:1;28200:66;28196:74;28193:1;28190:81;28187:107;;;28274:18;;:::i;:::-;28187:107;28318:1;28315;28311:9;28304:16;;28021:305;;;;:::o;28332:228::-;28472:34;28468:1;28460:6;28456:14;28449:58;28541:11;28536:2;28528:6;28524:15;28517:36;28332:228;:::o;28566:366::-;28708:3;28729:67;28793:2;28788:3;28729:67;:::i;:::-;28722:74;;28805:93;28894:3;28805:93;:::i;:::-;28923:2;28918:3;28914:12;28907:19;;28566:366;;;:::o;28938:419::-;29104:4;29142:2;29131:9;29127:18;29119:26;;29191:9;29185:4;29181:20;29177:1;29166:9;29162:17;29155:47;29219:131;29345:4;29219:131;:::i;:::-;29211:139;;28938:419;;;:::o;29363:231::-;29503:34;29499:1;29491:6;29487:14;29480:58;29572:14;29567:2;29559:6;29555:15;29548:39;29363:231;:::o;29600:366::-;29742:3;29763:67;29827:2;29822:3;29763:67;:::i;:::-;29756:74;;29839:93;29928:3;29839:93;:::i;:::-;29957:2;29952:3;29948:12;29941:19;;29600:366;;;:::o;29972:419::-;30138:4;30176:2;30165:9;30161:18;30153:26;;30225:9;30219:4;30215:20;30211:1;30200:9;30196:17;30189:47;30253:131;30379:4;30253:131;:::i;:::-;30245:139;;29972:419;;;:::o;30397:233::-;30436:3;30459:24;30477:5;30459:24;:::i;:::-;30450:33;;30505:66;30498:5;30495:77;30492:103;;;30575:18;;:::i;:::-;30492:103;30622:1;30615:5;30611:13;30604:20;;30397:233;;;:::o;30636:175::-;30776:27;30772:1;30764:6;30760:14;30753:51;30636:175;:::o;30817:366::-;30959:3;30980:67;31044:2;31039:3;30980:67;:::i;:::-;30973:74;;31056:93;31145:3;31056:93;:::i;:::-;31174:2;31169:3;31165:12;31158:19;;30817:366;;;:::o;31189:419::-;31355:4;31393:2;31382:9;31378:18;31370:26;;31442:9;31436:4;31432:20;31428:1;31417:9;31413:17;31406:47;31470:131;31596:4;31470:131;:::i;:::-;31462:139;;31189:419;;;:::o;31614:147::-;31715:11;31752:3;31737:18;;31614:147;;;;:::o;31767:114::-;;:::o;31887:398::-;32046:3;32067:83;32148:1;32143:3;32067:83;:::i;:::-;32060:90;;32159:93;32248:3;32159:93;:::i;:::-;32277:1;32272:3;32268:11;32261:18;;31887:398;;;:::o;32291:379::-;32475:3;32497:147;32640:3;32497:147;:::i;:::-;32490:154;;32661:3;32654:10;;32291:379;;;:::o;32676:166::-;32816:18;32812:1;32804:6;32800:14;32793:42;32676:166;:::o;32848:366::-;32990:3;33011:67;33075:2;33070:3;33011:67;:::i;:::-;33004:74;;33087:93;33176:3;33087:93;:::i;:::-;33205:2;33200:3;33196:12;33189:19;;32848:366;;;:::o;33220:419::-;33386:4;33424:2;33413:9;33409:18;33401:26;;33473:9;33467:4;33463:20;33459:1;33448:9;33444:17;33437:47;33501:131;33627:4;33501:131;:::i;:::-;33493:139;;33220:419;;;:::o;33645:231::-;33785:34;33781:1;33773:6;33769:14;33762:58;33854:14;33849:2;33841:6;33837:15;33830:39;33645:231;:::o;33882:366::-;34024:3;34045:67;34109:2;34104:3;34045:67;:::i;:::-;34038:74;;34121:93;34210:3;34121:93;:::i;:::-;34239:2;34234:3;34230:12;34223:19;;33882:366;;;:::o;34254:419::-;34420:4;34458:2;34447:9;34443:18;34435:26;;34507:9;34501:4;34497:20;34493:1;34482:9;34478:17;34471:47;34535:131;34661:4;34535:131;:::i;:::-;34527:139;;34254:419;;;:::o;34679:180::-;34727:77;34724:1;34717:88;34824:4;34821:1;34814:15;34848:4;34845:1;34838:15;34865:228;35005:34;35001:1;34993:6;34989:14;34982:58;35074:11;35069:2;35061:6;35057:15;35050:36;34865:228;:::o;35099:366::-;35241:3;35262:67;35326:2;35321:3;35262:67;:::i;:::-;35255:74;;35338:93;35427:3;35338:93;:::i;:::-;35456:2;35451:3;35447:12;35440:19;;35099:366;;;:::o;35471:419::-;35637:4;35675:2;35664:9;35660:18;35652:26;;35724:9;35718:4;35714:20;35710:1;35699:9;35695:17;35688:47;35752:131;35878:4;35752:131;:::i;:::-;35744:139;;35471:419;;;:::o;35896:229::-;36036:34;36032:1;36024:6;36020:14;36013:58;36105:12;36100:2;36092:6;36088:15;36081:37;35896:229;:::o;36131:366::-;36273:3;36294:67;36358:2;36353:3;36294:67;:::i;:::-;36287:74;;36370:93;36459:3;36370:93;:::i;:::-;36488:2;36483:3;36479:12;36472:19;;36131:366;;;:::o;36503:419::-;36669:4;36707:2;36696:9;36692:18;36684:26;;36756:9;36750:4;36746:20;36742:1;36731:9;36727:17;36720:47;36784:131;36910:4;36784:131;:::i;:::-;36776:139;;36503:419;;;:::o;36928:348::-;36968:7;36991:20;37009:1;36991:20;:::i;:::-;36986:25;;37025:20;37043:1;37025:20;:::i;:::-;37020:25;;37213:1;37145:66;37141:74;37138:1;37135:81;37130:1;37123:9;37116:17;37112:105;37109:131;;;37220:18;;:::i;:::-;37109:131;37268:1;37265;37261:9;37250:20;;36928:348;;;;:::o;37282:234::-;37422:34;37418:1;37410:6;37406:14;37399:58;37491:17;37486:2;37478:6;37474:15;37467:42;37282:234;:::o;37522:366::-;37664:3;37685:67;37749:2;37744:3;37685:67;:::i;:::-;37678:74;;37761:93;37850:3;37761:93;:::i;:::-;37879:2;37874:3;37870:12;37863:19;;37522:366;;;:::o;37894:419::-;38060:4;38098:2;38087:9;38083:18;38075:26;;38147:9;38141:4;38137:20;38133:1;38122:9;38118:17;38111:47;38175:131;38301:4;38175:131;:::i;:::-;38167:139;;37894:419;;;:::o;38319:148::-;38421:11;38458:3;38443:18;;38319:148;;;;:::o;38473:377::-;38579:3;38607:39;38640:5;38607:39;:::i;:::-;38662:89;38744:6;38739:3;38662:89;:::i;:::-;38655:96;;38760:52;38805:6;38800:3;38793:4;38786:5;38782:16;38760:52;:::i;:::-;38837:6;38832:3;38828:16;38821:23;;38583:267;38473:377;;;;:::o;38856:435::-;39036:3;39058:95;39149:3;39140:6;39058:95;:::i;:::-;39051:102;;39170:95;39261:3;39252:6;39170:95;:::i;:::-;39163:102;;39282:3;39275:10;;38856:435;;;;;:::o;39297:225::-;39437:34;39433:1;39425:6;39421:14;39414:58;39506:8;39501:2;39493:6;39489:15;39482:33;39297:225;:::o;39528:366::-;39670:3;39691:67;39755:2;39750:3;39691:67;:::i;:::-;39684:74;;39767:93;39856:3;39767:93;:::i;:::-;39885:2;39880:3;39876:12;39869:19;;39528:366;;;:::o;39900:419::-;40066:4;40104:2;40093:9;40089:18;40081:26;;40153:9;40147:4;40143:20;40139:1;40128:9;40124:17;40117:47;40181:131;40307:4;40181:131;:::i;:::-;40173:139;;39900:419;;;:::o;40325:231::-;40465:34;40461:1;40453:6;40449:14;40442:58;40534:14;40529:2;40521:6;40517:15;40510:39;40325:231;:::o;40562:366::-;40704:3;40725:67;40789:2;40784:3;40725:67;:::i;:::-;40718:74;;40801:93;40890:3;40801:93;:::i;:::-;40919:2;40914:3;40910:12;40903:19;;40562:366;;;:::o;40934:419::-;41100:4;41138:2;41127:9;41123:18;41115:26;;41187:9;41181:4;41177:20;41173:1;41162:9;41158:17;41151:47;41215:131;41341:4;41215:131;:::i;:::-;41207:139;;40934:419;;;:::o;41359:224::-;41499:34;41495:1;41487:6;41483:14;41476:58;41568:7;41563:2;41555:6;41551:15;41544:32;41359:224;:::o;41589:366::-;41731:3;41752:67;41816:2;41811:3;41752:67;:::i;:::-;41745:74;;41828:93;41917:3;41828:93;:::i;:::-;41946:2;41941:3;41937:12;41930:19;;41589:366;;;:::o;41961:419::-;42127:4;42165:2;42154:9;42150:18;42142:26;;42214:9;42208:4;42204:20;42200:1;42189:9;42185:17;42178:47;42242:131;42368:4;42242:131;:::i;:::-;42234:139;;41961:419;;;:::o;42386:223::-;42526:34;42522:1;42514:6;42510:14;42503:58;42595:6;42590:2;42582:6;42578:15;42571:31;42386:223;:::o;42615:366::-;42757:3;42778:67;42842:2;42837:3;42778:67;:::i;:::-;42771:74;;42854:93;42943:3;42854:93;:::i;:::-;42972:2;42967:3;42963:12;42956:19;;42615:366;;;:::o;42987:419::-;43153:4;43191:2;43180:9;43176:18;43168:26;;43240:9;43234:4;43230:20;43226:1;43215:9;43211:17;43204:47;43268:131;43394:4;43268:131;:::i;:::-;43260:139;;42987:419;;;:::o;43412:191::-;43452:4;43472:20;43490:1;43472:20;:::i;:::-;43467:25;;43506:20;43524:1;43506:20;:::i;:::-;43501:25;;43545:1;43542;43539:8;43536:34;;;43550:18;;:::i;:::-;43536:34;43595:1;43592;43588:9;43580:17;;43412:191;;;;:::o;43609:175::-;43749:27;43745:1;43737:6;43733:14;43726:51;43609:175;:::o;43790:366::-;43932:3;43953:67;44017:2;44012:3;43953:67;:::i;:::-;43946:74;;44029:93;44118:3;44029:93;:::i;:::-;44147:2;44142:3;44138:12;44131:19;;43790:366;;;:::o;44162:419::-;44328:4;44366:2;44355:9;44351:18;44343:26;;44415:9;44409:4;44405:20;44401:1;44390:9;44386:17;44379:47;44443:131;44569:4;44443:131;:::i;:::-;44435:139;;44162:419;;;:::o;44587:237::-;44727:34;44723:1;44715:6;44711:14;44704:58;44796:20;44791:2;44783:6;44779:15;44772:45;44587:237;:::o;44830:366::-;44972:3;44993:67;45057:2;45052:3;44993:67;:::i;:::-;44986:74;;45069:93;45158:3;45069:93;:::i;:::-;45187:2;45182:3;45178:12;45171:19;;44830:366;;;:::o;45202:419::-;45368:4;45406:2;45395:9;45391:18;45383:26;;45455:9;45449:4;45445:20;45441:1;45430:9;45426:17;45419:47;45483:131;45609:4;45483:131;:::i;:::-;45475:139;;45202:419;;;:::o;45627:180::-;45675:77;45672:1;45665:88;45772:4;45769:1;45762:15;45796:4;45793:1;45786:15;45813:185;45853:1;45870:20;45888:1;45870:20;:::i;:::-;45865:25;;45904:20;45922:1;45904:20;:::i;:::-;45899:25;;45943:1;45933:35;;45948:18;;:::i;:::-;45933:35;45990:1;45987;45983:9;45978:14;;45813:185;;;;:::o;46004:176::-;46036:1;46053:20;46071:1;46053:20;:::i;:::-;46048:25;;46087:20;46105:1;46087:20;:::i;:::-;46082:25;;46126:1;46116:35;;46131:18;;:::i;:::-;46116:35;46172:1;46169;46165:9;46160:14;;46004:176;;;;:::o;46186:98::-;46237:6;46271:5;46265:12;46255:22;;46186:98;;;:::o;46290:168::-;46373:11;46407:6;46402:3;46395:19;46447:4;46442:3;46438:14;46423:29;;46290:168;;;;:::o;46464:360::-;46550:3;46578:38;46610:5;46578:38;:::i;:::-;46632:70;46695:6;46690:3;46632:70;:::i;:::-;46625:77;;46711:52;46756:6;46751:3;46744:4;46737:5;46733:16;46711:52;:::i;:::-;46788:29;46810:6;46788:29;:::i;:::-;46783:3;46779:39;46772:46;;46554:270;46464:360;;;;:::o;46830:640::-;47025:4;47063:3;47052:9;47048:19;47040:27;;47077:71;47145:1;47134:9;47130:17;47121:6;47077:71;:::i;:::-;47158:72;47226:2;47215:9;47211:18;47202:6;47158:72;:::i;:::-;47240;47308:2;47297:9;47293:18;47284:6;47240:72;:::i;:::-;47359:9;47353:4;47349:20;47344:2;47333:9;47329:18;47322:48;47387:76;47458:4;47449:6;47387:76;:::i;:::-;47379:84;;46830:640;;;;;;;:::o;47476:141::-;47532:5;47563:6;47557:13;47548:22;;47579:32;47605:5;47579:32;:::i;:::-;47476:141;;;;:::o;47623:349::-;47692:6;47741:2;47729:9;47720:7;47716:23;47712:32;47709:119;;;47747:79;;:::i;:::-;47709:119;47867:1;47892:63;47947:7;47938:6;47927:9;47923:22;47892:63;:::i;:::-;47882:73;;47838:127;47623:349;;;;:::o;47978:180::-;48026:77;48023:1;48016:88;48123:4;48120:1;48113:15;48147:4;48144:1;48137:15;48164:182;48304:34;48300:1;48292:6;48288:14;48281:58;48164:182;:::o;48352:366::-;48494:3;48515:67;48579:2;48574:3;48515:67;:::i;:::-;48508:74;;48591:93;48680:3;48591:93;:::i;:::-;48709:2;48704:3;48700:12;48693:19;;48352:366;;;:::o;48724:419::-;48890:4;48928:2;48917:9;48913:18;48905:26;;48977:9;48971:4;48967:20;48963:1;48952:9;48948:17;48941:47;49005:131;49131:4;49005:131;:::i;:::-;48997:139;;48724:419;;;:::o;49149:178::-;49289:30;49285:1;49277:6;49273:14;49266:54;49149:178;:::o;49333:366::-;49475:3;49496:67;49560:2;49555:3;49496:67;:::i;:::-;49489:74;;49572:93;49661:3;49572:93;:::i;:::-;49690:2;49685:3;49681:12;49674:19;;49333:366;;;:::o;49705:419::-;49871:4;49909:2;49898:9;49894:18;49886:26;;49958:9;49952:4;49948:20;49944:1;49933:9;49929:17;49922:47;49986:131;50112:4;49986:131;:::i;:::-;49978:139;;49705:419;;;:::o
Swarm Source
ipfs://1ed5f8af591421a24084fe70879c6253455671836152328ccea738f613884e95
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.