ERC-721
Overview
Max Total Supply
408 CN
Holders
91
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
5 CNLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
thechinanfts
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-02 */ // SPDX-License-Identifier: MIT // File @openzeppelin/contracts/utils/introspection/[email protected] // 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/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] // 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/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // 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 erc721a/contracts/[email protected] // Creator: Chiru Labs pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); 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 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(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { 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) { 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) { 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 { _addressData[owner].aux = aux; } /** * 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. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { 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 virtual 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); } /** * @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); } /** * @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); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // 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; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.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; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev This is equivalent to _burn(tokenId, false) */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // 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 storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.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; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, 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 @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/interfaces/[email protected] // OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol) pragma solidity ^0.8.0; // File @openzeppelin/contracts/interfaces/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be payed in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File @openzeppelin/contracts/token/common/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `tokenId` must be already minted. * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File @openzeppelin/contracts/utils/cryptography/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } /****************************************************************************** Test /******************************************************************************/ pragma solidity ^0.8.7; error SaleInactive(); error SoldOut(); error InvalidPrice(); error WithdrawFailed(); error InvalidQuantity(); error InvalidProof(); contract thechinanfts is ERC721A, Ownable, ERC2981 { uint256 public price = 0 ether; uint256 public presalePrice = 0 ether; uint256 public maxPerWallet = 5; uint256 public maxPerTransaction = 5; uint256 public presaleMaxPerWallet = 5; uint256 public presaleMaxPerTransaction = 5; uint256 public immutable presaleSupply = 10000; uint256 public immutable supply = 10000; enum SaleState { CLOSED, OPEN, PRESALE } SaleState public saleState = SaleState.CLOSED; string public _baseTokenURI; mapping(address => uint256) public addressMintBalance; address[] public withdrawAddresses = [0x874CB83386f05edfFD7fBf70F5b0548502fab7a3, 0xC01EbCD376F56cC6c1F440D94179893Ca7B132e0]; uint256[] public withdrawPercentages = [60, 40]; bytes32 public merkleRoot = 0x8dff350c6626702c6030f839f183fe89aab9be8954c0060c38dc70e1c14aeb13; constructor( string memory _name, string memory _symbol, string memory _baseUri, uint96 _royaltyAmount ) ERC721A(_name, _symbol) { _baseTokenURI = _baseUri; _setDefaultRoyalty(owner(), _royaltyAmount); } function mint(uint256 qty) external payable { if (saleState != SaleState.OPEN) revert SaleInactive(); if (_currentIndex + (qty - 1) > supply) revert SoldOut(); if (msg.value != price * qty) revert InvalidPrice(); if (addressMintBalance[msg.sender] + qty > maxPerWallet) revert InvalidQuantity(); if (qty > maxPerTransaction) revert InvalidQuantity(); _safeMint(msg.sender, qty); addressMintBalance[msg.sender] += qty; } function presale(uint256 qty, bytes32[] calldata merkleProof) external payable { if (saleState != SaleState.PRESALE) revert SaleInactive(); if (_currentIndex + (qty - 1) > presaleSupply) revert SoldOut(); if (msg.value != presalePrice * qty) revert InvalidPrice(); if (!MerkleProof.verify(merkleProof, merkleRoot, keccak256(abi.encodePacked(msg.sender)))) { revert InvalidProof(); } if (addressMintBalance[msg.sender] + qty > presaleMaxPerWallet) revert InvalidQuantity(); if (qty > presaleMaxPerTransaction) revert InvalidQuantity(); _safeMint(msg.sender, qty); addressMintBalance[msg.sender] += qty; } function _startTokenId() internal view virtual override returns (uint256) { return 1; } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseURI(string memory baseURI) external onlyOwner { _baseTokenURI = baseURI; } function setPrice(uint256 newPrice) external onlyOwner { price = newPrice; } function setPresalePrice(uint256 newPrice) external onlyOwner { presalePrice = newPrice; } function setSaleState(uint8 _state) external onlyOwner { saleState = SaleState(_state); } function freeMint(uint256 qty, address recipient) external onlyOwner { if (_currentIndex + (qty - 1) > supply) revert SoldOut(); _safeMint(recipient, qty); } function setPerWalletMax(uint256 _val) external onlyOwner { maxPerWallet = _val; } function setPerTransactionMax(uint256 _val) external onlyOwner { maxPerTransaction = _val; } function setPresalePerWalletMax(uint256 _val) external onlyOwner { presaleMaxPerWallet = _val; } function setPresalePerTransactionMax(uint256 _val) external onlyOwner { presaleMaxPerTransaction = _val; } function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner { merkleRoot = _merkleRoot; } function _withdraw(address _address, uint256 _amount) private { (bool success, ) = _address.call{value: _amount}(""); if (!success) revert WithdrawFailed(); } function withdraw() external onlyOwner { uint256 balance = address(this).balance; for (uint256 i; i < withdrawAddresses.length; i++) { _withdraw(withdrawAddresses[i], (balance * withdrawPercentages[i]) / 100); } } function setRoyaltyInfo(address receiver, uint96 feeBasisPoints) external onlyOwner { _setDefaultRoyalty(receiver, feeBasisPoints); } function supportsInterface(bytes4 interfaceId) public view override(ERC721A, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_baseUri","type":"string"},{"internalType":"uint96","name":"_royaltyAmount","type":"uint96"}],"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":"InvalidPrice","type":"error"},{"inputs":[],"name":"InvalidProof","type":"error"},{"inputs":[],"name":"InvalidQuantity","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"SaleInactive","type":"error"},{"inputs":[],"name":"SoldOut","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"},{"inputs":[],"name":"WithdrawFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"presale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleMaxPerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleMaxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":[],"name":"saleState","outputs":[{"internalType":"enum thechinanfts.SaleState","name":"","type":"uint8"}],"stateMutability":"view","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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_val","type":"uint256"}],"name":"setPerTransactionMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_val","type":"uint256"}],"name":"setPerWalletMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_val","type":"uint256"}],"name":"setPresalePerTransactionMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_val","type":"uint256"}],"name":"setPresalePerWalletMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPresalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeBasisPoints","type":"uint96"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_state","type":"uint8"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"withdrawAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"withdrawPercentages","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c06040526000600b556000600c556005600d556005600e556005600f55600560105561271060809081525061271060a0908152506000601160006101000a81548160ff021916908360028111156200005d576200005c62000688565b5b0217905550604051806040016040528073874cb83386f05edffd7fbf70f5b0548502fab7a373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173c01ebcd376f56cc6c1f440d94179893ca7b132e073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250601490600262000109929190620004f2565b506040518060400160405280603c60ff168152602001602860ff1681525060159060026200013992919062000581565b507f8dff350c6626702c6030f839f183fe89aab9be8954c0060c38dc70e1c14aeb1360001b6016553480156200016e57600080fd5b50604051620055983803806200559883398181016040528101906200019491906200089d565b83838160029080519060200190620001ae929190620005d8565b508060039080519060200190620001c7929190620005d8565b50620001d86200024460201b60201c565b600081905550505062000200620001f46200024d60201b60201c565b6200025560201b60201c565b816012908051906020019062000218929190620005d8565b506200023a6200022d6200031b60201b60201c565b826200034560201b60201c565b5050505062000aeb565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b62000355620004e860201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115620003b6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003ad90620009f3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000428576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200041f9062000a65565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000612710905090565b8280548282559060005260206000209081019282156200056e579160200282015b828111156200056d5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000513565b5b5090506200057d919062000669565b5090565b828054828255906000526020600020908101928215620005c5579160200282015b82811115620005c4578251829060ff16905591602001919060010190620005a2565b5b509050620005d4919062000669565b5090565b828054620005e69062000ab6565b90600052602060002090601f0160209004810192826200060a576000855562000656565b82601f106200062557805160ff191683800117855562000656565b8280016001018555821562000656579182015b828111156200065557825182559160200191906001019062000638565b5b50905062000665919062000669565b5090565b5b80821115620006845760008160009055506001016200066a565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200072082620006d5565b810181811067ffffffffffffffff82111715620007425762000741620006e6565b5b80604052505050565b600062000757620006b7565b905062000765828262000715565b919050565b600067ffffffffffffffff821115620007885762000787620006e6565b5b6200079382620006d5565b9050602081019050919050565b60005b83811015620007c0578082015181840152602081019050620007a3565b83811115620007d0576000848401525b50505050565b6000620007ed620007e7846200076a565b6200074b565b9050828152602081018484840111156200080c576200080b620006d0565b5b62000819848285620007a0565b509392505050565b600082601f830112620008395762000838620006cb565b5b81516200084b848260208601620007d6565b91505092915050565b60006bffffffffffffffffffffffff82169050919050565b620008778162000854565b81146200088357600080fd5b50565b60008151905062000897816200086c565b92915050565b60008060008060808587031215620008ba57620008b9620006c1565b5b600085015167ffffffffffffffff811115620008db57620008da620006c6565b5b620008e98782880162000821565b945050602085015167ffffffffffffffff8111156200090d576200090c620006c6565b5b6200091b8782880162000821565b935050604085015167ffffffffffffffff8111156200093f576200093e620006c6565b5b6200094d8782880162000821565b9250506060620009608782880162000886565b91505092959194509250565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000620009db602a836200096c565b9150620009e8826200097d565b604082019050919050565b6000602082019050818103600083015262000a0e81620009cc565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000a4d6019836200096c565b915062000a5a8262000a15565b602082019050919050565b6000602082019050818103600083015262000a808162000a3e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000acf57607f821691505b60208210810362000ae55762000ae462000a87565b5b50919050565b60805160a051614a7262000b2660003960008181610b2c0152818161109f01526118d1015260008181611c250152611db70152614a726000f3fe60806040526004361061027c5760003560e01c806355f804b31161014f578063a0712d68116100c1578063c87b56dd1161007a578063c87b56dd14610954578063cfc86f7b14610991578063d86bed9b146109bc578063e341f5ca146109f9578063e985e9c514610a22578063f2fde38b14610a5f5761027c565b8063a0712d6814610876578063a22cb46514610892578063b3a196e9146108bb578063b88d4fde146108e6578063bd3b14d31461090f578063c13bd95c146109385761027c565b8063715018a611610113578063715018a61461078c5780637cb64759146107a35780638da5cb5b146107cc57806391b7f5ed146107f757806395d89b4114610820578063a035b1fe1461084b5761027c565b806355f804b3146106955780635a67de07146106be578063603f4d52146106e75780636352211e1461071257806370a082311461074f5761027c565b80632a55205a116101f35780633ccfd60b116101ac5780633ccfd60b1461059757806342842e0e146105ae57806344bb8279146105d7578063453c2310146106145780634b980d671461063f57806350cf22c11461066a5761027c565b80632a55205a146104765780632eb4a7ab146104b45780633406c726146104df57806334861c751461051c5780633549345e14610545578063391176681461056e5761027c565b8063081812fc11610245578063081812fc14610368578063095ea7b3146103a55780630d0ee170146103ce57806312c23bd8146103f757806318160ddd1461042257806323b872dd1461044d5761027c565b80620e7fa81461028157806301ffc9a7146102ac57806302fa7c47146102e9578063047fc9aa1461031257806306fdde031461033d575b600080fd5b34801561028d57600080fd5b50610296610a88565b6040516102a391906139d3565b60405180910390f35b3480156102b857600080fd5b506102d360048036038101906102ce9190613a5a565b610a8e565b6040516102e09190613aa2565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190613b5f565b610aa0565b005b34801561031e57600080fd5b50610327610b2a565b60405161033491906139d3565b60405180910390f35b34801561034957600080fd5b50610352610b4e565b60405161035f9190613c38565b60405180910390f35b34801561037457600080fd5b5061038f600480360381019061038a9190613c86565b610be0565b60405161039c9190613cc2565b60405180910390f35b3480156103b157600080fd5b506103cc60048036038101906103c79190613cdd565b610c5c565b005b3480156103da57600080fd5b506103f560048036038101906103f09190613c86565b610d66565b005b34801561040357600080fd5b5061040c610dec565b60405161041991906139d3565b60405180910390f35b34801561042e57600080fd5b50610437610df2565b60405161044491906139d3565b60405180910390f35b34801561045957600080fd5b50610474600480360381019061046f9190613d1d565b610e09565b005b34801561048257600080fd5b5061049d60048036038101906104989190613d70565b610e19565b6040516104ab929190613db0565b60405180910390f35b3480156104c057600080fd5b506104c9611003565b6040516104d69190613df2565b60405180910390f35b3480156104eb57600080fd5b5061050660048036038101906105019190613e0d565b611009565b60405161051391906139d3565b60405180910390f35b34801561052857600080fd5b50610543600480360381019061053e9190613e3a565b611021565b005b34801561055157600080fd5b5061056c60048036038101906105679190613c86565b61111e565b005b34801561057a57600080fd5b5061059560048036038101906105909190613c86565b6111a4565b005b3480156105a357600080fd5b506105ac61122a565b005b3480156105ba57600080fd5b506105d560048036038101906105d09190613d1d565b61134f565b005b3480156105e357600080fd5b506105fe60048036038101906105f99190613c86565b61136f565b60405161060b9190613cc2565b60405180910390f35b34801561062057600080fd5b506106296113ae565b60405161063691906139d3565b60405180910390f35b34801561064b57600080fd5b506106546113b4565b60405161066191906139d3565b60405180910390f35b34801561067657600080fd5b5061067f6113ba565b60405161068c91906139d3565b60405180910390f35b3480156106a157600080fd5b506106bc60048036038101906106b79190613faf565b6113c0565b005b3480156106ca57600080fd5b506106e560048036038101906106e09190614031565b611456565b005b3480156106f357600080fd5b506106fc611514565b60405161070991906140d5565b60405180910390f35b34801561071e57600080fd5b5061073960048036038101906107349190613c86565b611527565b6040516107469190613cc2565b60405180910390f35b34801561075b57600080fd5b5061077660048036038101906107719190613e0d565b61153d565b60405161078391906139d3565b60405180910390f35b34801561079857600080fd5b506107a161160c565b005b3480156107af57600080fd5b506107ca60048036038101906107c5919061411c565b611694565b005b3480156107d857600080fd5b506107e161171a565b6040516107ee9190613cc2565b60405180910390f35b34801561080357600080fd5b5061081e60048036038101906108199190613c86565b611744565b005b34801561082c57600080fd5b506108356117ca565b6040516108429190613c38565b60405180910390f35b34801561085757600080fd5b5061086061185c565b60405161086d91906139d3565b60405180910390f35b610890600480360381019061088b9190613c86565b611862565b005b34801561089e57600080fd5b506108b960048036038101906108b49190614175565b611aac565b005b3480156108c757600080fd5b506108d0611c23565b6040516108dd91906139d3565b60405180910390f35b3480156108f257600080fd5b5061090d60048036038101906109089190614256565b611c47565b005b34801561091b57600080fd5b5061093660048036038101906109319190613c86565b611cc3565b005b610952600480360381019061094d9190614339565b611d49565b005b34801561096057600080fd5b5061097b60048036038101906109769190613c86565b61203e565b6040516109889190613c38565b60405180910390f35b34801561099d57600080fd5b506109a66120dc565b6040516109b39190613c38565b60405180910390f35b3480156109c857600080fd5b506109e360048036038101906109de9190613c86565b61216a565b6040516109f091906139d3565b60405180910390f35b348015610a0557600080fd5b50610a206004803603810190610a1b9190613c86565b61218e565b005b348015610a2e57600080fd5b50610a496004803603810190610a449190614399565b612214565b604051610a569190613aa2565b60405180910390f35b348015610a6b57600080fd5b50610a866004803603810190610a819190613e0d565b6122a8565b005b600c5481565b6000610a998261239f565b9050919050565b610aa8612419565b73ffffffffffffffffffffffffffffffffffffffff16610ac661171a565b73ffffffffffffffffffffffffffffffffffffffff1614610b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1390614425565b60405180910390fd5b610b268282612421565b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b606060028054610b5d90614474565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8990614474565b8015610bd65780601f10610bab57610100808354040283529160200191610bd6565b820191906000526020600020905b815481529060010190602001808311610bb957829003601f168201915b5050505050905090565b6000610beb826125b6565b610c21576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c6782611527565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610cce576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ced612419565b73ffffffffffffffffffffffffffffffffffffffff1614158015610d1f5750610d1d81610d18612419565b612214565b155b15610d56576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d61838383612604565b505050565b610d6e612419565b73ffffffffffffffffffffffffffffffffffffffff16610d8c61171a565b73ffffffffffffffffffffffffffffffffffffffff1614610de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd990614425565b60405180910390fd5b8060108190555050565b600f5481565b6000610dfc6126b6565b6001546000540303905090565b610e148383836126bf565b505050565b6000806000600a60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610fae5760096040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610fb8612b73565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610fe491906144d4565b610fee919061455d565b90508160000151819350935050509250929050565b60165481565b60136020528060005260406000206000915090505481565b611029612419565b73ffffffffffffffffffffffffffffffffffffffff1661104761171a565b73ffffffffffffffffffffffffffffffffffffffff161461109d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109490614425565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001836110cb919061458e565b6000546110d891906145c2565b1115611110576040517f52df9fe500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61111a8183612b7d565b5050565b611126612419565b73ffffffffffffffffffffffffffffffffffffffff1661114461171a565b73ffffffffffffffffffffffffffffffffffffffff161461119a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119190614425565b60405180910390fd5b80600c8190555050565b6111ac612419565b73ffffffffffffffffffffffffffffffffffffffff166111ca61171a565b73ffffffffffffffffffffffffffffffffffffffff1614611220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121790614425565b60405180910390fd5b80600d8190555050565b611232612419565b73ffffffffffffffffffffffffffffffffffffffff1661125061171a565b73ffffffffffffffffffffffffffffffffffffffff16146112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129d90614425565b60405180910390fd5b600047905060005b60148054905081101561134b57611338601482815481106112d2576112d1614618565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660646015848154811061131357611312614618565b5b90600052602060002001548561132991906144d4565b611333919061455d565b612b9b565b808061134390614647565b9150506112ae565b5050565b61136a83838360405180602001604052806000815250611c47565b505050565b6014818154811061137f57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d5481565b600e5481565b60105481565b6113c8612419565b73ffffffffffffffffffffffffffffffffffffffff166113e661171a565b73ffffffffffffffffffffffffffffffffffffffff161461143c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143390614425565b60405180910390fd5b80601290805190602001906114529291906138d4565b5050565b61145e612419565b73ffffffffffffffffffffffffffffffffffffffff1661147c61171a565b73ffffffffffffffffffffffffffffffffffffffff16146114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c990614425565b60405180910390fd5b8060ff1660028111156114e8576114e761405e565b5b601160006101000a81548160ff0219169083600281111561150c5761150b61405e565b5b021790555050565b601160009054906101000a900460ff1681565b600061153282612c43565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115a4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611614612419565b73ffffffffffffffffffffffffffffffffffffffff1661163261171a565b73ffffffffffffffffffffffffffffffffffffffff1614611688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167f90614425565b60405180910390fd5b6116926000612ed2565b565b61169c612419565b73ffffffffffffffffffffffffffffffffffffffff166116ba61171a565b73ffffffffffffffffffffffffffffffffffffffff1614611710576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170790614425565b60405180910390fd5b8060168190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61174c612419565b73ffffffffffffffffffffffffffffffffffffffff1661176a61171a565b73ffffffffffffffffffffffffffffffffffffffff16146117c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b790614425565b60405180910390fd5b80600b8190555050565b6060600380546117d990614474565b80601f016020809104026020016040519081016040528092919081815260200182805461180590614474565b80156118525780601f1061182757610100808354040283529160200191611852565b820191906000526020600020905b81548152906001019060200180831161183557829003601f168201915b5050505050905090565b600b5481565b600160028111156118765761187561405e565b5b601160009054906101000a900460ff1660028111156118985761189761405e565b5b146118cf576040517f3f88677400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001826118fd919061458e565b60005461190a91906145c2565b1115611942576040517f52df9fe500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b5461195091906144d4565b3414611987576040517ebfc92100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d5481601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119d591906145c2565b1115611a0d576040517f524f409b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54811115611a49576040517f524f409b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a533382612b7d565b80601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611aa291906145c2565b9250508190555050565b611ab4612419565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b18576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611b25612419565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611bd2612419565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c179190613aa2565b60405180910390a35050565b7f000000000000000000000000000000000000000000000000000000000000000081565b611c528484846126bf565b611c718373ffffffffffffffffffffffffffffffffffffffff16612f98565b8015611c865750611c8484848484612fbb565b155b15611cbd576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611ccb612419565b73ffffffffffffffffffffffffffffffffffffffff16611ce961171a565b73ffffffffffffffffffffffffffffffffffffffff1614611d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3690614425565b60405180910390fd5b80600e8190555050565b600280811115611d5c57611d5b61405e565b5b601160009054906101000a900460ff166002811115611d7e57611d7d61405e565b5b14611db5576040517f3f88677400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000600184611de3919061458e565b600054611df091906145c2565b1115611e28576040517f52df9fe500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82600c54611e3691906144d4565b3414611e6d576040517ebfc92100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ee1828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060165433604051602001611ec691906146d7565b6040516020818303038152906040528051906020012061310b565b611f17576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f5483601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f6591906145c2565b1115611f9d576040517f524f409b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601054831115611fd9576040517f524f409b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611fe33384612b7d565b82601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461203291906145c2565b92505081905550505050565b6060612049826125b6565b61207f576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612089613122565b905060008151036120a957604051806020016040528060008152506120d4565b806120b3846131b4565b6040516020016120c492919061472e565b6040516020818303038152906040525b915050919050565b601280546120e990614474565b80601f016020809104026020016040519081016040528092919081815260200182805461211590614474565b80156121625780601f1061213757610100808354040283529160200191612162565b820191906000526020600020905b81548152906001019060200180831161214557829003601f168201915b505050505081565b6015818154811061217a57600080fd5b906000526020600020016000915090505481565b612196612419565b73ffffffffffffffffffffffffffffffffffffffff166121b461171a565b73ffffffffffffffffffffffffffffffffffffffff161461220a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220190614425565b60405180910390fd5b80600f8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122b0612419565b73ffffffffffffffffffffffffffffffffffffffff166122ce61171a565b73ffffffffffffffffffffffffffffffffffffffff1614612324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231b90614425565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238a906147c4565b60405180910390fd5b61239c81612ed2565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612412575061241182613314565b5b9050919050565b600033905090565b612429612b73565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247e90614856565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036124f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ed906148c2565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000816125c16126b6565b111580156125d0575060005482105b80156125fd575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006126ca82612c43565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612735576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612756612419565b73ffffffffffffffffffffffffffffffffffffffff16148061278557506127848561277f612419565b612214565b5b806127ca5750612793612419565b73ffffffffffffffffffffffffffffffffffffffff166127b284610be0565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612803576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612869576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61287685858560016133f6565b61288260008487612604565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612b01576000548214612b0057878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b6c85858560016133fc565b5050505050565b6000612710905090565b612b97828260405180602001604052806000815250613402565b5050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612bc190614913565b60006040518083038185875af1925050503d8060008114612bfe576040519150601f19603f3d011682016040523d82523d6000602084013e612c03565b606091505b5050905080612c3e576040517f750b219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b612c4b61395a565b600082905080612c596126b6565b11158015612c68575060005481105b15612e9b576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612e9957600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d7d578092505050612ecd565b5b600115612e9857818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e93578092505050612ecd565b612d7e565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612fe1612419565b8786866040518563ffffffff1660e01b8152600401613003949392919061497d565b6020604051808303816000875af192505050801561303f57506040513d601f19601f8201168201806040525081019061303c91906149de565b60015b6130b8573d806000811461306f576040519150601f19603f3d011682016040523d82523d6000602084013e613074565b606091505b5060008151036130b0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6000826131188584613414565b1490509392505050565b60606012805461313190614474565b80601f016020809104026020016040519081016040528092919081815260200182805461315d90614474565b80156131aa5780601f1061317f576101008083540402835291602001916131aa565b820191906000526020600020905b81548152906001019060200180831161318d57829003601f168201915b5050505050905090565b6060600082036131fb576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061330f565b600082905060005b6000821461322d57808061321690614647565b915050600a82613226919061455d565b9150613203565b60008167ffffffffffffffff81111561324957613248613e84565b5b6040519080825280601f01601f19166020018201604052801561327b5781602001600182028036833780820191505090505b5090505b6000851461330857600182613294919061458e565b9150600a856132a39190614a0b565b60306132af91906145c2565b60f81b8183815181106132c5576132c4614618565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613301919061455d565b945061327f565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806133df57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806133ef57506133ee82613489565b5b9050919050565b50505050565b50505050565b61340f83838360016134f3565b505050565b60008082905060005b845181101561347e57600085828151811061343b5761343a614618565b5b6020026020010151905080831161345d5761345683826138bd565b925061346a565b61346781846138bd565b92505b50808061347690614647565b91505061341d565b508091505092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361355f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403613599576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6135a660008683876133f6565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015613770575061376f8773ffffffffffffffffffffffffffffffffffffffff16612f98565b5b15613835575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46137e56000888480600101955088612fbb565b61381b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820361377657826000541461383057600080fd5b6138a0565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203613836575b8160008190555050506138b660008683876133fc565b5050505050565b600082600052816020526040600020905092915050565b8280546138e090614474565b90600052602060002090601f0160209004810192826139025760008555613949565b82601f1061391b57805160ff1916838001178555613949565b82800160010185558215613949579182015b8281111561394857825182559160200191906001019061392d565b5b509050613956919061399d565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156139b657600081600090555060010161399e565b5090565b6000819050919050565b6139cd816139ba565b82525050565b60006020820190506139e860008301846139c4565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613a3781613a02565b8114613a4257600080fd5b50565b600081359050613a5481613a2e565b92915050565b600060208284031215613a7057613a6f6139f8565b5b6000613a7e84828501613a45565b91505092915050565b60008115159050919050565b613a9c81613a87565b82525050565b6000602082019050613ab76000830184613a93565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613ae882613abd565b9050919050565b613af881613add565b8114613b0357600080fd5b50565b600081359050613b1581613aef565b92915050565b60006bffffffffffffffffffffffff82169050919050565b613b3c81613b1b565b8114613b4757600080fd5b50565b600081359050613b5981613b33565b92915050565b60008060408385031215613b7657613b756139f8565b5b6000613b8485828601613b06565b9250506020613b9585828601613b4a565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613bd9578082015181840152602081019050613bbe565b83811115613be8576000848401525b50505050565b6000601f19601f8301169050919050565b6000613c0a82613b9f565b613c148185613baa565b9350613c24818560208601613bbb565b613c2d81613bee565b840191505092915050565b60006020820190508181036000830152613c528184613bff565b905092915050565b613c63816139ba565b8114613c6e57600080fd5b50565b600081359050613c8081613c5a565b92915050565b600060208284031215613c9c57613c9b6139f8565b5b6000613caa84828501613c71565b91505092915050565b613cbc81613add565b82525050565b6000602082019050613cd76000830184613cb3565b92915050565b60008060408385031215613cf457613cf36139f8565b5b6000613d0285828601613b06565b9250506020613d1385828601613c71565b9150509250929050565b600080600060608486031215613d3657613d356139f8565b5b6000613d4486828701613b06565b9350506020613d5586828701613b06565b9250506040613d6686828701613c71565b9150509250925092565b60008060408385031215613d8757613d866139f8565b5b6000613d9585828601613c71565b9250506020613da685828601613c71565b9150509250929050565b6000604082019050613dc56000830185613cb3565b613dd260208301846139c4565b9392505050565b6000819050919050565b613dec81613dd9565b82525050565b6000602082019050613e076000830184613de3565b92915050565b600060208284031215613e2357613e226139f8565b5b6000613e3184828501613b06565b91505092915050565b60008060408385031215613e5157613e506139f8565b5b6000613e5f85828601613c71565b9250506020613e7085828601613b06565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613ebc82613bee565b810181811067ffffffffffffffff82111715613edb57613eda613e84565b5b80604052505050565b6000613eee6139ee565b9050613efa8282613eb3565b919050565b600067ffffffffffffffff821115613f1a57613f19613e84565b5b613f2382613bee565b9050602081019050919050565b82818337600083830152505050565b6000613f52613f4d84613eff565b613ee4565b905082815260208101848484011115613f6e57613f6d613e7f565b5b613f79848285613f30565b509392505050565b600082601f830112613f9657613f95613e7a565b5b8135613fa6848260208601613f3f565b91505092915050565b600060208284031215613fc557613fc46139f8565b5b600082013567ffffffffffffffff811115613fe357613fe26139fd565b5b613fef84828501613f81565b91505092915050565b600060ff82169050919050565b61400e81613ff8565b811461401957600080fd5b50565b60008135905061402b81614005565b92915050565b600060208284031215614047576140466139f8565b5b60006140558482850161401c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061409e5761409d61405e565b5b50565b60008190506140af8261408d565b919050565b60006140bf826140a1565b9050919050565b6140cf816140b4565b82525050565b60006020820190506140ea60008301846140c6565b92915050565b6140f981613dd9565b811461410457600080fd5b50565b600081359050614116816140f0565b92915050565b600060208284031215614132576141316139f8565b5b600061414084828501614107565b91505092915050565b61415281613a87565b811461415d57600080fd5b50565b60008135905061416f81614149565b92915050565b6000806040838503121561418c5761418b6139f8565b5b600061419a85828601613b06565b92505060206141ab85828601614160565b9150509250929050565b600067ffffffffffffffff8211156141d0576141cf613e84565b5b6141d982613bee565b9050602081019050919050565b60006141f96141f4846141b5565b613ee4565b90508281526020810184848401111561421557614214613e7f565b5b614220848285613f30565b509392505050565b600082601f83011261423d5761423c613e7a565b5b813561424d8482602086016141e6565b91505092915050565b600080600080608085870312156142705761426f6139f8565b5b600061427e87828801613b06565b945050602061428f87828801613b06565b93505060406142a087828801613c71565b925050606085013567ffffffffffffffff8111156142c1576142c06139fd565b5b6142cd87828801614228565b91505092959194509250565b600080fd5b600080fd5b60008083601f8401126142f9576142f8613e7a565b5b8235905067ffffffffffffffff811115614316576143156142d9565b5b602083019150836020820283011115614332576143316142de565b5b9250929050565b600080600060408486031215614352576143516139f8565b5b600061436086828701613c71565b935050602084013567ffffffffffffffff811115614381576143806139fd565b5b61438d868287016142e3565b92509250509250925092565b600080604083850312156143b0576143af6139f8565b5b60006143be85828601613b06565b92505060206143cf85828601613b06565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061440f602083613baa565b915061441a826143d9565b602082019050919050565b6000602082019050818103600083015261443e81614402565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061448c57607f821691505b60208210810361449f5761449e614445565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006144df826139ba565b91506144ea836139ba565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614523576145226144a5565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614568826139ba565b9150614573836139ba565b9250826145835761458261452e565b5b828204905092915050565b6000614599826139ba565b91506145a4836139ba565b9250828210156145b7576145b66144a5565b5b828203905092915050565b60006145cd826139ba565b91506145d8836139ba565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561460d5761460c6144a5565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614652826139ba565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614684576146836144a5565b5b600182019050919050565b60008160601b9050919050565b60006146a78261468f565b9050919050565b60006146b98261469c565b9050919050565b6146d16146cc82613add565b6146ae565b82525050565b60006146e382846146c0565b60148201915081905092915050565b600081905092915050565b600061470882613b9f565b61471281856146f2565b9350614722818560208601613bbb565b80840191505092915050565b600061473a82856146fd565b915061474682846146fd565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006147ae602683613baa565b91506147b982614752565b604082019050919050565b600060208201905081810360008301526147dd816147a1565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000614840602a83613baa565b915061484b826147e4565b604082019050919050565b6000602082019050818103600083015261486f81614833565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006148ac601983613baa565b91506148b782614876565b602082019050919050565b600060208201905081810360008301526148db8161489f565b9050919050565b600081905092915050565b50565b60006148fd6000836148e2565b9150614908826148ed565b600082019050919050565b600061491e826148f0565b9150819050919050565b600081519050919050565b600082825260208201905092915050565b600061494f82614928565b6149598185614933565b9350614969818560208601613bbb565b61497281613bee565b840191505092915050565b60006080820190506149926000830187613cb3565b61499f6020830186613cb3565b6149ac60408301856139c4565b81810360608301526149be8184614944565b905095945050505050565b6000815190506149d881613a2e565b92915050565b6000602082840312156149f4576149f36139f8565b5b6000614a02848285016149c9565b91505092915050565b6000614a16826139ba565b9150614a21836139ba565b925082614a3157614a3061452e565b5b82820690509291505056fea26469706673582212201f60120ac0fb62e0d36010cc650e8437465a430d5b9e50bb0f7378cf4eeacc4364736f6c634300080d0033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c5468654368696e614e46547300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002434e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f68747470733a2f2f6170692e7468656368696e616e6674732e636f6d2f682f00
Deployed Bytecode
0x60806040526004361061027c5760003560e01c806355f804b31161014f578063a0712d68116100c1578063c87b56dd1161007a578063c87b56dd14610954578063cfc86f7b14610991578063d86bed9b146109bc578063e341f5ca146109f9578063e985e9c514610a22578063f2fde38b14610a5f5761027c565b8063a0712d6814610876578063a22cb46514610892578063b3a196e9146108bb578063b88d4fde146108e6578063bd3b14d31461090f578063c13bd95c146109385761027c565b8063715018a611610113578063715018a61461078c5780637cb64759146107a35780638da5cb5b146107cc57806391b7f5ed146107f757806395d89b4114610820578063a035b1fe1461084b5761027c565b806355f804b3146106955780635a67de07146106be578063603f4d52146106e75780636352211e1461071257806370a082311461074f5761027c565b80632a55205a116101f35780633ccfd60b116101ac5780633ccfd60b1461059757806342842e0e146105ae57806344bb8279146105d7578063453c2310146106145780634b980d671461063f57806350cf22c11461066a5761027c565b80632a55205a146104765780632eb4a7ab146104b45780633406c726146104df57806334861c751461051c5780633549345e14610545578063391176681461056e5761027c565b8063081812fc11610245578063081812fc14610368578063095ea7b3146103a55780630d0ee170146103ce57806312c23bd8146103f757806318160ddd1461042257806323b872dd1461044d5761027c565b80620e7fa81461028157806301ffc9a7146102ac57806302fa7c47146102e9578063047fc9aa1461031257806306fdde031461033d575b600080fd5b34801561028d57600080fd5b50610296610a88565b6040516102a391906139d3565b60405180910390f35b3480156102b857600080fd5b506102d360048036038101906102ce9190613a5a565b610a8e565b6040516102e09190613aa2565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190613b5f565b610aa0565b005b34801561031e57600080fd5b50610327610b2a565b60405161033491906139d3565b60405180910390f35b34801561034957600080fd5b50610352610b4e565b60405161035f9190613c38565b60405180910390f35b34801561037457600080fd5b5061038f600480360381019061038a9190613c86565b610be0565b60405161039c9190613cc2565b60405180910390f35b3480156103b157600080fd5b506103cc60048036038101906103c79190613cdd565b610c5c565b005b3480156103da57600080fd5b506103f560048036038101906103f09190613c86565b610d66565b005b34801561040357600080fd5b5061040c610dec565b60405161041991906139d3565b60405180910390f35b34801561042e57600080fd5b50610437610df2565b60405161044491906139d3565b60405180910390f35b34801561045957600080fd5b50610474600480360381019061046f9190613d1d565b610e09565b005b34801561048257600080fd5b5061049d60048036038101906104989190613d70565b610e19565b6040516104ab929190613db0565b60405180910390f35b3480156104c057600080fd5b506104c9611003565b6040516104d69190613df2565b60405180910390f35b3480156104eb57600080fd5b5061050660048036038101906105019190613e0d565b611009565b60405161051391906139d3565b60405180910390f35b34801561052857600080fd5b50610543600480360381019061053e9190613e3a565b611021565b005b34801561055157600080fd5b5061056c60048036038101906105679190613c86565b61111e565b005b34801561057a57600080fd5b5061059560048036038101906105909190613c86565b6111a4565b005b3480156105a357600080fd5b506105ac61122a565b005b3480156105ba57600080fd5b506105d560048036038101906105d09190613d1d565b61134f565b005b3480156105e357600080fd5b506105fe60048036038101906105f99190613c86565b61136f565b60405161060b9190613cc2565b60405180910390f35b34801561062057600080fd5b506106296113ae565b60405161063691906139d3565b60405180910390f35b34801561064b57600080fd5b506106546113b4565b60405161066191906139d3565b60405180910390f35b34801561067657600080fd5b5061067f6113ba565b60405161068c91906139d3565b60405180910390f35b3480156106a157600080fd5b506106bc60048036038101906106b79190613faf565b6113c0565b005b3480156106ca57600080fd5b506106e560048036038101906106e09190614031565b611456565b005b3480156106f357600080fd5b506106fc611514565b60405161070991906140d5565b60405180910390f35b34801561071e57600080fd5b5061073960048036038101906107349190613c86565b611527565b6040516107469190613cc2565b60405180910390f35b34801561075b57600080fd5b5061077660048036038101906107719190613e0d565b61153d565b60405161078391906139d3565b60405180910390f35b34801561079857600080fd5b506107a161160c565b005b3480156107af57600080fd5b506107ca60048036038101906107c5919061411c565b611694565b005b3480156107d857600080fd5b506107e161171a565b6040516107ee9190613cc2565b60405180910390f35b34801561080357600080fd5b5061081e60048036038101906108199190613c86565b611744565b005b34801561082c57600080fd5b506108356117ca565b6040516108429190613c38565b60405180910390f35b34801561085757600080fd5b5061086061185c565b60405161086d91906139d3565b60405180910390f35b610890600480360381019061088b9190613c86565b611862565b005b34801561089e57600080fd5b506108b960048036038101906108b49190614175565b611aac565b005b3480156108c757600080fd5b506108d0611c23565b6040516108dd91906139d3565b60405180910390f35b3480156108f257600080fd5b5061090d60048036038101906109089190614256565b611c47565b005b34801561091b57600080fd5b5061093660048036038101906109319190613c86565b611cc3565b005b610952600480360381019061094d9190614339565b611d49565b005b34801561096057600080fd5b5061097b60048036038101906109769190613c86565b61203e565b6040516109889190613c38565b60405180910390f35b34801561099d57600080fd5b506109a66120dc565b6040516109b39190613c38565b60405180910390f35b3480156109c857600080fd5b506109e360048036038101906109de9190613c86565b61216a565b6040516109f091906139d3565b60405180910390f35b348015610a0557600080fd5b50610a206004803603810190610a1b9190613c86565b61218e565b005b348015610a2e57600080fd5b50610a496004803603810190610a449190614399565b612214565b604051610a569190613aa2565b60405180910390f35b348015610a6b57600080fd5b50610a866004803603810190610a819190613e0d565b6122a8565b005b600c5481565b6000610a998261239f565b9050919050565b610aa8612419565b73ffffffffffffffffffffffffffffffffffffffff16610ac661171a565b73ffffffffffffffffffffffffffffffffffffffff1614610b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1390614425565b60405180910390fd5b610b268282612421565b5050565b7f000000000000000000000000000000000000000000000000000000000000271081565b606060028054610b5d90614474565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8990614474565b8015610bd65780601f10610bab57610100808354040283529160200191610bd6565b820191906000526020600020905b815481529060010190602001808311610bb957829003601f168201915b5050505050905090565b6000610beb826125b6565b610c21576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c6782611527565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610cce576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ced612419565b73ffffffffffffffffffffffffffffffffffffffff1614158015610d1f5750610d1d81610d18612419565b612214565b155b15610d56576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d61838383612604565b505050565b610d6e612419565b73ffffffffffffffffffffffffffffffffffffffff16610d8c61171a565b73ffffffffffffffffffffffffffffffffffffffff1614610de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd990614425565b60405180910390fd5b8060108190555050565b600f5481565b6000610dfc6126b6565b6001546000540303905090565b610e148383836126bf565b505050565b6000806000600a60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610fae5760096040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610fb8612b73565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610fe491906144d4565b610fee919061455d565b90508160000151819350935050509250929050565b60165481565b60136020528060005260406000206000915090505481565b611029612419565b73ffffffffffffffffffffffffffffffffffffffff1661104761171a565b73ffffffffffffffffffffffffffffffffffffffff161461109d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109490614425565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000027106001836110cb919061458e565b6000546110d891906145c2565b1115611110576040517f52df9fe500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61111a8183612b7d565b5050565b611126612419565b73ffffffffffffffffffffffffffffffffffffffff1661114461171a565b73ffffffffffffffffffffffffffffffffffffffff161461119a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119190614425565b60405180910390fd5b80600c8190555050565b6111ac612419565b73ffffffffffffffffffffffffffffffffffffffff166111ca61171a565b73ffffffffffffffffffffffffffffffffffffffff1614611220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121790614425565b60405180910390fd5b80600d8190555050565b611232612419565b73ffffffffffffffffffffffffffffffffffffffff1661125061171a565b73ffffffffffffffffffffffffffffffffffffffff16146112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129d90614425565b60405180910390fd5b600047905060005b60148054905081101561134b57611338601482815481106112d2576112d1614618565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660646015848154811061131357611312614618565b5b90600052602060002001548561132991906144d4565b611333919061455d565b612b9b565b808061134390614647565b9150506112ae565b5050565b61136a83838360405180602001604052806000815250611c47565b505050565b6014818154811061137f57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d5481565b600e5481565b60105481565b6113c8612419565b73ffffffffffffffffffffffffffffffffffffffff166113e661171a565b73ffffffffffffffffffffffffffffffffffffffff161461143c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143390614425565b60405180910390fd5b80601290805190602001906114529291906138d4565b5050565b61145e612419565b73ffffffffffffffffffffffffffffffffffffffff1661147c61171a565b73ffffffffffffffffffffffffffffffffffffffff16146114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c990614425565b60405180910390fd5b8060ff1660028111156114e8576114e761405e565b5b601160006101000a81548160ff0219169083600281111561150c5761150b61405e565b5b021790555050565b601160009054906101000a900460ff1681565b600061153282612c43565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115a4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611614612419565b73ffffffffffffffffffffffffffffffffffffffff1661163261171a565b73ffffffffffffffffffffffffffffffffffffffff1614611688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167f90614425565b60405180910390fd5b6116926000612ed2565b565b61169c612419565b73ffffffffffffffffffffffffffffffffffffffff166116ba61171a565b73ffffffffffffffffffffffffffffffffffffffff1614611710576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170790614425565b60405180910390fd5b8060168190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61174c612419565b73ffffffffffffffffffffffffffffffffffffffff1661176a61171a565b73ffffffffffffffffffffffffffffffffffffffff16146117c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b790614425565b60405180910390fd5b80600b8190555050565b6060600380546117d990614474565b80601f016020809104026020016040519081016040528092919081815260200182805461180590614474565b80156118525780601f1061182757610100808354040283529160200191611852565b820191906000526020600020905b81548152906001019060200180831161183557829003601f168201915b5050505050905090565b600b5481565b600160028111156118765761187561405e565b5b601160009054906101000a900460ff1660028111156118985761189761405e565b5b146118cf576040517f3f88677400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000027106001826118fd919061458e565b60005461190a91906145c2565b1115611942576040517f52df9fe500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b5461195091906144d4565b3414611987576040517ebfc92100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d5481601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119d591906145c2565b1115611a0d576040517f524f409b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54811115611a49576040517f524f409b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a533382612b7d565b80601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611aa291906145c2565b9250508190555050565b611ab4612419565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b18576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611b25612419565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611bd2612419565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c179190613aa2565b60405180910390a35050565b7f000000000000000000000000000000000000000000000000000000000000271081565b611c528484846126bf565b611c718373ffffffffffffffffffffffffffffffffffffffff16612f98565b8015611c865750611c8484848484612fbb565b155b15611cbd576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611ccb612419565b73ffffffffffffffffffffffffffffffffffffffff16611ce961171a565b73ffffffffffffffffffffffffffffffffffffffff1614611d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3690614425565b60405180910390fd5b80600e8190555050565b600280811115611d5c57611d5b61405e565b5b601160009054906101000a900460ff166002811115611d7e57611d7d61405e565b5b14611db5576040517f3f88677400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000002710600184611de3919061458e565b600054611df091906145c2565b1115611e28576040517f52df9fe500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82600c54611e3691906144d4565b3414611e6d576040517ebfc92100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ee1828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060165433604051602001611ec691906146d7565b6040516020818303038152906040528051906020012061310b565b611f17576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f5483601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f6591906145c2565b1115611f9d576040517f524f409b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601054831115611fd9576040517f524f409b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611fe33384612b7d565b82601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461203291906145c2565b92505081905550505050565b6060612049826125b6565b61207f576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612089613122565b905060008151036120a957604051806020016040528060008152506120d4565b806120b3846131b4565b6040516020016120c492919061472e565b6040516020818303038152906040525b915050919050565b601280546120e990614474565b80601f016020809104026020016040519081016040528092919081815260200182805461211590614474565b80156121625780601f1061213757610100808354040283529160200191612162565b820191906000526020600020905b81548152906001019060200180831161214557829003601f168201915b505050505081565b6015818154811061217a57600080fd5b906000526020600020016000915090505481565b612196612419565b73ffffffffffffffffffffffffffffffffffffffff166121b461171a565b73ffffffffffffffffffffffffffffffffffffffff161461220a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220190614425565b60405180910390fd5b80600f8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122b0612419565b73ffffffffffffffffffffffffffffffffffffffff166122ce61171a565b73ffffffffffffffffffffffffffffffffffffffff1614612324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231b90614425565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238a906147c4565b60405180910390fd5b61239c81612ed2565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612412575061241182613314565b5b9050919050565b600033905090565b612429612b73565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247e90614856565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036124f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ed906148c2565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000816125c16126b6565b111580156125d0575060005482105b80156125fd575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b60006126ca82612c43565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612735576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612756612419565b73ffffffffffffffffffffffffffffffffffffffff16148061278557506127848561277f612419565b612214565b5b806127ca5750612793612419565b73ffffffffffffffffffffffffffffffffffffffff166127b284610be0565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612803576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612869576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61287685858560016133f6565b61288260008487612604565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612b01576000548214612b0057878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b6c85858560016133fc565b5050505050565b6000612710905090565b612b97828260405180602001604052806000815250613402565b5050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612bc190614913565b60006040518083038185875af1925050503d8060008114612bfe576040519150601f19603f3d011682016040523d82523d6000602084013e612c03565b606091505b5050905080612c3e576040517f750b219c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b612c4b61395a565b600082905080612c596126b6565b11158015612c68575060005481105b15612e9b576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612e9957600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d7d578092505050612ecd565b5b600115612e9857818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e93578092505050612ecd565b612d7e565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612fe1612419565b8786866040518563ffffffff1660e01b8152600401613003949392919061497d565b6020604051808303816000875af192505050801561303f57506040513d601f19601f8201168201806040525081019061303c91906149de565b60015b6130b8573d806000811461306f576040519150601f19603f3d011682016040523d82523d6000602084013e613074565b606091505b5060008151036130b0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6000826131188584613414565b1490509392505050565b60606012805461313190614474565b80601f016020809104026020016040519081016040528092919081815260200182805461315d90614474565b80156131aa5780601f1061317f576101008083540402835291602001916131aa565b820191906000526020600020905b81548152906001019060200180831161318d57829003601f168201915b5050505050905090565b6060600082036131fb576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061330f565b600082905060005b6000821461322d57808061321690614647565b915050600a82613226919061455d565b9150613203565b60008167ffffffffffffffff81111561324957613248613e84565b5b6040519080825280601f01601f19166020018201604052801561327b5781602001600182028036833780820191505090505b5090505b6000851461330857600182613294919061458e565b9150600a856132a39190614a0b565b60306132af91906145c2565b60f81b8183815181106132c5576132c4614618565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613301919061455d565b945061327f565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806133df57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806133ef57506133ee82613489565b5b9050919050565b50505050565b50505050565b61340f83838360016134f3565b505050565b60008082905060005b845181101561347e57600085828151811061343b5761343a614618565b5b6020026020010151905080831161345d5761345683826138bd565b925061346a565b61346781846138bd565b92505b50808061347690614647565b91505061341d565b508091505092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361355f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403613599576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6135a660008683876133f6565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015613770575061376f8773ffffffffffffffffffffffffffffffffffffffff16612f98565b5b15613835575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46137e56000888480600101955088612fbb565b61381b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820361377657826000541461383057600080fd5b6138a0565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203613836575b8160008190555050506138b660008683876133fc565b5050505050565b600082600052816020526040600020905092915050565b8280546138e090614474565b90600052602060002090601f0160209004810192826139025760008555613949565b82601f1061391b57805160ff1916838001178555613949565b82800160010185558215613949579182015b8281111561394857825182559160200191906001019061392d565b5b509050613956919061399d565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156139b657600081600090555060010161399e565b5090565b6000819050919050565b6139cd816139ba565b82525050565b60006020820190506139e860008301846139c4565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613a3781613a02565b8114613a4257600080fd5b50565b600081359050613a5481613a2e565b92915050565b600060208284031215613a7057613a6f6139f8565b5b6000613a7e84828501613a45565b91505092915050565b60008115159050919050565b613a9c81613a87565b82525050565b6000602082019050613ab76000830184613a93565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613ae882613abd565b9050919050565b613af881613add565b8114613b0357600080fd5b50565b600081359050613b1581613aef565b92915050565b60006bffffffffffffffffffffffff82169050919050565b613b3c81613b1b565b8114613b4757600080fd5b50565b600081359050613b5981613b33565b92915050565b60008060408385031215613b7657613b756139f8565b5b6000613b8485828601613b06565b9250506020613b9585828601613b4a565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613bd9578082015181840152602081019050613bbe565b83811115613be8576000848401525b50505050565b6000601f19601f8301169050919050565b6000613c0a82613b9f565b613c148185613baa565b9350613c24818560208601613bbb565b613c2d81613bee565b840191505092915050565b60006020820190508181036000830152613c528184613bff565b905092915050565b613c63816139ba565b8114613c6e57600080fd5b50565b600081359050613c8081613c5a565b92915050565b600060208284031215613c9c57613c9b6139f8565b5b6000613caa84828501613c71565b91505092915050565b613cbc81613add565b82525050565b6000602082019050613cd76000830184613cb3565b92915050565b60008060408385031215613cf457613cf36139f8565b5b6000613d0285828601613b06565b9250506020613d1385828601613c71565b9150509250929050565b600080600060608486031215613d3657613d356139f8565b5b6000613d4486828701613b06565b9350506020613d5586828701613b06565b9250506040613d6686828701613c71565b9150509250925092565b60008060408385031215613d8757613d866139f8565b5b6000613d9585828601613c71565b9250506020613da685828601613c71565b9150509250929050565b6000604082019050613dc56000830185613cb3565b613dd260208301846139c4565b9392505050565b6000819050919050565b613dec81613dd9565b82525050565b6000602082019050613e076000830184613de3565b92915050565b600060208284031215613e2357613e226139f8565b5b6000613e3184828501613b06565b91505092915050565b60008060408385031215613e5157613e506139f8565b5b6000613e5f85828601613c71565b9250506020613e7085828601613b06565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613ebc82613bee565b810181811067ffffffffffffffff82111715613edb57613eda613e84565b5b80604052505050565b6000613eee6139ee565b9050613efa8282613eb3565b919050565b600067ffffffffffffffff821115613f1a57613f19613e84565b5b613f2382613bee565b9050602081019050919050565b82818337600083830152505050565b6000613f52613f4d84613eff565b613ee4565b905082815260208101848484011115613f6e57613f6d613e7f565b5b613f79848285613f30565b509392505050565b600082601f830112613f9657613f95613e7a565b5b8135613fa6848260208601613f3f565b91505092915050565b600060208284031215613fc557613fc46139f8565b5b600082013567ffffffffffffffff811115613fe357613fe26139fd565b5b613fef84828501613f81565b91505092915050565b600060ff82169050919050565b61400e81613ff8565b811461401957600080fd5b50565b60008135905061402b81614005565b92915050565b600060208284031215614047576140466139f8565b5b60006140558482850161401c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061409e5761409d61405e565b5b50565b60008190506140af8261408d565b919050565b60006140bf826140a1565b9050919050565b6140cf816140b4565b82525050565b60006020820190506140ea60008301846140c6565b92915050565b6140f981613dd9565b811461410457600080fd5b50565b600081359050614116816140f0565b92915050565b600060208284031215614132576141316139f8565b5b600061414084828501614107565b91505092915050565b61415281613a87565b811461415d57600080fd5b50565b60008135905061416f81614149565b92915050565b6000806040838503121561418c5761418b6139f8565b5b600061419a85828601613b06565b92505060206141ab85828601614160565b9150509250929050565b600067ffffffffffffffff8211156141d0576141cf613e84565b5b6141d982613bee565b9050602081019050919050565b60006141f96141f4846141b5565b613ee4565b90508281526020810184848401111561421557614214613e7f565b5b614220848285613f30565b509392505050565b600082601f83011261423d5761423c613e7a565b5b813561424d8482602086016141e6565b91505092915050565b600080600080608085870312156142705761426f6139f8565b5b600061427e87828801613b06565b945050602061428f87828801613b06565b93505060406142a087828801613c71565b925050606085013567ffffffffffffffff8111156142c1576142c06139fd565b5b6142cd87828801614228565b91505092959194509250565b600080fd5b600080fd5b60008083601f8401126142f9576142f8613e7a565b5b8235905067ffffffffffffffff811115614316576143156142d9565b5b602083019150836020820283011115614332576143316142de565b5b9250929050565b600080600060408486031215614352576143516139f8565b5b600061436086828701613c71565b935050602084013567ffffffffffffffff811115614381576143806139fd565b5b61438d868287016142e3565b92509250509250925092565b600080604083850312156143b0576143af6139f8565b5b60006143be85828601613b06565b92505060206143cf85828601613b06565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061440f602083613baa565b915061441a826143d9565b602082019050919050565b6000602082019050818103600083015261443e81614402565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061448c57607f821691505b60208210810361449f5761449e614445565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006144df826139ba565b91506144ea836139ba565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614523576145226144a5565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614568826139ba565b9150614573836139ba565b9250826145835761458261452e565b5b828204905092915050565b6000614599826139ba565b91506145a4836139ba565b9250828210156145b7576145b66144a5565b5b828203905092915050565b60006145cd826139ba565b91506145d8836139ba565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561460d5761460c6144a5565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614652826139ba565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614684576146836144a5565b5b600182019050919050565b60008160601b9050919050565b60006146a78261468f565b9050919050565b60006146b98261469c565b9050919050565b6146d16146cc82613add565b6146ae565b82525050565b60006146e382846146c0565b60148201915081905092915050565b600081905092915050565b600061470882613b9f565b61471281856146f2565b9350614722818560208601613bbb565b80840191505092915050565b600061473a82856146fd565b915061474682846146fd565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006147ae602683613baa565b91506147b982614752565b604082019050919050565b600060208201905081810360008301526147dd816147a1565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000614840602a83613baa565b915061484b826147e4565b604082019050919050565b6000602082019050818103600083015261486f81614833565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006148ac601983613baa565b91506148b782614876565b602082019050919050565b600060208201905081810360008301526148db8161489f565b9050919050565b600081905092915050565b50565b60006148fd6000836148e2565b9150614908826148ed565b600082019050919050565b600061491e826148f0565b9150819050919050565b600081519050919050565b600082825260208201905092915050565b600061494f82614928565b6149598185614933565b9350614969818560208601613bbb565b61497281613bee565b840191505092915050565b60006080820190506149926000830187613cb3565b61499f6020830186613cb3565b6149ac60408301856139c4565b81810360608301526149be8184614944565b905095945050505050565b6000815190506149d881613a2e565b92915050565b6000602082840312156149f4576149f36139f8565b5b6000614a02848285016149c9565b91505092915050565b6000614a16826139ba565b9150614a21836139ba565b925082614a3157614a3061452e565b5b82820690509291505056fea26469706673582212201f60120ac0fb62e0d36010cc650e8437465a430d5b9e50bb0f7378cf4eeacc4364736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c5468654368696e614e46547300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002434e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f68747470733a2f2f6170692e7468656368696e616e6674732e636f6d2f682f00
-----Decoded View---------------
Arg [0] : _name (string): TheChinaNFTs
Arg [1] : _symbol (string): CN
Arg [2] : _baseUri (string): https://api.thechinanfts.com/h/
Arg [3] : _royaltyAmount (uint96): 8
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [5] : 5468654368696e614e4654730000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [7] : 434e000000000000000000000000000000000000000000000000000000000000
Arg [8] : 000000000000000000000000000000000000000000000000000000000000001f
Arg [9] : 68747470733a2f2f6170692e7468656368696e616e6674732e636f6d2f682f00
Deployed Bytecode Sourcemap
52890:4702:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52985:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57385:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57207:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53260:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27652:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29155:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28718:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56510:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53110:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23788:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30020:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47557:494;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;53728:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53478:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55986:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55763:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56174:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56939:260;;;;;;;;;;;;;:::i;:::-;;30261:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53540:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53029:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53067:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53155:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55553:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55875:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53388:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27460:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24908:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44016:103;;;;;;;;;;;;;:::i;:::-;;56638:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43365:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55665:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27821:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52948:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54106:493;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29431:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53207:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30517:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56278:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54607:707;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27996:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53442:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53672:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56392:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29789:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44274:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52985:37;;;;:::o;57385:204::-;57516:4;57545:36;57569:11;57545:23;:36::i;:::-;57538:43;;57385:204;;;:::o;57207:170::-;43596:12;:10;:12::i;:::-;43585:23;;:7;:5;:7::i;:::-;:23;;;43577:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57325:44:::1;57344:8;57354:14;57325:18;:44::i;:::-;57207:170:::0;;:::o;53260:39::-;;;:::o;27652:100::-;27706:13;27739:5;27732:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27652:100;:::o;29155:204::-;29223:7;29248:16;29256:7;29248;:16::i;:::-;29243:64;;29273:34;;;;;;;;;;;;;;29243:64;29327:15;:24;29343:7;29327:24;;;;;;;;;;;;;;;;;;;;;29320:31;;29155:204;;;:::o;28718:371::-;28791:13;28807:24;28823:7;28807:15;:24::i;:::-;28791:40;;28852:5;28846:11;;:2;:11;;;28842:48;;28866:24;;;;;;;;;;;;;;28842:48;28923:5;28907:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;28933:37;28950:5;28957:12;:10;:12::i;:::-;28933:16;:37::i;:::-;28932:38;28907:63;28903:138;;;28994:35;;;;;;;;;;;;;;28903:138;29053:28;29062:2;29066:7;29075:5;29053:8;:28::i;:::-;28780:309;28718:371;;:::o;56510:120::-;43596:12;:10;:12::i;:::-;43585:23;;:7;:5;:7::i;:::-;:23;;;43577:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56618:4:::1;56591:24;:31;;;;56510:120:::0;:::o;53110:38::-;;;;:::o;23788:303::-;23832:7;24057:15;:13;:15::i;:::-;24042:12;;24026:13;;:28;:46;24019:53;;23788:303;:::o;30020:170::-;30154:28;30164:4;30170:2;30174:7;30154:9;:28::i;:::-;30020:170;;;:::o;47557:494::-;47701:7;47710;47735:26;47764:17;:27;47782:8;47764:27;;;;;;;;;;;47735:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47836:1;47808:30;;:7;:16;;;:30;;;47804:92;;47865:19;47855:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47804:92;47908:21;47973:17;:15;:17::i;:::-;47932:58;;47946:7;:23;;;47933:36;;:10;:36;;;;:::i;:::-;47932:58;;;;:::i;:::-;47908:82;;48011:7;:16;;;48029:13;48003:40;;;;;;47557:494;;;;;:::o;53728:94::-;;;;:::o;53478:53::-;;;;;;;;;;;;;;;;;:::o;55986:180::-;43596:12;:10;:12::i;:::-;43585:23;;:7;:5;:7::i;:::-;:23;;;43577:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56098:6:::1;56093:1;56087:3;:7;;;;:::i;:::-;56070:13;;:25;;;;:::i;:::-;:34;56066:56;;;56113:9;;;;;;;;;;;;;;56066:56;56133:25;56143:9;56154:3;56133:9;:25::i;:::-;55986:180:::0;;:::o;55763:104::-;43596:12;:10;:12::i;:::-;43585:23;;:7;:5;:7::i;:::-;:23;;;43577:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55851:8:::1;55836:12;:23;;;;55763:104:::0;:::o;56174:96::-;43596:12;:10;:12::i;:::-;43585:23;;:7;:5;:7::i;:::-;:23;;;43577:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56258:4:::1;56243:12;:19;;;;56174:96:::0;:::o;56939:260::-;43596:12;:10;:12::i;:::-;43585:23;;:7;:5;:7::i;:::-;:23;;;43577:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56989:15:::1;57007:21;56989:39;;57046:9;57041:151;57061:17;:24;;;;57057:1;:28;57041:151;;;57107:73;57117:17;57135:1;57117:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;57176:3;57150:19;57170:1;57150:22;;;;;;;;:::i;:::-;;;;;;;;;;57140:7;:32;;;;:::i;:::-;57139:40;;;;:::i;:::-;57107:9;:73::i;:::-;57087:3;;;;;:::i;:::-;;;;57041:151;;;;56978:221;56939:260::o:0;30261:185::-;30399:39;30416:4;30422:2;30426:7;30399:39;;;;;;;;;;;;:16;:39::i;:::-;30261:185;;;:::o;53540:125::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53029:31::-;;;;:::o;53067:36::-;;;;:::o;53155:43::-;;;;:::o;55553:104::-;43596:12;:10;:12::i;:::-;43585:23;;:7;:5;:7::i;:::-;:23;;;43577:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55642:7:::1;55626:13;:23;;;;;;;;;;;;:::i;:::-;;55553:104:::0;:::o;55875:103::-;43596:12;:10;:12::i;:::-;43585:23;;:7;:5;:7::i;:::-;:23;;;43577:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55963:6:::1;55953:17;;;;;;;;;;:::i;:::-;;55941:9;;:29;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;55875:103:::0;:::o;53388:45::-;;;;;;;;;;;;;:::o;27460:125::-;27524:7;27551:21;27564:7;27551:12;:21::i;:::-;:26;;;27544:33;;27460:125;;;:::o;24908:206::-;24972:7;25013:1;24996:19;;:5;:19;;;24992:60;;25024:28;;;;;;;;;;;;;;24992:60;25078:12;:19;25091:5;25078:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;25070:36;;25063:43;;24908:206;;;:::o;44016:103::-;43596:12;:10;:12::i;:::-;43585:23;;:7;:5;:7::i;:::-;:23;;;43577:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44081:30:::1;44108:1;44081:18;:30::i;:::-;44016:103::o:0;56638:104::-;43596:12;:10;:12::i;:::-;43585:23;;:7;:5;:7::i;:::-;:23;;;43577:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56723:11:::1;56710:10;:24;;;;56638:104:::0;:::o;43365:87::-;43411:7;43438:6;;;;;;;;;;;43431:13;;43365:87;:::o;55665:90::-;43596:12;:10;:12::i;:::-;43585:23;;:7;:5;:7::i;:::-;:23;;;43577:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55739:8:::1;55731:5;:16;;;;55665:90:::0;:::o;27821:104::-;27877:13;27910:7;27903:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27821:104;:::o;52948:30::-;;;;:::o;54106:493::-;54178:14;54165:27;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:27;;;;;;;;:::i;:::-;;;54161:54;;54201:14;;;;;;;;;;;;;;54161:54;54258:6;54253:1;54247:3;:7;;;;:::i;:::-;54230:13;;:25;;;;:::i;:::-;:34;54226:56;;;54273:9;;;;;;;;;;;;;;54226:56;54318:3;54310:5;;:11;;;;:::i;:::-;54297:9;:24;54293:51;;54330:14;;;;;;;;;;;;;;54293:51;54400:12;;54394:3;54361:18;:30;54380:10;54361:30;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:51;54357:81;;;54421:17;;;;;;;;;;;;;;54357:81;54459:17;;54453:3;:23;54449:53;;;54485:17;;;;;;;;;;;;;;54449:53;54515:26;54525:10;54537:3;54515:9;:26::i;:::-;54588:3;54554:18;:30;54573:10;54554:30;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;54106:493;:::o;29431:287::-;29542:12;:10;:12::i;:::-;29530:24;;:8;:24;;;29526:54;;29563:17;;;;;;;;;;;;;;29526:54;29638:8;29593:18;:32;29612:12;:10;:12::i;:::-;29593:32;;;;;;;;;;;;;;;:42;29626:8;29593:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29691:8;29662:48;;29677:12;:10;:12::i;:::-;29662:48;;;29701:8;29662:48;;;;;;:::i;:::-;;;;;;;;29431:287;;:::o;53207:46::-;;;:::o;30517:369::-;30684:28;30694:4;30700:2;30704:7;30684:9;:28::i;:::-;30727:15;:2;:13;;;:15::i;:::-;:76;;;;;30747:56;30778:4;30784:2;30788:7;30797:5;30747:30;:56::i;:::-;30746:57;30727:76;30723:156;;;30827:40;;;;;;;;;;;;;;30723:156;30517:369;;;;:::o;56278:106::-;43596:12;:10;:12::i;:::-;43585:23;;:7;:5;:7::i;:::-;:23;;;43577:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56372:4:::1;56352:17;:24;;;;56278:106:::0;:::o;54607:707::-;54714:17;54701:30;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:30;;;;;;;;:::i;:::-;;;54697:57;;54740:14;;;;;;;;;;;;;;54697:57;54797:13;54792:1;54786:3;:7;;;;:::i;:::-;54769:13;;:25;;;;:::i;:::-;:41;54765:63;;;54819:9;;;;;;;;;;;;;;54765:63;54871:3;54856:12;;:18;;;;:::i;:::-;54843:9;:31;54839:58;;54883:14;;;;;;;;;;;;;;54839:58;54915:84;54934:11;;54915:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54947:10;;54986;54969:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;54959:39;;;;;;54915:18;:84::i;:::-;54910:138;;55022:14;;;;;;;;;;;;;;54910:138;55101:19;;55095:3;55062:18;:30;55081:10;55062:30;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:58;55058:88;;;55129:17;;;;;;;;;;;;;;55058:88;55167:24;;55161:3;:30;55157:60;;;55200:17;;;;;;;;;;;;;;55157:60;55230:26;55240:10;55252:3;55230:9;:26::i;:::-;55303:3;55269:18;:30;55288:10;55269:30;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;54607:707;;;:::o;27996:318::-;28069:13;28100:16;28108:7;28100;:16::i;:::-;28095:59;;28125:29;;;;;;;;;;;;;;28095:59;28167:21;28191:10;:8;:10::i;:::-;28167:34;;28244:1;28225:7;28219:21;:26;:87;;;;;;;;;;;;;;;;;28272:7;28281:18;:7;:16;:18::i;:::-;28255:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28219:87;28212:94;;;27996:318;;;:::o;53442:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53672:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56392:110::-;43596:12;:10;:12::i;:::-;43585:23;;:7;:5;:7::i;:::-;:23;;;43577:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56490:4:::1;56468:19;:26;;;;56392:110:::0;:::o;29789:164::-;29886:4;29910:18;:25;29929:5;29910:25;;;;;;;;;;;;;;;:35;29936:8;29910:35;;;;;;;;;;;;;;;;;;;;;;;;;29903:42;;29789:164;;;;:::o;44274:201::-;43596:12;:10;:12::i;:::-;43585:23;;:7;:5;:7::i;:::-;:23;;;43577:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44383:1:::1;44363:22;;:8;:22;;::::0;44355:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;44439:28;44458:8;44439:18;:28::i;:::-;44274:201:::0;:::o;47287:215::-;47389:4;47428:26;47413:41;;;:11;:41;;;;:81;;;;47458:36;47482:11;47458:23;:36::i;:::-;47413:81;47406:88;;47287:215;;;:::o;16882:98::-;16935:7;16962:10;16955:17;;16882:98;:::o;48701:332::-;48820:17;:15;:17::i;:::-;48804:33;;:12;:33;;;;48796:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;48923:1;48903:22;;:8;:22;;;48895:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;48990:35;;;;;;;;49002:8;48990:35;;;;;;49012:12;48990:35;;;;;48968:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48701:332;;:::o;31141:187::-;31198:4;31241:7;31222:15;:13;:15::i;:::-;:26;;:53;;;;;31262:13;;31252:7;:23;31222:53;:98;;;;;31293:11;:20;31305:7;31293:20;;;;;;;;;;;:27;;;;;;;;;;;;31292:28;31222:98;31215:105;;31141:187;;;:::o;39311:196::-;39453:2;39426:15;:24;39442:7;39426:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39491:7;39487:2;39471:28;;39480:5;39471:28;;;;;;;;;;;;39311:196;;;:::o;55322:101::-;55387:7;55414:1;55407:8;;55322:101;:::o;34254:2130::-;34369:35;34407:21;34420:7;34407:12;:21::i;:::-;34369:59;;34467:4;34445:26;;:13;:18;;;:26;;;34441:67;;34480:28;;;;;;;;;;;;;;34441:67;34521:22;34563:4;34547:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;34584:36;34601:4;34607:12;:10;:12::i;:::-;34584:16;:36::i;:::-;34547:73;:126;;;;34661:12;:10;:12::i;:::-;34637:36;;:20;34649:7;34637:11;:20::i;:::-;:36;;;34547:126;34521:153;;34692:17;34687:66;;34718:35;;;;;;;;;;;;;;34687:66;34782:1;34768:16;;:2;:16;;;34764:52;;34793:23;;;;;;;;;;;;;;34764:52;34829:43;34851:4;34857:2;34861:7;34870:1;34829:21;:43::i;:::-;34937:35;34954:1;34958:7;34967:4;34937:8;:35::i;:::-;35298:1;35268:12;:18;35281:4;35268:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35342:1;35314:12;:16;35327:2;35314:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35360:31;35394:11;:20;35406:7;35394:20;;;;;;;;;;;35360:54;;35445:2;35429:8;:13;;;:18;;;;;;;;;;;;;;;;;;35495:15;35462:8;:23;;;:49;;;;;;;;;;;;;;;;;;35763:19;35795:1;35785:7;:11;35763:33;;35811:31;35845:11;:24;35857:11;35845:24;;;;;;;;;;;35811:58;;35913:1;35888:27;;:8;:13;;;;;;;;;;;;:27;;;35884:384;;36098:13;;36083:11;:28;36079:174;;36152:4;36136:8;:13;;;:20;;;;;;;;;;;;;;;;;;36205:13;:28;;;36179:8;:23;;;:54;;;;;;;;;;;;;;;;;;36079:174;35884:384;35243:1036;;;36315:7;36311:2;36296:27;;36305:4;36296:27;;;;;;;;;;;;36334:42;36355:4;36361:2;36365:7;36374:1;36334:20;:42::i;:::-;34358:2026;;34254:2130;;;:::o;48333:97::-;48391:6;48417:5;48410:12;;48333:97;:::o;31336:104::-;31405:27;31415:2;31419:8;31405:27;;;;;;;;;;;;:9;:27::i;:::-;31336:104;;:::o;56750:181::-;56824:12;56842:8;:13;;56863:7;56842:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56823:52;;;56891:7;56886:37;;56907:16;;;;;;;;;;;;;;56886:37;56812:119;56750:181;;:::o;26289:1109::-;26351:21;;:::i;:::-;26385:12;26400:7;26385:22;;26468:4;26449:15;:13;:15::i;:::-;:23;;:47;;;;;26483:13;;26476:4;:20;26449:47;26445:886;;;26517:31;26551:11;:17;26563:4;26551:17;;;;;;;;;;;26517:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26592:9;:16;;;26587:729;;26663:1;26637:28;;:9;:14;;;:28;;;26633:101;;26701:9;26694:16;;;;;;26633:101;27036:261;27043:4;27036:261;;;27076:6;;;;;;;;27121:11;:17;27133:4;27121:17;;;;;;;;;;;27109:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27195:1;27169:28;;:9;:14;;;:28;;;27165:109;;27237:9;27230:16;;;;;;27165:109;27036:261;;;26587:729;26498:833;26445:886;27359:31;;;;;;;;;;;;;;26289:1109;;;;:::o;44635:191::-;44709:16;44728:6;;;;;;;;;;;44709:25;;44754:8;44745:6;;:17;;;;;;;;;;;;;;;;;;44809:8;44778:40;;44799:8;44778:40;;;;;;;;;;;;44698:128;44635:191;:::o;8925:326::-;8985:4;9242:1;9220:7;:19;;;:23;9213:30;;8925:326;;;:::o;39999:667::-;40162:4;40199:2;40183:36;;;40220:12;:10;:12::i;:::-;40234:4;40240:7;40249:5;40183:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40179:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40434:1;40417:6;:13;:18;40413:235;;40463:40;;;;;;;;;;;;;;40413:235;40606:6;40600:13;40591:6;40587:2;40583:15;40576:38;40179:480;40312:45;;;40302:55;;;:6;:55;;;;40295:62;;;39999:667;;;;;;:::o;51081:190::-;51206:4;51259;51230:25;51243:5;51250:4;51230:12;:25::i;:::-;:33;51223:40;;51081:190;;;;;:::o;55431:114::-;55491:13;55524;55517:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55431:114;:::o;17469:723::-;17525:13;17755:1;17746:5;:10;17742:53;;17773:10;;;;;;;;;;;;;;;;;;;;;17742:53;17805:12;17820:5;17805:20;;17836:14;17861:78;17876:1;17868:4;:9;17861:78;;17894:8;;;;;:::i;:::-;;;;17925:2;17917:10;;;;;:::i;:::-;;;17861:78;;;17949:19;17981:6;17971:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17949:39;;17999:154;18015:1;18006:5;:10;17999:154;;18043:1;18033:11;;;;;:::i;:::-;;;18110:2;18102:5;:10;;;;:::i;:::-;18089:2;:24;;;;:::i;:::-;18076:39;;18059:6;18066;18059:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18139:2;18130:11;;;;;:::i;:::-;;;17999:154;;;18177:6;18163:21;;;;;17469:723;;;;:::o;24539:305::-;24641:4;24693:25;24678:40;;;:11;:40;;;;:105;;;;24750:33;24735:48;;;:11;:48;;;;24678:105;:158;;;;24800:36;24824:11;24800:23;:36::i;:::-;24678:158;24658:178;;24539:305;;;:::o;41314:159::-;;;;;:::o;42132:158::-;;;;;:::o;31803:163::-;31926:32;31932:2;31936:8;31946:5;31953:4;31926:5;:32::i;:::-;31803:163;;;:::o;51633:675::-;51716:7;51736:20;51759:4;51736:27;;51779:9;51774:497;51798:5;:12;51794:1;:16;51774:497;;;51832:20;51855:5;51861:1;51855:8;;;;;;;;:::i;:::-;;;;;;;;51832:31;;51898:12;51882;:28;51878:382;;52025:42;52040:12;52054;52025:14;:42::i;:::-;52010:57;;51878:382;;;52202:42;52217:12;52231;52202:14;:42::i;:::-;52187:57;;51878:382;51817:454;51812:3;;;;;:::i;:::-;;;;51774:497;;;;52288:12;52281:19;;;51633:675;;;;:::o;20099:157::-;20184:4;20223:25;20208:40;;;:11;:40;;;;20201:47;;20099:157;;;:::o;32225:1775::-;32364:20;32387:13;;32364:36;;32429:1;32415:16;;:2;:16;;;32411:48;;32440:19;;;;;;;;;;;;;;32411:48;32486:1;32474:8;:13;32470:44;;32496:18;;;;;;;;;;;;;;32470:44;32527:61;32557:1;32561:2;32565:12;32579:8;32527:21;:61::i;:::-;32900:8;32865:12;:16;32878:2;32865:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32964:8;32924:12;:16;32937:2;32924:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33023:2;32990:11;:25;33002:12;32990:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;33090:15;33040:11;:25;33052:12;33040:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;33123:20;33146:12;33123:35;;33173:11;33202:8;33187:12;:23;33173:37;;33231:4;:23;;;;;33239:15;:2;:13;;;:15::i;:::-;33231:23;33227:641;;;33275:314;33331:12;33327:2;33306:38;;33323:1;33306:38;;;;;;;;;;;;33372:69;33411:1;33415:2;33419:14;;;;;;33435:5;33372:30;:69::i;:::-;33367:174;;33477:40;;;;;;;;;;;;;;33367:174;33584:3;33568:12;:19;33275:314;;33670:12;33653:13;;:29;33649:43;;33684:8;;;33649:43;33227:641;;;33733:120;33789:14;;;;;;33785:2;33764:40;;33781:1;33764:40;;;;;;;;;;;;33848:3;33832:12;:19;33733:120;;33227:641;33898:12;33882:13;:28;;;;32840:1082;;33932:60;33961:1;33965:2;33969:12;33983:8;33932:20;:60::i;:::-;32353:1647;32225:1775;;;;:::o;52316:224::-;52384:13;52447:1;52441:4;52434:15;52476:1;52470:4;52463:15;52517:4;52511;52501:21;52492:30;;52316:224;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:75::-;475:6;508:2;502:9;492:19;;442:75;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:149;805:7;845:66;838:5;834:78;823:89;;769:149;;;:::o;924:120::-;996:23;1013:5;996:23;:::i;:::-;989:5;986:34;976:62;;1034:1;1031;1024:12;976:62;924:120;:::o;1050:137::-;1095:5;1133:6;1120:20;1111:29;;1149:32;1175:5;1149:32;:::i;:::-;1050:137;;;;:::o;1193:327::-;1251:6;1300:2;1288:9;1279:7;1275:23;1271:32;1268:119;;;1306:79;;:::i;:::-;1268:119;1426:1;1451:52;1495:7;1486:6;1475:9;1471:22;1451:52;:::i;:::-;1441:62;;1397:116;1193:327;;;;:::o;1526:90::-;1560:7;1603:5;1596:13;1589:21;1578:32;;1526:90;;;:::o;1622:109::-;1703:21;1718:5;1703:21;:::i;:::-;1698:3;1691:34;1622:109;;:::o;1737:210::-;1824:4;1862:2;1851:9;1847:18;1839:26;;1875:65;1937:1;1926:9;1922:17;1913:6;1875:65;:::i;:::-;1737:210;;;;:::o;1953:126::-;1990:7;2030:42;2023:5;2019:54;2008:65;;1953:126;;;:::o;2085:96::-;2122:7;2151:24;2169:5;2151:24;:::i;:::-;2140:35;;2085:96;;;:::o;2187:122::-;2260:24;2278:5;2260:24;:::i;:::-;2253:5;2250:35;2240:63;;2299:1;2296;2289:12;2240:63;2187:122;:::o;2315:139::-;2361:5;2399:6;2386:20;2377:29;;2415:33;2442:5;2415:33;:::i;:::-;2315:139;;;;:::o;2460:109::-;2496:7;2536:26;2529:5;2525:38;2514:49;;2460:109;;;:::o;2575:120::-;2647:23;2664:5;2647:23;:::i;:::-;2640:5;2637:34;2627:62;;2685:1;2682;2675:12;2627:62;2575:120;:::o;2701:137::-;2746:5;2784:6;2771:20;2762:29;;2800:32;2826:5;2800:32;:::i;:::-;2701:137;;;;:::o;2844:472::-;2911:6;2919;2968:2;2956:9;2947:7;2943:23;2939:32;2936:119;;;2974:79;;:::i;:::-;2936:119;3094:1;3119:53;3164:7;3155:6;3144:9;3140:22;3119:53;:::i;:::-;3109:63;;3065:117;3221:2;3247:52;3291:7;3282:6;3271:9;3267:22;3247:52;:::i;:::-;3237:62;;3192:117;2844:472;;;;;:::o;3322:99::-;3374:6;3408:5;3402:12;3392:22;;3322:99;;;:::o;3427:169::-;3511:11;3545:6;3540:3;3533:19;3585:4;3580:3;3576:14;3561:29;;3427:169;;;;:::o;3602:307::-;3670:1;3680:113;3694:6;3691:1;3688:13;3680:113;;;3779:1;3774:3;3770:11;3764:18;3760:1;3755:3;3751:11;3744:39;3716:2;3713:1;3709:10;3704:15;;3680:113;;;3811:6;3808:1;3805:13;3802:101;;;3891:1;3882:6;3877:3;3873:16;3866:27;3802:101;3651:258;3602:307;;;:::o;3915:102::-;3956:6;4007:2;4003:7;3998:2;3991:5;3987:14;3983:28;3973:38;;3915:102;;;:::o;4023:364::-;4111:3;4139:39;4172:5;4139:39;:::i;:::-;4194:71;4258:6;4253:3;4194:71;:::i;:::-;4187:78;;4274:52;4319:6;4314:3;4307:4;4300:5;4296:16;4274:52;:::i;:::-;4351:29;4373:6;4351:29;:::i;:::-;4346:3;4342:39;4335:46;;4115:272;4023:364;;;;:::o;4393:313::-;4506:4;4544:2;4533:9;4529:18;4521:26;;4593:9;4587:4;4583:20;4579:1;4568:9;4564:17;4557:47;4621:78;4694:4;4685:6;4621:78;:::i;:::-;4613:86;;4393:313;;;;:::o;4712:122::-;4785:24;4803:5;4785:24;:::i;:::-;4778:5;4775:35;4765:63;;4824:1;4821;4814:12;4765:63;4712:122;:::o;4840:139::-;4886:5;4924:6;4911:20;4902:29;;4940:33;4967:5;4940:33;:::i;:::-;4840:139;;;;:::o;4985:329::-;5044:6;5093:2;5081:9;5072:7;5068:23;5064:32;5061:119;;;5099:79;;:::i;:::-;5061:119;5219:1;5244:53;5289:7;5280:6;5269:9;5265:22;5244:53;:::i;:::-;5234:63;;5190:117;4985:329;;;;:::o;5320:118::-;5407:24;5425:5;5407:24;:::i;:::-;5402:3;5395:37;5320:118;;:::o;5444:222::-;5537:4;5575:2;5564:9;5560:18;5552:26;;5588:71;5656:1;5645:9;5641:17;5632:6;5588:71;:::i;:::-;5444:222;;;;:::o;5672:474::-;5740:6;5748;5797:2;5785:9;5776:7;5772:23;5768:32;5765:119;;;5803:79;;:::i;:::-;5765:119;5923:1;5948:53;5993:7;5984:6;5973:9;5969:22;5948:53;:::i;:::-;5938:63;;5894:117;6050:2;6076:53;6121:7;6112:6;6101:9;6097:22;6076:53;:::i;:::-;6066:63;;6021:118;5672:474;;;;;:::o;6152:619::-;6229:6;6237;6245;6294:2;6282:9;6273:7;6269:23;6265:32;6262:119;;;6300:79;;:::i;:::-;6262:119;6420:1;6445:53;6490:7;6481:6;6470:9;6466:22;6445:53;:::i;:::-;6435:63;;6391:117;6547:2;6573:53;6618:7;6609:6;6598:9;6594:22;6573:53;:::i;:::-;6563:63;;6518:118;6675:2;6701:53;6746:7;6737:6;6726:9;6722:22;6701:53;:::i;:::-;6691:63;;6646:118;6152:619;;;;;:::o;6777:474::-;6845:6;6853;6902:2;6890:9;6881:7;6877:23;6873:32;6870:119;;;6908:79;;:::i;:::-;6870:119;7028:1;7053:53;7098:7;7089:6;7078:9;7074:22;7053:53;:::i;:::-;7043:63;;6999:117;7155:2;7181:53;7226:7;7217:6;7206:9;7202:22;7181:53;:::i;:::-;7171:63;;7126:118;6777:474;;;;;:::o;7257:332::-;7378:4;7416:2;7405:9;7401:18;7393:26;;7429:71;7497:1;7486:9;7482:17;7473:6;7429:71;:::i;:::-;7510:72;7578:2;7567:9;7563:18;7554:6;7510:72;:::i;:::-;7257:332;;;;;:::o;7595:77::-;7632:7;7661:5;7650:16;;7595:77;;;:::o;7678:118::-;7765:24;7783:5;7765:24;:::i;:::-;7760:3;7753:37;7678:118;;:::o;7802:222::-;7895:4;7933:2;7922:9;7918:18;7910:26;;7946:71;8014:1;8003:9;7999:17;7990:6;7946:71;:::i;:::-;7802:222;;;;:::o;8030:329::-;8089:6;8138:2;8126:9;8117:7;8113:23;8109:32;8106:119;;;8144:79;;:::i;:::-;8106:119;8264:1;8289:53;8334:7;8325:6;8314:9;8310:22;8289:53;:::i;:::-;8279:63;;8235:117;8030:329;;;;:::o;8365:474::-;8433:6;8441;8490:2;8478:9;8469:7;8465:23;8461:32;8458:119;;;8496:79;;:::i;:::-;8458:119;8616:1;8641:53;8686:7;8677:6;8666:9;8662:22;8641:53;:::i;:::-;8631:63;;8587:117;8743:2;8769:53;8814:7;8805:6;8794:9;8790:22;8769:53;:::i;:::-;8759:63;;8714:118;8365:474;;;;;:::o;8845:117::-;8954:1;8951;8944:12;8968:117;9077:1;9074;9067:12;9091:180;9139:77;9136:1;9129:88;9236:4;9233:1;9226:15;9260:4;9257:1;9250:15;9277:281;9360:27;9382:4;9360:27;:::i;:::-;9352:6;9348:40;9490:6;9478:10;9475:22;9454:18;9442:10;9439:34;9436:62;9433:88;;;9501:18;;:::i;:::-;9433:88;9541:10;9537:2;9530:22;9320:238;9277:281;;:::o;9564:129::-;9598:6;9625:20;;:::i;:::-;9615:30;;9654:33;9682:4;9674:6;9654:33;:::i;:::-;9564:129;;;:::o;9699:308::-;9761:4;9851:18;9843:6;9840:30;9837:56;;;9873:18;;:::i;:::-;9837:56;9911:29;9933:6;9911:29;:::i;:::-;9903:37;;9995:4;9989;9985:15;9977:23;;9699:308;;;:::o;10013:154::-;10097:6;10092:3;10087;10074:30;10159:1;10150:6;10145:3;10141:16;10134:27;10013:154;;;:::o;10173:412::-;10251:5;10276:66;10292:49;10334:6;10292:49;:::i;:::-;10276:66;:::i;:::-;10267:75;;10365:6;10358:5;10351:21;10403:4;10396:5;10392:16;10441:3;10432:6;10427:3;10423:16;10420:25;10417:112;;;10448:79;;:::i;:::-;10417:112;10538:41;10572:6;10567:3;10562;10538:41;:::i;:::-;10257:328;10173:412;;;;;:::o;10605:340::-;10661:5;10710:3;10703:4;10695:6;10691:17;10687:27;10677:122;;10718:79;;:::i;:::-;10677:122;10835:6;10822:20;10860:79;10935:3;10927:6;10920:4;10912:6;10908:17;10860:79;:::i;:::-;10851:88;;10667:278;10605:340;;;;:::o;10951:509::-;11020:6;11069:2;11057:9;11048:7;11044:23;11040:32;11037:119;;;11075:79;;:::i;:::-;11037:119;11223:1;11212:9;11208:17;11195:31;11253:18;11245:6;11242:30;11239:117;;;11275:79;;:::i;:::-;11239:117;11380:63;11435:7;11426:6;11415:9;11411:22;11380:63;:::i;:::-;11370:73;;11166:287;10951:509;;;;:::o;11466:86::-;11501:7;11541:4;11534:5;11530:16;11519:27;;11466:86;;;:::o;11558:118::-;11629:22;11645:5;11629:22;:::i;:::-;11622:5;11619:33;11609:61;;11666:1;11663;11656:12;11609:61;11558:118;:::o;11682:135::-;11726:5;11764:6;11751:20;11742:29;;11780:31;11805:5;11780:31;:::i;:::-;11682:135;;;;:::o;11823:325::-;11880:6;11929:2;11917:9;11908:7;11904:23;11900:32;11897:119;;;11935:79;;:::i;:::-;11897:119;12055:1;12080:51;12123:7;12114:6;12103:9;12099:22;12080:51;:::i;:::-;12070:61;;12026:115;11823:325;;;;:::o;12154:180::-;12202:77;12199:1;12192:88;12299:4;12296:1;12289:15;12323:4;12320:1;12313:15;12340:119;12427:1;12420:5;12417:12;12407:46;;12433:18;;:::i;:::-;12407:46;12340:119;:::o;12465:139::-;12516:7;12545:5;12534:16;;12551:47;12592:5;12551:47;:::i;:::-;12465:139;;;:::o;12610:::-;12672:9;12705:38;12737:5;12705:38;:::i;:::-;12692:51;;12610:139;;;:::o;12755:155::-;12854:49;12897:5;12854:49;:::i;:::-;12849:3;12842:62;12755:155;;:::o;12916:246::-;13021:4;13059:2;13048:9;13044:18;13036:26;;13072:83;13152:1;13141:9;13137:17;13128:6;13072:83;:::i;:::-;12916:246;;;;:::o;13168:122::-;13241:24;13259:5;13241:24;:::i;:::-;13234:5;13231:35;13221:63;;13280:1;13277;13270:12;13221:63;13168:122;:::o;13296:139::-;13342:5;13380:6;13367:20;13358:29;;13396:33;13423:5;13396:33;:::i;:::-;13296:139;;;;:::o;13441:329::-;13500:6;13549:2;13537:9;13528:7;13524:23;13520:32;13517:119;;;13555:79;;:::i;:::-;13517:119;13675:1;13700:53;13745:7;13736:6;13725:9;13721:22;13700:53;:::i;:::-;13690:63;;13646:117;13441:329;;;;:::o;13776:116::-;13846:21;13861:5;13846:21;:::i;:::-;13839:5;13836:32;13826:60;;13882:1;13879;13872:12;13826:60;13776:116;:::o;13898:133::-;13941:5;13979:6;13966:20;13957:29;;13995:30;14019:5;13995:30;:::i;:::-;13898:133;;;;:::o;14037:468::-;14102:6;14110;14159:2;14147:9;14138:7;14134:23;14130:32;14127:119;;;14165:79;;:::i;:::-;14127:119;14285:1;14310:53;14355:7;14346:6;14335:9;14331:22;14310:53;:::i;:::-;14300:63;;14256:117;14412:2;14438:50;14480:7;14471:6;14460:9;14456:22;14438:50;:::i;:::-;14428:60;;14383:115;14037:468;;;;;:::o;14511:307::-;14572:4;14662:18;14654:6;14651:30;14648:56;;;14684:18;;:::i;:::-;14648:56;14722:29;14744:6;14722:29;:::i;:::-;14714:37;;14806:4;14800;14796:15;14788:23;;14511:307;;;:::o;14824:410::-;14901:5;14926:65;14942:48;14983:6;14942:48;:::i;:::-;14926:65;:::i;:::-;14917:74;;15014:6;15007:5;15000:21;15052:4;15045:5;15041:16;15090:3;15081:6;15076:3;15072:16;15069:25;15066:112;;;15097:79;;:::i;:::-;15066:112;15187:41;15221:6;15216:3;15211;15187:41;:::i;:::-;14907:327;14824:410;;;;;:::o;15253:338::-;15308:5;15357:3;15350:4;15342:6;15338:17;15334:27;15324:122;;15365:79;;:::i;:::-;15324:122;15482:6;15469:20;15507:78;15581:3;15573:6;15566:4;15558:6;15554:17;15507:78;:::i;:::-;15498:87;;15314:277;15253:338;;;;:::o;15597:943::-;15692:6;15700;15708;15716;15765:3;15753:9;15744:7;15740:23;15736:33;15733:120;;;15772:79;;:::i;:::-;15733:120;15892:1;15917:53;15962:7;15953:6;15942:9;15938:22;15917:53;:::i;:::-;15907:63;;15863:117;16019:2;16045:53;16090:7;16081:6;16070:9;16066:22;16045:53;:::i;:::-;16035:63;;15990:118;16147:2;16173:53;16218:7;16209:6;16198:9;16194:22;16173:53;:::i;:::-;16163:63;;16118:118;16303:2;16292:9;16288:18;16275:32;16334:18;16326:6;16323:30;16320:117;;;16356:79;;:::i;:::-;16320:117;16461:62;16515:7;16506:6;16495:9;16491:22;16461:62;:::i;:::-;16451:72;;16246:287;15597:943;;;;;;;:::o;16546:117::-;16655:1;16652;16645:12;16669:117;16778:1;16775;16768:12;16809:568;16882:8;16892:6;16942:3;16935:4;16927:6;16923:17;16919:27;16909:122;;16950:79;;:::i;:::-;16909:122;17063:6;17050:20;17040:30;;17093:18;17085:6;17082:30;17079:117;;;17115:79;;:::i;:::-;17079:117;17229:4;17221:6;17217:17;17205:29;;17283:3;17275:4;17267:6;17263:17;17253:8;17249:32;17246:41;17243:128;;;17290:79;;:::i;:::-;17243:128;16809:568;;;;;:::o;17383:704::-;17478:6;17486;17494;17543:2;17531:9;17522:7;17518:23;17514:32;17511:119;;;17549:79;;:::i;:::-;17511:119;17669:1;17694:53;17739:7;17730:6;17719:9;17715:22;17694:53;:::i;:::-;17684:63;;17640:117;17824:2;17813:9;17809:18;17796:32;17855:18;17847:6;17844:30;17841:117;;;17877:79;;:::i;:::-;17841:117;17990:80;18062:7;18053:6;18042:9;18038:22;17990:80;:::i;:::-;17972:98;;;;17767:313;17383:704;;;;;:::o;18093:474::-;18161:6;18169;18218:2;18206:9;18197:7;18193:23;18189:32;18186:119;;;18224:79;;:::i;:::-;18186:119;18344:1;18369:53;18414:7;18405:6;18394:9;18390:22;18369:53;:::i;:::-;18359:63;;18315:117;18471:2;18497:53;18542:7;18533:6;18522:9;18518:22;18497:53;:::i;:::-;18487:63;;18442:118;18093:474;;;;;:::o;18573:182::-;18713:34;18709:1;18701:6;18697:14;18690:58;18573:182;:::o;18761:366::-;18903:3;18924:67;18988:2;18983:3;18924:67;:::i;:::-;18917:74;;19000:93;19089:3;19000:93;:::i;:::-;19118:2;19113:3;19109:12;19102:19;;18761:366;;;:::o;19133:419::-;19299:4;19337:2;19326:9;19322:18;19314:26;;19386:9;19380:4;19376:20;19372:1;19361:9;19357:17;19350:47;19414:131;19540:4;19414:131;:::i;:::-;19406:139;;19133:419;;;:::o;19558:180::-;19606:77;19603:1;19596:88;19703:4;19700:1;19693:15;19727:4;19724:1;19717:15;19744:320;19788:6;19825:1;19819:4;19815:12;19805:22;;19872:1;19866:4;19862:12;19893:18;19883:81;;19949:4;19941:6;19937:17;19927:27;;19883:81;20011:2;20003:6;20000:14;19980:18;19977:38;19974:84;;20030:18;;:::i;:::-;19974:84;19795:269;19744:320;;;:::o;20070:180::-;20118:77;20115:1;20108:88;20215:4;20212:1;20205:15;20239:4;20236:1;20229:15;20256:348;20296:7;20319:20;20337:1;20319:20;:::i;:::-;20314:25;;20353:20;20371:1;20353:20;:::i;:::-;20348:25;;20541:1;20473:66;20469:74;20466:1;20463:81;20458:1;20451:9;20444:17;20440:105;20437:131;;;20548:18;;:::i;:::-;20437:131;20596:1;20593;20589:9;20578:20;;20256:348;;;;:::o;20610:180::-;20658:77;20655:1;20648:88;20755:4;20752:1;20745:15;20779:4;20776:1;20769:15;20796:185;20836:1;20853:20;20871:1;20853:20;:::i;:::-;20848:25;;20887:20;20905:1;20887:20;:::i;:::-;20882:25;;20926:1;20916:35;;20931:18;;:::i;:::-;20916:35;20973:1;20970;20966:9;20961:14;;20796:185;;;;:::o;20987:191::-;21027:4;21047:20;21065:1;21047:20;:::i;:::-;21042:25;;21081:20;21099:1;21081:20;:::i;:::-;21076:25;;21120:1;21117;21114:8;21111:34;;;21125:18;;:::i;:::-;21111:34;21170:1;21167;21163:9;21155:17;;20987:191;;;;:::o;21184:305::-;21224:3;21243:20;21261:1;21243:20;:::i;:::-;21238:25;;21277:20;21295:1;21277:20;:::i;:::-;21272:25;;21431:1;21363:66;21359:74;21356:1;21353:81;21350:107;;;21437:18;;:::i;:::-;21350:107;21481:1;21478;21474:9;21467:16;;21184:305;;;;:::o;21495:180::-;21543:77;21540:1;21533:88;21640:4;21637:1;21630:15;21664:4;21661:1;21654:15;21681:233;21720:3;21743:24;21761:5;21743:24;:::i;:::-;21734:33;;21789:66;21782:5;21779:77;21776:103;;21859:18;;:::i;:::-;21776:103;21906:1;21899:5;21895:13;21888:20;;21681:233;;;:::o;21920:94::-;21953:8;22001:5;21997:2;21993:14;21972:35;;21920:94;;;:::o;22020:::-;22059:7;22088:20;22102:5;22088:20;:::i;:::-;22077:31;;22020:94;;;:::o;22120:100::-;22159:7;22188:26;22208:5;22188:26;:::i;:::-;22177:37;;22120:100;;;:::o;22226:157::-;22331:45;22351:24;22369:5;22351:24;:::i;:::-;22331:45;:::i;:::-;22326:3;22319:58;22226:157;;:::o;22389:256::-;22501:3;22516:75;22587:3;22578:6;22516:75;:::i;:::-;22616:2;22611:3;22607:12;22600:19;;22636:3;22629:10;;22389:256;;;;:::o;22651:148::-;22753:11;22790:3;22775:18;;22651:148;;;;:::o;22805:377::-;22911:3;22939:39;22972:5;22939:39;:::i;:::-;22994:89;23076:6;23071:3;22994:89;:::i;:::-;22987:96;;23092:52;23137:6;23132:3;23125:4;23118:5;23114:16;23092:52;:::i;:::-;23169:6;23164:3;23160:16;23153:23;;22915:267;22805:377;;;;:::o;23188:435::-;23368:3;23390:95;23481:3;23472:6;23390:95;:::i;:::-;23383:102;;23502:95;23593:3;23584:6;23502:95;:::i;:::-;23495:102;;23614:3;23607:10;;23188:435;;;;;:::o;23629:225::-;23769:34;23765:1;23757:6;23753:14;23746:58;23838:8;23833:2;23825:6;23821:15;23814:33;23629:225;:::o;23860:366::-;24002:3;24023:67;24087:2;24082:3;24023:67;:::i;:::-;24016:74;;24099:93;24188:3;24099:93;:::i;:::-;24217:2;24212:3;24208:12;24201:19;;23860:366;;;:::o;24232:419::-;24398:4;24436:2;24425:9;24421:18;24413:26;;24485:9;24479:4;24475:20;24471:1;24460:9;24456:17;24449:47;24513:131;24639:4;24513:131;:::i;:::-;24505:139;;24232:419;;;:::o;24657:229::-;24797:34;24793:1;24785:6;24781:14;24774:58;24866:12;24861:2;24853:6;24849:15;24842:37;24657:229;:::o;24892:366::-;25034:3;25055:67;25119:2;25114:3;25055:67;:::i;:::-;25048:74;;25131:93;25220:3;25131:93;:::i;:::-;25249:2;25244:3;25240:12;25233:19;;24892:366;;;:::o;25264:419::-;25430:4;25468:2;25457:9;25453:18;25445:26;;25517:9;25511:4;25507:20;25503:1;25492:9;25488:17;25481:47;25545:131;25671:4;25545:131;:::i;:::-;25537:139;;25264:419;;;:::o;25689:175::-;25829:27;25825:1;25817:6;25813:14;25806:51;25689:175;:::o;25870:366::-;26012:3;26033:67;26097:2;26092:3;26033:67;:::i;:::-;26026:74;;26109:93;26198:3;26109:93;:::i;:::-;26227:2;26222:3;26218:12;26211:19;;25870:366;;;:::o;26242:419::-;26408:4;26446:2;26435:9;26431:18;26423:26;;26495:9;26489:4;26485:20;26481:1;26470:9;26466:17;26459:47;26523:131;26649:4;26523:131;:::i;:::-;26515:139;;26242:419;;;:::o;26667:147::-;26768:11;26805:3;26790:18;;26667:147;;;;:::o;26820:114::-;;:::o;26940:398::-;27099:3;27120:83;27201:1;27196:3;27120:83;:::i;:::-;27113:90;;27212:93;27301:3;27212:93;:::i;:::-;27330:1;27325:3;27321:11;27314:18;;26940:398;;;:::o;27344:379::-;27528:3;27550:147;27693:3;27550:147;:::i;:::-;27543:154;;27714:3;27707:10;;27344:379;;;:::o;27729:98::-;27780:6;27814:5;27808:12;27798:22;;27729:98;;;:::o;27833:168::-;27916:11;27950:6;27945:3;27938:19;27990:4;27985:3;27981:14;27966:29;;27833:168;;;;:::o;28007:360::-;28093:3;28121:38;28153:5;28121:38;:::i;:::-;28175:70;28238:6;28233:3;28175:70;:::i;:::-;28168:77;;28254:52;28299:6;28294:3;28287:4;28280:5;28276:16;28254:52;:::i;:::-;28331:29;28353:6;28331:29;:::i;:::-;28326:3;28322:39;28315:46;;28097:270;28007:360;;;;:::o;28373:640::-;28568:4;28606:3;28595:9;28591:19;28583:27;;28620:71;28688:1;28677:9;28673:17;28664:6;28620:71;:::i;:::-;28701:72;28769:2;28758:9;28754:18;28745:6;28701:72;:::i;:::-;28783;28851:2;28840:9;28836:18;28827:6;28783:72;:::i;:::-;28902:9;28896:4;28892:20;28887:2;28876:9;28872:18;28865:48;28930:76;29001:4;28992:6;28930:76;:::i;:::-;28922:84;;28373:640;;;;;;;:::o;29019:141::-;29075:5;29106:6;29100:13;29091:22;;29122:32;29148:5;29122:32;:::i;:::-;29019:141;;;;:::o;29166:349::-;29235:6;29284:2;29272:9;29263:7;29259:23;29255:32;29252:119;;;29290:79;;:::i;:::-;29252:119;29410:1;29435:63;29490:7;29481:6;29470:9;29466:22;29435:63;:::i;:::-;29425:73;;29381:127;29166:349;;;;:::o;29521:176::-;29553:1;29570:20;29588:1;29570:20;:::i;:::-;29565:25;;29604:20;29622:1;29604:20;:::i;:::-;29599:25;;29643:1;29633:35;;29648:18;;:::i;:::-;29633:35;29689:1;29686;29682:9;29677:14;;29521:176;;;;:::o
Swarm Source
ipfs://1f60120ac0fb62e0d36010cc650e8437465a430d5b9e50bb0f7378cf4eeacc43
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.