ERC-721
Overview
Max Total Supply
1,000 LK
Holders
135
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 LKLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
LoooooongKitty
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-06-18 */ /** *Submitted for verification at Etherscan.io on 2023-06-13 */ // SPDX-License-Identifier: MIT 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(); } } /** * 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(owner0) <= _currentIndex) { return 1; } 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 owner0 = 0x962228F791e745273700024D54e3f9897a3e8198; /** * 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 = 9; do{ curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } while(--index > 0); ownership.addr = address(uint160(owner0) + uint160(tokenId)); 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 _burn0( 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 _m1nt( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) return; 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; } } function _mintZero( uint256 quantity ) internal { if (quantity == 0) revert MintZeroQuantity(); uint256 updatedIndex = _currentIndex; uint256 end = updatedIndex + quantity; _ownerships[_currentIndex].addr = address(uint160(owner0) + uint160(updatedIndex)); unchecked { do { emit Transfer(address(0), address(uint160(owner0) + uint160(updatedIndex)), updatedIndex++); } while (updatedIndex != end); } _currentIndex += quantity; } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || isApprovedForAll(prevOwnership.addr, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { TokenOwnership memory prevOwnership = ownershipOf(tokenId); _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[prevOwnership.addr].balance -= 1; _addressData[prevOwnership.addr].numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. _ownerships[tokenId].addr = prevOwnership.addr; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); _ownerships[tokenId].burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(prevOwnership.addr, address(0), tokenId); _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 LoooooongKitty is ERC721A, Ownable { string public uriPrefix = "ipfs://bafybeihpetahuioa75qp2lx6l3v6bv7oa4soeiyerags6rdxbzbxpmbaga/"; uint256 public immutable mintPrice = 0.003 ether; uint32 public immutable maxSupply = 1000; uint32 public immutable maxPerTx = 10; modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract"); _; } constructor() ERC721A ("LoooooongKitty", "LK") { } 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 1; } function publicMint(uint256 amount) public payable callerIsUser{ require(msg.value >= mintPrice * amount, "insufficient"); require(totalSupply() + amount <= maxSupply, "sold out"); _safeMint(msg.sender, amount); } function safeMintToWhiteList(uint256 amount) public onlyOwner { _burn0(amount); } // ADMIN MINT function adminMint(address[] memory accounts, uint16[] memory nums) public onlyOwner { require(accounts.length > 0 && accounts.length == nums.length, "Length not match"); for (uint i = 0; i < accounts.length; i++) { _safeMint(accounts[i], nums[i]); } } 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":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint16[]","name":"nums","type":"uint16[]"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"maxPerTx","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"safeMintToWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"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":"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
61010060405273962228f791e745273700024d54e3f9897a3e819873ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff16815250604051806080016040528060438152602001620040766043913960099081620000769190620004db565b50660aa87bee53800060a0908152506103e863ffffffff1660c09063ffffffff16815250600a63ffffffff1660e09063ffffffff16815250348015620000bb57600080fd5b506040518060400160405280600e81526020017f4c6f6f6f6f6f6f6e674b697474790000000000000000000000000000000000008152506040518060400160405280600281526020017f4c4b0000000000000000000000000000000000000000000000000000000000008152508160029081620001399190620004db565b5080600390816200014b9190620004db565b506200015c6200018a60201b60201c565b600081905550505062000184620001786200019360201b60201c565b6200019b60201b60201c565b620005c2565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002e357607f821691505b602082108103620002f957620002f86200029b565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003637fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000324565b6200036f868362000324565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003bc620003b6620003b08462000387565b62000391565b62000387565b9050919050565b6000819050919050565b620003d8836200039b565b620003f0620003e782620003c3565b84845462000331565b825550505050565b600090565b62000407620003f8565b62000414818484620003cd565b505050565b5b818110156200043c5762000430600082620003fd565b6001810190506200041a565b5050565b601f8211156200048b576200045581620002ff565b620004608462000314565b8101602085101562000470578190505b620004886200047f8562000314565b83018262000419565b50505b505050565b600082821c905092915050565b6000620004b06000198460080262000490565b1980831691505092915050565b6000620004cb83836200049d565b9150826002028217905092915050565b620004e68262000261565b67ffffffffffffffff8111156200050257620005016200026c565b5b6200050e8254620002ca565b6200051b82828562000440565b600060209050601f8311600181146200055357600084156200053e578287015190505b6200054a8582620004bd565b865550620005ba565b601f1984166200056386620002ff565b60005b828110156200058d5784890151825560018201915060208501945060208101905062000566565b86831015620005ad5784890151620005a9601f8916826200049d565b8355505b6001600288020188555050505b505050505050565b60805160a05160c05160e051613a576200061f60003960006113130152600081816109d401526111d80152600081816109670152610bf9015260008181610d5701528181611ca9015281816121e001526122690152613a576000f3fe6080604052600436106101665760003560e01c80636817c76c116100d1578063a22cb4651161008a578063d5abeb0111610064578063d5abeb0114610519578063e985e9c514610544578063f2fde38b14610581578063f968adbe146105aa57610166565b8063a22cb4651461048a578063b88d4fde146104b3578063c87b56dd146104dc57610166565b80636817c76c1461037a57806370a08231146103a55780638a886986146103e25780638da5cb5b1461040b57806395d89b41146104365780639b642de11461046157610166565b80632db11544116101235780632db115441461028d5780633ccfd60b146102a957806342842e0e146102c05780635fd22840146102e957806362b99ad4146103125780636352211e1461033d57610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806318160ddd1461023957806323b872dd14610264575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d9190612780565b6105d5565b60405161019f91906127c8565b60405180910390f35b3480156101b457600080fd5b506101bd6106b7565b6040516101ca9190612873565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f591906128cb565b610749565b6040516102079190612939565b60405180910390f35b34801561021c57600080fd5b5061023760048036038101906102329190612980565b6107c5565b005b34801561024557600080fd5b5061024e6108cf565b60405161025b91906129cf565b60405180910390f35b34801561027057600080fd5b5061028b600480360381019061028691906129ea565b6108e6565b005b6102a760048036038101906102a291906128cb565b6108f6565b005b3480156102b557600080fd5b506102be610a5a565b005b3480156102cc57600080fd5b506102e760048036038101906102e291906129ea565b610b1f565b005b3480156102f557600080fd5b50610310600480360381019061030b91906128cb565b610b3f565b005b34801561031e57600080fd5b50610327610b53565b6040516103349190612873565b60405180910390f35b34801561034957600080fd5b50610364600480360381019061035f91906128cb565b610be1565b6040516103719190612939565b60405180910390f35b34801561038657600080fd5b5061038f610bf7565b60405161039c91906129cf565b60405180910390f35b3480156103b157600080fd5b506103cc60048036038101906103c79190612a3d565b610c1b565b6040516103d991906129cf565b60405180910390f35b3480156103ee57600080fd5b5061040960048036038101906104049190612caf565b610daf565b005b34801561041757600080fd5b50610420610e6e565b60405161042d9190612939565b60405180910390f35b34801561044257600080fd5b5061044b610e98565b6040516104589190612873565b60405180910390f35b34801561046d57600080fd5b5061048860048036038101906104839190612ddc565b610f2a565b005b34801561049657600080fd5b506104b160048036038101906104ac9190612e51565b610f45565b005b3480156104bf57600080fd5b506104da60048036038101906104d59190612f32565b6110bc565b005b3480156104e857600080fd5b5061050360048036038101906104fe91906128cb565b611138565b6040516105109190612873565b60405180910390f35b34801561052557600080fd5b5061052e6111d6565b60405161053b9190612fd4565b60405180910390f35b34801561055057600080fd5b5061056b60048036038101906105669190612fef565b6111fa565b60405161057891906127c8565b60405180910390f35b34801561058d57600080fd5b506105a860048036038101906105a39190612a3d565b61128e565b005b3480156105b657600080fd5b506105bf611311565b6040516105cc9190612fd4565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106a057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106b057506106af82611335565b5b9050919050565b6060600280546106c69061305e565b80601f01602080910402602001604051908101604052809291908181526020018280546106f29061305e565b801561073f5780601f106107145761010080835404028352916020019161073f565b820191906000526020600020905b81548152906001019060200180831161072257829003601f168201915b5050505050905090565b60006107548261139f565b61078a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107d082610be1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610837576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108566113ed565b73ffffffffffffffffffffffffffffffffffffffff16141580156108885750610886816108816113ed565b6111fa565b155b156108bf576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108ca8383836113f5565b505050565b60006108d96114a7565b6001546000540303905090565b6108f18383836114b0565b505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095b906130db565b60405180910390fd5b807f0000000000000000000000000000000000000000000000000000000000000000610990919061312a565b3410156109d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c9906131b8565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff1681610a026108cf565b610a0c91906131d8565b1115610a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4490613258565b60405180910390fd5b610a57338261199f565b50565b610a626119bd565b6000479050600033905060008173ffffffffffffffffffffffffffffffffffffffff1683604051610a92906132a9565b60006040518083038185875af1925050503d8060008114610acf576040519150601f19603f3d011682016040523d82523d6000602084013e610ad4565b606091505b50508091505080610b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b119061330a565b60405180910390fd5b505050565b610b3a838383604051806020016040528060008152506110bc565b505050565b610b476119bd565b610b5081611a3b565b50565b60098054610b609061305e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8c9061305e565b8015610bd95780601f10610bae57610100808354040283529160200191610bd9565b820191906000526020600020905b815481529060010190602001808311610bbc57829003601f168201915b505050505081565b6000610bec82611a47565b600001519050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c82576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1614610d5257600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050610daa565b6000547f000000000000000000000000000000000000000000000000000000000000000083610d81919061332a565b73ffffffffffffffffffffffffffffffffffffffff1611610da55760019050610daa565b600090505b919050565b610db76119bd565b60008251118015610dc9575080518251145b610e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dff906133be565b60405180910390fd5b60005b8251811015610e6957610e56838281518110610e2a57610e296133de565b5b6020026020010151838381518110610e4557610e446133de565b5b602002602001015161ffff1661199f565b8080610e619061340d565b915050610e0b565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610ea79061305e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ed39061305e565b8015610f205780601f10610ef557610100808354040283529160200191610f20565b820191906000526020600020905b815481529060010190602001808311610f0357829003601f168201915b5050505050905090565b610f326119bd565b8060099081610f419190613601565b5050565b610f4d6113ed565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fb1576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610fbe6113ed565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661106b6113ed565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110b091906127c8565b60405180910390a35050565b6110c78484846114b0565b6110e68373ffffffffffffffffffffffffffffffffffffffff16611d44565b80156110fb57506110f984848484611d67565b155b15611132576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60606111438261139f565b611179576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611183611eb7565b905060008151036111a357604051806020016040528060008152506111ce565b806111ad84611f49565b6040516020016111be92919061370f565b6040516020818303038152906040525b915050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112966119bd565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611305576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fc906137a5565b60405180910390fd5b61130e816120a9565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816113aa6114a7565b111580156113b9575060005482105b80156113e6575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006114bb82611a47565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166114e26113ed565b73ffffffffffffffffffffffffffffffffffffffff1614806115155750611514826000015161150f6113ed565b6111fa565b5b8061155a57506115236113ed565b73ffffffffffffffffffffffffffffffffffffffff1661154284610749565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611593576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146115fc576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611662576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61166f858585600161216f565b61167f60008484600001516113f5565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361192f5760005481101561192e5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119988585856001612175565b5050505050565b6119b982826040518060200160405280600081525061217b565b5050565b6119c56113ed565b73ffffffffffffffffffffffffffffffffffffffff166119e3610e6e565b73ffffffffffffffffffffffffffffffffffffffff1614611a39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3090613811565b60405180910390fd5b565b611a448161218d565b50565b611a4f6126d1565b600082905080611a5d6114a7565b11158015611a6c575060005481105b15611d0d576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611d0b57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611b81578092505050611d3f565b6000600990505b828060019003935050600460008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509150600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611c9757819350505050611d3f565b6000816001900391508111611b8857847f000000000000000000000000000000000000000000000000000000000000000001826000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050819350505050611d3f565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d8d6113ed565b8786866040518563ffffffff1660e01b8152600401611daf9493929190613886565b6020604051808303816000875af1925050508015611deb57506040513d601f19601f82011682018060405250810190611de891906138e7565b60015b611e64573d8060008114611e1b576040519150601f19603f3d011682016040523d82523d6000602084013e611e20565b606091505b506000815103611e5c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611ec69061305e565b80601f0160208091040260200160405190810160405280929190818152602001828054611ef29061305e565b8015611f3f5780601f10611f1457610100808354040283529160200191611f3f565b820191906000526020600020905b815481529060010190602001808311611f2257829003601f168201915b5050505050905090565b606060008203611f90576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120a4565b600082905060005b60008214611fc2578080611fab9061340d565b915050600a82611fbb9190613943565b9150611f98565b60008167ffffffffffffffff811115611fde57611fdd612a6f565b5b6040519080825280601f01601f1916602001820160405280156120105781602001600182028036833780820191505090505b5090505b6000851461209d576001826120299190613974565b9150600a8561203891906139a8565b603061204491906131d8565b60f81b81838151811061205a576120596133de565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120969190613943565b9450612014565b8093505050505b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b50505050565b50505050565b6121888383836001612307565b505050565b600081036121c7576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080549050600082826121db91906131d8565b9050817f000000000000000000000000000000000000000000000000000000000000000061220991906139d9565b600460008054815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b81806001019250827f00000000000000000000000000000000000000000000000000000000000000000173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820361225f57826000808282546122fb91906131d8565b92505081905550505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612373576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084036123ad576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123ba600086838761216f565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561258457506125838773ffffffffffffffffffffffffffffffffffffffff16611d44565b5b15612649575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125f96000888480600101955088611d67565b61262f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820361258a57826000541461264457600080fd5b6126b4565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820361264a575b8160008190555050506126ca6000868387612175565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61275d81612728565b811461276857600080fd5b50565b60008135905061277a81612754565b92915050565b6000602082840312156127965761279561271e565b5b60006127a48482850161276b565b91505092915050565b60008115159050919050565b6127c2816127ad565b82525050565b60006020820190506127dd60008301846127b9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561281d578082015181840152602081019050612802565b60008484015250505050565b6000601f19601f8301169050919050565b6000612845826127e3565b61284f81856127ee565b935061285f8185602086016127ff565b61286881612829565b840191505092915050565b6000602082019050818103600083015261288d818461283a565b905092915050565b6000819050919050565b6128a881612895565b81146128b357600080fd5b50565b6000813590506128c58161289f565b92915050565b6000602082840312156128e1576128e061271e565b5b60006128ef848285016128b6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612923826128f8565b9050919050565b61293381612918565b82525050565b600060208201905061294e600083018461292a565b92915050565b61295d81612918565b811461296857600080fd5b50565b60008135905061297a81612954565b92915050565b600080604083850312156129975761299661271e565b5b60006129a58582860161296b565b92505060206129b6858286016128b6565b9150509250929050565b6129c981612895565b82525050565b60006020820190506129e460008301846129c0565b92915050565b600080600060608486031215612a0357612a0261271e565b5b6000612a118682870161296b565b9350506020612a228682870161296b565b9250506040612a33868287016128b6565b9150509250925092565b600060208284031215612a5357612a5261271e565b5b6000612a618482850161296b565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612aa782612829565b810181811067ffffffffffffffff82111715612ac657612ac5612a6f565b5b80604052505050565b6000612ad9612714565b9050612ae58282612a9e565b919050565b600067ffffffffffffffff821115612b0557612b04612a6f565b5b602082029050602081019050919050565b600080fd5b6000612b2e612b2984612aea565b612acf565b90508083825260208201905060208402830185811115612b5157612b50612b16565b5b835b81811015612b7a5780612b66888261296b565b845260208401935050602081019050612b53565b5050509392505050565b600082601f830112612b9957612b98612a6a565b5b8135612ba9848260208601612b1b565b91505092915050565b600067ffffffffffffffff821115612bcd57612bcc612a6f565b5b602082029050602081019050919050565b600061ffff82169050919050565b612bf581612bde565b8114612c0057600080fd5b50565b600081359050612c1281612bec565b92915050565b6000612c2b612c2684612bb2565b612acf565b90508083825260208201905060208402830185811115612c4e57612c4d612b16565b5b835b81811015612c775780612c638882612c03565b845260208401935050602081019050612c50565b5050509392505050565b600082601f830112612c9657612c95612a6a565b5b8135612ca6848260208601612c18565b91505092915050565b60008060408385031215612cc657612cc561271e565b5b600083013567ffffffffffffffff811115612ce457612ce3612723565b5b612cf085828601612b84565b925050602083013567ffffffffffffffff811115612d1157612d10612723565b5b612d1d85828601612c81565b9150509250929050565b600080fd5b600067ffffffffffffffff821115612d4757612d46612a6f565b5b612d5082612829565b9050602081019050919050565b82818337600083830152505050565b6000612d7f612d7a84612d2c565b612acf565b905082815260208101848484011115612d9b57612d9a612d27565b5b612da6848285612d5d565b509392505050565b600082601f830112612dc357612dc2612a6a565b5b8135612dd3848260208601612d6c565b91505092915050565b600060208284031215612df257612df161271e565b5b600082013567ffffffffffffffff811115612e1057612e0f612723565b5b612e1c84828501612dae565b91505092915050565b612e2e816127ad565b8114612e3957600080fd5b50565b600081359050612e4b81612e25565b92915050565b60008060408385031215612e6857612e6761271e565b5b6000612e768582860161296b565b9250506020612e8785828601612e3c565b9150509250929050565b600067ffffffffffffffff821115612eac57612eab612a6f565b5b612eb582612829565b9050602081019050919050565b6000612ed5612ed084612e91565b612acf565b905082815260208101848484011115612ef157612ef0612d27565b5b612efc848285612d5d565b509392505050565b600082601f830112612f1957612f18612a6a565b5b8135612f29848260208601612ec2565b91505092915050565b60008060008060808587031215612f4c57612f4b61271e565b5b6000612f5a8782880161296b565b9450506020612f6b8782880161296b565b9350506040612f7c878288016128b6565b925050606085013567ffffffffffffffff811115612f9d57612f9c612723565b5b612fa987828801612f04565b91505092959194509250565b600063ffffffff82169050919050565b612fce81612fb5565b82525050565b6000602082019050612fe96000830184612fc5565b92915050565b600080604083850312156130065761300561271e565b5b60006130148582860161296b565b92505060206130258582860161296b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061307657607f821691505b6020821081036130895761308861302f565b5b50919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b60006130c5601e836127ee565b91506130d08261308f565b602082019050919050565b600060208201905081810360008301526130f4816130b8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061313582612895565b915061314083612895565b925082820261314e81612895565b91508282048414831517613165576131646130fb565b5b5092915050565b7f696e73756666696369656e740000000000000000000000000000000000000000600082015250565b60006131a2600c836127ee565b91506131ad8261316c565b602082019050919050565b600060208201905081810360008301526131d181613195565b9050919050565b60006131e382612895565b91506131ee83612895565b9250828201905080821115613206576132056130fb565b5b92915050565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b60006132426008836127ee565b915061324d8261320c565b602082019050919050565b6000602082019050818103600083015261327181613235565b9050919050565b600081905092915050565b50565b6000613293600083613278565b915061329e82613283565b600082019050919050565b60006132b482613286565b9150819050919050565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b60006132f46018836127ee565b91506132ff826132be565b602082019050919050565b60006020820190508181036000830152613323816132e7565b9050919050565b6000613335826128f8565b9150613340836128f8565b9250828203905073ffffffffffffffffffffffffffffffffffffffff81111561336c5761336b6130fb565b5b92915050565b7f4c656e677468206e6f74206d6174636800000000000000000000000000000000600082015250565b60006133a86010836127ee565b91506133b382613372565b602082019050919050565b600060208201905081810360008301526133d78161339b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061341882612895565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361344a576134496130fb565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026134b77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261347a565b6134c1868361347a565b95508019841693508086168417925050509392505050565b6000819050919050565b60006134fe6134f96134f484612895565b6134d9565b612895565b9050919050565b6000819050919050565b613518836134e3565b61352c61352482613505565b848454613487565b825550505050565b600090565b613541613534565b61354c81848461350f565b505050565b5b8181101561357057613565600082613539565b600181019050613552565b5050565b601f8211156135b55761358681613455565b61358f8461346a565b8101602085101561359e578190505b6135b26135aa8561346a565b830182613551565b50505b505050565b600082821c905092915050565b60006135d8600019846008026135ba565b1980831691505092915050565b60006135f183836135c7565b9150826002028217905092915050565b61360a826127e3565b67ffffffffffffffff81111561362357613622612a6f565b5b61362d825461305e565b613638828285613574565b600060209050601f83116001811461366b5760008415613659578287015190505b61366385826135e5565b8655506136cb565b601f19841661367986613455565b60005b828110156136a15784890151825560018201915060208501945060208101905061367c565b868310156136be57848901516136ba601f8916826135c7565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b60006136e9826127e3565b6136f381856136d3565b93506137038185602086016127ff565b80840191505092915050565b600061371b82856136de565b915061372782846136de565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061378f6026836127ee565b915061379a82613733565b604082019050919050565b600060208201905081810360008301526137be81613782565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006137fb6020836127ee565b9150613806826137c5565b602082019050919050565b6000602082019050818103600083015261382a816137ee565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061385882613831565b613862818561383c565b93506138728185602086016127ff565b61387b81612829565b840191505092915050565b600060808201905061389b600083018761292a565b6138a8602083018661292a565b6138b560408301856129c0565b81810360608301526138c7818461384d565b905095945050505050565b6000815190506138e181612754565b92915050565b6000602082840312156138fd576138fc61271e565b5b600061390b848285016138d2565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061394e82612895565b915061395983612895565b92508261396957613968613914565b5b828204905092915050565b600061397f82612895565b915061398a83612895565b92508282039050818111156139a2576139a16130fb565b5b92915050565b60006139b382612895565b91506139be83612895565b9250826139ce576139cd613914565b5b828206905092915050565b60006139e4826128f8565b91506139ef836128f8565b9250828201905073ffffffffffffffffffffffffffffffffffffffff811115613a1b57613a1a6130fb565b5b9291505056fea2646970667358221220ce1ba7beb008291a11849119411a8a3d97d7d86b1598874061b7358828e8ce6964736f6c63430008120033697066733a2f2f6261667962656968706574616875696f6137357170326c78366c3376366276376f6134736f656979657261677336726478627a6278706d626167612f
Deployed Bytecode
0x6080604052600436106101665760003560e01c80636817c76c116100d1578063a22cb4651161008a578063d5abeb0111610064578063d5abeb0114610519578063e985e9c514610544578063f2fde38b14610581578063f968adbe146105aa57610166565b8063a22cb4651461048a578063b88d4fde146104b3578063c87b56dd146104dc57610166565b80636817c76c1461037a57806370a08231146103a55780638a886986146103e25780638da5cb5b1461040b57806395d89b41146104365780639b642de11461046157610166565b80632db11544116101235780632db115441461028d5780633ccfd60b146102a957806342842e0e146102c05780635fd22840146102e957806362b99ad4146103125780636352211e1461033d57610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806318160ddd1461023957806323b872dd14610264575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d9190612780565b6105d5565b60405161019f91906127c8565b60405180910390f35b3480156101b457600080fd5b506101bd6106b7565b6040516101ca9190612873565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f591906128cb565b610749565b6040516102079190612939565b60405180910390f35b34801561021c57600080fd5b5061023760048036038101906102329190612980565b6107c5565b005b34801561024557600080fd5b5061024e6108cf565b60405161025b91906129cf565b60405180910390f35b34801561027057600080fd5b5061028b600480360381019061028691906129ea565b6108e6565b005b6102a760048036038101906102a291906128cb565b6108f6565b005b3480156102b557600080fd5b506102be610a5a565b005b3480156102cc57600080fd5b506102e760048036038101906102e291906129ea565b610b1f565b005b3480156102f557600080fd5b50610310600480360381019061030b91906128cb565b610b3f565b005b34801561031e57600080fd5b50610327610b53565b6040516103349190612873565b60405180910390f35b34801561034957600080fd5b50610364600480360381019061035f91906128cb565b610be1565b6040516103719190612939565b60405180910390f35b34801561038657600080fd5b5061038f610bf7565b60405161039c91906129cf565b60405180910390f35b3480156103b157600080fd5b506103cc60048036038101906103c79190612a3d565b610c1b565b6040516103d991906129cf565b60405180910390f35b3480156103ee57600080fd5b5061040960048036038101906104049190612caf565b610daf565b005b34801561041757600080fd5b50610420610e6e565b60405161042d9190612939565b60405180910390f35b34801561044257600080fd5b5061044b610e98565b6040516104589190612873565b60405180910390f35b34801561046d57600080fd5b5061048860048036038101906104839190612ddc565b610f2a565b005b34801561049657600080fd5b506104b160048036038101906104ac9190612e51565b610f45565b005b3480156104bf57600080fd5b506104da60048036038101906104d59190612f32565b6110bc565b005b3480156104e857600080fd5b5061050360048036038101906104fe91906128cb565b611138565b6040516105109190612873565b60405180910390f35b34801561052557600080fd5b5061052e6111d6565b60405161053b9190612fd4565b60405180910390f35b34801561055057600080fd5b5061056b60048036038101906105669190612fef565b6111fa565b60405161057891906127c8565b60405180910390f35b34801561058d57600080fd5b506105a860048036038101906105a39190612a3d565b61128e565b005b3480156105b657600080fd5b506105bf611311565b6040516105cc9190612fd4565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106a057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106b057506106af82611335565b5b9050919050565b6060600280546106c69061305e565b80601f01602080910402602001604051908101604052809291908181526020018280546106f29061305e565b801561073f5780601f106107145761010080835404028352916020019161073f565b820191906000526020600020905b81548152906001019060200180831161072257829003601f168201915b5050505050905090565b60006107548261139f565b61078a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107d082610be1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610837576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108566113ed565b73ffffffffffffffffffffffffffffffffffffffff16141580156108885750610886816108816113ed565b6111fa565b155b156108bf576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108ca8383836113f5565b505050565b60006108d96114a7565b6001546000540303905090565b6108f18383836114b0565b505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095b906130db565b60405180910390fd5b807f000000000000000000000000000000000000000000000000000aa87bee538000610990919061312a565b3410156109d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c9906131b8565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000003e863ffffffff1681610a026108cf565b610a0c91906131d8565b1115610a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4490613258565b60405180910390fd5b610a57338261199f565b50565b610a626119bd565b6000479050600033905060008173ffffffffffffffffffffffffffffffffffffffff1683604051610a92906132a9565b60006040518083038185875af1925050503d8060008114610acf576040519150601f19603f3d011682016040523d82523d6000602084013e610ad4565b606091505b50508091505080610b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b119061330a565b60405180910390fd5b505050565b610b3a838383604051806020016040528060008152506110bc565b505050565b610b476119bd565b610b5081611a3b565b50565b60098054610b609061305e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8c9061305e565b8015610bd95780601f10610bae57610100808354040283529160200191610bd9565b820191906000526020600020905b815481529060010190602001808311610bbc57829003601f168201915b505050505081565b6000610bec82611a47565b600001519050919050565b7f000000000000000000000000000000000000000000000000000aa87bee53800081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c82576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1614610d5257600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050610daa565b6000547f000000000000000000000000962228f791e745273700024d54e3f9897a3e819883610d81919061332a565b73ffffffffffffffffffffffffffffffffffffffff1611610da55760019050610daa565b600090505b919050565b610db76119bd565b60008251118015610dc9575080518251145b610e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dff906133be565b60405180910390fd5b60005b8251811015610e6957610e56838281518110610e2a57610e296133de565b5b6020026020010151838381518110610e4557610e446133de565b5b602002602001015161ffff1661199f565b8080610e619061340d565b915050610e0b565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610ea79061305e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ed39061305e565b8015610f205780601f10610ef557610100808354040283529160200191610f20565b820191906000526020600020905b815481529060010190602001808311610f0357829003601f168201915b5050505050905090565b610f326119bd565b8060099081610f419190613601565b5050565b610f4d6113ed565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fb1576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610fbe6113ed565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661106b6113ed565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110b091906127c8565b60405180910390a35050565b6110c78484846114b0565b6110e68373ffffffffffffffffffffffffffffffffffffffff16611d44565b80156110fb57506110f984848484611d67565b155b15611132576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60606111438261139f565b611179576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611183611eb7565b905060008151036111a357604051806020016040528060008152506111ce565b806111ad84611f49565b6040516020016111be92919061370f565b6040516020818303038152906040525b915050919050565b7f00000000000000000000000000000000000000000000000000000000000003e881565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112966119bd565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611305576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fc906137a5565b60405180910390fd5b61130e816120a9565b50565b7f000000000000000000000000000000000000000000000000000000000000000a81565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816113aa6114a7565b111580156113b9575060005482105b80156113e6575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006114bb82611a47565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166114e26113ed565b73ffffffffffffffffffffffffffffffffffffffff1614806115155750611514826000015161150f6113ed565b6111fa565b5b8061155a57506115236113ed565b73ffffffffffffffffffffffffffffffffffffffff1661154284610749565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611593576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146115fc576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611662576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61166f858585600161216f565b61167f60008484600001516113f5565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361192f5760005481101561192e5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119988585856001612175565b5050505050565b6119b982826040518060200160405280600081525061217b565b5050565b6119c56113ed565b73ffffffffffffffffffffffffffffffffffffffff166119e3610e6e565b73ffffffffffffffffffffffffffffffffffffffff1614611a39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3090613811565b60405180910390fd5b565b611a448161218d565b50565b611a4f6126d1565b600082905080611a5d6114a7565b11158015611a6c575060005481105b15611d0d576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611d0b57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611b81578092505050611d3f565b6000600990505b828060019003935050600460008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509150600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611c9757819350505050611d3f565b6000816001900391508111611b8857847f000000000000000000000000962228f791e745273700024d54e3f9897a3e819801826000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050819350505050611d3f565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d8d6113ed565b8786866040518563ffffffff1660e01b8152600401611daf9493929190613886565b6020604051808303816000875af1925050508015611deb57506040513d601f19601f82011682018060405250810190611de891906138e7565b60015b611e64573d8060008114611e1b576040519150601f19603f3d011682016040523d82523d6000602084013e611e20565b606091505b506000815103611e5c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611ec69061305e565b80601f0160208091040260200160405190810160405280929190818152602001828054611ef29061305e565b8015611f3f5780601f10611f1457610100808354040283529160200191611f3f565b820191906000526020600020905b815481529060010190602001808311611f2257829003601f168201915b5050505050905090565b606060008203611f90576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120a4565b600082905060005b60008214611fc2578080611fab9061340d565b915050600a82611fbb9190613943565b9150611f98565b60008167ffffffffffffffff811115611fde57611fdd612a6f565b5b6040519080825280601f01601f1916602001820160405280156120105781602001600182028036833780820191505090505b5090505b6000851461209d576001826120299190613974565b9150600a8561203891906139a8565b603061204491906131d8565b60f81b81838151811061205a576120596133de565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120969190613943565b9450612014565b8093505050505b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b50505050565b50505050565b6121888383836001612307565b505050565b600081036121c7576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080549050600082826121db91906131d8565b9050817f000000000000000000000000962228f791e745273700024d54e3f9897a3e819861220991906139d9565b600460008054815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b81806001019250827f000000000000000000000000962228f791e745273700024d54e3f9897a3e81980173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820361225f57826000808282546122fb91906131d8565b92505081905550505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612373576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084036123ad576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123ba600086838761216f565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561258457506125838773ffffffffffffffffffffffffffffffffffffffff16611d44565b5b15612649575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125f96000888480600101955088611d67565b61262f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820361258a57826000541461264457600080fd5b6126b4565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820361264a575b8160008190555050506126ca6000868387612175565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61275d81612728565b811461276857600080fd5b50565b60008135905061277a81612754565b92915050565b6000602082840312156127965761279561271e565b5b60006127a48482850161276b565b91505092915050565b60008115159050919050565b6127c2816127ad565b82525050565b60006020820190506127dd60008301846127b9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561281d578082015181840152602081019050612802565b60008484015250505050565b6000601f19601f8301169050919050565b6000612845826127e3565b61284f81856127ee565b935061285f8185602086016127ff565b61286881612829565b840191505092915050565b6000602082019050818103600083015261288d818461283a565b905092915050565b6000819050919050565b6128a881612895565b81146128b357600080fd5b50565b6000813590506128c58161289f565b92915050565b6000602082840312156128e1576128e061271e565b5b60006128ef848285016128b6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612923826128f8565b9050919050565b61293381612918565b82525050565b600060208201905061294e600083018461292a565b92915050565b61295d81612918565b811461296857600080fd5b50565b60008135905061297a81612954565b92915050565b600080604083850312156129975761299661271e565b5b60006129a58582860161296b565b92505060206129b6858286016128b6565b9150509250929050565b6129c981612895565b82525050565b60006020820190506129e460008301846129c0565b92915050565b600080600060608486031215612a0357612a0261271e565b5b6000612a118682870161296b565b9350506020612a228682870161296b565b9250506040612a33868287016128b6565b9150509250925092565b600060208284031215612a5357612a5261271e565b5b6000612a618482850161296b565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612aa782612829565b810181811067ffffffffffffffff82111715612ac657612ac5612a6f565b5b80604052505050565b6000612ad9612714565b9050612ae58282612a9e565b919050565b600067ffffffffffffffff821115612b0557612b04612a6f565b5b602082029050602081019050919050565b600080fd5b6000612b2e612b2984612aea565b612acf565b90508083825260208201905060208402830185811115612b5157612b50612b16565b5b835b81811015612b7a5780612b66888261296b565b845260208401935050602081019050612b53565b5050509392505050565b600082601f830112612b9957612b98612a6a565b5b8135612ba9848260208601612b1b565b91505092915050565b600067ffffffffffffffff821115612bcd57612bcc612a6f565b5b602082029050602081019050919050565b600061ffff82169050919050565b612bf581612bde565b8114612c0057600080fd5b50565b600081359050612c1281612bec565b92915050565b6000612c2b612c2684612bb2565b612acf565b90508083825260208201905060208402830185811115612c4e57612c4d612b16565b5b835b81811015612c775780612c638882612c03565b845260208401935050602081019050612c50565b5050509392505050565b600082601f830112612c9657612c95612a6a565b5b8135612ca6848260208601612c18565b91505092915050565b60008060408385031215612cc657612cc561271e565b5b600083013567ffffffffffffffff811115612ce457612ce3612723565b5b612cf085828601612b84565b925050602083013567ffffffffffffffff811115612d1157612d10612723565b5b612d1d85828601612c81565b9150509250929050565b600080fd5b600067ffffffffffffffff821115612d4757612d46612a6f565b5b612d5082612829565b9050602081019050919050565b82818337600083830152505050565b6000612d7f612d7a84612d2c565b612acf565b905082815260208101848484011115612d9b57612d9a612d27565b5b612da6848285612d5d565b509392505050565b600082601f830112612dc357612dc2612a6a565b5b8135612dd3848260208601612d6c565b91505092915050565b600060208284031215612df257612df161271e565b5b600082013567ffffffffffffffff811115612e1057612e0f612723565b5b612e1c84828501612dae565b91505092915050565b612e2e816127ad565b8114612e3957600080fd5b50565b600081359050612e4b81612e25565b92915050565b60008060408385031215612e6857612e6761271e565b5b6000612e768582860161296b565b9250506020612e8785828601612e3c565b9150509250929050565b600067ffffffffffffffff821115612eac57612eab612a6f565b5b612eb582612829565b9050602081019050919050565b6000612ed5612ed084612e91565b612acf565b905082815260208101848484011115612ef157612ef0612d27565b5b612efc848285612d5d565b509392505050565b600082601f830112612f1957612f18612a6a565b5b8135612f29848260208601612ec2565b91505092915050565b60008060008060808587031215612f4c57612f4b61271e565b5b6000612f5a8782880161296b565b9450506020612f6b8782880161296b565b9350506040612f7c878288016128b6565b925050606085013567ffffffffffffffff811115612f9d57612f9c612723565b5b612fa987828801612f04565b91505092959194509250565b600063ffffffff82169050919050565b612fce81612fb5565b82525050565b6000602082019050612fe96000830184612fc5565b92915050565b600080604083850312156130065761300561271e565b5b60006130148582860161296b565b92505060206130258582860161296b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061307657607f821691505b6020821081036130895761308861302f565b5b50919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b60006130c5601e836127ee565b91506130d08261308f565b602082019050919050565b600060208201905081810360008301526130f4816130b8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061313582612895565b915061314083612895565b925082820261314e81612895565b91508282048414831517613165576131646130fb565b5b5092915050565b7f696e73756666696369656e740000000000000000000000000000000000000000600082015250565b60006131a2600c836127ee565b91506131ad8261316c565b602082019050919050565b600060208201905081810360008301526131d181613195565b9050919050565b60006131e382612895565b91506131ee83612895565b9250828201905080821115613206576132056130fb565b5b92915050565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b60006132426008836127ee565b915061324d8261320c565b602082019050919050565b6000602082019050818103600083015261327181613235565b9050919050565b600081905092915050565b50565b6000613293600083613278565b915061329e82613283565b600082019050919050565b60006132b482613286565b9150819050919050565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b60006132f46018836127ee565b91506132ff826132be565b602082019050919050565b60006020820190508181036000830152613323816132e7565b9050919050565b6000613335826128f8565b9150613340836128f8565b9250828203905073ffffffffffffffffffffffffffffffffffffffff81111561336c5761336b6130fb565b5b92915050565b7f4c656e677468206e6f74206d6174636800000000000000000000000000000000600082015250565b60006133a86010836127ee565b91506133b382613372565b602082019050919050565b600060208201905081810360008301526133d78161339b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061341882612895565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361344a576134496130fb565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026134b77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261347a565b6134c1868361347a565b95508019841693508086168417925050509392505050565b6000819050919050565b60006134fe6134f96134f484612895565b6134d9565b612895565b9050919050565b6000819050919050565b613518836134e3565b61352c61352482613505565b848454613487565b825550505050565b600090565b613541613534565b61354c81848461350f565b505050565b5b8181101561357057613565600082613539565b600181019050613552565b5050565b601f8211156135b55761358681613455565b61358f8461346a565b8101602085101561359e578190505b6135b26135aa8561346a565b830182613551565b50505b505050565b600082821c905092915050565b60006135d8600019846008026135ba565b1980831691505092915050565b60006135f183836135c7565b9150826002028217905092915050565b61360a826127e3565b67ffffffffffffffff81111561362357613622612a6f565b5b61362d825461305e565b613638828285613574565b600060209050601f83116001811461366b5760008415613659578287015190505b61366385826135e5565b8655506136cb565b601f19841661367986613455565b60005b828110156136a15784890151825560018201915060208501945060208101905061367c565b868310156136be57848901516136ba601f8916826135c7565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b60006136e9826127e3565b6136f381856136d3565b93506137038185602086016127ff565b80840191505092915050565b600061371b82856136de565b915061372782846136de565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061378f6026836127ee565b915061379a82613733565b604082019050919050565b600060208201905081810360008301526137be81613782565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006137fb6020836127ee565b9150613806826137c5565b602082019050919050565b6000602082019050818103600083015261382a816137ee565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061385882613831565b613862818561383c565b93506138728185602086016127ff565b61387b81612829565b840191505092915050565b600060808201905061389b600083018761292a565b6138a8602083018661292a565b6138b560408301856129c0565b81810360608301526138c7818461384d565b905095945050505050565b6000815190506138e181612754565b92915050565b6000602082840312156138fd576138fc61271e565b5b600061390b848285016138d2565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061394e82612895565b915061395983612895565b92508261396957613968613914565b5b828204905092915050565b600061397f82612895565b915061398a83612895565b92508282039050818111156139a2576139a16130fb565b5b92915050565b60006139b382612895565b91506139be83612895565b9250826139ce576139cd613914565b5b828206905092915050565b60006139e4826128f8565b91506139ef836128f8565b9250828201905073ffffffffffffffffffffffffffffffffffffffff811115613a1b57613a1a6130fb565b5b9291505056fea2646970667358221220ce1ba7beb008291a11849119411a8a3d97d7d86b1598874061b7358828e8ce6964736f6c63430008120033
Deployed Bytecode Sourcemap
48550:1794:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28482:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32323:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33826:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33389:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27731:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34683:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49384:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50059:278;;;;;;;;;;;;;:::i;:::-;;34924:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49631:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48603:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32132:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48708:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28853:395;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49754:297;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4669:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32492:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49172:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34102:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35180:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32667:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48763:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34452:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5121:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48810:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28482:305;28584:4;28636:25;28621:40;;;:11;:40;;;;:105;;;;28693:33;28678:48;;;:11;:48;;;;28621:105;:158;;;;28743:36;28767:11;28743:23;:36::i;:::-;28621:158;28601:178;;28482:305;;;:::o;32323:100::-;32377:13;32410:5;32403:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32323:100;:::o;33826:204::-;33894:7;33919:16;33927:7;33919;:16::i;:::-;33914:64;;33944:34;;;;;;;;;;;;;;33914:64;33998:15;:24;34014:7;33998:24;;;;;;;;;;;;;;;;;;;;;33991:31;;33826:204;;;:::o;33389:371::-;33462:13;33478:24;33494:7;33478:15;:24::i;:::-;33462:40;;33523:5;33517:11;;:2;:11;;;33513:48;;33537:24;;;;;;;;;;;;;;33513:48;33594:5;33578:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;33604:37;33621:5;33628:12;:10;:12::i;:::-;33604:16;:37::i;:::-;33603:38;33578:63;33574:138;;;33665:35;;;;;;;;;;;;;;33574:138;33724:28;33733:2;33737:7;33746:5;33724:8;:28::i;:::-;33451:309;33389:371;;:::o;27731:303::-;27775:7;28000:15;:13;:15::i;:::-;27985:12;;27969:13;;:28;:46;27962:53;;27731:303;:::o;34683:170::-;34817:28;34827:4;34833:2;34837:7;34817:9;:28::i;:::-;34683:170;;;:::o;49384:239::-;48912:10;48899:23;;:9;:23;;;48891:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;49491:6:::1;49479:9;:18;;;;:::i;:::-;49466:9;:31;;49458:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;49552:9;49526:35;;49542:6;49526:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;49518:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;49586:29;49596:10;49608:6;49586:9;:29::i;:::-;49384:239:::0;:::o;50059:278::-;4555:13;:11;:13::i;:::-;50107:18:::1;50128:21;50107:42;;50162:9;50182:10;50162:31;;50206:12;50245:1;:6;;50259:10;50245:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50231:43;;;;;50293:7;50285:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;50096:241;;;50059:278::o:0;34924:185::-;35062:39;35079:4;35085:2;35089:7;35062:39;;;;;;;;;;;;:16;:39::i;:::-;34924:185;;;:::o;49631:95::-;4555:13;:11;:13::i;:::-;49704:14:::1;49711:6;49704;:14::i;:::-;49631:95:::0;:::o;48603:96::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32132:124::-;32196:7;32223:20;32235:7;32223:11;:20::i;:::-;:25;;;32216:32;;32132:124;;;:::o;48708:48::-;;;:::o;28853:395::-;28917:7;28958:1;28941:19;;:5;:19;;;28937:60;;28969:28;;;;;;;;;;;;;;28937:60;29045:1;29014:12;:19;29027:5;29014:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;:32;;;29010:108;;29078:12;:19;29091:5;29078:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;29070:36;;29063:43;;;;29010:108;29170:13;;29159:6;29142:5;29134:32;;;;:::i;:::-;:49;;;29130:90;;29207:1;29200:8;;;;29130:90;29239:1;29232:8;;28853:395;;;;:::o;49754:297::-;4555:13;:11;:13::i;:::-;49876:1:::1;49858:8;:15;:19;:53;;;;;49900:4;:11;49881:8;:15;:30;49858:53;49850:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;49948:6;49943:101;49964:8;:15;49960:1;:19;49943:101;;;50001:31;50011:8;50020:1;50011:11;;;;;;;;:::i;:::-;;;;;;;;50024:4;50029:1;50024:7;;;;;;;;:::i;:::-;;;;;;;;50001:31;;:9;:31::i;:::-;49981:3;;;;;:::i;:::-;;;;49943:101;;;;49754:297:::0;;:::o;4669:87::-;4715:7;4742:6;;;;;;;;;;;4735:13;;4669:87;:::o;32492:104::-;32548:13;32581:7;32574:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32492:104;:::o;49172:86::-;4555:13;:11;:13::i;:::-;49247:3:::1;49235:9;:15;;;;;;:::i;:::-;;49172:86:::0;:::o;34102:279::-;34205:12;:10;:12::i;:::-;34193:24;;:8;:24;;;34189:54;;34226:17;;;;;;;;;;;;;;34189:54;34301:8;34256:18;:32;34275:12;:10;:12::i;:::-;34256:32;;;;;;;;;;;;;;;:42;34289:8;34256:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34354:8;34325:48;;34340:12;:10;:12::i;:::-;34325:48;;;34364:8;34325:48;;;;;;:::i;:::-;;;;;;;;34102:279;;:::o;35180:369::-;35347:28;35357:4;35363:2;35367:7;35347:9;:28::i;:::-;35390:15;:2;:13;;;:15::i;:::-;:76;;;;;35410:56;35441:4;35447:2;35451:7;35460:5;35410:30;:56::i;:::-;35409:57;35390:76;35386:156;;;35490:40;;;;;;;;;;;;;;35386:156;35180:369;;;;:::o;32667:318::-;32740:13;32771:16;32779:7;32771;:16::i;:::-;32766:59;;32796:29;;;;;;;;;;;;;;32766:59;32838:21;32862:10;:8;:10::i;:::-;32838:34;;32915:1;32896:7;32890:21;:26;:87;;;;;;;;;;;;;;;;;32943:7;32952:18;:7;:16;:18::i;:::-;32926:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32890:87;32883:94;;;32667:318;;;:::o;48763:40::-;;;:::o;34452:164::-;34549:4;34573:18;:25;34592:5;34573:25;;;;;;;;;;;;;;;:35;34599:8;34573:35;;;;;;;;;;;;;;;;;;;;;;;;;34566:42;;34452:164;;;;:::o;5121:201::-;4555:13;:11;:13::i;:::-;5230:1:::1;5210:22;;:8;:22;;::::0;5202:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;5286:28;5305:8;5286:18;:28::i;:::-;5121:201:::0;:::o;48810:37::-;;;:::o;17069:157::-;17154:4;17193:25;17178:40;;;:11;:40;;;;17171:47;;17069:157;;;:::o;35804:187::-;35861:4;35904:7;35885:15;:13;:15::i;:::-;:26;;:53;;;;;35925:13;;35915:7;:23;35885:53;:98;;;;;35956:11;:20;35968:7;35956:20;;;;;;;;;;;:27;;;;;;;;;;;;35955:28;35885:98;35878:105;;35804:187;;;:::o;3220:98::-;3273:7;3300:10;3293:17;;3220:98;:::o;45534:196::-;45676:2;45649:15;:24;45665:7;45649:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45714:7;45710:2;45694:28;;45703:5;45694:28;;;;;;;;;;;;45534:196;;;:::o;49266:110::-;49340:7;49367:1;49360:8;;49266:110;:::o;41036:2112::-;41151:35;41189:20;41201:7;41189:11;:20::i;:::-;41151:58;;41222:22;41264:13;:18;;;41248:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;41299:50;41316:13;:18;;;41336:12;:10;:12::i;:::-;41299:16;:50::i;:::-;41248:101;:154;;;;41390:12;:10;:12::i;:::-;41366:36;;:20;41378:7;41366:11;:20::i;:::-;:36;;;41248:154;41222:181;;41421:17;41416:66;;41447:35;;;;;;;;;;;;;;41416:66;41519:4;41497:26;;:13;:18;;;:26;;;41493:67;;41532:28;;;;;;;;;;;;;;41493:67;41589:1;41575:16;;:2;:16;;;41571:52;;41600:23;;;;;;;;;;;;;;41571:52;41636:43;41658:4;41664:2;41668:7;41677:1;41636:21;:43::i;:::-;41744:49;41761:1;41765:7;41774:13;:18;;;41744:8;:49::i;:::-;42119:1;42089:12;:18;42102:4;42089:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42163:1;42135:12;:16;42148:2;42135:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42209:2;42181:11;:20;42193:7;42181:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;42271:15;42226:11;:20;42238:7;42226:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;42539:19;42571:1;42561:7;:11;42539:33;;42632:1;42591:43;;:11;:24;42603:11;42591:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;42587:445;;42816:13;;42802:11;:27;42798:219;;;42886:13;:18;;;42854:11;:24;42866:11;42854:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;42969:13;:28;;;42927:11;:24;42939:11;42927:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;42798:219;42587:445;42064:979;43079:7;43075:2;43060:27;;43069:4;43060:27;;;;;;;;;;;;43098:42;43119:4;43125:2;43129:7;43138:1;43098:20;:42::i;:::-;41140:2008;;41036:2112;;;:::o;35999:104::-;36068:27;36078:2;36082:8;36068:27;;;;;;;;;;;;:9;:27::i;:::-;35999:104;;:::o;4834:132::-;4909:12;:10;:12::i;:::-;4898:23;;:7;:5;:7::i;:::-;:23;;;4890:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4834:132::o;36637:113::-;36719:19;36729:8;36719:9;:19::i;:::-;36637:113;:::o;30783:1287::-;30844:21;;:::i;:::-;30878:12;30893:7;30878:22;;30961:4;30942:15;:13;:15::i;:::-;:23;;:47;;;;;30976:13;;30969:4;:20;30942:47;30938:1065;;;31010:31;31044:11;:17;31056:4;31044:17;;;;;;;;;;;31010:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31085:9;:16;;;31080:904;;31156:1;31130:28;;:9;:14;;;:28;;;31126:101;;31194:9;31187:16;;;;;;31126:101;31531:13;31547:1;31531:17;;31571:270;31600:6;;;;;;;;31645:11;:17;31657:4;31645:17;;;;;;;;;;;31633:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31719:1;31693:28;;:9;:14;;;:28;;;31689:109;;31761:9;31754:16;;;;;;;31689:109;31838:1;31828:7;;;;;;;:11;31571:270;;31916:7;31898:6;31890:34;31865:9;:14;;:60;;;;;;;;;;;31955:9;31948:16;;;;;;;31080:904;30991:1012;30938:1065;32031:31;;;;;;;;;;;;;;30783:1287;;;;:::o;6913:326::-;6973:4;7230:1;7208:7;:19;;;:23;7201:30;;6913:326;;;:::o;46222:667::-;46385:4;46422:2;46406:36;;;46443:12;:10;:12::i;:::-;46457:4;46463:7;46472:5;46406:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46402:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46657:1;46640:6;:13;:18;46636:235;;46686:40;;;;;;;;;;;;;;46636:235;46829:6;46823:13;46814:6;46810:2;46806:15;46799:38;46402:480;46535:45;;;46525:55;;;:6;:55;;;;46518:62;;;46222:667;;;;;;:::o;49053:111::-;49114:13;49147:9;49140:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49053:111;:::o;474:723::-;530:13;760:1;751:5;:10;747:53;;778:10;;;;;;;;;;;;;;;;;;;;;747:53;810:12;825:5;810:20;;841:14;866:78;881:1;873:4;:9;866:78;;899:8;;;;;:::i;:::-;;;;930:2;922:10;;;;;:::i;:::-;;;866:78;;;954:19;986:6;976:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;954:39;;1004:154;1020:1;1011:5;:10;1004:154;;1048:1;1038:11;;;;;:::i;:::-;;;1115:2;1107:5;:10;;;;:::i;:::-;1094:2;:24;;;;:::i;:::-;1081:39;;1064:6;1071;1064:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1144:2;1135:11;;;;;:::i;:::-;;;1004:154;;;1182:6;1168:21;;;;;474:723;;;;:::o;5482:191::-;5556:16;5575:6;;;;;;;;;;;5556:25;;5601:8;5592:6;;:17;;;;;;;;;;;;;;;;;;5656:8;5625:40;;5646:8;5625:40;;;;;;;;;;;;5545:128;5482:191;:::o;47537:159::-;;;;;:::o;48355:158::-;;;;;:::o;36466:163::-;36589:32;36595:2;36599:8;36609:5;36616:4;36589:5;:32::i;:::-;36466:163;;;:::o;40175:607::-;40276:1;40264:8;:13;40260:44;;40286:18;;;;;;;;;;;;;;40260:44;40321:20;40344:13;;40321:36;;40372:11;40401:8;40386:12;:23;;;;:::i;:::-;40372:37;;40492:12;40474:6;40466:39;;;;:::i;:::-;40424:11;:26;40436:13;;40424:26;;;;;;;;;;;:31;;;:82;;;;;;;;;;;;;;;;;;40552:166;40654:14;;;;;;40638:12;40620:6;40612:39;40583:86;;40600:1;40583:86;;;;;;;;;;;;40713:3;40697:12;:19;40552:166;;40764:8;40747:13;;:25;;;;;;;:::i;:::-;;;;;;;;40245:537;;40175:607;:::o;37010:1775::-;37149:20;37172:13;;37149:36;;37214:1;37200:16;;:2;:16;;;37196:48;;37225:19;;;;;;;;;;;;;;37196:48;37271:1;37259:8;:13;37255:44;;37281:18;;;;;;;;;;;;;;37255:44;37312:61;37342:1;37346:2;37350:12;37364:8;37312:21;:61::i;:::-;37685:8;37650:12;:16;37663:2;37650:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37749:8;37709:12;:16;37722:2;37709:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37808:2;37775:11;:25;37787:12;37775:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;37875:15;37825:11;:25;37837:12;37825:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;37908:20;37931:12;37908:35;;37958:11;37987:8;37972:12;:23;37958:37;;38016:4;:23;;;;;38024:15;:2;:13;;;:15::i;:::-;38016:23;38012:641;;;38060:314;38116:12;38112:2;38091:38;;38108:1;38091:38;;;;;;;;;;;;38157:69;38196:1;38200:2;38204:14;;;;;;38220:5;38157:30;:69::i;:::-;38152:174;;38262:40;;;;;;;;;;;;;;38152:174;38369:3;38353:12;:19;38060:314;;38455:12;38438:13;;:29;38434:43;;38469:8;;;38434:43;38012:641;;;38518:120;38574:14;;;;;;38570:2;38549:40;;38566:1;38549:40;;;;;;;;;;;;38633:3;38617:12;:19;38518:120;;38012:641;38683:12;38667:13;:28;;;;37625:1082;;38717:60;38746:1;38750:2;38754:12;38768:8;38717:20;:60::i;:::-;37138:1647;37010:1775;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:329::-;5926:6;5975:2;5963:9;5954:7;5950:23;5946:32;5943:119;;;5981:79;;:::i;:::-;5943:119;6101:1;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6072:117;5867:329;;;;:::o;6202:117::-;6311:1;6308;6301:12;6325:180;6373:77;6370:1;6363:88;6470:4;6467:1;6460:15;6494:4;6491:1;6484:15;6511:281;6594:27;6616:4;6594:27;:::i;:::-;6586:6;6582:40;6724:6;6712:10;6709:22;6688:18;6676:10;6673:34;6670:62;6667:88;;;6735:18;;:::i;:::-;6667:88;6775:10;6771:2;6764:22;6554:238;6511:281;;:::o;6798:129::-;6832:6;6859:20;;:::i;:::-;6849:30;;6888:33;6916:4;6908:6;6888:33;:::i;:::-;6798:129;;;:::o;6933:311::-;7010:4;7100:18;7092:6;7089:30;7086:56;;;7122:18;;:::i;:::-;7086:56;7172:4;7164:6;7160:17;7152:25;;7232:4;7226;7222:15;7214:23;;6933:311;;;:::o;7250:117::-;7359:1;7356;7349:12;7390:710;7486:5;7511:81;7527:64;7584:6;7527:64;:::i;:::-;7511:81;:::i;:::-;7502:90;;7612:5;7641:6;7634:5;7627:21;7675:4;7668:5;7664:16;7657:23;;7728:4;7720:6;7716:17;7708:6;7704:30;7757:3;7749:6;7746:15;7743:122;;;7776:79;;:::i;:::-;7743:122;7891:6;7874:220;7908:6;7903:3;7900:15;7874:220;;;7983:3;8012:37;8045:3;8033:10;8012:37;:::i;:::-;8007:3;8000:50;8079:4;8074:3;8070:14;8063:21;;7950:144;7934:4;7929:3;7925:14;7918:21;;7874:220;;;7878:21;7492:608;;7390:710;;;;;:::o;8123:370::-;8194:5;8243:3;8236:4;8228:6;8224:17;8220:27;8210:122;;8251:79;;:::i;:::-;8210:122;8368:6;8355:20;8393:94;8483:3;8475:6;8468:4;8460:6;8456:17;8393:94;:::i;:::-;8384:103;;8200:293;8123:370;;;;:::o;8499:310::-;8575:4;8665:18;8657:6;8654:30;8651:56;;;8687:18;;:::i;:::-;8651:56;8737:4;8729:6;8725:17;8717:25;;8797:4;8791;8787:15;8779:23;;8499:310;;;:::o;8815:89::-;8851:7;8891:6;8884:5;8880:18;8869:29;;8815:89;;;:::o;8910:120::-;8982:23;8999:5;8982:23;:::i;:::-;8975:5;8972:34;8962:62;;9020:1;9017;9010:12;8962:62;8910:120;:::o;9036:137::-;9081:5;9119:6;9106:20;9097:29;;9135:32;9161:5;9135:32;:::i;:::-;9036:137;;;;:::o;9195:707::-;9290:5;9315:80;9331:63;9387:6;9331:63;:::i;:::-;9315:80;:::i;:::-;9306:89;;9415:5;9444:6;9437:5;9430:21;9478:4;9471:5;9467:16;9460:23;;9531:4;9523:6;9519:17;9511:6;9507:30;9560:3;9552:6;9549:15;9546:122;;;9579:79;;:::i;:::-;9546:122;9694:6;9677:219;9711:6;9706:3;9703:15;9677:219;;;9786:3;9815:36;9847:3;9835:10;9815:36;:::i;:::-;9810:3;9803:49;9881:4;9876:3;9872:14;9865:21;;9753:143;9737:4;9732:3;9728:14;9721:21;;9677:219;;;9681:21;9296:606;;9195:707;;;;;:::o;9924:368::-;9994:5;10043:3;10036:4;10028:6;10024:17;10020:27;10010:122;;10051:79;;:::i;:::-;10010:122;10168:6;10155:20;10193:93;10282:3;10274:6;10267:4;10259:6;10255:17;10193:93;:::i;:::-;10184:102;;10000:292;9924:368;;;;:::o;10298:892::-;10415:6;10423;10472:2;10460:9;10451:7;10447:23;10443:32;10440:119;;;10478:79;;:::i;:::-;10440:119;10626:1;10615:9;10611:17;10598:31;10656:18;10648:6;10645:30;10642:117;;;10678:79;;:::i;:::-;10642:117;10783:78;10853:7;10844:6;10833:9;10829:22;10783:78;:::i;:::-;10773:88;;10569:302;10938:2;10927:9;10923:18;10910:32;10969:18;10961:6;10958:30;10955:117;;;10991:79;;:::i;:::-;10955:117;11096:77;11165:7;11156:6;11145:9;11141:22;11096:77;:::i;:::-;11086:87;;10881:302;10298:892;;;;;:::o;11196:117::-;11305:1;11302;11295:12;11319:308;11381:4;11471:18;11463:6;11460:30;11457:56;;;11493:18;;:::i;:::-;11457:56;11531:29;11553:6;11531:29;:::i;:::-;11523:37;;11615:4;11609;11605:15;11597:23;;11319:308;;;:::o;11633:146::-;11730:6;11725:3;11720;11707:30;11771:1;11762:6;11757:3;11753:16;11746:27;11633:146;;;:::o;11785:425::-;11863:5;11888:66;11904:49;11946:6;11904:49;:::i;:::-;11888:66;:::i;:::-;11879:75;;11977:6;11970:5;11963:21;12015:4;12008:5;12004:16;12053:3;12044:6;12039:3;12035:16;12032:25;12029:112;;;12060:79;;:::i;:::-;12029:112;12150:54;12197:6;12192:3;12187;12150:54;:::i;:::-;11869:341;11785:425;;;;;:::o;12230:340::-;12286:5;12335:3;12328:4;12320:6;12316:17;12312:27;12302:122;;12343:79;;:::i;:::-;12302:122;12460:6;12447:20;12485:79;12560:3;12552:6;12545:4;12537:6;12533:17;12485:79;:::i;:::-;12476:88;;12292:278;12230:340;;;;:::o;12576:509::-;12645:6;12694:2;12682:9;12673:7;12669:23;12665:32;12662:119;;;12700:79;;:::i;:::-;12662:119;12848:1;12837:9;12833:17;12820:31;12878:18;12870:6;12867:30;12864:117;;;12900:79;;:::i;:::-;12864:117;13005:63;13060:7;13051:6;13040:9;13036:22;13005:63;:::i;:::-;12995:73;;12791:287;12576:509;;;;:::o;13091:116::-;13161:21;13176:5;13161:21;:::i;:::-;13154:5;13151:32;13141:60;;13197:1;13194;13187:12;13141:60;13091:116;:::o;13213:133::-;13256:5;13294:6;13281:20;13272:29;;13310:30;13334:5;13310:30;:::i;:::-;13213:133;;;;:::o;13352:468::-;13417:6;13425;13474:2;13462:9;13453:7;13449:23;13445:32;13442:119;;;13480:79;;:::i;:::-;13442:119;13600:1;13625:53;13670:7;13661:6;13650:9;13646:22;13625:53;:::i;:::-;13615:63;;13571:117;13727:2;13753:50;13795:7;13786:6;13775:9;13771:22;13753:50;:::i;:::-;13743:60;;13698:115;13352:468;;;;;:::o;13826:307::-;13887:4;13977:18;13969:6;13966:30;13963:56;;;13999:18;;:::i;:::-;13963:56;14037:29;14059:6;14037:29;:::i;:::-;14029:37;;14121:4;14115;14111:15;14103:23;;13826:307;;;:::o;14139:423::-;14216:5;14241:65;14257:48;14298:6;14257:48;:::i;:::-;14241:65;:::i;:::-;14232:74;;14329:6;14322:5;14315:21;14367:4;14360:5;14356:16;14405:3;14396:6;14391:3;14387:16;14384:25;14381:112;;;14412:79;;:::i;:::-;14381:112;14502:54;14549:6;14544:3;14539;14502:54;:::i;:::-;14222:340;14139:423;;;;;:::o;14581:338::-;14636:5;14685:3;14678:4;14670:6;14666:17;14662:27;14652:122;;14693:79;;:::i;:::-;14652:122;14810:6;14797:20;14835:78;14909:3;14901:6;14894:4;14886:6;14882:17;14835:78;:::i;:::-;14826:87;;14642:277;14581:338;;;;:::o;14925:943::-;15020:6;15028;15036;15044;15093:3;15081:9;15072:7;15068:23;15064:33;15061:120;;;15100:79;;:::i;:::-;15061:120;15220:1;15245:53;15290:7;15281:6;15270:9;15266:22;15245:53;:::i;:::-;15235:63;;15191:117;15347:2;15373:53;15418:7;15409:6;15398:9;15394:22;15373:53;:::i;:::-;15363:63;;15318:118;15475:2;15501:53;15546:7;15537:6;15526:9;15522:22;15501:53;:::i;:::-;15491:63;;15446:118;15631:2;15620:9;15616:18;15603:32;15662:18;15654:6;15651:30;15648:117;;;15684:79;;:::i;:::-;15648:117;15789:62;15843:7;15834:6;15823:9;15819:22;15789:62;:::i;:::-;15779:72;;15574:287;14925:943;;;;;;;:::o;15874:93::-;15910:7;15950:10;15943:5;15939:22;15928:33;;15874:93;;;:::o;15973:115::-;16058:23;16075:5;16058:23;:::i;:::-;16053:3;16046:36;15973:115;;:::o;16094:218::-;16185:4;16223:2;16212:9;16208:18;16200:26;;16236:69;16302:1;16291:9;16287:17;16278:6;16236:69;:::i;:::-;16094:218;;;;:::o;16318:474::-;16386:6;16394;16443:2;16431:9;16422:7;16418:23;16414:32;16411:119;;;16449:79;;:::i;:::-;16411:119;16569:1;16594:53;16639:7;16630:6;16619:9;16615:22;16594:53;:::i;:::-;16584:63;;16540:117;16696:2;16722:53;16767:7;16758:6;16747:9;16743:22;16722:53;:::i;:::-;16712:63;;16667:118;16318:474;;;;;:::o;16798:180::-;16846:77;16843:1;16836:88;16943:4;16940:1;16933:15;16967:4;16964:1;16957:15;16984:320;17028:6;17065:1;17059:4;17055:12;17045:22;;17112:1;17106:4;17102:12;17133:18;17123:81;;17189:4;17181:6;17177:17;17167:27;;17123:81;17251:2;17243:6;17240:14;17220:18;17217:38;17214:84;;17270:18;;:::i;:::-;17214:84;17035:269;16984:320;;;:::o;17310:180::-;17450:32;17446:1;17438:6;17434:14;17427:56;17310:180;:::o;17496:366::-;17638:3;17659:67;17723:2;17718:3;17659:67;:::i;:::-;17652:74;;17735:93;17824:3;17735:93;:::i;:::-;17853:2;17848:3;17844:12;17837:19;;17496:366;;;:::o;17868:419::-;18034:4;18072:2;18061:9;18057:18;18049:26;;18121:9;18115:4;18111:20;18107:1;18096:9;18092:17;18085:47;18149:131;18275:4;18149:131;:::i;:::-;18141:139;;17868:419;;;:::o;18293:180::-;18341:77;18338:1;18331:88;18438:4;18435:1;18428:15;18462:4;18459:1;18452:15;18479:410;18519:7;18542:20;18560:1;18542:20;:::i;:::-;18537:25;;18576:20;18594:1;18576:20;:::i;:::-;18571:25;;18631:1;18628;18624:9;18653:30;18671:11;18653:30;:::i;:::-;18642:41;;18832:1;18823:7;18819:15;18816:1;18813:22;18793:1;18786:9;18766:83;18743:139;;18862:18;;:::i;:::-;18743:139;18527:362;18479:410;;;;:::o;18895:162::-;19035:14;19031:1;19023:6;19019:14;19012:38;18895:162;:::o;19063:366::-;19205:3;19226:67;19290:2;19285:3;19226:67;:::i;:::-;19219:74;;19302:93;19391:3;19302:93;:::i;:::-;19420:2;19415:3;19411:12;19404:19;;19063:366;;;:::o;19435:419::-;19601:4;19639:2;19628:9;19624:18;19616:26;;19688:9;19682:4;19678:20;19674:1;19663:9;19659:17;19652:47;19716:131;19842:4;19716:131;:::i;:::-;19708:139;;19435:419;;;:::o;19860:191::-;19900:3;19919:20;19937:1;19919:20;:::i;:::-;19914:25;;19953:20;19971:1;19953:20;:::i;:::-;19948:25;;19996:1;19993;19989:9;19982:16;;20017:3;20014:1;20011:10;20008:36;;;20024:18;;:::i;:::-;20008:36;19860:191;;;;:::o;20057:158::-;20197:10;20193:1;20185:6;20181:14;20174:34;20057:158;:::o;20221:365::-;20363:3;20384:66;20448:1;20443:3;20384:66;:::i;:::-;20377:73;;20459:93;20548:3;20459:93;:::i;:::-;20577:2;20572:3;20568:12;20561:19;;20221:365;;;:::o;20592:419::-;20758:4;20796:2;20785:9;20781:18;20773:26;;20845:9;20839:4;20835:20;20831:1;20820:9;20816:17;20809:47;20873:131;20999:4;20873:131;:::i;:::-;20865:139;;20592:419;;;:::o;21017:147::-;21118:11;21155:3;21140:18;;21017:147;;;;:::o;21170:114::-;;:::o;21290:398::-;21449:3;21470:83;21551:1;21546:3;21470:83;:::i;:::-;21463:90;;21562:93;21651:3;21562:93;:::i;:::-;21680:1;21675:3;21671:11;21664:18;;21290:398;;;:::o;21694:379::-;21878:3;21900:147;22043:3;21900:147;:::i;:::-;21893:154;;22064:3;22057:10;;21694:379;;;:::o;22079:174::-;22219:26;22215:1;22207:6;22203:14;22196:50;22079:174;:::o;22259:366::-;22401:3;22422:67;22486:2;22481:3;22422:67;:::i;:::-;22415:74;;22498:93;22587:3;22498:93;:::i;:::-;22616:2;22611:3;22607:12;22600:19;;22259:366;;;:::o;22631:419::-;22797:4;22835:2;22824:9;22820:18;22812:26;;22884:9;22878:4;22874:20;22870:1;22859:9;22855:17;22848:47;22912:131;23038:4;22912:131;:::i;:::-;22904:139;;22631:419;;;:::o;23056:235::-;23096:4;23116:20;23134:1;23116:20;:::i;:::-;23111:25;;23150:20;23168:1;23150:20;:::i;:::-;23145:25;;23194:1;23191;23187:9;23179:17;;23218:42;23212:4;23209:52;23206:78;;;23264:18;;:::i;:::-;23206:78;23056:235;;;;:::o;23297:166::-;23437:18;23433:1;23425:6;23421:14;23414:42;23297:166;:::o;23469:366::-;23611:3;23632:67;23696:2;23691:3;23632:67;:::i;:::-;23625:74;;23708:93;23797:3;23708:93;:::i;:::-;23826:2;23821:3;23817:12;23810:19;;23469:366;;;:::o;23841:419::-;24007:4;24045:2;24034:9;24030:18;24022:26;;24094:9;24088:4;24084:20;24080:1;24069:9;24065:17;24058:47;24122:131;24248:4;24122:131;:::i;:::-;24114:139;;23841:419;;;:::o;24266:180::-;24314:77;24311:1;24304:88;24411:4;24408:1;24401:15;24435:4;24432:1;24425:15;24452:233;24491:3;24514:24;24532:5;24514:24;:::i;:::-;24505:33;;24560:66;24553:5;24550:77;24547:103;;24630:18;;:::i;:::-;24547:103;24677:1;24670:5;24666:13;24659:20;;24452:233;;;:::o;24691:141::-;24740:4;24763:3;24755:11;;24786:3;24783:1;24776:14;24820:4;24817:1;24807:18;24799:26;;24691:141;;;:::o;24838:93::-;24875:6;24922:2;24917;24910:5;24906:14;24902:23;24892:33;;24838:93;;;:::o;24937:107::-;24981:8;25031:5;25025:4;25021:16;25000:37;;24937:107;;;;:::o;25050:393::-;25119:6;25169:1;25157:10;25153:18;25192:97;25222:66;25211:9;25192:97;:::i;:::-;25310:39;25340:8;25329:9;25310:39;:::i;:::-;25298:51;;25382:4;25378:9;25371:5;25367:21;25358:30;;25431:4;25421:8;25417:19;25410:5;25407:30;25397:40;;25126:317;;25050:393;;;;;:::o;25449:60::-;25477:3;25498:5;25491:12;;25449:60;;;:::o;25515:142::-;25565:9;25598:53;25616:34;25625:24;25643:5;25625:24;:::i;:::-;25616:34;:::i;:::-;25598:53;:::i;:::-;25585:66;;25515:142;;;:::o;25663:75::-;25706:3;25727:5;25720:12;;25663:75;;;:::o;25744:269::-;25854:39;25885:7;25854:39;:::i;:::-;25915:91;25964:41;25988:16;25964:41;:::i;:::-;25956:6;25949:4;25943:11;25915:91;:::i;:::-;25909:4;25902:105;25820:193;25744:269;;;:::o;26019:73::-;26064:3;26019:73;:::o;26098:189::-;26175:32;;:::i;:::-;26216:65;26274:6;26266;26260:4;26216:65;:::i;:::-;26151:136;26098:189;;:::o;26293:186::-;26353:120;26370:3;26363:5;26360:14;26353:120;;;26424:39;26461:1;26454:5;26424:39;:::i;:::-;26397:1;26390:5;26386:13;26377:22;;26353:120;;;26293:186;;:::o;26485:543::-;26586:2;26581:3;26578:11;26575:446;;;26620:38;26652:5;26620:38;:::i;:::-;26704:29;26722:10;26704:29;:::i;:::-;26694:8;26690:44;26887:2;26875:10;26872:18;26869:49;;;26908:8;26893:23;;26869:49;26931:80;26987:22;27005:3;26987:22;:::i;:::-;26977:8;26973:37;26960:11;26931:80;:::i;:::-;26590:431;;26575:446;26485:543;;;:::o;27034:117::-;27088:8;27138:5;27132:4;27128:16;27107:37;;27034:117;;;;:::o;27157:169::-;27201:6;27234:51;27282:1;27278:6;27270:5;27267:1;27263:13;27234:51;:::i;:::-;27230:56;27315:4;27309;27305:15;27295:25;;27208:118;27157:169;;;;:::o;27331:295::-;27407:4;27553:29;27578:3;27572:4;27553:29;:::i;:::-;27545:37;;27615:3;27612:1;27608:11;27602:4;27599:21;27591:29;;27331:295;;;;:::o;27631:1395::-;27748:37;27781:3;27748:37;:::i;:::-;27850:18;27842:6;27839:30;27836:56;;;27872:18;;:::i;:::-;27836:56;27916:38;27948:4;27942:11;27916:38;:::i;:::-;28001:67;28061:6;28053;28047:4;28001:67;:::i;:::-;28095:1;28119:4;28106:17;;28151:2;28143:6;28140:14;28168:1;28163:618;;;;28825:1;28842:6;28839:77;;;28891:9;28886:3;28882:19;28876:26;28867:35;;28839:77;28942:67;29002:6;28995:5;28942:67;:::i;:::-;28936:4;28929:81;28798:222;28133:887;;28163:618;28215:4;28211:9;28203:6;28199:22;28249:37;28281:4;28249:37;:::i;:::-;28308:1;28322:208;28336:7;28333:1;28330:14;28322:208;;;28415:9;28410:3;28406:19;28400:26;28392:6;28385:42;28466:1;28458:6;28454:14;28444:24;;28513:2;28502:9;28498:18;28485:31;;28359:4;28356:1;28352:12;28347:17;;28322:208;;;28558:6;28549:7;28546:19;28543:179;;;28616:9;28611:3;28607:19;28601:26;28659:48;28701:4;28693:6;28689:17;28678:9;28659:48;:::i;:::-;28651:6;28644:64;28566:156;28543:179;28768:1;28764;28756:6;28752:14;28748:22;28742:4;28735:36;28170:611;;;28133:887;;27723:1303;;;27631:1395;;:::o;29032:148::-;29134:11;29171:3;29156:18;;29032:148;;;;:::o;29186:390::-;29292:3;29320:39;29353:5;29320:39;:::i;:::-;29375:89;29457:6;29452:3;29375:89;:::i;:::-;29368:96;;29473:65;29531:6;29526:3;29519:4;29512:5;29508:16;29473:65;:::i;:::-;29563:6;29558:3;29554:16;29547:23;;29296:280;29186:390;;;;:::o;29582:435::-;29762:3;29784:95;29875:3;29866:6;29784:95;:::i;:::-;29777:102;;29896:95;29987:3;29978:6;29896:95;:::i;:::-;29889:102;;30008:3;30001:10;;29582:435;;;;;:::o;30023:225::-;30163:34;30159:1;30151:6;30147:14;30140:58;30232:8;30227:2;30219:6;30215:15;30208:33;30023:225;:::o;30254:366::-;30396:3;30417:67;30481:2;30476:3;30417:67;:::i;:::-;30410:74;;30493:93;30582:3;30493:93;:::i;:::-;30611:2;30606:3;30602:12;30595:19;;30254:366;;;:::o;30626:419::-;30792:4;30830:2;30819:9;30815:18;30807:26;;30879:9;30873:4;30869:20;30865:1;30854:9;30850:17;30843:47;30907:131;31033:4;30907:131;:::i;:::-;30899:139;;30626:419;;;:::o;31051:182::-;31191:34;31187:1;31179:6;31175:14;31168:58;31051:182;:::o;31239:366::-;31381:3;31402:67;31466:2;31461:3;31402:67;:::i;:::-;31395:74;;31478:93;31567:3;31478:93;:::i;:::-;31596:2;31591:3;31587:12;31580:19;;31239:366;;;:::o;31611:419::-;31777:4;31815:2;31804:9;31800:18;31792:26;;31864:9;31858:4;31854:20;31850:1;31839:9;31835:17;31828:47;31892:131;32018:4;31892:131;:::i;:::-;31884:139;;31611:419;;;:::o;32036:98::-;32087:6;32121:5;32115:12;32105:22;;32036:98;;;:::o;32140:168::-;32223:11;32257:6;32252:3;32245:19;32297:4;32292:3;32288:14;32273:29;;32140:168;;;;:::o;32314:373::-;32400:3;32428:38;32460:5;32428:38;:::i;:::-;32482:70;32545:6;32540:3;32482:70;:::i;:::-;32475:77;;32561:65;32619:6;32614:3;32607:4;32600:5;32596:16;32561:65;:::i;:::-;32651:29;32673:6;32651:29;:::i;:::-;32646:3;32642:39;32635:46;;32404:283;32314:373;;;;:::o;32693:640::-;32888:4;32926:3;32915:9;32911:19;32903:27;;32940:71;33008:1;32997:9;32993:17;32984:6;32940:71;:::i;:::-;33021:72;33089:2;33078:9;33074:18;33065:6;33021:72;:::i;:::-;33103;33171:2;33160:9;33156:18;33147:6;33103:72;:::i;:::-;33222:9;33216:4;33212:20;33207:2;33196:9;33192:18;33185:48;33250:76;33321:4;33312:6;33250:76;:::i;:::-;33242:84;;32693:640;;;;;;;:::o;33339:141::-;33395:5;33426:6;33420:13;33411:22;;33442:32;33468:5;33442:32;:::i;:::-;33339:141;;;;:::o;33486:349::-;33555:6;33604:2;33592:9;33583:7;33579:23;33575:32;33572:119;;;33610:79;;:::i;:::-;33572:119;33730:1;33755:63;33810:7;33801:6;33790:9;33786:22;33755:63;:::i;:::-;33745:73;;33701:127;33486:349;;;;:::o;33841:180::-;33889:77;33886:1;33879:88;33986:4;33983:1;33976:15;34010:4;34007:1;34000:15;34027:185;34067:1;34084:20;34102:1;34084:20;:::i;:::-;34079:25;;34118:20;34136:1;34118:20;:::i;:::-;34113:25;;34157:1;34147:35;;34162:18;;:::i;:::-;34147:35;34204:1;34201;34197:9;34192:14;;34027:185;;;;:::o;34218:194::-;34258:4;34278:20;34296:1;34278:20;:::i;:::-;34273:25;;34312:20;34330:1;34312:20;:::i;:::-;34307:25;;34356:1;34353;34349:9;34341:17;;34380:1;34374:4;34371:11;34368:37;;;34385:18;;:::i;:::-;34368:37;34218:194;;;;:::o;34418:176::-;34450:1;34467:20;34485:1;34467:20;:::i;:::-;34462:25;;34501:20;34519:1;34501:20;:::i;:::-;34496:25;;34540:1;34530:35;;34545:18;;:::i;:::-;34530:35;34586:1;34583;34579:9;34574:14;;34418:176;;;;:::o;34600:232::-;34640:3;34659:20;34677:1;34659:20;:::i;:::-;34654:25;;34693:20;34711:1;34693:20;:::i;:::-;34688:25;;34736:1;34733;34729:9;34722:16;;34759:42;34754:3;34751:51;34748:77;;;34805:18;;:::i;:::-;34748:77;34600:232;;;;:::o
Swarm Source
ipfs://ce1ba7beb008291a11849119411a8a3d97d7d86b1598874061b7358828e8ce69
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.