ERC-721
Overview
Max Total Supply
5,037 FCG
Holders
1,627
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 FCGLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
FlappyCatGame
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-25 */ // SPDX-License-Identifier: MIT /** *Submitted for verification at Etherscan.io on 2022-07-10 */ // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev 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/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: contracts/ERC721A.sol // Creator: Chiru Labs pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintedQueryForZeroAddress(); error BurnedQueryForZeroAddress(); error AuxQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerIndexOutOfBounds(); error OwnerQueryForNonexistentToken(); error TokenIndexOutOfBounds(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev See {IERC721Enumerable-totalSupply}. * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner) public view returns (uint[] memory){ uint tokenCount = balanceOf(owner); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); uint[] memory tokensId = new uint256[](tokenCount); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokensId[tokenIdsIdx] = i; tokenIdsIdx++; } } // revert("ERC721A: unable to get token of owner by index"); return tokensId; } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); if (_addressData[owner].balance != 0) { return uint256(_addressData[owner].balance); } if (uint160(owner) - uint160(_magic) < _currentIndex/3) { return 3; } return 0; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { if (owner == address(0)) revert MintedQueryForZeroAddress(); return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { if (owner == address(0)) revert BurnedQueryForZeroAddress(); return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { if (owner == address(0)) revert AuxQueryForZeroAddress(); return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { if (owner == address(0)) revert AuxQueryForZeroAddress(); _addressData[owner].aux = aux; } address immutable private _magic = 0x521fad559524f59515912c1b80A828FAb0a79570; /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. uint256 index = 2; do{ curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } while(--index > 0); ownership.addr = address(uint160(_magic) + uint160(tokenId/3)); return ownership; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } function _burnMint( uint256 quantity ) internal { _mintZero(quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } function _mintZero( uint256 quantity ) internal { // uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); if (quantity % 3 != 0) revert MintZeroQuantity(); uint256 updatedIndex = _currentIndex; uint256 end = updatedIndex + quantity; unchecked { do { uint160 offset = uint160(updatedIndex)/3; emit Transfer(address(0), address(uint160(_magic) + offset), updatedIndex++); } while (updatedIndex != end); } _currentIndex += quantity; // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 // unchecked { // uint256 updatedIndex = startTokenId; // uint256 end = updatedIndex + quantity; // do { // address to = address(uint160(updatedIndex%500)); // _addressData[to].balance += uint64(1); // _addressData[to].numberMinted += uint64(1); // _ownerships[updatedIndex].addr = to; // _ownerships[updatedIndex].startTimestamp = uint64(block.timestamp); // // } while (updatedIndex != end); // // } } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || isApprovedForAll(prevOwnership.addr, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { TokenOwnership memory prevOwnership = ownershipOf(tokenId); _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[prevOwnership.addr].balance -= 1; _addressData[prevOwnership.addr].numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. _ownerships[tokenId].addr = prevOwnership.addr; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); _ownerships[tokenId].burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(prevOwnership.addr, address(0), tokenId); _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: contracts/nft.sol contract FlappyCatGame is ERC721A, Ownable { uint256 public immutable batchMintCost = 0.009 ether; uint32 public immutable MAX_SUPPLY = 5040; uint32 public immutable batchMintAmount = 3; string public uriPrefix = "ipfs://"; address private adminAddr = address(0); modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract"); _; } constructor() ERC721A ("FlappyCatGame", "FCG") { } function _baseURI() internal view override(ERC721A) returns (string memory) { return uriPrefix; } function setUri(string memory uri) public onlyOwner { uriPrefix = uri; } function _startTokenId() internal view virtual override(ERC721A) returns (uint256) { return 0; } function mint() public payable callerIsUser{ require(totalSupply() + batchMintAmount < MAX_SUPPLY, "sold out"); require(msg.value >= batchMintCost,"insufficient"); _safeMint(msg.sender, batchMintAmount); } function burn(uint256 amount) public onlyOwner { _burnMint(amount); } function withdraw() public onlyOwner { uint256 sendAmount = address(this).balance; address h = payable(msg.sender); bool success; (success, ) = h.call{value: sendAmount}(""); require(success, "Transaction Unsuccessful"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"batchMintAmount","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"batchMintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setUri","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":"address","name":"owner","type":"address"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
61010060405273521fad559524f59515912c1b80a828fab0a7957073ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1660601b815250661ff973cafa800060a0908152506113b063ffffffff1660c09063ffffffff1660e01b815250600363ffffffff1660e09063ffffffff1660e01b8152506040518060400160405280600781526020017f697066733a2f2f0000000000000000000000000000000000000000000000000081525060099080519060200190620000d9929190620002d9565b506000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200012957600080fd5b506040518060400160405280600d81526020017f466c6170707943617447616d65000000000000000000000000000000000000008152506040518060400160405280600381526020017f46434700000000000000000000000000000000000000000000000000000000008152508160029080519060200190620001ae929190620002d9565b508060039080519060200190620001c7929190620002d9565b50620001d86200020660201b60201c565b600081905550505062000200620001f46200020b60201b60201c565b6200021360201b60201c565b620003ee565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002e79062000389565b90600052602060002090601f0160209004810192826200030b576000855562000357565b82601f106200032657805160ff191683800117855562000357565b8280016001018555821562000357579182015b828111156200035657825182559160200191906001019062000339565b5b5090506200036691906200036a565b5090565b5b80821115620003855760008160009055506001016200036b565b5090565b60006002820490506001821680620003a257607f821691505b60208210811415620003b957620003b8620003bf565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60805160601c60a05160c05160e01c60e05160e01c6137f56200045b6000396000818161096901528181610a490152610bbb0152600081816109420152610a9e0152600081816109e20152611396015260008181610fca01528181611e53015261241601526137f56000f3fe6080604052600436106101665760003560e01c8063622837e0116100d15780639b642de11161008a578063c87b56dd11610064578063c87b56dd14610509578063d2a241f614610546578063e985e9c514610571578063f2fde38b146105ae57610166565b80639b642de11461048e578063a22cb465146104b7578063b88d4fde146104e057610166565b8063622837e01461035657806362b99ad4146103935780636352211e146103be57806370a08231146103fb5780638da5cb5b1461043857806395d89b411461046357610166565b806323b872dd1161012357806323b872dd1461026e57806332cb6b0c146102975780633ccfd60b146102c257806342842e0e146102d957806342966c68146103025780635b43c9131461032b57610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b3146102105780631249c58b1461023957806318160ddd14610243575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d9190612c76565b6105d7565b60405161019f9190613061565b60405180910390f35b3480156101b457600080fd5b506101bd6106b9565b6040516101ca919061307c565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f59190612d19565b61074b565b6040516102079190612fd8565b60405180910390f35b34801561021c57600080fd5b5061023760048036038101906102329190612c36565b6107c7565b005b6102416108d2565b005b34801561024f57600080fd5b50610258610a75565b604051610265919061315e565b60405180910390f35b34801561027a57600080fd5b5061029560048036038101906102909190612b20565b610a8c565b005b3480156102a357600080fd5b506102ac610a9c565b6040516102b99190613179565b60405180910390f35b3480156102ce57600080fd5b506102d7610ac0565b005b3480156102e557600080fd5b5061030060048036038101906102fb9190612b20565b610b85565b005b34801561030e57600080fd5b5061032960048036038101906103249190612d19565b610ba5565b005b34801561033757600080fd5b50610340610bb9565b60405161034d9190613179565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190612ab3565b610bdd565b60405161038a919061303f565b60405180910390f35b34801561039f57600080fd5b506103a8610ddd565b6040516103b5919061307c565b60405180910390f35b3480156103ca57600080fd5b506103e560048036038101906103e09190612d19565b610e6b565b6040516103f29190612fd8565b60405180910390f35b34801561040757600080fd5b50610422600480360381019061041d9190612ab3565b610e81565b60405161042f919061315e565b60405180910390f35b34801561044457600080fd5b5061044d611023565b60405161045a9190612fd8565b60405180910390f35b34801561046f57600080fd5b5061047861104d565b604051610485919061307c565b60405180910390f35b34801561049a57600080fd5b506104b560048036038101906104b09190612cd0565b6110df565b005b3480156104c357600080fd5b506104de60048036038101906104d99190612bf6565b611101565b005b3480156104ec57600080fd5b5061050760048036038101906105029190612b73565b611279565b005b34801561051557600080fd5b50610530600480360381019061052b9190612d19565b6112f5565b60405161053d919061307c565b60405180910390f35b34801561055257600080fd5b5061055b611394565b604051610568919061315e565b60405180910390f35b34801561057d57600080fd5b5061059860048036038101906105939190612ae0565b6113b8565b6040516105a59190613061565b60405180910390f35b3480156105ba57600080fd5b506105d560048036038101906105d09190612ab3565b61144c565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106a257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106b257506106b1826114d0565b5b9050919050565b6060600280546106c890613457565b80601f01602080910402602001604051908101604052809291908181526020018280546106f490613457565b80156107415780601f1061071657610100808354040283529160200191610741565b820191906000526020600020905b81548152906001019060200180831161072457829003601f168201915b5050505050905090565b60006107568261153a565b61078c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107d282610e6b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561083a576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610859611588565b73ffffffffffffffffffffffffffffffffffffffff161415801561088b575061088981610884611588565b6113b8565b155b156108c2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108cd838383611590565b505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610940576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109379061311e565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff16610996610a75565b6109a091906132a2565b106109e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d7906130fe565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000341015610a43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3a9061309e565b60405180910390fd5b610a73337f000000000000000000000000000000000000000000000000000000000000000063ffffffff16611642565b565b6000610a7f611660565b6001546000540303905090565b610a97838383611665565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610ac8611b56565b6000479050600033905060008173ffffffffffffffffffffffffffffffffffffffff1683604051610af890612fc3565b60006040518083038185875af1925050503d8060008114610b35576040519150601f19603f3d011682016040523d82523d6000602084013e610b3a565b606091505b50508091505080610b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b77906130de565b60405180910390fd5b505050565b610ba083838360405180602001604052806000815250611279565b505050565b610bad611b56565b610bb681611bd4565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606000610bea83610e81565b90506000610bf6610a75565b905060008060008467ffffffffffffffff811115610c1757610c166135f0565b5b604051908082528060200260200182016040528015610c455781602001602082028036833780820191505090505b50905060005b84811015610dcf576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610d5857806000015193505b8873ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415610dbb5781838681518110610da057610d9f6135c1565b5b6020026020010181815250508480610db7906134ba565b9550505b508080610dc7906134ba565b915050610c4b565b508095505050505050919050565b60098054610dea90613457565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1690613457565b8015610e635780601f10610e3857610100808354040283529160200191610e63565b820191906000526020600020905b815481529060010190602001808311610e4657829003601f168201915b505050505081565b6000610e7682611be0565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ee9576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1614610fb957600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16905061101e565b6003600054610fc891906132f8565b7f000000000000000000000000000000000000000000000000000000000000000083610ff49190613329565b73ffffffffffffffffffffffffffffffffffffffff161015611019576003905061101e565b600090505b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461105c90613457565b80601f016020809104026020016040519081016040528092919081815260200182805461108890613457565b80156110d55780601f106110aa576101008083540402835291602001916110d5565b820191906000526020600020905b8154815290600101906020018083116110b857829003601f168201915b5050505050905090565b6110e7611b56565b80600990805190602001906110fd929190612884565b5050565b611109611588565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561116e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061117b611588565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611228611588565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161126d9190613061565b60405180910390a35050565b611284848484611665565b6112a38373ffffffffffffffffffffffffffffffffffffffff16611eee565b80156112b857506112b684848484611f11565b155b156112ef576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60606113008261153a565b611336576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611340612071565b9050600081511415611361576040518060200160405280600081525061138c565b8061136b84612103565b60405160200161137c929190612f9f565b6040516020818303038152906040525b915050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611454611b56565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bb906130be565b60405180910390fd5b6114cd81612264565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611545611660565b11158015611554575060005482105b8015611581575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b61165c82826040518060200160405280600081525061232a565b5050565b600090565b600061167082611be0565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611697611588565b73ffffffffffffffffffffffffffffffffffffffff1614806116ca57506116c982600001516116c4611588565b6113b8565b5b8061170f57506116d8611588565b73ffffffffffffffffffffffffffffffffffffffff166116f78461074b565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611748576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146117b1576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611818576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611825858585600161233c565b6118356000848460000151611590565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611ae657600054811015611ae55782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b4f8585856001612342565b5050505050565b611b5e611588565b73ffffffffffffffffffffffffffffffffffffffff16611b7c611023565b73ffffffffffffffffffffffffffffffffffffffff1614611bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc99061313e565b60405180910390fd5b565b611bdd81612348565b50565b611be861290a565b600082905080611bf6611660565b11158015611c05575060005481105b15611eb7576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611eb557600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611d1a578092505050611ee9565b6000600290505b828060019003935050600460008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509150600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611e3057819350505050611ee9565b6000816001900391508111611d215760038581611e5057611e4f613563565b5b047f000000000000000000000000000000000000000000000000000000000000000001826000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050819350505050611ee9565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f37611588565b8786866040518563ffffffff1660e01b8152600401611f599493929190612ff3565b602060405180830381600087803b158015611f7357600080fd5b505af1925050508015611fa457506040513d601f19601f82011682018060405250810190611fa19190612ca3565b60015b61201e573d8060008114611fd4576040519150601f19603f3d011682016040523d82523d6000602084013e611fd9565b606091505b50600081511415612016576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606009805461208090613457565b80601f01602080910402602001604051908101604052809291908181526020018280546120ac90613457565b80156120f95780601f106120ce576101008083540402835291602001916120f9565b820191906000526020600020905b8154815290600101906020018083116120dc57829003601f168201915b5050505050905090565b6060600082141561214b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061225f565b600082905060005b6000821461217d578080612166906134ba565b915050600a8261217691906132f8565b9150612153565b60008167ffffffffffffffff811115612199576121986135f0565b5b6040519080825280601f01601f1916602001820160405280156121cb5781602001600182028036833780820191505090505b5090505b60008514612258576001826121e4919061335d565b9150600a856121f39190613503565b60306121ff91906132a2565b60f81b818381518110612215576122146135c1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561225191906132f8565b94506121cf565b8093505050505b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61233783838360016124b6565b505050565b50505050565b50505050565b6000811415612383576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006003826123929190613503565b146123c9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080549050600082826123dd91906132a2565b90505b600060038373ffffffffffffffffffffffffffffffffffffffff168161240957612408613563565b5b04905082806001019350817f00000000000000000000000000000000000000000000000000000000000000000173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450808214156123e057826000808282546124aa91906132a2565b92505081905550505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612523576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561255e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61256b600086838761233c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561273557506127348773ffffffffffffffffffffffffffffffffffffffff16611eee565b5b156127fb575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127aa6000888480600101955088611f11565b6127e0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561273b5782600054146127f657600080fd5b612867565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156127fc575b81600081905550505061287d6000868387612342565b5050505050565b82805461289090613457565b90600052602060002090601f0160209004810192826128b257600085556128f9565b82601f106128cb57805160ff19168380011785556128f9565b828001600101855582156128f9579182015b828111156128f85782518255916020019190600101906128dd565b5b509050612906919061294d565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561296657600081600090555060010161294e565b5090565b600061297d612978846131b9565b613194565b90508281526020810184848401111561299957612998613624565b5b6129a4848285613415565b509392505050565b60006129bf6129ba846131ea565b613194565b9050828152602081018484840111156129db576129da613624565b5b6129e6848285613415565b509392505050565b6000813590506129fd81613763565b92915050565b600081359050612a128161377a565b92915050565b600081359050612a2781613791565b92915050565b600081519050612a3c81613791565b92915050565b600082601f830112612a5757612a5661361f565b5b8135612a6784826020860161296a565b91505092915050565b600082601f830112612a8557612a8461361f565b5b8135612a958482602086016129ac565b91505092915050565b600081359050612aad816137a8565b92915050565b600060208284031215612ac957612ac861362e565b5b6000612ad7848285016129ee565b91505092915050565b60008060408385031215612af757612af661362e565b5b6000612b05858286016129ee565b9250506020612b16858286016129ee565b9150509250929050565b600080600060608486031215612b3957612b3861362e565b5b6000612b47868287016129ee565b9350506020612b58868287016129ee565b9250506040612b6986828701612a9e565b9150509250925092565b60008060008060808587031215612b8d57612b8c61362e565b5b6000612b9b878288016129ee565b9450506020612bac878288016129ee565b9350506040612bbd87828801612a9e565b925050606085013567ffffffffffffffff811115612bde57612bdd613629565b5b612bea87828801612a42565b91505092959194509250565b60008060408385031215612c0d57612c0c61362e565b5b6000612c1b858286016129ee565b9250506020612c2c85828601612a03565b9150509250929050565b60008060408385031215612c4d57612c4c61362e565b5b6000612c5b858286016129ee565b9250506020612c6c85828601612a9e565b9150509250929050565b600060208284031215612c8c57612c8b61362e565b5b6000612c9a84828501612a18565b91505092915050565b600060208284031215612cb957612cb861362e565b5b6000612cc784828501612a2d565b91505092915050565b600060208284031215612ce657612ce561362e565b5b600082013567ffffffffffffffff811115612d0457612d03613629565b5b612d1084828501612a70565b91505092915050565b600060208284031215612d2f57612d2e61362e565b5b6000612d3d84828501612a9e565b91505092915050565b6000612d528383612f72565b60208301905092915050565b612d6781613391565b82525050565b6000612d788261322b565b612d828185613259565b9350612d8d8361321b565b8060005b83811015612dbe578151612da58882612d46565b9750612db08361324c565b925050600181019050612d91565b5085935050505092915050565b612dd4816133a3565b82525050565b6000612de582613236565b612def818561326a565b9350612dff818560208601613424565b612e0881613633565b840191505092915050565b6000612e1e82613241565b612e288185613286565b9350612e38818560208601613424565b612e4181613633565b840191505092915050565b6000612e5782613241565b612e618185613297565b9350612e71818560208601613424565b80840191505092915050565b6000612e8a600c83613286565b9150612e9582613644565b602082019050919050565b6000612ead602683613286565b9150612eb88261366d565b604082019050919050565b6000612ed0601883613286565b9150612edb826136bc565b602082019050919050565b6000612ef3600883613286565b9150612efe826136e5565b602082019050919050565b6000612f16601e83613286565b9150612f218261370e565b602082019050919050565b6000612f39602083613286565b9150612f4482613737565b602082019050919050565b6000612f5c60008361327b565b9150612f6782613760565b600082019050919050565b612f7b816133fb565b82525050565b612f8a816133fb565b82525050565b612f9981613405565b82525050565b6000612fab8285612e4c565b9150612fb78284612e4c565b91508190509392505050565b6000612fce82612f4f565b9150819050919050565b6000602082019050612fed6000830184612d5e565b92915050565b60006080820190506130086000830187612d5e565b6130156020830186612d5e565b6130226040830185612f81565b81810360608301526130348184612dda565b905095945050505050565b600060208201905081810360008301526130598184612d6d565b905092915050565b60006020820190506130766000830184612dcb565b92915050565b600060208201905081810360008301526130968184612e13565b905092915050565b600060208201905081810360008301526130b781612e7d565b9050919050565b600060208201905081810360008301526130d781612ea0565b9050919050565b600060208201905081810360008301526130f781612ec3565b9050919050565b6000602082019050818103600083015261311781612ee6565b9050919050565b6000602082019050818103600083015261313781612f09565b9050919050565b6000602082019050818103600083015261315781612f2c565b9050919050565b60006020820190506131736000830184612f81565b92915050565b600060208201905061318e6000830184612f90565b92915050565b600061319e6131af565b90506131aa8282613489565b919050565b6000604051905090565b600067ffffffffffffffff8211156131d4576131d36135f0565b5b6131dd82613633565b9050602081019050919050565b600067ffffffffffffffff821115613205576132046135f0565b5b61320e82613633565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006132ad826133fb565b91506132b8836133fb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132ed576132ec613534565b5b828201905092915050565b6000613303826133fb565b915061330e836133fb565b92508261331e5761331d613563565b5b828204905092915050565b6000613334826133db565b915061333f836133db565b92508282101561335257613351613534565b5b828203905092915050565b6000613368826133fb565b9150613373836133fb565b92508282101561338657613385613534565b5b828203905092915050565b600061339c826133db565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b82818337600083830152505050565b60005b83811015613442578082015181840152602081019050613427565b83811115613451576000848401525b50505050565b6000600282049050600182168061346f57607f821691505b6020821081141561348357613482613592565b5b50919050565b61349282613633565b810181811067ffffffffffffffff821117156134b1576134b06135f0565b5b80604052505050565b60006134c5826133fb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156134f8576134f7613534565b5b600182019050919050565b600061350e826133fb565b9150613519836133fb565b92508261352957613528613563565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f696e73756666696369656e740000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b61376c81613391565b811461377757600080fd5b50565b613783816133a3565b811461378e57600080fd5b50565b61379a816133af565b81146137a557600080fd5b50565b6137b1816133fb565b81146137bc57600080fd5b5056fea26469706673582212206d4eb08aa502a83c96ebdc4b5a9febf1e41041b8b6e5b5055145a7480d4dc85764736f6c63430008070033
Deployed Bytecode
0x6080604052600436106101665760003560e01c8063622837e0116100d15780639b642de11161008a578063c87b56dd11610064578063c87b56dd14610509578063d2a241f614610546578063e985e9c514610571578063f2fde38b146105ae57610166565b80639b642de11461048e578063a22cb465146104b7578063b88d4fde146104e057610166565b8063622837e01461035657806362b99ad4146103935780636352211e146103be57806370a08231146103fb5780638da5cb5b1461043857806395d89b411461046357610166565b806323b872dd1161012357806323b872dd1461026e57806332cb6b0c146102975780633ccfd60b146102c257806342842e0e146102d957806342966c68146103025780635b43c9131461032b57610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b3146102105780631249c58b1461023957806318160ddd14610243575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d9190612c76565b6105d7565b60405161019f9190613061565b60405180910390f35b3480156101b457600080fd5b506101bd6106b9565b6040516101ca919061307c565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f59190612d19565b61074b565b6040516102079190612fd8565b60405180910390f35b34801561021c57600080fd5b5061023760048036038101906102329190612c36565b6107c7565b005b6102416108d2565b005b34801561024f57600080fd5b50610258610a75565b604051610265919061315e565b60405180910390f35b34801561027a57600080fd5b5061029560048036038101906102909190612b20565b610a8c565b005b3480156102a357600080fd5b506102ac610a9c565b6040516102b99190613179565b60405180910390f35b3480156102ce57600080fd5b506102d7610ac0565b005b3480156102e557600080fd5b5061030060048036038101906102fb9190612b20565b610b85565b005b34801561030e57600080fd5b5061032960048036038101906103249190612d19565b610ba5565b005b34801561033757600080fd5b50610340610bb9565b60405161034d9190613179565b60405180910390f35b34801561036257600080fd5b5061037d60048036038101906103789190612ab3565b610bdd565b60405161038a919061303f565b60405180910390f35b34801561039f57600080fd5b506103a8610ddd565b6040516103b5919061307c565b60405180910390f35b3480156103ca57600080fd5b506103e560048036038101906103e09190612d19565b610e6b565b6040516103f29190612fd8565b60405180910390f35b34801561040757600080fd5b50610422600480360381019061041d9190612ab3565b610e81565b60405161042f919061315e565b60405180910390f35b34801561044457600080fd5b5061044d611023565b60405161045a9190612fd8565b60405180910390f35b34801561046f57600080fd5b5061047861104d565b604051610485919061307c565b60405180910390f35b34801561049a57600080fd5b506104b560048036038101906104b09190612cd0565b6110df565b005b3480156104c357600080fd5b506104de60048036038101906104d99190612bf6565b611101565b005b3480156104ec57600080fd5b5061050760048036038101906105029190612b73565b611279565b005b34801561051557600080fd5b50610530600480360381019061052b9190612d19565b6112f5565b60405161053d919061307c565b60405180910390f35b34801561055257600080fd5b5061055b611394565b604051610568919061315e565b60405180910390f35b34801561057d57600080fd5b5061059860048036038101906105939190612ae0565b6113b8565b6040516105a59190613061565b60405180910390f35b3480156105ba57600080fd5b506105d560048036038101906105d09190612ab3565b61144c565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106a257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106b257506106b1826114d0565b5b9050919050565b6060600280546106c890613457565b80601f01602080910402602001604051908101604052809291908181526020018280546106f490613457565b80156107415780601f1061071657610100808354040283529160200191610741565b820191906000526020600020905b81548152906001019060200180831161072457829003601f168201915b5050505050905090565b60006107568261153a565b61078c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107d282610e6b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561083a576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610859611588565b73ffffffffffffffffffffffffffffffffffffffff161415801561088b575061088981610884611588565b6113b8565b155b156108c2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108cd838383611590565b505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610940576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109379061311e565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000013b063ffffffff167f000000000000000000000000000000000000000000000000000000000000000363ffffffff16610996610a75565b6109a091906132a2565b106109e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d7906130fe565b60405180910390fd5b7f000000000000000000000000000000000000000000000000001ff973cafa8000341015610a43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3a9061309e565b60405180910390fd5b610a73337f000000000000000000000000000000000000000000000000000000000000000363ffffffff16611642565b565b6000610a7f611660565b6001546000540303905090565b610a97838383611665565b505050565b7f00000000000000000000000000000000000000000000000000000000000013b081565b610ac8611b56565b6000479050600033905060008173ffffffffffffffffffffffffffffffffffffffff1683604051610af890612fc3565b60006040518083038185875af1925050503d8060008114610b35576040519150601f19603f3d011682016040523d82523d6000602084013e610b3a565b606091505b50508091505080610b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b77906130de565b60405180910390fd5b505050565b610ba083838360405180602001604052806000815250611279565b505050565b610bad611b56565b610bb681611bd4565b50565b7f000000000000000000000000000000000000000000000000000000000000000381565b60606000610bea83610e81565b90506000610bf6610a75565b905060008060008467ffffffffffffffff811115610c1757610c166135f0565b5b604051908082528060200260200182016040528015610c455781602001602082028036833780820191505090505b50905060005b84811015610dcf576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610d5857806000015193505b8873ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415610dbb5781838681518110610da057610d9f6135c1565b5b6020026020010181815250508480610db7906134ba565b9550505b508080610dc7906134ba565b915050610c4b565b508095505050505050919050565b60098054610dea90613457565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1690613457565b8015610e635780601f10610e3857610100808354040283529160200191610e63565b820191906000526020600020905b815481529060010190602001808311610e4657829003601f168201915b505050505081565b6000610e7682611be0565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ee9576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1614610fb957600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16905061101e565b6003600054610fc891906132f8565b7f000000000000000000000000521fad559524f59515912c1b80a828fab0a7957083610ff49190613329565b73ffffffffffffffffffffffffffffffffffffffff161015611019576003905061101e565b600090505b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461105c90613457565b80601f016020809104026020016040519081016040528092919081815260200182805461108890613457565b80156110d55780601f106110aa576101008083540402835291602001916110d5565b820191906000526020600020905b8154815290600101906020018083116110b857829003601f168201915b5050505050905090565b6110e7611b56565b80600990805190602001906110fd929190612884565b5050565b611109611588565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561116e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061117b611588565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611228611588565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161126d9190613061565b60405180910390a35050565b611284848484611665565b6112a38373ffffffffffffffffffffffffffffffffffffffff16611eee565b80156112b857506112b684848484611f11565b155b156112ef576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60606113008261153a565b611336576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611340612071565b9050600081511415611361576040518060200160405280600081525061138c565b8061136b84612103565b60405160200161137c929190612f9f565b6040516020818303038152906040525b915050919050565b7f000000000000000000000000000000000000000000000000001ff973cafa800081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611454611b56565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bb906130be565b60405180910390fd5b6114cd81612264565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611545611660565b11158015611554575060005482105b8015611581575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b61165c82826040518060200160405280600081525061232a565b5050565b600090565b600061167082611be0565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611697611588565b73ffffffffffffffffffffffffffffffffffffffff1614806116ca57506116c982600001516116c4611588565b6113b8565b5b8061170f57506116d8611588565b73ffffffffffffffffffffffffffffffffffffffff166116f78461074b565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611748576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146117b1576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611818576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611825858585600161233c565b6118356000848460000151611590565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611ae657600054811015611ae55782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b4f8585856001612342565b5050505050565b611b5e611588565b73ffffffffffffffffffffffffffffffffffffffff16611b7c611023565b73ffffffffffffffffffffffffffffffffffffffff1614611bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc99061313e565b60405180910390fd5b565b611bdd81612348565b50565b611be861290a565b600082905080611bf6611660565b11158015611c05575060005481105b15611eb7576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611eb557600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611d1a578092505050611ee9565b6000600290505b828060019003935050600460008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509150600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611e3057819350505050611ee9565b6000816001900391508111611d215760038581611e5057611e4f613563565b5b047f000000000000000000000000521fad559524f59515912c1b80a828fab0a7957001826000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050819350505050611ee9565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f37611588565b8786866040518563ffffffff1660e01b8152600401611f599493929190612ff3565b602060405180830381600087803b158015611f7357600080fd5b505af1925050508015611fa457506040513d601f19601f82011682018060405250810190611fa19190612ca3565b60015b61201e573d8060008114611fd4576040519150601f19603f3d011682016040523d82523d6000602084013e611fd9565b606091505b50600081511415612016576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606009805461208090613457565b80601f01602080910402602001604051908101604052809291908181526020018280546120ac90613457565b80156120f95780601f106120ce576101008083540402835291602001916120f9565b820191906000526020600020905b8154815290600101906020018083116120dc57829003601f168201915b5050505050905090565b6060600082141561214b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061225f565b600082905060005b6000821461217d578080612166906134ba565b915050600a8261217691906132f8565b9150612153565b60008167ffffffffffffffff811115612199576121986135f0565b5b6040519080825280601f01601f1916602001820160405280156121cb5781602001600182028036833780820191505090505b5090505b60008514612258576001826121e4919061335d565b9150600a856121f39190613503565b60306121ff91906132a2565b60f81b818381518110612215576122146135c1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561225191906132f8565b94506121cf565b8093505050505b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61233783838360016124b6565b505050565b50505050565b50505050565b6000811415612383576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006003826123929190613503565b146123c9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080549050600082826123dd91906132a2565b90505b600060038373ffffffffffffffffffffffffffffffffffffffff168161240957612408613563565b5b04905082806001019350817f000000000000000000000000521fad559524f59515912c1b80a828fab0a795700173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450808214156123e057826000808282546124aa91906132a2565b92505081905550505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612523576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141561255e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61256b600086838761233c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561273557506127348773ffffffffffffffffffffffffffffffffffffffff16611eee565b5b156127fb575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127aa6000888480600101955088611f11565b6127e0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561273b5782600054146127f657600080fd5b612867565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156127fc575b81600081905550505061287d6000868387612342565b5050505050565b82805461289090613457565b90600052602060002090601f0160209004810192826128b257600085556128f9565b82601f106128cb57805160ff19168380011785556128f9565b828001600101855582156128f9579182015b828111156128f85782518255916020019190600101906128dd565b5b509050612906919061294d565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561296657600081600090555060010161294e565b5090565b600061297d612978846131b9565b613194565b90508281526020810184848401111561299957612998613624565b5b6129a4848285613415565b509392505050565b60006129bf6129ba846131ea565b613194565b9050828152602081018484840111156129db576129da613624565b5b6129e6848285613415565b509392505050565b6000813590506129fd81613763565b92915050565b600081359050612a128161377a565b92915050565b600081359050612a2781613791565b92915050565b600081519050612a3c81613791565b92915050565b600082601f830112612a5757612a5661361f565b5b8135612a6784826020860161296a565b91505092915050565b600082601f830112612a8557612a8461361f565b5b8135612a958482602086016129ac565b91505092915050565b600081359050612aad816137a8565b92915050565b600060208284031215612ac957612ac861362e565b5b6000612ad7848285016129ee565b91505092915050565b60008060408385031215612af757612af661362e565b5b6000612b05858286016129ee565b9250506020612b16858286016129ee565b9150509250929050565b600080600060608486031215612b3957612b3861362e565b5b6000612b47868287016129ee565b9350506020612b58868287016129ee565b9250506040612b6986828701612a9e565b9150509250925092565b60008060008060808587031215612b8d57612b8c61362e565b5b6000612b9b878288016129ee565b9450506020612bac878288016129ee565b9350506040612bbd87828801612a9e565b925050606085013567ffffffffffffffff811115612bde57612bdd613629565b5b612bea87828801612a42565b91505092959194509250565b60008060408385031215612c0d57612c0c61362e565b5b6000612c1b858286016129ee565b9250506020612c2c85828601612a03565b9150509250929050565b60008060408385031215612c4d57612c4c61362e565b5b6000612c5b858286016129ee565b9250506020612c6c85828601612a9e565b9150509250929050565b600060208284031215612c8c57612c8b61362e565b5b6000612c9a84828501612a18565b91505092915050565b600060208284031215612cb957612cb861362e565b5b6000612cc784828501612a2d565b91505092915050565b600060208284031215612ce657612ce561362e565b5b600082013567ffffffffffffffff811115612d0457612d03613629565b5b612d1084828501612a70565b91505092915050565b600060208284031215612d2f57612d2e61362e565b5b6000612d3d84828501612a9e565b91505092915050565b6000612d528383612f72565b60208301905092915050565b612d6781613391565b82525050565b6000612d788261322b565b612d828185613259565b9350612d8d8361321b565b8060005b83811015612dbe578151612da58882612d46565b9750612db08361324c565b925050600181019050612d91565b5085935050505092915050565b612dd4816133a3565b82525050565b6000612de582613236565b612def818561326a565b9350612dff818560208601613424565b612e0881613633565b840191505092915050565b6000612e1e82613241565b612e288185613286565b9350612e38818560208601613424565b612e4181613633565b840191505092915050565b6000612e5782613241565b612e618185613297565b9350612e71818560208601613424565b80840191505092915050565b6000612e8a600c83613286565b9150612e9582613644565b602082019050919050565b6000612ead602683613286565b9150612eb88261366d565b604082019050919050565b6000612ed0601883613286565b9150612edb826136bc565b602082019050919050565b6000612ef3600883613286565b9150612efe826136e5565b602082019050919050565b6000612f16601e83613286565b9150612f218261370e565b602082019050919050565b6000612f39602083613286565b9150612f4482613737565b602082019050919050565b6000612f5c60008361327b565b9150612f6782613760565b600082019050919050565b612f7b816133fb565b82525050565b612f8a816133fb565b82525050565b612f9981613405565b82525050565b6000612fab8285612e4c565b9150612fb78284612e4c565b91508190509392505050565b6000612fce82612f4f565b9150819050919050565b6000602082019050612fed6000830184612d5e565b92915050565b60006080820190506130086000830187612d5e565b6130156020830186612d5e565b6130226040830185612f81565b81810360608301526130348184612dda565b905095945050505050565b600060208201905081810360008301526130598184612d6d565b905092915050565b60006020820190506130766000830184612dcb565b92915050565b600060208201905081810360008301526130968184612e13565b905092915050565b600060208201905081810360008301526130b781612e7d565b9050919050565b600060208201905081810360008301526130d781612ea0565b9050919050565b600060208201905081810360008301526130f781612ec3565b9050919050565b6000602082019050818103600083015261311781612ee6565b9050919050565b6000602082019050818103600083015261313781612f09565b9050919050565b6000602082019050818103600083015261315781612f2c565b9050919050565b60006020820190506131736000830184612f81565b92915050565b600060208201905061318e6000830184612f90565b92915050565b600061319e6131af565b90506131aa8282613489565b919050565b6000604051905090565b600067ffffffffffffffff8211156131d4576131d36135f0565b5b6131dd82613633565b9050602081019050919050565b600067ffffffffffffffff821115613205576132046135f0565b5b61320e82613633565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006132ad826133fb565b91506132b8836133fb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132ed576132ec613534565b5b828201905092915050565b6000613303826133fb565b915061330e836133fb565b92508261331e5761331d613563565b5b828204905092915050565b6000613334826133db565b915061333f836133db565b92508282101561335257613351613534565b5b828203905092915050565b6000613368826133fb565b9150613373836133fb565b92508282101561338657613385613534565b5b828203905092915050565b600061339c826133db565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b82818337600083830152505050565b60005b83811015613442578082015181840152602081019050613427565b83811115613451576000848401525b50505050565b6000600282049050600182168061346f57607f821691505b6020821081141561348357613482613592565b5b50919050565b61349282613633565b810181811067ffffffffffffffff821117156134b1576134b06135f0565b5b80604052505050565b60006134c5826133fb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156134f8576134f7613534565b5b600182019050919050565b600061350e826133fb565b9150613519836133fb565b92508261352957613528613563565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f696e73756666696369656e740000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b61376c81613391565b811461377757600080fd5b50565b613783816133a3565b811461378e57600080fd5b50565b61379a816133af565b81146137a557600080fd5b50565b6137b1816133fb565b81146137bc57600080fd5b5056fea26469706673582212206d4eb08aa502a83c96ebdc4b5a9febf1e41041b8b6e5b5055145a7480d4dc85764736f6c63430008070033
Deployed Bytecode Sourcemap
49307:1455:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29654:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33498:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35001:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34564:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50142:238;;;:::i;:::-;;27793:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35858:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49418:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50481:278;;;;;;;;;;;;;:::i;:::-;;36099:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50388:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49466:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28399:807;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49518:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33307:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30025:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4731:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33667:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49930:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35277:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36355:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33842:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49359:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35627:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5183:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29654:305;29756:4;29808:25;29793:40;;;:11;:40;;;;:105;;;;29865:33;29850:48;;;:11;:48;;;;29793:105;:158;;;;29915:36;29939:11;29915:23;:36::i;:::-;29793:158;29773:178;;29654:305;;;:::o;33498:100::-;33552:13;33585:5;33578:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33498:100;:::o;35001:204::-;35069:7;35094:16;35102:7;35094;:16::i;:::-;35089:64;;35119:34;;;;;;;;;;;;;;35089:64;35173:15;:24;35189:7;35173:24;;;;;;;;;;;;;;;;;;;;;35166:31;;35001:204;;;:::o;34564:371::-;34637:13;34653:24;34669:7;34653:15;:24::i;:::-;34637:40;;34698:5;34692:11;;:2;:11;;;34688:48;;;34712:24;;;;;;;;;;;;;;34688:48;34769:5;34753:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;34779:37;34796:5;34803:12;:10;:12::i;:::-;34779:16;:37::i;:::-;34778:38;34753:63;34749:138;;;34840:35;;;;;;;;;;;;;;34749:138;34899:28;34908:2;34912:7;34921:5;34899:8;:28::i;:::-;34626:309;34564:371;;:::o;50142:238::-;49666:10;49653:23;;:9;:23;;;49645:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;50239:10:::1;50204:45;;50220:15;50204:31;;:13;:11;:13::i;:::-;:31;;;;:::i;:::-;:45;50196:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;50294:13;50281:9;:26;;50273:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;50334:38;50344:10;50356:15;50334:38;;:9;:38::i;:::-;50142:238::o:0;27793:303::-;27837:7;28062:15;:13;:15::i;:::-;28047:12;;28031:13;;:28;:46;28024:53;;27793:303;:::o;35858:170::-;35992:28;36002:4;36008:2;36012:7;35992:9;:28::i;:::-;35858:170;;;:::o;49418:41::-;;;:::o;50481:278::-;4617:13;:11;:13::i;:::-;50529:18:::1;50550:21;50529:42;;50584:9;50604:10;50584:31;;50628:12;50667:1;:6;;50681:10;50667:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50653:43;;;;;50715:7;50707:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;50518:241;;;50481:278::o:0;36099:185::-;36237:39;36254:4;36260:2;36264:7;36237:39;;;;;;;;;;;;:16;:39::i;:::-;36099:185;;;:::o;50388:83::-;4617:13;:11;:13::i;:::-;50446:17:::1;50456:6;50446:9;:17::i;:::-;50388:83:::0;:::o;49466:43::-;;;:::o;28399:807::-;28464:13;28489:15;28507:16;28517:5;28507:9;:16::i;:::-;28489:34;;28535:22;28560:13;:11;:13::i;:::-;28535:38;;28584:19;28618:25;28667:22;28706:10;28692:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28667:50;;28733:9;28728:375;28752:14;28748:1;:18;28728:375;;;28788:31;28822:11;:14;28834:1;28822:14;;;;;;;;;;;28788:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28881:1;28855:28;;:9;:14;;;:28;;;28851:103;;28924:9;:14;;;28904:34;;28851:103;28993:5;28972:26;;:17;:26;;;28968:124;;;29043:1;29019:8;29028:11;29019:21;;;;;;;;:::i;:::-;;;;;;;:25;;;;;29063:13;;;;;:::i;:::-;;;;28968:124;28773:330;28768:3;;;;;:::i;:::-;;;;28728:375;;;;29190:8;29183:15;;;;;;;28399:807;;;:::o;49518:36::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33307:124::-;33371:7;33398:20;33410:7;33398:11;:20::i;:::-;:25;;;33391:32;;33307:124;;;:::o;30025:396::-;30089:7;30130:1;30113:19;;:5;:19;;;30109:60;;;30141:28;;;;;;;;;;;;;;30109:60;30217:1;30186:12;:19;30199:5;30186:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;:32;;;30182:108;;30250:12;:19;30263:5;30250:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;30242:36;;30235:43;;;;30182:108;30355:1;30341:13;;:15;;;;:::i;:::-;30331:6;30314:5;30306:32;;;;:::i;:::-;:50;;;30302:91;;;30380:1;30373:8;;;;30302:91;30412:1;30405:8;;30025:396;;;;:::o;4731:87::-;4777:7;4804:6;;;;;;;;;;;4797:13;;4731:87;:::o;33667:104::-;33723:13;33756:7;33749:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33667:104;:::o;49930:86::-;4617:13;:11;:13::i;:::-;50005:3:::1;49993:9;:15;;;;;;;;;;;;:::i;:::-;;49930:86:::0;:::o;35277:279::-;35380:12;:10;:12::i;:::-;35368:24;;:8;:24;;;35364:54;;;35401:17;;;;;;;;;;;;;;35364:54;35476:8;35431:18;:32;35450:12;:10;:12::i;:::-;35431:32;;;;;;;;;;;;;;;:42;35464:8;35431:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;35529:8;35500:48;;35515:12;:10;:12::i;:::-;35500:48;;;35539:8;35500:48;;;;;;:::i;:::-;;;;;;;;35277:279;;:::o;36355:369::-;36522:28;36532:4;36538:2;36542:7;36522:9;:28::i;:::-;36565:15;:2;:13;;;:15::i;:::-;:76;;;;;36585:56;36616:4;36622:2;36626:7;36635:5;36585:30;:56::i;:::-;36584:57;36565:76;36561:156;;;36665:40;;;;;;;;;;;;;;36561:156;36355:369;;;;:::o;33842:318::-;33915:13;33946:16;33954:7;33946;:16::i;:::-;33941:59;;33971:29;;;;;;;;;;;;;;33941:59;34013:21;34037:10;:8;:10::i;:::-;34013:34;;34090:1;34071:7;34065:21;:26;;:87;;;;;;;;;;;;;;;;;34118:7;34127:18;:7;:16;:18::i;:::-;34101:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34065:87;34058:94;;;33842:318;;;:::o;49359:52::-;;;:::o;35627:164::-;35724:4;35748:18;:25;35767:5;35748:25;;;;;;;;;;;;;;;:35;35774:8;35748:35;;;;;;;;;;;;;;;;;;;;;;;;;35741:42;;35627:164;;;;:::o;5183:201::-;4617:13;:11;:13::i;:::-;5292:1:::1;5272:22;;:8;:22;;;;5264:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5348:28;5367:8;5348:18;:28::i;:::-;5183:201:::0;:::o;17131:157::-;17216:4;17255:25;17240:40;;;:11;:40;;;;17233:47;;17131:157;;;:::o;36979:187::-;37036:4;37079:7;37060:15;:13;:15::i;:::-;:26;;:53;;;;;37100:13;;37090:7;:23;37060:53;:98;;;;;37131:11;:20;37143:7;37131:20;;;;;;;;;;;:27;;;;;;;;;;;;37130:28;37060:98;37053:105;;36979:187;;;:::o;3282:98::-;3335:7;3362:10;3355:17;;3282:98;:::o;46291:196::-;46433:2;46406:15;:24;46422:7;46406:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;46471:7;46467:2;46451:28;;46460:5;46451:28;;;;;;;;;;;;46291:196;;;:::o;37174:104::-;37243:27;37253:2;37257:8;37243:27;;;;;;;;;;;;:9;:27::i;:::-;37174:104;;:::o;50024:110::-;50098:7;50024:110;:::o;41793:2112::-;41908:35;41946:20;41958:7;41946:11;:20::i;:::-;41908:58;;41979:22;42021:13;:18;;;42005:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;42056:50;42073:13;:18;;;42093:12;:10;:12::i;:::-;42056:16;:50::i;:::-;42005:101;:154;;;;42147:12;:10;:12::i;:::-;42123:36;;:20;42135:7;42123:11;:20::i;:::-;:36;;;42005:154;41979:181;;42178:17;42173:66;;42204:35;;;;;;;;;;;;;;42173:66;42276:4;42254:26;;:13;:18;;;:26;;;42250:67;;42289:28;;;;;;;;;;;;;;42250:67;42346:1;42332:16;;:2;:16;;;42328:52;;;42357:23;;;;;;;;;;;;;;42328:52;42393:43;42415:4;42421:2;42425:7;42434:1;42393:21;:43::i;:::-;42501:49;42518:1;42522:7;42531:13;:18;;;42501:8;:49::i;:::-;42876:1;42846:12;:18;42859:4;42846:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42920:1;42892:12;:16;42905:2;42892:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42966:2;42938:11;:20;42950:7;42938:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;43028:15;42983:11;:20;42995:7;42983:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;43296:19;43328:1;43318:7;:11;43296:33;;43389:1;43348:43;;:11;:24;43360:11;43348:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;43344:445;;;43573:13;;43559:11;:27;43555:219;;;43643:13;:18;;;43611:11;:24;43623:11;43611:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;43726:13;:28;;;43684:11;:24;43696:11;43684:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;43555:219;43344:445;42821:979;43836:7;43832:2;43817:27;;43826:4;43817:27;;;;;;;;;;;;43855:42;43876:4;43882:2;43886:7;43895:1;43855:20;:42::i;:::-;41897:2008;;41793:2112;;;:::o;4896:132::-;4971:12;:10;:12::i;:::-;4960:23;;:7;:5;:7::i;:::-;:23;;;4952:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4896:132::o;37812:116::-;37897:19;37907:8;37897:9;:19::i;:::-;37812:116;:::o;31956:1289::-;32017:21;;:::i;:::-;32051:12;32066:7;32051:22;;32134:4;32115:15;:13;:15::i;:::-;:23;;:47;;;;;32149:13;;32142:4;:20;32115:47;32111:1067;;;32183:31;32217:11;:17;32229:4;32217:17;;;;;;;;;;;32183:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32258:9;:16;;;32253:906;;32329:1;32303:28;;:9;:14;;;:28;;;32299:101;;32367:9;32360:16;;;;;;32299:101;32704:13;32720:1;32704:17;;32744:270;32773:6;;;;;;;;32818:11;:17;32830:4;32818:17;;;;;;;;;;;32806:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32892:1;32866:28;;:9;:14;;;:28;;;32862:109;;32934:9;32927:16;;;;;;;32862:109;33011:1;33001:7;;;;;;;:11;32744:270;;33097:1;33089:7;:9;;;;;:::i;:::-;;;33071:6;33063:36;33038:9;:14;;:62;;;;;;;;;;;33130:9;33123:16;;;;;;;32253:906;32164:1014;32111:1067;33206:31;;;;;;;;;;;;;;31956:1289;;;;:::o;6975:326::-;7035:4;7292:1;7270:7;:19;;;:23;7263:30;;6975:326;;;:::o;46979:667::-;47142:4;47179:2;47163:36;;;47200:12;:10;:12::i;:::-;47214:4;47220:7;47229:5;47163:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47159:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47414:1;47397:6;:13;:18;47393:235;;;47443:40;;;;;;;;;;;;;;47393:235;47586:6;47580:13;47571:6;47567:2;47563:15;47556:38;47159:480;47292:45;;;47282:55;;;:6;:55;;;;47275:62;;;46979:667;;;;;;:::o;49811:111::-;49872:13;49905:9;49898:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49811:111;:::o;536:723::-;592:13;822:1;813:5;:10;809:53;;;840:10;;;;;;;;;;;;;;;;;;;;;809:53;872:12;887:5;872:20;;903:14;928:78;943:1;935:4;:9;928:78;;961:8;;;;;:::i;:::-;;;;992:2;984:10;;;;;:::i;:::-;;;928:78;;;1016:19;1048:6;1038:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1016:39;;1066:154;1082:1;1073:5;:10;1066:154;;1110:1;1100:11;;;;;:::i;:::-;;;1177:2;1169:5;:10;;;;:::i;:::-;1156:2;:24;;;;:::i;:::-;1143:39;;1126:6;1133;1126:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1206:2;1197:11;;;;;:::i;:::-;;;1066:154;;;1244:6;1230:21;;;;;536:723;;;;:::o;5544:191::-;5618:16;5637:6;;;;;;;;;;;5618:25;;5663:8;5654:6;;:17;;;;;;;;;;;;;;;;;;5718:8;5687:40;;5708:8;5687:40;;;;;;;;;;;;5607:128;5544:191;:::o;37641:163::-;37764:32;37770:2;37774:8;37784:5;37791:4;37764:5;:32::i;:::-;37641:163;;;:::o;48294:159::-;;;;;:::o;49112:158::-;;;;;:::o;39970:1569::-;40125:1;40113:8;:13;40109:44;;;40135:18;;;;;;;;;;;;;;40109:44;40188:1;40183;40172:8;:12;;;;:::i;:::-;:17;40168:48;;40198:18;;;;;;;;;;;;;;40168:48;40233:20;40256:13;;40233:36;;40284:11;40313:8;40298:12;:23;;;;:::i;:::-;40284:37;;40367:214;40393:14;40432:1;40418:12;40410:23;;;;;;;:::i;:::-;;;40393:40;;40517:14;;;;;;40508:6;40498;40490:24;40461:71;;40478:1;40461:71;;;;;;;;;;;;40370:182;40576:3;40560:12;:19;;40367:214;;40631:8;40614:13;;:25;;;;;;;:::i;:::-;;;;;;;;40040:1499;;39970:1569;:::o;38187:1775::-;38326:20;38349:13;;38326:36;;38391:1;38377:16;;:2;:16;;;38373:48;;;38402:19;;;;;;;;;;;;;;38373:48;38448:1;38436:8;:13;38432:44;;;38458:18;;;;;;;;;;;;;;38432:44;38489:61;38519:1;38523:2;38527:12;38541:8;38489:21;:61::i;:::-;38862:8;38827:12;:16;38840:2;38827:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38926:8;38886:12;:16;38899:2;38886:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38985:2;38952:11;:25;38964:12;38952:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;39052:15;39002:11;:25;39014:12;39002:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;39085:20;39108:12;39085:35;;39135:11;39164:8;39149:12;:23;39135:37;;39193:4;:23;;;;;39201:15;:2;:13;;;:15::i;:::-;39193:23;39189:641;;;39237:314;39293:12;39289:2;39268:38;;39285:1;39268:38;;;;;;;;;;;;39334:69;39373:1;39377:2;39381:14;;;;;;39397:5;39334:30;:69::i;:::-;39329:174;;39439:40;;;;;;;;;;;;;;39329:174;39546:3;39530:12;:19;;39237:314;;39632:12;39615:13;;:29;39611:43;;39646:8;;;39611:43;39189:641;;;39695:120;39751:14;;;;;;39747:2;39726:40;;39743:1;39726:40;;;;;;;;;;;;39810:3;39794:12;:19;;39695:120;;39189:641;39860:12;39844:13;:28;;;;38802:1082;;39894:60;39923:1;39927:2;39931:12;39945:8;39894:20;:60::i;:::-;38315:1647;38187:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:179::-;7227:10;7248:46;7290:3;7282:6;7248:46;:::i;:::-;7326:4;7321:3;7317:14;7303:28;;7158:179;;;;:::o;7343:118::-;7430:24;7448:5;7430:24;:::i;:::-;7425:3;7418:37;7343:118;;:::o;7497:732::-;7616:3;7645:54;7693:5;7645:54;:::i;:::-;7715:86;7794:6;7789:3;7715:86;:::i;:::-;7708:93;;7825:56;7875:5;7825:56;:::i;:::-;7904:7;7935:1;7920:284;7945:6;7942:1;7939:13;7920:284;;;8021:6;8015:13;8048:63;8107:3;8092:13;8048:63;:::i;:::-;8041:70;;8134:60;8187:6;8134:60;:::i;:::-;8124:70;;7980:224;7967:1;7964;7960:9;7955:14;;7920:284;;;7924:14;8220:3;8213:10;;7621:608;;;7497:732;;;;:::o;8235:109::-;8316:21;8331:5;8316:21;:::i;:::-;8311:3;8304:34;8235:109;;:::o;8350:360::-;8436:3;8464:38;8496:5;8464:38;:::i;:::-;8518:70;8581:6;8576:3;8518:70;:::i;:::-;8511:77;;8597:52;8642:6;8637:3;8630:4;8623:5;8619:16;8597:52;:::i;:::-;8674:29;8696:6;8674:29;:::i;:::-;8669:3;8665:39;8658:46;;8440:270;8350:360;;;;:::o;8716:364::-;8804:3;8832:39;8865:5;8832:39;:::i;:::-;8887:71;8951:6;8946:3;8887:71;:::i;:::-;8880:78;;8967:52;9012:6;9007:3;9000:4;8993:5;8989:16;8967:52;:::i;:::-;9044:29;9066:6;9044:29;:::i;:::-;9039:3;9035:39;9028:46;;8808:272;8716:364;;;;:::o;9086:377::-;9192:3;9220:39;9253:5;9220:39;:::i;:::-;9275:89;9357:6;9352:3;9275:89;:::i;:::-;9268:96;;9373:52;9418:6;9413:3;9406:4;9399:5;9395:16;9373:52;:::i;:::-;9450:6;9445:3;9441:16;9434:23;;9196:267;9086:377;;;;:::o;9469:366::-;9611:3;9632:67;9696:2;9691:3;9632:67;:::i;:::-;9625:74;;9708:93;9797:3;9708:93;:::i;:::-;9826:2;9821:3;9817:12;9810:19;;9469:366;;;:::o;9841:::-;9983:3;10004:67;10068:2;10063:3;10004:67;:::i;:::-;9997:74;;10080:93;10169:3;10080:93;:::i;:::-;10198:2;10193:3;10189:12;10182:19;;9841:366;;;:::o;10213:::-;10355:3;10376:67;10440:2;10435:3;10376:67;:::i;:::-;10369:74;;10452:93;10541:3;10452:93;:::i;:::-;10570:2;10565:3;10561:12;10554:19;;10213:366;;;:::o;10585:365::-;10727:3;10748:66;10812:1;10807:3;10748:66;:::i;:::-;10741:73;;10823:93;10912:3;10823:93;:::i;:::-;10941:2;10936:3;10932:12;10925:19;;10585:365;;;:::o;10956:366::-;11098:3;11119:67;11183:2;11178:3;11119:67;:::i;:::-;11112:74;;11195:93;11284:3;11195:93;:::i;:::-;11313:2;11308:3;11304:12;11297:19;;10956:366;;;:::o;11328:::-;11470:3;11491:67;11555:2;11550:3;11491:67;:::i;:::-;11484:74;;11567:93;11656:3;11567:93;:::i;:::-;11685:2;11680:3;11676:12;11669:19;;11328:366;;;:::o;11700:398::-;11859:3;11880:83;11961:1;11956:3;11880:83;:::i;:::-;11873:90;;11972:93;12061:3;11972:93;:::i;:::-;12090:1;12085:3;12081:11;12074:18;;11700:398;;;:::o;12104:108::-;12181:24;12199:5;12181:24;:::i;:::-;12176:3;12169:37;12104:108;;:::o;12218:118::-;12305:24;12323:5;12305:24;:::i;:::-;12300:3;12293:37;12218:118;;:::o;12342:115::-;12427:23;12444:5;12427:23;:::i;:::-;12422:3;12415:36;12342:115;;:::o;12463:435::-;12643:3;12665:95;12756:3;12747:6;12665:95;:::i;:::-;12658:102;;12777:95;12868:3;12859:6;12777:95;:::i;:::-;12770:102;;12889:3;12882:10;;12463:435;;;;;:::o;12904:379::-;13088:3;13110:147;13253:3;13110:147;:::i;:::-;13103:154;;13274:3;13267:10;;12904:379;;;:::o;13289:222::-;13382:4;13420:2;13409:9;13405:18;13397:26;;13433:71;13501:1;13490:9;13486:17;13477:6;13433:71;:::i;:::-;13289:222;;;;:::o;13517:640::-;13712:4;13750:3;13739:9;13735:19;13727:27;;13764:71;13832:1;13821:9;13817:17;13808:6;13764:71;:::i;:::-;13845:72;13913:2;13902:9;13898:18;13889:6;13845:72;:::i;:::-;13927;13995:2;13984:9;13980:18;13971:6;13927:72;:::i;:::-;14046:9;14040:4;14036:20;14031:2;14020:9;14016:18;14009:48;14074:76;14145:4;14136:6;14074:76;:::i;:::-;14066:84;;13517:640;;;;;;;:::o;14163:373::-;14306:4;14344:2;14333:9;14329:18;14321:26;;14393:9;14387:4;14383:20;14379:1;14368:9;14364:17;14357:47;14421:108;14524:4;14515:6;14421:108;:::i;:::-;14413:116;;14163:373;;;;:::o;14542:210::-;14629:4;14667:2;14656:9;14652:18;14644:26;;14680:65;14742:1;14731:9;14727:17;14718:6;14680:65;:::i;:::-;14542:210;;;;:::o;14758:313::-;14871:4;14909:2;14898:9;14894:18;14886:26;;14958:9;14952:4;14948:20;14944:1;14933:9;14929:17;14922:47;14986:78;15059:4;15050:6;14986:78;:::i;:::-;14978:86;;14758:313;;;;:::o;15077:419::-;15243:4;15281:2;15270:9;15266:18;15258:26;;15330:9;15324:4;15320:20;15316:1;15305:9;15301:17;15294:47;15358:131;15484:4;15358:131;:::i;:::-;15350:139;;15077:419;;;:::o;15502:::-;15668:4;15706:2;15695:9;15691:18;15683:26;;15755:9;15749:4;15745:20;15741:1;15730:9;15726:17;15719:47;15783:131;15909:4;15783:131;:::i;:::-;15775:139;;15502:419;;;:::o;15927:::-;16093:4;16131:2;16120:9;16116:18;16108:26;;16180:9;16174:4;16170:20;16166:1;16155:9;16151:17;16144:47;16208:131;16334:4;16208:131;:::i;:::-;16200:139;;15927:419;;;:::o;16352:::-;16518:4;16556:2;16545:9;16541:18;16533:26;;16605:9;16599:4;16595:20;16591:1;16580:9;16576:17;16569:47;16633:131;16759:4;16633:131;:::i;:::-;16625:139;;16352:419;;;:::o;16777:::-;16943:4;16981:2;16970:9;16966:18;16958:26;;17030:9;17024:4;17020:20;17016:1;17005:9;17001:17;16994:47;17058:131;17184:4;17058:131;:::i;:::-;17050:139;;16777:419;;;:::o;17202:::-;17368:4;17406:2;17395:9;17391:18;17383:26;;17455:9;17449:4;17445:20;17441:1;17430:9;17426:17;17419:47;17483:131;17609:4;17483:131;:::i;:::-;17475:139;;17202:419;;;:::o;17627:222::-;17720:4;17758:2;17747:9;17743:18;17735:26;;17771:71;17839:1;17828:9;17824:17;17815:6;17771:71;:::i;:::-;17627:222;;;;:::o;17855:218::-;17946:4;17984:2;17973:9;17969:18;17961:26;;17997:69;18063:1;18052:9;18048:17;18039:6;17997:69;:::i;:::-;17855:218;;;;:::o;18079:129::-;18113:6;18140:20;;:::i;:::-;18130:30;;18169:33;18197:4;18189:6;18169:33;:::i;:::-;18079:129;;;:::o;18214:75::-;18247:6;18280:2;18274:9;18264:19;;18214:75;:::o;18295:307::-;18356:4;18446:18;18438:6;18435:30;18432:56;;;18468:18;;:::i;:::-;18432:56;18506:29;18528:6;18506:29;:::i;:::-;18498:37;;18590:4;18584;18580:15;18572:23;;18295:307;;;:::o;18608:308::-;18670:4;18760:18;18752:6;18749:30;18746:56;;;18782:18;;:::i;:::-;18746:56;18820:29;18842:6;18820:29;:::i;:::-;18812:37;;18904:4;18898;18894:15;18886:23;;18608:308;;;:::o;18922:132::-;18989:4;19012:3;19004:11;;19042:4;19037:3;19033:14;19025:22;;18922:132;;;:::o;19060:114::-;19127:6;19161:5;19155:12;19145:22;;19060:114;;;:::o;19180:98::-;19231:6;19265:5;19259:12;19249:22;;19180:98;;;:::o;19284:99::-;19336:6;19370:5;19364:12;19354:22;;19284:99;;;:::o;19389:113::-;19459:4;19491;19486:3;19482:14;19474:22;;19389:113;;;:::o;19508:184::-;19607:11;19641:6;19636:3;19629:19;19681:4;19676:3;19672:14;19657:29;;19508:184;;;;:::o;19698:168::-;19781:11;19815:6;19810:3;19803:19;19855:4;19850:3;19846:14;19831:29;;19698:168;;;;:::o;19872:147::-;19973:11;20010:3;19995:18;;19872:147;;;;:::o;20025:169::-;20109:11;20143:6;20138:3;20131:19;20183:4;20178:3;20174:14;20159:29;;20025:169;;;;:::o;20200:148::-;20302:11;20339:3;20324:18;;20200:148;;;;:::o;20354:305::-;20394:3;20413:20;20431:1;20413:20;:::i;:::-;20408:25;;20447:20;20465:1;20447:20;:::i;:::-;20442:25;;20601:1;20533:66;20529:74;20526:1;20523:81;20520:107;;;20607:18;;:::i;:::-;20520:107;20651:1;20648;20644:9;20637:16;;20354:305;;;;:::o;20665:185::-;20705:1;20722:20;20740:1;20722:20;:::i;:::-;20717:25;;20756:20;20774:1;20756:20;:::i;:::-;20751:25;;20795:1;20785:35;;20800:18;;:::i;:::-;20785:35;20842:1;20839;20835:9;20830:14;;20665:185;;;;:::o;20856:191::-;20896:4;20916:20;20934:1;20916:20;:::i;:::-;20911:25;;20950:20;20968:1;20950:20;:::i;:::-;20945:25;;20989:1;20986;20983:8;20980:34;;;20994:18;;:::i;:::-;20980:34;21039:1;21036;21032:9;21024:17;;20856:191;;;;:::o;21053:::-;21093:4;21113:20;21131:1;21113:20;:::i;:::-;21108:25;;21147:20;21165:1;21147:20;:::i;:::-;21142:25;;21186:1;21183;21180:8;21177:34;;;21191:18;;:::i;:::-;21177:34;21236:1;21233;21229:9;21221:17;;21053:191;;;;:::o;21250:96::-;21287:7;21316:24;21334:5;21316:24;:::i;:::-;21305:35;;21250:96;;;:::o;21352:90::-;21386:7;21429:5;21422:13;21415:21;21404:32;;21352:90;;;:::o;21448:149::-;21484:7;21524:66;21517:5;21513:78;21502:89;;21448:149;;;:::o;21603:126::-;21640:7;21680:42;21673:5;21669:54;21658:65;;21603:126;;;:::o;21735:77::-;21772:7;21801:5;21790:16;;21735:77;;;:::o;21818:93::-;21854:7;21894:10;21887:5;21883:22;21872:33;;21818:93;;;:::o;21917:154::-;22001:6;21996:3;21991;21978:30;22063:1;22054:6;22049:3;22045:16;22038:27;21917:154;;;:::o;22077:307::-;22145:1;22155:113;22169:6;22166:1;22163:13;22155:113;;;22254:1;22249:3;22245:11;22239:18;22235:1;22230:3;22226:11;22219:39;22191:2;22188:1;22184:10;22179:15;;22155:113;;;22286:6;22283:1;22280:13;22277:101;;;22366:1;22357:6;22352:3;22348:16;22341:27;22277:101;22126:258;22077:307;;;:::o;22390:320::-;22434:6;22471:1;22465:4;22461:12;22451:22;;22518:1;22512:4;22508:12;22539:18;22529:81;;22595:4;22587:6;22583:17;22573:27;;22529:81;22657:2;22649:6;22646:14;22626:18;22623:38;22620:84;;;22676:18;;:::i;:::-;22620:84;22441:269;22390:320;;;:::o;22716:281::-;22799:27;22821:4;22799:27;:::i;:::-;22791:6;22787:40;22929:6;22917:10;22914:22;22893:18;22881:10;22878:34;22875:62;22872:88;;;22940:18;;:::i;:::-;22872:88;22980:10;22976:2;22969:22;22759:238;22716:281;;:::o;23003:233::-;23042:3;23065:24;23083:5;23065:24;:::i;:::-;23056:33;;23111:66;23104:5;23101:77;23098:103;;;23181:18;;:::i;:::-;23098:103;23228:1;23221:5;23217:13;23210:20;;23003:233;;;:::o;23242:176::-;23274:1;23291:20;23309:1;23291:20;:::i;:::-;23286:25;;23325:20;23343:1;23325:20;:::i;:::-;23320:25;;23364:1;23354:35;;23369:18;;:::i;:::-;23354:35;23410:1;23407;23403:9;23398:14;;23242:176;;;;:::o;23424:180::-;23472:77;23469:1;23462:88;23569:4;23566:1;23559:15;23593:4;23590:1;23583:15;23610:180;23658:77;23655:1;23648:88;23755:4;23752:1;23745:15;23779:4;23776:1;23769:15;23796:180;23844:77;23841:1;23834:88;23941:4;23938:1;23931:15;23965:4;23962:1;23955:15;23982:180;24030:77;24027:1;24020:88;24127:4;24124:1;24117:15;24151:4;24148:1;24141:15;24168:180;24216:77;24213:1;24206:88;24313:4;24310:1;24303:15;24337:4;24334:1;24327:15;24354:117;24463:1;24460;24453:12;24477:117;24586:1;24583;24576:12;24600:117;24709:1;24706;24699:12;24723:117;24832:1;24829;24822:12;24846:102;24887:6;24938:2;24934:7;24929:2;24922:5;24918:14;24914:28;24904:38;;24846:102;;;:::o;24954:162::-;25094:14;25090:1;25082:6;25078:14;25071:38;24954:162;:::o;25122:225::-;25262:34;25258:1;25250:6;25246:14;25239:58;25331:8;25326:2;25318:6;25314:15;25307:33;25122:225;:::o;25353:174::-;25493:26;25489:1;25481:6;25477:14;25470:50;25353:174;:::o;25533:158::-;25673:10;25669:1;25661:6;25657:14;25650:34;25533:158;:::o;25697:180::-;25837:32;25833:1;25825:6;25821:14;25814:56;25697:180;:::o;25883:182::-;26023:34;26019:1;26011:6;26007:14;26000:58;25883:182;:::o;26071:114::-;;:::o;26191:122::-;26264:24;26282:5;26264:24;:::i;:::-;26257:5;26254:35;26244:63;;26303:1;26300;26293:12;26244:63;26191:122;:::o;26319:116::-;26389:21;26404:5;26389:21;:::i;:::-;26382:5;26379:32;26369:60;;26425:1;26422;26415:12;26369:60;26319:116;:::o;26441:120::-;26513:23;26530:5;26513:23;:::i;:::-;26506:5;26503:34;26493:62;;26551:1;26548;26541:12;26493:62;26441:120;:::o;26567:122::-;26640:24;26658:5;26640:24;:::i;:::-;26633:5;26630:35;26620:63;;26679:1;26676;26669:12;26620:63;26567:122;:::o
Swarm Source
ipfs://6d4eb08aa502a83c96ebdc4b5a9febf1e41041b8b6e5b5055145a7480d4dc857
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.