Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
314 PNFT
Holders
130
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
5 PNFTLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
PochiInuNFT
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-14 */ // Sources flattened with hardhat v2.10.0 https://hardhat.org // 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 (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/extensions/[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 erc721a/contracts/[email protected] // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A is IERC721, IERC721Metadata { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); // 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; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/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 (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File @openzeppelin/contracts/utils/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] // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @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, IERC721A { using Address for address; using Strings for uint256; // 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 override 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) if (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) if(!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()) if(!_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; } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ 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 { 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 (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 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) 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; 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 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/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File contracts/PochiInuNFT.sol // SPDX-License-Identifier: MIT /// @author zscarabsz /// @title Pochi Inu NFT (genesis) pragma solidity ^0.8.11; contract PochiInuNFT is ERC721A , Ownable{ constructor() ERC721A("PochiInuNFT", "PNFT") {} using Counters for Counters.Counter; using Strings for uint256; address payable private _PaymentAddress = payable(0x6c1C870bEea8c23607Ce340662F86C01cf42fF12); Counters.Counter private _publicPNFT; uint256 private _PNFT_MAX = 1337; uint256 private _activeDateTime = 1657929600; string private _tokenBaseURI = ""; string private _revealURI = "https://ipfs.io/ipfs/QmcHSJmZCHyQa4N5ogDmURvzbdLhVkXYEVn1hh5MRyReyx"; address private _stakeContract; uint256 private PRESALE_PRICE = 0.08 ether; uint256 private PUBLIC_PRICE = 0.12 ether; uint256 private REVEAL_DELAY = 96 hours; uint256 private PRESALE_HOURS = 24 hours; uint256 private PRESALE_MINT_LIMIT = 2; uint256 private PUBLIC_MINT_LIMIT = 10; uint256 private MAX_AGE = 4; // max age of a dog uint256 private TOKEN_FACTOR = 100000000000000000000000000; // 100,000,000 - 100m Pochi Tokens base rate per growth age uint256 private TIME_FACTOR = 2592000; // 1 month phase uint256 private BURN_FACTOR_NEW = 5; // burn factor for permanent adulthood on new Pochi (20%) uint256 private BURN_FACTOR_POST = 10; // burn factor for permanent adulthood on already adulted Pochi (10%) uint256 private MIN_BURN_AMOUNT = 10000000000000000000000000; // minimum needed for permanent adulthood on already adulted Pochi uint256 private BREEDING_DELAY = 2592000; // 1 month phase struct Feed{ uint256 timeIn; uint256 amt; address ownerAddress; uint256 timeOut; uint256 ageTimeOut; } mapping(address => bool) private _mappingWhiteList; mapping(address => uint256) private _mappingPresaleMintCount; mapping(address => uint256) private _mappingPublicMintCount; mapping(uint256 => Feed) private _feeds; mapping(uint256 => bool) private _burnToAdults; event AddFeed(uint256 tokenId, uint256 feedAmt, uint256 addedTimestamp); event RemoveFeed(uint256 tokenId, uint256 feedAmt, uint256 removedTimestamp); event RemoveFeedAll(uint256 tokenId, uint256 removedTimestamp); event NFTBurnedToAdulthood(uint256 tokenId); function setMaxMintAmount(uint256 maxAmount) external onlyOwner { _PNFT_MAX = maxAmount; } function setStakeContract(address addr) external onlyOwner { _stakeContract = addr; } function setMaxAge(uint256 maxAge) external onlyOwner { MAX_AGE = maxAge; } function setTokenFactor(uint256 tokenFactor) external onlyOwner { TOKEN_FACTOR = tokenFactor; } function setTimeFactor(uint256 timeFactor) external onlyOwner { TIME_FACTOR = timeFactor; } function setBurnFactor(uint256 factorNew, uint256 factorPost) external onlyOwner { BURN_FACTOR_NEW = factorNew; BURN_FACTOR_POST = factorPost; } function setBreedingDelay(uint256 breedingDelay) external onlyOwner { BREEDING_DELAY = breedingDelay; } function setPaymentAddress(address paymentAddress) external onlyOwner { _PaymentAddress = payable(paymentAddress); } function setActiveDateTime(uint256 activeDateTime, uint256 presaleHours, uint256 revealDelay) external onlyOwner { _activeDateTime = activeDateTime; REVEAL_DELAY = revealDelay; PRESALE_HOURS = presaleHours; } function setWhiteList(address[] memory whiteListAddress, bool bEnable) external onlyOwner { for (uint256 i = 0; i < whiteListAddress.length; i++) { _mappingWhiteList[whiteListAddress[i]] = bEnable; } } function isWhiteListed(address addr) public view returns (bool) { return _mappingWhiteList[addr]; } function setMintPrice(uint256 presaleMintPrice, uint256 publicMintPrice) external onlyOwner { PRESALE_PRICE = presaleMintPrice; PUBLIC_PRICE = publicMintPrice; } function setMintMaxLimit(uint256 presaleMintLimit, uint256 publicsaleMintLimit) external onlyOwner { PRESALE_MINT_LIMIT = presaleMintLimit; PUBLIC_MINT_LIMIT = publicsaleMintLimit; } function getPresaleMintMaxLimit() public view returns (uint256) { return PRESALE_MINT_LIMIT; } function getPublicsaleMintMaxLimit() public view returns (uint256) { return PUBLIC_MINT_LIMIT; } function setURIs(string memory revealURI, string memory baseURI) external onlyOwner { _revealURI = revealURI; _tokenBaseURI = baseURI; } // Grow your Pochi puppy by Feeding it (by Staking Pochi Inu Tokens) // only callable by the Pochi Staking Contract function giveFeed(uint256 tokenId, uint256 feedAmt, address tokenOwner) public { require(msg.sender == _stakeContract, "Only callable from Staking Contract"); require(_exists(tokenId), "Token does not exist"); _feeds[tokenId] = Feed(((_feeds[tokenId].amt > 0)? _feeds[tokenId].timeIn : block.timestamp), feedAmt, tokenOwner, 0, 0); emit AddFeed(tokenId, feedAmt, block.timestamp); } // Remove Feed from Pochi puppy (by Un-Staking Pochi Inu Tokens) // only callable by the Pochi Staking Contract function takeFeed(uint256 tokenId, uint256 feedAmt) public { require(msg.sender == _stakeContract, "Only callable from Staking Contract"); require(_exists(tokenId), "Token does not exist"); uint256 curAge = calcAge(tokenId); if (_feeds[tokenId].amt > 0) { Feed memory tokenFeed = _feeds[tokenId]; tokenFeed.amt = tokenFeed.amt - (feedAmt > tokenFeed.amt ? tokenFeed.amt : feedAmt); if (tokenFeed.amt == 0) { tokenFeed.timeOut = block.timestamp; tokenFeed.ageTimeOut = curAge; } _feeds[tokenId] = Feed(tokenFeed.timeIn, tokenFeed.amt, tokenFeed.ownerAddress, tokenFeed.timeOut, tokenFeed.ageTimeOut); } emit RemoveFeed(tokenId, feedAmt, block.timestamp); } // Remove All Feed from Pochi puppy (by Un-Staking Pochi Inu Tokens) // only callable by the Pochi Staking Contract function takeFeedAll(uint256 tokenId) public { require(msg.sender == _stakeContract, "Only callable from Staking Contract"); uint256 curAge = calcAge(tokenId); Feed memory tokenFeed = _feeds[tokenId]; _feeds[tokenId] = Feed((tokenFeed.timeIn > 0)? tokenFeed.timeIn : block.timestamp, 0, this.ownerOf(tokenId), block.timestamp, curAge); emit RemoveFeedAll(tokenId, block.timestamp); } // Set the Pochi puppy to Adulthood permanently // only callable by the Pochi Staking Contract function burnToAdulthood(uint256 tokenId) public { require(msg.sender == _stakeContract, "Only callable from Staking Contract"); require(_exists(tokenId), "Token does not exist"); _burnToAdults[tokenId] = true; emit NFTBurnedToAdulthood(tokenId); } // Get the amount of Pochi Inu Tokens needed to Burn to permanently MAX_AGE their puppy function getBurnAmount(uint256 tokenId) public view returns(uint256){ require(_burnToAdults[tokenId] == false, "NFT already Burned to Adult"); if (_feeds[tokenId].amt > 0){ uint256 curAge = calcAge(tokenId); if (curAge == MAX_AGE) { if (_feeds[tokenId].timeIn < (block.timestamp - BREEDING_DELAY)) { return (((_feeds[tokenId].amt < TOKEN_FACTOR)? ((_feeds[tokenId].amt < MIN_BURN_AMOUNT)? MIN_BURN_AMOUNT : _feeds[tokenId].amt) : TOKEN_FACTOR) / BURN_FACTOR_POST); } else { return (TOKEN_FACTOR / BURN_FACTOR_POST); } } } return (TOKEN_FACTOR / BURN_FACTOR_NEW); } // Check if Pochi puppy is set to Adulthood permanently function isBurnedToAdult(uint256 tokenId) public view returns(bool){ return (_burnToAdults[tokenId] == true)? true : false; } // Get Feed information for a Pochi puppy function getFeeds(uint256 tokenId) public view returns(Feed memory){ return _feeds[tokenId]; } // Get total Feed Factor for a given Pochi NFT based on it's Feed function getTotalFeedFactor(uint256 tokenId) private view returns(uint256) { require(_feeds[tokenId].amt > 0, "Feed does not exist"); Feed memory tokenFeed = _feeds[tokenId]; uint256 tokenFactor = (tokenFeed.amt > TOKEN_FACTOR) ? tokenFeed.amt : TOKEN_FACTOR; uint256 divFactor = tokenFactor / tokenFeed.amt; divFactor = (divFactor == 0) ? 1 : divFactor; uint256 totalFeedAmt = divFactor * TIME_FACTOR; return totalFeedAmt; } // Get Age for a Pochi puppy function calcAge(uint256 tokenId) public view returns(uint256){ require(_exists(tokenId), "Token does not exist"); uint256 curAge = 0; if (_feeds[tokenId].ownerAddress == address(0x0000000000000000)){ return curAge; } if (_burnToAdults[tokenId] == true){ return MAX_AGE; } if (_feeds[tokenId].amt == 0 && _feeds[tokenId].timeOut > 0){ curAge = _feeds[tokenId].ageTimeOut - ((block.timestamp - _feeds[tokenId].timeOut) / TIME_FACTOR); return curAge; } uint256 totalFeedAmt = getTotalFeedFactor(tokenId); curAge = (block.timestamp - _feeds[tokenId].timeIn) / totalFeedAmt; return (curAge > MAX_AGE)? MAX_AGE : curAge; } // Get time left until Pochi puppy ages function timeUntilNextAge(uint256 tokenId) public view returns(uint256){ require(_exists(tokenId), "NFT does not exist"); require(_burnToAdults[tokenId] == false, "NFT already at Max"); require(_feeds[tokenId].amt > 0 , "NFT is not being Fed!"); uint256 timeElapsed = 0; // if feeding zero, return time until it reverts an age if (_feeds[tokenId].amt == 0 && _feeds[tokenId].timeOut > 0){ timeElapsed = block.timestamp - _feeds[tokenId].timeOut; uint256 agesDropped = (timeElapsed / TIME_FACTOR); if (agesDropped >= MAX_AGE) { return 0; } return (TIME_FACTOR * (agesDropped + 1)) - timeElapsed; } uint256 totalFeedAmt = getTotalFeedFactor(tokenId); uint256 curAge = (block.timestamp - _feeds[tokenId].timeIn) / totalFeedAmt; if (curAge >= MAX_AGE){ return 0; } timeElapsed = block.timestamp - _feeds[tokenId].timeIn; if ((totalFeedAmt * (curAge + 1)) > timeElapsed) { return (totalFeedAmt * (curAge + 1)) - timeElapsed; } return 0; } // Get time since Pochi became adult function timeSinceAdult(uint256 tokenId) public view returns(uint256){ require(_exists(tokenId), "NFT does not exist"); require(calcAge(tokenId) == MAX_AGE, "NFT not an Adult!"); if (_feeds[tokenId].timeIn > 0) { if (_burnToAdults[tokenId] == true) { return (block.timestamp - _feeds[tokenId].timeOut); } uint256 totalFeedAmt = getTotalFeedFactor(tokenId); return (block.timestamp - (_feeds[tokenId].timeIn + (totalFeedAmt * (MAX_AGE - 1)))); } return 0; } // Get Pochi's eligible for Breeding (burned to adult or adult longer than BREEDING_DELAY) function getEligibleForBreeding(uint256 nftId) public view returns (bool) { if (_burnToAdults[nftId] == true) { return true; } if (calcAge(nftId) == MAX_AGE) { if (timeSinceAdult(nftId) > BREEDING_DELAY) { return true; } } return false; } function tokenURI(uint256 tokenId) public view override(ERC721A) returns (string memory) { require(_exists(tokenId), "Token does not exist"); uint256 curAge = (_burnToAdults[tokenId] == true)? MAX_AGE : calcAge(tokenId); if (_activeDateTime + REVEAL_DELAY < block.timestamp) { return string(abi.encodePacked(_tokenBaseURI, tokenId.toString(), "/", curAge.toString())); } return _revealURI; } function withdraw() external onlyOwner { uint256 balance = address(this).balance; payable(msg.sender).transfer(balance); } function price() public view returns (uint256) { return (block.timestamp < _activeDateTime)? PRESALE_PRICE : PUBLIC_PRICE; } function isPresaleMintActive() public view returns (bool) { if (isPublicMintActive() == true) { return false; } return (block.timestamp > _activeDateTime - PRESALE_HOURS)? true : false; } function isPublicMintActive() public view returns (bool) { return (block.timestamp > _activeDateTime)? true : false; } function adminMint(uint256 adminMintAmt) external onlyOwner { require(_publicPNFT.current() + adminMintAmt < _PNFT_MAX, "Purchase would exceed _PNFT_MAX"); for (uint256 i = 0; i < adminMintAmt; i++) { _publicPNFT.increment(); } _safeMint(msg.sender, adminMintAmt); } function purchase(uint256 numberOfTokens) external payable { require(msg.sender != owner(),"You are owner!"); require(price() * numberOfTokens <= msg.value,"ETH amount is not sufficient"); require(_publicPNFT.current() + numberOfTokens < _PNFT_MAX,"Purchase would exceed _PNFT_MAX"); if (block.timestamp < _activeDateTime) { require(_mappingWhiteList[msg.sender] == true, "Not registered to WhiteList"); require(block.timestamp > _activeDateTime - PRESALE_HOURS , "Mint is not activated for presale"); require(_mappingPresaleMintCount[msg.sender] + numberOfTokens <= PRESALE_MINT_LIMIT,"Overflow for PRESALE_MINT_LIMIT"); _mappingPresaleMintCount[msg.sender] = _mappingPresaleMintCount[msg.sender] + numberOfTokens; } else { require(block.timestamp > _activeDateTime, "Mint is not activated for public sale"); require(numberOfTokens <= PUBLIC_MINT_LIMIT, "Amount to high for single transaction"); _mappingPublicMintCount[msg.sender] = _mappingPublicMintCount[msg.sender] + numberOfTokens; } for(uint256 i =0;i<numberOfTokens;i++){ _publicPNFT.increment(); } _PaymentAddress.transfer(msg.value); _safeMint(msg.sender, numberOfTokens); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feedAmt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"addedTimestamp","type":"uint256"}],"name":"AddFeed","type":"event"},{"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":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"NFTBurnedToAdulthood","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":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feedAmt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"removedTimestamp","type":"uint256"}],"name":"RemoveFeed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"removedTimestamp","type":"uint256"}],"name":"RemoveFeedAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"adminMintAmt","type":"uint256"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnToAdulthood","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"calcAge","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getBurnAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"getEligibleForBreeding","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFeeds","outputs":[{"components":[{"internalType":"uint256","name":"timeIn","type":"uint256"},{"internalType":"uint256","name":"amt","type":"uint256"},{"internalType":"address","name":"ownerAddress","type":"address"},{"internalType":"uint256","name":"timeOut","type":"uint256"},{"internalType":"uint256","name":"ageTimeOut","type":"uint256"}],"internalType":"struct PochiInuNFT.Feed","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPresaleMintMaxLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicsaleMintMaxLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"feedAmt","type":"uint256"},{"internalType":"address","name":"tokenOwner","type":"address"}],"name":"giveFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isBurnedToAdult","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isWhiteListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"purchase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"activeDateTime","type":"uint256"},{"internalType":"uint256","name":"presaleHours","type":"uint256"},{"internalType":"uint256","name":"revealDelay","type":"uint256"}],"name":"setActiveDateTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"breedingDelay","type":"uint256"}],"name":"setBreedingDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"factorNew","type":"uint256"},{"internalType":"uint256","name":"factorPost","type":"uint256"}],"name":"setBurnFactor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxAge","type":"uint256"}],"name":"setMaxAge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxAmount","type":"uint256"}],"name":"setMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"presaleMintLimit","type":"uint256"},{"internalType":"uint256","name":"publicsaleMintLimit","type":"uint256"}],"name":"setMintMaxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"presaleMintPrice","type":"uint256"},{"internalType":"uint256","name":"publicMintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"paymentAddress","type":"address"}],"name":"setPaymentAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setStakeContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timeFactor","type":"uint256"}],"name":"setTimeFactor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenFactor","type":"uint256"}],"name":"setTokenFactor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"revealURI","type":"string"},{"internalType":"string","name":"baseURI","type":"string"}],"name":"setURIs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"whiteListAddress","type":"address[]"},{"internalType":"bool","name":"bEnable","type":"bool"}],"name":"setWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"feedAmt","type":"uint256"}],"name":"takeFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"takeFeedAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"timeSinceAdult","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"timeUntilNextAge","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052736c1c870beea8c23607ce340662f86c01cf42ff12600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610539600b556362d1ff80600c5560405180602001604052806000815250600d90805190602001906200008e929190620002e9565b5060405180608001604052806043815260200162005f0260439139600e9080519060200190620000c0929190620002e9565b5067011c37937e0800006010556701aa535d3d0c000060115562054600601255620151806013556002601455600a60155560046016556a52b7d2dcc80cd2e400000060175562278d006018556005601955600a601a556a084595161401484a000000601b5562278d00601c553480156200013957600080fd5b506040518060400160405280600b81526020017f506f636869496e754e46540000000000000000000000000000000000000000008152506040518060400160405280600481526020017f504e4654000000000000000000000000000000000000000000000000000000008152508160029080519060200190620001be929190620002e9565b508060039080519060200190620001d7929190620002e9565b50620001e86200021660201b60201c565b600081905550505062000210620002046200021b60201b60201c565b6200022360201b60201c565b620003fe565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002f790620003c8565b90600052602060002090601f0160209004810192826200031b576000855562000367565b82601f106200033657805160ff191683800117855562000367565b8280016001018555821562000367579182015b828111156200036657825182559160200191906001019062000349565b5b5090506200037691906200037a565b5090565b5b80821115620003955760008160009055506001016200037b565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003e157607f821691505b60208210811415620003f857620003f762000399565b5b50919050565b615af4806200040e6000396000f3fe6080604052600436106102c95760003560e01c806370a0823111610175578063ba5a5e8f116100dc578063df52820011610095578063e90d541a1161006f578063e90d541a14610b1e578063e985e9c514610b47578063efef39a114610b84578063f2fde38b14610ba0576102c9565b8063df52820014610aa3578063e43f696e14610acc578063e825417414610af5576102c9565b8063ba5a5e8f14610983578063c1aacd62146109ac578063c1f26123146109e9578063c555819814610a12578063c87b56dd14610a3d578063d42f21f614610a7a576102c9565b8063a035b1fe1161012e578063a035b1fe14610877578063a22cb465146108a2578063a74f0d7f146108cb578063ab3133be14610908578063b0cc69dd14610931578063b88d4fde1461095a576102c9565b806370a0823114610779578063715018a6146107b65780638da5cb5b146107cd578063928dd6e3146107f857806395d89b41146108235780639791e3891461084e576102c9565b80632d6b622411610234578063523ff8f3116101ed5780635f106cbd116101c75780635f106cbd146106995780636352211e146106c257806367e77770146106ff5780636f9170f61461073c576102c9565b8063523ff8f31461061e5780635ae28fc9146106475780635e1e100414610670576102c9565b80632d6b62241461052457806331384ef31461054f5780633ccfd60b1461058c57806342842e0e146105a35780634fa1278a146105cc578063509484d5146105f5576102c9565b8063095ea7b311610286578063095ea7b31461040257806318160ddd1461042b57806323b872dd146104565780632483ada01461047f57806325f54bf2146104aa57806329a93308146104e7576102c9565b806301ffc9a7146102ce5780630442bfa81461030b578063068c0cb81461033457806306fdde0314610371578063081812fc1461039c578063088a4ed0146103d9575b600080fd5b3480156102da57600080fd5b506102f560048036038101906102f091906143f3565b610bc9565b604051610302919061443b565b60405180910390f35b34801561031757600080fd5b50610332600480360381019061032d919061448c565b610cab565b005b34801561034057600080fd5b5061035b600480360381019061035691906144cc565b610cc5565b6040516103689190614508565b60405180910390f35b34801561037d57600080fd5b50610386610f59565b60405161039391906145bc565b60405180910390f35b3480156103a857600080fd5b506103c360048036038101906103be91906144cc565b610feb565b6040516103d0919061461f565b60405180910390f35b3480156103e557600080fd5b5061040060048036038101906103fb91906144cc565b611067565b005b34801561040e57600080fd5b5061042960048036038101906104249190614666565b611079565b005b34801561043757600080fd5b5061044061117e565b60405161044d9190614508565b60405180910390f35b34801561046257600080fd5b5061047d600480360381019061047891906146a6565b611195565b005b34801561048b57600080fd5b506104946111a5565b6040516104a19190614508565b60405180910390f35b3480156104b657600080fd5b506104d160048036038101906104cc91906144cc565b6111af565b6040516104de9190614508565b60405180910390f35b3480156104f357600080fd5b5061050e600480360381019061050991906144cc565b61139b565b60405161051b919061477f565b60405180910390f35b34801561053057600080fd5b50610539611446565b604051610546919061443b565b60405180910390f35b34801561055b57600080fd5b50610576600480360381019061057191906144cc565b611460565b6040516105839190614508565b60405180910390f35b34801561059857600080fd5b506105a16115d7565b005b3480156105af57600080fd5b506105ca60048036038101906105c591906146a6565b61162e565b005b3480156105d857600080fd5b506105f360048036038101906105ee91906144cc565b61164e565b005b34801561060157600080fd5b5061061c6004803603810190610617919061479a565b611660565b005b34801561062a57600080fd5b50610645600480360381019061064091906147c7565b6116ac565b005b34801561065357600080fd5b5061066e600480360381019061066991906144cc565b6118c3565b005b34801561067c57600080fd5b506106976004803603810190610692919061479a565b6118d5565b005b3480156106a557600080fd5b506106c060048036038101906106bb91906144cc565b611921565b005b3480156106ce57600080fd5b506106e960048036038101906106e491906144cc565b611bef565b6040516106f6919061461f565b60405180910390f35b34801561070b57600080fd5b50610726600480360381019061072191906144cc565b611c05565b604051610733919061443b565b60405180910390f35b34801561074857600080fd5b50610763600480360381019061075e919061479a565b611c44565b604051610770919061443b565b60405180910390f35b34801561078557600080fd5b506107a0600480360381019061079b919061479a565b611c9a565b6040516107ad9190614508565b60405180910390f35b3480156107c257600080fd5b506107cb611d6a565b005b3480156107d957600080fd5b506107e2611d7e565b6040516107ef919061461f565b60405180910390f35b34801561080457600080fd5b5061080d611da8565b60405161081a9190614508565b60405180910390f35b34801561082f57600080fd5b50610838611db2565b60405161084591906145bc565b60405180910390f35b34801561085a57600080fd5b506108756004803603810190610870919061481a565b611e44565b005b34801561088357600080fd5b5061088c611e66565b6040516108999190614508565b60405180910390f35b3480156108ae57600080fd5b506108c960048036038101906108c49190614899565b611e82565b005b3480156108d757600080fd5b506108f260048036038101906108ed91906144cc565b611ffa565b6040516108ff919061443b565b60405180910390f35b34801561091457600080fd5b5061092f600480360381019061092a91906144cc565b61206a565b005b34801561093d57600080fd5b50610958600480360381019061095391906144cc565b61207c565b005b34801561096657600080fd5b50610981600480360381019061097c9190614a0e565b61208e565b005b34801561098f57600080fd5b506109aa60048036038101906109a591906144cc565b612106565b005b3480156109b857600080fd5b506109d360048036038101906109ce91906144cc565b612244565b6040516109e09190614508565b60405180910390f35b3480156109f557600080fd5b50610a106004803603810190610a0b91906144cc565b6123b4565b005b348015610a1e57600080fd5b50610a2761244a565b604051610a34919061443b565b60405180910390f35b348015610a4957600080fd5b50610a646004803603810190610a5f91906144cc565b61248f565b604051610a7191906145bc565b60405180910390f35b348015610a8657600080fd5b50610aa16004803603810190610a9c919061448c565b612603565b005b348015610aaf57600080fd5b50610aca6004803603810190610ac5919061448c565b61261d565b005b348015610ad857600080fd5b50610af36004803603810190610aee9190614b59565b61292a565b005b348015610b0157600080fd5b50610b1c6004803603810190610b179190614c56565b6129c7565b005b348015610b2a57600080fd5b50610b456004803603810190610b40919061448c565b612a01565b005b348015610b5357600080fd5b50610b6e6004803603810190610b699190614cce565b612a1b565b604051610b7b919061443b565b60405180910390f35b610b9e6004803603810190610b9991906144cc565b612aaf565b005b348015610bac57600080fd5b50610bc76004803603810190610bc2919061479a565b612f99565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c9457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ca45750610ca38261301d565b5b9050919050565b610cb3613087565b81601081905550806011819055505050565b6000610cd082613105565b610d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0690614d5a565b60405180910390fd5b600015156021600084815260200190815260200160002060009054906101000a900460ff16151514610d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6d90614dc6565b60405180910390fd5b6000602060008481526020019081526020016000206001015411610dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc690614e32565b60405180910390fd5b6000806020600085815260200190815260200160002060010154148015610e0c575060006020600085815260200190815260200160002060030154115b15610e8957602060008481526020019081526020016000206003015442610e339190614e81565b9050600060185482610e459190614ee4565b90506016548110610e5b57600092505050610f54565b81600182610e699190614f15565b601854610e769190614f6b565b610e809190614e81565b92505050610f54565b6000610e9484613153565b9050600081602060008781526020019081526020016000206000015442610ebb9190614e81565b610ec59190614ee4565b90506016548110610edc5760009350505050610f54565b602060008681526020019081526020016000206000015442610efe9190614e81565b925082600182610f0e9190614f15565b83610f199190614f6b565b1115610f4c5782600182610f2d9190614f15565b83610f389190614f6b565b610f429190614e81565b9350505050610f54565b600093505050505b919050565b606060028054610f6890614ff4565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9490614ff4565b8015610fe15780601f10610fb657610100808354040283529160200191610fe1565b820191906000526020600020905b815481529060010190602001808311610fc457829003601f168201915b5050505050905090565b6000610ff682613105565b61102c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61106f613087565b80600b8190555050565b600061108482611bef565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110ec576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661110b6132b1565b73ffffffffffffffffffffffffffffffffffffffff161461116e57611137816111326132b1565b612a1b565b61116d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b6111798383836132b9565b505050565b600061118861336b565b6001546000540303905090565b6111a0838383613370565b505050565b6000601454905090565b60006111ba82613105565b6111f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f090615072565b60405180910390fd5b60008073ffffffffffffffffffffffffffffffffffffffff166020600085815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561126e5780915050611396565b600115156021600085815260200190815260200160002060009054906101000a900460ff16151514156112a657601654915050611396565b600060206000858152602001908152602001600020600101541480156112e2575060006020600085815260200190815260200160002060030154115b156113425760185460206000858152602001908152602001600020600301544261130c9190614e81565b6113169190614ee4565b60206000858152602001908152602001600020600401546113379190614e81565b905080915050611396565b600061134d84613153565b9050806020600086815260200190815260200160002060000154426113729190614e81565b61137c9190614ee4565b9150601654821161138d5781611391565b6016545b925050505b919050565b6113a361425c565b602060008381526020019081526020016000206040518060a001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382015481526020016004820154815250509050919050565b6000600c54421161145857600061145b565b60015b905090565b60008015156021600084815260200190815260200160002060009054906101000a900460ff161515146114c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bf906150de565b60405180910390fd5b6000602060008481526020019081526020016000206001015411156115bf5760006114f2836111af565b90506016548114156115bd57601c544261150c9190614e81565b602060008581526020019081526020016000206000015410156115a557601a5460175460206000868152602001908152602001600020600101541061155357601754611593565b601b5460206000868152602001908152602001600020600101541061158e576020600085815260200190815260200160002060010154611592565b601b545b5b61159d9190614ee4565b9150506115d2565b601a546017546115b59190614ee4565b9150506115d2565b505b6019546017546115cf9190614ee4565b90505b919050565b6115df613087565b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561162a573d6000803e3d6000fd5b5050565b6116498383836040518060200160405280600081525061208e565b505050565b611656613087565b8060178190555050565b611668613087565b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461173c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173390615170565b60405180910390fd5b61174583613105565b611784576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177b90615072565b60405180910390fd5b6040518060a0016040528060006020600087815260200190815260200160002060010154116117b357426117cb565b60206000868152602001908152602001600020600001545b81526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525060206000858152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030155608082015181600401559050507f83137dbf2a07be4264eee6531eb1296c5b1db50b89c26a52443867bb0254f66c8383426040516118b693929190615190565b60405180910390a1505050565b6118cb613087565b8060168190555050565b6118dd613087565b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a890615170565b60405180910390fd5b60006119bc826111af565b90506000602060008481526020019081526020016000206040518060a001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820154815260200160048201548152505090506040518060a001604052806000836000015111611a7b5742611a81565b82600001515b8152602001600081526020013073ffffffffffffffffffffffffffffffffffffffff16636352211e866040518263ffffffff1660e01b8152600401611ac69190614508565b602060405180830381865afa158015611ae3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0791906151dc565b73ffffffffffffffffffffffffffffffffffffffff1681526020014281526020018381525060206000858152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030155608082015181600401559050507fec065b81cb968d71da3ae9f263feb929f08d83769aed2784ad32c3985c8660f88342604051611be2929190615209565b60405180910390a1505050565b6000611bfa82613826565b600001519050919050565b6000600115156021600084815260200190815260200160002060009054906101000a900460ff16151514611c3a576000611c3d565b60015b9050919050565b6000601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d02576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611d72613087565b611d7c6000613ab1565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000601554905090565b606060038054611dc190614ff4565b80601f0160208091040260200160405190810160405280929190818152602001828054611ded90614ff4565b8015611e3a5780601f10611e0f57610100808354040283529160200191611e3a565b820191906000526020600020905b815481529060010190602001808311611e1d57829003601f168201915b5050505050905090565b611e4c613087565b82600c819055508060128190555081601381905550505050565b6000600c544210611e7957601154611e7d565b6010545b905090565b611e8a6132b1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611eef576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611efc6132b1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611fa96132b1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fee919061443b565b60405180910390a35050565b6000600115156021600084815260200190815260200160002060009054906101000a900460ff16151514156120325760019050612065565b60165461203e836111af565b141561206057601c5461205083612244565b111561205f5760019050612065565b5b600090505b919050565b612072613087565b8060188190555050565b612084613087565b80601c8190555050565b612099848484613370565b6120b88373ffffffffffffffffffffffffffffffffffffffff16613b77565b15612100576120c984848484613b9a565b6120ff576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218d90615170565b60405180910390fd5b61219f81613105565b6121de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d590615072565b60405180910390fd5b60016021600083815260200190815260200160002060006101000a81548160ff0219169083151502179055507f4518c82e5c3332c053c00f90752a54c6945d539f2113f927d3fa1286be1d11b0816040516122399190614508565b60405180910390a150565b600061224f82613105565b61228e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228590614d5a565b60405180910390fd5b60165461229a836111af565b146122da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d19061527e565b60405180910390fd5b6000602060008481526020019081526020016000206000015411156123aa57600115156021600084815260200190815260200160002060009054906101000a900460ff161515141561234f576020600083815260200190815260200160002060030154426123489190614e81565b90506123af565b600061235a83613153565b9050600160165461236b9190614e81565b816123769190614f6b565b60206000858152602001908152602001600020600001546123979190614f15565b426123a29190614e81565b9150506123af565b600090505b919050565b6123bc613087565b600b54816123ca600a613ceb565b6123d49190614f15565b10612414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240b906152ea565b60405180910390fd5b60005b8181101561243c57612429600a613cf9565b80806124349061530a565b915050612417565b506124473382613d0f565b50565b600060011515612458611446565b15151415612469576000905061248c565b601354600c546124799190614e81565b4211612486576000612489565b60015b90505b90565b606061249a82613105565b6124d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d090615072565b60405180910390fd5b6000600115156021600085815260200190815260200160002060009054906101000a900460ff1615151461251557612510836111af565b612519565b6016545b905042601254600c5461252c9190614f15565b101561256f57600d61253d84613d2d565b61254683613d2d565b6040516020016125589392919061546f565b6040516020818303038152906040529150506125fe565b600e805461257c90614ff4565b80601f01602080910402602001604051908101604052809291908181526020018280546125a890614ff4565b80156125f55780601f106125ca576101008083540402835291602001916125f5565b820191906000526020600020905b8154815290600101906020018083116125d857829003601f168201915b50505050509150505b919050565b61260b613087565b81601481905550806015819055505050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146126ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a490615170565b60405180910390fd5b6126b682613105565b6126f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ec90615072565b60405180910390fd5b6000612700836111af565b90506000602060008581526020019081526020016000206001015411156128ea576000602060008581526020019081526020016000206040518060a001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382015481526020016004820154815250509050806020015183116127d257826127d8565b80602001515b81602001516127e79190614e81565b8160200181815250506000816020015114156128125742816060018181525050818160800181815250505b6040518060a001604052808260000151815260200182602001518152602001826040015173ffffffffffffffffffffffffffffffffffffffff16815260200182606001518152602001826080015181525060206000868152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040155905050505b7f5e8ada0444a96a09b79bafe5a06038faf1ba99afc98def71ce2f19b2d032966483834260405161291d93929190615190565b60405180910390a1505050565b612932613087565b60005b82518110156129c25781601d6000858481518110612956576129556154ab565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806129ba9061530a565b915050612935565b505050565b6129cf613087565b81600e90805190602001906129e59291906142a1565b5080600d90805190602001906129fc9291906142a1565b505050565b612a09613087565b8160198190555080601a819055505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612ab7611d7e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415612b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1c90615526565b60405180910390fd5b3481612b2f611e66565b612b399190614f6b565b1115612b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7190615592565b60405180910390fd5b600b5481612b88600a613ceb565b612b929190614f15565b10612bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc9906152ea565b60405180910390fd5b600c54421015612de25760011515601d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612c6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c66906155fe565b60405180910390fd5b601354600c54612c7f9190614e81565b4211612cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb790615690565b60405180910390fd5b60145481601e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612d0e9190614f15565b1115612d4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d46906156fc565b60405180910390fd5b80601e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612d9a9190614f15565b601e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612efa565b600c544211612e26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1d9061578e565b60405180910390fd5b601554811115612e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6290615820565b60405180910390fd5b80601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612eb69190614f15565b601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b60005b81811015612f2257612f0f600a613cf9565b8080612f1a9061530a565b915050612efd565b50600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015612f8b573d6000803e3d6000fd5b50612f963382613d0f565b50565b612fa1613087565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613011576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613008906158b2565b60405180910390fd5b61301a81613ab1565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61308f6132b1565b73ffffffffffffffffffffffffffffffffffffffff166130ad611d7e565b73ffffffffffffffffffffffffffffffffffffffff1614613103576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130fa9061591e565b60405180910390fd5b565b60008161311061336b565b1115801561311f575060005482105b801561314c575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b6000806020600084815260200190815260200160002060010154116131ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131a49061598a565b60405180910390fd5b6000602060008481526020019081526020016000206040518060a001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160038201548152602001600482015481525050905060006017548260200151116132645760175461326a565b81602001515b9050600082602001518261327e9190614ee4565b90506000811461328e5780613291565b60015b90506000601854826132a39190614f6b565b905080945050505050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061337b82613826565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146133e6576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166134076132b1565b73ffffffffffffffffffffffffffffffffffffffff1614806134365750613435856134306132b1565b612a1b565b5b8061347b57506134446132b1565b73ffffffffffffffffffffffffffffffffffffffff1661346384610feb565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806134b4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561351b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6135288585856001613e8e565b613534600084876132b9565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156137b45760005482146137b357878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461381f8585856001613e94565b5050505050565b61382e614327565b60008290508061383c61336b565b11613a7a57600054811015613a79576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151613a7757600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461395b578092505050613aac565b5b600115613a7657818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613a71578092505050613aac565b61395c565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613bc06132b1565b8786866040518563ffffffff1660e01b8152600401613be294939291906159ff565b6020604051808303816000875af1925050508015613c1e57506040513d601f19601f82011682018060405250810190613c1b9190615a60565b60015b613c98573d8060008114613c4e576040519150601f19603f3d011682016040523d82523d6000602084013e613c53565b606091505b50600081511415613c90576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b613d29828260405180602001604052806000815250613e9a565b5050565b60606000821415613d75576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613e89565b600082905060005b60008214613da7578080613d909061530a565b915050600a82613da09190614ee4565b9150613d7d565b60008167ffffffffffffffff811115613dc357613dc26148e3565b5b6040519080825280601f01601f191660200182016040528015613df55781602001600182028036833780820191505090505b5090505b60008514613e8257600182613e0e9190614e81565b9150600a85613e1d9190615a8d565b6030613e299190614f15565b60f81b818381518110613e3f57613e3e6154ab565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613e7b9190614ee4565b9450613df9565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613f07576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415613f42576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613f4f6000858386613e8e565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600084820190506141108673ffffffffffffffffffffffffffffffffffffffff16613b77565b156141d5575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46141856000878480600101955087613b9a565b6141bb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106141165782600054146141d057600080fd5b614240565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106141d6575b8160008190555050506142566000858386613e94565b50505050565b6040518060a001604052806000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b8280546142ad90614ff4565b90600052602060002090601f0160209004810192826142cf5760008555614316565b82601f106142e857805160ff1916838001178555614316565b82800160010185558215614316579182015b828111156143155782518255916020019190600101906142fa565b5b509050614323919061436a565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561438357600081600090555060010161436b565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6143d08161439b565b81146143db57600080fd5b50565b6000813590506143ed816143c7565b92915050565b60006020828403121561440957614408614391565b5b6000614417848285016143de565b91505092915050565b60008115159050919050565b61443581614420565b82525050565b6000602082019050614450600083018461442c565b92915050565b6000819050919050565b61446981614456565b811461447457600080fd5b50565b60008135905061448681614460565b92915050565b600080604083850312156144a3576144a2614391565b5b60006144b185828601614477565b92505060206144c285828601614477565b9150509250929050565b6000602082840312156144e2576144e1614391565b5b60006144f084828501614477565b91505092915050565b61450281614456565b82525050565b600060208201905061451d60008301846144f9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561455d578082015181840152602081019050614542565b8381111561456c576000848401525b50505050565b6000601f19601f8301169050919050565b600061458e82614523565b614598818561452e565b93506145a881856020860161453f565b6145b181614572565b840191505092915050565b600060208201905081810360008301526145d68184614583565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614609826145de565b9050919050565b614619816145fe565b82525050565b60006020820190506146346000830184614610565b92915050565b614643816145fe565b811461464e57600080fd5b50565b6000813590506146608161463a565b92915050565b6000806040838503121561467d5761467c614391565b5b600061468b85828601614651565b925050602061469c85828601614477565b9150509250929050565b6000806000606084860312156146bf576146be614391565b5b60006146cd86828701614651565b93505060206146de86828701614651565b92505060406146ef86828701614477565b9150509250925092565b61470281614456565b82525050565b614711816145fe565b82525050565b60a08201600082015161472d60008501826146f9565b50602082015161474060208501826146f9565b5060408201516147536040850182614708565b50606082015161476660608501826146f9565b50608082015161477960808501826146f9565b50505050565b600060a0820190506147946000830184614717565b92915050565b6000602082840312156147b0576147af614391565b5b60006147be84828501614651565b91505092915050565b6000806000606084860312156147e0576147df614391565b5b60006147ee86828701614477565b93505060206147ff86828701614477565b925050604061481086828701614651565b9150509250925092565b60008060006060848603121561483357614832614391565b5b600061484186828701614477565b935050602061485286828701614477565b925050604061486386828701614477565b9150509250925092565b61487681614420565b811461488157600080fd5b50565b6000813590506148938161486d565b92915050565b600080604083850312156148b0576148af614391565b5b60006148be85828601614651565b92505060206148cf85828601614884565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61491b82614572565b810181811067ffffffffffffffff8211171561493a576149396148e3565b5b80604052505050565b600061494d614387565b90506149598282614912565b919050565b600067ffffffffffffffff821115614979576149786148e3565b5b61498282614572565b9050602081019050919050565b82818337600083830152505050565b60006149b16149ac8461495e565b614943565b9050828152602081018484840111156149cd576149cc6148de565b5b6149d884828561498f565b509392505050565b600082601f8301126149f5576149f46148d9565b5b8135614a0584826020860161499e565b91505092915050565b60008060008060808587031215614a2857614a27614391565b5b6000614a3687828801614651565b9450506020614a4787828801614651565b9350506040614a5887828801614477565b925050606085013567ffffffffffffffff811115614a7957614a78614396565b5b614a85878288016149e0565b91505092959194509250565b600067ffffffffffffffff821115614aac57614aab6148e3565b5b602082029050602081019050919050565b600080fd5b6000614ad5614ad084614a91565b614943565b90508083825260208201905060208402830185811115614af857614af7614abd565b5b835b81811015614b215780614b0d8882614651565b845260208401935050602081019050614afa565b5050509392505050565b600082601f830112614b4057614b3f6148d9565b5b8135614b50848260208601614ac2565b91505092915050565b60008060408385031215614b7057614b6f614391565b5b600083013567ffffffffffffffff811115614b8e57614b8d614396565b5b614b9a85828601614b2b565b9250506020614bab85828601614884565b9150509250929050565b600067ffffffffffffffff821115614bd057614bcf6148e3565b5b614bd982614572565b9050602081019050919050565b6000614bf9614bf484614bb5565b614943565b905082815260208101848484011115614c1557614c146148de565b5b614c2084828561498f565b509392505050565b600082601f830112614c3d57614c3c6148d9565b5b8135614c4d848260208601614be6565b91505092915050565b60008060408385031215614c6d57614c6c614391565b5b600083013567ffffffffffffffff811115614c8b57614c8a614396565b5b614c9785828601614c28565b925050602083013567ffffffffffffffff811115614cb857614cb7614396565b5b614cc485828601614c28565b9150509250929050565b60008060408385031215614ce557614ce4614391565b5b6000614cf385828601614651565b9250506020614d0485828601614651565b9150509250929050565b7f4e465420646f6573206e6f742065786973740000000000000000000000000000600082015250565b6000614d4460128361452e565b9150614d4f82614d0e565b602082019050919050565b60006020820190508181036000830152614d7381614d37565b9050919050565b7f4e465420616c7265616479206174204d61780000000000000000000000000000600082015250565b6000614db060128361452e565b9150614dbb82614d7a565b602082019050919050565b60006020820190508181036000830152614ddf81614da3565b9050919050565b7f4e4654206973206e6f74206265696e6720466564210000000000000000000000600082015250565b6000614e1c60158361452e565b9150614e2782614de6565b602082019050919050565b60006020820190508181036000830152614e4b81614e0f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614e8c82614456565b9150614e9783614456565b925082821015614eaa57614ea9614e52565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614eef82614456565b9150614efa83614456565b925082614f0a57614f09614eb5565b5b828204905092915050565b6000614f2082614456565b9150614f2b83614456565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f6057614f5f614e52565b5b828201905092915050565b6000614f7682614456565b9150614f8183614456565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614fba57614fb9614e52565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061500c57607f821691505b602082108114156150205761501f614fc5565b5b50919050565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b600061505c60148361452e565b915061506782615026565b602082019050919050565b6000602082019050818103600083015261508b8161504f565b9050919050565b7f4e465420616c7265616479204275726e656420746f204164756c740000000000600082015250565b60006150c8601b8361452e565b91506150d382615092565b602082019050919050565b600060208201905081810360008301526150f7816150bb565b9050919050565b7f4f6e6c792063616c6c61626c652066726f6d205374616b696e6720436f6e747260008201527f6163740000000000000000000000000000000000000000000000000000000000602082015250565b600061515a60238361452e565b9150615165826150fe565b604082019050919050565b600060208201905081810360008301526151898161514d565b9050919050565b60006060820190506151a560008301866144f9565b6151b260208301856144f9565b6151bf60408301846144f9565b949350505050565b6000815190506151d68161463a565b92915050565b6000602082840312156151f2576151f1614391565b5b6000615200848285016151c7565b91505092915050565b600060408201905061521e60008301856144f9565b61522b60208301846144f9565b9392505050565b7f4e4654206e6f7420616e204164756c7421000000000000000000000000000000600082015250565b600061526860118361452e565b915061527382615232565b602082019050919050565b600060208201905081810360008301526152978161525b565b9050919050565b7f507572636861736520776f756c6420657863656564205f504e46545f4d415800600082015250565b60006152d4601f8361452e565b91506152df8261529e565b602082019050919050565b60006020820190508181036000830152615303816152c7565b9050919050565b600061531582614456565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561534857615347614e52565b5b600182019050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461538081614ff4565b61538a8186615353565b945060018216600081146153a557600181146153b6576153e9565b60ff198316865281860193506153e9565b6153bf8561535e565b60005b838110156153e1578154818901526001820191506020810190506153c2565b838801955050505b50505092915050565b60006153fd82614523565b6154078185615353565b935061541781856020860161453f565b80840191505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b6000615459600183615353565b915061546482615423565b600182019050919050565b600061547b8286615373565b915061548782856153f2565b91506154928261544c565b915061549e82846153f2565b9150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f596f7520617265206f776e657221000000000000000000000000000000000000600082015250565b6000615510600e8361452e565b915061551b826154da565b602082019050919050565b6000602082019050818103600083015261553f81615503565b9050919050565b7f45544820616d6f756e74206973206e6f742073756666696369656e7400000000600082015250565b600061557c601c8361452e565b915061558782615546565b602082019050919050565b600060208201905081810360008301526155ab8161556f565b9050919050565b7f4e6f74207265676973746572656420746f2057686974654c6973740000000000600082015250565b60006155e8601b8361452e565b91506155f3826155b2565b602082019050919050565b60006020820190508181036000830152615617816155db565b9050919050565b7f4d696e74206973206e6f742061637469766174656420666f722070726573616c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b600061567a60218361452e565b91506156858261561e565b604082019050919050565b600060208201905081810360008301526156a98161566d565b9050919050565b7f4f766572666c6f7720666f722050524553414c455f4d494e545f4c494d495400600082015250565b60006156e6601f8361452e565b91506156f1826156b0565b602082019050919050565b60006020820190508181036000830152615715816156d9565b9050919050565b7f4d696e74206973206e6f742061637469766174656420666f72207075626c696360008201527f2073616c65000000000000000000000000000000000000000000000000000000602082015250565b600061577860258361452e565b91506157838261571c565b604082019050919050565b600060208201905081810360008301526157a78161576b565b9050919050565b7f416d6f756e7420746f206869676820666f722073696e676c65207472616e736160008201527f6374696f6e000000000000000000000000000000000000000000000000000000602082015250565b600061580a60258361452e565b9150615815826157ae565b604082019050919050565b60006020820190508181036000830152615839816157fd565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061589c60268361452e565b91506158a782615840565b604082019050919050565b600060208201905081810360008301526158cb8161588f565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061590860208361452e565b9150615913826158d2565b602082019050919050565b60006020820190508181036000830152615937816158fb565b9050919050565b7f4665656420646f6573206e6f7420657869737400000000000000000000000000600082015250565b600061597460138361452e565b915061597f8261593e565b602082019050919050565b600060208201905081810360008301526159a381615967565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006159d1826159aa565b6159db81856159b5565b93506159eb81856020860161453f565b6159f481614572565b840191505092915050565b6000608082019050615a146000830187614610565b615a216020830186614610565b615a2e60408301856144f9565b8181036060830152615a4081846159c6565b905095945050505050565b600081519050615a5a816143c7565b92915050565b600060208284031215615a7657615a75614391565b5b6000615a8484828501615a4b565b91505092915050565b6000615a9882614456565b9150615aa383614456565b925082615ab357615ab2614eb5565b5b82820690509291505056fea264697066735822122025079e7fabac94063c8a5dd428b4a684fd41e90174147b8cacb9a1ed28311c5e64736f6c634300080b003368747470733a2f2f697066732e696f2f697066732f516d6348534a6d5a4348795161344e356f67446d5552767a62644c68566b585945566e316868354d527952657978
Deployed Bytecode
0x6080604052600436106102c95760003560e01c806370a0823111610175578063ba5a5e8f116100dc578063df52820011610095578063e90d541a1161006f578063e90d541a14610b1e578063e985e9c514610b47578063efef39a114610b84578063f2fde38b14610ba0576102c9565b8063df52820014610aa3578063e43f696e14610acc578063e825417414610af5576102c9565b8063ba5a5e8f14610983578063c1aacd62146109ac578063c1f26123146109e9578063c555819814610a12578063c87b56dd14610a3d578063d42f21f614610a7a576102c9565b8063a035b1fe1161012e578063a035b1fe14610877578063a22cb465146108a2578063a74f0d7f146108cb578063ab3133be14610908578063b0cc69dd14610931578063b88d4fde1461095a576102c9565b806370a0823114610779578063715018a6146107b65780638da5cb5b146107cd578063928dd6e3146107f857806395d89b41146108235780639791e3891461084e576102c9565b80632d6b622411610234578063523ff8f3116101ed5780635f106cbd116101c75780635f106cbd146106995780636352211e146106c257806367e77770146106ff5780636f9170f61461073c576102c9565b8063523ff8f31461061e5780635ae28fc9146106475780635e1e100414610670576102c9565b80632d6b62241461052457806331384ef31461054f5780633ccfd60b1461058c57806342842e0e146105a35780634fa1278a146105cc578063509484d5146105f5576102c9565b8063095ea7b311610286578063095ea7b31461040257806318160ddd1461042b57806323b872dd146104565780632483ada01461047f57806325f54bf2146104aa57806329a93308146104e7576102c9565b806301ffc9a7146102ce5780630442bfa81461030b578063068c0cb81461033457806306fdde0314610371578063081812fc1461039c578063088a4ed0146103d9575b600080fd5b3480156102da57600080fd5b506102f560048036038101906102f091906143f3565b610bc9565b604051610302919061443b565b60405180910390f35b34801561031757600080fd5b50610332600480360381019061032d919061448c565b610cab565b005b34801561034057600080fd5b5061035b600480360381019061035691906144cc565b610cc5565b6040516103689190614508565b60405180910390f35b34801561037d57600080fd5b50610386610f59565b60405161039391906145bc565b60405180910390f35b3480156103a857600080fd5b506103c360048036038101906103be91906144cc565b610feb565b6040516103d0919061461f565b60405180910390f35b3480156103e557600080fd5b5061040060048036038101906103fb91906144cc565b611067565b005b34801561040e57600080fd5b5061042960048036038101906104249190614666565b611079565b005b34801561043757600080fd5b5061044061117e565b60405161044d9190614508565b60405180910390f35b34801561046257600080fd5b5061047d600480360381019061047891906146a6565b611195565b005b34801561048b57600080fd5b506104946111a5565b6040516104a19190614508565b60405180910390f35b3480156104b657600080fd5b506104d160048036038101906104cc91906144cc565b6111af565b6040516104de9190614508565b60405180910390f35b3480156104f357600080fd5b5061050e600480360381019061050991906144cc565b61139b565b60405161051b919061477f565b60405180910390f35b34801561053057600080fd5b50610539611446565b604051610546919061443b565b60405180910390f35b34801561055b57600080fd5b50610576600480360381019061057191906144cc565b611460565b6040516105839190614508565b60405180910390f35b34801561059857600080fd5b506105a16115d7565b005b3480156105af57600080fd5b506105ca60048036038101906105c591906146a6565b61162e565b005b3480156105d857600080fd5b506105f360048036038101906105ee91906144cc565b61164e565b005b34801561060157600080fd5b5061061c6004803603810190610617919061479a565b611660565b005b34801561062a57600080fd5b50610645600480360381019061064091906147c7565b6116ac565b005b34801561065357600080fd5b5061066e600480360381019061066991906144cc565b6118c3565b005b34801561067c57600080fd5b506106976004803603810190610692919061479a565b6118d5565b005b3480156106a557600080fd5b506106c060048036038101906106bb91906144cc565b611921565b005b3480156106ce57600080fd5b506106e960048036038101906106e491906144cc565b611bef565b6040516106f6919061461f565b60405180910390f35b34801561070b57600080fd5b50610726600480360381019061072191906144cc565b611c05565b604051610733919061443b565b60405180910390f35b34801561074857600080fd5b50610763600480360381019061075e919061479a565b611c44565b604051610770919061443b565b60405180910390f35b34801561078557600080fd5b506107a0600480360381019061079b919061479a565b611c9a565b6040516107ad9190614508565b60405180910390f35b3480156107c257600080fd5b506107cb611d6a565b005b3480156107d957600080fd5b506107e2611d7e565b6040516107ef919061461f565b60405180910390f35b34801561080457600080fd5b5061080d611da8565b60405161081a9190614508565b60405180910390f35b34801561082f57600080fd5b50610838611db2565b60405161084591906145bc565b60405180910390f35b34801561085a57600080fd5b506108756004803603810190610870919061481a565b611e44565b005b34801561088357600080fd5b5061088c611e66565b6040516108999190614508565b60405180910390f35b3480156108ae57600080fd5b506108c960048036038101906108c49190614899565b611e82565b005b3480156108d757600080fd5b506108f260048036038101906108ed91906144cc565b611ffa565b6040516108ff919061443b565b60405180910390f35b34801561091457600080fd5b5061092f600480360381019061092a91906144cc565b61206a565b005b34801561093d57600080fd5b50610958600480360381019061095391906144cc565b61207c565b005b34801561096657600080fd5b50610981600480360381019061097c9190614a0e565b61208e565b005b34801561098f57600080fd5b506109aa60048036038101906109a591906144cc565b612106565b005b3480156109b857600080fd5b506109d360048036038101906109ce91906144cc565b612244565b6040516109e09190614508565b60405180910390f35b3480156109f557600080fd5b50610a106004803603810190610a0b91906144cc565b6123b4565b005b348015610a1e57600080fd5b50610a2761244a565b604051610a34919061443b565b60405180910390f35b348015610a4957600080fd5b50610a646004803603810190610a5f91906144cc565b61248f565b604051610a7191906145bc565b60405180910390f35b348015610a8657600080fd5b50610aa16004803603810190610a9c919061448c565b612603565b005b348015610aaf57600080fd5b50610aca6004803603810190610ac5919061448c565b61261d565b005b348015610ad857600080fd5b50610af36004803603810190610aee9190614b59565b61292a565b005b348015610b0157600080fd5b50610b1c6004803603810190610b179190614c56565b6129c7565b005b348015610b2a57600080fd5b50610b456004803603810190610b40919061448c565b612a01565b005b348015610b5357600080fd5b50610b6e6004803603810190610b699190614cce565b612a1b565b604051610b7b919061443b565b60405180910390f35b610b9e6004803603810190610b9991906144cc565b612aaf565b005b348015610bac57600080fd5b50610bc76004803603810190610bc2919061479a565b612f99565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c9457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ca45750610ca38261301d565b5b9050919050565b610cb3613087565b81601081905550806011819055505050565b6000610cd082613105565b610d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0690614d5a565b60405180910390fd5b600015156021600084815260200190815260200160002060009054906101000a900460ff16151514610d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6d90614dc6565b60405180910390fd5b6000602060008481526020019081526020016000206001015411610dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc690614e32565b60405180910390fd5b6000806020600085815260200190815260200160002060010154148015610e0c575060006020600085815260200190815260200160002060030154115b15610e8957602060008481526020019081526020016000206003015442610e339190614e81565b9050600060185482610e459190614ee4565b90506016548110610e5b57600092505050610f54565b81600182610e699190614f15565b601854610e769190614f6b565b610e809190614e81565b92505050610f54565b6000610e9484613153565b9050600081602060008781526020019081526020016000206000015442610ebb9190614e81565b610ec59190614ee4565b90506016548110610edc5760009350505050610f54565b602060008681526020019081526020016000206000015442610efe9190614e81565b925082600182610f0e9190614f15565b83610f199190614f6b565b1115610f4c5782600182610f2d9190614f15565b83610f389190614f6b565b610f429190614e81565b9350505050610f54565b600093505050505b919050565b606060028054610f6890614ff4565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9490614ff4565b8015610fe15780601f10610fb657610100808354040283529160200191610fe1565b820191906000526020600020905b815481529060010190602001808311610fc457829003601f168201915b5050505050905090565b6000610ff682613105565b61102c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61106f613087565b80600b8190555050565b600061108482611bef565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156110ec576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661110b6132b1565b73ffffffffffffffffffffffffffffffffffffffff161461116e57611137816111326132b1565b612a1b565b61116d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b6111798383836132b9565b505050565b600061118861336b565b6001546000540303905090565b6111a0838383613370565b505050565b6000601454905090565b60006111ba82613105565b6111f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f090615072565b60405180910390fd5b60008073ffffffffffffffffffffffffffffffffffffffff166020600085815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561126e5780915050611396565b600115156021600085815260200190815260200160002060009054906101000a900460ff16151514156112a657601654915050611396565b600060206000858152602001908152602001600020600101541480156112e2575060006020600085815260200190815260200160002060030154115b156113425760185460206000858152602001908152602001600020600301544261130c9190614e81565b6113169190614ee4565b60206000858152602001908152602001600020600401546113379190614e81565b905080915050611396565b600061134d84613153565b9050806020600086815260200190815260200160002060000154426113729190614e81565b61137c9190614ee4565b9150601654821161138d5781611391565b6016545b925050505b919050565b6113a361425c565b602060008381526020019081526020016000206040518060a001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382015481526020016004820154815250509050919050565b6000600c54421161145857600061145b565b60015b905090565b60008015156021600084815260200190815260200160002060009054906101000a900460ff161515146114c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bf906150de565b60405180910390fd5b6000602060008481526020019081526020016000206001015411156115bf5760006114f2836111af565b90506016548114156115bd57601c544261150c9190614e81565b602060008581526020019081526020016000206000015410156115a557601a5460175460206000868152602001908152602001600020600101541061155357601754611593565b601b5460206000868152602001908152602001600020600101541061158e576020600085815260200190815260200160002060010154611592565b601b545b5b61159d9190614ee4565b9150506115d2565b601a546017546115b59190614ee4565b9150506115d2565b505b6019546017546115cf9190614ee4565b90505b919050565b6115df613087565b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561162a573d6000803e3d6000fd5b5050565b6116498383836040518060200160405280600081525061208e565b505050565b611656613087565b8060178190555050565b611668613087565b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461173c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173390615170565b60405180910390fd5b61174583613105565b611784576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177b90615072565b60405180910390fd5b6040518060a0016040528060006020600087815260200190815260200160002060010154116117b357426117cb565b60206000868152602001908152602001600020600001545b81526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525060206000858152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030155608082015181600401559050507f83137dbf2a07be4264eee6531eb1296c5b1db50b89c26a52443867bb0254f66c8383426040516118b693929190615190565b60405180910390a1505050565b6118cb613087565b8060168190555050565b6118dd613087565b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a890615170565b60405180910390fd5b60006119bc826111af565b90506000602060008481526020019081526020016000206040518060a001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820154815260200160048201548152505090506040518060a001604052806000836000015111611a7b5742611a81565b82600001515b8152602001600081526020013073ffffffffffffffffffffffffffffffffffffffff16636352211e866040518263ffffffff1660e01b8152600401611ac69190614508565b602060405180830381865afa158015611ae3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0791906151dc565b73ffffffffffffffffffffffffffffffffffffffff1681526020014281526020018381525060206000858152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030155608082015181600401559050507fec065b81cb968d71da3ae9f263feb929f08d83769aed2784ad32c3985c8660f88342604051611be2929190615209565b60405180910390a1505050565b6000611bfa82613826565b600001519050919050565b6000600115156021600084815260200190815260200160002060009054906101000a900460ff16151514611c3a576000611c3d565b60015b9050919050565b6000601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d02576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611d72613087565b611d7c6000613ab1565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000601554905090565b606060038054611dc190614ff4565b80601f0160208091040260200160405190810160405280929190818152602001828054611ded90614ff4565b8015611e3a5780601f10611e0f57610100808354040283529160200191611e3a565b820191906000526020600020905b815481529060010190602001808311611e1d57829003601f168201915b5050505050905090565b611e4c613087565b82600c819055508060128190555081601381905550505050565b6000600c544210611e7957601154611e7d565b6010545b905090565b611e8a6132b1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611eef576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611efc6132b1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611fa96132b1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fee919061443b565b60405180910390a35050565b6000600115156021600084815260200190815260200160002060009054906101000a900460ff16151514156120325760019050612065565b60165461203e836111af565b141561206057601c5461205083612244565b111561205f5760019050612065565b5b600090505b919050565b612072613087565b8060188190555050565b612084613087565b80601c8190555050565b612099848484613370565b6120b88373ffffffffffffffffffffffffffffffffffffffff16613b77565b15612100576120c984848484613b9a565b6120ff576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218d90615170565b60405180910390fd5b61219f81613105565b6121de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d590615072565b60405180910390fd5b60016021600083815260200190815260200160002060006101000a81548160ff0219169083151502179055507f4518c82e5c3332c053c00f90752a54c6945d539f2113f927d3fa1286be1d11b0816040516122399190614508565b60405180910390a150565b600061224f82613105565b61228e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228590614d5a565b60405180910390fd5b60165461229a836111af565b146122da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d19061527e565b60405180910390fd5b6000602060008481526020019081526020016000206000015411156123aa57600115156021600084815260200190815260200160002060009054906101000a900460ff161515141561234f576020600083815260200190815260200160002060030154426123489190614e81565b90506123af565b600061235a83613153565b9050600160165461236b9190614e81565b816123769190614f6b565b60206000858152602001908152602001600020600001546123979190614f15565b426123a29190614e81565b9150506123af565b600090505b919050565b6123bc613087565b600b54816123ca600a613ceb565b6123d49190614f15565b10612414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240b906152ea565b60405180910390fd5b60005b8181101561243c57612429600a613cf9565b80806124349061530a565b915050612417565b506124473382613d0f565b50565b600060011515612458611446565b15151415612469576000905061248c565b601354600c546124799190614e81565b4211612486576000612489565b60015b90505b90565b606061249a82613105565b6124d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d090615072565b60405180910390fd5b6000600115156021600085815260200190815260200160002060009054906101000a900460ff1615151461251557612510836111af565b612519565b6016545b905042601254600c5461252c9190614f15565b101561256f57600d61253d84613d2d565b61254683613d2d565b6040516020016125589392919061546f565b6040516020818303038152906040529150506125fe565b600e805461257c90614ff4565b80601f01602080910402602001604051908101604052809291908181526020018280546125a890614ff4565b80156125f55780601f106125ca576101008083540402835291602001916125f5565b820191906000526020600020905b8154815290600101906020018083116125d857829003601f168201915b50505050509150505b919050565b61260b613087565b81601481905550806015819055505050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146126ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a490615170565b60405180910390fd5b6126b682613105565b6126f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ec90615072565b60405180910390fd5b6000612700836111af565b90506000602060008581526020019081526020016000206001015411156128ea576000602060008581526020019081526020016000206040518060a001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600382015481526020016004820154815250509050806020015183116127d257826127d8565b80602001515b81602001516127e79190614e81565b8160200181815250506000816020015114156128125742816060018181525050818160800181815250505b6040518060a001604052808260000151815260200182602001518152602001826040015173ffffffffffffffffffffffffffffffffffffffff16815260200182606001518152602001826080015181525060206000868152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040155905050505b7f5e8ada0444a96a09b79bafe5a06038faf1ba99afc98def71ce2f19b2d032966483834260405161291d93929190615190565b60405180910390a1505050565b612932613087565b60005b82518110156129c25781601d6000858481518110612956576129556154ab565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806129ba9061530a565b915050612935565b505050565b6129cf613087565b81600e90805190602001906129e59291906142a1565b5080600d90805190602001906129fc9291906142a1565b505050565b612a09613087565b8160198190555080601a819055505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612ab7611d7e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415612b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1c90615526565b60405180910390fd5b3481612b2f611e66565b612b399190614f6b565b1115612b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7190615592565b60405180910390fd5b600b5481612b88600a613ceb565b612b929190614f15565b10612bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc9906152ea565b60405180910390fd5b600c54421015612de25760011515601d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612c6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c66906155fe565b60405180910390fd5b601354600c54612c7f9190614e81565b4211612cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb790615690565b60405180910390fd5b60145481601e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612d0e9190614f15565b1115612d4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d46906156fc565b60405180910390fd5b80601e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612d9a9190614f15565b601e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612efa565b600c544211612e26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1d9061578e565b60405180910390fd5b601554811115612e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6290615820565b60405180910390fd5b80601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612eb69190614f15565b601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b60005b81811015612f2257612f0f600a613cf9565b8080612f1a9061530a565b915050612efd565b50600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015612f8b573d6000803e3d6000fd5b50612f963382613d0f565b50565b612fa1613087565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613011576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613008906158b2565b60405180910390fd5b61301a81613ab1565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61308f6132b1565b73ffffffffffffffffffffffffffffffffffffffff166130ad611d7e565b73ffffffffffffffffffffffffffffffffffffffff1614613103576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130fa9061591e565b60405180910390fd5b565b60008161311061336b565b1115801561311f575060005482105b801561314c575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b6000806020600084815260200190815260200160002060010154116131ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131a49061598a565b60405180910390fd5b6000602060008481526020019081526020016000206040518060a001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160038201548152602001600482015481525050905060006017548260200151116132645760175461326a565b81602001515b9050600082602001518261327e9190614ee4565b90506000811461328e5780613291565b60015b90506000601854826132a39190614f6b565b905080945050505050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061337b82613826565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146133e6576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166134076132b1565b73ffffffffffffffffffffffffffffffffffffffff1614806134365750613435856134306132b1565b612a1b565b5b8061347b57506134446132b1565b73ffffffffffffffffffffffffffffffffffffffff1661346384610feb565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806134b4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561351b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6135288585856001613e8e565b613534600084876132b9565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156137b45760005482146137b357878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461381f8585856001613e94565b5050505050565b61382e614327565b60008290508061383c61336b565b11613a7a57600054811015613a79576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151613a7757600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461395b578092505050613aac565b5b600115613a7657818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614613a71578092505050613aac565b61395c565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613bc06132b1565b8786866040518563ffffffff1660e01b8152600401613be294939291906159ff565b6020604051808303816000875af1925050508015613c1e57506040513d601f19601f82011682018060405250810190613c1b9190615a60565b60015b613c98573d8060008114613c4e576040519150601f19603f3d011682016040523d82523d6000602084013e613c53565b606091505b50600081511415613c90576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b613d29828260405180602001604052806000815250613e9a565b5050565b60606000821415613d75576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613e89565b600082905060005b60008214613da7578080613d909061530a565b915050600a82613da09190614ee4565b9150613d7d565b60008167ffffffffffffffff811115613dc357613dc26148e3565b5b6040519080825280601f01601f191660200182016040528015613df55781602001600182028036833780820191505090505b5090505b60008514613e8257600182613e0e9190614e81565b9150600a85613e1d9190615a8d565b6030613e299190614f15565b60f81b818381518110613e3f57613e3e6154ab565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613e7b9190614ee4565b9450613df9565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613f07576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415613f42576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613f4f6000858386613e8e565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600084820190506141108673ffffffffffffffffffffffffffffffffffffffff16613b77565b156141d5575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46141856000878480600101955087613b9a565b6141bb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106141165782600054146141d057600080fd5b614240565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106141d6575b8160008190555050506142566000858386613e94565b50505050565b6040518060a001604052806000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081525090565b8280546142ad90614ff4565b90600052602060002090601f0160209004810192826142cf5760008555614316565b82601f106142e857805160ff1916838001178555614316565b82800160010185558215614316579182015b828111156143155782518255916020019190600101906142fa565b5b509050614323919061436a565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561438357600081600090555060010161436b565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6143d08161439b565b81146143db57600080fd5b50565b6000813590506143ed816143c7565b92915050565b60006020828403121561440957614408614391565b5b6000614417848285016143de565b91505092915050565b60008115159050919050565b61443581614420565b82525050565b6000602082019050614450600083018461442c565b92915050565b6000819050919050565b61446981614456565b811461447457600080fd5b50565b60008135905061448681614460565b92915050565b600080604083850312156144a3576144a2614391565b5b60006144b185828601614477565b92505060206144c285828601614477565b9150509250929050565b6000602082840312156144e2576144e1614391565b5b60006144f084828501614477565b91505092915050565b61450281614456565b82525050565b600060208201905061451d60008301846144f9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561455d578082015181840152602081019050614542565b8381111561456c576000848401525b50505050565b6000601f19601f8301169050919050565b600061458e82614523565b614598818561452e565b93506145a881856020860161453f565b6145b181614572565b840191505092915050565b600060208201905081810360008301526145d68184614583565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614609826145de565b9050919050565b614619816145fe565b82525050565b60006020820190506146346000830184614610565b92915050565b614643816145fe565b811461464e57600080fd5b50565b6000813590506146608161463a565b92915050565b6000806040838503121561467d5761467c614391565b5b600061468b85828601614651565b925050602061469c85828601614477565b9150509250929050565b6000806000606084860312156146bf576146be614391565b5b60006146cd86828701614651565b93505060206146de86828701614651565b92505060406146ef86828701614477565b9150509250925092565b61470281614456565b82525050565b614711816145fe565b82525050565b60a08201600082015161472d60008501826146f9565b50602082015161474060208501826146f9565b5060408201516147536040850182614708565b50606082015161476660608501826146f9565b50608082015161477960808501826146f9565b50505050565b600060a0820190506147946000830184614717565b92915050565b6000602082840312156147b0576147af614391565b5b60006147be84828501614651565b91505092915050565b6000806000606084860312156147e0576147df614391565b5b60006147ee86828701614477565b93505060206147ff86828701614477565b925050604061481086828701614651565b9150509250925092565b60008060006060848603121561483357614832614391565b5b600061484186828701614477565b935050602061485286828701614477565b925050604061486386828701614477565b9150509250925092565b61487681614420565b811461488157600080fd5b50565b6000813590506148938161486d565b92915050565b600080604083850312156148b0576148af614391565b5b60006148be85828601614651565b92505060206148cf85828601614884565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61491b82614572565b810181811067ffffffffffffffff8211171561493a576149396148e3565b5b80604052505050565b600061494d614387565b90506149598282614912565b919050565b600067ffffffffffffffff821115614979576149786148e3565b5b61498282614572565b9050602081019050919050565b82818337600083830152505050565b60006149b16149ac8461495e565b614943565b9050828152602081018484840111156149cd576149cc6148de565b5b6149d884828561498f565b509392505050565b600082601f8301126149f5576149f46148d9565b5b8135614a0584826020860161499e565b91505092915050565b60008060008060808587031215614a2857614a27614391565b5b6000614a3687828801614651565b9450506020614a4787828801614651565b9350506040614a5887828801614477565b925050606085013567ffffffffffffffff811115614a7957614a78614396565b5b614a85878288016149e0565b91505092959194509250565b600067ffffffffffffffff821115614aac57614aab6148e3565b5b602082029050602081019050919050565b600080fd5b6000614ad5614ad084614a91565b614943565b90508083825260208201905060208402830185811115614af857614af7614abd565b5b835b81811015614b215780614b0d8882614651565b845260208401935050602081019050614afa565b5050509392505050565b600082601f830112614b4057614b3f6148d9565b5b8135614b50848260208601614ac2565b91505092915050565b60008060408385031215614b7057614b6f614391565b5b600083013567ffffffffffffffff811115614b8e57614b8d614396565b5b614b9a85828601614b2b565b9250506020614bab85828601614884565b9150509250929050565b600067ffffffffffffffff821115614bd057614bcf6148e3565b5b614bd982614572565b9050602081019050919050565b6000614bf9614bf484614bb5565b614943565b905082815260208101848484011115614c1557614c146148de565b5b614c2084828561498f565b509392505050565b600082601f830112614c3d57614c3c6148d9565b5b8135614c4d848260208601614be6565b91505092915050565b60008060408385031215614c6d57614c6c614391565b5b600083013567ffffffffffffffff811115614c8b57614c8a614396565b5b614c9785828601614c28565b925050602083013567ffffffffffffffff811115614cb857614cb7614396565b5b614cc485828601614c28565b9150509250929050565b60008060408385031215614ce557614ce4614391565b5b6000614cf385828601614651565b9250506020614d0485828601614651565b9150509250929050565b7f4e465420646f6573206e6f742065786973740000000000000000000000000000600082015250565b6000614d4460128361452e565b9150614d4f82614d0e565b602082019050919050565b60006020820190508181036000830152614d7381614d37565b9050919050565b7f4e465420616c7265616479206174204d61780000000000000000000000000000600082015250565b6000614db060128361452e565b9150614dbb82614d7a565b602082019050919050565b60006020820190508181036000830152614ddf81614da3565b9050919050565b7f4e4654206973206e6f74206265696e6720466564210000000000000000000000600082015250565b6000614e1c60158361452e565b9150614e2782614de6565b602082019050919050565b60006020820190508181036000830152614e4b81614e0f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614e8c82614456565b9150614e9783614456565b925082821015614eaa57614ea9614e52565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614eef82614456565b9150614efa83614456565b925082614f0a57614f09614eb5565b5b828204905092915050565b6000614f2082614456565b9150614f2b83614456565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f6057614f5f614e52565b5b828201905092915050565b6000614f7682614456565b9150614f8183614456565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614fba57614fb9614e52565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061500c57607f821691505b602082108114156150205761501f614fc5565b5b50919050565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b600061505c60148361452e565b915061506782615026565b602082019050919050565b6000602082019050818103600083015261508b8161504f565b9050919050565b7f4e465420616c7265616479204275726e656420746f204164756c740000000000600082015250565b60006150c8601b8361452e565b91506150d382615092565b602082019050919050565b600060208201905081810360008301526150f7816150bb565b9050919050565b7f4f6e6c792063616c6c61626c652066726f6d205374616b696e6720436f6e747260008201527f6163740000000000000000000000000000000000000000000000000000000000602082015250565b600061515a60238361452e565b9150615165826150fe565b604082019050919050565b600060208201905081810360008301526151898161514d565b9050919050565b60006060820190506151a560008301866144f9565b6151b260208301856144f9565b6151bf60408301846144f9565b949350505050565b6000815190506151d68161463a565b92915050565b6000602082840312156151f2576151f1614391565b5b6000615200848285016151c7565b91505092915050565b600060408201905061521e60008301856144f9565b61522b60208301846144f9565b9392505050565b7f4e4654206e6f7420616e204164756c7421000000000000000000000000000000600082015250565b600061526860118361452e565b915061527382615232565b602082019050919050565b600060208201905081810360008301526152978161525b565b9050919050565b7f507572636861736520776f756c6420657863656564205f504e46545f4d415800600082015250565b60006152d4601f8361452e565b91506152df8261529e565b602082019050919050565b60006020820190508181036000830152615303816152c7565b9050919050565b600061531582614456565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561534857615347614e52565b5b600182019050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461538081614ff4565b61538a8186615353565b945060018216600081146153a557600181146153b6576153e9565b60ff198316865281860193506153e9565b6153bf8561535e565b60005b838110156153e1578154818901526001820191506020810190506153c2565b838801955050505b50505092915050565b60006153fd82614523565b6154078185615353565b935061541781856020860161453f565b80840191505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b6000615459600183615353565b915061546482615423565b600182019050919050565b600061547b8286615373565b915061548782856153f2565b91506154928261544c565b915061549e82846153f2565b9150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f596f7520617265206f776e657221000000000000000000000000000000000000600082015250565b6000615510600e8361452e565b915061551b826154da565b602082019050919050565b6000602082019050818103600083015261553f81615503565b9050919050565b7f45544820616d6f756e74206973206e6f742073756666696369656e7400000000600082015250565b600061557c601c8361452e565b915061558782615546565b602082019050919050565b600060208201905081810360008301526155ab8161556f565b9050919050565b7f4e6f74207265676973746572656420746f2057686974654c6973740000000000600082015250565b60006155e8601b8361452e565b91506155f3826155b2565b602082019050919050565b60006020820190508181036000830152615617816155db565b9050919050565b7f4d696e74206973206e6f742061637469766174656420666f722070726573616c60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b600061567a60218361452e565b91506156858261561e565b604082019050919050565b600060208201905081810360008301526156a98161566d565b9050919050565b7f4f766572666c6f7720666f722050524553414c455f4d494e545f4c494d495400600082015250565b60006156e6601f8361452e565b91506156f1826156b0565b602082019050919050565b60006020820190508181036000830152615715816156d9565b9050919050565b7f4d696e74206973206e6f742061637469766174656420666f72207075626c696360008201527f2073616c65000000000000000000000000000000000000000000000000000000602082015250565b600061577860258361452e565b91506157838261571c565b604082019050919050565b600060208201905081810360008301526157a78161576b565b9050919050565b7f416d6f756e7420746f206869676820666f722073696e676c65207472616e736160008201527f6374696f6e000000000000000000000000000000000000000000000000000000602082015250565b600061580a60258361452e565b9150615815826157ae565b604082019050919050565b60006020820190508181036000830152615839816157fd565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061589c60268361452e565b91506158a782615840565b604082019050919050565b600060208201905081810360008301526158cb8161588f565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061590860208361452e565b9150615913826158d2565b602082019050919050565b60006020820190508181036000830152615937816158fb565b9050919050565b7f4665656420646f6573206e6f7420657869737400000000000000000000000000600082015250565b600061597460138361452e565b915061597f8261593e565b602082019050919050565b600060208201905081810360008301526159a381615967565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006159d1826159aa565b6159db81856159b5565b93506159eb81856020860161453f565b6159f481614572565b840191505092915050565b6000608082019050615a146000830187614610565b615a216020830186614610565b615a2e60408301856144f9565b8181036060830152615a4081846159c6565b905095945050505050565b600081519050615a5a816143c7565b92915050565b600060208284031215615a7657615a75614391565b5b6000615a8484828501615a4b565b91505092915050565b6000615a9882614456565b9150615aa383614456565b925082615ab357615ab2614eb5565b5b82820690509291505056fea264697066735822122025079e7fabac94063c8a5dd428b4a684fd41e90174147b8cacb9a1ed28311c5e64736f6c634300080b0033
Deployed Bytecode Sourcemap
49678:14010:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26530:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53506:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59009:1039;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29645:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31149:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51926:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30711:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25770:312;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32014:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53905:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58270:691;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57593:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61939:123;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56701:640;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61440:145;;;;;;;;;;;;;:::i;:::-;;32255:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52236:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52036:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54396:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52141:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52754:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55794:418;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29453:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57408:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53385:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26899:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48698:103;;;;;;;;;;;;;:::i;:::-;;48050:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54010:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29814:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52892:240;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61593:132;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31425:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60690:280;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52351:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52629:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32511:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56317:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60093:498;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62070:297;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61731:202;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60978:454;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53700:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54931:737;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53140:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54117:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52462:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31783:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62375:1305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48956:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26530:305;26632:4;26684:25;26669:40;;;:11;:40;;;;:105;;;;26741:33;26726:48;;;:11;:48;;;;26669:105;:158;;;;26791:36;26815:11;26791:23;:36::i;:::-;26669:158;26649:178;;26530:305;;;:::o;53506:186::-;47936:13;:11;:13::i;:::-;53625:16:::1;53609:13;:32;;;;53668:15;53653:12;:30;;;;53506:186:::0;;:::o;59009:1039::-;59072:7;59093:16;59101:7;59093;:16::i;:::-;59085:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;59171:5;59145:31;;:13;:22;59159:7;59145:22;;;;;;;;;;;;;;;;;;;;;:31;;;59137:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;59234:1;59212:6;:15;59219:7;59212:15;;;;;;;;;;;:19;;;:23;59204:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;59267:19;59385:1;59362:6;:15;59369:7;59362:15;;;;;;;;;;;:19;;;:24;:55;;;;;59416:1;59390:6;:15;59397:7;59390:15;;;;;;;;;;;:23;;;:27;59362:55;59358:307;;;59461:6;:15;59468:7;59461:15;;;;;;;;;;;:23;;;59443:15;:41;;;;:::i;:::-;59429:55;;59490:19;59527:11;;59513;:25;;;;:::i;:::-;59490:49;;59564:7;;59549:11;:22;59545:50;;59587:1;59580:8;;;;;;59545:50;59648:11;59642:1;59628:11;:15;;;;:::i;:::-;59613:11;;:31;;;;:::i;:::-;59612:47;;;;:::i;:::-;59605:54;;;;;;59358:307;59673:20;59696:27;59715:7;59696:18;:27::i;:::-;59673:50;;59728:14;59790:12;59764:6;:15;59771:7;59764:15;;;;;;;;;;;:22;;;59746:15;:40;;;;:::i;:::-;59745:57;;;;:::i;:::-;59728:74;;59825:7;;59815:6;:17;59811:42;;59846:1;59839:8;;;;;;;59811:42;59893:6;:15;59900:7;59893:15;;;;;;;;;;;:22;;;59875:15;:40;;;;:::i;:::-;59861:54;;59956:11;59950:1;59941:6;:10;;;;:::i;:::-;59925:12;:27;;;;:::i;:::-;59924:43;59920:111;;;60014:11;60008:1;59999:6;:10;;;;:::i;:::-;59983:12;:27;;;;:::i;:::-;59982:43;;;;:::i;:::-;59975:50;;;;;;;59920:111;60042:1;60035:8;;;;;59009:1039;;;;:::o;29645:100::-;29699:13;29732:5;29725:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29645:100;:::o;31149:204::-;31217:7;31242:16;31250:7;31242;:16::i;:::-;31237:64;;31267:34;;;;;;;;;;;;;;31237:64;31321:15;:24;31337:7;31321:24;;;;;;;;;;;;;;;;;;;;;31314:31;;31149:204;;;:::o;51926:104::-;47936:13;:11;:13::i;:::-;52013:9:::1;52001;:21;;;;51926:104:::0;:::o;30711:372::-;30784:13;30800:24;30816:7;30800:15;:24::i;:::-;30784:40;;30845:5;30839:11;;:2;:11;;;30835:48;;;30859:24;;;;;;;;;;;;;;30835:48;30916:5;30900:21;;:12;:10;:12::i;:::-;:21;;;30896:139;;30927:37;30944:5;30951:12;:10;:12::i;:::-;30927:16;:37::i;:::-;30923:112;;30988:35;;;;;;;;;;;;;;30923:112;30896:139;31047:28;31056:2;31060:7;31069:5;31047:8;:28::i;:::-;30773:310;30711:372;;:::o;25770:312::-;25823:7;26048:15;:13;:15::i;:::-;26033:12;;26017:13;;:28;:46;26010:53;;25770:312;:::o;32014:170::-;32148:28;32158:4;32164:2;32168:7;32148:9;:28::i;:::-;32014:170;;;:::o;53905:99::-;53960:7;53981:18;;53974:25;;53905:99;:::o;58270:691::-;58324:7;58345:16;58353:7;58345;:16::i;:::-;58337:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;58391:14;58462:18;58422:59;;:6;:15;58429:7;58422:15;;;;;;;;;;;:28;;;;;;;;;;;;:59;;;58418:89;;;58495:6;58488:13;;;;;58418:89;58545:4;58519:30;;:13;:22;58533:7;58519:22;;;;;;;;;;;;;;;;;;;;;:30;;;58515:61;;;58563:7;;58556:14;;;;;58515:61;58611:1;58588:6;:15;58595:7;58588:15;;;;;;;;;;;:19;;;:24;:55;;;;;58642:1;58616:6;:15;58623:7;58616:15;;;;;;;;;;;:23;;;:27;58588:55;58584:188;;;58735:11;;58708:6;:15;58715:7;58708:15;;;;;;;;;;;:23;;;58690:15;:41;;;;:::i;:::-;58689:57;;;;:::i;:::-;58659:6;:15;58666:7;58659:15;;;;;;;;;;;:26;;;:88;;;;:::i;:::-;58650:97;;58760:6;58753:13;;;;;58584:188;58780:20;58803:27;58822:7;58803:18;:27::i;:::-;58780:50;;58889:12;58863:6;:15;58870:7;58863:15;;;;;;;;;;;:22;;;58845:15;:40;;;;:::i;:::-;58844:57;;;;:::i;:::-;58835:66;;58927:7;;58918:6;:16;58917:36;;58947:6;58917:36;;;58937:7;;58917:36;58910:43;;;;58270:691;;;;:::o;57593:108::-;57648:11;;:::i;:::-;57678:6;:15;57685:7;57678:15;;;;;;;;;;;57671:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57593:108;;;:::o;61939:123::-;61990:4;62027:15;;62009;:33;62008:49;;62052:5;62008:49;;;62045:4;62008:49;62001:56;;61939:123;:::o;56701:640::-;56761:7;56808:5;56782:31;;:13;:22;56796:7;56782:22;;;;;;;;;;;;;;;;;;;;;:31;;;56774:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;56886:1;56864:6;:15;56871:7;56864:15;;;;;;;;;;;:19;;;:23;56860:430;;;56894:14;56911:16;56919:7;56911;:16::i;:::-;56894:33;;56952:7;;56942:6;:17;56938:347;;;57016:14;;56998:15;:32;;;;:::i;:::-;56972:6;:15;56979:7;56972:15;;;;;;;;;;;:22;;;:59;56968:311;;;57187:16;;57073:12;;57051:6;:15;57058:7;57051:15;;;;;;;;;;;:19;;;:34;57050:133;;57171:12;;57050:133;;;57112:15;;57090:6;:15;57097:7;57090:15;;;;;;;;;;;:19;;;:37;57089:78;;57148:6;:15;57155:7;57148:15;;;;;;;;;;;:19;;;57089:78;;;57130:15;;57089:78;57050:133;57049:154;;;;:::i;:::-;57041:163;;;;;56968:311;57254:16;;57239:12;;:31;;;;:::i;:::-;57231:40;;;;;56938:347;56888:402;56860:430;57317:15;;57302:12;;:30;;;;:::i;:::-;57294:39;;56701:640;;;;:::o;61440:145::-;47936:13;:11;:13::i;:::-;61490:15:::1;61508:21;61490:39;;61548:10;61540:28;;:37;61569:7;61540:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;61479:106;61440:145::o:0;32255:185::-;32393:39;32410:4;32416:2;32420:7;32393:39;;;;;;;;;;;;:16;:39::i;:::-;32255:185;;;:::o;52236:109::-;47936:13;:11;:13::i;:::-;52326:11:::1;52311:12;:26;;;;52236:109:::0;:::o;52036:99::-;47936:13;:11;:13::i;:::-;52123:4:::1;52106:14;;:21;;;;;;;;;;;;;;;;;;52036:99:::0;:::o;54396:413::-;54502:14;;;;;;;;;;;54488:28;;:10;:28;;;54480:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;54575:16;54583:7;54575;:16::i;:::-;54567:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;54643:102;;;;;;;;54672:1;54650:6;:15;54657:7;54650:15;;;;;;;;;;;:19;;;:23;54649:67;;54701:15;54649:67;;;54676:6;:15;54683:7;54676:15;;;;;;;;;;;:22;;;54649:67;54643:102;;;;54719:7;54643:102;;;;54728:10;54643:102;;;;;;54740:1;54643:102;;;;54743:1;54643:102;;;54625:6;:15;54632:7;54625:15;;;;;;;;;;;:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54759:42;54767:7;54776;54785:15;54759:42;;;;;;;;:::i;:::-;;;;;;;;54396:413;;;:::o;52141:89::-;47936:13;:11;:13::i;:::-;52216:6:::1;52206:7;:16;;;;52141:89:::0;:::o;52754:130::-;47936:13;:11;:13::i;:::-;52861:14:::1;52835:15;;:41;;;;;;;;;;;;;;;;;;52754:130:::0;:::o;55794:418::-;55866:14;;;;;;;;;;;55852:28;;:10;:28;;;55844:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;55929:14;55946:16;55954:7;55946;:16::i;:::-;55929:33;;55971:21;55995:6;:15;56002:7;55995:15;;;;;;;;;;;55971:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56033:115;;;;;;;;56058:1;56039:9;:16;;;:20;56038:58;;56081:15;56038:58;;;56062:9;:16;;;56038:58;56033:115;;;;56098:1;56033:115;;;;56101:4;:12;;;56114:7;56101:21;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56033:115;;;;;;56124:15;56033:115;;;;56141:6;56033:115;;;56015:6;:15;56022:7;56015:15;;;;;;;;;;;:133;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56165:39;56179:7;56188:15;56165:39;;;;;;;:::i;:::-;;;;;;;;55839:373;;55794:418;:::o;29453:125::-;29517:7;29544:21;29557:7;29544:12;:21::i;:::-;:26;;;29537:33;;29453:125;;;:::o;57408:133::-;57470:4;57514;57488:30;;:13;:22;57502:7;57488:22;;;;;;;;;;;;;;;;;;;;;:30;;;57487:46;;57528:5;57487:46;;;57521:4;57487:46;57480:53;;57408:133;;;:::o;53385:113::-;53443:4;53467:17;:23;53485:4;53467:23;;;;;;;;;;;;;;;;;;;;;;;;;53460:30;;53385:113;;;:::o;26899:206::-;26963:7;27004:1;26987:19;;:5;:19;;;26983:60;;;27015:28;;;;;;;;;;;;;;26983:60;27069:12;:19;27082:5;27069:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;27061:36;;27054:43;;26899:206;;;:::o;48698:103::-;47936:13;:11;:13::i;:::-;48763:30:::1;48790:1;48763:18;:30::i;:::-;48698:103::o:0;48050:87::-;48096:7;48123:6;;;;;;;;;;;48116:13;;48050:87;:::o;54010:101::-;54068:7;54089:17;;54082:24;;54010:101;:::o;29814:104::-;29870:13;29903:7;29896:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29814:104;:::o;52892:240::-;47936:13;:11;:13::i;:::-;53034:14:::1;53016:15;:32;;;;53074:11;53059:12;:26;;;;53112:12;53096:13;:28;;;;52892:240:::0;;;:::o;61593:132::-;61631:7;61671:15;;61653;:33;61652:65;;61705:12;;61652:65;;;61689:13;;61652:65;61645:72;;61593:132;:::o;31425:287::-;31536:12;:10;:12::i;:::-;31524:24;;:8;:24;;;31520:54;;;31557:17;;;;;;;;;;;;;;31520:54;31632:8;31587:18;:32;31606:12;:10;:12::i;:::-;31587:32;;;;;;;;;;;;;;;:42;31620:8;31587:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;31685:8;31656:48;;31671:12;:10;:12::i;:::-;31656:48;;;31695:8;31656:48;;;;;;:::i;:::-;;;;;;;;31425:287;;:::o;60690:280::-;60758:4;60797;60773:28;;:13;:20;60787:5;60773:20;;;;;;;;;;;;;;;;;;;;;:28;;;60769:57;;;60816:4;60809:11;;;;60769:57;60856:7;;60838:14;60846:5;60838:7;:14::i;:::-;:25;60834:111;;;60899:14;;60875:21;60890:5;60875:14;:21::i;:::-;:38;60871:69;;;60929:4;60922:11;;;;60871:69;60834:111;60960:5;60953:12;;60690:280;;;;:::o;52351:105::-;47936:13;:11;:13::i;:::-;52438:10:::1;52424:11;:24;;;;52351:105:::0;:::o;52629:117::-;47936:13;:11;:13::i;:::-;52725::::1;52708:14;:30;;;;52629:117:::0;:::o;32511:370::-;32678:28;32688:4;32694:2;32698:7;32678:9;:28::i;:::-;32721:15;:2;:13;;;:15::i;:::-;32717:157;;;32742:56;32773:4;32779:2;32783:7;32792:5;32742:30;:56::i;:::-;32738:136;;32822:40;;;;;;;;;;;;;;32738:136;32717:157;32511:370;;;;:::o;56317:285::-;56393:14;;;;;;;;;;;56379:28;;:10;:28;;;56371:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;56466:16;56474:7;56466;:16::i;:::-;56458:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;56547:4;56522:13;:22;56536:7;56522:22;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;56565;56586:7;56565:29;;;;;;:::i;:::-;;;;;;;;56317:285;:::o;60093:498::-;60154:7;60175:16;60183:7;60175;:16::i;:::-;60167:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;60247:7;;60227:16;60235:7;60227;:16::i;:::-;:27;60219:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;60314:1;60289:6;:15;60296:7;60289:15;;;;;;;;;;;:22;;;:26;60285:289;;;60353:4;60327:30;;:13;:22;60341:7;60327:22;;;;;;;;;;;;;;;;;;;;;:30;;;60323:100;;;60392:6;:15;60399:7;60392:15;;;;;;;;;;;:23;;;60374:15;:41;;;;:::i;:::-;60366:50;;;;60323:100;60428:20;60451:27;60470:7;60451:18;:27::i;:::-;60428:50;;60563:1;60553:7;;:11;;;;:::i;:::-;60537:12;:28;;;;:::i;:::-;60511:6;:15;60518:7;60511:15;;;;;;;;;;;:22;;;:55;;;;:::i;:::-;60492:15;:75;;;;:::i;:::-;60484:84;;;;;60285:289;60585:1;60578:8;;60093:498;;;;:::o;62070:297::-;47936:13;:11;:13::i;:::-;62182:9:::1;;62167:12;62143:21;:11;:19;:21::i;:::-;:36;;;;:::i;:::-;:48;62135:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;62241:9;62236:78;62260:12;62256:1;:16;62236:78;;;62285:23;:11;:21;:23::i;:::-;62274:3;;;;;:::i;:::-;;;;62236:78;;;;62324:35;62334:10;62346:12;62324:9;:35::i;:::-;62070:297:::0;:::o;61731:202::-;61783:4;61822;61798:28;;:20;:18;:20::i;:::-;:28;;;61794:58;;;61841:5;61834:12;;;;61794:58;61900:13;;61882:15;;:31;;;;:::i;:::-;61864:15;:49;61863:65;;61923:5;61863:65;;;61916:4;61863:65;61856:72;;61731:202;;:::o;60978:454::-;61052:13;61086:16;61094:7;61086;:16::i;:::-;61078:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;61136:14;61180:4;61154:30;;:13;:22;61168:7;61154:22;;;;;;;;;;;;;;;;;;;;;:30;;;61153:60;;61197:16;61205:7;61197;:16::i;:::-;61153:60;;;61187:7;;61153:60;61136:77;;61263:15;61248:12;;61230:15;;:30;;;;:::i;:::-;:48;61226:171;;;61326:13;61341:18;:7;:16;:18::i;:::-;61366:17;:6;:15;:17::i;:::-;61309:75;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61295:90;;;;;61226:171;61414:10;61407:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60978:454;;;;:::o;53700:199::-;47936:13;:11;:13::i;:::-;53831:16:::1;53810:18;:37;;;;53872:19;53852:17;:39;;;;53700:199:::0;;:::o;54931:737::-;55017:14;;;;;;;;;;;55003:28;;:10;:28;;;54995:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;55090:16;55098:7;55090;:16::i;:::-;55082:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;55140:14;55157:16;55165:7;55157;:16::i;:::-;55140:33;;55209:1;55187:6;:15;55194:7;55187:15;;;;;;;;;;;:19;;;:23;55183:423;;;55219:21;55243:6;:15;55250:7;55243:15;;;;;;;;;;;55219:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55307:9;:13;;;55297:7;:23;:49;;55339:7;55297:49;;;55323:9;:13;;;55297:49;55280:9;:13;;;:67;;;;:::i;:::-;55264:9;:13;;:83;;;;;55379:1;55362:9;:13;;;:18;55358:109;;;55409:15;55389:9;:17;;:35;;;;;55454:6;55431:9;:20;;:29;;;;;55358:109;55496:102;;;;;;;;55501:9;:16;;;55496:102;;;;55519:9;:13;;;55496:102;;;;55534:9;:22;;;55496:102;;;;;;55558:9;:17;;;55496:102;;;;55577:9;:20;;;55496:102;;;55478:6;:15;55485:7;55478:15;;;;;;;;;;;:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55212:394;55183:423;55615:45;55626:7;55635;55644:15;55615:45;;;;;;;;:::i;:::-;;;;;;;;54990:678;54931:737;;:::o;53140:237::-;47936:13;:11;:13::i;:::-;53246:9:::1;53241:129;53265:16;:23;53261:1;:27;53241:129;;;53351:7;53310:17;:38;53328:16;53345:1;53328:19;;;;;;;;:::i;:::-;;;;;;;;53310:38;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;53290:3;;;;;:::i;:::-;;;;53241:129;;;;53140:237:::0;;:::o;54117:153::-;47936:13;:11;:13::i;:::-;54225:9:::1;54212:10;:22;;;;;;;;;;;;:::i;:::-;;54255:7;54239:13;:23;;;;;;;;;;;;:::i;:::-;;54117:153:::0;;:::o;52462:161::-;47936:13;:11;:13::i;:::-;52572:9:::1;52554:15;:27;;;;52605:10;52586:16;:29;;;;52462:161:::0;;:::o;31783:164::-;31880:4;31904:18;:25;31923:5;31904:25;;;;;;;;;;;;;;;:35;31930:8;31904:35;;;;;;;;;;;;;;;;;;;;;;;;;31897:42;;31783:164;;;;:::o;62375:1305::-;62467:7;:5;:7::i;:::-;62453:21;;:10;:21;;;;62445:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;62539:9;62521:14;62511:7;:5;:7::i;:::-;:24;;;;:::i;:::-;:37;;62503:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;62640:9;;62623:14;62599:21;:11;:19;:21::i;:::-;:38;;;;:::i;:::-;:50;62591:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;62719:15;;62701;:33;62697:788;;;62792:4;62759:37;;:17;:29;62777:10;62759:29;;;;;;;;;;;;;;;;;;;;;;;;;:37;;;62751:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;62890:13;;62872:15;;:31;;;;:::i;:::-;62854:15;:49;62846:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;63022:18;;63004:14;62965:24;:36;62990:10;62965:36;;;;;;;;;;;;;;;;:53;;;;:::i;:::-;:75;;62957:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;63168:14;63129:24;:36;63154:10;63129:36;;;;;;;;;;;;;;;;:53;;;;:::i;:::-;63090:24;:36;63115:10;63090:36;;;;;;;;;;;;;;;:92;;;;62697:788;;;63235:15;;63217;:33;63209:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;63324:17;;63306:14;:35;;63298:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;63465:14;63427:23;:35;63451:10;63427:35;;;;;;;;;;;;;;;;:52;;;;:::i;:::-;63389:23;:35;63413:10;63389:35;;;;;;;;;;;;;;;:90;;;;62697:788;63501:9;63497:88;63516:14;63514:1;:16;63497:88;;;63550:23;:11;:21;:23::i;:::-;63531:3;;;;;:::i;:::-;;;;63497:88;;;;63589:15;;;;;;;;;;;:24;;:35;63614:9;63589:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63635:37;63645:10;63657:14;63635:9;:37::i;:::-;62375:1305;:::o;48956:201::-;47936:13;:11;:13::i;:::-;49065:1:::1;49045:22;;:8;:22;;;;49037:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;49121:28;49140:8;49121:18;:28::i;:::-;48956:201:::0;:::o;23513:157::-;23598:4;23637:25;23622:40;;;:11;:40;;;;23615:47;;23513:157;;;:::o;48215:132::-;48290:12;:10;:12::i;:::-;48279:23;;:7;:5;:7::i;:::-;:23;;;48271:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48215:132::o;33136:174::-;33193:4;33236:7;33217:15;:13;:15::i;:::-;:26;;:53;;;;;33257:13;;33247:7;:23;33217:53;:85;;;;;33275:11;:20;33287:7;33275:20;;;;;;;;;;;:27;;;;;;;;;;;;33274:28;33217:85;33210:92;;33136:174;;;:::o;57775:456::-;57841:7;57885:1;57863:6;:15;57870:7;57863:15;;;;;;;;;;;:19;;;:23;57855:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;57919:21;57943:6;:15;57950:7;57943:15;;;;;;;;;;;57919:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57963:19;58002:12;;57986:9;:13;;;:28;57985:61;;58034:12;;57985:61;;;58018:9;:13;;;57985:61;57963:83;;58051:17;58085:9;:13;;;58071:11;:27;;;;:::i;:::-;58051:47;;58129:1;58116:9;:14;58115:32;;58138:9;58115:32;;;58134:1;58115:32;58103:44;;58152:20;58187:11;;58175:9;:23;;;;:::i;:::-;58152:46;;58214:12;58207:19;;;;;;57775:456;;;:::o;19931:98::-;19984:7;20011:10;20004:17;;19931:98;:::o;42358:196::-;42500:2;42473:15;:24;42489:7;42473:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;42538:7;42534:2;42518:28;;42527:5;42518:28;;;;;;;;;;;;42358:196;;;:::o;25544:92::-;25600:7;25544:92;:::o;37306:2130::-;37421:35;37459:21;37472:7;37459:12;:21::i;:::-;37421:59;;37519:4;37497:26;;:13;:18;;;:26;;;37493:67;;37532:28;;;;;;;;;;;;;;37493:67;37573:22;37615:4;37599:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;37636:36;37653:4;37659:12;:10;:12::i;:::-;37636:16;:36::i;:::-;37599:73;:126;;;;37713:12;:10;:12::i;:::-;37689:36;;:20;37701:7;37689:11;:20::i;:::-;:36;;;37599:126;37573:153;;37744:17;37739:66;;37770:35;;;;;;;;;;;;;;37739:66;37834:1;37820:16;;:2;:16;;;37816:52;;;37845:23;;;;;;;;;;;;;;37816:52;37881:43;37903:4;37909:2;37913:7;37922:1;37881:21;:43::i;:::-;37989:35;38006:1;38010:7;38019:4;37989:8;:35::i;:::-;38350:1;38320:12;:18;38333:4;38320:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38394:1;38366:12;:16;38379:2;38366:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38412:31;38446:11;:20;38458:7;38446:20;;;;;;;;;;;38412:54;;38497:2;38481:8;:13;;;:18;;;;;;;;;;;;;;;;;;38547:15;38514:8;:23;;;:49;;;;;;;;;;;;;;;;;;38815:19;38847:1;38837:7;:11;38815:33;;38863:31;38897:11;:24;38909:11;38897:24;;;;;;;;;;;38863:58;;38965:1;38940:27;;:8;:13;;;;;;;;;;;;:27;;;38936:384;;;39150:13;;39135:11;:28;39131:174;;39204:4;39188:8;:13;;;:20;;;;;;;;;;;;;;;;;;39257:13;:28;;;39231:8;:23;;;:54;;;;;;;;;;;;;;;;;;39131:174;38936:384;38295:1036;;;39367:7;39363:2;39348:27;;39357:4;39348:27;;;;;;;;;;;;39386:42;39407:4;39413:2;39417:7;39426:1;39386:20;:42::i;:::-;37410:2026;;37306:2130;;;:::o;28280:1111::-;28342:21;;:::i;:::-;28376:12;28391:7;28376:22;;28459:4;28440:15;:13;:15::i;:::-;:23;28436:888;;28476:13;;28469:4;:20;28465:859;;;28510:31;28544:11;:17;28556:4;28544:17;;;;;;;;;;;28510:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28585:9;:16;;;28580:729;;28656:1;28630:28;;:9;:14;;;:28;;;28626:101;;28694:9;28687:16;;;;;;28626:101;29029:261;29036:4;29029:261;;;29069:6;;;;;;;;29114:11;:17;29126:4;29114:17;;;;;;;;;;;29102:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29188:1;29162:28;;:9;:14;;;:28;;;29158:109;;29230:9;29223:16;;;;;;29158:109;29029:261;;;28580:729;28491:833;28465:859;28436:888;29352:31;;;;;;;;;;;;;;28280:1111;;;;:::o;49317:191::-;49391:16;49410:6;;;;;;;;;;;49391:25;;49436:8;49427:6;;:17;;;;;;;;;;;;;;;;;;49491:8;49460:40;;49481:8;49460:40;;;;;;;;;;;;49380:128;49317:191;:::o;11928:326::-;11988:4;12245:1;12223:7;:19;;;:23;12216:30;;11928:326;;;:::o;43046:667::-;43209:4;43246:2;43230:36;;;43267:12;:10;:12::i;:::-;43281:4;43287:7;43296:5;43230:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;43226:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43481:1;43464:6;:13;:18;43460:235;;;43510:40;;;;;;;;;;;;;;43460:235;43653:6;43647:13;43638:6;43634:2;43630:15;43623:38;43226:480;43359:45;;;43349:55;;;:6;:55;;;;43342:62;;;43046:667;;;;;;:::o;46220:114::-;46285:7;46312;:14;;;46305:21;;46220:114;;;:::o;46342:127::-;46449:1;46431:7;:14;;;:19;;;;;;;;;;;46342:127;:::o;33394:104::-;33463:27;33473:2;33477:8;33463:27;;;;;;;;;;;;:9;:27::i;:::-;33394:104;;:::o;20579:723::-;20635:13;20865:1;20856:5;:10;20852:53;;;20883:10;;;;;;;;;;;;;;;;;;;;;20852:53;20915:12;20930:5;20915:20;;20946:14;20971:78;20986:1;20978:4;:9;20971:78;;21004:8;;;;;:::i;:::-;;;;21035:2;21027:10;;;;;:::i;:::-;;;20971:78;;;21059:19;21091:6;21081:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21059:39;;21109:154;21125:1;21116:5;:10;21109:154;;21153:1;21143:11;;;;;:::i;:::-;;;21220:2;21212:5;:10;;;;:::i;:::-;21199:2;:24;;;;:::i;:::-;21186:39;;21169:6;21176;21169:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;21249:2;21240:11;;;;;:::i;:::-;;;21109:154;;;21287:6;21273:21;;;;;20579:723;;;;:::o;44361:159::-;;;;;:::o;45179:158::-;;;;;:::o;33871:1749::-;33994:20;34017:13;;33994:36;;34059:1;34045:16;;:2;:16;;;34041:48;;;34070:19;;;;;;;;;;;;;;34041:48;34116:1;34104:8;:13;34100:44;;;34126:18;;;;;;;;;;;;;;34100:44;34157:61;34187:1;34191:2;34195:12;34209:8;34157:21;:61::i;:::-;34530:8;34495:12;:16;34508:2;34495:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34594:8;34554:12;:16;34567:2;34554:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34653:2;34620:11;:25;34632:12;34620:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;34720:15;34670:11;:25;34682:12;34670:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;34753:20;34776:12;34753:35;;34803:11;34832:8;34817:12;:23;34803:37;;34861:15;:2;:13;;;:15::i;:::-;34857:631;;;34897:313;34953:12;34949:2;34928:38;;34945:1;34928:38;;;;;;;;;;;;34994:69;35033:1;35037:2;35041:14;;;;;;35057:5;34994:30;:69::i;:::-;34989:174;;35099:40;;;;;;;;;;;;;;34989:174;35205:3;35190:12;:18;34897:313;;35291:12;35274:13;;:29;35270:43;;35305:8;;;35270:43;34857:631;;;35354:119;35410:14;;;;;;35406:2;35385:40;;35402:1;35385:40;;;;;;;;;;;;35468:3;35453:12;:18;35354:119;;34857:631;35518:12;35502:13;:28;;;;34470:1072;;35552:60;35581:1;35585:2;35589:12;35603:8;35552:20;:60::i;:::-;33983:1637;33871:1749;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:122::-;1674:24;1692:5;1674:24;:::i;:::-;1667:5;1664:35;1654:63;;1713:1;1710;1703:12;1654:63;1601:122;:::o;1729:139::-;1775:5;1813:6;1800:20;1791:29;;1829:33;1856:5;1829:33;:::i;:::-;1729:139;;;;:::o;1874:474::-;1942:6;1950;1999:2;1987:9;1978:7;1974:23;1970:32;1967:119;;;2005:79;;:::i;:::-;1967:119;2125:1;2150:53;2195:7;2186:6;2175:9;2171:22;2150:53;:::i;:::-;2140:63;;2096:117;2252:2;2278:53;2323:7;2314:6;2303:9;2299:22;2278:53;:::i;:::-;2268:63;;2223:118;1874:474;;;;;:::o;2354:329::-;2413:6;2462:2;2450:9;2441:7;2437:23;2433:32;2430:119;;;2468:79;;:::i;:::-;2430:119;2588:1;2613:53;2658:7;2649:6;2638:9;2634:22;2613:53;:::i;:::-;2603:63;;2559:117;2354:329;;;;:::o;2689:118::-;2776:24;2794:5;2776:24;:::i;:::-;2771:3;2764:37;2689:118;;:::o;2813:222::-;2906:4;2944:2;2933:9;2929:18;2921:26;;2957:71;3025:1;3014:9;3010:17;3001:6;2957:71;:::i;:::-;2813:222;;;;:::o;3041:99::-;3093:6;3127:5;3121:12;3111:22;;3041:99;;;:::o;3146:169::-;3230:11;3264:6;3259:3;3252:19;3304:4;3299:3;3295:14;3280:29;;3146:169;;;;:::o;3321:307::-;3389:1;3399:113;3413:6;3410:1;3407:13;3399:113;;;3498:1;3493:3;3489:11;3483:18;3479:1;3474:3;3470:11;3463:39;3435:2;3432:1;3428:10;3423:15;;3399:113;;;3530:6;3527:1;3524:13;3521:101;;;3610:1;3601:6;3596:3;3592:16;3585:27;3521:101;3370:258;3321:307;;;:::o;3634:102::-;3675:6;3726:2;3722:7;3717:2;3710:5;3706:14;3702:28;3692:38;;3634:102;;;:::o;3742:364::-;3830:3;3858:39;3891:5;3858:39;:::i;:::-;3913:71;3977:6;3972:3;3913:71;:::i;:::-;3906:78;;3993:52;4038:6;4033:3;4026:4;4019:5;4015:16;3993:52;:::i;:::-;4070:29;4092:6;4070:29;:::i;:::-;4065:3;4061:39;4054:46;;3834:272;3742:364;;;;:::o;4112:313::-;4225:4;4263:2;4252:9;4248:18;4240:26;;4312:9;4306:4;4302:20;4298:1;4287:9;4283:17;4276:47;4340:78;4413:4;4404:6;4340:78;:::i;:::-;4332:86;;4112:313;;;;:::o;4431:126::-;4468:7;4508:42;4501:5;4497:54;4486:65;;4431:126;;;:::o;4563:96::-;4600:7;4629:24;4647:5;4629:24;:::i;:::-;4618:35;;4563:96;;;:::o;4665:118::-;4752:24;4770:5;4752:24;:::i;:::-;4747:3;4740:37;4665:118;;:::o;4789:222::-;4882:4;4920:2;4909:9;4905:18;4897:26;;4933:71;5001:1;4990:9;4986:17;4977:6;4933:71;:::i;:::-;4789:222;;;;:::o;5017:122::-;5090:24;5108:5;5090:24;:::i;:::-;5083:5;5080:35;5070:63;;5129:1;5126;5119:12;5070:63;5017:122;:::o;5145:139::-;5191:5;5229:6;5216:20;5207:29;;5245:33;5272:5;5245:33;:::i;:::-;5145:139;;;;:::o;5290:474::-;5358:6;5366;5415:2;5403:9;5394:7;5390:23;5386:32;5383:119;;;5421:79;;:::i;:::-;5383:119;5541:1;5566:53;5611:7;5602:6;5591:9;5587:22;5566:53;:::i;:::-;5556:63;;5512:117;5668:2;5694:53;5739:7;5730:6;5719:9;5715:22;5694:53;:::i;:::-;5684:63;;5639:118;5290:474;;;;;:::o;5770:619::-;5847:6;5855;5863;5912:2;5900:9;5891:7;5887:23;5883:32;5880:119;;;5918:79;;:::i;:::-;5880:119;6038:1;6063:53;6108:7;6099:6;6088:9;6084:22;6063:53;:::i;:::-;6053:63;;6009:117;6165:2;6191:53;6236:7;6227:6;6216:9;6212:22;6191:53;:::i;:::-;6181:63;;6136:118;6293:2;6319:53;6364:7;6355:6;6344:9;6340:22;6319:53;:::i;:::-;6309:63;;6264:118;5770:619;;;;;:::o;6395:108::-;6472:24;6490:5;6472:24;:::i;:::-;6467:3;6460:37;6395:108;;:::o;6509:::-;6586:24;6604:5;6586:24;:::i;:::-;6581:3;6574:37;6509:108;;:::o;6681:1041::-;6822:4;6817:3;6813:14;6911:4;6904:5;6900:16;6894:23;6930:63;6987:4;6982:3;6978:14;6964:12;6930:63;:::i;:::-;6837:166;7084:4;7077:5;7073:16;7067:23;7103:63;7160:4;7155:3;7151:14;7137:12;7103:63;:::i;:::-;7013:163;7266:4;7259:5;7255:16;7249:23;7285:63;7342:4;7337:3;7333:14;7319:12;7285:63;:::i;:::-;7186:172;7443:4;7436:5;7432:16;7426:23;7462:63;7519:4;7514:3;7510:14;7496:12;7462:63;:::i;:::-;7368:167;7623:4;7616:5;7612:16;7606:23;7642:63;7699:4;7694:3;7690:14;7676:12;7642:63;:::i;:::-;7545:170;6791:931;6681:1041;;:::o;7728:311::-;7865:4;7903:3;7892:9;7888:19;7880:27;;7917:115;8029:1;8018:9;8014:17;8005:6;7917:115;:::i;:::-;7728:311;;;;:::o;8045:329::-;8104:6;8153:2;8141:9;8132:7;8128:23;8124:32;8121:119;;;8159:79;;:::i;:::-;8121:119;8279:1;8304:53;8349:7;8340:6;8329:9;8325:22;8304:53;:::i;:::-;8294:63;;8250:117;8045:329;;;;:::o;8380:619::-;8457:6;8465;8473;8522:2;8510:9;8501:7;8497:23;8493:32;8490:119;;;8528:79;;:::i;:::-;8490:119;8648:1;8673:53;8718:7;8709:6;8698:9;8694:22;8673:53;:::i;:::-;8663:63;;8619:117;8775:2;8801:53;8846:7;8837:6;8826:9;8822:22;8801:53;:::i;:::-;8791:63;;8746:118;8903:2;8929:53;8974:7;8965:6;8954:9;8950:22;8929:53;:::i;:::-;8919:63;;8874:118;8380:619;;;;;:::o;9005:::-;9082:6;9090;9098;9147:2;9135:9;9126:7;9122:23;9118:32;9115:119;;;9153:79;;:::i;:::-;9115:119;9273:1;9298:53;9343:7;9334:6;9323:9;9319:22;9298:53;:::i;:::-;9288:63;;9244:117;9400:2;9426:53;9471:7;9462:6;9451:9;9447:22;9426:53;:::i;:::-;9416:63;;9371:118;9528:2;9554:53;9599:7;9590:6;9579:9;9575:22;9554:53;:::i;:::-;9544:63;;9499:118;9005:619;;;;;:::o;9630:116::-;9700:21;9715:5;9700:21;:::i;:::-;9693:5;9690:32;9680:60;;9736:1;9733;9726:12;9680:60;9630:116;:::o;9752:133::-;9795:5;9833:6;9820:20;9811:29;;9849:30;9873:5;9849:30;:::i;:::-;9752:133;;;;:::o;9891:468::-;9956:6;9964;10013:2;10001:9;9992:7;9988:23;9984:32;9981:119;;;10019:79;;:::i;:::-;9981:119;10139:1;10164:53;10209:7;10200:6;10189:9;10185:22;10164:53;:::i;:::-;10154:63;;10110:117;10266:2;10292:50;10334:7;10325:6;10314:9;10310:22;10292:50;:::i;:::-;10282:60;;10237:115;9891:468;;;;;:::o;10365:117::-;10474:1;10471;10464:12;10488:117;10597:1;10594;10587:12;10611:180;10659:77;10656:1;10649:88;10756:4;10753:1;10746:15;10780:4;10777:1;10770:15;10797:281;10880:27;10902:4;10880:27;:::i;:::-;10872:6;10868:40;11010:6;10998:10;10995:22;10974:18;10962:10;10959:34;10956:62;10953:88;;;11021:18;;:::i;:::-;10953:88;11061:10;11057:2;11050:22;10840:238;10797:281;;:::o;11084:129::-;11118:6;11145:20;;:::i;:::-;11135:30;;11174:33;11202:4;11194:6;11174:33;:::i;:::-;11084:129;;;:::o;11219:307::-;11280:4;11370:18;11362:6;11359:30;11356:56;;;11392:18;;:::i;:::-;11356:56;11430:29;11452:6;11430:29;:::i;:::-;11422:37;;11514:4;11508;11504:15;11496:23;;11219:307;;;:::o;11532:154::-;11616:6;11611:3;11606;11593:30;11678:1;11669:6;11664:3;11660:16;11653:27;11532:154;;;:::o;11692:410::-;11769:5;11794:65;11810:48;11851:6;11810:48;:::i;:::-;11794:65;:::i;:::-;11785:74;;11882:6;11875:5;11868:21;11920:4;11913:5;11909:16;11958:3;11949:6;11944:3;11940:16;11937:25;11934:112;;;11965:79;;:::i;:::-;11934:112;12055:41;12089:6;12084:3;12079;12055:41;:::i;:::-;11775:327;11692:410;;;;;:::o;12121:338::-;12176:5;12225:3;12218:4;12210:6;12206:17;12202:27;12192:122;;12233:79;;:::i;:::-;12192:122;12350:6;12337:20;12375:78;12449:3;12441:6;12434:4;12426:6;12422:17;12375:78;:::i;:::-;12366:87;;12182:277;12121:338;;;;:::o;12465:943::-;12560:6;12568;12576;12584;12633:3;12621:9;12612:7;12608:23;12604:33;12601:120;;;12640:79;;:::i;:::-;12601:120;12760:1;12785:53;12830:7;12821:6;12810:9;12806:22;12785:53;:::i;:::-;12775:63;;12731:117;12887:2;12913:53;12958:7;12949:6;12938:9;12934:22;12913:53;:::i;:::-;12903:63;;12858:118;13015:2;13041:53;13086:7;13077:6;13066:9;13062:22;13041:53;:::i;:::-;13031:63;;12986:118;13171:2;13160:9;13156:18;13143:32;13202:18;13194:6;13191:30;13188:117;;;13224:79;;:::i;:::-;13188:117;13329:62;13383:7;13374:6;13363:9;13359:22;13329:62;:::i;:::-;13319:72;;13114:287;12465:943;;;;;;;:::o;13414:311::-;13491:4;13581:18;13573:6;13570:30;13567:56;;;13603:18;;:::i;:::-;13567:56;13653:4;13645:6;13641:17;13633:25;;13713:4;13707;13703:15;13695:23;;13414:311;;;:::o;13731:117::-;13840:1;13837;13830:12;13871:710;13967:5;13992:81;14008:64;14065:6;14008:64;:::i;:::-;13992:81;:::i;:::-;13983:90;;14093:5;14122:6;14115:5;14108:21;14156:4;14149:5;14145:16;14138:23;;14209:4;14201:6;14197:17;14189:6;14185:30;14238:3;14230:6;14227:15;14224:122;;;14257:79;;:::i;:::-;14224:122;14372:6;14355:220;14389:6;14384:3;14381:15;14355:220;;;14464:3;14493:37;14526:3;14514:10;14493:37;:::i;:::-;14488:3;14481:50;14560:4;14555:3;14551:14;14544:21;;14431:144;14415:4;14410:3;14406:14;14399:21;;14355:220;;;14359:21;13973:608;;13871:710;;;;;:::o;14604:370::-;14675:5;14724:3;14717:4;14709:6;14705:17;14701:27;14691:122;;14732:79;;:::i;:::-;14691:122;14849:6;14836:20;14874:94;14964:3;14956:6;14949:4;14941:6;14937:17;14874:94;:::i;:::-;14865:103;;14681:293;14604:370;;;;:::o;14980:678::-;15070:6;15078;15127:2;15115:9;15106:7;15102:23;15098:32;15095:119;;;15133:79;;:::i;:::-;15095:119;15281:1;15270:9;15266:17;15253:31;15311:18;15303:6;15300:30;15297:117;;;15333:79;;:::i;:::-;15297:117;15438:78;15508:7;15499:6;15488:9;15484:22;15438:78;:::i;:::-;15428:88;;15224:302;15565:2;15591:50;15633:7;15624:6;15613:9;15609:22;15591:50;:::i;:::-;15581:60;;15536:115;14980:678;;;;;:::o;15664:308::-;15726:4;15816:18;15808:6;15805:30;15802:56;;;15838:18;;:::i;:::-;15802:56;15876:29;15898:6;15876:29;:::i;:::-;15868:37;;15960:4;15954;15950:15;15942:23;;15664:308;;;:::o;15978:412::-;16056:5;16081:66;16097:49;16139:6;16097:49;:::i;:::-;16081:66;:::i;:::-;16072:75;;16170:6;16163:5;16156:21;16208:4;16201:5;16197:16;16246:3;16237:6;16232:3;16228:16;16225:25;16222:112;;;16253:79;;:::i;:::-;16222:112;16343:41;16377:6;16372:3;16367;16343:41;:::i;:::-;16062:328;15978:412;;;;;:::o;16410:340::-;16466:5;16515:3;16508:4;16500:6;16496:17;16492:27;16482:122;;16523:79;;:::i;:::-;16482:122;16640:6;16627:20;16665:79;16740:3;16732:6;16725:4;16717:6;16713:17;16665:79;:::i;:::-;16656:88;;16472:278;16410:340;;;;:::o;16756:834::-;16844:6;16852;16901:2;16889:9;16880:7;16876:23;16872:32;16869:119;;;16907:79;;:::i;:::-;16869:119;17055:1;17044:9;17040:17;17027:31;17085:18;17077:6;17074:30;17071:117;;;17107:79;;:::i;:::-;17071:117;17212:63;17267:7;17258:6;17247:9;17243:22;17212:63;:::i;:::-;17202:73;;16998:287;17352:2;17341:9;17337:18;17324:32;17383:18;17375:6;17372:30;17369:117;;;17405:79;;:::i;:::-;17369:117;17510:63;17565:7;17556:6;17545:9;17541:22;17510:63;:::i;:::-;17500:73;;17295:288;16756:834;;;;;:::o;17596:474::-;17664:6;17672;17721:2;17709:9;17700:7;17696:23;17692:32;17689:119;;;17727:79;;:::i;:::-;17689:119;17847:1;17872:53;17917:7;17908:6;17897:9;17893:22;17872:53;:::i;:::-;17862:63;;17818:117;17974:2;18000:53;18045:7;18036:6;18025:9;18021:22;18000:53;:::i;:::-;17990:63;;17945:118;17596:474;;;;;:::o;18076:168::-;18216:20;18212:1;18204:6;18200:14;18193:44;18076:168;:::o;18250:366::-;18392:3;18413:67;18477:2;18472:3;18413:67;:::i;:::-;18406:74;;18489:93;18578:3;18489:93;:::i;:::-;18607:2;18602:3;18598:12;18591:19;;18250:366;;;:::o;18622:419::-;18788:4;18826:2;18815:9;18811:18;18803:26;;18875:9;18869:4;18865:20;18861:1;18850:9;18846:17;18839:47;18903:131;19029:4;18903:131;:::i;:::-;18895:139;;18622:419;;;:::o;19047:168::-;19187:20;19183:1;19175:6;19171:14;19164:44;19047:168;:::o;19221:366::-;19363:3;19384:67;19448:2;19443:3;19384:67;:::i;:::-;19377:74;;19460:93;19549:3;19460:93;:::i;:::-;19578:2;19573:3;19569:12;19562:19;;19221:366;;;:::o;19593:419::-;19759:4;19797:2;19786:9;19782:18;19774:26;;19846:9;19840:4;19836:20;19832:1;19821:9;19817:17;19810:47;19874:131;20000:4;19874:131;:::i;:::-;19866:139;;19593:419;;;:::o;20018:171::-;20158:23;20154:1;20146:6;20142:14;20135:47;20018:171;:::o;20195:366::-;20337:3;20358:67;20422:2;20417:3;20358:67;:::i;:::-;20351:74;;20434:93;20523:3;20434:93;:::i;:::-;20552:2;20547:3;20543:12;20536:19;;20195:366;;;:::o;20567:419::-;20733:4;20771:2;20760:9;20756:18;20748:26;;20820:9;20814:4;20810:20;20806:1;20795:9;20791:17;20784:47;20848:131;20974:4;20848:131;:::i;:::-;20840:139;;20567:419;;;:::o;20992:180::-;21040:77;21037:1;21030:88;21137:4;21134:1;21127:15;21161:4;21158:1;21151:15;21178:191;21218:4;21238:20;21256:1;21238:20;:::i;:::-;21233:25;;21272:20;21290:1;21272:20;:::i;:::-;21267:25;;21311:1;21308;21305:8;21302:34;;;21316:18;;:::i;:::-;21302:34;21361:1;21358;21354:9;21346:17;;21178:191;;;;:::o;21375:180::-;21423:77;21420:1;21413:88;21520:4;21517:1;21510:15;21544:4;21541:1;21534:15;21561:185;21601:1;21618:20;21636:1;21618:20;:::i;:::-;21613:25;;21652:20;21670:1;21652:20;:::i;:::-;21647:25;;21691:1;21681:35;;21696:18;;:::i;:::-;21681:35;21738:1;21735;21731:9;21726:14;;21561:185;;;;:::o;21752:305::-;21792:3;21811:20;21829:1;21811:20;:::i;:::-;21806:25;;21845:20;21863:1;21845:20;:::i;:::-;21840:25;;21999:1;21931:66;21927:74;21924:1;21921:81;21918:107;;;22005:18;;:::i;:::-;21918:107;22049:1;22046;22042:9;22035:16;;21752:305;;;;:::o;22063:348::-;22103:7;22126:20;22144:1;22126:20;:::i;:::-;22121:25;;22160:20;22178:1;22160:20;:::i;:::-;22155:25;;22348:1;22280:66;22276:74;22273:1;22270:81;22265:1;22258:9;22251:17;22247:105;22244:131;;;22355:18;;:::i;:::-;22244:131;22403:1;22400;22396:9;22385:20;;22063:348;;;;:::o;22417:180::-;22465:77;22462:1;22455:88;22562:4;22559:1;22552:15;22586:4;22583:1;22576:15;22603:320;22647:6;22684:1;22678:4;22674:12;22664:22;;22731:1;22725:4;22721:12;22752:18;22742:81;;22808:4;22800:6;22796:17;22786:27;;22742:81;22870:2;22862:6;22859:14;22839:18;22836:38;22833:84;;;22889:18;;:::i;:::-;22833:84;22654:269;22603:320;;;:::o;22929:170::-;23069:22;23065:1;23057:6;23053:14;23046:46;22929:170;:::o;23105:366::-;23247:3;23268:67;23332:2;23327:3;23268:67;:::i;:::-;23261:74;;23344:93;23433:3;23344:93;:::i;:::-;23462:2;23457:3;23453:12;23446:19;;23105:366;;;:::o;23477:419::-;23643:4;23681:2;23670:9;23666:18;23658:26;;23730:9;23724:4;23720:20;23716:1;23705:9;23701:17;23694:47;23758:131;23884:4;23758:131;:::i;:::-;23750:139;;23477:419;;;:::o;23902:177::-;24042:29;24038:1;24030:6;24026:14;24019:53;23902:177;:::o;24085:366::-;24227:3;24248:67;24312:2;24307:3;24248:67;:::i;:::-;24241:74;;24324:93;24413:3;24324:93;:::i;:::-;24442:2;24437:3;24433:12;24426:19;;24085:366;;;:::o;24457:419::-;24623:4;24661:2;24650:9;24646:18;24638:26;;24710:9;24704:4;24700:20;24696:1;24685:9;24681:17;24674:47;24738:131;24864:4;24738:131;:::i;:::-;24730:139;;24457:419;;;:::o;24882:222::-;25022:34;25018:1;25010:6;25006:14;24999:58;25091:5;25086:2;25078:6;25074:15;25067:30;24882:222;:::o;25110:366::-;25252:3;25273:67;25337:2;25332:3;25273:67;:::i;:::-;25266:74;;25349:93;25438:3;25349:93;:::i;:::-;25467:2;25462:3;25458:12;25451:19;;25110:366;;;:::o;25482:419::-;25648:4;25686:2;25675:9;25671:18;25663:26;;25735:9;25729:4;25725:20;25721:1;25710:9;25706:17;25699:47;25763:131;25889:4;25763:131;:::i;:::-;25755:139;;25482:419;;;:::o;25907:442::-;26056:4;26094:2;26083:9;26079:18;26071:26;;26107:71;26175:1;26164:9;26160:17;26151:6;26107:71;:::i;:::-;26188:72;26256:2;26245:9;26241:18;26232:6;26188:72;:::i;:::-;26270;26338:2;26327:9;26323:18;26314:6;26270:72;:::i;:::-;25907:442;;;;;;:::o;26355:143::-;26412:5;26443:6;26437:13;26428:22;;26459:33;26486:5;26459:33;:::i;:::-;26355:143;;;;:::o;26504:351::-;26574:6;26623:2;26611:9;26602:7;26598:23;26594:32;26591:119;;;26629:79;;:::i;:::-;26591:119;26749:1;26774:64;26830:7;26821:6;26810:9;26806:22;26774:64;:::i;:::-;26764:74;;26720:128;26504:351;;;;:::o;26861:332::-;26982:4;27020:2;27009:9;27005:18;26997:26;;27033:71;27101:1;27090:9;27086:17;27077:6;27033:71;:::i;:::-;27114:72;27182:2;27171:9;27167:18;27158:6;27114:72;:::i;:::-;26861:332;;;;;:::o;27199:167::-;27339:19;27335:1;27327:6;27323:14;27316:43;27199:167;:::o;27372:366::-;27514:3;27535:67;27599:2;27594:3;27535:67;:::i;:::-;27528:74;;27611:93;27700:3;27611:93;:::i;:::-;27729:2;27724:3;27720:12;27713:19;;27372:366;;;:::o;27744:419::-;27910:4;27948:2;27937:9;27933:18;27925:26;;27997:9;27991:4;27987:20;27983:1;27972:9;27968:17;27961:47;28025:131;28151:4;28025:131;:::i;:::-;28017:139;;27744:419;;;:::o;28169:181::-;28309:33;28305:1;28297:6;28293:14;28286:57;28169:181;:::o;28356:366::-;28498:3;28519:67;28583:2;28578:3;28519:67;:::i;:::-;28512:74;;28595:93;28684:3;28595:93;:::i;:::-;28713:2;28708:3;28704:12;28697:19;;28356:366;;;:::o;28728:419::-;28894:4;28932:2;28921:9;28917:18;28909:26;;28981:9;28975:4;28971:20;28967:1;28956:9;28952:17;28945:47;29009:131;29135:4;29009:131;:::i;:::-;29001:139;;28728:419;;;:::o;29153:233::-;29192:3;29215:24;29233:5;29215:24;:::i;:::-;29206:33;;29261:66;29254:5;29251:77;29248:103;;;29331:18;;:::i;:::-;29248:103;29378:1;29371:5;29367:13;29360:20;;29153:233;;;:::o;29392:148::-;29494:11;29531:3;29516:18;;29392:148;;;;:::o;29546:141::-;29595:4;29618:3;29610:11;;29641:3;29638:1;29631:14;29675:4;29672:1;29662:18;29654:26;;29546:141;;;:::o;29717:845::-;29820:3;29857:5;29851:12;29886:36;29912:9;29886:36;:::i;:::-;29938:89;30020:6;30015:3;29938:89;:::i;:::-;29931:96;;30058:1;30047:9;30043:17;30074:1;30069:137;;;;30220:1;30215:341;;;;30036:520;;30069:137;30153:4;30149:9;30138;30134:25;30129:3;30122:38;30189:6;30184:3;30180:16;30173:23;;30069:137;;30215:341;30282:38;30314:5;30282:38;:::i;:::-;30342:1;30356:154;30370:6;30367:1;30364:13;30356:154;;;30444:7;30438:14;30434:1;30429:3;30425:11;30418:35;30494:1;30485:7;30481:15;30470:26;;30392:4;30389:1;30385:12;30380:17;;30356:154;;;30539:6;30534:3;30530:16;30523:23;;30222:334;;30036:520;;29824:738;;29717:845;;;;:::o;30568:377::-;30674:3;30702:39;30735:5;30702:39;:::i;:::-;30757:89;30839:6;30834:3;30757:89;:::i;:::-;30750:96;;30855:52;30900:6;30895:3;30888:4;30881:5;30877:16;30855:52;:::i;:::-;30932:6;30927:3;30923:16;30916:23;;30678:267;30568:377;;;;:::o;30951:151::-;31091:3;31087:1;31079:6;31075:14;31068:27;30951:151;:::o;31108:400::-;31268:3;31289:84;31371:1;31366:3;31289:84;:::i;:::-;31282:91;;31382:93;31471:3;31382:93;:::i;:::-;31500:1;31495:3;31491:11;31484:18;;31108:400;;;:::o;31514:855::-;31840:3;31862:92;31950:3;31941:6;31862:92;:::i;:::-;31855:99;;31971:95;32062:3;32053:6;31971:95;:::i;:::-;31964:102;;32083:148;32227:3;32083:148;:::i;:::-;32076:155;;32248:95;32339:3;32330:6;32248:95;:::i;:::-;32241:102;;32360:3;32353:10;;31514:855;;;;;;:::o;32375:180::-;32423:77;32420:1;32413:88;32520:4;32517:1;32510:15;32544:4;32541:1;32534:15;32561:164;32701:16;32697:1;32689:6;32685:14;32678:40;32561:164;:::o;32731:366::-;32873:3;32894:67;32958:2;32953:3;32894:67;:::i;:::-;32887:74;;32970:93;33059:3;32970:93;:::i;:::-;33088:2;33083:3;33079:12;33072:19;;32731:366;;;:::o;33103:419::-;33269:4;33307:2;33296:9;33292:18;33284:26;;33356:9;33350:4;33346:20;33342:1;33331:9;33327:17;33320:47;33384:131;33510:4;33384:131;:::i;:::-;33376:139;;33103:419;;;:::o;33528:178::-;33668:30;33664:1;33656:6;33652:14;33645:54;33528:178;:::o;33712:366::-;33854:3;33875:67;33939:2;33934:3;33875:67;:::i;:::-;33868:74;;33951:93;34040:3;33951:93;:::i;:::-;34069:2;34064:3;34060:12;34053:19;;33712:366;;;:::o;34084:419::-;34250:4;34288:2;34277:9;34273:18;34265:26;;34337:9;34331:4;34327:20;34323:1;34312:9;34308:17;34301:47;34365:131;34491:4;34365:131;:::i;:::-;34357:139;;34084:419;;;:::o;34509:177::-;34649:29;34645:1;34637:6;34633:14;34626:53;34509:177;:::o;34692:366::-;34834:3;34855:67;34919:2;34914:3;34855:67;:::i;:::-;34848:74;;34931:93;35020:3;34931:93;:::i;:::-;35049:2;35044:3;35040:12;35033:19;;34692:366;;;:::o;35064:419::-;35230:4;35268:2;35257:9;35253:18;35245:26;;35317:9;35311:4;35307:20;35303:1;35292:9;35288:17;35281:47;35345:131;35471:4;35345:131;:::i;:::-;35337:139;;35064:419;;;:::o;35489:220::-;35629:34;35625:1;35617:6;35613:14;35606:58;35698:3;35693:2;35685:6;35681:15;35674:28;35489:220;:::o;35715:366::-;35857:3;35878:67;35942:2;35937:3;35878:67;:::i;:::-;35871:74;;35954:93;36043:3;35954:93;:::i;:::-;36072:2;36067:3;36063:12;36056:19;;35715:366;;;:::o;36087:419::-;36253:4;36291:2;36280:9;36276:18;36268:26;;36340:9;36334:4;36330:20;36326:1;36315:9;36311:17;36304:47;36368:131;36494:4;36368:131;:::i;:::-;36360:139;;36087:419;;;:::o;36512:181::-;36652:33;36648:1;36640:6;36636:14;36629:57;36512:181;:::o;36699:366::-;36841:3;36862:67;36926:2;36921:3;36862:67;:::i;:::-;36855:74;;36938:93;37027:3;36938:93;:::i;:::-;37056:2;37051:3;37047:12;37040:19;;36699:366;;;:::o;37071:419::-;37237:4;37275:2;37264:9;37260:18;37252:26;;37324:9;37318:4;37314:20;37310:1;37299:9;37295:17;37288:47;37352:131;37478:4;37352:131;:::i;:::-;37344:139;;37071:419;;;:::o;37496:224::-;37636:34;37632:1;37624:6;37620:14;37613:58;37705:7;37700:2;37692:6;37688:15;37681:32;37496:224;:::o;37726:366::-;37868:3;37889:67;37953:2;37948:3;37889:67;:::i;:::-;37882:74;;37965:93;38054:3;37965:93;:::i;:::-;38083:2;38078:3;38074:12;38067:19;;37726:366;;;:::o;38098:419::-;38264:4;38302:2;38291:9;38287:18;38279:26;;38351:9;38345:4;38341:20;38337:1;38326:9;38322:17;38315:47;38379:131;38505:4;38379:131;:::i;:::-;38371:139;;38098:419;;;:::o;38523:224::-;38663:34;38659:1;38651:6;38647:14;38640:58;38732:7;38727:2;38719:6;38715:15;38708:32;38523:224;:::o;38753:366::-;38895:3;38916:67;38980:2;38975:3;38916:67;:::i;:::-;38909:74;;38992:93;39081:3;38992:93;:::i;:::-;39110:2;39105:3;39101:12;39094:19;;38753:366;;;:::o;39125:419::-;39291:4;39329:2;39318:9;39314:18;39306:26;;39378:9;39372:4;39368:20;39364:1;39353:9;39349:17;39342:47;39406:131;39532:4;39406:131;:::i;:::-;39398:139;;39125:419;;;:::o;39550:225::-;39690:34;39686:1;39678:6;39674:14;39667:58;39759:8;39754:2;39746:6;39742:15;39735:33;39550:225;:::o;39781:366::-;39923:3;39944:67;40008:2;40003:3;39944:67;:::i;:::-;39937:74;;40020:93;40109:3;40020:93;:::i;:::-;40138:2;40133:3;40129:12;40122:19;;39781:366;;;:::o;40153:419::-;40319:4;40357:2;40346:9;40342:18;40334:26;;40406:9;40400:4;40396:20;40392:1;40381:9;40377:17;40370:47;40434:131;40560:4;40434:131;:::i;:::-;40426:139;;40153:419;;;:::o;40578:182::-;40718:34;40714:1;40706:6;40702:14;40695:58;40578:182;:::o;40766:366::-;40908:3;40929:67;40993:2;40988:3;40929:67;:::i;:::-;40922:74;;41005:93;41094:3;41005:93;:::i;:::-;41123:2;41118:3;41114:12;41107:19;;40766:366;;;:::o;41138:419::-;41304:4;41342:2;41331:9;41327:18;41319:26;;41391:9;41385:4;41381:20;41377:1;41366:9;41362:17;41355:47;41419:131;41545:4;41419:131;:::i;:::-;41411:139;;41138:419;;;:::o;41563:169::-;41703:21;41699:1;41691:6;41687:14;41680:45;41563:169;:::o;41738:366::-;41880:3;41901:67;41965:2;41960:3;41901:67;:::i;:::-;41894:74;;41977:93;42066:3;41977:93;:::i;:::-;42095:2;42090:3;42086:12;42079:19;;41738:366;;;:::o;42110:419::-;42276:4;42314:2;42303:9;42299:18;42291:26;;42363:9;42357:4;42353:20;42349:1;42338:9;42334:17;42327:47;42391:131;42517:4;42391:131;:::i;:::-;42383:139;;42110:419;;;:::o;42535:98::-;42586:6;42620:5;42614:12;42604:22;;42535:98;;;:::o;42639:168::-;42722:11;42756:6;42751:3;42744:19;42796:4;42791:3;42787:14;42772:29;;42639:168;;;;:::o;42813:360::-;42899:3;42927:38;42959:5;42927:38;:::i;:::-;42981:70;43044:6;43039:3;42981:70;:::i;:::-;42974:77;;43060:52;43105:6;43100:3;43093:4;43086:5;43082:16;43060:52;:::i;:::-;43137:29;43159:6;43137:29;:::i;:::-;43132:3;43128:39;43121:46;;42903:270;42813:360;;;;:::o;43179:640::-;43374:4;43412:3;43401:9;43397:19;43389:27;;43426:71;43494:1;43483:9;43479:17;43470:6;43426:71;:::i;:::-;43507:72;43575:2;43564:9;43560:18;43551:6;43507:72;:::i;:::-;43589;43657:2;43646:9;43642:18;43633:6;43589:72;:::i;:::-;43708:9;43702:4;43698:20;43693:2;43682:9;43678:18;43671:48;43736:76;43807:4;43798:6;43736:76;:::i;:::-;43728:84;;43179:640;;;;;;;:::o;43825:141::-;43881:5;43912:6;43906:13;43897:22;;43928:32;43954:5;43928:32;:::i;:::-;43825:141;;;;:::o;43972:349::-;44041:6;44090:2;44078:9;44069:7;44065:23;44061:32;44058:119;;;44096:79;;:::i;:::-;44058:119;44216:1;44241:63;44296:7;44287:6;44276:9;44272:22;44241:63;:::i;:::-;44231:73;;44187:127;43972:349;;;;:::o;44327:176::-;44359:1;44376:20;44394:1;44376:20;:::i;:::-;44371:25;;44410:20;44428:1;44410:20;:::i;:::-;44405:25;;44449:1;44439:35;;44454:18;;:::i;:::-;44439:35;44495:1;44492;44488:9;44483:14;;44327:176;;;;:::o
Swarm Source
ipfs://25079e7fabac94063c8a5dd428b4a684fd41e90174147b8cacb9a1ed28311c5e
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.